// chorus-admin-bootstrap creates the first administrator from external inputs. package main import ( "context" "database/sql" "errors" "log" "os" "time" "git.ilapage.cn/OPC/chorus/internal/adminbootstrap" _ "github.com/go-sql-driver/mysql" ) func main() { result, err := run(os.LookupEnv, os.Args[1:]) if err != nil { log.Printf("chorus admin bootstrap failed: %v", err) os.Exit(1) } switch result { case adminbootstrap.Created: log.Print("chorus administrator account created") case adminbootstrap.Unchanged: log.Print("chorus administrator account already exists; password was not changed") case adminbootstrap.PasswordReset: log.Print("chorus administrator password reset completed") default: log.Print("chorus administrator bootstrap completed") } } func run(lookup func(string) (string, bool), args []string) (adminbootstrap.Result, error) { if len(args) != 0 { return 0, errors.New("chorus-admin-bootstrap accepts no command-line arguments") } cfg, err := adminbootstrap.LoadConfig(lookup) if err != nil { return 0, err } db, err := sql.Open("mysql", cfg.DSN) if err != nil { return 0, adminbootstrap.ErrDatabaseUnavailable } defer db.Close() ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() result, err := adminbootstrap.Bootstrap(ctx, db, cfg) if err != nil { return 0, err } return result, nil }