public DaemonRT(DaemonDto dto, string root, int delay) { this.delay = delay; this.dto = dto.Clone(); using (var disposer = new Disposer()) { process = new DaemonProcess(new DaemonProcess.Args { Executable = PathTools.Combine(root, dto.Path), //id matches [a-zA_Z][a-zA_Z0-9_]* Arguments = string.Format("Id={0} Daemon=True {1}", dto.Id, dto.Args), }); disposer.Push(process); status = "Starting..."; reader = new Runner(new Runner.Args { ThreadName = string.Format("DAEMON_{0}_{1}_O", dto.Id, process.Id) }); erroer = new Runner(new Runner.Args { ThreadName = string.Format("DAEMON_{0}_{1}_E", dto.Id, process.Id) }); disposer.Push(erroer); disposer.Push(Dispose); //ensure cleanup order erroer.Run(ErrorLoop); reader.Run(ReadLoop); reader.Run(UpdateRestart); disposer.Clear(); } }
public static void Save(string path, DaemonDto dto) { using (var db = new LiteDatabase(path)) { var table = db.GetCollection <DaemonDto>("daemons"); table.Upsert(dto); } }
private void StartDaemon(DaemonDto dto) { Logger.Trace("Daemon {0} starting {1}...", dto.Id, dto.Info("Path|Args")); var rt = new DaemonRT(dto, root, delay); running.Add(rt.Id, rt); starting.Remove(dto.Id); Logger.Trace("Daemon {0} started {1}", rt.Id, rt.Info("Name|Pid")); }
private void ExecuteInstall(IStream io, params string[] tokens) { var id = tokens[2]; installed.TryGetValue(id, out var dto); AssertTools.True(dto == null, "Daemon {0} already installed", id); AssertTools.True(Regex.IsMatch(id, "[a-zA_Z][a-zA_Z0-9_]*"), "Invalid id {0}", id); var exe = tokens[3]; AssertTools.True(PathTools.IsChildPath(root, exe), "Invalid path {0}", exe); dto = new DaemonDto { Id = id, Path = tokens[3], Args = DaemonProcess.MakeCli(tokens, 4), }; var path = PathTools.Combine(root, dto.Path); AssertTools.True(File.Exists(path), "File {0} not found", dto.Path); Database.Save(database, dto); io.WriteLine("Daemon {0} installed as {1}", id, dto.Info("Path|Args")); ReloadDatabase(); }
//string id for equality check private string Sid(DaemonDto dto) => dto.Info("Id|Path|Args");