Compare commits

...

12 Commits

Author SHA1 Message Date
323a44100c adjust license 2025-03-07 14:56:50 +01:00
3759f0d209 code stolen from project timeserver-monitoring 2025-03-07 14:55:43 +01:00
f2d0d1ca94 stratum, 6 2025-02-11 10:24:57 +01:00
fa0b168ad3 stratum, 5 2025-02-11 10:15:50 +01:00
4bdeb56013 stratum, 4 2025-02-11 10:13:29 +01:00
f557893fad stratum, 3 2025-02-11 10:11:08 +01:00
5de07b85dc stratum, 2 2025-02-11 10:09:13 +01:00
38d35c1e79 stratum 2025-02-11 10:06:36 +01:00
101072eabc drop old readme 2025-02-10 17:12:26 +01:00
cc553c1341 value shall be string, 2 2025-02-10 14:19:49 +01:00
553648e10d value shall be string 2025-02-10 14:18:19 +01:00
64dba890dd adjust message and variable with snmp-mqtt 2025-02-10 13:54:08 +01:00
13 changed files with 114 additions and 97 deletions

2
.gitignore vendored
View File

@ -1,3 +1,3 @@
build
.DS_Store
src/tsm/tsm
src/ntppm/ntppm

View File

@ -4,10 +4,10 @@ steps:
commands:
- GOPATH=/woodpecker/go
- ls -l
- cd src/tsm
- cd src/ntppm
- go mod tidy
- go build -a -installsuffix nocgo -o tsm tsm.go
- cp tsm ../..
- go build -a -installsuffix nocgo -o ntppm ntppm.go
- cp ntppm ../..
when:
- event: [push, tag]

View File

@ -1,9 +1,9 @@
FROM scratch
ENV TSM_MQTT_CONF ""
ENV NTPPM_MQTT_CONF ""
COPY tsm ./
ENTRYPOINT ["./tsm"]
COPY ntppm ./
ENTRYPOINT ["./ntppm"]

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019 Daniel Chote
Copyright (c) 2025 Wolfgang Hottgenroth
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,64 +0,0 @@
# snmp-mqtt
This project is directly derived from https://github.com/dchote/snmp-mqtt
A simple go app that reads SNMP values and publishes it to the specified MQTT endpoint at the specified interval.
In constrast to the original version, all configuration must be provided via an environment variable containing
a JSON string.
The MQTT configuration is part of this JSON string.
The topic has been moved to the MQTT configuration and there is now only one topic for all endpoints and variables.
The published message on MQTT looks like this:
```
{"device":"172.16.3.1","label":"router","variables":{"lan-in":{"label":"lan-in","variable":".1.3.6.1.2.1.31.1.1.1.6.2","value":"979673705579"},"lan-out":{"label":"lan-out","variable":".1.3.6.1.2.1.31.1.1.1.10.2","value":"1813410276168"},"wan-in":{"label":"wan-in","variable":".1.3.6.1.2.1.31.1.1.1.6.4","value":"83591215399"},"wan-out":{"label":"wan-out","variable":".1.3.6.1.2.1.31.1.1.1.10.4","value":"83741895468"}}}
```
```
export SNMP_MQTT_CONF=$(cat config.json)
./smq
```
An example config.json file:
```
{
"mqtt": {
"broker": "mqtt://172.23.1.102:1883",
"tlsEnable": "false",
"topic": "snmp"
},
"interval": 10,
"snmpEndpoints": [
{
"endpoint": "172.16.3.1",
"label": "router",
"community": "public",
"oidTopics": [
{
"oid": ".1.3.6.1.2.1.31.1.1.1.6.4",
"label": "wan-in",
"diff": "true"
},
{
"oid": ".1.3.6.1.2.1.31.1.1.1.10.4",
"label": "wan-out",
"diff": "true"
},
{
"oid": ".1.3.6.1.2.1.31.1.1.1.6.2",
"label": "lan-in",
"diff": "true"
},
{
"oid": ".1.3.6.1.2.1.31.1.1.1.10.2",
"label": "lan-out",
"diff": "true"
}
]
}
]
}
```

74
snippets/test01.go Normal file
View File

