From 2f5aaf515d096ba33355b9fbd6228845579619a9 Mon Sep 17 00:00:00 2001 From: Harshit Vijay <93333205+Coder-Harshit@users.noreply.github.com> Date: Thu, 31 Jul 2025 00:27:08 +0530 Subject: [PATCH 1/5] gopsutil library usage --- agent/go.mod | 16 ++++++++++++++++ agent/go.sum | 32 ++++++++++++++++++++++++++++++++ agent/main.go | 16 ++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 agent/go.mod create mode 100644 agent/go.sum create mode 100644 agent/main.go diff --git a/agent/go.mod b/agent/go.mod new file mode 100644 index 0000000..95b8ce3 --- /dev/null +++ b/agent/go.mod @@ -0,0 +1,16 @@ +module agent + +go 1.24.5 + +require github.com/shirou/gopsutil/v4 v4.25.6 + +require ( + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + golang.org/x/sys v0.34.0 // indirect +) diff --git a/agent/go.sum b/agent/go.sum new file mode 100644 index 0000000..88631e4 --- /dev/null +++ b/agent/go.sum @@ -0,0 +1,32 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= +github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/agent/main.go b/agent/main.go new file mode 100644 index 0000000..b4e6b64 --- /dev/null +++ b/agent/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + + "github.com/shirou/gopsutil/v4/mem" +) + +func main() { + vmem, err := mem.VirtualMemory() + if err != nil { + fmt.Println("Error", err) + } + fmt.Printf("Total Memory = %v\n", vmem.Total) + fmt.Printf("Used Memory = %v (%.2f%%)\n", vmem.Used, vmem.UsedPercent) +} From 3673e631c3762bd2124a9866dd0fb03bdce42e51 Mon Sep 17 00:00:00 2001 From: Harshit Vijay <93333205+Coder-Harshit@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:36:44 +0530 Subject: [PATCH 2/5] Signal Struct formation --- agent/main.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/agent/main.go b/agent/main.go index b4e6b64..bb969e6 100644 --- a/agent/main.go +++ b/agent/main.go @@ -3,14 +3,84 @@ package main import ( "fmt" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/host" "github.com/shirou/gopsutil/v4/mem" + + "time" ) +type signal struct { + hostid string + hostname string + totalMem uint64 + usedMem uint64 + usedMemPercentage float64 + cpuPercentage float64 + timestamp time.Time +} + func main() { - vmem, err := mem.VirtualMemory() + hid, err := host.HostID() + errorCheck(err) + info, err := host.Info() + errorCheck(err) + for { + // infinite loop + + vmem, err := mem.VirtualMemory() + errorCheck(err) + + timestamp := time.Now() + + cpupr, err := cpu.Percent(time.Second, false) + errorCheck(err) + + signal := signal{ + hostid: hid, + hostname: info.Hostname, + totalMem: vmem.Total, + usedMem: vmem.Used, + usedMemPercentage: vmem.UsedPercent, + cpuPercentage: cpupr[0], + timestamp: timestamp, + } + displaySignal(signal) + + time.Sleep(1 * time.Second) // 1s sleep (at least) + } +} + +// func displaySignal(sig signal) { +// stype := reflect.TypeOf(sig) +// sval := reflect.ValueOf(sig) +// fmt.Println("Signal {") +// for i := 0; i < sval.NumField(); i++ { +// if stype.Field(i).Name == "timestamp" { +// fmt.Println("\t", "timestamp", ": ", sig.timestamp) +// } else { +// fmt.Println("\t", stype.Field(i).Name, ": ", sval.Field(i)) +// } +// } +// fmt.Println("}") +// fmt.Println() +// } + +func displaySignal(sig signal) { + fmt.Println("Signal {") + fmt.Printf("\tHostID:\t\t%v\n", sig.hostid) + fmt.Printf("\tHostName:\t%v\n", sig.hostname) + fmt.Printf("\tMemory Total:\t%v\n", sig.totalMem) + fmt.Printf("\tMemory Used:\t%v\n", sig.usedMem) + fmt.Printf("\tMemory Used:\t%.2f%%\n", sig.usedMemPercentage) + fmt.Printf("\tCPU Used:\t%.2f%%\n", sig.cpuPercentage) + fmt.Printf("\tTimestamp:\t%v\n", sig.timestamp) + fmt.Println("}") + fmt.Println() +} + +func errorCheck(err error) { if err != nil { fmt.Println("Error", err) } - fmt.Printf("Total Memory = %v\n", vmem.Total) - fmt.Printf("Used Memory = %v (%.2f%%)\n", vmem.Used, vmem.UsedPercent) } From c2c42b238cf419c6a8660a4abf920e18b36da0f1 Mon Sep 17 00:00:00 2001 From: Harshit Vijay <93333205+Coder-Harshit@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:26:09 +0530 Subject: [PATCH 3/5] json s&r agent signal --- agent/main.go | 91 +++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/agent/main.go b/agent/main.go index bb969e6..dcd2476 100644 --- a/agent/main.go +++ b/agent/main.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "github.com/shirou/gopsutil/v4/cpu" @@ -8,79 +10,84 @@ import ( "github.com/shirou/gopsutil/v4/mem" "time" + + "net/http" ) type signal struct { - hostid string - hostname string - totalMem uint64 - usedMem uint64 - usedMemPercentage float64 - cpuPercentage float64 - timestamp time.Time + HostID string `json:"host_id"` + Hostname string `json:"host_name"` + TotalMem uint64 `json:"total_memory"` + UsedMem uint64 `json:"used_memory"` + UsedMemPercentage float64 `json:"used_memory_percentage"` + CPUPercentage float64 `json:"cpu_used_percentage"` + Timestamp time.Time `json:"timestamp"` } func main() { + url := "http://localhost:8080/report" + hid, err := host.HostID() - errorCheck(err) + errorCheck(err, "[HostID] Object creation Issue!") info, err := host.Info() - errorCheck(err) + errorCheck(err, "[HostInfo] Object creation Issue!") for { // infinite loop vmem, err := mem.VirtualMemory() - errorCheck(err) + errorCheck(err, "[MemoryObject] Object creation Issue!") timestamp := time.Now() cpupr, err := cpu.Percent(time.Second, false) - errorCheck(err) + errorCheck(err, "[CPUPercentage] Object creation Issue!") signal := signal{ - hostid: hid, - hostname: info.Hostname, - totalMem: vmem.Total, - usedMem: vmem.Used, - usedMemPercentage: vmem.UsedPercent, - cpuPercentage: cpupr[0], - timestamp: timestamp, + HostID: hid, + Hostname: info.Hostname, + TotalMem: vmem.Total, + UsedMem: vmem.Used, + UsedMemPercentage: vmem.UsedPercent, + CPUPercentage: cpupr[0], + Timestamp: timestamp, } - displaySignal(signal) + jsonSignal, err := json.Marshal(signal) + errorCheck(err, "[JSON-Encoding] Issue") + + // displaySignal(jsonSignal) + + resp, err := http.Post(url, "application/json", bytes.NewReader(jsonSignal)) + errorCheck(err, "[POST] signal issue") + resp.Body.Close() + // fmt.Println(resp.StatusCode) time.Sleep(1 * time.Second) // 1s sleep (at least) } } // func displaySignal(sig signal) { -// stype := reflect.TypeOf(sig) -// sval := reflect.ValueOf(sig) // fmt.Println("Signal {") -// for i := 0; i < sval.NumField(); i++ { -// if stype.Field(i).Name == "timestamp" { -// fmt.Println("\t", "timestamp", ": ", sig.timestamp) -// } else { -// fmt.Println("\t", stype.Field(i).Name, ": ", sval.Field(i)) -// } -// } +// fmt.Printf("\tHostID:\t\t%v\n", sig.HostID) +// fmt.Printf("\tHostName:\t%v\n", sig.Hostname) +// fmt.Printf("\tMemory Total:\t%v\n", sig.TotalMem) +// fmt.Printf("\tMemory Used:\t%v\n", sig.UsedMem) +// fmt.Printf("\tMemory Used:\t%.2f%%\n", sig.UsedMemPercentage) +// fmt.Printf("\tCPU Used:\t%.2f%%\n", sig.CPUPercentage) +// fmt.Printf("\tTimestamp:\t%v\n", sig.Timestamp) // fmt.Println("}") // fmt.Println() // } -func displaySignal(sig signal) { - fmt.Println("Signal {") - fmt.Printf("\tHostID:\t\t%v\n", sig.hostid) - fmt.Printf("\tHostName:\t%v\n", sig.hostname) - fmt.Printf("\tMemory Total:\t%v\n", sig.totalMem) - fmt.Printf("\tMemory Used:\t%v\n", sig.usedMem) - fmt.Printf("\tMemory Used:\t%.2f%%\n", sig.usedMemPercentage) - fmt.Printf("\tCPU Used:\t%.2f%%\n", sig.cpuPercentage) - fmt.Printf("\tTimestamp:\t%v\n", sig.timestamp) - fmt.Println("}") - fmt.Println() -} +// func displaySignal(jsonSig []byte) { +// fmt.Println("Signal =>") +// fmt.Println(string(jsonSig)) +// fmt.Println() +// } -func errorCheck(err error) { +func errorCheck(err error, msg string) { if err != nil { - fmt.Println("Error", err) + fmt.Println(msg) + fmt.Println(err) + // time.Sleep(5 * time.Second) } } From 8ab908d47e83a1abd761402456cb1701bae84a73 Mon Sep 17 00:00:00 2001 From: Harshit Vijay <93333205+Coder-Harshit@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:27:14 +0530 Subject: [PATCH 4/5] Basic Server Establish --- master/go.mod | 3 +++ master/main.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 master/go.mod create mode 100644 master/main.go diff --git a/master/go.mod b/master/go.mod new file mode 100644 index 0000000..0efaf63 --- /dev/null +++ b/master/go.mod @@ -0,0 +1,3 @@ +module master + +go 1.24.5 diff --git a/master/main.go b/master/main.go new file mode 100644 index 0000000..7b09d17 --- /dev/null +++ b/master/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "time" +) + +type signal struct { + HostID string `json:"host_id"` + Hostname string `json:"host_name"` + TotalMem uint64 `json:"total_memory"` + UsedMem uint64 `json:"used_memory"` + UsedMemPercentage float64 `json:"used_memory_percentage"` + CPUPercentage float64 `json:"cpu_used_percentage"` + Timestamp time.Time `json:"timestamp"` +} + +func main() { + fmt.Println("Server Listing on Port :8080") + http.HandleFunc("/report", displayReport) + log.Fatal(http.ListenAndServe("localhost:8080", nil)) +} + +func displayReport(respw http.ResponseWriter, req *http.Request) { + if req.Method == "POST" { + // fmt.Println("Got Signal!") + var sig signal + json.NewDecoder(req.Body).Decode(&sig) + fmt.Println(sig) + respw.WriteHeader(http.StatusOK) + } +} From d309e9d1506a28c254a2e99b0035f71ce698b32b Mon Sep 17 00:00:00 2001 From: Harshit Vijay <93333205+Coder-Harshit@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:46:05 +0530 Subject: [PATCH 5/5] minor master fixes --- master/main.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/master/main.go b/master/main.go index 7b09d17..eae757c 100644 --- a/master/main.go +++ b/master/main.go @@ -21,15 +21,19 @@ type signal struct { func main() { fmt.Println("Server Listing on Port :8080") http.HandleFunc("/report", displayReport) - log.Fatal(http.ListenAndServe("localhost:8080", nil)) + log.Fatal(http.ListenAndServe(":8080", nil)) } func displayReport(respw http.ResponseWriter, req *http.Request) { if req.Method == "POST" { // fmt.Println("Got Signal!") var sig signal - json.NewDecoder(req.Body).Decode(&sig) - fmt.Println(sig) + if err := json.NewDecoder(req.Body).Decode(&sig); err != nil { + http.Error(respw, "Invalid JSON", http.StatusBadRequest) + return + } + fmt.Printf("[RECEIVED] Host: %s | CPU: %.2f%% | RAM: %.2f%% | Time: %v\n", + sig.Hostname, sig.CPUPercentage, sig.UsedMemPercentage, sig.Timestamp) respw.WriteHeader(http.StatusOK) } }