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.
43 lines
1.2 KiB
Go
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")
|
|
}
|
|
}
|