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 runSetMax(args []string) (exit int) { if len(args) != 1 { fmt.Fprintln(os.Stderr, "New maximum value must be set.") return 1 } elc, err := lock.NewEtcdLockClient(nil) if err != nil { fmt.Fprintln(os.Stderr, "Error initializing etcd client:", err) return 1 } l := lock.New("hi", elc) max, err := strconv.Atoi(args[0]) if err != nil { fmt.Fprintln(os.Stderr, "Invalid maximum value:", args[0]) return 1 } sem, old, err := l.SetMax(max) if err != nil { fmt.Fprintln(os.Stderr, "Error setting value:", err) } fmt.Println("Old-Max:", old) fmt.Println("Max:", sem.Max) return }
func runUnlock(args []string) (exit int) { elc, err := lock.NewEtcdLockClient(nil) if err != nil { fmt.Fprintln(os.Stderr, "Error initializing etcd client:", err) return 1 } var mID string if len(args) == 0 { mID = machineid.MachineID("/") if mID == "" { fmt.Fprintln(os.Stderr, "Cannot read machine-id") return 1 } } else { mID = args[0] } l := lock.New(mID, elc) err = l.Unlock() if err != nil { fmt.Fprintln(os.Stderr, "Error unlocking:", err) return 1 } return 0 }
// getLockClient returns an initialized EtcdLockClient, using an etcd // client configured from the global etcd flags func getClient() (*lock.EtcdLockClient, error) { // copy of github.com/coreos/etcd/client.DefaultTransport so that // TLSClientConfig can be overridden. transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, } if globalFlags.EtcdCAFile != "" || globalFlags.EtcdCertFile != "" || globalFlags.EtcdKeyFile != "" { cert, err := tls.LoadX509KeyPair(globalFlags.EtcdCertFile, globalFlags.EtcdKeyFile) if err != nil { return nil, err } ca, err := ioutil.ReadFile(globalFlags.EtcdCAFile) if err != nil { return nil, err } capool := x509.NewCertPool() capool.AppendCertsFromPEM(ca) tlsconf := &tls.Config{ Certificates: []tls.Certificate{cert}, RootCAs: capool, } tlsconf.BuildNameToCertificate() transport.TLSClientConfig = tlsconf } cfg := client.Config{ Endpoints: globalFlags.Endpoints, Transport: transport, } ec, err := client.New(cfg) if err != nil { return nil, err } kapi := client.NewKeysAPI(ec) lc, err := lock.NewEtcdLockClient(kapi, globalFlags.Group) if err != nil { return nil, err } return lc, err }
func setupLock() (lck *lock.Lock, err error) { elc, err := lock.NewEtcdLockClient(nil) if err != nil { return nil, fmt.Errorf("Error initializing etcd client: %v", err) } mID := machineid.MachineID("/") if mID == "" { return nil, fmt.Errorf("Cannot read machine-id") } lck = lock.New(mID, elc) return lck, nil }
// getLockClient returns an initialized EtcdLockClient, using an etcd // client configured from the global etcd flags func getClient() (*lock.EtcdLockClient, error) { var ti *etcd.TLSInfo if globalFlags.EtcdCAFile != "" || globalFlags.EtcdCertFile != "" || globalFlags.EtcdKeyFile != "" { ti = &etcd.TLSInfo{ CertFile: globalFlags.EtcdCertFile, KeyFile: globalFlags.EtcdKeyFile, CAFile: globalFlags.EtcdCAFile, } } ec, err := etcd.NewClient(globalFlags.Endpoints, ti) if err != nil { return nil, err } lc, err := lock.NewEtcdLockClient(ec, globalFlags.Group) if err != nil { return nil, err } return lc, err }
func runStatus(args []string) (exit int) { elc, err := lock.NewEtcdLockClient(nil) if err != nil { fmt.Fprintln(os.Stderr, "Error initializing etcd client:", err) return 1 } l := lock.New("", elc) sem, err := l.Get() if err != nil { fmt.Fprintln(os.Stderr, "Error setting value:", err) } fmt.Println("Available:", sem.Semaphore) fmt.Println("Max:", sem.Max) if len(sem.Holders) > 0 { fmt.Fprintln(out, "") printHolders(sem) } return }