70 lines
1.3 KiB
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
|
|
}
|