示例#1
0
            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();
                }
            }
示例#2
0
 public static void Save(string path, DaemonDto dto)
 {
     using (var db = new LiteDatabase(path))
     {
         var table = db.GetCollection <DaemonDto>("daemons");
         table.Upsert(dto);
     }
 }
示例#3
0
        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();
        }
示例#5
0
 //string id for equality check
 private string Sid(DaemonDto dto) => dto.Info("Id|Path|Args");