crockery/cmd/crockery/cmd_run.go

70 lines
1.3 KiB
Go

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 {
home := c.GlobalString("home")
ctx, cancel := context.WithCancel(context.Background())
if home == "" {
return fmt.Errorf("No crockery home directory specified")
}
log.Printf("Loading config from directory %q", home)
datastore, err := store.New(context.Background(), home)
if err != nil {
return err
}
defer datastore.Close()
if datastore.Domain() == "" {
return fmt.Errorf("No domain configured for Crockery home directory %q", home)
}
if _, err := datastore.FindAccount("postmaster@" + datastore.Domain()); err != nil {
return fmt.Errorf("Couldn't find postmaster: %v", err)
}
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
}