Skip to content

Commit 13fcae6

Browse files
authored
Merge pull request #14 from Hamzenium/Backend-Modular
Added Routing
2 parents f2e5332 + 1f034ad commit 13fcae6

6 files changed

Lines changed: 165 additions & 0 deletions

File tree

backend/handlers/handlers.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package handlers
2+
3+
import (
4+
"encoding/json"
5+
"log"
6+
"net/http"
7+
8+
"resource-monitor/backend/types"
9+
"resource-monitor/backend/utils"
10+
11+
"resource-monitor/backend/monitor"
12+
)
13+
14+
var ShutdownChan = make(chan struct{})
15+
16+
func ResourceUsageHandler(w http.ResponseWriter, r *http.Request) {
17+
usage := types.ResourceUsage{
18+
CPUUsage: utils.GetCPUUsage(),
19+
MemoryUsage: utils.GetMemoryUsage(),
20+
DiskUsage: utils.GetDiskUsage(),
21+
}
22+
w.Header().Set("Content-Type", "application/json")
23+
json.NewEncoder(w).Encode(usage)
24+
}
25+
26+
func ToggleAlertHandler(w http.ResponseWriter, r *http.Request) {
27+
if r.Method != http.MethodPost {
28+
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
29+
return
30+
}
31+
32+
var data struct {
33+
EnableAlerts bool `json:"enable_alerts"`
34+
}
35+
36+
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
37+
http.Error(w, "Invalid request", http.StatusBadRequest)
38+
return
39+
}
40+
41+
monitor.Mu.Lock()
42+
monitor.AlertEnabled = data.EnableAlerts
43+
monitor.Mu.Unlock()
44+
45+
log.Printf("Alerts enabled: %v", data.EnableAlerts)
46+
w.WriteHeader(http.StatusOK)
47+
}
48+
49+
func ToggleLimitHandler(w http.ResponseWriter, r *http.Request) {
50+
if r.Method != http.MethodPost {
51+
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
52+
return
53+
}
54+
55+
var data types.SetLimit
56+
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
57+
http.Error(w, "Invalid request", http.StatusBadRequest)
58+
return
59+
}
60+
61+
monitor.Mu.Lock()
62+
monitor.DefaultLimit = data
63+
monitor.Mu.Unlock()
64+
65+
log.Printf("Updated limits - CPU: %.2f, Memory: %.2f, Disk: %.2f", data.CPUThreshold, data.MemoryThreshold, data.DiskThreshold)
66+
w.Header().Set("Content-Type", "application/json")
67+
json.NewEncoder(w).Encode(data)
68+
}
69+
70+
func ShutdownHandler(w http.ResponseWriter, r *http.Request) {
71+
if r.Method == http.MethodPost {
72+
log.Println("Received shutdown request")
73+
close(ShutdownChan)
74+
w.WriteHeader(http.StatusOK)
75+
} else {
76+
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
77+
}
78+
}

backend/main.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http"
6+
7+
"resource-monitor/backend/handlers"
8+
"resource-monitor/backend/monitor"
9+
)
10+
11+
func main() {
12+
monitor.AlertEnabled = true
13+
log.Println("Default limits:", monitor.DefaultLimit)
14+
15+
http.HandleFunc("/toggle-alerts", handlers.ToggleAlertHandler)
16+
http.HandleFunc("/resource-usage", handlers.ResourceUsageHandler)
17+
http.HandleFunc("/limit-changer", handlers.ToggleLimitHandler)
18+
http.HandleFunc("/shutdown", handlers.ShutdownHandler)
19+
20+
server := &http.Server{Addr: ":8080"}
21+
22+
go monitor.MonitorResources()
23+
24+
go func() {
25+
log.Println("Starting backend server on port 8080...")
26+
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
27+
log.Fatalf("Server error: %v", err)
28+
}
29+
}()
30+
31+
<-handlers.ShutdownChan
32+
33+
log.Println("Shutting down the server...")
34+
if err := server.Close(); err != nil {
35+
log.Fatalf("Server shutdown failed: %v", err)
36+
}
37+
log.Println("Server stopped.")
38+
}

backend/output

7.55 MB
Binary file not shown.

backend/types/types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package types
2+
3+
type ResourceUsage struct {
4+
CPUUsage float64 `json:"cpu_usage"`
5+
MemoryUsage float64 `json:"memory_usage"`
6+
DiskUsage float64 `json:"disk_usage"`
7+
}
8+
9+
type SetLimit struct {
10+
CPUThreshold float64 `json:"cpu_threshold"`
11+
MemoryThreshold float64 `json:"memory_threshold"`
12+
DiskThreshold float64 `json:"disk_threshold"`
13+
}

backend/utils/utils.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package utils
2+
3+
import (
4+
"log"
5+
6+
"github.com/shirou/gopsutil/cpu"
7+
"github.com/shirou/gopsutil/disk"
8+
"github.com/shirou/gopsutil/mem"
9+
)
10+
11+
func GetCPUUsage() float64 {
12+
percent, err := cpu.Percent(0, false)
13+
if err != nil {
14+
log.Printf("Error getting CPU usage: %v", err)
15+
return -1
16+
}
17+
return percent[0]
18+
}
19+
20+
func GetMemoryUsage() float64 {
21+
v, err := mem.VirtualMemory()
22+
if err != nil {
23+
log.Printf("Error getting memory usage: %v", err)
24+
return -1
25+
}
26+
return v.UsedPercent
27+
}
28+
29+
func GetDiskUsage() float64 {
30+
d, err := disk.Usage("/")
31+
if err != nil {
32+
log.Printf("Error getting disk usage: %v", err)
33+
return -1
34+
}
35+
return d.UsedPercent
36+
}

frontend/output

28.3 MB
Binary file not shown.

0 commit comments

Comments
 (0)