package main import ( "flag" "fmt" "log" "os" "os/signal" "path/filepath" "syscall" "xengineering.eu/ceres/model" ) func main() { flag.Parse() if flags.version { fmt.Println(version) os.Exit(0) } log.Println("Ceres recipe server started") defer log.Println("Ceres recipe server stopped") log.Printf("Version: %s", version) if flags.config != "" { config.Read(flags.config) } storage := model.NewStorage(config.StorageFilePath) if !storage.Exists() { storage.Create() } log.Printf("Storage directory: %s\n", storage.Path) db, err := model.OpenDB(filepath.Join(storage.Path, "ceres.sqlite3")) if err != nil { log.Fatalf("Failed to open database: %v", err) } defer func() { err := db.Close() if err != nil { log.Println("Failed to close database") } else { log.Println("Closed database") } }() err = db.Migrate() if err != nil { log.Fatal(err) } if flags.examples { err := db.CreateExamples() if err != nil { log.Fatalf("Failed to insert example recipes: %v", err) } log.Println("Created example recipes") } server := NewServer(config.HttpAddress, db) go server.Start() defer server.Stop() await(syscall.SIGTERM, syscall.SIGINT) } func await(signals ...syscall.Signal) { listener := make(chan os.Signal) for _, s := range signals { signal.Notify(listener, s) } sig := <-listener log.Printf("Received OS signal '%v'\n", sig) }