package main import ( "fmt" "log" "net/http" "os" "strconv" "github.com/bgentry/speakeasy" "mcquay.me/allowances" ) const usage = `allowances app subcommands: pw -- manage password file serve -- serve webapp ` const pwUsage = `allowances pw subcommands: add test ` func main() { if len(os.Args) < 2 { fmt.Fprintf(os.Stderr, usage) os.Exit(1) } subcommand := os.Args[1] switch subcommand { case "pw": pwCmd := os.Args[2:] if len(pwCmd) != 2 { fmt.Fprintf(os.Stderr, "%s\n", pwUsage) os.Exit(1) } switch pwCmd[0] { case "add": pw, err := speakeasy.Ask("new pass: ") if err != nil { fmt.Fprintf(os.Stderr, "failure to get password: %v", err) os.Exit(1) } if err := allowances.AddPassword(pwCmd[1], pw); err != nil { fmt.Fprintf(os.Stderr, "problem adding password: %v", err) os.Exit(1) } case "test": passes, _, err := allowances.GetHashes(pwCmd[1]) if err != nil { fmt.Fprintf(os.Stderr, "problem opening passes file: %v", err) os.Exit(1) } pw, err := speakeasy.Ask("check password: ") if err != nil { panic(err) } ok, err := passes.Check(pw) if err != nil { panic(err) } if !ok { fmt.Fprintf(os.Stderr, "bad password") os.Exit(1) } default: fmt.Fprintf(os.Stderr, "%s\n", pwUsage) os.Exit(1) } case "serve": sm := http.NewServeMux() dbfile := os.Getenv("DB") passfile := os.Getenv("PASSES") _, err := allowances.NewAllowances(sm, dbfile, passfile, os.Getenv("STATIC")) if err != nil { fmt.Fprintf(os.Stderr, "unable to initialize web server: %v\n", err) os.Exit(1) } port := 8000 if os.Getenv("PORT") != "" { p, err := strconv.Atoi(os.Getenv("PORT")) if err != nil { fmt.Fprintf(os.Stderr, "problem parsing port from env: %v\n", err) os.Exit(1) } port = p } addr := fmt.Sprintf(":%d", port) log.Printf("%+v", addr) err = http.ListenAndServe(addr, sm) if err != nil { panic(err) } default: fmt.Fprintf(os.Stderr, "unknown subcommand %s\n\n%s\n", subcommand, usage) os.Exit(1) } }