package s6netdev import ( "fmt" "strings" ) func (t *S6SvcTree) CreateIfaceService(iface string) *S6Svc { return t.S6New(S6SvcName(fmt.Sprintf("interface.%s.create", iface)), &S6SvcTypes.Oneshot) } func (t *S6SvcTree) LinkIfaceService(iface string) *S6Svc { return t.S6New(S6SvcName(fmt.Sprintf("interface.%s.link", iface)), &S6SvcTypes.Oneshot) } func (t *S6SvcTree) Services(i Iface) (r []*S6Svc) { r = append(r, t.ConfigureServices(i)...) r = append(r, t.ReadyServices(i)...) return } func (t *S6SvcTree) ConfigureServices(i Iface) (r []*S6Svc) { svc_create := t.CreateIfaceService(i.Name) r = append(r, svc_create) // Defaults to be overridden svc_create.Up = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), fmt.Sprintf("ip link add $INTERFACE type %s", i.Type.str), }, "\n") svc_create.Down = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), "ip link del dev $INTERFACE", }, "\n") for _, v := range i.Type.deps { // External dummy services, should be ignored at commit cs := t.S6New(S6SvcName(v), &S6SvcTypes.Oneshot) svc_create.S6Children(cs) } // Overrides switch i.Type { case &NetdevIfTypes.Phys: fallthrough case &NetdevIfTypes.Loopback: { svc_create.Up = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), "bcnm-waitif 1 $INTERFACE", }, "\n") svc_create.Down = "" } case &NetdevIfTypes.Vlan: { svc_create.Up = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), ExeclineDefine("PARENT", i.Parent.Name), ExeclineDefine("VLAN", fmt.Sprintf("%d", i.VlanId)), fmt.Sprintf("ip link add link $PARENT name $INTERFACE type %s id $VLAN", i.Type.str), }, "\n") svc_create.S6Children(t.CreateIfaceService(i.Parent.Name)) } case &NetdevIfTypes.Vrf: { // Default if no table defined if i.Table == 0 { i.Table = RouteTable(512) } svc_create.Up = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), ExeclineDefine("TABLE", fmt.Sprintf("%d", i.Table)), fmt.Sprintf("ip link add $INTERFACE type %s table $TABLE", i.Type.str), }, "\n") } case &NetdevIfTypes.Wireguard: { t.NetdevDependBundleStage(i.Name, "configure", t.NetdevWireguardConfig(i)) } } for _, v := range i.Slaves { r = append(r, t.NetdevEnslaveInterface(v.Name, i.Name)) } for _, v := range i.Properties { r = append(r, t.NetdevIfaceProp(i, v)) } if i.DHCP.V4 { r = append(r, t.NetdevIfaceDHCP(i, 4)) } if i.DHCP.V6 { r = append(r, t.NetdevIfaceDHCP(i, 6)) } for _, v := range i.Sysctls.V4 { r = append(r, t.NetdevIfaceIpSysctl(i, 4, v)) } for _, v := range i.Sysctls.V6 { r = append(r, t.NetdevIfaceIpSysctl(i, 6, v)) } for _, v := range i.Addresses { r = append(r, t.NetdevIfaceAddr(i, v)) } for _, v := range i.Routes { r = append(r, t.NetdevRoute(i, v)) } if i.MACAddr != nil { r = append(r, t.NetdevConfigureIfaceMAC(i, i.MACAddr)) } bundle_configure := t.NetdevDependBundleStage(i.Name, "configure", svc_create) r = append(r, bundle_configure) r = append(r, svc_create.Children...) return } func (t *S6SvcTree) ReadyServices(i Iface) (r []*S6Svc) { svc_link := t.S6New(S6SvcName(fmt.Sprintf("interface.%s.link", i.Name)), &S6SvcTypes.Oneshot) r = append(r, svc_link) svc_link.Up = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), "ip link set dev $INTERFACE up", }, "\n") svc_link.Down = strings.Join([]string{ NETDEV_EXECLINE_HEADER, ExeclineDefine("INTERFACE", i.Name), "ip link set dev $INTERFACE down", }, "\n") svc_link.S6Children(t.netdevCreateBundleStage(i.Name, "configure")) bundle_ready := t.NetdevDependBundleStage(i.Name, "ready", svc_link) r = append(r, bundle_ready) return }