101 lines
2.3 KiB
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)
|
|
}
|