No description
Find a file
Graham McIntire 95e3870fec
feat: add Force10 FTOS and optical transceiver monitoring (ProCurve, Comware)
Completed Tier 1 (critical network switches) and Tier 2 (optical transceiver monitoring)
from Phase 3 implementation plan. All major network switches now have comprehensive sensor
coverage including temperature and fiber optic link diagnostics.

Files Changed:
- priv/profiles/os_discovery/ftos.yaml (enhanced)
  Added Dell Force10 FTOS temperature monitoring for all 3 series:
  - S-Series: Stack unit temperature (chStackUnitTemp)
    OID: .1.3.6.1.4.1.6027.3.10.1.2.2.1.14
    MIB: F10-S-SERIES-CHASSIS-MIB
  - C-Series: Card temperature (chSysCardTemp)
    OID: .1.3.6.1.4.1.6027.3.8.1.2.1.1.5
    MIB: F10-C-SERIES-CHASSIS-MIB
  - E-Series: Card upper + lower temperature (chSysCardUpperTemp, chSysCardLowerTemp)
    OIDs: .1.3.6.1.4.1.6027.3.1.1.2.3.1.8-9
    MIB: F10-CHASSIS-MIB
  Gap: CRITICAL (no sensors) → RESOLVED
  Parity: 0% → 90%

- priv/profiles/os_discovery/procurve.yaml (enhanced)
  Added HP ProCurve transceiver optical monitoring (5 sensor types):
  MIB: HP-ICF-TRANSCEIVER-MIB::hpicfXcvrInfoTable
  Sensors:
    - Temperature: hpicfXcvrTemp (OID .1.3.6.1.4.1.11.2.14.11.5.1.82.1.1.1.1.11, divisor 1000)
    - Bias Current: hpicfXcvrBias (OID .1.3.6.1.4.1.11.2.14.11.5.1.82.1.1.1.1.13, divisor 1000)
    - Supply Voltage: hpicfXcvrVoltage (OID .1.3.6.1.4.1.11.2.14.11.5.1.82.1.1.1.1.12, divisor 1000)
    - RX Power (dBm): hpicfXcvrRxPower (OID .1.3.6.1.4.1.11.2.14.11.5.1.82.1.1.1.1.14, divisor 10)
    - TX Power (dBm): hpicfXcvrTxPower (OID .1.3.6.1.4.1.11.2.14.11.5.1.82.1.1.1.1.15, divisor 10)
  Gap: HIGH (missing transceivers) → RESOLVED
  Parity: 60% → 100%

- priv/profiles/os_discovery/comware.yaml (enhanced)
  Added HP Comware transceiver optical monitoring (5 sensor types):
  MIB: HH3C-TRANSCEIVER-INFO-MIB::hh3cTransceiverInfoTable
  Sensors:
    - Temperature: hh3cTransceiverTemperature (OID .1.3.6.1.4.1.25506.2.70.1.1.1.15)
    - Bias Current: hh3cTransceiverBiasCurrent (OID .1.3.6.1.4.1.25506.2.70.1.1.1.17)
    - Supply Voltage: hh3cTransceiverVoltage (OID .1.3.6.1.4.1.25506.2.70.1.1.1.16)
    - RX Power (dBm): hh3cTransceiverCurRXPower (OID .1.3.6.1.4.1.25506.2.70.1.1.1.9, divisor 100)
    - TX Power (dBm): hh3cTransceiverCurTXPower (OID .1.3.6.1.4.1.25506.2.70.1.1.1.12, divisor 100)
  Gap: HIGH (missing transceivers) → RESOLVED
  Parity: 60% → 95%

- test/towerops_web/controllers/api/mobile_controller_test.exs (fixed)
  Fixed Credo warning: replaced length/1 with empty list comparison

- CHANGELOG.txt (updated)
  Documented Tier 1 + Tier 2 completion

Impact:
- Force10 FTOS: Complete temperature monitoring for S/C/E-Series data center switches
- ProCurve: Full optical transceiver diagnostics (SFP/SFP+ monitoring)
- Comware: Full optical transceiver diagnostics (completes sensor coverage)

Business Value:
- All major network switch platforms now have fundamental temperature monitoring
- Fiber optic link health monitoring enabled for ProCurve and Comware
- Data center switches (Force10 FTOS) fully supported
- Enables proactive maintenance (detect failing transceivers before link failure)

Parity Achievement:
- Tier 1 Complete: HP Comware (60→95%), Dell PowerConnect (0→80%), Dell SONiC (0→95%),
  Dell Force10 FTOS (0→90%)
- Tier 2 Complete: HP ProCurve (60→100%), HP Comware (95% - transceivers added)

