create a module for round-robin
This commit is contained in:
parent
b17f623d03
commit
3899daee56
@ -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 { };
|
||||||
|
|
||||||
|
27
modules/round-robin/default.nix
Normal file
27
modules/round-robin/default.nix
Normal 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;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
32
modules/round-robin/service.nix
Normal file
32
modules/round-robin/service.nix
Normal 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
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user