예제 #1
0
파일: main.cs 프로젝트: stormdust/xsp
        //
        // 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);
        }
예제 #2
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);
        }
예제 #3
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;
		}