From 28f29f3d682a1f2cab36c46f664745e63814ac4b Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 5 Jan 2015 11:50:42 -0900 Subject: [PATCH 1/3] can serve (hackish) --- api/auth.go | 8 ++- cmd/bactdb/bactdb.go | 125 +++++++++---------------------------------- 2 files changed, 30 insertions(+), 103 deletions(-) diff --git a/api/auth.go b/api/auth.go index 1a36603..cdeb4f2 100644 --- a/api/auth.go +++ b/api/auth.go @@ -2,9 +2,11 @@ package api import ( "errors" + "fmt" "io/ioutil" "log" "net/http" + "path/filepath" "github.com/dgrijalva/jwt-go" ) @@ -26,12 +28,14 @@ var ( func init() { var err error + dir, _ := filepath.Abs(filepath.Dir(privKeyPath)) + fmt.Println(dir) signKey, err = ioutil.ReadFile(privKeyPath) if err != nil { // Before exploding, check up one level... - signKey, err = ioutil.ReadFile("../" + privKeyPath) + signKey, err = ioutil.ReadFile("../../" + privKeyPath) if err != nil { log.Fatalf("Error reading private key: ", err) return @@ -41,7 +45,7 @@ func init() { verifyKey, err = ioutil.ReadFile(pubKeyPath) if err != nil { // Before exploding, check up one level... - verifyKey, err = ioutil.ReadFile("../" + pubKeyPath) + verifyKey, err = ioutil.ReadFile("../../" + pubKeyPath) if err != nil { log.Fatalf("Error reading public key: ", err) return diff --git a/cmd/bactdb/bactdb.go b/cmd/bactdb/bactdb.go index 63a228f..c9c3ba6 100644 --- a/cmd/bactdb/bactdb.go +++ b/cmd/bactdb/bactdb.go @@ -1,126 +1,49 @@ package main import ( - "flag" - "fmt" "log" "net/http" "os" + "github.com/codegangsta/cli" "github.com/thermokarst/bactdb/api" "github.com/thermokarst/bactdb/datastore" ) -func init() { - flag.Usage = func() { - fmt.Fprintln(os.Stderr, `bactdb is a database for bacteria. - -Usage: - - bactdb [options] command [arg...] - -The commands are: -`) - for _, c := range subcmds { - fmt.Fprintf(os.Stderr, " %-24s %s\n", c.name, c.description) - } - fmt.Fprintln(os.Stderr, ` -Use "bactdb command -h" for more information about a command. - -The options are: -`) - flag.PrintDefaults() - os.Exit(1) - } -} - func main() { - flag.Parse() + app := cli.NewApp() + app.Name = "bactdb" + app.Usage = "a database for bacteria" - if flag.NArg() == 0 { - flag.Usage() - } - log.SetFlags(0) - - subcmd := flag.Arg(0) - for _, c := range subcmds { - if c.name == subcmd { - c.run(flag.Args()[1:]) - return - } + app.Commands = []cli.Command{ + { + Name: "serve", + ShortName: "s", + Usage: "Start web server", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "http", + Value: ":8901", + Usage: "HTTP service address", + }, + }, + Action: cmdServe, + }, } - fmt.Fprintf(os.Stderr, "unknown subcmd %q\n", subcmd) - fmt.Fprintln(os.Stderr, `Run "bactdb -h" for usage.`) - os.Exit(1) + app.Run(os.Args) } -type subcmd struct { - name string - description string - run func(args []string) -} - -var subcmds = []subcmd{ - {"serve", "start web server", serveCmd}, - {"createdb", "create the database schema", createDBCmd}, -} - -func serveCmd(args []string) { - fs := flag.NewFlagSet("serve", flag.ExitOnError) - httpAddr := flag.String("http", ":8901", "HTTP service address") - fs.Usage = func() { - fmt.Fprintln(os.Stderr, `usage: bactdb serve [options] - -Starts the web server that serves the API. - -The options are: -`) - fs.PrintDefaults() - os.Exit(1) - } - fs.Parse(args) - - if fs.NArg() != 0 { - fs.Usage() - } +func cmdServe(c *cli.Context) { + httpAddr := c.String("http") datastore.Connect() m := http.NewServeMux() m.Handle("/api/", http.StripPrefix("/api", api.Handler())) - - log.Print("Listening on ", *httpAddr) - err := http.ListenAndServe(*httpAddr, m) + log.Print("Listening on ", httpAddr) + err := http.ListenAndServe(httpAddr, m) if err != nil { - log.Fatal("ListenAndServe:", err) + log.Fatal("ListenAndServe: ", err) } } - -func createDBCmd(args []string) { - fs := flag.NewFlagSet("createdb", flag.ExitOnError) - drop := fs.Bool("drop", false, "drop DB before creating") - fs.Usage = func() { - fmt.Fprintln(os.Stderr, `usage: bactdb createdb [options] - -Creates the necessary DB schema. - -The options are: -`) - fs.PrintDefaults() - os.Exit(1) - } - fs.Parse(args) - - if fs.NArg() != 0 { - fs.Usage() - } - - datastore.Connect() - migrationsPath := "./datastore/migrations" - - if *drop { - datastore.Drop(migrationsPath) - } - datastore.Create(migrationsPath) -} From d081639b885c229ff2051fb18dfc4ba8ae1675e3 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 5 Jan 2015 13:27:37 -0900 Subject: [PATCH 2/3] WIP --- cmd/bactdb/bactdb.go | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/cmd/bactdb/bactdb.go b/cmd/bactdb/bactdb.go index c9c3ba6..1f46b06 100644 --- a/cmd/bactdb/bactdb.go +++ b/cmd/bactdb/bactdb.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net/http" "os" @@ -21,21 +22,38 @@ func main() { ShortName: "s", Usage: "Start web server", Flags: []cli.Flag{ - cli.StringFlag{ - Name: "http", - Value: ":8901", - Usage: "HTTP service address", + cli.IntFlag{ + Name: "port", + Value: 8901, + Usage: "HTTP service port", }, }, Action: cmdServe, }, + { + Name: "createdb", + ShortName: "c", + Usage: "create the database schema", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "drop", + Usage: "drop DB before creating", + }, + cli.StringFlag{ + Name: "migration_path", + Usage: "path to migrations", + Value: "./datastore/migrations", + }, + }, + Action: cmdCreateDB, + }, } app.Run(os.Args) } func cmdServe(c *cli.Context) { - httpAddr := c.String("http") + httpAddr := fmt.Sprintf(":%v", c.Int("port")) datastore.Connect() @@ -47,3 +65,14 @@ func cmdServe(c *cli.Context) { log.Fatal("ListenAndServe: ", err) } } + +func cmdCreateDB(c *cli.Context) { + migrationsPath := c.String("migration_path") + + datastore.Connect() + + if c.Bool("drop") { + datastore.Drop(migrationsPath) + } + datastore.Create(migrationsPath) +} From 7a59ef6be3c3ad0bec71aefb6fd657b3abe5516c Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 5 Jan 2015 14:16:15 -0900 Subject: [PATCH 3/3] Can specify certs now --- api/auth.go | 38 ++++++++++++++++---------------------- cmd/bactdb/bactdb.go | 8 +++++++- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/api/auth.go b/api/auth.go index cdeb4f2..7e5c98c 100644 --- a/api/auth.go +++ b/api/auth.go @@ -6,15 +6,12 @@ import ( "io/ioutil" "log" "net/http" - "path/filepath" "github.com/dgrijalva/jwt-go" ) const ( - privKeyPath = "keys/app.rsa" // openssl genrsa -out app.rsa keysize - pubKeyPath = "keys/app.rsa.pub" // openssl rsa -in app.rsa -pubout > app.rsa.pub - tokenName = "AccessToken" + tokenName = "AccessToken" ) var ( @@ -26,31 +23,28 @@ var ( errGenericError = errors.New("generic error") ) -func init() { +func SetupCerts(p string) error { var err error - dir, _ := filepath.Abs(filepath.Dir(privKeyPath)) - fmt.Println(dir) - - signKey, err = ioutil.ReadFile(privKeyPath) - if err != nil { - // Before exploding, check up one level... - signKey, err = ioutil.ReadFile("../../" + privKeyPath) - if err != nil { - log.Fatalf("Error reading private key: ", err) - return - } + log.Fatalf("Path error: ", err) } + // openssl genrsa -out app.rsa keysize + privKeyPath := fmt.Sprintf("%vapp.rsa", p) + signKey, err = ioutil.ReadFile(privKeyPath) + if err != nil { + log.Fatalf("Error reading private key: ", err) + return err + } + + // openssl rsa -in app.rsa -pubout > app.rsa.pub + pubKeyPath := fmt.Sprintf("%vapp.rsa.pub", p) verifyKey, err = ioutil.ReadFile(pubKeyPath) if err != nil { - // Before exploding, check up one level... - verifyKey, err = ioutil.ReadFile("../../" + pubKeyPath) - if err != nil { - log.Fatalf("Error reading public key: ", err) - return - } + log.Fatalf("Error reading public key: ", err) + return err } + return nil } type authHandler func(http.ResponseWriter, *http.Request) error diff --git a/cmd/bactdb/bactdb.go b/cmd/bactdb/bactdb.go index 1f46b06..97e1dde 100644 --- a/cmd/bactdb/bactdb.go +++ b/cmd/bactdb/bactdb.go @@ -24,8 +24,13 @@ func main() { Flags: []cli.Flag{ cli.IntFlag{ Name: "port", - Value: 8901, Usage: "HTTP service port", + Value: 8901, + }, + cli.StringFlag{ + Name: "keys", + Usage: "path to keys", + Value: "keys/", }, }, Action: cmdServe, @@ -56,6 +61,7 @@ func cmdServe(c *cli.Context) { httpAddr := fmt.Sprintf(":%v", c.Int("port")) datastore.Connect() + api.SetupCerts(c.String("keys")) m := http.NewServeMux() m.Handle("/api/", http.StripPrefix("/api", api.Handler()))