Pulse/internal/monitoring/monitor_temperature_toggle_test.go
rcourtman e21a72578f Add configurable SSH port for temperature monitoring
Related to #595

This change adds support for custom SSH ports when collecting temperature
data from Proxmox nodes, resolving issues for users who run SSH on non-standard
ports.

**Why SSH is still needed:**
Temperature monitoring requires reading /sys/class/hwmon sensors on Proxmox
nodes, which is not exposed via the Proxmox API. Even when using API tokens
for authentication, Pulse needs SSH access to collect temperature data.

**Changes:**
- Add `sshPort` configuration to SystemSettings (system.json)
- Add `SSHPort` field to Config with environment variable support (SSH_PORT)
- Add per-node SSH port override capability for PVE, PBS, and PMG instances
- Update TemperatureCollector to accept and use custom SSH port
- Update SSH known_hosts manager to support non-standard ports
- Add NewTemperatureCollectorWithPort() constructor with port parameter
- Maintain backward compatibility with NewTemperatureCollector() (uses port 22)
- Update frontend TypeScript types for SSH port configuration

**Configuration methods:**
1. Environment variable: SSH_PORT=2222
2. system.json: {"sshPort": 2222}
3. Per-node override in nodes.enc (future UI support)

**Default behavior:**
- Defaults to port 22 if not configured
- Maintains full backward compatibility
- No changes required for existing deployments

The implementation includes proper ssh-keyscan port handling and known_hosts
management for non-standard ports using [host]:port notation per SSH standards.
2025-11-05 20:03:29 +00:00

43 lines
1.2 KiB
Go

package monitoring
import (
"path/filepath"
"testing"
"github.com/rcourtman/pulse-go-rewrite/internal/config"
)
func TestMonitorTemperatureCollectorToggle(t *testing.T) {
t.Parallel()
cfg := &config.Config{TemperatureMonitoringEnabled: false}
service := newTemperatureService(false, "root", filepath.Join(t.TempDir(), "id_ed25519_sensors"), 22)
m := &Monitor{
config: cfg,
tempService: service,
}
if provider := m.temperatureService(); provider == nil {
t.Fatalf("expected temperature service to be present")
} else if provider.Enabled() {
t.Fatalf("expected service to start disabled")
}
m.EnableTemperatureMonitoring()
if !cfg.TemperatureMonitoringEnabled {
t.Fatalf("expected config flag to be true after enabling")
}
if provider := m.temperatureService(); provider == nil || !provider.Enabled() {
t.Fatalf("expected service to be enabled after EnableTemperatureMonitoring")
}
m.DisableTemperatureMonitoring()
if cfg.TemperatureMonitoringEnabled {
t.Fatalf("expected config flag to be false after disabling")
}
if provider := m.temperatureService(); provider == nil || provider.Enabled() {
t.Fatalf("expected service to be disabled after DisableTemperatureMonitoring")
}
}