diff --git a/internal/parser/NginxParser.go b/internal/parser/NginxParser.go index 27014e8..5b5b2d4 100644 --- a/internal/parser/NginxParser.go +++ b/internal/parser/NginxParser.go @@ -1,7 +1,6 @@ package parser import ( - "fmt" "regexp" "github.com/d3m0k1d/BanForge/internal/logger" @@ -23,19 +22,26 @@ func NewNginxParser() *NginxParser { } } -func (p *NginxParser) Parse(line string) (*storage.LogEntry, error) { +func (p *NginxParser) Parse(eventCh <-chan Event, resultCh chan<- *storage.LogEntry) { // Group 1: IP, Group 2: Timestamp, Group 3: Method, Group 4: Path, Group 5: Status - matches := p.pattern.FindStringSubmatch(line) - if matches == nil { - return nil, fmt.Errorf("invalid log format") - } + go func() { + for event := range eventCh { + matches := p.pattern.FindStringSubmatch(event.Data) + if matches == nil { + continue + } + path := matches[4] + status := matches[5] + method := matches[3] - return &storage.LogEntry{ - Service: "nginx", - IP: matches[1], - Path: &matches[4], - Status: &matches[5], - Method: &matches[3], - Reason: nil, - }, nil + resultCh <- &storage.LogEntry{ + Service: "nginx", + IP: matches[1], + Path: &path, + Status: &status, + Method: &method, + Reason: nil, + } + } + }() } diff --git a/internal/storage/db.go b/internal/storage/db.go index 6795ce8..922441c 100644 --- a/internal/storage/db.go +++ b/internal/storage/db.go @@ -12,7 +12,7 @@ type DB struct { db *sql.DB } -func NewDB(path string) (*DB, error) { +func NewDB() (*DB, error) { db, err := sql.Open("sqlite3", "/var/lib/banforge/storage.db") if err != nil { return nil, err diff --git a/internal/storage/writer.go b/internal/storage/writer.go new file mode 100644 index 0000000..87a958d --- /dev/null +++ b/internal/storage/writer.go @@ -0,0 +1,43 @@ +package storage + +import ( + "time" +) + +func Write(db *DB, resultCh <-chan *LogEntry) { + for result := range resultCh { + path := "" + if result.Path != nil { + path = *result.Path + } + + status := "" + if result.Status != nil { + status = *result.Status + } + + method := "" + if result.Method != nil { + method = *result.Method + } + + reason := "" + if result.Reason != nil { + reason = *result.Reason + } + + _, err := db.db.Exec( + "INSERT INTO requests (service, ip, path, method, status, reason, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)", + result.Service, + result.IP, + path, + method, + status, + reason, + time.Now().Format(time.RFC3339), + ) + if err != nil { + db.logger.Error("Failed to write to database", "error", err) + } + } +}