diff --git a/go.mod b/go.mod index 54cc1b2..8412569 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module git.redxen.eu/caskd/s6-netdev +module git.redxen.eu/nnd/s6-netdev go 1.22.5 diff --git a/hosts/dongguan.china/main.go b/hosts/dongguan.china/main.go deleted file mode 100644 index 6f5ef03..0000000 --- a/hosts/dongguan.china/main.go +++ /dev/null @@ -1,96 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - for _, v := range []string{"p1s0", "p11s0"} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("en%s", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "br-home", - Type: &s6netdev.NetdevIfTypes.Bridge, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - // No IPv6 autoconf - V6: []s6netdev.Property{ - {Key: "accept_ra", Value: "0", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "br-main", - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "br-main", - Slaves: []string{ - "enp1s0", - }, - }, - { - Master: "br-home", - Slaves: []string{ - "enp11s0", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/generic/main.go b/hosts/generic/main.go deleted file mode 100644 index f62bd56..0000000 --- a/hosts/generic/main.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "log" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "eth0", - Type: &s6netdev.NetdevIfTypes.Phys, - }) - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "br0", - Type: &s6netdev.NetdevIfTypes.Bridge, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "br0", - Slaves: []string{ - "eth0", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/izmaylovo.russia/main.go b/hosts/izmaylovo.russia/main.go deleted file mode 100644 index cd937f5..0000000 --- a/hosts/izmaylovo.russia/main.go +++ /dev/null @@ -1,233 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-phys", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 10, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-b00b", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 20, - }) - - // Physical interfaces - for _, v := range []string{"p4s0f0", "p4s0f1", "p2s0f0", "p2s0f1", "p2s0f2", "p2s0f3"} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("en%s", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // VLAN Interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("phys.%d", 66), - Type: &s6netdev.NetdevIfTypes.Vlan, - VlanId: s6netdev.VLAN(66), - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:b00b:921b:eff:fee3:9e84/64"), - }, - Routes: []s6netdev.Route{ - { - Net: netip.MustParsePrefix("2a04:5b81:2060:b00b::/64"), - Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), - Metric: 128, - }, - }, - // Disable autoconf, we statically assign it to have it early - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "autoconf", Value: "0", Default: "1"}, - }, - }, - }) - - // Wireguard interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "wg-tunnel", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("172.22.12.7/32"), - netip.MustParsePrefix("fd42:42:42::2:7/128"), - }, - Routes: []s6netdev.Route{ - {Net: netip.MustParsePrefix("172.22.12.0/24")}, - {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, - }, - }) - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "phys", - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "priority", Value: "16384", Default: "32768"}, - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - {Key: "accept_ra", Value: "0", Default: "1"}, - }, - }, - }) - - // Currently there exists no mechanism to depend routes on the addresses, these are manual deps - phys_addr_v4 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("10.24.0.10/24")) - phys_defrt_v4_vrf := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 4, - Vrf: ifs["vrf-phys"], - Via: netip.MustParseAddr("10.24.0.1"), - Metric: 1024, - }, - ) - phys_defrt_v4_vrf.Children = append(phys_defrt_v4_vrf.Children, phys_addr_v4) - phys_defrt_v4_main := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 4, - Via: netip.MustParseAddr("10.24.0.1"), - Metric: 1024, - }, - ) - phys_defrt_v4_main.Children = append(phys_defrt_v4_main.Children, phys_addr_v4) - - phys_addr_v6 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("2a02:810d:95bf:f999:921b:eff:fee3:9e84/64")) - phys_defrt_v6_vrf := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 6, - Vrf: ifs["vrf-phys"], - Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), - Metric: 1024, - }, - ) - phys_defrt_v6_vrf.Children = append(phys_defrt_v6_vrf.Children, phys_addr_v6) - phys_defrt_v6_main := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 6, - Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), - Metric: 1024, - }, - ) - phys_defrt_v6_main.Children = append(phys_defrt_v6_main.Children, phys_addr_v6) - - // Private Bridges - for _, name := range []string{ - "b00b", - "d00d", - "f33d", - "dn42", - } { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("virbr-%s", name), - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - {Key: "accept_ra", Value: "0", Default: "1"}, - }, - }, - }) - } - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-b00b", - Slaves: []string{ - "phys.66", - }, - }, - { - Master: "vrf-phys", - Slaves: []string{ - "phys", - }, - }, - { - Master: "phys", - Slaves: []string{ - "enp4s0f0", - "enp4s0f1", - "enp2s0f0", - "enp2s0f1", - "enp2s0f2", - "enp2s0f3", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Parent of VLANs - ifs[fmt.Sprintf("phys.%d", 66)].Parent = ifs["phys"] - - // Unreachable routes - for _, vrf := range []string{"vrf-phys", "vrf-b00b"} { - // TODO: iproute2 inconsistency for ipv4? - for _, ver := range []int{6} { - ifs["lo"].Routes = append(ifs["lo"].Routes, - s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: ver, - Vrf: ifs[vrf], - Metric: 4278198272, - }, - ) - } - } - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/lakewood.united-states/main.go b/hosts/lakewood.united-states/main.go deleted file mode 100644 index 5bc31df..0000000 --- a/hosts/lakewood.united-states/main.go +++ /dev/null @@ -1,333 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - for _, v := range []int{2, 13, 16, 17, 18} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("enp%ds0", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // VLAN Interfaces - for _, v := range []int{42, 66, 100, 101} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("phys.%d", v), - Type: &s6netdev.NetdevIfTypes.Vlan, - VlanId: s6netdev.VLAN(v), - }) - } - - // Wireguard interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "famfo", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::1422:1/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "mark22k", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::4546/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "highdef", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "kioubit", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "lare", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "haktron", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "vultrbgp", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("fe80::2/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "phys", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x52, 0x54, 0x00, 0xf4, 0x2b, 0xd1}, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "br-dn42", - Type: &s6netdev.NetdevIfTypes.Bridge, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "b00b", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xb0, 0x0b}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:b00b::1/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "f33d", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xf3, 0x3d}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:f33d::1/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "d00d", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xd0, 0x0d}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:d00d::1/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-dn42", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 20, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-v6", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 10, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-dn42", - Slaves: []string{ - "br-dn42", - "famfo", - "mark22k", - "highdef", - "kioubit", - "lare", - "haktron", - }, - }, - { - Master: "vrf-v6", - Slaves: []string{ - "vultrbgp", - "b00b", - "f33d", - "d00d", - }, - }, - { - Master: "phys", - Slaves: []string{ - "enp13s0", - }, - }, - { - Master: "b00b", - Slaves: []string{ - "enp16s0", - "phys.66", - }, - }, - { - Master: "br-dn42", - Slaves: []string{ - "enp2s0", - "phys.42", - }, - }, - { - Master: "f33d", - Slaves: []string{ - "enp17s0", - "phys.100", - }, - }, - { - Master: "d00d", - Slaves: []string{ - "enp18s0", - "phys.101", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Parent of VLANs - for _, v := range []int{42, 66, 100, 101} { - ifs[fmt.Sprintf("phys.%d", v)].Parent = ifs["phys"] - } - - // Unreachable routes - ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ - Type: "unreachable", - Net: netip.MustParsePrefix("2a04:5b81:2060::/44"), - Vrf: ifs["vrf-v6"], - Metric: 4278198272, - }, s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: 6, - Vrf: ifs["vrf-dn42"], - Metric: 4278198272, - }) - - // Self-referencing - ifs["vultrbgp"].Routes = append(ifs["vultrbgp"].Routes, s6netdev.Route{ - Default: true, - IPver: 6, - Vrf: ifs["vrf-v6"], - }) - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/mangong.taiwan/main.go b/hosts/mangong.taiwan/main.go deleted file mode 100644 index 0c5f9d5..0000000 --- a/hosts/mangong.taiwan/main.go +++ /dev/null @@ -1,118 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - for _, v := range []string{"p1s0", "p9s0"} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("en%s", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "br-home", - Type: &s6netdev.NetdevIfTypes.Bridge, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - // No IPv6 autoconf - V6: []s6netdev.Property{ - {Key: "accept_ra", Value: "0", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "br-main", - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-v6", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 10, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-v6", - Slaves: []string{ - "br-main", - }, - }, - { - Master: "br-main", - Slaves: []string{ - "enp1s0", - }, - }, - { - Master: "br-home", - Slaves: []string{ - "enp9s0", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Unreachable routes - ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ - Default: true, - IPver: 6, - Type: "unreachable", - Vrf: ifs["vrf-v6"], - Metric: 4278198272, - }) - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/mika.frankfurt/main.go b/hosts/mika.frankfurt/main.go deleted file mode 100644 index b0bdc80..0000000 --- a/hosts/mika.frankfurt/main.go +++ /dev/null @@ -1,138 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-wgate", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 20, - }) - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "br-uplink", - Type: &s6netdev.NetdevIfTypes.Bridge, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "accept_ra", Value: "2", Default: "0"}, - }, - }, - }) - - // Physical interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("enp1s0"), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - - // Wireguard interfaces - for _, v := range []struct{ ifn, ll, route string }{ - {ifn: "tristan", ll: "fe80::1/64", route: "2a04:5b81:2010::/48"}, - {ifn: "tristan-travel", ll: "fe80::1/64", route: "2a04:5b81:201f::/48"}, - {ifn: "gustav", ll: "fe80::1/64", route: "2a04:5b81:2011::/48"}, - {ifn: "caskd-lakewood", ll: "fe80::1/64", route: "2a04:5b81:2060::/48"}, - } { - ifs.AddIf(&s6netdev.Iface{ - Name: v.ifn, - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{netip.MustParsePrefix(v.ll)}, - Routes: []s6netdev.Route{ - {Net: netip.MustParsePrefix(v.route), Vrf: ifs["vrf-wgate"]}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - } - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-wgate", - Slaves: []string{ - "br-uplink", - "tristan", - "tristan-travel", - "gustav", - "caskd-lakewood", - }, - }, - { - Master: "br-uplink", - Slaves: []string{ - "enp1s0", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Unreachable routes - ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ - Type: "unreachable", - Net: netip.MustParsePrefix("2a04:5b81:2060::/44"), - Vrf: ifs["vrf-wgate"], - Metric: 4096, - }, s6netdev.Route{ - Type: "unreachable", - Net: netip.MustParsePrefix("2a04:5b81:2010::/44"), - Vrf: ifs["vrf-wgate"], - Metric: 4096, - }, s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: 6, - Vrf: ifs["vrf-wgate"], - Metric: 4278198272, - }) - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/san-jorge.argentina/main.go b/hosts/san-jorge.argentina/main.go deleted file mode 100644 index eea32ac..0000000 --- a/hosts/san-jorge.argentina/main.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - for _, v := range []string{"p1s0"} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("en%s", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "br-v6", - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - // Wireguard interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "wg-tunnel", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("172.22.12.8/32"), - netip.MustParsePrefix("fd42:42:42::2:8/128"), - }, - Routes: []s6netdev.Route{ - {Net: netip.MustParsePrefix("172.22.12.0/24")}, - {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, - {Default: true, IPver: 4}, - }, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "br-v6", - Slaves: []string{ - "enp1s0", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/tarui.japan/main.go b/hosts/tarui.japan/main.go deleted file mode 100644 index 21f41e3..0000000 --- a/hosts/tarui.japan/main.go +++ /dev/null @@ -1,233 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-phys", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 10, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-b00b", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 20, - }) - - // Physical interfaces - for _, v := range []string{"p129s0f0", "p129s0f1", "p131s0f0", "p131s0f1", "p131s0f2", "p131s0f3"} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("en%s", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // VLAN Interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("phys.%d", 66), - Type: &s6netdev.NetdevIfTypes.Vlan, - VlanId: s6netdev.VLAN(66), - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:b00b:921b:eff:fe53:8b67/64"), - }, - Routes: []s6netdev.Route{ - { - Net: netip.MustParsePrefix("2a04:5b81:2060:b00b::/64"), - Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), - Metric: 128, - }, - }, - // Disable autoconf, we statically assign it to have it early - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "autoconf", Value: "0", Default: "1"}, - }, - }, - }) - - // Wireguard interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "wg-tunnel", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("172.22.12.7/32"), - netip.MustParsePrefix("fd42:42:42::2:7/128"), - }, - Routes: []s6netdev.Route{ - {Net: netip.MustParsePrefix("172.22.12.0/24")}, - {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, - }, - }) - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "phys", - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "priority", Value: "16384", Default: "32768"}, - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - {Key: "accept_ra", Value: "0", Default: "1"}, - }, - }, - }) - - // Currently there exists no mechanism to depend routes on the addresses, these are manual deps - phys_addr_v4 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("10.24.0.11/24")) - phys_defrt_v4_vrf := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 4, - Vrf: ifs["vrf-phys"], - Via: netip.MustParseAddr("10.24.0.1"), - Metric: 1024, - }, - ) - phys_defrt_v4_vrf.Children = append(phys_defrt_v4_vrf.Children, phys_addr_v4) - phys_defrt_v4_main := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 4, - Via: netip.MustParseAddr("10.24.0.1"), - Metric: 1024, - }, - ) - phys_defrt_v4_main.Children = append(phys_defrt_v4_main.Children, phys_addr_v4) - - phys_addr_v6 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("2a02:810d:95bf:f999:921b:eff:fe55:75ab/64")) - phys_defrt_v6_vrf := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 6, - Vrf: ifs["vrf-phys"], - Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), - Metric: 1024, - }, - ) - phys_defrt_v6_vrf.Children = append(phys_defrt_v6_vrf.Children, phys_addr_v6) - phys_defrt_v6_main := t.NetdevRoute(*ifs["phys"], - s6netdev.Route{ - Default: true, - IPver: 6, - Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), - Metric: 1024, - }, - ) - phys_defrt_v6_main.Children = append(phys_defrt_v6_main.Children, phys_addr_v6) - - // Private Bridges - for _, name := range []string{ - "b00b", - "d00d", - "f33d", - "dn42", - } { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("virbr-%s", name), - Type: &s6netdev.NetdevIfTypes.Bridge, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - {Key: "accept_ra", Value: "0", Default: "1"}, - }, - }, - }) - } - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-b00b", - Slaves: []string{ - "phys.66", - }, - }, - { - Master: "vrf-phys", - Slaves: []string{ - "phys", - }, - }, - { - Master: "phys", - Slaves: []string{ - "enp129s0f0", - "enp129s0f1", - "enp131s0f0", - "enp131s0f1", - "enp131s0f2", - "enp131s0f3", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Parent of VLANs - ifs[fmt.Sprintf("phys.%d", 66)].Parent = ifs["phys"] - - // Unreachable routes - for _, vrf := range []string{"vrf-phys", "vrf-b00b"} { - // TODO: iproute2 inconsistency for ipv4? - for _, ver := range []int{6} { - ifs["lo"].Routes = append(ifs["lo"].Routes, - s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: ver, - Vrf: ifs[vrf], - Metric: 4278198272, - }, - ) - } - } - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -} diff --git a/hosts/thetford-mines.canada/main.go b/hosts/thetford-mines.canada/main.go deleted file mode 100644 index 8470d25..0000000 --- a/hosts/thetford-mines.canada/main.go +++ /dev/null @@ -1,269 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "net/netip" - "os" - - "git.redxen.eu/caskd/s6-netdev" -) - -func main() { - var ( - err error - l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) - ifs = make(s6netdev.IfMap) - ) - t := s6netdev.S6NewTree() - - // Loopback - ifs.AddIf(&s6netdev.Iface{ - Name: "lo", - Type: &s6netdev.NetdevIfTypes.Loopback, - }) - - // Physical interfaces - for _, v := range []int{9, 12, 13, 14, 15} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("enp%ds0", v), - Type: &s6netdev.NetdevIfTypes.Phys, - }) - } - - // VLAN Interfaces - for _, v := range []int{42, 66, 100, 101} { - ifs.AddIf(&s6netdev.Iface{ - Name: fmt.Sprintf("phys.%d", v), - Type: &s6netdev.NetdevIfTypes.Vlan, - VlanId: s6netdev.VLAN(v), - }) - } - - // Bridge interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "phys", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x52, 0x54, 0x00, 0x81, 0xcb, 0x62}, - DHCP: s6netdev.DHCP_IP{V4: true}, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "1", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "0", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "br-dn42", - Type: &s6netdev.NetdevIfTypes.Bridge, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "b00b", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xb0, 0x0b}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:b00b::2/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "f33d", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xf3, 0x3d}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:f33d::2/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - ifs.AddIf(&s6netdev.Iface{ - Name: "d00d", - Type: &s6netdev.NetdevIfTypes.Bridge, - MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xd0, 0x0d}, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("2a04:5b81:2060:d00d::2/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - {Key: "autoconf", Value: "0", Default: "0"}, - }, - }, - Properties: []s6netdev.Property{ - {Key: "stp_state", Value: "0", Default: "0"}, - {Key: "mcast_snooping", Value: "0", Default: "1"}, - }, - }) - - // VRFs - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-dn42", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 20, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - ifs.AddIf(&s6netdev.Iface{ - Name: "vrf-v6", - Type: &s6netdev.NetdevIfTypes.Vrf, - Table: 10, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - // Wireguard interfaces - ifs.AddIf(&s6netdev.Iface{ - Name: "vultrbgp", - Type: &s6netdev.NetdevIfTypes.Wireguard, - Addresses: []netip.Prefix{ - netip.MustParsePrefix("fe80::2/64"), - }, - Sysctls: s6netdev.Sysctl_IP{ - V6: []s6netdev.Property{ - {Key: "forwarding", Value: "1", Default: "0"}, - }, - }, - }) - - for _, m := range []struct { - Master string - Slaves []string - }{ - { - Master: "vrf-dn42", - Slaves: []string{ - "br-dn42", - }, - }, - { - Master: "vrf-v6", - Slaves: []string{ - "vultrbgp", - "b00b", - "f33d", - "d00d", - }, - }, - { - Master: "phys", - Slaves: []string{ - "enp12s0", - }, - }, - { - Master: "b00b", - Slaves: []string{ - "enp9s0", - "phys.66", - }, - }, - { - Master: "br-dn42", - Slaves: []string{ - "enp15s0", - "phys.42", - }, - }, - { - Master: "f33d", - Slaves: []string{ - "enp14s0", - "phys.100", - }, - }, - { - Master: "d00d", - Slaves: []string{ - "enp13s0", - "phys.101", - }, - }, - } { - master := ifs[m.Master] - for _, slave := range m.Slaves { - master.Slaves = append(master.Slaves, ifs[slave]) - } - ifs[m.Master] = master - } - - // Parent of VLANs - for _, v := range []int{42, 66, 100, 101} { - ifs[fmt.Sprintf("phys.%d", v)].Parent = ifs["phys"] - } - - // Unreachable routes - ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: 6, - Vrf: ifs["vrf-v6"], - Metric: 4278198272, - }, s6netdev.Route{ - Type: "unreachable", - Default: true, - IPver: 6, - Vrf: ifs["vrf-dn42"], - Metric: 4278198272, - }) - - // Default router for vrf (defrtr from ra isn't installed if autoconf not enabled) - ifs["b00b"].Routes = append(ifs["b00b"].Routes, s6netdev.Route{ - Default: true, - Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), // Link local of lakewood.united-states - Vrf: ifs["vrf-v6"], - Metric: 4096, - }) - - for _, v := range ifs { - t.Services(*v) - } - - for _, v := range t.S6Services() { - if s6netdev.NetdevIsDummy(v.Name) { - continue - } - l.Printf("Commiting %s\n", v.Name) - if err = t.S6CommitService(v); err != nil { - l.Fatalf("Failed to commit %s, %s\n", v.Name, err) - } - } -}