feat: add basic workings
This commit is contained in:
@@ -4,41 +4,37 @@ import (
|
||||
"log/slog"
|
||||
"orbits-server/internal/server/bootstrap"
|
||||
"orbits-server/internal/server/database"
|
||||
"orbits-server/internal/server/service"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func revokeExpired(db *gorm.DB) {
|
||||
now := time.Now()
|
||||
|
||||
if err := db.Model(&database.AccessKey{}).
|
||||
Where("expires_at < ? AND revoked = ?", now, false).
|
||||
Update("revoked", true).Error; err != nil {
|
||||
|
||||
slog.Error("failed to revoke expired keys", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
func applyFS(env bootstrap.Environment, db *gorm.DB, fsOrphans []string) {
|
||||
fileService := service.NewFileService(db, env)
|
||||
for _, fp := range fsOrphans {
|
||||
|
||||
switch env.WatchdogSyncMode {
|
||||
|
||||
case "sync":
|
||||
f, err := os.Open(fp)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
func() {
|
||||
defer f.Close()
|
||||
|
||||
fileData, err := database.BuildFileRecord(
|
||||
f,
|
||||
filepath.Base(fp),
|
||||
env.ContentDirectory,
|
||||
)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
_ = database.CreateFile(db, &fileData)
|
||||
_ = os.Rename(fp, fileData.FilePath)
|
||||
}()
|
||||
fileService.SyncFile(fp)
|
||||
|
||||
case "strict":
|
||||
_ = os.Remove(fp)
|
||||
if err := os.Remove(fp); err != nil {
|
||||
slog.Error("failed to remove file", "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
case "dry":
|
||||
slog.Debug("dry mode", "file", fp)
|
||||
|
||||
@@ -35,6 +35,10 @@ func scanFS(env bootstrap.Environment) (map[string]struct{}, error) {
|
||||
|
||||
resp := make(map[string]struct{})
|
||||
for _, f := range fsFiles {
|
||||
if f.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
full := filepath.Join(env.ContentDirectory, f.Name())
|
||||
resp[full] = struct{}{}
|
||||
}
|
||||
|
||||
@@ -28,22 +28,40 @@ func Kickoff(env bootstrap.Environment, db *gorm.DB) {
|
||||
|
||||
run(env, db)
|
||||
|
||||
running := false
|
||||
for range ticker.C {
|
||||
run(env, db)
|
||||
if running {
|
||||
slog.Warn("watchdog is still running, skipping tick")
|
||||
continue
|
||||
}
|
||||
|
||||
running = true
|
||||
|
||||
func() {
|
||||
defer func() { running = false }()
|
||||
run(env, db)
|
||||
}()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// the watchdog has 2 tasks
|
||||
// 1 revoke expires keys
|
||||
// 2 remove / sync orphaned files/db records
|
||||
func run(env bootstrap.Environment, db *gorm.DB) {
|
||||
slog.Debug("watchdog cycle start")
|
||||
|
||||
revokeExpired(db)
|
||||
|
||||
fsState, err := scanFS(env)
|
||||
if err != nil {
|
||||
slog.Error("scanFS failed", "error", err)
|
||||
return
|
||||
}
|
||||
|
||||
dbState, err := scanDB(db)
|
||||
if err != nil {
|
||||
slog.Error("scanDB failed", "error", err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user