94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
// kjv-api: the King James Bible web API as one program plus one SQLite
|
|
// database (kjv.db) that holds the text, every page and asset, user data and
|
|
// the logs.
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"kjv-api/internal/kjv"
|
|
)
|
|
|
|
const usage = `usage:
|
|
kjv-api [-db kjv.db] [-addr 127.0.0.1:1611] run the server
|
|
kjv-api import-assets [-db kjv.db] DIR load the pages, scripts, styles and data files from the assets folder into the database
|
|
kjv-api logs [-db kjv.db] [-n 100] print the newest log lines stored in the database
|
|
`
|
|
|
|
func findDB(flagValue string) string {
|
|
if flagValue != "" {
|
|
return flagValue
|
|
}
|
|
if v := os.Getenv("KJV_DB"); v != "" {
|
|
return v
|
|
}
|
|
candidates := []string{"kjv.db"}
|
|
if exe, err := os.Executable(); err == nil {
|
|
candidates = append(candidates, filepath.Join(filepath.Dir(exe), "kjv.db"))
|
|
}
|
|
for _, c := range candidates {
|
|
if _, err := os.Stat(c); err == nil {
|
|
return c
|
|
}
|
|
}
|
|
return "kjv.db"
|
|
}
|
|
|
|
func main() {
|
|
args := os.Args[1:]
|
|
if len(args) > 0 {
|
|
switch args[0] {
|
|
case "import-assets":
|
|
fs := flag.NewFlagSet("import-assets", flag.ExitOnError)
|
|
db := fs.String("db", "", "path to kjv.db")
|
|
fs.Parse(args[1:])
|
|
if fs.NArg() != 1 {
|
|
fmt.Fprint(os.Stderr, usage)
|
|
os.Exit(2)
|
|
}
|
|
dbPath := findDB(*db)
|
|
if _, err := os.Stat(dbPath); err != nil {
|
|
fatal(err)
|
|
}
|
|
if err := kjv.ImportAssets(dbPath, fs.Arg(0)); err != nil {
|
|
fatal(err)
|
|
}
|
|
return
|
|
case "logs":
|
|
fs := flag.NewFlagSet("logs", flag.ExitOnError)
|
|
db := fs.String("db", "", "path to kjv.db")
|
|
n := fs.Int("n", 100, "number of lines")
|
|
fs.Parse(args[1:])
|
|
if err := kjv.ShowLogs(findDB(*db), *n); err != nil {
|
|
fatal(err)
|
|
}
|
|
return
|
|
case "help", "-h", "--help":
|
|
fmt.Print(usage)
|
|
return
|
|
}
|
|
}
|
|
fs := flag.NewFlagSet("kjv-api", flag.ExitOnError)
|
|
dbFlag := fs.String("db", "", "path to kjv.db (default: $KJV_DB, ./kjv.db, next to the program)")
|
|
addr := fs.String("addr", envOr("KJV_ADDR", "127.0.0.1:1611"), "listen address (localhost only)")
|
|
fs.Parse(args)
|
|
if err := kjv.Run(findDB(*dbFlag), *addr); err != nil {
|
|
fatal(err)
|
|
}
|
|
}
|
|
|
|
func fatal(err error) {
|
|
fmt.Fprintln(os.Stderr, "kjv-api:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
func envOr(key, def string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|