From 19285c321557f1b69b714cbb2933535c56523229 Mon Sep 17 00:00:00 2001 From: Yasen Pramatarov Date: Mon, 14 Oct 2024 18:55:48 +0300 Subject: [PATCH] Initial support for JWT tokens in agents checks --- go.mod | 1 + go.sum | 2 ++ jilo-server.conf | 3 +++ main.go | 42 ++++++++++++++++++++++++++++++++++++++---- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6979bbf..b650274 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module jilo-server go 1.23.2 require ( + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/mattn/go-sqlite3 v1.14.24 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 0437911..f2639ed 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/jilo-server.conf b/jilo-server.conf index b28a3f3..14e2791 100644 --- a/jilo-server.conf +++ b/jilo-server.conf @@ -4,14 +4,17 @@ servers: agents: agent1: endpoint: "https://meet.lindeas.com:8081/jvb" + secret: "mysecretkey" check_period: 5 agent2: endpoint: "https://meet.lindeas.com:8081/jicofo" + secret: "mysecretkey" check_period: 5 meet.example.com: agents: agent1: endpoint: "https://meet.example.com:8081/jvb" + secret: "mysecret" check_period: 10 agent2: endpoint: "https://meet.example.com:8081/jicofo" diff --git a/main.go b/main.go index fb1a8bf..c01d50b 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "os" "time" + "github.com/golang-jwt/jwt/v5" _ "github.com/mattn/go-sqlite3" "gopkg.in/yaml.v2" ) @@ -17,6 +18,7 @@ import ( // Structures type Agent struct { Endpoint string `yaml:"endpoint"` + Secret string `yaml:"secret"` CheckPeriod int `yaml:"check_period"` } type Server struct { @@ -101,11 +103,43 @@ func checkTableExists(db *sql.DB) bool { return err == nil && name == "endpoint_data" } +// JWT token generation +func generateJWT(secret string) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "iat": time.Now().Unix(), + }) + + tokenString, err := token.SignedString([]byte(secret)) + if err != nil { + return "", err + } + + return tokenString, nil +} + // Check agent endpoint -func checkEndpoint(endpoint string) (int, int64, string) { - log.Println("Sending HTTP get request to Jilo agent:", endpoint) +func checkEndpoint(agent Agent) (int, int64, string) { + log.Println("Sending HTTP get request to Jilo agent:", agent.Endpoint) + + // Generate the JWT token + token, err := generateJWT(agent.Secret) + if err != nil { + log.Println("Failed to generate JWT token:", err) + return 0, 0, "" + } + + // Create the http request + req, err := http.NewRequest("GET", agent.Endpoint, nil) + if err != nil { + log.Println("Failed to create the HTTP request:", err) + return 0, 0, "" + } + + // Set Authorization header + req.Header.Set("Authorization", "Bearer "+token) + start := time.Now() - resp, err := http.Get(endpoint) + resp, err := http.DefaultClient.Do(req) if err != nil { log.Println("Failed to check the endpoint:", err) return 0, 0, "" @@ -167,7 +201,7 @@ func main() { for { log.Printf("Checking agent [%s - %s]: %s", serverName, agentName, agent.Endpoint) - statusCode, responseTime, responseContent := checkEndpoint(agent.Endpoint) + statusCode, responseTime, responseContent := checkEndpoint(agent) log.Printf("Agent [%s - %s]: Status code: %d, Response time: %d ms", serverName, agentName, statusCode, responseTime) saveData(db, statusCode, responseTime, responseContent)