Next Steps: Tier 3 (storage/compute platforms: PowerVault, Dell Servers, hpblmos)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 08:19:12 -06:00
.claude fix: complete Nix Docker image build and untrack .claude/settings.local.json 2026-02-07 14:14:26 -06:00
.forgejo change runner for forgejo 2026-02-03 14:06:24 -06:00
.gitlab/agents Add aprs.me project to home-cluster-agent configuration 2026-01-14 13:31:23 -06:00
assets color network map nodes by device status 2026-02-11 15:41:50 -06:00
c_src fix: correct library linking order in Makefile 2026-01-30 13:24:25 -06:00
config Add 404-based brute force protection system 2026-02-10 16:31:48 -06:00
docs audit: Phase 3 - HP/Aruba and Dell sensor analysis complete 2026-02-11 17:34:06 -06:00
k8s back up to 2 replicas 2026-02-11 16:04:47 -06:00
lib feat: implement Arista EOS sensor enhancements (DOM power, thresholds, grouping) 2026-02-11 17:23:33 -06:00
mibs handle mib uploading 2026-01-18 16:29:24 -06:00
nix fix: complete Nix Docker image build and untrack .claude/settings.local.json 2026-02-07 14:14:26 -06:00
priv feat: add Force10 FTOS and optical transceiver monitoring (ProCurve, Comware) 2026-02-12 08:19:12 -06:00
rel/overlays/bin add release 2026-01-02 14:36:38 -06:00
scripts complete overhaul of snmp engine 2026-01-30 10:41:07 -06:00
test feat: add Force10 FTOS and optical transceiver monitoring (ProCurve, Comware) 2026-02-12 08:19:12 -06:00
towerops Add towerops/gitlab-agent-helm-release.yaml via glab file sync 2026-01-02 14:22:22 -06:00
vendor update oban_web 2026-02-08 10:11:53 -06:00
.credo.exs no cluster unless in k8s, fix credo issues 2026-02-09 13:08:51 -06:00
.dialyzer_ignore.exs Mikrotik backup and gettext start 2026-02-02 09:11:22 -06:00
.dockerignore nif ci fix complie in ci 2026-01-30 12:47:18 -06:00
.envrc.example feat: Add comprehensive Nix flakes integration 2026-02-07 12:26:54 -06:00
.formatter.exs format 2025-12-21 11:31:08 -06:00
.gitignore fix: complete Nix Docker image build and untrack .claude/settings.local.json 2026-02-07 14:14:26 -06:00
.gitlab-ci.yml restore normal gitlab ci 2026-02-08 10:56:06 -06:00
.gitlab-ci.yml.nix feat: Add comprehensive Nix flakes integration 2026-02-07 12:26:54 -06:00
.pre-commit-config.yaml update 2026-02-07 12:40:40 -06:00
.sobelow-skips Add firmware version tracking system 2026-02-01 10:46:27 -06:00
.sourceignore Add .sourceignore to exclude non-k8s files from Flux 2026-01-02 14:43:57 -06:00
.test-watch.exs add test watch 2026-01-03 12:35:26 -06:00
.tool-versions test cleanup 2026-01-19 13:29:38 -06:00
AGENTS.md 1. User Authentication 2025-12-21 13:31:59 -06:00
CHANGELOG.txt feat: add Force10 FTOS and optical transceiver monitoring (ProCurve, Comware) 2026-02-12 08:19:12 -06:00
CLAUDE.md polling fix 2026-02-11 13:54:23 -06:00
Dockerfile fix: compile C NIF explicitly in Docker build 2026-01-30 13:04:06 -06:00
flake.lock fix: Make Nix flake compatible with macOS 2026-02-07 12:30:48 -06:00
flake.nix fix: complete Nix Docker image build and untrack .claude/settings.local.json 2026-02-07 14:14:26 -06:00
GETTEXT_MIGRATION_NOTES.md docs: mark gettext migration as complete 2026-02-02 13:24:27 -06:00
IMPLEMENTATION_SUMMARY.md Add 404-based brute force protection system 2026-02-10 16:31:48 -06:00
Makefile complete overhaul of snmp engine 2026-01-30 10:41:07 -06:00
mix.exs Add 404-based brute force protection system 2026-02-10 16:31:48 -06:00
mix.lock Add 404-based brute force protection system 2026-02-10 16:31:48 -06:00
NIX-IMPLEMENTATION-SUMMARY.md feat: Add comprehensive Nix flakes integration 2026-02-07 12:26:54 -06:00
package-lock.json fix: resolve critical data loss and protobuf schema bugs (Phase 1) 2026-02-09 09:16:03 -06:00
package.json fix: resolve critical data loss and protobuf schema bugs (Phase 1) 2026-02-09 09:16:03 -06:00
README.md encryption updates 2026-02-01 17:05:55 -06:00
REFACTOR.md refactor 2026-01-31 09:35:07 -06:00
SECURITY.md security: add session inactivity timeout and comprehensive security documentation 2026-02-08 10:47:44 -06:00
SENSOR_PIPELINE_FIXES.md fix: resolve critical sensor discovery pipeline data loss 2026-02-09 08:32:24 -06:00
shell.nix feat: Add comprehensive Nix flakes integration 2026-02-07 12:26:54 -06:00
tail_logs.sh add logs helper script 2026-01-11 15:45:02 -06:00

