allowances/cmd/allowances/main.go

106 lines
2.1 KiB
Go

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 <passes.json>
test <passes.json>
`
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)
}
}