Split crockery init and crockery run into separate files

This commit is contained in:
2018-03-05 23:50:45 +00:00
parent a91b2654d9
commit 4973a683fb
3 changed files with 124 additions and 105 deletions

59
cmd/crockery/cmd_init.go Normal file
View File

@@ -0,0 +1,59 @@
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"gopkg.in/urfave/cli.v1"
"ur.gs/crockery/internal/store"
)
func crockeryInit(c *cli.Context) error {
db := c.GlobalString("db")
domain := c.String("domain")
certFile := c.String("cert")
keyFile := c.String("key")
if db == "" {
return fmt.Errorf("No crockery database file specified")
}
if domain == "" {
return fmt.Errorf("A domain must be specified")
}
// FIXME: we can make cert+key optional at some point and have them be
// generated on-demand via ACME during `crockery run` instead.
if certFile == "" {
return fmt.Errorf("A certificate file must be specified")
}
if keyFile == "" {
return fmt.Errorf("A key file must be specified")
}
if _, err := os.Stat(db); !os.IsNotExist(err) {
return fmt.Errorf("File %q already exists, refusing to overwrite", db)
}
certPEM, err := ioutil.ReadFile(certFile)
if err != nil {
return fmt.Errorf("Failed to read certificate from %q: %v", certFile, err)
}
keyPEM, err := ioutil.ReadFile(keyFile)
if err != nil {
return fmt.Errorf("Failed to read key from %q: %v", keyFile, err)
}
if err := store.Init(db, domain, certPEM, keyPEM); err != nil {
return fmt.Errorf("Couldn't initialize datase %q: %v", db, err)
}
log.Printf("Created %q for domain %q. Next step:\n\t%s -db %s run", db, domain, os.Args[0], db)
return nil
}

65
cmd/crockery/cmd_run.go Normal file
View File

@@ -0,0 +1,65 @@
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"gopkg.in/urfave/cli.v1"
"ur.gs/crockery/internal/services"
"ur.gs/crockery/internal/store"
)
func crockeryRun(c *cli.Context) error {
db := c.GlobalString("db")
ctx, cancel := context.WithCancel(context.Background())
if db == "" {
return fmt.Errorf("No crockery database file specified")
}
log.Printf("Loading config from file %q", db)
datastore, err := store.New(context.Background(), db)
if err != nil {
return err
}
defer datastore.Close()
if datastore.Domain() == "" {
return fmt.Errorf("No domain configured in file %q", db)
}
log.Printf("Starting crockery for domain %q", datastore.Domain())
srv, err := services.New(ctx, datastore)
if err != nil {
return fmt.Errorf("Couldn't start services:", err)
}
sig := make(chan os.Signal, 1)
done := make(chan bool)
signal.Notify(sig, os.Interrupt)
go func() {
s := <-sig
log.Print("Got signal: ", s)
cancel()
}()
go func() {
srv.Run()
close(done)
}()
<-done
log.Println("All services finished, exiting")
return nil
}

View File

@@ -1,17 +1,10 @@
package main
import (
"context"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"gopkg.in/urfave/cli.v1"
"ur.gs/crockery/internal/services"
"ur.gs/crockery/internal/store"
)
func main() {
@@ -67,101 +60,3 @@ func main() {
log.Fatal(err)
}
}
func crockeryInit(c *cli.Context) error {
db := c.GlobalString("db")
domain := c.String("domain")
certFile := c.String("cert")
keyFile := c.String("key")
if db == "" {
return fmt.Errorf("No crockery database file specified")
}
if domain == "" {
return fmt.Errorf("A domain must be specified")
}
// FIXME: we can make cert+key optional at some point and have them be
// generated on-demand via ACME during `crockery run` instead.
if certFile == "" {
return fmt.Errorf("A certificate file must be specified")
}
if keyFile == "" {
return fmt.Errorf("A key file must be specified")
}
if _, err := os.Stat(db); !os.IsNotExist(err) {
return fmt.Errorf("File %q already exists, refusing to overwrite", db)
}
certPEM, err := ioutil.ReadFile(certFile)
if err != nil {
return fmt.Errorf("Failed to read certificate from %q: %v", certFile, err)
}
keyPEM, err := ioutil.ReadFile(keyFile)
if err != nil {
return fmt.Errorf("Failed to read key from %q: %v", keyFile, err)
}
if err := store.Init(db, domain, certPEM, keyPEM); err != nil {
return fmt.Errorf("Couldn't initialize datase %q: %v", db, err)
}
log.Printf("Created %q for domain %q. Next step:\n\t%s -db %s run", db, domain, os.Args[0], db)
return nil
}
func crockeryRun(c *cli.Context) error {
db := c.GlobalString("db")
ctx, cancel := context.WithCancel(context.Background())
if db == "" {
return fmt.Errorf("No crockery database file specified")
}
log.Printf("Loading config from file %q", db)
datastore, err := store.New(context.Background(), db)
if err != nil {
return err
}
defer datastore.Close()
if datastore.Domain() == "" {
return fmt.Errorf("No domain configured in file %q", db)
}
log.Printf("Starting crockery for domain %q", datastore.Domain())
srv, err := services.New(ctx, datastore)
if err != nil {
return fmt.Errorf("Couldn't start services:", err)
}
sig := make(chan os.Signal, 1)
done := make(chan bool)
signal.Notify(sig, os.Interrupt)
go func() {
s := <-sig
log.Print("Got signal: ", s)
cancel()
}()
go func() {
srv.Run()
close(done)
}()
<-done
log.Println("All services finished, exiting")
return nil
}