Fix pvecm status parsing for QDevice flags (#738)
This commit is contained in:
parent
d5fdf2f471
commit
b2c4a583f7
4 changed files with 98 additions and 13 deletions
|
|
@ -732,12 +732,13 @@ func discoverClusterNodes() ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse output to extract IP addresses
|
// Parse output to extract IP addresses
|
||||||
// Format example:
|
return parseClusterNodes(out.String())
|
||||||
// 0x00000001 1 192.168.0.134
|
}
|
||||||
// 0x00000003 1 192.168.0.5 (local)
|
|
||||||
|
|
||||||
|
// parseClusterNodes parses pvecm status output to extract IP addresses
|
||||||
|
func parseClusterNodes(output string) ([]string, error) {
|
||||||
var nodes []string
|
var nodes []string
|
||||||
lines := strings.Split(out.String(), "\n")
|
lines := strings.Split(output, "\n")
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
// Look for lines with hex ID and IP address
|
// Look for lines with hex ID and IP address
|
||||||
if !strings.Contains(line, "0x") {
|
if !strings.Contains(line, "0x") {
|
||||||
|
|
@ -750,11 +751,18 @@ func discoverClusterNodes() ([]string, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Third field should be the IP address
|
// Iterate through fields to find the IP address
|
||||||
ip := fields[2]
|
for _, field := range fields {
|
||||||
// Basic validation that it looks like an IP
|
// Skip hex ID
|
||||||
if strings.Contains(ip, ".") {
|
if strings.HasPrefix(field, "0x") {
|
||||||
nodes = append(nodes, ip)
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it's a valid IP
|
||||||
|
if ip := net.ParseIP(field); ip != nil {
|
||||||
|
nodes = append(nodes, field)
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
77
cmd/pulse-sensor-proxy/ssh_parsing_test.go
Normal file
77
cmd/pulse-sensor-proxy/ssh_parsing_test.go
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParseClusterNodes(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
output string
|
||||||
|
want []string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "standard output",
|
||||||
|
output: `Membership information
|
||||||
|
----------------------
|
||||||
|
Nodeid Votes Name
|
||||||
|
0x00000001 1 192.168.1.10
|
||||||
|
0x00000002 1 192.168.1.11`,
|
||||||
|
want: []string{"192.168.1.10", "192.168.1.11"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "output with QDevice flags",
|
||||||
|
output: `Membership information
|
||||||
|
----------------------
|
||||||
|
Nodeid Votes Name
|
||||||
|
0x00000001 1 A,V,NMW 192.168.1.10
|
||||||
|
0x00000002 1 A,V,NMW 192.168.1.11`,
|
||||||
|
want: []string{"192.168.1.10", "192.168.1.11"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "output with local suffix",
|
||||||
|
output: `Membership information
|
||||||
|
----------------------
|
||||||
|
Nodeid Votes Name
|
||||||
|
0x00000001 1 192.168.1.10 (local)
|
||||||
|
0x00000002 1 192.168.1.11`,
|
||||||
|
want: []string{"192.168.1.10", "192.168.1.11"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mixed output",
|
||||||
|
output: `Membership information
|
||||||
|
----------------------
|
||||||
|
Nodeid Votes Name
|
||||||
|
0x00000001 1 A,V,NMW 192.168.1.10 (local)
|
||||||
|
0x00000002 1 192.168.1.11`,
|
||||||
|
want: []string{"192.168.1.10", "192.168.1.11"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no nodes",
|
||||||
|
output: "some random text",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := parseClusterNodes(tt.output)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("parseClusterNodes() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !tt.wantErr {
|
||||||
|
if len(got) != len(tt.want) {
|
||||||
|
t.Errorf("parseClusterNodes() got = %v, want %v", got, tt.want)
|
||||||
|
} else {
|
||||||
|
for i := range got {
|
||||||
|
if got[i] != tt.want[i] {
|
||||||
|
t.Errorf("parseClusterNodes() got[%d] = %v, want %v", i, got[i], tt.want[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -805,7 +805,7 @@ cleanup_cluster_authorized_keys_manual() {
|
||||||
if command -v pvecm >/dev/null 2>&1; then
|
if command -v pvecm >/dev/null 2>&1; then
|
||||||
while IFS= read -r node_ip; do
|
while IFS= read -r node_ip; do
|
||||||
[[ -n "$node_ip" ]] && nodes+=("$node_ip")
|
[[ -n "$node_ip" ]] && nodes+=("$node_ip")
|
||||||
done < <(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $3}' || true)
|
done < <(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' || true)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ${#nodes[@]} -eq 0 ]]; then
|
if [[ ${#nodes[@]} -eq 0 ]]; then
|
||||||
|
|
@ -2646,7 +2646,7 @@ if [[ -z "$HOST" ]]; then
|
||||||
|
|
||||||
# Discover cluster nodes
|
# Discover cluster nodes
|
||||||
if command -v pvecm >/dev/null 2>&1; then
|
if command -v pvecm >/dev/null 2>&1; then
|
||||||
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $3}' || true)
|
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' || true)
|
||||||
|
|
||||||
if [[ -n "$CLUSTER_NODES" ]]; then
|
if [[ -n "$CLUSTER_NODES" ]]; then
|
||||||
for node_ip in $CLUSTER_NODES; do
|
for node_ip in $CLUSTER_NODES; do
|
||||||
|
|
@ -2955,7 +2955,7 @@ print_info "Proxy public key: ${PROXY_PUBLIC_KEY:0:50}..."
|
||||||
# Discover cluster nodes
|
# Discover cluster nodes
|
||||||
if command -v pvecm >/dev/null 2>&1; then
|
if command -v pvecm >/dev/null 2>&1; then
|
||||||
# Extract node IPs from pvecm status
|
# Extract node IPs from pvecm status
|
||||||
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $3}' || true)
|
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' || true)
|
||||||
|
|
||||||
if [[ -n "$CLUSTER_NODES" ]]; then
|
if [[ -n "$CLUSTER_NODES" ]]; then
|
||||||
print_info "Discovered cluster nodes: $(echo $CLUSTER_NODES | tr '\n' ' ')"
|
print_info "Discovered cluster nodes: $(echo $CLUSTER_NODES | tr '\n' ' ')"
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ if [[ -z "$HOST" ]]; then
|
||||||
|
|
||||||
# Discover cluster nodes
|
# Discover cluster nodes
|
||||||
if command -v pvecm >/dev/null 2>&1; then
|
if command -v pvecm >/dev/null 2>&1; then
|
||||||
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $3}')
|
CLUSTER_NODES=$(pvecm status 2>/dev/null | awk '/0x[0-9a-f]+.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}')
|
||||||
|
|
||||||
if [[ -n "$CLUSTER_NODES" ]]; then
|
if [[ -n "$CLUSTER_NODES" ]]; then
|
||||||
for node_ip in $CLUSTER_NODES; do
|
for node_ip in $CLUSTER_NODES; do
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue