rssmon3/main.go

99 lines
2.0 KiB
Go
Executable File

package main
import (
"local/lastn/lastn"
"local/rssmon3/config"
"local/rssmon3/handlers"
"local/rssmon3/monitor"
"local/rssmon3/server"
"log"
"os"
"os/signal"
"path/filepath"
"syscall"
"time"
)
func main() {
log.SetPrefix("..")
time.Local = time.FixedZone("UTC-6", (-6*int(time.Hour))/int(time.Second))
sigc := make(chan os.Signal)
if err := config.New(); err != nil {
panic(err)
}
log.Println("[main]", config.Values())
m, err := monitor.New()
if err != nil {
panic(err)
}
go InterruptAfter(m.Run, sigc)
s := server.New(m.Incoming)
if err := s.Routes(); err != nil {
panic(err)
}
go InterruptAfter(s.Run, sigc)
h := handlers.New(m.Outgoing)
go InterruptAfter(h.Run, sigc)
go EnqueueBackups()
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
)
<-sigc
config.Values().Can()
config.Values().DB.Close()
}
func InterruptAfter(foo func() error, c chan os.Signal) {
if err := foo(); err != nil {
log.Println("[InterruptAfter]", err)
}
c <- syscall.SIGINT
}
func EnqueueBackups() {
realpath, err := filepath.Abs(config.Values().Addr)
if err != nil {
log.Println("dir", config.Values().Addr, "not found, so no backups")
return
}
conf := lastn.Config{
N: 3,
Root: realpath,
Ns: "backups",
Store: "files",
StoreAddr: realpath + "-backups",
}
log.Printf("backups conf: %+v", conf)
lastn, err := lastn.New(conf)
if err != nil {
log.Println("backups disabled:", realpath, ":", err)
return
}
ticker := time.NewTicker(time.Hour * 24)
log.Println("backup initial:", err)
if err := lastn.Push(); err != nil {
log.Println("backup failed:", err)
}
if err := lastn.Clean(); err != nil {
log.Println("backup clean failed:", err)
}
for _ = range ticker.C {
log.Println("backing up...")
if err := lastn.Push(); err != nil {
log.Println("backup push failed:", err)
}
if err := lastn.Clean(); err != nil {
log.Println("backup clean failed:", err)
}
}
}