1
0
Fork 0

create a module for round-robin

This commit is contained in:
Daniel Barlow 2024-07-15 22:37:37 +01:00
parent b17f623d03
commit 3899daee56
4 changed files with 69 additions and 28 deletions

View File

@ -47,6 +47,7 @@ in rec {
../modules/watchdog ../modules/watchdog
../modules/mount ../modules/mount
../modules/ppp ../modules/ppp
../modules/round-robin
]; ];
hostname = "thing"; hostname = "thing";
@ -59,17 +60,7 @@ in rec {
services.wan = services.wan =
let let
controller = longrun rec { pppoe = svc.pppoe.build {
name = "wan-switcher";
run = ''
in_outputs ${name}
exec ${pkgs.s6-rc-round-robin}/bin/s6-rc-round-robin \
-p ${proxy.name} \
${lib.concatStringsSep " "
(builtins.map (f: f.name) [pppoe l2tp])}
'';
};
pppoe = (svc.pppoe.build {
interface = config.hardware.networkInterfaces.wan; interface = config.hardware.networkInterfaces.wan;
ppp-options = [ ppp-options = [
@ -77,7 +68,7 @@ in rec {
"name" rsecrets.l2tp.name "name" rsecrets.l2tp.name
"password" rsecrets.l2tp.password "password" rsecrets.l2tp.password
]; ];
}).overrideAttrs(o: { inherit controller; }); };
l2tp = l2tp =
let let
@ -91,7 +82,7 @@ in rec {
target = lns.address; target = lns.address;
dependencies = [services.dhcpc check-address]; dependencies = [services.dhcpc check-address];
}; };
in (svc.l2tp.build { in svc.l2tp.build {
lns = lns.address; lns = lns.address;
ppp-options = [ ppp-options = [
"debug" "+ipv6" "noauth" "debug" "+ipv6" "noauth"
@ -99,20 +90,11 @@ in rec {
"password" rsecrets.l2tp.password "password" rsecrets.l2tp.password
]; ];
dependencies = [config.services.lns-address route check-address]; dependencies = [config.services.lns-address route check-address];
}).overrideAttrs(o: { inherit controller; }); };
proxy = oneshot rec { in svc.round-robin.build {
name = "wan-proxy"; name = "wan";
inherit controller; services = [ l2tp pppoe ];
buildInputs = [ pppoe l2tp]; };
up = ''
echo start proxy ${name}
set -x
(in_outputs ${name}
cp -rv $(output_path ${controller} active)/* .
)
'';
};
in proxy;
services.sshd = svc.ssh.build { }; services.sshd = svc.ssh.build { };

View File

@ -0,0 +1,27 @@
## Round Robin
##
## Given a list of services, run each in turn until it exits, then
## runs the next.
{ lib, pkgs, config, ...}:
let
inherit (lib) mkOption types;
inherit (pkgs) liminix;
inherit (pkgs.liminix.services) longrun;
in {
options = {
system.service.round-robin = mkOption {
description = "run services one at a time and failover to next";
type = liminix.lib.types.serviceDefn;
};
};
config.system.service.round-robin = config.system.callService ./service.nix {
services = mkOption {
type = types.listOf liminix.lib.types.service;
};
name = mkOption {
type = types.str;
};
};
}

View File

@ -0,0 +1,32 @@
{
liminix, lib, s6-rc-round-robin
}:
{ services, name} :
let
inherit (liminix.services) oneshot longrun;
controlled-services = builtins.map
(s: s.overrideAttrs(o: { inherit controller; }))
services;
controller = let name' = "control-${name}"; in longrun {
name = name';
run = ''
in_outputs ${name'}
exec ${s6-rc-round-robin}/bin/s6-rc-round-robin \
-p ${proxy.name} \
${lib.concatStringsSep " "
(builtins.map (f: f.name) controlled-services)}
'';
};
proxy = oneshot rec {
inherit name;
inherit controller;
buildInputs = controlled-services;
up = ''
echo start proxy ${name}
set -x
(in_outputs ${name}
cp -rv $(output_path ${controller} active)/* .
)
'';
};
in proxy

View File

@ -13,7 +13,7 @@ stdenv.mkDerivation {
propagatedBuildInputs = [ s6-rc-up-tree ]; propagatedBuildInputs = [ s6-rc-up-tree ];
installPhase = '' installPhase = ''
mkdir -p $out/bin mkdir -p $out/bin
cp -p ${writeFennel "uevent-watch" { cp -p ${writeFennel "s6-rc-round-robin" {
packages = [fennel anoia linotify lualinux s6-rc-up-tree] ; packages = [fennel anoia linotify lualinux s6-rc-up-tree] ;
mainFunction = "run"; mainFunction = "run";
} ./robin.fnl} $out/bin/s6-rc-round-robin } ./robin.fnl} $out/bin/s6-rc-round-robin