bacheca/cmd/bacheca-moa/main.go

101 lines
2.3 KiB
Go

package main
import (
"flag"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"git.fromouter.space/Artificiale/consulconf"
"git.fromouter.space/Artificiale/moa/sd"
"github.com/go-kit/kit/log"
svc "git.abbiamoundominio.org/hamcha/bacheca"
"git.abbiamoundominio.org/hamcha/bacheca/storage"
boltbackend "git.abbiamoundominio.org/hamcha/bacheca/storage/bolt"
filebackend "git.abbiamoundominio.org/hamcha/bacheca/storage/file"
)
type bachecaConfig struct {
Bind string
Advertise string
StorageType string
StorageFile string
}
func main() {
consulAddr := flag.String("consul.addr", "consul:8500", "Consul address")
consulConf := flag.String("consul.conf", "bacheca/config", "Consul KV prefix with configuration")
flag.Parse()
err := consulconf.UseDefaultClient(*consulAddr)
if err != nil {
panic(err)
}
var config bachecaConfig
err = consulconf.Get(*consulConf, &config)
if err != nil {
panic(err)
}
var backend storage.Backend
switch config.StorageType {
case "bolt":
boltdb, err := boltbackend.MakeBoltBackend(config.StorageFile)
if err != nil {
panic(err)
}
defer boltdb.Close()
backend = boltdb
case "file":
filebackend, err := filebackend.MakeFileBackend(config.StorageFile)
if err != nil {
panic(err)
}
backend = filebackend
default:
panic("unknown storage backend type (-storage.type), check help for supported backends")
}
var logger log.Logger
{
logger = log.NewLogfmtLogger(os.Stderr)
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
logger = log.With(logger, "caller", log.DefaultCaller)
}
s := svc.MakeService(backend)
handler := svc.MakeHTTPHandler(s, logger)
// Register with consul
registrar := sd.Register(*consulAddr, sd.Options{
Name: "bacheca",
Advertise: config.Advertise,
Tags: []string{
"http", // Expose via HTTP
"match-path:events", // Publish at /events/*
"private", // All APIs are private..
"public:/feed", // ..except /feed
},
}, logger)
defer registrar.Deregister()
errs := make(chan error)
go func() {
c := make(chan os.Signal)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
errs <- fmt.Errorf("%s", <-c)
}()
go func() {
logger.Log("transport", "HTTP", "addr", config.Bind)
errs <- http.ListenAndServe(config.Bind, handler)
}()
logger.Log("exit", <-errs)
}