func keeper(cmd *cobra.Command, args []string) { capnslog.SetGlobalLogLevel(capnslog.INFO) if cfg.debug { capnslog.SetGlobalLogLevel(capnslog.DEBUG) } if cfg.dataDir == "" { log.Fatalf("data dir required") } if cfg.clusterName == "" { log.Fatalf("cluster name required") } if cfg.storeBackend == "" { log.Fatalf("store backend type required") } if err := os.MkdirAll(cfg.dataDir, 0700); err != nil { log.Fatalf("error: %v", err) } if cfg.pgConfDir != "" { if !filepath.IsAbs(cfg.pgConfDir) { log.Fatalf("pg-conf-dir must be an absolute path") } fi, err := os.Stat(cfg.pgConfDir) if err != nil { log.Fatalf("cannot stat pg-conf-dir: %v", err) } if !fi.IsDir() { log.Fatalf("pg-conf-dir is not a directory") } } // Take an exclusive lock on dataDir _, err := lock.TryExclusiveLock(cfg.dataDir, lock.Dir) if err != nil { log.Fatalf("cannot take exclusive lock on data dir %q: %v", cfg.dataDir, err) } if cfg.id != "" { if !pg.IsValidReplSlotName(cfg.id) { log.Fatalf("keeper id %q not valid. It can contain only lower-case letters, numbers and the underscore character", cfg.id) } } id, err := getIDFromFile(cfg) if err != nil { log.Fatalf("error: %v", err) } if id != "" && cfg.id != "" && id != cfg.id { log.Fatalf("saved id: %q differs from configuration id: %q", id, cfg.id) } if id == "" { id = cfg.id if cfg.id == "" { // Generate a new id if conf.Name is empty if id == "" { u := uuid.NewV4() id = fmt.Sprintf("%x", u[:4]) } log.Infof("generated id: %s", id) } if err := saveIDToFile(cfg, id); err != nil { log.Fatalf("error: %v", err) } } log.Infof("id: %s", id) stop := make(chan bool, 0) end := make(chan error, 0) sigs := make(chan os.Signal, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go sigHandler(sigs, stop) p, err := NewPostgresKeeper(id, cfg, stop, end) if err != nil { log.Fatalf("cannot create keeper: %v", err) } go p.Start() <-end }
func keeper(cmd *cobra.Command, args []string) { var err error if cfg.debug { log.SetLevel(zap.DebugLevel) } pg.SetLogger(log) if cfg.dataDir == "" { fmt.Println("data dir required") } if cfg.clusterName == "" { fmt.Println("cluster name required") } if cfg.storeBackend == "" { fmt.Println("store backend type required") } if err = os.MkdirAll(cfg.dataDir, 0700); err != nil { fmt.Printf("cannot create data dir: %v\n", err) os.Exit(1) } if cfg.pgReplUsername == "" { fmt.Println("--pg-repl-username is required") } if cfg.pgReplPassword == "" && cfg.pgReplPasswordFile == "" { fmt.Println("one of --pg-repl-password or --pg-repl-passwordfile is required") } if cfg.pgReplPassword != "" && cfg.pgReplPasswordFile != "" { fmt.Println("only one of --pg-repl-password or --pg-repl-passwordfile must be provided") } if cfg.pgSUPassword == "" && cfg.pgSUPasswordFile == "" { fmt.Println("one of --pg-su-password or --pg-su-passwordfile is required") } if cfg.pgSUPassword != "" && cfg.pgSUPasswordFile != "" { fmt.Println("only one of --pg-su-password or --pg-su-passwordfile must be provided") } if cfg.pgSUUsername == cfg.pgReplUsername { fmt.Println("warning: superuser name and replication user name are the same. Different users are suggested.") if cfg.pgSUPassword != cfg.pgReplPassword { fmt.Println("provided superuser name and replication user name are the same but provided passwords are different") os.Exit(1) } } if cfg.pgReplPasswordFile != "" { cfg.pgReplPassword, err = readPasswordFromFile(cfg.pgReplPasswordFile) if err != nil { fmt.Printf("cannot read pg replication user password: %v\n", err) os.Exit(1) } } if cfg.pgSUPasswordFile != "" { cfg.pgSUPassword, err = readPasswordFromFile(cfg.pgSUPasswordFile) if err != nil { fmt.Printf("cannot read pg superuser password: %v\n", err) os.Exit(1) } } // Take an exclusive lock on dataDir _, err = lock.TryExclusiveLock(cfg.dataDir, lock.Dir) if err != nil { fmt.Printf("cannot take exclusive lock on data dir %q: %v\n", cfg.dataDir, err) os.Exit(1) } log.Info("exclusive lock on data dir taken") if cfg.id != "" { if !pg.IsValidReplSlotName(cfg.id) { fmt.Printf("keeper id %q not valid. It can contain only lower-case letters, numbers and the underscore character\n", cfg.id) os.Exit(1) } } stop := make(chan bool, 0) end := make(chan error, 0) sigs := make(chan os.Signal, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go sigHandler(sigs, stop) p, err := NewPostgresKeeper(&cfg, stop, end) if err != nil { fmt.Printf("cannot create keeper: %v\n", err) os.Exit(1) } go p.Start() <-end }