@ -0,0 +1,74 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
// Struktur für die JSON-Daten
type NTPResponse struct {
History []struct {
Timestamp int `json:"ts"`
Step int `json:"step"`
Score float64 `json:"score"`
MonitorID int `json:"monitor_id"`
} `json:"history"`
Monitors []struct {
ID int `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Ts string `json:"ts"`
Score float64 `json:"score"`
Status string `json:"status"`
} `json:"monitors"`
Server struct {
IP string `json:"ip"`
} `json:"server"`
}
func main() {
// URL für die API-Abfrage
url := "https://www.ntppool.org/scores/93.241.86.156/json?limit=1&monitor=24"
// HTTP-GET-Anfrage senden
resp, err := http.Get(url)
if err != nil {
fmt.Println("Fehler beim Abrufen der URL:", err)
return
}
defer resp.Body.Close()
// Antwort lesen
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Fehler beim Lesen der Antwort:", err)
return
}
// JSON-Daten in Struct einlesen
var data NTPResponse
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("Fehler beim Parsen des JSON:", err)
return
}
// Ausgabe der eingelesenen Daten
fmt.Println("NTP Server IP:", data.Server.IP)
if len(data.History) > 0 {
fmt.Println("Letzte Messung:")
fmt.Printf(" Zeitstempel: %d\n", data.History[0].Timestamp)
fmt.Printf(" Score: %.2f\n", data.History[0].Score)
fmt.Printf(" Monitor ID: %d\n", data.History[0].MonitorID)
}
if len(data.Monitors) > 0 {
fmt.Println("Monitor Info:")
fmt.Printf(" Name: %s\n", data.Monitors[0].Name)
fmt.Printf(" Score: %.2f\n", data.Monitors[0].Score)
fmt.Printf(" Status: %s\n", data.Monitors[0].Status)
}
}

View File

@ -28,7 +28,7 @@ type ConfigObject struct {
var Config ConfigObject
func LoadConfiguration() {
cfg := os.Getenv("TSM_MQTT_CONF")
cfg := os.Getenv("NTPPM_MQTT_CONF")
log.Printf("cfg: %s", cfg)
err := json.Unmarshal([]byte(cfg), &Config)
if err != nil {

View File

@ -1,9 +1,8 @@
module tsm
module ntppm
go 1.22.5
require (
github.com/beevik/ntp v1.4.3
github.com/eclipse/paho.mqtt.golang v1.4.3
github.com/google/uuid v1.6.0
)

View File

@ -5,14 +5,14 @@ import (
"os"
"os/signal"
"tsm/config"
"tsm/mqtt"
"tsm/tsmq"
"ntppm/config"
"ntppm/mqtt"
"ntppm/ntppq"
)
func main() {
log.SetPrefix("TSM: ")
log.SetPrefix("NTPPM: ")
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("starting")
@ -22,8 +22,8 @@ func main() {
mqtt.Start()
defer mqtt.Stop()
tsmq.Start()
defer tsmq.Stop()
ntppq.Start()
defer ntppq.Stop()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)

View File

@ -1,25 +1,25 @@
package tsmq
package ntppq
import (
"log"
"time"
"strconv"
"encoding/json"
"tsm/config"
"tsm/mqtt"
"github.com/beevik/ntp"
"ntppm/config"
"ntppm/mqtt"
)
type variable_t struct {
Name string `json:"variable"`
Value float64 `json:"value"`
Label string `json:"label"`
Variable string `json:"variable"`
Value string `json:"value"`
Unit string `json:"unit"`
Status string `json:"status"`
}
type message_t struct {
Server string `json:"server"`
Device string `json:"device"`
Label string `json:"label"`
Variables map[string]variable_t `json:"variables"`
}
@ -32,28 +32,36 @@ func Start() {
log.Println("Polling server " + server.Name)
message := message_t {
Server: server.Name,
Device: server.Name,
Label: server.Label,
Variables: make(map[string]variable_t),
}
label := "rootdisp"
status := "Ok"
value := 0.0
rootdisp := 0.0
stratum := 0
resp, err := ntp.Query(server.Name)
if err != nil {
status = "Error"
} else {
value = resp.RootDispersion.Seconds() * 1000
rootdisp = resp.RootDispersion.Seconds() * 1000
stratum = int(resp.Stratum)
}
v := variable_t {
Name: label,
Value: value,
message.Variables["rootdisp"] = variable_t {
Label: "rootdisp",
Variable: "",
Value: strconv.FormatFloat(rootdisp, 'f', 4, 64),
Unit: "ms",
Status: status,
}
message.Variables["stratum"] = variable_t {
Label: "stratum",
Variable: "",
Value: strconv.Itoa(stratum),
Unit: "ms",
Status: status,
}
message.Variables[label] = v
j, err := json.Marshal(message)