Доработка. Журналирование
This commit is contained in:
@@ -10,11 +10,12 @@ import (
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gpio-monitor/internal/adapter"
|
||||
"gpio-monitor/internal/logger"
|
||||
"gpio-monitor/internal/pipe"
|
||||
)
|
||||
|
||||
// ===== EMBED WEB =====
|
||||
@@ -125,7 +126,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
for {
|
||||
n, err := resp.Body.Read(buf)
|
||||
|
||||
if n > 0 {
|
||||
_, err = w.Write(buf[:n])
|
||||
if err != nil {
|
||||
@@ -134,7 +134,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
flusher.Flush()
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
log.Printf("[cam] stream ended: %v", err)
|
||||
@@ -144,43 +143,6 @@ func handleCamProxy(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
// ===== PIPE READER =====
|
||||
func startPipeReader(ctx context.Context, buf *adapter.RingBuffer, path string) {
|
||||
go func() {
|
||||
buffer := make([]byte, 64)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
||||
f, err := os.OpenFile(path, os.O_RDONLY, 0)
|
||||
if err != nil {
|
||||
time.Sleep(time.Second)
|
||||
continue
|
||||
}
|
||||
|
||||
log.Println("pipe connected")
|
||||
|
||||
for {
|
||||
n, err := f.Read(buffer)
|
||||
if err != nil {
|
||||
f.Close()
|
||||
break
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
buf.Write(buffer[i])
|
||||
}
|
||||
}
|
||||
|
||||
log.Println("pipe disconnected, retry...")
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func cors(next http.HandlerFunc) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
@@ -197,15 +159,49 @@ func cors(next http.HandlerFunc) http.HandlerFunc {
|
||||
}
|
||||
|
||||
func main() {
|
||||
pipePath := flag.String("pipe", "/tmp/gpio_pipe", "pipe path")
|
||||
pipePath := flag.String("pipe", "/tmp/gpio_pipe", "путь к pipe")
|
||||
flag.Parse()
|
||||
|
||||
// ===== ИНИЦИАЛИЗАЦИЯ ЛОГГЕРОВ =====
|
||||
|
||||
// 1. EventLogger (события системы)
|
||||
eventLogger, err := logger.NewEventLogger("logs/events.log")
|
||||
if err != nil {
|
||||
log.Fatal("Ошибка инициализации EventLogger:", err)
|
||||
}
|
||||
defer eventLogger.Close()
|
||||
eventLogger.Event("СЕРВЕР_ЗАПУЩЕН")
|
||||
|
||||
// 1.5 Human-readable логгер
|
||||
humanLogger, err := logger.NewHumanLogger("logs/gpio_human.log")
|
||||
if err != nil {
|
||||
log.Fatal("Ошибка инициализации HumanLogger:", err)
|
||||
}
|
||||
defer humanLogger.Close()
|
||||
eventLogger.Event("HUMAN_ЛОГЕР_ГОТОВ")
|
||||
|
||||
// 2. Monitor (watchdog)
|
||||
monitor := logger.NewMonitor(eventLogger)
|
||||
|
||||
// 3. DataLogger с ротацией
|
||||
dataLogger, err := logger.NewRotatingLogger("logs/data", eventLogger)
|
||||
if err != nil {
|
||||
eventLogger.Event("ОШИБКА_ИНИЦИАЛИЗАЦИИ_DATA_ЛОГЕРА")
|
||||
log.Fatal("Ошибка инициализации DataLogger:", err)
|
||||
}
|
||||
defer dataLogger.Close()
|
||||
eventLogger.Event("DATA_ЛОГЕР_ГОТОВ")
|
||||
|
||||
// 4. RingBuffer
|
||||
buf := adapter.NewRingBuffer(1024 * 10)
|
||||
|
||||
// 5. PipeReader
|
||||
pipeReader := pipe.NewPipeReader(buf, dataLogger, humanLogger, monitor, eventLogger)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
pipeReader.Start(ctx, *pipePath)
|
||||
|
||||
startPipeReader(ctx, buf, *pipePath)
|
||||
|
||||
// ===== API И WEB СЕРВЕР =====
|
||||
api := &API{
|
||||
buf: buf,
|
||||
startTime: time.Now(),
|
||||
@@ -234,7 +230,6 @@ func main() {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
http.Handle("/", http.FileServer(http.FS(webFS)))
|
||||
|
||||
log.Println("Server started on :8080")
|
||||
|
||||
Reference in New Issue
Block a user