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":
if _, dst, err := net.ParseCIDR(fields[i+1]); err == nil {
route.destination = *dst
} else {
route.destination.IP = net.ParseIP(fields[i+1]) 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,12 +285,17 @@ func TestBadParseInterfaceStanzasStaticPostUp(t *testing.T) {
} }
func TestParseInterfaceStanzaStaticPostUp(t *testing.T) { func TestParseInterfaceStanzaStaticPostUp(t *testing.T) {
options := []string{ for _, tt := range []struct {
options []string
expect []route
}{
{
options: []string{
"address 192.168.1.100", "address 192.168.1.100",
"netmask 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", "post-up route add gw 192.168.1.1 -net 192.168.1.0 netmask 255.255.255.0",
} },
expect := []route{ expect: []route{
{ {
destination: net.IPNet{ destination: net.IPNet{
IP: net.IPv4(192, 168, 1, 0), IP: net.IPv4(192, 168, 1, 0),
@ -298,18 +303,39 @@ func TestParseInterfaceStanzaStaticPostUp(t *testing.T) {
}, },
gateway: net.IPv4(192, 168, 1, 1), gateway: net.IPv4(192, 168, 1, 1),
}, },
},
},
{
options: []string{
"address 192.168.1.100",
"netmask 255.255.255.0",
"post-up route add gw 192.168.1.1 -net 192.168.1.0/24 || true",
},
expect: []route{
{
destination: func() net.IPNet {
if _, net, err := net.ParseCIDR("192.168.1.0/24"); err == nil {
return *net
} else {
panic(err)
} }
}(),
iface, err := parseInterfaceStanza([]string{"eth", "inet", "static"}, options) gateway: net.IPv4(192, 168, 1, 1),
},
},
},
} {
iface, err := parseInterfaceStanza([]string{"eth", "inet", "static"}, tt.options)
if err != nil { if err != nil {
t.FailNow() t.Fatalf("bad error (%+v): want nil, got %s\n", tt, err)
} }
static, ok := iface.configMethod.(configMethodStatic) static, ok := iface.configMethod.(configMethodStatic)
if !ok { if !ok {
t.FailNow() 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)
} }
if !reflect.DeepEqual(static.routes, expect) {
t.FailNow()
} }
} }