internal override Transaction GetActivationTransaction() { var transaction = new Transaction($"Activation transaction for unit {UnitName}"); transaction.Add(new SetUnitStateTask(this, UnitState.Activating, UnitState.Inactive | UnitState.Failed)); var working_dir = File.WorkingDirectory; var user = (File.Group == null && File.User == null ? null : PlatformUtilities.GetImplementation <IUserIdentifier>(File.Group, File.User)); switch (File.ServiceType) { case ServiceType.Simple: if (File.ExecStart == null) { Log.Error($"Unit {UnitName} has no ExecStart directives."); SetState(UnitState.Failed); return(null); } if (File.ExecStart.Count != 1) { Log.Error($"Service type \"simple\" only supports one ExecStart value, {UnitName} has {File.ExecStart.Count}"); SetState(UnitState.Failed); return(null); } if (File.ExecStartPre.Any()) { foreach (var line in File.ExecStartPre) { transaction.Add(new RunUnregisteredProcessTask(ServiceManager.ProcessHandler, ProcessStartInfo.FromCommandLine(line, working_dir, user), 5000)); } } transaction.Add(new RunRegisteredProcessTask(ProcessStartInfo.FromCommandLine(File.ExecStart.Single(), working_dir, user), this)); if (File.ExecStartPost.Any()) { foreach (var line in File.ExecStartPost) { transaction.Add(new RunUnregisteredProcessTask(ServiceManager.ProcessHandler, ProcessStartInfo.FromCommandLine(line, working_dir, user), 5000)); } } break; default: Log.Error($"Only the \"simple\" service type is supported for now, {UnitName} has type {File.ServiceType}"); SetState(UnitState.Failed); break; } transaction.Add(new SetUnitStateTask(this, UnitState.Active, UnitState.Activating)); transaction.Add(new UpdateUnitActivationTimeTask(this)); transaction.OnFailure = new SetUnitStateTask(this, UnitState.Failed); return(transaction); }
public static void ClassInitialize(TestContext value) { PlatformUtilities.RegisterImplementations(); PlatformUtilities.GetImplementation <IPlatformInitialization>().Initialize(); UnitRegistry.InitializeTypes(); UnitRegistry.ScanDefaultDirectories(); File.WriteAllText(path, contents); }
static void Main(string[] args) { Log.Info("SharpInit starting"); PlatformUtilities.RegisterImplementations(); PlatformUtilities.GetImplementation <IPlatformInitialization>().Initialize(); Log.Info("Platform initialization complete"); UnitRegistry.InitializeTypes(); UnitRegistry.ScanDefaultDirectories(); Log.Info($"Loaded {UnitRegistry.Units.Count} units"); UnitRegistry.UnitStateChange += StateChangeHandler; Log.Info("Registering IPC context..."); var context = new ServerIpcContext(); IpcFunctionRegistry.AddFunction(DynamicIpcFunction.FromContext(context)); Log.Info("Starting IPC listener..."); var ipc_listener = new IpcListener(); ipc_listener.StartListening(); Log.Info($"Listening on {ipc_listener.SocketEndPoint}"); if (UnitRegistry.GetUnit("default.target") != null) { Log.Info("Activating default.target..."); var result = UnitRegistry.CreateActivationTransaction("default.target").Execute(); if (result.Type == Tasks.ResultType.Success) { Log.Info("Successfully activated default.target."); } else { Log.Info($"Error while activating default.target: {result.Type}, {result.Message}"); } } Console.CancelKeyPress += (s, e) => { ipc_listener.StopListening(); }; Thread.Sleep(-1); }
public static void ClassInitialize(TestContext value) { PlatformUtilities.RegisterImplementations(); PlatformUtilities.GetImplementation <IPlatformInitialization>().Initialize(); UnitRegistry.InitializeTypes(); Random rnd = new Random(); var random_buffer = new byte[8]; rnd.NextBytes(random_buffer); DirectoryName = BitConverter.ToString(random_buffer).Replace("-", "").ToLower(); Directory.CreateDirectory(DirectoryName); File.WriteAllText(TestUnitPath, TestUnitContents); }
public override Transaction GetReloadTransaction() { var transaction = new Transaction(); transaction.Add(new SetUnitStateTask(this, UnitState.Reloading, UnitState.Active)); var working_dir = File.WorkingDirectory; var user = (File.Group == null && File.User == null ? null : PlatformUtilities.GetImplementation <IUserIdentifier>(File.Group, File.User)); if (!File.ExecReload.Any()) { throw new Exception($"Unit {UnitName} has no ExecReload directives."); } foreach (var reload_cmd in File.ExecReload) { transaction.Add(new RunUnregisteredProcessTask(ServiceManager.ProcessHandler, ProcessStartInfo.FromCommandLine(reload_cmd, working_dir, user), 5000)); } transaction.Add(new SetUnitStateTask(this, UnitState.Active, UnitState.Reloading)); return(transaction); }
public ServiceManager() : this(PlatformUtilities.GetImplementation <IProcessHandler>()) { }