|
|
@@ -0,0 +1,122 @@ |
|
|
|
|
|
import arsd.cgi; |
|
|
|
|
|
//import arsd.sqlite; |
|
|
|
|
|
import std.file; |
|
|
|
|
|
import std.conv; |
|
|
|
|
|
import std.process; |
|
|
|
|
|
|
|
|
|
|
|
string host_port = ":9000"; |
|
|
|
|
|
string allowed_host = ""; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string fileToString(string path){ |
|
|
|
|
|
auto file = File(path, "r"); |
|
|
|
|
|
string contents = ""; |
|
|
|
|
|
while (!file.eof()) { |
|
|
|
|
|
contents ~= file.readln(); |
|
|
|
|
|
} |
|
|
|
|
|
file.close(); |
|
|
|
|
|
return contents; |
|
|
|
|
|
} |
|
|
|
|
|
string get_header(){ |
|
|
|
|
|
return fileToString("public/header.html"); |
|
|
|
|
|
} |
|
|
|
|
|
string get_footer(){ |
|
|
|
|
|
return fileToString("public/footer.html"); |
|
|
|
|
|
} |
|
|
|
|
|
bool run_script(string script_path){ |
|
|
|
|
|
try{ |
|
|
|
|
|
string script_command = "chmod +x " ~ script_path ~ " && bash -c "~ script_path; |
|
|
|
|
|
writeln("calling::: " ~ script_command); |
|
|
|
|
|
auto cont = executeShell(script_command); |
|
|
|
|
|
if(cont.status != 0) { |
|
|
|
|
|
writeln("failed to run script command"); |
|
|
|
|
|
//return "Failed"; |
|
|
|
|
|
return false; |
|
|
|
|
|
} else { |
|
|
|
|
|
writeln("script output " ~ cont.output); |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
void handler(Cgi cgi) { |
|
|
|
|
|
try{ |
|
|
|
|
|
string host = cgi.host.replace(host_port, ""); |
|
|
|
|
|
string path = cgi.pathInfo; |
|
|
|
|
|
if(path == "/favicon.ico"){ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
if(cgi.remoteAddress ~= allowed_host.split(":"[0])){ // ignore the port. |
|
|
|
|
|
cgi.write("<html> Connections are not allowed from: " ~ cgi.remoteAddress ~ "</html>"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
writeln("Trying to access: " ~host ~path); |
|
|
|
|
|
string script_path = getcwd() ~"/" ~ host ~ "/" ~ "run.sh"; |
|
|
|
|
|
writeln("script_path: " ~ script_path); |
|
|
|
|
|
if(script_path.exists){ |
|
|
|
|
|
writeln("script_path exists: Trying to access: " ~host); |
|
|
|
|
|
//Not needed currently. auto fail_script = fileToString(script_path); |
|
|
|
|
|
writeln("Running script: \r\n" ~ script_path); |
|
|
|
|
|
auto result = run_script(script_path); |
|
|
|
|
|
if(result){ |
|
|
|
|
|
cgi.write("<html> successfully ran script.</html>"); |
|
|
|
|
|
} else { |
|
|
|
|
|
cgi.write("<html> Failed to run script.</html>"); |
|
|
|
|
|
} |
|
|
|
|
|
writeln("done with script"); |
|
|
|
|
|
} else { |
|
|
|
|
|
writeln("site path doesn't exist."); |
|
|
|
|
|
cgi.write("<html> Hello " ~ cgi.remoteAddress ~ " The host: " ~ host ~ " is not configured.</html>"); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (Exception e){ |
|
|
|
|
|
writeln("ʕノ•ᴥ•ʔノ ︵ ┻━┻ Exception thrown: "~ e.toString()); |
|
|
|
|
|
//throw o; |
|
|
|
|
|
cgi.setResponseStatus("500 Internal Server Error"); |
|
|
|
|
|
cgi.write("ʕノ•ᴥ•ʔノ ︵ ┻━┻ 500 Internal Server Error.", true); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//mixin GenericMain!handler; |
|
|
|
|
|
|
|
|
|
|
|
void main(string[] args) { |
|
|
|
|
|
//TODO: Fix this to load the acceptable host from an argument, or config file. |
|
|
|
|
|
allowed_host = "127.0.0.1"; |
|
|
|
|
|
|
|
|
|
|
|
//TODO: Figure out a better way of setting defaults, this is pretty dumb. |
|
|
|
|
|
string[] newargs; |
|
|
|
|
|
writeln(to!string(args)); |
|
|
|
|
|
args = []; |
|
|
|
|
|
writeln(to!string(args)); |
|
|
|
|
|
newargs ~= "./main"; |
|
|
|
|
|
newargs ~= "--listen"; |
|
|
|
|
|
newargs ~= "http://localhost" ~ host_port; |
|
|
|
|
|
args = newargs; |
|
|
|
|
|
writeln(to!string(args)); |
|
|
|
|
|
// this is all the content of [cgiMainImpl] which you can also call |
|
|
|
|
|
|
|
|
|
|
|
// cgi.d embeds a few add on functions like real time event forwarders |
|
|
|
|
|
// and session servers it can run in other processes. this spawns them, if needed. |
|
|
|
|
|
if(tryAddonServers(args)) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// cgi.d allows you to easily simulate http requests from the command line, |
|
|
|
|
|
// without actually starting a server. this function will do that. |
|
|
|
|
|
if(trySimulatedRequest!(handler, Cgi)(args)) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
RequestServer server; |
|
|
|
|
|
// you can change the default port here if you like |
|
|
|
|
|
// server.listeningPort = 9000; |
|
|
|
|
|
|
|
|
|
|
|
// then call this to let the command line args override your default |
|
|
|
|
|
server.configureFromCommandLine(args); |
|
|
|
|
|
|
|
|
|
|
|
// here is where you could print out the listeningPort to the user if you wanted |
|
|
|
|
|
|
|
|
|
|
|
// and serve the request(s) according to the compile configuration |
|
|
|
|
|
server.serve!(handler)(); |
|
|
|
|
|
|
|
|
|
|
|
// or you could explicitly choose a serve mode like this: |
|
|
|
|
|
// server.serveEmbeddedHttp!requestHandler(); |
|
|
|
|
|
} |