network: add support for CIDR addresses Debian routes

OnMetal is changing their template from:
`route add -net 1.2.3.0 netmask 255.255.255.0 gw 10.1.2.1 || true`
to:
`route add -net 1.2.3.0/24 gw 10.1.2.1 || true`
This commit is contained in:
Alex Crawford 2014-09-16 17:33:44 -07:00
parent e9cd09dd7b
commit 2d28d16c92
2 changed files with 53 additions and 23 deletions

View File

@ -236,7 +236,11 @@ func parseInterfaceStanza(attributes []string, options []string) (*stanzaInterfa
for i, field := range fields[:len(fields)-1] { for i, field := range fields[:len(fields)-1] {
switch field { switch field {
case "-net": case "-net":
route.destination.IP = net.ParseIP(fields[i+1]) if _, dst, err := net.ParseCIDR(fields[i+1]); err == nil {
route.destination = *dst
} else {
route.destination.IP = net.ParseIP(fields[i+1])
}
case "netmask": case "netmask":
route.destination.Mask = net.IPMask(net.ParseIP(fields[i+1]).To4()) route.destination.Mask = net.IPMask(net.ParseIP(fields[i+1]).To4())
case "gw": case "gw":

View File

@ -285,31 +285,57 @@ func TestBadParseInterfaceStanzasStaticPostUp(t *testing.T) {
} }
func TestParseInterfaceStanzaStaticPostUp(t *testing.T) { func TestParseInterfaceStanzaStaticPostUp(t *testing.T) {
options := []string{ for _, tt := range []struct {
"address 192.168.1.100", options []string
"netmask 255.255.255.0", expect []route
"post-up route add gw 192.168.1.1 -net 192.168.1.0 netmask 255.255.255.0", }{
}
expect := []route{
{ {
destination: net.IPNet{ options: []string{
IP: net.IPv4(192, 168, 1, 0), "address 192.168.1.100",
Mask: net.IPv4Mask(255, 255, 255, 0), "netmask 255.255.255.0",
"post-up route add gw 192.168.1.1 -net 192.168.1.0 netmask 255.255.255.0",
},
expect: []route{
{
destination: net.IPNet{
IP: net.IPv4(192, 168, 1, 0),
Mask: net.IPv4Mask(255, 255, 255, 0),
},
gateway: net.IPv4(192, 168, 1, 1),
},
}, },
gateway: net.IPv4(192, 168, 1, 1),
}, },
} {
options: []string{
iface, err := parseInterfaceStanza([]string{"eth", "inet", "static"}, options) "address 192.168.1.100",
if err != nil { "netmask 255.255.255.0",
t.FailNow() "post-up route add gw 192.168.1.1 -net 192.168.1.0/24 || true",
} },
static, ok := iface.configMethod.(configMethodStatic) expect: []route{
if !ok { {
t.FailNow() destination: func() net.IPNet {
} if _, net, err := net.ParseCIDR("192.168.1.0/24"); err == nil {
if !reflect.DeepEqual(static.routes, expect) { return *net
t.FailNow() } else {
panic(err)
}
}(),
gateway: net.IPv4(192, 168, 1, 1),
},
},
},
} {
iface, err := parseInterfaceStanza([]string{"eth", "inet", "static"}, tt.options)
if err != nil {
t.Fatalf("bad error (%+v): want nil, got %s\n", tt, err)
}
static, ok := iface.configMethod.(configMethodStatic)
if !ok {
t.Fatalf("bad config method (%+v): want configMethodStatic, got %T\n", tt, iface.configMethod)
}
if !reflect.DeepEqual(static.routes, tt.expect) {
t.Fatalf("bad routes (%+v): want %#v, got %#v\n", tt, tt.expect, static.routes)
}
} }
} }