syncthing/cmd/discosrv/main.go

95 lines
1.7 KiB
Go
Raw Normal View History

2015-03-25 08:16:52 +01:00
// Copyright (C) 2014-2015 Jakob Borg and Contributors (see the CONTRIBUTORS file).
2014-06-01 22:50:14 +02:00
2013-12-23 03:35:05 +01:00
package main
import (
2015-03-25 08:16:52 +01:00
"database/sql"
2014-02-20 17:40:15 +01:00
"flag"
2013-12-23 03:35:05 +01:00
"log"
"net"
2014-02-20 17:40:15 +01:00
"os"
2015-03-25 08:16:52 +01:00
"strings"
"time"
2013-12-23 03:35:05 +01:00
2015-03-25 08:16:52 +01:00
_ "github.com/lib/pq"
"github.com/thejerf/suture"
2013-12-23 03:35:05 +01:00
)
var (
2015-03-25 08:16:52 +01:00
lruSize = 10240
limitAvg = 5
limitBurst = 20
dbConn = getEnvDefault("DISCOSRV_DB", "postgres://user:password@localhost/discosrv")
globalStats stats
2013-12-23 03:35:05 +01:00
)
func main() {
2015-03-25 08:16:52 +01:00
const (
cleanIntv = 1 * time.Hour
statsIntv = 5 * time.Minute
)
2014-02-20 17:40:15 +01:00
var listen string
2015-03-25 08:16:52 +01:00
log.SetOutput(os.Stdout)
log.SetFlags(0)
2014-02-20 17:40:15 +01:00
flag.StringVar(&listen, "listen", ":22026", "Listen address")
2014-06-27 22:39:03 +02:00
flag.IntVar(&lruSize, "limit-cache", lruSize, "Limiter cache entries")
flag.IntVar(&limitAvg, "limit-avg", limitAvg, "Allowed average package rate, per 10 s")
flag.IntVar(&limitBurst, "limit-burst", limitBurst, "Allowed burst size, packets")
2014-02-20 17:40:15 +01:00
flag.Parse()
addr, _ := net.ResolveUDPAddr("udp", listen)
2013-12-23 03:35:05 +01:00
2015-03-25 08:16:52 +01:00
if !strings.Contains(dbConn, "sslmode=") {
dbConn += "?sslmode=disable"
2014-09-08 11:48:26 +02:00
}
2015-03-25 08:16:52 +01:00
var err error
db, err := sql.Open("postgres", dbConn)
2014-09-08 11:48:26 +02:00
if err != nil {
2015-03-25 08:16:52 +01:00
log.Fatalln("Setup:", err)
2014-09-08 11:48:26 +02:00
}
2015-03-25 08:16:52 +01:00
err = setupDB(db)
2014-09-08 11:48:26 +02:00
if err != nil {
2015-03-25 08:16:52 +01:00
log.Fatalln("Setup:", err)
2014-04-19 23:14:56 +02:00
}
2015-03-25 08:16:52 +01:00
prep, err := compileStatements(db)
2014-09-08 11:48:26 +02:00
2015-03-25 08:16:52 +01:00
main := suture.NewSimple("main")
2014-04-03 23:38:32 +02:00
2015-03-25 08:16:52 +01:00
main.Add(&querysrv{
addr: addr,
db: db,
prep: prep,
})
2014-04-03 23:38:32 +02:00
2015-03-25 08:16:52 +01:00
main.Add(&cleansrv{
intv: cleanIntv,
db: db,
prep: prep,
})
2014-04-03 23:38:32 +02:00
2015-03-25 08:16:52 +01:00
main.Add(&statssrv{
intv: statsIntv,
})
2013-12-23 03:35:05 +01:00
2015-03-25 08:16:52 +01:00
globalStats.Reset()
main.Serve()
2014-04-03 22:44:40 +02:00
}
2014-02-20 17:40:15 +01:00
2015-03-25 08:16:52 +01:00
func getEnvDefault(key, def string) string {
if val := os.Getenv(key); val != "" {
return val
}
2015-03-25 08:16:52 +01:00
return def
2014-04-03 22:44:40 +02:00
}
2015-03-25 08:16:52 +01:00
func next(intv time.Duration) time.Duration {
2014-04-19 23:14:56 +02:00
t0 := time.Now()
2015-03-25 08:16:52 +01:00
t1 := t0.Add(intv).Truncate(intv)
return t1.Sub(t0)
2014-09-08 11:48:26 +02:00
}