Просмотр исходного кода

fix(services): filter autocomplete to only actual services (www, telnet, ssh) and support web alias

Proxmox Router 6 дней назад
Родитель
Сommit
d9ff06b5f6
4 измененных файлов с 21 добавлено и 6 удалено
  1. BIN
      bin/proxmox-router
  2. 9 2
      internal/cli/completer.go
  3. 1 1
      internal/cli/completer_test.go
  4. 11 3
      internal/services/manager.go

BIN
bin/proxmox-router


+ 9 - 2
internal/cli/completer.go

@@ -350,7 +350,7 @@ func colorizeCandidate(s string) string {
 		"address", "route", "dhcp-client", "dhcp-server", "dns", "firewall", "service",
 		"filter", "nat", "mangle", "address-list", "bgp", "ospf", "port", "peers", "lease", "network", "cache", "static", "rule", "table", "instance", "area", "neighbor", "resource", "identity":
 		return ColorCyan + s + ColorReset
-	case "api", "api-ssl", "ftp", "ssh", "telnet", "web", "web-ssl":
+	case "www", "ssh", "telnet", "web":
 		return ColorMagenta + s + ColorReset
 	default:
 		return ColorWhite + s + ColorReset
@@ -406,7 +406,14 @@ func (c *Completer) buildCommandTree() *Node {
 
 	// Helper for services
 	dynServices := func() []string {
-		return []string{"api", "api-ssl", "ftp", "ssh", "telnet", "web", "web-ssl"}
+		if c.executor != nil && c.executor.servicesMgr != nil {
+			var names []string
+			for _, s := range c.executor.servicesMgr.ListServices() {
+				names = append(names, s.Name)
+			}
+			return names
+		}
+		return []string{"www", "telnet", "ssh"}
 	}
 
 	// Common standard actions

+ 1 - 1
internal/cli/completer_test.go

@@ -156,7 +156,7 @@ func TestCompleterSubsectionsDoubleTab(t *testing.T) {
 		},
 		{
 			input:       "/ip service enable ",
-			expectedIn:  []string{"api", "ftp", "ssh", "telnet", "web"},
+			expectedIn:  []string{"ssh", "telnet", "www"},
 			description: "/ip service enable service choices",
 		},
 		{

+ 11 - 3
internal/services/manager.go

@@ -156,11 +156,19 @@ func (m *Manager) ListServices() []Service {
 	return list
 }
 
+func normalizeServiceName(name string) string {
+	k := strings.ToLower(strings.TrimSpace(name))
+	if k == "web" {
+		return ServiceWWW
+	}
+	return k
+}
+
 func (m *Manager) GetService(name string) (Service, bool) {
 	m.mu.RLock()
 	defer m.mu.RUnlock()
 
-	s, ok := m.services[strings.ToLower(name)]
+	s, ok := m.services[normalizeServiceName(name)]
 	return s, ok
 }
 
@@ -168,7 +176,7 @@ func (m *Manager) SetServiceState(name string, disabled bool) error {
 	m.mu.Lock()
 	defer m.mu.Unlock()
 
-	key := strings.ToLower(name)
+	key := normalizeServiceName(name)
 	svc, ok := m.services[key]
 	if !ok {
 		return fmt.Errorf("service %q not found", name)
@@ -197,7 +205,7 @@ func (m *Manager) SetService(name string, port int, disabled bool) error {
 	m.mu.Lock()
 	defer m.mu.Unlock()
 
-	key := strings.ToLower(name)
+	key := normalizeServiceName(name)
 	svc, ok := m.services[key]
 	if !ok {
 		return fmt.Errorf("service %q not found", name)