Refactor CLI: birdc-style help, collapsed nouns, ReloadConfig, bug fixes
maglevc - Rewrite '?' handler (birdc-style): show full command paths from current position to every leaf, right-aligned help column, dynamic slot values displayed as an indented block when cursor is at a slot position. - Collapse show frontends/frontend, backends/backend, healthchecks/healthcheck into single plural-noun nodes with an optional <name> slot. Allows 'sh ba' (list all) and 'sh ba nginx0' (show one) without ambiguity. - Add 'config reload' command. - Fix tabwriter ANSI alignment: continuation lines in transition output now carry the same label() byte overhead as the header line. - Fix broken Walk for 'set frontend' command: setFrontendPoolName and setWeightValue were fixed-word nodes that couldn't capture user input; mark them as slot nodes with dynNone. - Add tree_test.go covering expandPaths, cycle detection, prefix matching, and the full weight-command walk. gRPC / proto - Add ReloadConfig RPC: checks config then applies it to the running checker, returning ok/parse_error/semantic_error/reload_error. - Add logging to CheckConfig (config-check-start/config-check-done at INFO level). maglevd - SIGHUP handler now calls maglevServer.TriggerReload(), sharing the same code path as the gRPC ReloadConfig RPC. docs - Collapse show command documentation to use [<name>] optional syntax. - Remove developer-facing 'Command tree and parser' section. - Document 'config reload'.
This commit is contained in:
@@ -91,6 +91,36 @@ func findSlotChild(children []*Node) *Node {
|
||||
return nil
|
||||
}
|
||||
|
||||
// helpLine is a (path, help) pair used when displaying '?' output.
|
||||
type helpLine struct {
|
||||
path string
|
||||
help string
|
||||
}
|
||||
|
||||
// expandPaths returns all (path, help) pairs for every node reachable from
|
||||
// node that has a Run function. prefix is the display string accumulated so
|
||||
// far (e.g. "show frontend"). visited prevents infinite loops through
|
||||
// self-referencing slot nodes like watchEventsOptSlot.
|
||||
func expandPaths(node *Node, prefix string, visited map[*Node]bool) []helpLine {
|
||||
if visited[node] {
|
||||
return nil
|
||||
}
|
||||
visited[node] = true
|
||||
|
||||
var lines []helpLine
|
||||
if node.Run != nil {
|
||||
lines = append(lines, helpLine{path: prefix, help: node.Help})
|
||||
}
|
||||
for _, child := range node.Children {
|
||||
childPrefix := child.Word
|
||||
if prefix != "" {
|
||||
childPrefix = prefix + " " + child.Word
|
||||
}
|
||||
lines = append(lines, expandPaths(child, childPrefix, visited)...)
|
||||
}
|
||||
return lines
|
||||
}
|
||||
|
||||
// Candidates returns the completable children at the current position given
|
||||
// the already-typed tokens and the partial token being completed.
|
||||
func Candidates(root *Node, tokens []string, partial string, ctx context.Context, client grpcapi.MaglevClient) []*Node {
|
||||
|
||||
Reference in New Issue
Block a user