forked from DGNum/liminix
shell-customization #4
4 changed files with 51 additions and 22 deletions
|
@ -20,6 +20,7 @@ in
|
|||
system.service.bridge = {
|
||||
primary = mkOption { type = liminix.lib.types.serviceDefn; };
|
||||
members = mkOption { type = liminix.lib.types.serviceDefn; };
|
||||
ready = mkOption { type = liminix.lib.types.serviceDefn; };
|
||||
};
|
||||
};
|
||||
config.system.service.bridge = {
|
||||
|
@ -46,6 +47,19 @@ in
|
|||
description = "interfaces to add to the bridge";
|
||||
};
|
||||
};
|
||||
|
||||
# TODO: generalize it outside
|
||||
ready = config.system.callService ./ready.nix {
|
||||
primary = mkOption {
|
||||
type = liminix.lib.types.service;
|
||||
description = "primary bridge interface";
|
||||
};
|
||||
|
||||
members = mkOption {
|
||||
type = liminix.lib.types.service;
|
||||
description = "members service";
|
||||
};
|
||||
};
|
||||
};
|
||||
config.kernel.config = {
|
||||
BRIDGE = "y";
|
||||
|
|
|
@ -10,26 +10,19 @@ let
|
|||
inherit (liminix.networking) interface;
|
||||
inherit (liminix.services) bundle oneshot;
|
||||
inherit (lib) mkOption types;
|
||||
addif = member :
|
||||
# how do we get sight of services from here? maybe we need to
|
||||
# implement ifwait as a regualr derivation instead of a
|
||||
# servicedefinition
|
||||
svc.ifwait.build {
|
||||
state = "running";
|
||||
interface = member;
|
||||
dependencies = [ primary member ];
|
||||
service = oneshot {
|
||||
name = "${primary.name}.member.${member.name}";
|
||||
up = ''
|
||||
echo "attaching $(output ${member} ifname) to $(output ${primary} ifname) bridge"
|
||||
ip link set dev $(output ${member} ifname) master $(output ${primary} ifname)
|
||||
'';
|
||||
down = ''
|
||||
echo "detaching $(output ${member} ifname) from any bridge"
|
||||
ip link set dev $(output ${member} ifname) nomaster
|
||||
'';
|
||||
};
|
||||
};
|
||||
addif = member : oneshot {
|
||||
name = "${primary.name}.member.${member.name}";
|
||||
up = ''
|
||||
echo "attaching $(output ${member} ifname) to $(output ${primary} ifname) bridge"
|
||||
ip link set dev $(output ${member} ifname) master $(output ${primary} ifname)
|
||||
'';
|
||||
down = ''
|
||||
echo "detaching $(output ${member} ifname) from any bridge"
|
||||
ip link set dev $(output ${member} ifname) nomaster
|
||||
'';
|
||||
|
||||
dependencies = [ primary member ];
|
||||
};
|
||||
in bundle {
|
||||
name = "${primary.name}.members";
|
||||
contents = map addif members;
|
||||
|
|
|
@ -14,9 +14,13 @@ in oneshot rec {
|
|||
"ip link add name ${ifname} type bridge"
|
||||
else
|
||||
"ip link add name ${ifname} address $(output ${macAddressFromInterface} ether) type bridge"}
|
||||
${liminix.networking.ifup name ifname}
|
||||
|
||||
(in_outputs ${name}
|
||||
echo ${ifname} > ifname
|
||||
cat /sys/class/net/${ifname}/address > ether
|
||||
)
|
||||
'';
|
||||
down = "ip link set down dev ${ifname}";
|
||||
down = "ip link delete ${ifname}";
|
||||
|
||||
dependencies = optional (macAddressFromInterface != null) macAddressFromInterface;
|
||||
}
|
||||
|
|
18
modules/bridge/ready.nix
Normal file
18
modules/bridge/ready.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
liminix
|
||||
, ifwait
|
||||
, lib
|
||||
}:
|
||||
{ primary, members } :
|
||||
let
|
||||
inherit (liminix.services) oneshot;
|
||||
in oneshot {
|
||||
name = "${primary.name}.oper";
|
||||
up = ''
|
||||
ip link set up dev $(output ${primary} ifname)
|
||||
${ifwait}/bin/ifwait -v $(output ${primary} ifname) running
|
||||
'';
|
||||
down = "ip link set down dev $(output ${primary} ifname)";
|
||||
|
||||
dependencies = [ members ];
|
||||
}
|
Loading…
Reference in a new issue