|
|
@@ -959,7 +959,9 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
if bn.Disabled || strings.TrimSpace(bn.Address) == "" {
|
|
|
continue
|
|
|
}
|
|
|
- if bn.Interface != "" {
|
|
|
+ if bn.LocalAddress != "" && bn.Multihop {
|
|
|
+ sb.WriteString(fmt.Sprintf(" neighbor %s local %s multihop;\n", strings.TrimSpace(bn.Address), strings.TrimSpace(bn.LocalAddress)))
|
|
|
+ } else if bn.Interface != "" {
|
|
|
sb.WriteString(fmt.Sprintf(" neighbor %s dev \"%s\";\n", strings.TrimSpace(bn.Address), strings.TrimSpace(bn.Interface)))
|
|
|
} else if bn.Multihop {
|
|
|
sb.WriteString(fmt.Sprintf(" neighbor %s multihop;\n", strings.TrimSpace(bn.Address)))
|
|
|
@@ -967,6 +969,10 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
sb.WriteString(fmt.Sprintf(" neighbor %s;\n", strings.TrimSpace(bn.Address)))
|
|
|
}
|
|
|
}
|
|
|
+ // If no interface block was specified, add default wildcard interface
|
|
|
+ if len(m.config.BFDInterfaces) == 0 {
|
|
|
+ sb.WriteString(" interface \"*\" {\n min rx interval 100 ms;\n min tx interval 100 ms;\n };\n")
|
|
|
+ }
|
|
|
sb.WriteString("}\n\n")
|
|
|
}
|
|
|
|
|
|
@@ -1024,6 +1030,7 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
sb.WriteString(" };\n\n")
|
|
|
|
|
|
// Interfaces for this RIP instance
|
|
|
+ hasRIPInterface := false
|
|
|
for _, iface := range m.config.RIPInterfaces {
|
|
|
if iface.Disabled {
|
|
|
continue
|
|
|
@@ -1031,6 +1038,7 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
if iface.Instance != "" && !strings.EqualFold(iface.Instance, inst.Name) && !strings.EqualFold(iface.Instance, "Default") {
|
|
|
continue
|
|
|
}
|
|
|
+ hasRIPInterface = true
|
|
|
ifName := strings.TrimSpace(iface.Interface)
|
|
|
if ifName == "" {
|
|
|
ifName = "*"
|
|
|
@@ -1069,6 +1077,9 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
}
|
|
|
sb.WriteString(" };\n")
|
|
|
}
|
|
|
+ if !hasRIPInterface {
|
|
|
+ sb.WriteString(" interface \"*\" {\n mode multicast;\n };\n")
|
|
|
+ }
|
|
|
|
|
|
sb.WriteString("}\n\n")
|
|
|
}
|
|
|
@@ -1175,6 +1186,7 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
}
|
|
|
instProtoName := sanitizeIdentifier("radv", fmt.Sprintf("%s_%d", inst.Name, idx))
|
|
|
sb.WriteString(fmt.Sprintf("protocol radv %s {\n", instProtoName))
|
|
|
+ hasRAdvInterface := false
|
|
|
for _, iface := range m.config.RAdvInterfaces {
|
|
|
if iface.Disabled {
|
|
|
continue
|
|
|
@@ -1182,6 +1194,7 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
if iface.Instance != "" && !strings.EqualFold(iface.Instance, inst.Name) && !strings.EqualFold(iface.Instance, "Default") {
|
|
|
continue
|
|
|
}
|
|
|
+ hasRAdvInterface = true
|
|
|
ifName := strings.TrimSpace(iface.Interface)
|
|
|
if ifName == "" {
|
|
|
ifName = "*"
|
|
|
@@ -1220,6 +1233,9 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
}
|
|
|
sb.WriteString(" };\n")
|
|
|
}
|
|
|
+ if !hasRAdvInterface {
|
|
|
+ sb.WriteString(" interface \"*\" {\n };\n")
|
|
|
+ }
|
|
|
sb.WriteString("}\n\n")
|
|
|
}
|
|
|
|
|
|
@@ -2789,7 +2805,7 @@ func (m *Manager) ListRIPInstances() []RIPInstance {
|
|
|
res := make([]RIPInstance, len(m.config.RIPInstances))
|
|
|
copy(res, m.config.RIPInstances)
|
|
|
for i := range res {
|
|
|
- res[i].Running = birdRunning && res[i].Enabled && !res[i].Disabled
|
|
|
+ res[i].Running = birdRunning && (res[i].Enabled || !res[i].Disabled) && !res[i].Disabled
|
|
|
}
|
|
|
return res
|
|
|
}
|
|
|
@@ -2798,6 +2814,12 @@ func (m *Manager) SaveRIPInstance(inst RIPInstance) (*RIPInstance, error) {
|
|
|
m.mu.Lock()
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
+ if !inst.Disabled {
|
|
|
+ inst.Enabled = true
|
|
|
+ } else {
|
|
|
+ inst.Enabled = false
|
|
|
+ }
|
|
|
+
|
|
|
if inst.ID == "" {
|
|
|
inst.ID = fmt.Sprintf("rip-inst-%d", time.Now().UnixNano())
|
|
|
}
|
|
|
@@ -3086,8 +3108,15 @@ func (m *Manager) GetBFDInstance() BFDInstance {
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
inst := m.config.BFDInstance
|
|
|
+ pOut, pErr := birdcExec("show protocols bfd_main")
|
|
|
+ bfdUp := pErr == nil && strings.Contains(string(pOut), "up")
|
|
|
out, err := birdcExec("show status")
|
|
|
- inst.Running = err == nil && strings.Contains(string(out), "Daemon is up and running") && inst.Enabled && !inst.Disabled
|
|
|
+ birdRunning := err == nil && strings.Contains(string(out), "Daemon is up and running")
|
|
|
+
|
|
|
+ inst.Running = (bfdUp || (birdRunning && (inst.Enabled || len(m.config.BFDInterfaces) > 0 || len(m.config.BFDNeighbors) > 0))) && !inst.Disabled
|
|
|
+ if inst.Running && !inst.Disabled {
|
|
|
+ inst.Enabled = true
|
|
|
+ }
|
|
|
return inst
|
|
|
}
|
|
|
|
|
|
@@ -3095,6 +3124,11 @@ func (m *Manager) SaveBFDInstance(inst BFDInstance) error {
|
|
|
m.mu.Lock()
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
+ if !inst.Disabled {
|
|
|
+ inst.Enabled = true
|
|
|
+ } else {
|
|
|
+ inst.Enabled = false
|
|
|
+ }
|
|
|
m.config.BFDInstance = inst
|
|
|
if err := m.save(); err != nil {
|
|
|
return err
|
|
|
@@ -3142,6 +3176,10 @@ func (m *Manager) SaveBFDInterface(iface BFDInterface) (*BFDInterface, error) {
|
|
|
m.config.BFDInterfaces = append(m.config.BFDInterfaces, iface)
|
|
|
}
|
|
|
|
|
|
+ if !m.config.BFDInstance.Disabled {
|
|
|
+ m.config.BFDInstance.Enabled = true
|
|
|
+ }
|
|
|
+
|
|
|
if err := m.save(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -3214,6 +3252,10 @@ func (m *Manager) SaveBFDNeighbor(nbr BFDNeighbor) (*BFDNeighbor, error) {
|
|
|
m.config.BFDNeighbors = append(m.config.BFDNeighbors, nbr)
|
|
|
}
|
|
|
|
|
|
+ if !m.config.BFDInstance.Disabled {
|
|
|
+ m.config.BFDInstance.Enabled = true
|
|
|
+ }
|
|
|
+
|
|
|
if err := m.save(); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -3250,7 +3292,7 @@ func (m *Manager) GetBFDSessions() []BFDSession {
|
|
|
lines := strings.Split(string(out), "\n")
|
|
|
for _, line := range lines {
|
|
|
trimmed := strings.TrimSpace(line)
|
|
|
- if trimmed == "" || strings.HasPrefix(trimmed, "BIRD") || strings.HasPrefix(trimmed, "IP address") || strings.Contains(trimmed, "There is no BFD") {
|
|
|
+ if trimmed == "" || strings.HasPrefix(trimmed, "BIRD") || strings.HasPrefix(trimmed, "IP address") || strings.Contains(trimmed, "There is no BFD") || strings.HasSuffix(trimmed, ":") {
|
|
|
continue
|
|
|
}
|
|
|
fields := strings.Fields(trimmed)
|
|
|
@@ -3660,7 +3702,7 @@ func (m *Manager) ListRAdvInstances() []RAdvInstance {
|
|
|
res := make([]RAdvInstance, len(m.config.RAdvInstances))
|
|
|
copy(res, m.config.RAdvInstances)
|
|
|
for i := range res {
|
|
|
- res[i].Running = birdRunning && res[i].Enabled && !res[i].Disabled
|
|
|
+ res[i].Running = birdRunning && (res[i].Enabled || !res[i].Disabled) && !res[i].Disabled
|
|
|
}
|
|
|
return res
|
|
|
}
|
|
|
@@ -3669,6 +3711,12 @@ func (m *Manager) SaveRAdvInstance(inst RAdvInstance) (*RAdvInstance, error) {
|
|
|
m.mu.Lock()
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
+ if !inst.Disabled {
|
|
|
+ inst.Enabled = true
|
|
|
+ } else {
|
|
|
+ inst.Enabled = false
|
|
|
+ }
|
|
|
+
|
|
|
if inst.ID == "" {
|
|
|
inst.ID = fmt.Sprintf("radv-inst-%d", time.Now().UnixNano())
|
|
|
}
|
|
|
@@ -3861,7 +3909,7 @@ func (m *Manager) GetSummary() DynamicRoutingSummary {
|
|
|
}
|
|
|
|
|
|
for _, inst := range m.config.RIPInstances {
|
|
|
- if inst.Enabled && !inst.Disabled {
|
|
|
+ if (inst.Enabled || !inst.Disabled) && !inst.Disabled {
|
|
|
summary.RIPEnabled = true
|
|
|
break
|
|
|
}
|
|
|
@@ -3872,11 +3920,11 @@ func (m *Manager) GetSummary() DynamicRoutingSummary {
|
|
|
summary.RIPNeighborCount = len(nbrs)
|
|
|
}
|
|
|
|
|
|
- if m.config.BFDInstance.Enabled && !m.config.BFDInstance.Disabled {
|
|
|
- summary.BFDEnabled = true
|
|
|
- }
|
|
|
- if summary.BFDEnabled && birdRunning {
|
|
|
- summary.BFDRunning = true
|
|
|
+ pOut, pErr := birdcExec("show protocols bfd_main")
|
|
|
+ bfdUp := pErr == nil && strings.Contains(string(pOut), "up")
|
|
|
+ summary.BFDEnabled = (m.config.BFDInstance.Enabled || len(m.config.BFDInterfaces) > 0 || len(m.config.BFDNeighbors) > 0) && !m.config.BFDInstance.Disabled
|
|
|
+ summary.BFDRunning = (bfdUp || (birdRunning && summary.BFDEnabled)) && !m.config.BFDInstance.Disabled
|
|
|
+ if summary.BFDRunning {
|
|
|
sessions := m.GetBFDSessions()
|
|
|
summary.BFDSessionCount = len(sessions)
|
|
|
}
|
|
|
@@ -3894,7 +3942,7 @@ func (m *Manager) GetSummary() DynamicRoutingSummary {
|
|
|
}
|
|
|
|
|
|
for _, inst := range m.config.RAdvInstances {
|
|
|
- if inst.Enabled && !inst.Disabled {
|
|
|
+ if (inst.Enabled || !inst.Disabled) && !inst.Disabled {
|
|
|
summary.RAdvEnabled = true
|
|
|
break
|
|
|
}
|