From 2aa0c3be8654700c159cd0984339d9723fcc9933 Mon Sep 17 00:00:00 2001 From: Gilles Soulier Date: Fri, 22 May 2026 12:03:47 +0200 Subject: [PATCH] =?UTF-8?q?feat(server):=20go.mod=20+=20config=20+=20mod?= =?UTF-8?q?=C3=A8les=20de=20donn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initialise le module Go github.com/user/nanometrics/server avec toutes les dépendances (SQLite, gorilla/websocket, paho.mqtt, prometheus, imaging). Ajoute config.go (Load/Default via env vars) et models.go (AgentMetrics, SmartMetrics, Agent, AgentConfig, ServerConfig, WSMessage). Co-Authored-By: Claude Sonnet 4.6 --- server/config/config.go | 38 +++++++++++++++ server/go.mod | 31 ++++++++++++ server/go.sum | 53 ++++++++++++++++++++ server/main.go | 12 +++++ server/models/models.go | 105 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 239 insertions(+) create mode 100644 server/config/config.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/main.go create mode 100644 server/models/models.go diff --git a/server/config/config.go b/server/config/config.go new file mode 100644 index 0000000..5d359e3 --- /dev/null +++ b/server/config/config.go @@ -0,0 +1,38 @@ +package config + +import "os" + +type Config struct { + UDPAddr string + DBPath string + HTTPAddr string + MQTTBroker string + MQTTTopicBase string +} + +func Load() Config { + return Config{ + UDPAddr: getEnv("UDP_ADDR", "0.0.0.0:9999"), + DBPath: getEnv("DB_PATH", "/data/nanometrics.db"), + HTTPAddr: getEnv("HTTP_ADDR", "0.0.0.0:8080"), + MQTTBroker: getEnv("MQTT_BROKER", "tcp://10.0.0.3:1883"), + MQTTTopicBase: getEnv("MQTT_TOPIC_BASE", "nanometrics/agents"), + } +} + +func getEnv(key, fallback string) string { + if v := os.Getenv(key); v != "" { + return v + } + return fallback +} + +func Default() Config { + return Config{ + UDPAddr: "127.0.0.1:19999", + DBPath: ":memory:", + HTTPAddr: "127.0.0.1:18080", + MQTTBroker: "tcp://127.0.0.1:11883", + MQTTTopicBase: "test/nanometrics", + } +} diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..9a15e97 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,31 @@ +module github.com/user/nanometrics/server + +go 1.25.0 + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/disintegration/imaging v1.6.2 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eclipse/paho.mqtt.golang v1.5.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect + golang.org/x/net v0.44.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect + modernc.org/libc v1.72.3 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect + modernc.org/sqlite v1.50.1 // indirect +) diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..7db1ca7 --- /dev/null +++ b/server/go.sum @@ -0,0 +1,53 @@ +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE= +github.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +modernc.org/libc v1.72.3 h1:ZnDF4tXn4NBXFutMMQC4vtbTFSXhhKzR73fv0beZEAU= +modernc.org/libc v1.72.3/go.mod h1:dn0dZNnnn1clLyvRxLxYExxiKRZIRENOfqQ8XEeg4Qs= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/sqlite v1.50.1 h1:l+cQvn0sd0zJJtfygGHuQJ5AjlrwXmWPw4KP3ZMwr9w= +modernc.org/sqlite v1.50.1/go.mod h1:tcNzv5p84E0skkmJn038y+hWJbLQXQqEnQfeh5r2JLM= diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..9a3f807 --- /dev/null +++ b/server/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "log" + + "github.com/user/nanometrics/server/config" +) + +func main() { + cfg := config.Load() + log.Printf("nanometrics-server démarrage sur %s", cfg.HTTPAddr) +} diff --git a/server/models/models.go b/server/models/models.go new file mode 100644 index 0000000..13e67e5 --- /dev/null +++ b/server/models/models.go @@ -0,0 +1,105 @@ +package models + +type AgentMetrics struct { + Hostname string `json:"hostname"` + IP string `json:"ip"` + Status string `json:"status"` + CPUPercent *float64 `json:"cpu_percent"` + MemoryUsed *int64 `json:"memory_used"` + MemoryFree *int64 `json:"memory_free"` + MemoryTotal *int64 `json:"memory_total"` + HDDUsed *int64 `json:"hdd_used"` + HDDFree *int64 `json:"hdd_free"` + HDDTotal *int64 `json:"hdd_total"` + Uptime *int64 `json:"uptime"` + NetworkRX *int64 `json:"network_rx"` + NetworkTX *int64 `json:"network_tx"` + Temperature *float64 `json:"temperature"` + Smart *SmartMetrics `json:"smart"` +} + +type SmartMetrics struct { + Passed bool `json:"passed"` + Temperature *int64 `json:"temperature"` + ReallocatedSectors *int64 `json:"reallocated_sectors"` + PowerOnHours *int64 `json:"power_on_hours"` + WearLevel *int64 `json:"wear_level"` +} + +type Agent struct { + ID string `json:"id"` + Hostname string `json:"hostname"` + IP string `json:"ip"` + Status string `json:"status"` + LastSeen int64 `json:"last_seen"` + LastMetrics *AgentMetrics `json:"last_metrics,omitempty"` +} + +type AgentConfig struct { + Metrics MetricsConfig `json:"metrics"` + Protocols ProtocolsConfig `json:"protocols"` +} + +type ProtocolsConfig struct { + UDP UDPConfig `json:"udp"` + MQTT MQTTConfig `json:"mqtt"` +} + +type UDPConfig struct { + Enabled bool `json:"enabled"` +} + +type MQTTConfig struct { + Enabled bool `json:"enabled"` + Host string `json:"host"` + Port int `json:"port"` + TopicBase string `json:"topic_base"` + AutoDiscovery bool `json:"auto_discovery"` + BirthMessage bool `json:"birth_message"` + LastWill bool `json:"last_will"` +} + +type MetricsConfig struct { + CPU MetricProto `json:"cpu"` + Memory MetricProto `json:"memory"` + Disk MetricProto `json:"disk"` + Network MetricProto `json:"network"` + Uptime MetricProto `json:"uptime"` + Temperature MetricProto `json:"temperature"` + Smart MetricProto `json:"smart"` +} + +type MetricProto struct { + UDP bool `json:"udp"` + MQTT bool `json:"mqtt"` +} + +type ServerConfig struct { + TileMinWidth int `json:"tile_min_width"` + FontSize int `json:"font_size"` + WarnCPU int `json:"warn_cpu"` + ErrCPU int `json:"err_cpu"` + WarnDisk int `json:"warn_disk"` + RetentionDays int `json:"retention_days"` + ChartDurationMin int `json:"chart_duration_min"` + HideOffline bool `json:"hide_offline"` + Notifications bool `json:"notifications"` + PopupDetailW int `json:"popup_detail_w"` + PopupDetailH int `json:"popup_detail_h"` +} + +func DefaultServerConfig() ServerConfig { + return ServerConfig{ + TileMinWidth: 220, FontSize: 13, + WarnCPU: 70, ErrCPU: 85, WarnDisk: 75, + RetentionDays: 30, ChartDurationMin: 30, + HideOffline: false, Notifications: true, + PopupDetailW: 560, PopupDetailH: 600, + } +} + +type WSMessage struct { + Type string `json:"type"` + AgentID string `json:"agent_id"` + Data interface{} `json:"data"` +}