// // Parameters: // // args - original args passed to the program // root - true means caller is in the root domain // ext_apphost - used when single app mode is used, in a recursive call to // RealMain from the single app domain // quiet - don't show messages. Used to avoid double printing of the banner // public int RealMain(string [] args, bool root, IApplicationHost ext_apphost, bool quiet) { ApplicationSettings settings = new ApplicationSettings(); if (ext_apphost != null) { settings.RootDir = ext_apphost.Path; } Options options = 0; int backlog = 500; int hash = 0; for (int i = 0; i < args.Length; i++) { string a = args [i]; int idx = (i + 1 < args.Length) ? i + 1 : i; hash ^= args [idx].GetHashCode() + i; switch (a) { case "--filename": CheckAndSetOptions(a, Options.FileName, ref options); settings.FileName = args [++i]; break; case "--terminate": CheckAndSetOptions(a, Options.Terminate, ref options); break; case "--master": CheckAndSetOptions(a, Options.Master, ref options); settings.Master = true; break; case "--port": CheckAndSetOptions(a, Options.Port, ref options); settings.Oport = args [++i]; break; case "--address": CheckAndSetOptions(a, Options.Address, ref options); settings.IP = args [++i]; break; case "--backlog": string backlogstr = args [++i]; try { backlog = Convert.ToInt32(backlogstr); } catch (Exception) { Console.WriteLine("The value given for backlog is not valid {0}", backlogstr); return(1); } break; case "--root": CheckAndSetOptions(a, Options.Root, ref options); settings.RootDir = args [++i]; break; case "--applications": CheckAndSetOptions(a, Options.Applications, ref options); settings.Apps = args [++i]; break; case "--appconfigfile": CheckAndSetOptions(a, Options.AppConfigFile, ref options); settings.AppConfigFile = args [++i]; break; case "--appconfigdir": CheckAndSetOptions(a, Options.AppConfigDir, ref options); settings.AppConfigDir = args [++i]; break; case "--minThreads": string mtstr = args [++i]; int minThreads = 0; try { minThreads = Convert.ToInt32(mtstr); } catch (Exception) { Console.WriteLine("The value given for minThreads is not valid {0}", mtstr); return(1); } if (minThreads > 0) { ThreadPool.SetMinThreads(minThreads, minThreads); } break; case "--nonstop": settings.NonStop = true; break; case "--help": ShowHelp(); return(0); case "--version": ShowVersion(); return(0); case "--verbose": settings.Verbose = true; break; case "--pidfile": { string pidfile = args[++i]; if (pidfile != null && pidfile.Length > 0) { try { using (StreamWriter sw = File.CreateText(pidfile)) sw.Write(Process.GetCurrentProcess().Id); } catch (Exception ex) { Console.Error.WriteLine("Failed to write pidfile {0}: {1}", pidfile, ex.Message); } } break; } case "--no-hidden": MonoWorkerRequest.CheckFileAccess = false; break; default: Console.Error.WriteLine("Unknown argument: {0}", a); ShowHelp(); return(1); } } if (hash < 0) { hash = -hash; } string lockfile; bool useTCP = ((options & Options.Port) != 0); if (!useTCP) { if (settings.FileName == null || settings.FileName.Length == 0) { settings.FileName = "/tmp/mod_mono_server"; } if ((options & Options.Address) != 0) { ShowHelp(); Console.Error.WriteLine(); Console.Error.WriteLine("ERROR: --address without --port"); Environment.Exit(1); } lockfile = Path.Combine(Path.GetTempPath(), Path.GetFileName(settings.FileName)); lockfile = String.Format("{0}_{1}", lockfile, hash); } else { lockfile = Path.Combine(Path.GetTempPath(), "mod_mono_TCP_"); lockfile = String.Format("{0}_{1}", lockfile, hash); } IPAddress ipaddr = null; ushort port; try { port = Convert.ToUInt16(settings.Oport); } catch (Exception) { Console.Error.WriteLine("The value given for the listen port is not valid: " + settings.Oport); return(1); } try { ipaddr = IPAddress.Parse(settings.IP); } catch (Exception) { Console.Error.WriteLine("The value given for the address is not valid: " + settings.IP); return(1); } if (settings.RootDir != null && settings.RootDir.Length > 0) { try { Environment.CurrentDirectory = settings.RootDir; } catch (Exception e) { Console.Error.WriteLine("Error: {0}", e.Message); return(1); } } settings.RootDir = Directory.GetCurrentDirectory(); WebSource webSource; if (useTCP) { webSource = new ModMonoTCPWebSource(ipaddr, port, lockfile); } else { webSource = new ModMonoWebSource(settings.FileName, lockfile); } if ((options & Options.Terminate) != 0) { if (settings.Verbose) { Console.Error.WriteLine("Shutting down running mod-mono-server..."); } bool res = ((ModMonoWebSource)webSource).GracefulShutdown(); if (settings.Verbose) { Console.Error.WriteLine(res ? "Done." : "Failed"); } return((res) ? 0 : 1); } ApplicationServer server = new ApplicationServer(webSource, settings.RootDir); server.Verbose = settings.Verbose; server.SingleApplication = !root; Console.WriteLine(Assembly.GetExecutingAssembly().GetName().Name); if (settings.Apps != null) { server.AddApplicationsFromCommandLine(settings.Apps); } if (settings.AppConfigFile != null) { server.AddApplicationsFromConfigFile(settings.AppConfigFile); } if (settings.AppConfigDir != null) { server.AddApplicationsFromConfigDirectory(settings.AppConfigDir); } if (!settings.Master && settings.Apps == null && settings.AppConfigDir == null && settings.AppConfigFile == null) { server.AddApplicationsFromCommandLine("/:."); } VPathToHost vh = server.GetSingleApp(); if (root && vh != null) { // Redo in new domain vh.CreateHost(server, webSource); Server svr = (Server)vh.AppHost.Domain.CreateInstanceAndUnwrap(GetType().Assembly.GetName().ToString(), GetType().FullName); webSource.Dispose(); return(svr.RealMain(args, false, vh.AppHost, quiet)); } if (ext_apphost != null) { ext_apphost.Server = server; server.AppHost = ext_apphost; } if (!useTCP && !quiet) { Console.Error.WriteLine("Listening on: {0}", settings.FileName); } else if (!quiet) { Console.Error.WriteLine("Listening on port: {0}", port); Console.Error.WriteLine("Listening on address: {0}", settings.IP); } if (!quiet) { Console.Error.WriteLine("Root directory: {0}", settings.RootDir); } try { if (server.Start(!settings.NonStop, backlog) == false) { return(2); } if (!settings.NonStop) { Console.Error.WriteLine("Hit Return to stop the server."); while (true) { try { Console.ReadLine(); break; } catch (IOException) { // This might happen on appdomain unload // until the previous threads are terminated. Thread.Sleep(500); } } server.Stop(); } } catch (Exception e) { if (!(e is ThreadAbortException)) { Console.Error.WriteLine("Error: {0}", e.Message); } else { server.ShutdownSockets(); } return(1); } return(0); }
// public static int Main (string [] args) public static int initXSP(string [] args, out ApplicationServer appServer) { bool nonstop = false; bool verbose = false; appServer = null; Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); string apps = ConfigurationSettings.AppSettings ["MonoApplications"]; string appConfigDir = ConfigurationSettings.AppSettings ["MonoApplicationsConfigDir"]; string appConfigFile = ConfigurationSettings.AppSettings ["MonoApplicationsConfigFile"]; string rootDir = ConfigurationSettings.AppSettings ["MonoServerRootDir"]; object oport; string ip = ConfigurationSettings.AppSettings ["MonoServerAddress"]; #if MODMONO_SERVER string filename = ConfigurationSettings.AppSettings ["MonoUnixSocket"]; #endif if (ip == "" || ip == null) { ip = "0.0.0.0"; } oport = ConfigurationSettings.AppSettings ["MonoServerPort"]; if (oport == null) { oport = 8080; } Options options = 0; int hash = 0; for (int i = 0; i < args.Length; i++) { string a = args [i]; hash ^= args [i].GetHashCode() + i; switch (a) { #if MODMONO_SERVER case "--filename": CheckAndSetOptions(a, Options.FileName, ref options); filename = args [++i]; break; case "--terminate": CheckAndSetOptions(a, Options.Terminate, ref options); break; #endif case "--port": CheckAndSetOptions(a, Options.Port, ref options); oport = args [++i]; break; case "--address": CheckAndSetOptions(a, Options.Address, ref options); ip = args [++i]; break; case "--root": CheckAndSetOptions(a, Options.Root, ref options); rootDir = args [++i]; break; case "--applications": CheckAndSetOptions(a, Options.Applications, ref options); apps = args [++i]; break; case "--appconfigfile": CheckAndSetOptions(a, Options.AppConfigFile, ref options); appConfigFile = args [++i]; break; case "--appconfigdir": CheckAndSetOptions(a, Options.AppConfigDir, ref options); appConfigDir = args [++i]; break; case "--nonstop": nonstop = true; break; case "--help": ShowHelp(); return(0); case "--version": ShowVersion(); return(0); case "--verbose": verbose = true; break; default: Console.WriteLine("Unknown argument: {0}", a); ShowHelp(); return(1); } } #if MODMONO_SERVER if (hash < 0) { hash = -hash; } string lockfile; bool useTCP = ((options & Options.Port) != 0); if (!useTCP) { if (filename == null || filename == "") { filename = "/tmp/mod_mono_server"; } if ((options & Options.Address) != 0) { ShowHelp(); Console.WriteLine(); Console.WriteLine("ERROR: --address without --port"); Environment.Exit(1); } lockfile = Path.Combine(Path.GetTempPath(), Path.GetFileName(filename)); lockfile = String.Format("{0}_{1}", lockfile, hash); } else { lockfile = Path.Combine(Path.GetTempPath(), "mod_mono_TCP_"); lockfile = String.Format("{0}_{1}", lockfile, hash); } #endif IPAddress ipaddr = null; ushort port; try { port = Convert.ToUInt16(oport); } catch (Exception) { Console.WriteLine("The value given for the listen port is not valid: " + oport); return(1); } try { ipaddr = IPAddress.Parse(ip); } catch (Exception) { Console.WriteLine("The value given for the address is not valid: " + ip); return(1); } if (rootDir != null && rootDir != "") { try { Environment.CurrentDirectory = rootDir; } catch (Exception e) { Console.WriteLine("Error: {0}", e.Message); return(1); } } rootDir = Directory.GetCurrentDirectory(); IWebSource webSource; #if MODMONO_SERVER if (useTCP) { webSource = new ModMonoTCPWebSource(ipaddr, port, lockfile); } else { webSource = new ModMonoWebSource(filename, lockfile); } if ((options & Options.Terminate) != 0) { if (verbose) { Console.WriteLine("Shutting down running mod-mono-server..."); } bool res = ((ModMonoWebSource)webSource).GracefulShutdown(); if (verbose) { Console.WriteLine(res ? "Done." : "Failed"); } return((res) ? 0 : 1); } ApplicationServer server = new ApplicationServer(webSource); #else webSource = new XSPWebSource(ipaddr, port); ApplicationServer server = new ApplicationServer(webSource); #endif server.Verbose = verbose; Console.WriteLine(Assembly.GetExecutingAssembly().GetName().Name); if (apps != null) { server.AddApplicationsFromCommandLine(apps); } if (appConfigFile != null) { server.AddApplicationsFromConfigFile(appConfigFile); } if (appConfigDir != null) { server.AddApplicationsFromConfigDirectory(appConfigDir); } if (apps == null && appConfigDir == null && appConfigFile == null) { server.AddApplicationsFromCommandLine("/:."); } #if MODMONO_SERVER if (!useTCP) { Console.WriteLine("Listening on: {0}", filename); } else #endif { Console.WriteLine("Listening on port: {0}", port); Console.WriteLine("Listening on address: {0}", ip); } Console.WriteLine("Root directory: {0}", rootDir); //KNV: return appServer reference to beagle to control it appServer = server; try { if (server.Start(!nonstop) == false) { return(2); } if (!nonstop) { Console.WriteLine("Hit Return to stop the server."); Console.ReadLine(); server.Stop(); } } catch (Exception e) { Console.WriteLine("Error: {0}", e.Message); return(1); } try { //test beagle/search.asmx is accessible: string wsurl = "http://localhost:" + oport + "/beagle/search.asmx"; HttpWebRequest w = (HttpWebRequest)WebRequest.Create(wsurl); HttpWebResponse r = (HttpWebResponse)w.GetResponse(); r.Close(); } catch (Exception e) { //Console.WriteLine ("Error: {0} in starting bgXsp", e.Message); //return 3; } return(0); }
// public static int Main (string [] args) public static int initXSP(string [] args, out ApplicationServer appServer) { bool nonstop = false; bool verbose = false; appServer = null; Trace.Listeners.Add (new TextWriterTraceListener (Console.Out)); string apps = ConfigurationSettings.AppSettings ["MonoApplications"]; string appConfigDir = ConfigurationSettings.AppSettings ["MonoApplicationsConfigDir"]; string appConfigFile = ConfigurationSettings.AppSettings ["MonoApplicationsConfigFile"]; string rootDir = ConfigurationSettings.AppSettings ["MonoServerRootDir"]; object oport; string ip = ConfigurationSettings.AppSettings ["MonoServerAddress"]; #if MODMONO_SERVER string filename = ConfigurationSettings.AppSettings ["MonoUnixSocket"]; #endif if (ip == "" || ip == null) ip = "0.0.0.0"; oport = ConfigurationSettings.AppSettings ["MonoServerPort"]; if (oport == null) oport = 8080; Options options = 0; int hash = 0; for (int i = 0; i < args.Length; i++){ string a = args [i]; hash ^= args [i].GetHashCode () + i; switch (a){ #if MODMONO_SERVER case "--filename": CheckAndSetOptions (a, Options.FileName, ref options); filename = args [++i]; break; case "--terminate": CheckAndSetOptions (a, Options.Terminate, ref options); break; #endif case "--port": CheckAndSetOptions (a, Options.Port, ref options); oport = args [++i]; break; case "--address": CheckAndSetOptions (a, Options.Address, ref options); ip = args [++i]; break; case "--root": CheckAndSetOptions (a, Options.Root, ref options); rootDir = args [++i]; break; case "--applications": CheckAndSetOptions (a, Options.Applications, ref options); apps = args [++i]; break; case "--appconfigfile": CheckAndSetOptions (a, Options.AppConfigFile, ref options); appConfigFile = args [++i]; break; case "--appconfigdir": CheckAndSetOptions (a, Options.AppConfigDir, ref options); appConfigDir = args [++i]; break; case "--nonstop": nonstop = true; break; case "--help": ShowHelp (); return 0; case "--version": ShowVersion (); return 0; case "--verbose": verbose = true; break; default: Console.WriteLine ("Unknown argument: {0}", a); ShowHelp (); return 1; } } #if MODMONO_SERVER if (hash < 0) hash = -hash; string lockfile; bool useTCP = ((options & Options.Port) != 0); if (!useTCP) { if (filename == null || filename == "") filename = "/tmp/mod_mono_server"; if ((options & Options.Address) != 0) { ShowHelp (); Console.WriteLine (); Console.WriteLine ("ERROR: --address without --port"); Environment.Exit (1); } lockfile = Path.Combine (Path.GetTempPath (), Path.GetFileName (filename)); lockfile = String.Format ("{0}_{1}", lockfile, hash); } else { lockfile = Path.Combine (Path.GetTempPath (), "mod_mono_TCP_"); lockfile = String.Format ("{0}_{1}", lockfile, hash); } #endif IPAddress ipaddr = null; ushort port; try { port = Convert.ToUInt16 (oport); } catch (Exception) { Console.WriteLine ("The value given for the listen port is not valid: " + oport); return 1; } try { ipaddr = IPAddress.Parse (ip); } catch (Exception) { Console.WriteLine ("The value given for the address is not valid: " + ip); return 1; } if (rootDir != null && rootDir != "") { try { Environment.CurrentDirectory = rootDir; } catch (Exception e) { Console.WriteLine ("Error: {0}", e.Message); return 1; } } rootDir = Directory.GetCurrentDirectory (); IWebSource webSource; #if MODMONO_SERVER if (useTCP) { webSource = new ModMonoTCPWebSource (ipaddr, port, lockfile); } else { webSource = new ModMonoWebSource (filename, lockfile); } if ((options & Options.Terminate) != 0) { if (verbose) Console.WriteLine ("Shutting down running mod-mono-server..."); bool res = ((ModMonoWebSource) webSource).GracefulShutdown (); if (verbose) Console.WriteLine (res ? "Done." : "Failed"); return (res) ? 0 : 1; } ApplicationServer server = new ApplicationServer (webSource); #else webSource = new XSPWebSource (ipaddr, port); ApplicationServer server = new ApplicationServer (webSource); #endif server.Verbose = verbose; Console.WriteLine (Assembly.GetExecutingAssembly ().GetName ().Name); if (apps != null) server.AddApplicationsFromCommandLine (apps); if (appConfigFile != null) server.AddApplicationsFromConfigFile (appConfigFile); if (appConfigDir != null) server.AddApplicationsFromConfigDirectory (appConfigDir); if (apps == null && appConfigDir == null && appConfigFile == null) server.AddApplicationsFromCommandLine ("/:."); #if MODMONO_SERVER if (!useTCP) { Console.WriteLine ("Listening on: {0}", filename); } else #endif { Console.WriteLine ("Listening on port: {0}", port); Console.WriteLine ("Listening on address: {0}", ip); } Console.WriteLine ("Root directory: {0}", rootDir); //KNV: return appServer reference to beagle to control it appServer = server; try { if (server.Start (!nonstop) == false) return 2; if (!nonstop) { Console.WriteLine ("Hit Return to stop the server."); Console.ReadLine (); server.Stop (); } } catch (Exception e) { Console.WriteLine ("Error: {0}", e.Message); return 1; } try { //test beagle/search.asmx is accessible: string wsurl = "http://localhost:"+ oport + "/beagle/search.asmx"; HttpWebRequest w = (HttpWebRequest)WebRequest.Create(wsurl); HttpWebResponse r = (HttpWebResponse)w.GetResponse(); r.Close(); } catch (Exception e) { //Console.WriteLine ("Error: {0} in starting bgXsp", e.Message); //return 3; } return 0; }