Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions backend/handlers/handlers.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
38 changes: 38 additions & 0 deletions backend/main.go
Original file line number Diff line number Diff line change
@@ -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.")
}
Binary file added backend/output
Binary file not shown.
13 changes: 13 additions & 0 deletions backend/types/types.go
Original file line number Diff line number Diff line change
@@ -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"`
}
36 changes: 36 additions & 0 deletions backend/utils/utils.go
Original file line number Diff line number Diff line change
@@ -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
}
Binary file added frontend/output
Binary file not shown.
Loading