diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go new file mode 100644 index 0000000..1d60fcc --- /dev/null +++ b/backend/handlers/handlers.go @@ -0,0 +1,78 @@ +package handlers + +import ( + "encoding/json" + "log" + "net/http" + + "resource-monitor/backend/types" + "resource-monitor/backend/utils" + + "resource-monitor/backend/monitor" +) + +var ShutdownChan = make(chan struct{}) + +func ResourceUsageHandler(w http.ResponseWriter, r *http.Request) { + usage := types.ResourceUsage{ + CPUUsage: utils.GetCPUUsage(), + MemoryUsage: utils.GetMemoryUsage(), + DiskUsage: utils.GetDiskUsage(), + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(usage) +} + +func ToggleAlertHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) + return + } + + var data struct { + EnableAlerts bool `json:"enable_alerts"` + } + + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + http.Error(w, "Invalid request", http.StatusBadRequest) + return + } + + monitor.Mu.Lock() + monitor.AlertEnabled = data.EnableAlerts + monitor.Mu.Unlock() + + log.Printf("Alerts enabled: %v", data.EnableAlerts) + w.WriteHeader(http.StatusOK) +} + +func ToggleLimitHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) + return + } + + var data types.SetLimit + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + http.Error(w, "Invalid request", http.StatusBadRequest) + return + } + + monitor.Mu.Lock() + monitor.DefaultLimit = data + monitor.Mu.Unlock() + + log.Printf("Updated limits - CPU: %.2f, Memory: %.2f, Disk: %.2f", data.CPUThreshold, data.MemoryThreshold, data.DiskThreshold) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) +} + +func ShutdownHandler(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + log.Println("Received shutdown request") + close(ShutdownChan) + w.WriteHeader(http.StatusOK) + } else { + http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) + } +} diff --git a/backend/main.go b/backend/main.go new file mode 100644 index 0000000..be339c6 --- /dev/null +++ b/backend/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "log" + "net/http" + + "resource-monitor/backend/handlers" + "resource-monitor/backend/monitor" +) + +func main() { + monitor.AlertEnabled = true + log.Println("Default limits:", monitor.DefaultLimit) + + http.HandleFunc("/toggle-alerts", handlers.ToggleAlertHandler) + http.HandleFunc("/resource-usage", handlers.ResourceUsageHandler) + http.HandleFunc("/limit-changer", handlers.ToggleLimitHandler) + http.HandleFunc("/shutdown", handlers.ShutdownHandler) + + server := &http.Server{Addr: ":8080"} + + go monitor.MonitorResources() + + go func() { + log.Println("Starting backend server on port 8080...") + if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("Server error: %v", err) + } + }() + + <-handlers.ShutdownChan + + log.Println("Shutting down the server...") + if err := server.Close(); err != nil { + log.Fatalf("Server shutdown failed: %v", err) + } + log.Println("Server stopped.") +} diff --git a/backend/output b/backend/output new file mode 100755 index 0000000..2380e58 Binary files /dev/null and b/backend/output differ diff --git a/backend/types/types.go b/backend/types/types.go new file mode 100644 index 0000000..e12e8ee --- /dev/null +++ b/backend/types/types.go @@ -0,0 +1,13 @@ +package types + +type ResourceUsage struct { + CPUUsage float64 `json:"cpu_usage"` + MemoryUsage float64 `json:"memory_usage"` + DiskUsage float64 `json:"disk_usage"` +} + +type SetLimit struct { + CPUThreshold float64 `json:"cpu_threshold"` + MemoryThreshold float64 `json:"memory_threshold"` + DiskThreshold float64 `json:"disk_threshold"` +} diff --git a/backend/utils/utils.go b/backend/utils/utils.go new file mode 100644 index 0000000..f435e59 --- /dev/null +++ b/backend/utils/utils.go @@ -0,0 +1,36 @@ +package utils + +import ( + "log" + + "github.com/shirou/gopsutil/cpu" + "github.com/shirou/gopsutil/disk" + "github.com/shirou/gopsutil/mem" +) + +func GetCPUUsage() float64 { + percent, err := cpu.Percent(0, false) + if err != nil { + log.Printf("Error getting CPU usage: %v", err) + return -1 + } + return percent[0] +} + +func GetMemoryUsage() float64 { + v, err := mem.VirtualMemory() + if err != nil { + log.Printf("Error getting memory usage: %v", err) + return -1 + } + return v.UsedPercent +} + +func GetDiskUsage() float64 { + d, err := disk.Usage("/") + if err != nil { + log.Printf("Error getting disk usage: %v", err) + return -1 + } + return d.UsedPercent +} diff --git a/frontend/output b/frontend/output new file mode 100755 index 0000000..4848ec5 Binary files /dev/null and b/frontend/output differ