func runReboot(args []string) int { if os.Geteuid() != 0 { fmt.Fprintln(os.Stderr, "Must be root to initiate reboot.") return 1 } elc, _ := lock.NewEtcdLockClient(nil) lgn, err := login1.New() if err != nil { fmt.Fprintln(os.Stderr, "Cannot read machine-id") return 1 } mID := machineid.MachineID("/") if mID == "" { fmt.Fprintln(os.Stderr, "Cannot read machine-id") return 1 } l := lock.New(mID, elc) err = l.Lock() if err != nil { fmt.Fprintln(os.Stderr, "Error locking:", err) return 1 } lgn.Reboot(false) // TODO(philips): Unlock if the reboot fails. return 0 }
func runDaemon(args []string) int { shutdown := make(chan os.Signal, 1) stop := make(chan struct{}, 1) go func() { <-shutdown fmt.Fprintln(os.Stderr, "Received interrupt/termination signal - shutting down.") os.Exit(0) }() signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM) strategy := os.ExpandEnv("${REBOOT_STRATEGY}") if strategy == "" { strategy = StrategyBestEffort } ue, err := updateengine.New() if err != nil { fmt.Fprintln(os.Stderr, "Error initializing update1 client:", err) return 1 } lgn, err := login1.New() if err != nil { fmt.Fprintln(os.Stderr, "Error initializing login1 client:", err) return 1 } var wg sync.WaitGroup if strategy != StrategyReboot { wg.Add(1) go unlockHeldLocks(stop, &wg) } ch := make(chan updateengine.Status, 1) go ue.RebootNeededSignal(ch, stop) r := rebooter{strategy, lgn} result, err := ue.GetStatus() if err != nil { fmt.Fprintln(os.Stderr, "Cannot get update engine status:", err) return 1 } fmt.Printf("locksmithd starting currentOperation=%q strategy=%q\n", result.CurrentOperation, strategy, ) if result.CurrentOperation != updateengine.UpdateStatusUpdatedNeedReboot { <-ch } close(stop) wg.Wait() return r.reboot() }