148 lines
3.8 KiB
Go
148 lines
3.8 KiB
Go
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
|
|
}
|