Example #1
0
        public static void StartChildren(FileInfo[] configFiles, ConfigurationManager configurationManager)
        {
            if (configFiles == null)
                throw new ArgumentNullException ("configFiles");
            if (configurationManager == null)
                throw new ArgumentNullException ("configurationManager");
            foreach (FileInfo fileInfo in configFiles) {
                if (fileInfo == null)
                    continue;
                Logger.Write (LogLevel.Debug, "Loading {0}", fileInfo.Name);
                var childConfigurationManager = new ChildConfigurationManager ();
                string configFile = fileInfo.FullName;
                if (!childConfigurationManager.TryLoadXmlConfig (configFile))
                    continue;
                string user = childConfigurationManager.User;
                string fastCgiCommand = configurationManager.FastCgiCommand;

                Func<bool, Process> spawner;
                if (Platform.IsUnix) {
                    if (String.IsNullOrEmpty (user)) {
                        Logger.Write (LogLevel.Warning, "Configuration file {0} didn't specify username, defaulting to file owner", fileInfo.Name);
                        user = UnixFileSystemInfo.GetFileSystemEntry (configFile).OwnerUser.UserName;
                    }

                    spawner = onDemand => Spawner.RunAs (user, Spawner.SpawnChild, configFile, fastCgiCommand, onDemand);
                } else {
                    Logger.Write (LogLevel.Warning, "Configuration file {0} didn't specify username, defaulting to the current one", fileInfo.Name);
                    spawner = onDemand => Spawner.SpawnChild (configFile, fastCgiCommand, onDemand);
                }
                var child = new ChildInfo { Spawner = spawner, ConfigurationManager = childConfigurationManager, Name = configFile, OnDemand = childConfigurationManager.InstanceType == InstanceType.Dynamic };
                children.Add (child);
                if (child.OnDemand){
                    Socket socket;
                    if (FastCgi.Server.TryCreateSocket (childConfigurationManager, out socket)) {
                        var server = new GenericServer<Connection> (socket, child);
                        server.Start (configurationManager.Stoppable, (int)childConfigurationManager.Backlog);
                    }

                } else {
                    if (child.TrySpawn ()) {
                        Logger.Write (LogLevel.Notice, "Started fastcgi daemon [static] with pid {0} and config file {1}", child.Process.Id, Path.GetFileName (configFile));
                    } else {
                        Logger.Write (LogLevel.Error, "Couldn't start child with config file {0}", configFile);
                    }
                }
            }
        }
Example #2
0
		public static void StartAutomaticChildren (IEnumerable<UnixDirectoryInfo> webDirs, ConfigurationManager configurationManager)
		{
			if (webDirs == null)
				throw new ArgumentNullException ("webDirs");
			if (configurationManager == null)
				throw new ArgumentNullException ("configurationManager");

			string shimSocketDir;
			string frontSocketDir;
			string backSocketDir;
			CreateAutomaticDirs (configurationManager.FpmGroup, configurationManager.HttpdGroup, out shimSocketDir, out frontSocketDir, out backSocketDir);
			foreach (UnixDirectoryInfo directoryInfo in webDirs) {
				if (directoryInfo == null)
					continue;

				var user = directoryInfo.OwnerUser.UserName;
				var group = directoryInfo.OwnerGroup.GroupName;
				var dirname = directoryInfo.Name;

				if (directoryInfo.OwnerUserId < 100) {
					Logger.Write (LogLevel.Debug, "Directory {0} skipped because owned by {1}:{2} ({3}:{4})",
					              dirname, user, group, directoryInfo.OwnerUserId, directoryInfo.OwnerGroupId);
					continue; // Skip non-user directories
				}

				string shimSocket = Path.Combine (shimSocketDir, dirname);
				string frontSocket = Path.Combine (frontSocketDir, dirname);
				string backSocket = Path.Combine (backSocketDir, dirname);

				Func<Process> spawner = () => Spawner.SpawnOndemandChild (shimSocket);
				UnixDirectoryInfo info = directoryInfo;
				Action spawnShim = () => Spawner.SpawnShim (configurationManager, shimSocket, info.FullName, backSocket);
				Spawner.RunAs (user, configurationManager.WebGroup, spawnShim) ();

				var child = new ChildInfo { Spawner = spawner, OnDemandSock =  backSocket, Name = directoryInfo.FullName };
				children.Add (child);
				
				PrepareAutomaticChild (configurationManager, frontSocket, child, 500);
			}
		}
Example #3
0
		public static void StartChildren(FileInfo[] configFiles, ConfigurationManager configurationManager)
		{
			if (configFiles == null)
				throw new ArgumentNullException ("configFiles");
			if (configurationManager == null)
				throw new ArgumentNullException ("configurationManager");
			foreach (FileInfo fileInfo in configFiles) {
				if (fileInfo == null)
					continue;
				var filename = fileInfo.Name;
				var childConfigurationManager = new ChildConfigurationManager ("child-" + filename);
				Logger.Write (LogLevel.Debug, "Loaded {0} [{1}]", filename, childConfigurationManager.InstanceType.ToString ().ToLowerInvariant ());
				string fullFilename = fileInfo.FullName;
				if (!childConfigurationManager.TryLoadXmlConfig (fullFilename))
					continue;

				var spawner = GetSpawner (configurationManager, filename, childConfigurationManager, fullFilename);

				var child = new ChildInfo { Spawner = spawner, OnDemandSock = childConfigurationManager.OnDemandSock, Name = fullFilename };
				children.Add (child);

				PrepareChild (configurationManager, childConfigurationManager, fullFilename, child);
			}
		}
Example #4
0
		static void PrepareChild (ConfigurationManager configurationManager, ChildConfigurationManager childConfigurationManager, string fullFilename, ChildInfo child)
		{
			if (childConfigurationManager.InstanceType == InstanceType.Static) {
				if (child.TrySpawn ()) {
					Logger.Write (LogLevel.Notice, "Started fastcgi daemon [static] with pid {0} and config file {1}", child.Process.Id, Path.GetFileName (fullFilename));
					Thread.Sleep (500);
					// TODO: improve this (it's used to wait for the child to be ready)
				}
				else
					Logger.Write (LogLevel.Error, "Couldn't start child with config file {0}", fullFilename);
			}
			else {
				Socket socket;
				if (FastCgi.Server.TryCreateSocket (childConfigurationManager, out socket)) {
					var server = new GenericServer<Connection> (socket, child);
					server.Start (configurationManager.Stoppable, (int)childConfigurationManager.Backlog);
				}
			}
		}
Example #5
0
		static void PrepareAutomaticChild (ConfigurationManager configurationManager, string frontSocket, ChildInfo child, uint backlog)
		{
			Socket socket;
			if (FastCgi.Server.TryCreateUnixSocket (frontSocket, out socket, "660")) {
				var server = new GenericServer<Connection> (socket, child);
				server.Start (configurationManager.Stoppable, (int)backlog);
			}
		}