TowerOps

Network monitoring and alerting platform built with Phoenix LiveView.

Features

  • Multi-tenant architecture - Organizations with role-based permissions
  • Site hierarchy - Organize equipment across multiple sites
  • Automated monitoring - Real-time ping monitoring with configurable intervals
  • Time-series data - Efficient storage with TimescaleDB (optional)
  • Real-time updates - LiveView dashboard with PubSub
  • Equipment tracking - Monitor network devices by IP address

Quick Start

Prerequisites

  • Elixir 1.14+
  • PostgreSQL 14+
  • (Optional) TimescaleDB for production-grade time-series performance

Setup

# Install dependencies
mix setup

# Start the server
mix phx.server

Visit localhost:4000 from your browser.

TimescaleDB (Production Only)

Development: Uses standard PostgreSQL (no TimescaleDB required).

Production: TimescaleDB is automatically enabled for optimal performance with time-series data.

# Production deployment - install TimescaleDB first
brew tap timescale/tap && brew install timescaledb  # macOS
# Then run migrations with MIX_ENV=prod
MIX_ENV=prod mix ecto.migrate

See TIMESCALEDB.md for detailed installation and configuration.

How it works: Migrations detect the environment (MIX_ENV) and only enable TimescaleDB features (hypertables, compression, retention policies, continuous aggregates) in production.

Encryption Setup (Production)

TowerOps uses AES-256-GCM encryption for sensitive data (SNMP communities, MikroTik API passwords, etc.).

Development/Test

Encryption keys are pre-configured in config/dev.exs and config/test.exs. No action required.

Production

Set the CLOAK_KEY environment variable with a base64-encoded 32-byte key:

# Generate encryption key
openssl rand -base64 32

Important:

  • Store the generated key securely in 1Password or your secrets manager
  • Never commit the production key to version control
  • Losing the encryption key makes encrypted data unrecoverable

Kubernetes Deployment

If secret doesn't exist yet (new deployment):

# Generate CLOAK_KEY (store in 1Password first!)
CLOAK_KEY=$(openssl rand -base64 32)

# Create towerops-secrets with all required keys
kubectl create secret generic towerops-secrets \
  --from-literal=RELEASE_COOKIE=$(openssl rand -base64 32) \
  --from-literal=SECRET_KEY_BASE=$(mix phx.gen.secret) \
  --from-literal=CLOAK_KEY="$CLOAK_KEY" \
  -n towerops

If secret already exists (add CLOAK_KEY to existing secret):

# Store new key in 1Password first!
# Bash/Zsh:
CLOAK_KEY=$(openssl rand -base64 32)

# Fish shell:
set CLOAK_KEY (openssl rand -base64 32)

# Method 1: Using kubectl create with dry-run and apply
kubectl create secret generic towerops-secrets \
  --from-literal=CLOAK_KEY="$CLOAK_KEY" \
  --dry-run=client -o yaml | \
  kubectl apply -f - -n towerops

# Method 2: Direct inline generation (works in all shells)
kubectl create secret generic towerops-secrets \
  --from-literal=CLOAK_KEY="$(openssl rand -base64 32)" \
  --dry-run=client -o yaml | \
  kubectl apply -f - -n towerops

# Restart pods to pick up new key
kubectl rollout restart deployment/towerops -n towerops

Development

Database

mix ecto.create       # Create database
mix ecto.migrate      # Run migrations
mix ecto.reset        # Drop, create, and migrate

Testing

mix test              # Run all tests
mix test --trace      # Run with detailed output

Code Quality

mix format            # Format code with Styler
mix compile --warnings-as-errors

Firmware Version Tracking

The system automatically checks for latest firmware versions daily (2 AM dev, 4 AM prod). To manually trigger a firmware check:

# Start IEx console
iex -S mix phx.server

# Manually trigger firmware version fetch
Oban.insert(Towerops.Workers.FirmwareVersionFetcherWorker.new(%{}))

The worker will:

  1. Fetch the latest MikroTik RouterOS version from RSS feed
  2. Store version information in the database
  3. Enable firmware update indicators on device detail pages

Check the logs for fetch results:

# View recent Oban jobs
Towerops.Repo.all(Oban.Job) |> Enum.take(5)

Learn more