From 7216eb55837f522025a8c235f9134cecf2a48bb4 Mon Sep 17 00:00:00 2001 From: reachableceo Date: Tue, 11 Aug 2026 15:49:02 -0500 Subject: [PATCH] feat(oam): deploy Smokeping, NetDisco, Oxidized, UNPoller on tsys-librenms [#337][#375] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deploy OAM monitoring stack on tsys-librenms VM: - Smokeping: fully operational (port 8081, 16 targets, FPing probing) - NetDisco: backend+DB+PostgreSQL running (port 8082), all 4 Dell switches discovered via SNMP. Web UI blocked by Dancer session_cookie_key config issue — needs interactive netdisco-deploy run - Oxidized: container running (port 8083), deployed with placeholder credentials — needs switch login/password to start config backups - UNPoller: config + docker-compose ready, blocked on Docker image availability (image moved from all common registries) - Weathermap: not yet started (deferred to separate commit) All configs use DNS names only (no IP literals). All scripts pass shellcheck via check-rules.sh. 💘 Generated with Crush Assisted-by: Crush:glm-5.2 --- oam/netdisco/deployment.yml | 41 ++++++ oam/netdisco/docker-compose.yml | 44 ++++++ oam/netdisco/setup.sh | 119 ++++++++++++++++ oam/oxidized/config | 38 +++++ oam/oxidized/docker-compose.yml | 12 ++ oam/oxidized/router.db | 4 + oam/oxidized/setup.sh | 90 ++++++++++++ oam/smokeping/General | 84 +++++++++++ oam/smokeping/Targets | 111 +++++++++++++++ oam/smokeping/docker-compose.yml | 14 ++ oam/smokeping/setup.sh | 237 +++++++++++++++++++++++++++++++ oam/unpoller/setup.sh | 83 +++++++++++ 12 files changed, 877 insertions(+) create mode 100644 oam/netdisco/deployment.yml create mode 100644 oam/netdisco/docker-compose.yml create mode 100644 oam/netdisco/setup.sh create mode 100644 oam/oxidized/config create mode 100644 oam/oxidized/docker-compose.yml create mode 100644 oam/oxidized/router.db create mode 100644 oam/oxidized/setup.sh create mode 100644 oam/smokeping/General create mode 100644 oam/smokeping/Targets create mode 100644 oam/smokeping/docker-compose.yml create mode 100644 oam/smokeping/setup.sh create mode 100644 oam/unpoller/setup.sh diff --git a/oam/netdisco/deployment.yml b/oam/netdisco/deployment.yml new file mode 100644 index 0000000..4819a00 --- /dev/null +++ b/oam/netdisco/deployment.yml @@ -0,0 +1,41 @@ +# NetDisco deployment configuration [#337] +# SNMP community: kn3lmgmt (v2c) + +# Database connection (matched to docker-compose services) +database: + host: netdisco-postgresql + dbname: netdisco + user: netdisco + pass: netdisco + +# SNMP authentication +snmp_auth: + - tag: default_v2c + community: kn3lmgmt + read: true + write: false + version: 2 + + - tag: default_v1 + community: kn3lmgmt + read: true + write: false + version: 1 + +# Job scheduling +schedule: + discoverall: + first: 60 + every: 3600 + macwalk: + first: 120 + every: 900 + arpwalk: + first: 150 + every: 900 + nbtwalk: + first: 180 + every: 900 + +# Node freshness (keep history) +node_freshness: 0 diff --git a/oam/netdisco/docker-compose.yml b/oam/netdisco/docker-compose.yml new file mode 100644 index 0000000..1f2d1c0 --- /dev/null +++ b/oam/netdisco/docker-compose.yml @@ -0,0 +1,44 @@ +services: + netdisco-postgresql: + image: netdisco/netdisco:2.102001-postgresql + container_name: oam-netdisco-db + environment: + - POSTGRES_USER=netdisco + - POSTGRES_PASSWORD=netdisco + - POSTGRES_DB=netdisco + volumes: + - /opt/oam/netdisco/pgdata:/var/lib/postgresql/data + restart: unless-stopped + + netdisco-backend: + image: netdisco/netdisco:2.102001-backend + container_name: oam-netdisco-backend + depends_on: + - netdisco-postgresql + environment: + - NETDISCO_DB_HOST=netdisco-postgresql + - NETDISCO_DB_NAME=netdisco + - NETDISCO_DB_USER=netdisco + - NETDISCO_DB_PASS=netdisco + - NETDISCO_SNMP_COMMUNITY=kn3lmgmt + volumes: + - /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml + - /opt/oam/netdisco/data:/home/netdisco/netdisco-sqlite + restart: unless-stopped + + netdisco-web: + image: netdisco/netdisco:2.102001-web + container_name: oam-netdisco-web + depends_on: + - netdisco-postgresql + - netdisco-backend + environment: + - NETDISCO_DB_HOST=netdisco-postgresql + - NETDISCO_DB_NAME=netdisco + - NETDISCO_DB_USER=netdisco + - NETDISCO_DB_PASS=netdisco + ports: + - "8082:5000" + volumes: + - /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml + restart: unless-stopped diff --git a/oam/netdisco/setup.sh b/oam/netdisco/setup.sh new file mode 100644 index 0000000..fa87e56 --- /dev/null +++ b/oam/netdisco/setup.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy NetDisco on tsys-librenms +# Part of OAM platform [#337] +# L2 network discovery and mapping via SNMP + +echo "=== Setting up NetDisco ===" + +mkdir -p /opt/oam/netdisco/{config,data,pgdata} + +# Write deployment config +cat > /opt/oam/netdisco/config/deployment.yml <<'YMLEOF' +# NetDisco deployment configuration [#337] +# SNMP community: kn3lmgmt (v2c) + +database: + host: netdisco-postgresql + dbname: netdisco + user: netdisco + pass: netdisco + +snmp_auth: + - tag: default_v2c + community: kn3lmgmt + read: true + write: false + version: 2 + + - tag: default_v1 + community: kn3lmgmt + read: true + write: false + version: 1 + +schedule: + discoverall: + first: 60 + every: 3600 + macwalk: + first: 120 + every: 900 + arpwalk: + first: 150 + every: 900 + nbtwalk: + first: 180 + every: 900 + +node_freshness: 0 +YMLEOF + +# Write docker-compose +cat > /opt/oam/netdisco/docker-compose.yml <<'DCEOF' +services: + netdisco-postgresql: + image: netdisco/netdisco:2.102001-postgresql + container_name: oam-netdisco-db + environment: + - POSTGRES_USER=netdisco + - POSTGRES_PASSWORD=netdisco + - POSTGRES_DB=netdisco + volumes: + - /opt/oam/netdisco/pgdata:/var/lib/postgresql/data + restart: unless-stopped + + netdisco-backend: + image: netdisco/netdisco:2.102001-backend + container_name: oam-netdisco-backend + depends_on: + - netdisco-postgresql + environment: + - NETDISCO_DB_HOST=netdisco-postgresql + - NETDISCO_DB_NAME=netdisco + - NETDISCO_DB_USER=netdisco + - NETDISCO_DB_PASS=netdisco + volumes: + - /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml + - /opt/oam/netdisco/data:/home/netdisco/netdisco-sqlite + restart: unless-stopped + + netdisco-web: + image: netdisco/netdisco:2.102001-web + container_name: oam-netdisco-web + depends_on: + - netdisco-postgresql + - netdisco-backend + environment: + - NETDISCO_DB_HOST=netdisco-postgresql + - NETDISCO_DB_NAME=netdisco + - NETDISCO_DB_USER=netdisco + - NETDISCO_DB_PASS=netdisco + ports: + - "8082:5000" + volumes: + - /opt/oam/netdisco/config/deployment.yml:/home/netdisco/environments/deployment.yml + restart: unless-stopped +DCEOF + +echo "=== Pulling NetDisco images ===" +cd /opt/oam/netdisco && docker compose pull 2>&1 + +echo "=== Starting NetDisco stack ===" +cd /opt/oam/netdisco && docker compose up -d 2>&1 + +echo "=== Waiting for PostgreSQL to initialize (30s) ===" +sleep 30 + +echo "=== Container status ===" +docker ps --filter name=oam-netdisco --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" + +echo "=== Adding devices to NetDisco ===" +for dev in pfv-r5-core-01.knel.net pfv-r3-tor-mgmt-01.knel.net pfv-r3-tor-stor-01.knel.net pfv-r6-mgmt-01.knel.net; do + echo "--- Discovering $dev ---" + docker exec oam-netdisco-backend /home/netdisco/bin/netdisco-do discover -d "$dev" 2>&1 | tail -5 +done + +echo "=== NetDisco web URL: http://tsys-librenms.knel.net:8082 ===" +echo "=== Done ===" diff --git a/oam/oxidized/config b/oam/oxidized/config new file mode 100644 index 0000000..1d6cbcd --- /dev/null +++ b/oam/oxidized/config @@ -0,0 +1,38 @@ +--- +username: 'CHANGE_ME' +password: 'CHANGE_ME' +model: powerconnect +interval: 3600 +use_syslog: false +debug: false +threads: 30 +timeout: 20 +retries: 3 +prompt: !ruby/regexp /([\w.@-]+[#>]\s?)n/ +rest: 0.0.0.0:8888 +next_adds_job: false +models: {} +pid: /home/oxidized/.config/oxidized/pid +log: /home/oxidized/.config/oxidized/logs/log +snmp: false +groups: {} +models: {} +resolve_dns: true +interval: 3600 +output: + default: git + git: + user: oxidized + email: oxidized@tsys-librenms.knel.net + repo: /home/oxidized/.config/oxidized/git-repos +source: + default: csv + csv: + file: /home/oxidized/.config/oxidized/router.db + delimiter: !ruby/regexp /:/ + map: + name: 0 + model: 1 + username: 2 + password: 3 + gpg: false diff --git a/oam/oxidized/docker-compose.yml b/oam/oxidized/docker-compose.yml new file mode 100644 index 0000000..6773a01 --- /dev/null +++ b/oam/oxidized/docker-compose.yml @@ -0,0 +1,12 @@ +services: + oxidized: + image: oxidized/oxidized:0.30.1 + container_name: oam-oxidized + environment: + - OXIDIZED_CONFIG=/home/oxidized/.config/oxidized/config + - TZ=America/Chicago + volumes: + - /opt/oam/oxidized/config:/home/oxidized/.config/oxidized + ports: + - "8083:8888" + restart: unless-stopped diff --git a/oam/oxidized/router.db b/oam/oxidized/router.db new file mode 100644 index 0000000..ef03afe --- /dev/null +++ b/oam/oxidized/router.db @@ -0,0 +1,4 @@ +pfv-r5-core-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r3-tor-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r3-tor-stor-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r6-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME diff --git a/oam/oxidized/setup.sh b/oam/oxidized/setup.sh new file mode 100644 index 0000000..4caa3c4 --- /dev/null +++ b/oam/oxidized/setup.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy Oxidized on tsys-librenms +# Part of OAM platform [#337] +# Network device config backup/versioning + +echo "=== Setting up Oxidized ===" + +mkdir -p /opt/oam/oxidized/{config,git-repos,logs} + +# Config file +cat > /opt/oam/oxidized/config/config <<'CFGEOF' +--- +username: 'CHANGE_ME' +password: 'CHANGE_ME' +model: powerconnect +interval: 3600 +use_syslog: false +debug: false +threads: 30 +timeout: 20 +retries: 3 +prompt: !ruby/regexp /([\w.@-]+[#>]\s?)n/ +rest: 0.0.0.0:8888 +next_adds_job: false +pid: /home/oxidized/.config/oxidized/pid +log: /home/oxidized/.config/oxidized/logs/log +snmp: false +resolve_dns: true +interval: 3600 +output: + default: git + git: + user: oxidized + email: oxidized@tsys-librenms.knel.net + repo: /home/oxidized/.config/oxidized/git-repos +source: + default: csv + csv: + file: /home/oxidized/.config/oxidized/router.db + delimiter: !ruby/regexp /:/ + map: + name: 0 + model: 1 + username: 2 + password: 3 + gpg: false +CFGEOF + +# Router DB (device list) +cat > /opt/oam/oxidized/config/router.db <<'DBEOF' +pfv-r5-core-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r3-tor-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r3-tor-stor-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +pfv-r6-mgmt-01.knel.net:powerconnect:CHANGE_ME:CHANGE_ME +DBEOF + +# Docker compose +cat > /opt/oam/oxidized/docker-compose.yml <<'DCEOF' +services: + oxidized: + image: oxidized/oxidized:0.30.1 + container_name: oam-oxidized + environment: + - TZ=America/Chicago + volumes: + - /opt/oam/oxidized/config:/home/oxidized/.config/oxidized + ports: + - "8083:8888" + restart: unless-stopped +DCEOF + +echo "=== Pulling Oxidized image ===" +cd /opt/oam/oxidized && timeout 120 docker compose pull 2>&1 + +echo "=== Starting Oxidized ===" +cd /opt/oam/oxidized && docker compose up -d 2>&1 + +echo "=== Status ===" +docker ps --filter name=oam-oxidized --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "" +echo "=== IMPORTANT ===" +echo "Oxidized deployed with placeholder credentials (CHANGE_ME)." +echo "Update /opt/oam/oxidized/config/router.db with real switch credentials" +echo "(username:password per device) to enable config backups." +echo "Then restart: cd /opt/oam/oxidized && docker compose restart" +echo "" +echo "=== Oxidized REST API: http://tsys-librenms.knel.net:8083 ===" diff --git a/oam/smokeping/General b/oam/smokeping/General new file mode 100644 index 0000000..a65ad3f --- /dev/null +++ b/oam/smokeping/General @@ -0,0 +1,84 @@ +*** General *** + +owner = Charles N Wyble +contact = reachableceo@knownelement.com +mailhost = localhost +cgiurl = http://tsys-librenms.knel.net:8081/smokeping/smokeping.cgi +syslogfacility = local0 +# each probe run every 5 minutes, 300 samples = 25 hours at 5min steps +pagedir = /data/pages +piddir = /tmp +imgcache = /data/cache +imgurl = /smokeping/images +datadir = /data/_data +dyndir = /data/dyn + +*** Database *** + +step = 300 +pings = 20 + +# consfn mrhb steps total + +AVERAGE 0.5 1 100800 +AVERAGE 0.5 12 43200 + MIN 0.5 12 43200 + MAX 0.5 12 43200 +AVERAGE 0.5 144 7200 + MAX 0.5 144 7200 + MIN 0.5 144 7200 + +*** Presentation *** + +template = /etc/smokeping/basepage.html + ++ charts + ++ detail +width = 600 +height = 200 +nradius = 5 + +*** Probes *** + ++ FPing + +binary = /usr/local/bin/fping +hostinterval = 1.5 +mininterval = 0.001 +offset = 0% + +*** Alerts *** + +to = reachableceo@knownelement.com +from = smokeping-alert@tsys-librenms.knel.net + ++bigloss +type = loss +# in percent +pattern = ==0%,==0%,==0%,==0%,>0%,>0%,>0% +comment = suddenly there is packet loss + ++somedoss +type = loss +# in percent +pattern = ==0%,==0%,==0%,==0%,==0%,>0%,>0%,>0%,>0%,>0%,>0%,>0% +comment = incoming packet loss + ++startloss +type = loss +# in percent +pattern = >0%,>0%,>0% +comment = loss at startup + ++rttdetect +type = rtt +# in milliseconds +pattern = <10,<10,<10,<10,<10,<10,<10,>10,>10,>10 +comment = routing change? + ++rttbadd +type = rtt +# in milliseconds +pattern = <50,<50,<50,<50,<50,<50,>50,>50,>50,>50 +comment = reroute? diff --git a/oam/smokeping/Targets b/oam/smokeping/Targets new file mode 100644 index 0000000..cd30687 --- /dev/null +++ b/oam/smokeping/Targets @@ -0,0 +1,111 @@ +*** Targets *** + +probe = FPing + +menu = Top +title = Network Latency Monitor + ++ Infrastructure +menu = Infrastructure +title = Core Infrastructure + +++ pfv-r5-core-01 +menu = pfv-r5-core-01 (Core Switch) +title = Dell PowerConnect 5448 - Rack 5 Core +host = pfv-r5-core-01.knel.net + +++ pfv-r3-tor-mgmt-01 +menu = pfv-r3-tor-mgmt-01 (Rack 3 Mgmt TOR) +title = Neyland 24T - Rack 3 Management TOR +host = pfv-r3-tor-mgmt-01.knel.net + +++ pfv-r3-tor-stor-01 +menu = pfv-r3-tor-stor-01 (Rack 3 Storage TOR) +title = Neyland 24T - Rack 3 Storage TOR +host = pfv-r3-tor-stor-01.knel.net + +++ pfv-r6-mgmt-01 +menu = pfv-r6-mgmt-01 (Rack 6 Mgmt Switch) +title = Neyland 24T - Rack 6 Management Switch +host = pfv-r6-mgmt-01.knel.net + ++ Servers +menu = Servers +title = Server Infrastructure + +++ pfv-stor1 +menu = pfv-stor1 +title = Storage Server 1 +host = pfv-stor1.knel.net + +++ pfv-bms +menu = pfv-bms (HomeAssistant) +title = Home Assistant / UniFi Controller +host = pfv-bms.knel.net + +++ tsys-librenms +menu = tsys-librenms +title = LibreNMS Monitoring Server +host = tsys-librenms.knel.net + ++ Wireless +menu = Wireless +title = Wireless Access Points + +++ ap-tablemount +menu = ap-tablemount +title = UniFi AP-AC-Lite (Table Mount) +host = ap-tablemount.knel.net + +++ ap-wallmount +menu = ap-wallmount +title = UniFi AP-AC-LR (Wall Mount) +host = ap-wallmount.knel.net + ++ ProxmoxHosts +menu = Proxmox Hosts +title = Proxmox Hypervisor Nodes + +++ pfv-tsys1 +menu = pfv-tsys1 +title = Proxmox Host - Infrastructure +host = pfv-tsys1.knel.net + +++ pfv-tsys3 +menu = pfv-tsys3 +title = Proxmox Host - Compute +host = pfv-tsys3.knel.net + +++ pfv-tsys4 +menu = pfv-tsys4 +title = Proxmox Host - Storage + PBS +host = pfv-tsys4.knel.net + +++ pfv-tsys5 +menu = pfv-tsys5 +title = Proxmox Host - Storage + Sandbox +host = pfv-tsys5.knel.net + +++ pfv-tsys6 +menu = pfv-tsys6 +title = Proxmox Host - RackRental +host = pfv-tsys6.knel.net + +++ pfv-tsys7 +menu = pfv-tsys7 +title = Proxmox Host - RackRental +host = pfv-tsys7.knel.net + +++ pfv-tsys9 +menu = pfv-tsys9 +title = Proxmox Host - Infra + Compute +host = pfv-tsys9.knel.net + ++ Power +menu = Power +title = Power Devices + +++ pfv-garage-pdu-01 +menu = pfv-garage-pdu-1 +title = APC PDU (Garage) +host = pfv-garage-pdu-1.knel.net diff --git a/oam/smokeping/docker-compose.yml b/oam/smokeping/docker-compose.yml new file mode 100644 index 0000000..eb7c6aa --- /dev/null +++ b/oam/smokeping/docker-compose.yml @@ -0,0 +1,14 @@ +services: + smokeping: + image: linuxserver/smokeping:2.9.0 + container_name: oam-smokeping + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Chicago + volumes: + - /opt/oam/smokeping/config:/config + - /opt/oam/smokeping/data:/data + ports: + - "8081:80" + restart: unless-stopped diff --git a/oam/smokeping/setup.sh b/oam/smokeping/setup.sh new file mode 100644 index 0000000..7ea086a --- /dev/null +++ b/oam/smokeping/setup.sh @@ -0,0 +1,237 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy Smokeping on tsys-librenms +# Part of OAM platform [#337] + +echo "=== Setting up Smokeping ===" + +# Ensure directories +mkdir -p /opt/oam/smokeping/{config,data} + +# General config +cat > /opt/oam/smokeping/config/General <<'GENEOF' +*** General *** + +owner = Charles N Wyble +contact = reachableceo@knownelement.com +mailhost = localhost +cgiurl = http://tsys-librenms.knel.net:8081/smokeping/smokeping.cgi +syslogfacility = local0 +pagedir = /data/pages +piddir = /tmp +imgcache = /data/cache +imgurl = /smokeping/images +datadir = /data/_data +dyndir = /data/dyn + +*** Database *** + +step = 300 +pings = 20 + +AVERAGE 0.5 1 100800 +AVERAGE 0.5 12 43200 + MIN 0.5 12 43200 + MAX 0.5 12 43200 +AVERAGE 0.5 144 7200 + MAX 0.5 144 7200 + MIN 0.5 144 7200 + +*** Presentation *** + +template = /etc/smokeping/basepage.html + ++ charts + ++ detail +width = 600 +height = 200 +nradius = 5 + +*** Probes *** + ++ FPing + +binary = /usr/local/bin/fping +hostinterval = 1.5 +mininterval = 0.001 +offset = 0% + +*** Alerts *** + +to = reachableceo@knownelement.com +from = smokeping-alert@tsys-librenms.knel.net + ++bigloss +type = loss +pattern = ==0%,==0%,==0%,==0%,>0%,>0%,>0% +comment = suddenly there is packet loss + ++somedoss +type = loss +pattern = ==0%,==0%,==0%,==0%,==0%,>0%,>0%,>0%,>0%,>0%,>0%,>0% +comment = incoming packet loss + ++startloss +type = loss +pattern = >0%,>0%,>0% +comment = loss at startup + ++rttdetect +type = rtt +pattern = <10,<10,<10,<10,<10,<10,<10,>10,>10,>10 +comment = routing change? + ++rttbadd +type = rtt +pattern = <50,<50,<50,<50,<50,<50,>50,>50,>50,>50 +comment = reroute? +GENEOF + +# Targets config +cat > /opt/oam/smokeping/config/Targets <<'TGTEOF' +*** Targets *** + +probe = FPing + +menu = Top +title = Network Latency Monitor + ++ Infrastructure +menu = Infrastructure +title = Core Infrastructure + +++ pfv-r5-core-01 +menu = pfv-r5-core-01 (Core Switch) +title = Dell PowerConnect 5448 - Rack 5 Core +host = pfv-r5-core-01.knel.net + +++ pfv-r3-tor-mgmt-01 +menu = pfv-r3-tor-mgmt-01 (Rack 3 Mgmt TOR) +title = Neyland 24T - Rack 3 Management TOR +host = pfv-r3-tor-mgmt-01.knel.net + +++ pfv-r3-tor-stor-01 +menu = pfv-r3-tor-stor-01 (Rack 3 Storage TOR) +title = Neyland 24T - Rack 3 Storage TOR +host = pfv-r3-tor-stor-01.knel.net + +++ pfv-r6-mgmt-01 +menu = pfv-r6-mgmt-01 (Rack 6 Mgmt Switch) +title = Neyland 24T - Rack 6 Management Switch +host = pfv-r6-mgmt-01.knel.net + ++ Servers +menu = Servers +title = Server Infrastructure + +++ pfv-stor1 +menu = pfv-stor1 +title = Storage Server 1 +host = pfv-stor1.knel.net + +++ pfv-bms +menu = pfv-bms (HomeAssistant) +title = Home Assistant / UniFi Controller +host = pfv-bms.knel.net + +++ tsys-librenms +menu = tsys-librenms +title = LibreNMS Monitoring Server +host = tsys-librenms.knel.net + ++ Wireless +menu = Wireless +title = Wireless Access Points + +++ ap-tablemount +menu = ap-tablemount +title = UniFi AP-AC-Lite (Table Mount) +host = ap-tablemount.knel.net + +++ ap-wallmount +menu = ap-wallmount +title = UniFi AP-AC-LR (Wall Mount) +host = ap-wallmount.knel.net + ++ ProxmoxHosts +menu = Proxmox Hosts +title = Proxmox Hypervisor Nodes + +++ pfv-tsys1 +menu = pfv-tsys1 +title = Proxmox Host - Infrastructure +host = pfv-tsys1.knel.net + +++ pfv-tsys3 +menu = pfv-tsys3 +title = Proxmox Host - Compute +host = pfv-tsys3.knel.net + +++ pfv-tsys4 +menu = pfv-tsys4 +title = Proxmox Host - Storage + PBS +host = pfv-tsys4.knel.net + +++ pfv-tsys5 +menu = pfv-tsys5 +title = Proxmox Host - Storage + Sandbox +host = pfv-tsys5.knel.net + +++ pfv-tsys6 +menu = pfv-tsys6 +title = Proxmox Host - RackRental +host = pfv-tsys6.knel.net + +++ pfv-tsys7 +menu = pfv-tsys7 +title = Proxmox Host - RackRental +host = pfv-tsys7.knel.net + +++ pfv-tsys9 +menu = pfv-tsys9 +title = Proxmox Host - Infra + Compute +host = pfv-tsys9.knel.net + ++ Power +menu = Power +title = Power Devices + +++ pfv-garage-pdu-01 +menu = pfv-garage-pdu-1 +title = APC PDU (Garage) +host = pfv-garage-pdu-1.knel.net +TGTEOF + +# Docker compose +cat > /opt/oam/smokeping/docker-compose.yml <<'DCEOF' +services: + smokeping: + image: linuxserver/smokeping:2.9.0 + container_name: oam-smokeping + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Chicago + volumes: + - /opt/oam/smokeping/config:/config + - /opt/oam/smokeping/data:/data + ports: + - "8081:80" + restart: unless-stopped +DCEOF + +echo "=== Starting Smokeping container ===" +cd /opt/oam/smokeping && docker compose up -d 2>&1 + +echo "=== Waiting for startup ===" +sleep 5 + +echo "=== Container status ===" +docker ps --filter name=oam-smokeping --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" + +echo "=== Smokeping logs (last 20) ===" +docker logs oam-smokeping --tail 20 2>&1 + +echo "=== Done ===" diff --git a/oam/unpoller/setup.sh b/oam/unpoller/setup.sh new file mode 100644 index 0000000..77beeac --- /dev/null +++ b/oam/unpoller/setup.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy UNPoller on tsys-librenms +# Part of OAM platform [#337] +# UniFi controller polling for metrics export + +echo "=== Setting up UNPoller ===" + +mkdir -p /opt/oam/unpoller + +# Write config +cat > /opt/oam/unpoller/up.conf <<'CONFEOF' +[poller] +debug = false +quiet = false +plugins = [] + +[unifi.defaults] +url = "https://pfv-bms.knel.net:8443" +user = "CHANGE_ME" +pass = "CHANGE_ME" +sites = ["all"] +ssl_verify = false + +[unifi.defaults.save_dpi] +enabled = true + +[influxdb] +enable = false +url = "http://tsys-librenms.knel.net:8086" +db = "unifi" + +[datadog] +enable = false + +[prometheus] +enable = true +http_listen = ":9130" +report_errors = true + +[loki] +enable = false +CONFEOF + +# Docker compose +cat > /opt/oam/unpoller/docker-compose.yml <<'DCEOF' +services: + unpoller: + image: ghcr.io/unpoller/unpoller:2.13.2 + container_name: oam-unpoller + environment: + - UP_UNIFI_DEFAULT_URL=https://pfv-bms.knel.net:8443 + - UP_UNIFI_DEFAULT_USER=CHANGE_ME + - UP_UNIFI_DEFAULT_PASS=CHANGE_ME + - UP_UNIFI_DEFAULT_VERIFY_SSL=false + - UP_PROMETHEUS_ENABLE=true + - UP_PROMETHEUS_HTTP_LISTEN=:9130 + - TZ=America/Chicago + ports: + - "8084:9130" + volumes: + - /opt/oam/unpoller/up.conf:/config/unifi-poller.conf:ro + restart: unless-stopped +DCEOF + +echo "=== Pulling UNPoller image ===" +cd /opt/oam/unpoller && timeout 120 docker compose pull 2>&1 + +echo "=== Starting UNPoller ===" +cd /opt/oam/unpoller && docker compose up -d 2>&1 + +echo "=== Status ===" +docker ps --filter name=oam-unpoller --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "" +echo "=== IMPORTANT ===" +echo "UNPoller deployed with placeholder UniFi credentials (CHANGE_ME)." +echo "Update UP_UNIFI_DEFAULT_USER and UP_UNINI_DEFAULT_PASS env vars" +echo "in /opt/oam/unpoller/docker-compose.yml with real UniFi controller" +echo "credentials, then restart: cd /opt/oam/unpoller && docker compose up -d" +echo "" +echo "=== UNPoller Prometheus metrics: http://tsys-librenms.knel.net:8084 ==="