You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
53 lines
1.3 KiB
package main
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/domagojzecevic/cammonitor/internal/auth"
|
|
"github.com/domagojzecevic/cammonitor/internal/config"
|
|
"github.com/domagojzecevic/cammonitor/internal/db"
|
|
"github.com/domagojzecevic/cammonitor/internal/footage"
|
|
"github.com/domagojzecevic/cammonitor/internal/web"
|
|
)
|
|
|
|
func main() {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
log.Fatalf("load config: %v", err)
|
|
}
|
|
|
|
database, err := db.Open(cfg.DBPath)
|
|
if err != nil {
|
|
log.Fatalf("open database: %v", err)
|
|
}
|
|
defer database.Close()
|
|
|
|
authStore := auth.NewStore(database)
|
|
if err := authStore.EnsureAdmin(cfg.AdminUser, cfg.AdminPass); err != nil {
|
|
log.Fatalf("ensure admin: %v", err)
|
|
}
|
|
go purgeExpiredSessions(authStore)
|
|
|
|
footageIndex := footage.NewIndex(cfg.FootageRoot, cfg.ScanInterval)
|
|
defer footageIndex.Close()
|
|
|
|
router := web.NewRouter(cfg, database, footageIndex)
|
|
|
|
log.Printf("listening on %s", cfg.ListenAddr)
|
|
if err := http.ListenAndServe(cfg.ListenAddr, router); err != nil {
|
|
log.Fatalf("server stopped: %v", err)
|
|
}
|
|
}
|
|
|
|
func purgeExpiredSessions(store *auth.Store) {
|
|
ticker := time.NewTicker(time.Hour)
|
|
defer ticker.Stop()
|
|
|
|
for range ticker.C {
|
|
if err := store.PurgeExpiredSessions(); err != nil {
|
|
log.Printf("purge expired sessions: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|