|
@@ -2472,6 +2472,8 @@ func (e *Executor) handleRoutingBGPInstance(parts []string, user *auth.PublicUse
|
|
|
out += fmt.Sprintf(" enabled: %t\n", inst.Enabled)
|
|
out += fmt.Sprintf(" enabled: %t\n", inst.Enabled)
|
|
|
out += fmt.Sprintf(" as: %d\n", inst.AS)
|
|
out += fmt.Sprintf(" as: %d\n", inst.AS)
|
|
|
out += fmt.Sprintf(" router-id: %s\n", inst.RouterID)
|
|
out += fmt.Sprintf(" router-id: %s\n", inst.RouterID)
|
|
|
|
|
+ out += fmt.Sprintf(" in-filter: %s\n", inst.InFilter)
|
|
|
|
|
+ out += fmt.Sprintf(" out-filter: %s\n", inst.OutFilter)
|
|
|
out += fmt.Sprintf(" hold-time: %d\n", inst.HoldTime)
|
|
out += fmt.Sprintf(" hold-time: %d\n", inst.HoldTime)
|
|
|
out += fmt.Sprintf(" keepalive-time: %d\n", inst.KeepaliveTime)
|
|
out += fmt.Sprintf(" keepalive-time: %d\n", inst.KeepaliveTime)
|
|
|
out += fmt.Sprintf(" redistribute-connected: %t\n", inst.RedistributeConnected)
|
|
out += fmt.Sprintf(" redistribute-connected: %t\n", inst.RedistributeConnected)
|
|
@@ -2500,6 +2502,12 @@ func (e *Executor) handleRoutingBGPInstance(parts []string, user *auth.PublicUse
|
|
|
if v, ok := params["router-id"]; ok {
|
|
if v, ok := params["router-id"]; ok {
|
|
|
inst.RouterID = strings.TrimSpace(v)
|
|
inst.RouterID = strings.TrimSpace(v)
|
|
|
}
|
|
}
|
|
|
|
|
+ if v, ok := params["in-filter"]; ok {
|
|
|
|
|
+ inst.InFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["out-filter"]; ok {
|
|
|
|
|
+ inst.OutFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
if v, ok := params["enabled"]; ok {
|
|
if v, ok := params["enabled"]; ok {
|
|
|
inst.Enabled = parseCLIEnableDisable(v, inst.Enabled)
|
|
inst.Enabled = parseCLIEnableDisable(v, inst.Enabled)
|
|
|
}
|
|
}
|
|
@@ -2788,7 +2796,7 @@ func (e *Executor) handleRoutingRIP(parts []string, user *auth.PublicUser) strin
|
|
|
func (e *Executor) handleRIPInstance(parts []string, user *auth.PublicUser) string {
|
|
func (e *Executor) handleRIPInstance(parts []string, user *auth.PublicUser) string {
|
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
|
instances := e.dynRoutingMgr.ListRIPInstances()
|
|
instances := e.dynRoutingMgr.ListRIPInstances()
|
|
|
- tbl := NewTable("#", "FLAGS", "NAME", "VERSION", "REDISTRIBUTE", "UPDATE-TIME", "STATUS")
|
|
|
|
|
|
|
+ tbl := NewTable("#", "FLAGS", "NAME", "VERSION", "IN-FILTER", "OUT-FILTER", "REDISTRIBUTE", "UPDATE-TIME", "STATUS")
|
|
|
for idx, inst := range instances {
|
|
for idx, inst := range instances {
|
|
|
st := "enabled"
|
|
st := "enabled"
|
|
|
flags := "I"
|
|
flags := "I"
|
|
@@ -2819,7 +2827,15 @@ func (e *Executor) handleRIPInstance(parts []string, user *auth.PublicUser) stri
|
|
|
if len(redist) > 0 {
|
|
if len(redist) > 0 {
|
|
|
redistStr = strings.Join(redist, ",")
|
|
redistStr = strings.Join(redist, ",")
|
|
|
}
|
|
}
|
|
|
- tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, fmt.Sprintf("%d", inst.Version), redistStr, fmt.Sprintf("%ds", inst.UpdateTime), st)
|
|
|
|
|
|
|
+ inF := inst.InFilter
|
|
|
|
|
+ if inF == "" {
|
|
|
|
|
+ inF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ outF := inst.OutFilter
|
|
|
|
|
+ if outF == "" {
|
|
|
|
|
+ outF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, fmt.Sprintf("%d", inst.Version), inF, outF, redistStr, fmt.Sprintf("%ds", inst.UpdateTime), st)
|
|
|
}
|
|
}
|
|
|
return tbl.String()
|
|
return tbl.String()
|
|
|
}
|
|
}
|
|
@@ -2850,6 +2866,8 @@ func (e *Executor) handleRIPInstance(parts []string, user *auth.PublicUser) stri
|
|
|
inst := dynamicrouting.RIPInstance{
|
|
inst := dynamicrouting.RIPInstance{
|
|
|
Name: name,
|
|
Name: name,
|
|
|
Version: ver,
|
|
Version: ver,
|
|
|
|
|
+ InFilter: params["in-filter"],
|
|
|
|
|
+ OutFilter: params["out-filter"],
|
|
|
Enabled: true,
|
|
Enabled: true,
|
|
|
Disabled: false,
|
|
Disabled: false,
|
|
|
RedistributeConnected: parseCLIEnableDisable(params["redistribute-connected"], false),
|
|
RedistributeConnected: parseCLIEnableDisable(params["redistribute-connected"], false),
|
|
@@ -2874,6 +2892,69 @@ func (e *Executor) handleRIPInstance(parts []string, user *auth.PublicUser) stri
|
|
|
}
|
|
}
|
|
|
return ColorGreen + fmt.Sprintf("RIP instance %s added.\n", name) + ColorReset
|
|
return ColorGreen + fmt.Sprintf("RIP instance %s added.\n", name) + ColorReset
|
|
|
|
|
|
|
|
|
|
+ case "set":
|
|
|
|
|
+ pos, params := parseArgs(parts[1:])
|
|
|
|
|
+ target := ""
|
|
|
|
|
+ if len(pos) > 0 {
|
|
|
|
|
+ target = pos[0]
|
|
|
|
|
+ } else if v, ok := params["numbers"]; ok {
|
|
|
|
|
+ target = v
|
|
|
|
|
+ } else if v, ok := params["name"]; ok {
|
|
|
|
|
+ target = v
|
|
|
|
|
+ }
|
|
|
|
|
+ if target == "" {
|
|
|
|
|
+ return ColorRed + "Usage: /routing rip instance set <#|name|id> [in-filter=...] [out-filter=...] [default-metric=...]\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ instances := e.dynRoutingMgr.ListRIPInstances()
|
|
|
|
|
+ var targetInst *dynamicrouting.RIPInstance
|
|
|
|
|
+ if idx, err := strconv.Atoi(target); err == nil && idx >= 0 && idx < len(instances) {
|
|
|
|
|
+ targetInst = &instances[idx]
|
|
|
|
|
+ } else {
|
|
|
|
|
+ for i := range instances {
|
|
|
|
|
+ if strings.EqualFold(instances[i].Name, target) || instances[i].ID == target {
|
|
|
|
|
+ targetInst = &instances[i]
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if targetInst == nil {
|
|
|
|
|
+ return ColorRed + "RIP instance not found: " + target + "\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["in-filter"]; ok {
|
|
|
|
|
+ targetInst.InFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["out-filter"]; ok {
|
|
|
|
|
+ targetInst.OutFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["default-metric"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.DefaultMetric)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["update-time"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.UpdateTime)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["timeout-time"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.TimeoutTime)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-connected"]; ok {
|
|
|
|
|
+ targetInst.RedistributeConnected = parseCLIEnableDisable(v, targetInst.RedistributeConnected)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-static"]; ok {
|
|
|
|
|
+ targetInst.RedistributeStatic = parseCLIEnableDisable(v, targetInst.RedistributeStatic)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-bgp"]; ok {
|
|
|
|
|
+ targetInst.RedistributeBGP = parseCLIEnableDisable(v, targetInst.RedistributeBGP)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-ospf"]; ok {
|
|
|
|
|
+ targetInst.RedistributeOSPF = parseCLIEnableDisable(v, targetInst.RedistributeOSPF)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-default"]; ok {
|
|
|
|
|
+ targetInst.RedistributeDefault = parseCLIEnableDisable(v, targetInst.RedistributeDefault)
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err := e.dynRoutingMgr.SaveRIPInstance(*targetInst); err != nil {
|
|
|
|
|
+ return ColorRed + "Error updating RIP instance: " + err.Error() + "\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ return ColorGreen + fmt.Sprintf("RIP instance %s updated.\n", targetInst.Name) + ColorReset
|
|
|
|
|
+
|
|
|
case "remove", "rem", "delete":
|
|
case "remove", "rem", "delete":
|
|
|
pos, _ := parseArgs(parts[1:])
|
|
pos, _ := parseArgs(parts[1:])
|
|
|
if len(pos) == 0 {
|
|
if len(pos) == 0 {
|
|
@@ -4096,7 +4177,7 @@ func (e *Executor) handleRoutingEIGRP(parts []string, user *auth.PublicUser) str
|
|
|
func (e *Executor) handleEIGRPInstance(parts []string, user *auth.PublicUser) string {
|
|
func (e *Executor) handleEIGRPInstance(parts []string, user *auth.PublicUser) string {
|
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
|
instances := e.dynRoutingMgr.ListEIGRPInstances()
|
|
instances := e.dynRoutingMgr.ListEIGRPInstances()
|
|
|
- tbl := NewTable("#", "FLAGS", "NAME", "AS", "ROUTER-ID", "REDISTRIBUTE", "VARIANCE", "STATUS")
|
|
|
|
|
|
|
+ tbl := NewTable("#", "FLAGS", "NAME", "AS", "ROUTER-ID", "IN-FILTER", "OUT-FILTER", "REDISTRIBUTE", "VARIANCE", "STATUS")
|
|
|
for idx, inst := range instances {
|
|
for idx, inst := range instances {
|
|
|
st := "enabled"
|
|
st := "enabled"
|
|
|
flags := "I"
|
|
flags := "I"
|
|
@@ -4124,7 +4205,15 @@ func (e *Executor) handleEIGRPInstance(parts []string, user *auth.PublicUser) st
|
|
|
if len(redist) > 0 {
|
|
if len(redist) > 0 {
|
|
|
redistStr = strings.Join(redist, ",")
|
|
redistStr = strings.Join(redist, ",")
|
|
|
}
|
|
}
|
|
|
- tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, fmt.Sprintf("%d", inst.AS), inst.RouterID, redistStr, fmt.Sprintf("%d", inst.Variance), st)
|
|
|
|
|
|
|
+ inF := inst.InFilter
|
|
|
|
|
+ if inF == "" {
|
|
|
|
|
+ inF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ outF := inst.OutFilter
|
|
|
|
|
+ if outF == "" {
|
|
|
|
|
+ outF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, fmt.Sprintf("%d", inst.AS), inst.RouterID, inF, outF, redistStr, fmt.Sprintf("%d", inst.Variance), st)
|
|
|
}
|
|
}
|
|
|
return tbl.String()
|
|
return tbl.String()
|
|
|
}
|
|
}
|
|
@@ -4153,6 +4242,8 @@ func (e *Executor) handleEIGRPInstance(parts []string, user *auth.PublicUser) st
|
|
|
Name: name,
|
|
Name: name,
|
|
|
AS: as,
|
|
AS: as,
|
|
|
RouterID: params["router-id"],
|
|
RouterID: params["router-id"],
|
|
|
|
|
+ InFilter: params["in-filter"],
|
|
|
|
|
+ OutFilter: params["out-filter"],
|
|
|
Variance: variance,
|
|
Variance: variance,
|
|
|
MaximumPaths: maxPaths,
|
|
MaximumPaths: maxPaths,
|
|
|
Enabled: true,
|
|
Enabled: true,
|
|
@@ -4171,6 +4262,75 @@ func (e *Executor) handleEIGRPInstance(parts []string, user *auth.PublicUser) st
|
|
|
}
|
|
}
|
|
|
return ColorGreen + fmt.Sprintf("EIGRP instance %s (AS %d) added.\n", name, as) + ColorReset
|
|
return ColorGreen + fmt.Sprintf("EIGRP instance %s (AS %d) added.\n", name, as) + ColorReset
|
|
|
|
|
|
|
|
|
|
+ case "set":
|
|
|
|
|
+ pos, params := parseArgs(parts[1:])
|
|
|
|
|
+ target := ""
|
|
|
|
|
+ if len(pos) > 0 {
|
|
|
|
|
+ target = pos[0]
|
|
|
|
|
+ } else if v, ok := params["numbers"]; ok {
|
|
|
|
|
+ target = v
|
|
|
|
|
+ } else if v, ok := params["name"]; ok {
|
|
|
|
|
+ target = v
|
|
|
|
|
+ }
|
|
|
|
|
+ if target == "" {
|
|
|
|
|
+ return ColorRed + "Usage: /routing eigrp instance set <#|name|id> [in-filter=...] [out-filter=...] [as=...] [router-id=...] [variance=...]\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ instances := e.dynRoutingMgr.ListEIGRPInstances()
|
|
|
|
|
+ var targetInst *dynamicrouting.EIGRPInstance
|
|
|
|
|
+ if idx, err := strconv.Atoi(target); err == nil && idx >= 0 && idx < len(instances) {
|
|
|
|
|
+ targetInst = &instances[idx]
|
|
|
|
|
+ } else {
|
|
|
|
|
+ for i := range instances {
|
|
|
|
|
+ if strings.EqualFold(instances[i].Name, target) || instances[i].ID == target {
|
|
|
|
|
+ targetInst = &instances[i]
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if targetInst == nil {
|
|
|
|
|
+ return ColorRed + "EIGRP instance not found: " + target + "\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["in-filter"]; ok {
|
|
|
|
|
+ targetInst.InFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["out-filter"]; ok {
|
|
|
|
|
+ targetInst.OutFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["as"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.AS)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["router-id"]; ok {
|
|
|
|
|
+ targetInst.RouterID = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["variance"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.Variance)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["maximum-paths"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.MaximumPaths)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["default-metric"]; ok {
|
|
|
|
|
+ fmt.Sscanf(v, "%d", &targetInst.DefaultMetric)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-connected"]; ok {
|
|
|
|
|
+ targetInst.RedistributeConnected = parseCLIEnableDisable(v, targetInst.RedistributeConnected)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-static"]; ok {
|
|
|
|
|
+ targetInst.RedistributeStatic = parseCLIEnableDisable(v, targetInst.RedistributeStatic)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-bgp"]; ok {
|
|
|
|
|
+ targetInst.RedistributeBGP = parseCLIEnableDisable(v, targetInst.RedistributeBGP)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["redistribute-ospf"]; ok {
|
|
|
|
|
+ targetInst.RedistributeOSPF = parseCLIEnableDisable(v, targetInst.RedistributeOSPF)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["comment"]; ok {
|
|
|
|
|
+ targetInst.Comment = v
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, err := e.dynRoutingMgr.SaveEIGRPInstance(*targetInst); err != nil {
|
|
|
|
|
+ return ColorRed + "Error updating EIGRP instance: " + err.Error() + "\n" + ColorReset
|
|
|
|
|
+ }
|
|
|
|
|
+ return ColorGreen + fmt.Sprintf("EIGRP instance %s updated.\n", targetInst.Name) + ColorReset
|
|
|
|
|
+
|
|
|
case "remove", "rem", "delete":
|
|
case "remove", "rem", "delete":
|
|
|
pos, _ := parseArgs(parts[1:])
|
|
pos, _ := parseArgs(parts[1:])
|
|
|
if len(pos) == 0 {
|
|
if len(pos) == 0 {
|
|
@@ -4491,7 +4651,7 @@ func (e *Executor) handleRoutingOSPF(parts []string, user *auth.PublicUser) stri
|
|
|
func (e *Executor) handleOSPFInstance(parts []string, user *auth.PublicUser) string {
|
|
func (e *Executor) handleOSPFInstance(parts []string, user *auth.PublicUser) string {
|
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
if len(parts) == 0 || parts[0] == "print" || parts[0] == "pr" {
|
|
|
instances := e.dynRoutingMgr.ListOSPFInstances()
|
|
instances := e.dynRoutingMgr.ListOSPFInstances()
|
|
|
- tbl := NewTable("#", "FLAGS", "NAME", "ROUTER-ID", "VERSION", "REDISTRIBUTE", "DEFAULT-METRIC", "STATUS")
|
|
|
|
|
|
|
+ tbl := NewTable("#", "FLAGS", "NAME", "ROUTER-ID", "VERSION", "IN-FILTER", "OUT-FILTER", "REDISTRIBUTE", "DEFAULT-METRIC", "STATUS")
|
|
|
for idx, inst := range instances {
|
|
for idx, inst := range instances {
|
|
|
st := "enabled"
|
|
st := "enabled"
|
|
|
flags := "I"
|
|
flags := "I"
|
|
@@ -4527,7 +4687,15 @@ func (e *Executor) handleOSPFInstance(parts []string, user *auth.PublicUser) str
|
|
|
if inst.DefaultMetric > 0 {
|
|
if inst.DefaultMetric > 0 {
|
|
|
metricStr = fmt.Sprintf("%d", inst.DefaultMetric)
|
|
metricStr = fmt.Sprintf("%d", inst.DefaultMetric)
|
|
|
}
|
|
}
|
|
|
- tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, inst.RouterID, fmt.Sprintf("%d", inst.Version), redistStr, metricStr, st)
|
|
|
|
|
|
|
+ inF := inst.InFilter
|
|
|
|
|
+ if inF == "" {
|
|
|
|
|
+ inF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ outF := inst.OutFilter
|
|
|
|
|
+ if outF == "" {
|
|
|
|
|
+ outF = "-"
|
|
|
|
|
+ }
|
|
|
|
|
+ tbl.AddRow(fmt.Sprintf("%d", idx), flags, inst.Name, inst.RouterID, fmt.Sprintf("%d", inst.Version), inF, outF, redistStr, metricStr, st)
|
|
|
}
|
|
}
|
|
|
return tbl.String()
|
|
return tbl.String()
|
|
|
}
|
|
}
|
|
@@ -4585,6 +4753,8 @@ func (e *Executor) handleOSPFInstance(parts []string, user *auth.PublicUser) str
|
|
|
VRF: vrf,
|
|
VRF: vrf,
|
|
|
RouterID: routerID,
|
|
RouterID: routerID,
|
|
|
RoutingTable: rt,
|
|
RoutingTable: rt,
|
|
|
|
|
+ InFilter: params["in-filter"],
|
|
|
|
|
+ OutFilter: params["out-filter"],
|
|
|
Enabled: !disabled,
|
|
Enabled: !disabled,
|
|
|
Disabled: disabled,
|
|
Disabled: disabled,
|
|
|
RedistributeConnected: redistConn,
|
|
RedistributeConnected: redistConn,
|
|
@@ -4634,6 +4804,12 @@ func (e *Executor) handleOSPFInstance(parts []string, user *auth.PublicUser) str
|
|
|
if v, ok := params["router-id"]; ok {
|
|
if v, ok := params["router-id"]; ok {
|
|
|
targetInst.RouterID = v
|
|
targetInst.RouterID = v
|
|
|
}
|
|
}
|
|
|
|
|
+ if v, ok := params["in-filter"]; ok {
|
|
|
|
|
+ targetInst.InFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
|
|
+ if v, ok := params["out-filter"]; ok {
|
|
|
|
|
+ targetInst.OutFilter = strings.TrimSpace(v)
|
|
|
|
|
+ }
|
|
|
if v, ok := params["redistribute-connected"]; ok {
|
|
if v, ok := params["redistribute-connected"]; ok {
|
|
|
targetInst.RedistributeConnected = parseCLIEnableDisable(v, false)
|
|
targetInst.RedistributeConnected = parseCLIEnableDisable(v, false)
|
|
|
}
|
|
}
|