diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cea70c3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +--- + +## Unreleased + +#### Links +- upstream: https://code.lindeas.com/lindeas/jilo-agent/releases/tag/v0.1 +- codeberg: https://codeberg.org/lindeas/jilo-agent/releases/tag/v0.1 +- github: https://github.com/lindeas/jilo-agent/releases/tag/v0.1 +- gitlab: https://gitlab.com/lindeas/jilo-agent/-/releases/v0.1 + +### Added +- Initial version in PHP +- Added endpoint for /nginx, /prosody, /jicofo, /nginx +- Added a config file +- New version in folder "go", written in Go +- Added endpoint for /nginx +- Initial vesion of a build script diff --git a/README.md b/README.md index 1adf185..6dbdc4b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # jilo-agent -Jilo Agent - a remote agent for Jilo Web \ No newline at end of file +Jilo Agent - a remote agent for Jilo Web + +Initial version is in PHP. + +The current version is in "go" folder and is in Go. diff --git a/go/build.sh b/go/build.sh new file mode 100755 index 0000000..0747d1d --- /dev/null +++ b/go/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +go build -o jilo-agent main.go diff --git a/go/main.go b/go/main.go new file mode 100644 index 0000000..b1804ce --- /dev/null +++ b/go/main.go @@ -0,0 +1,77 @@ +/* +Jilo Agent + +Description: Remote agent for Jilo Web with http API +Author: Yasen Pramatarov +License: GPLv2 +Project URL: https://lindeas.com/jilo +Year: 2024 +Version: 0.1 +*/ + +package main + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "os/exec" + "strconv" + "strings" +) + +// NginxData holds the nginx data structure for the API response to /nginx +type NginxData struct { + NginxState string `json:"nginx_status"` + NginxConnections int `json:"nginx_connections"` +} + +// getNginxState checks the status of the nginx service +func getNginxState() string { + output, err := exec.Command("systemctl", "is-active", "nginx").Output() + if err != nil { + log.Printf("Error checking the nginx state: %v", err) + return "error" + } + state := strings.TrimSpace(string(output)) + if state == "active" { + return "running" + } + return "not running" +} + +// getNginxConnections gets the number of active connections to the specified web port +func getNginxConnections() int { + output, err := exec.Command("bash", "-c", "netstat -an | grep ':80' | wc -l").Output() + if err != nil { + log.Printf("Error counting the Nginx connections: %v", err) + return -1 + } + connections := strings.TrimSpace(string(output)) + connectionsInt, err := strconv.Atoi(connections) + if err != nil { + log.Printf("Error converting connections to integer number: %v", err) + return -1 + } + return connectionsInt +} + +// nginxHandler handles the /nginx endpoint +func nginxHandler(w http.ResponseWriter, r *http.Request) { + data := NginxData { + NginxState: getNginxState(), + NginxConnections: getNginxConnections(), + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) +} + +// main sets up the http server and the routes +func main() { + http.HandleFunc("/nginx", nginxHandler) + fmt.Println("Starting agent server on port 8080.") + if err := http.ListenAndServe(":8080", nil); err != nil { + log.Fatalf("Could not start the server: %v\n", err) + } +}