]> go.fuhry.dev Git - runtime.git/commitdiff
machines_agent: allow starting/stopping/restarting services from machines_agent cmd
authorDan Fuhry <dan@fuhry.com>
Thu, 25 Apr 2024 04:09:40 +0000 (00:09 -0400)
committerDan Fuhry <dan@fuhry.com>
Thu, 25 Apr 2024 04:09:40 +0000 (00:09 -0400)
machines/machines_agent/main.go

index 08efb192779b80cecb4521704827a04a7326f07e..909313710846cf06b2e7ae9b13d9bf60fb4a7d66 100644 (file)
@@ -22,6 +22,8 @@ func main() {
        templateToRender := flag.String("render", "", "render this template to stdout and exit")
        commitIPAddress := flag.String("ip-address", "", "passed by dhcpd when a host is seen")
        commitMACAddress := flag.String("mac-address", "", "passed by dhcpd when a host is seen")
+       service := flag.String("service.name", "", "if specified, does something with a service (see service.op)")
+       serviceOp := flag.String("service.op", "status", "service operation to perform (start, stop, status)")
        renderAll := flag.Bool("render-all", false, "render all files")
 
        flag.Parse()
@@ -32,6 +34,50 @@ func main() {
                logger.Panic(err)
        }
 
+       if *service != "" {
+               svc := machines.GetService(*service)
+               if svc == nil {
+                       logger.Panicf("no such service: %s", *service)
+                       return
+               }
+               switch strings.ToLower(*serviceOp) {
+               case "start":
+                       logger.Infof("starting service: %s", *service)
+                       err = svc.EnsureStarted()
+                       if err != nil {
+                               logger.Panicf("failed to start service %q: %v", *service, err)
+                       }
+                       logger.Infof("service started: %s", *service)
+               case "stop":
+                       logger.Infof("stopping service: %s", *service)
+                       err = svc.EnsureStopped()
+                       if err != nil {
+                               logger.Panicf("failed to stop service %q: %v", *service, err)
+                       }
+                       logger.Infof("service stopped: %s", *service)
+               case "reload", "restart":
+                       logger.Infof("restarting service: %s", *service)
+                       err = svc.ReloadOrRestart(true)
+                       if err != nil {
+                               logger.Panicf("failed to restart service %q: %v", *service, err)
+                       }
+                       logger.Infof("service restarted: %s", *service)
+               case "status", "check":
+                       status, err := svc.Status()
+                       if err != nil {
+                               logger.Panicf("failed to query status of service %q: %v", *service, err)
+                       }
+                       if status.Running {
+                               logger.Infof("%s is running, pid %d", *service, status.Pid)
+                       } else {
+                               logger.Infof("%s is stopped", *service)
+                       }
+               default:
+                       logger.Panicf("unknown operation: %s", *serviceOp)
+               }
+               return
+       }
+
        if *commitIPAddress != "" && *commitMACAddress != "" {
                url := fmt.Sprintf("host/seen/%s/%s", *commitMACAddress, *commitIPAddress)
                host := &machines.Host{}