From c2e9154c8761cd5c4f86e391028f00bff3f32500 Mon Sep 17 00:00:00 2001 From: d3m0k1d Date: Tue, 13 Jan 2026 22:33:49 +0300 Subject: [PATCH] feat: first version for alpha test daemon on server --- cmd/banforge/main.go | 59 ++++++++++++++++++++++++++++++++++------- internal/judge/judge.go | 2 +- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/cmd/banforge/main.go b/cmd/banforge/main.go index 0eb5345..89329db 100644 --- a/cmd/banforge/main.go +++ b/cmd/banforge/main.go @@ -2,14 +2,15 @@ package main import ( "fmt" - "os" - + "github.com/d3m0k1d/BanForge/internal/blocker" "github.com/d3m0k1d/BanForge/internal/config" - _ "github.com/d3m0k1d/BanForge/internal/judge" + "github.com/d3m0k1d/BanForge/internal/judge" "github.com/d3m0k1d/BanForge/internal/logger" "github.com/d3m0k1d/BanForge/internal/parser" "github.com/d3m0k1d/BanForge/internal/storage" "github.com/spf13/cobra" + "os" + "time" ) var rootCmd = &cobra.Command{ @@ -57,27 +58,67 @@ var daemonCmd = &cobra.Command{ db, err := storage.NewDB() if err != nil { log.Error("Failed to create database", "error", err) + os.Exit(1) } + defer func() { + err = db.Close() + if err != nil { + log.Error("Failed to close database connection", "error", err) + } + }() cfg, err := config.LoadConfig() if err != nil { log.Error("Failed to load config", "error", err) + os.Exit(1) } + var b blocker.BlockerEngine + fw := cfg.Firewall.Name + switch fw { + case "ufw": + b = blocker.NewUfw(log) + case "iptables": + b = blocker.NewIptables(log, cfg.Firewall.Config) + case "nftables": + b = blocker.NewNftables(log, cfg.Firewall.Config) + case "firewalld": + b = blocker.NewFirewalld(log) + default: + log.Error("Unknown firewall", "firewall", fw) + os.Exit(1) + } + r, err := config.LoadRuleConfig() + if err != nil { + log.Error("Failed to load rules", "error", err) + os.Exit(1) + } + j := judge.New(db, b) + j.LoadRules(r) + go func() { + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + for range ticker.C { + if err := j.ProcessUnviewed(); err != nil { + log.Error("Failed to process unviewed", "error", err) + } + } + }() for service := range cfg.Service { if cfg.Service[service].Enabled && cfg.Service[service].Name != "nginx" { pars, err := parser.NewScanner(cfg.Service[service].LogPath) if err != nil { - log.Error("Failed to create parser", "error", err) + log.Error("Failed to create scanner", "error", err) } go pars.Start() - go func() { + go func(p *parser.Scanner) { ng := parser.NewNginxParser() - resultCh := make(chan *storage.LogEntry) - ng.Parse(pars.Events(), resultCh) + resultCh := make(chan *storage.LogEntry, 100) + ng.Parse(p.Events(), resultCh) go storage.Write(db, resultCh) - - }() + }(pars) } } + + select {} }, } diff --git a/internal/judge/judge.go b/internal/judge/judge.go index 1f9b9d0..666436d 100644 --- a/internal/judge/judge.go +++ b/internal/judge/judge.go @@ -1,4 +1,4 @@ -package Judge +package judge import ( "fmt"