package main //go:generate rice embed-go import ( "fmt" "log" "os" "os/signal" "github.com/namsral/flag" "github.com/prologic/bitcask" ) func main() { var ( version bool config string dbpath string baseurl string bind string ) flag.BoolVar(&version, "v", false, "display version information") flag.StringVar(&config, "config", "", "config file") flag.StringVar(&dbpath, "dbpath", "./db/", "Database path") flag.StringVar(&baseurl, "baseurl", "", "Base URL for display purposes") flag.StringVar(&bind, "bind", "0.0.0.0:8000", "[int]: to bind to") flag.Parse() if version { fmt.Printf("shorturl v%s", FullVersion()) os.Exit(0) } // Create dbpath if required if _, err := os.Stat(dbpath); os.IsNotExist(err) { err = os.Mkdir(dbpath, os.ModePerm) if err != nil { log.Fatal(err) } } // Set up environment env := Env{} var err error env.db, err = bitcask.Open(dbpath) if err != nil { log.Fatal(err) } defer env.db.Close() // TODO: Abstract the Config and Handlers better env.cfg.baseURL = baseurl // Catch Ctrl+C to prevent Bitcask "key/value size is invalid" error on next start c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { for sig := range c { if sig == os.Kill || sig == os.Interrupt { env.db.Close() os.Exit(0) } } }() env.NewServer(bind).ListenAndServe() }