Compare commits
No commits in common. "d5ccecf0384a51f3b6c0a2c4c952d9100d30edeb" and "1b1aa9de76d9ea504a10931b15d24757ba6d2a72" have entirely different histories.
d5ccecf038
...
1b1aa9de76
|
@ -75,7 +75,7 @@ Sun Sep 25 20:56:28 BST 2022
|
||||||
|
|
||||||
TODO - bugs, missing bits, other infelicities as they occur to me:
|
TODO - bugs, missing bits, other infelicities as they occur to me:
|
||||||
|
|
||||||
DONE 1) shutdown doesn't work as its using the busybox one not s6.
|
1) shutdown doesn't work as its using the busybox one not s6.
|
||||||
|
|
||||||
2) perhaps we shouldn't have process-based services like dhcp, ppp
|
2) perhaps we shouldn't have process-based services like dhcp, ppp
|
||||||
implement "address provider interface" - instead have a separate
|
implement "address provider interface" - instead have a separate
|
||||||
|
@ -102,7 +102,7 @@ look for obvious wastes of space
|
||||||
8) some of configuration.nix (e.g. defining routes) should be moved into
|
8) some of configuration.nix (e.g. defining routes) should be moved into
|
||||||
tools
|
tools
|
||||||
|
|
||||||
DONE 9) split tools up instead of having it all one file
|
9) split tools up instead of having it all one file
|
||||||
|
|
||||||
10) is it OK to depend on squashfs pseudofiles if we might want to
|
10) is it OK to depend on squashfs pseudofiles if we might want to
|
||||||
switch to ubifs? will there always be a squashfs underneath? might
|
switch to ubifs? will there always be a squashfs underneath? might
|
||||||
|
@ -120,12 +120,10 @@ we want to change the pseudofiles in an overlay?
|
||||||
is that specified or fluke?
|
is that specified or fluke?
|
||||||
|
|
||||||
16) tighten up the module specs. (DONE) services.foo should be a s6-rc
|
16) tighten up the module specs. (DONE) services.foo should be a s6-rc
|
||||||
service, (DONE) kernel config should be checked in some way
|
service, kernel config should be checked in some way
|
||||||
|
|
||||||
DONE 17) rename nixwrt references in kernel builder
|
DONE 17) rename nixwrt references in kernel builder
|
||||||
|
|
||||||
18) maybe stop suffixing all the service names with .service
|
18) maybe stop suffixing all the service names with .service
|
||||||
|
|
||||||
19) syslogd - use busybox or s6?
|
|
||||||
|
|
||||||
chat -s -S ogin:--ogin: root / "ip address show dev ppp0 | grep ppp0" 192.168.100.1 "/nix/store/*-s6-linux-init-*/bin/s6-linux-init-hpr -p"
|
chat -s -S ogin:--ogin: root / "ip address show dev ppp0 | grep ppp0" 192.168.100.1 "/nix/store/*-s6-linux-init-*/bin/s6-linux-init-hpr -p"
|
||||||
|
|
|
@ -39,7 +39,7 @@ let
|
||||||
};
|
};
|
||||||
s6-pseudofiles = pkgs.s6-init-files;
|
s6-pseudofiles = pkgs.s6-init-files;
|
||||||
profile = writeScript ".profile" ''
|
profile = writeScript ".profile" ''
|
||||||
PATH=${lib.makeBinPath (with pkgs; [ s6-init-bin busybox execline s6-linux-init s6-rc])}
|
PATH=${lib.makeBinPath (with pkgs; [busybox execline s6-linux-init s6-rc])}
|
||||||
export PATH
|
export PATH
|
||||||
'';
|
'';
|
||||||
pseudofiles = writeText "pseudofiles" ''
|
pseudofiles = writeText "pseudofiles" ''
|
||||||
|
@ -60,7 +60,7 @@ let
|
||||||
/sys d 0555 root root
|
/sys d 0555 root root
|
||||||
/dev/pts d 0755 0 0
|
/dev/pts d 0755 0 0
|
||||||
/etc/init.d d 0755 0 0
|
/etc/init.d d 0755 0 0
|
||||||
/bin/init s 0755 0 0 ${pkgs.s6-init-bin}/bin/init
|
/bin/init s 0755 0 0 /etc/s6-linux-init/current/bin/init
|
||||||
/bin/sh s 0755 0 0 ${pkgs.pkgsStatic.busybox}/bin/sh
|
/bin/sh s 0755 0 0 ${pkgs.pkgsStatic.busybox}/bin/sh
|
||||||
/bin/busybox s 0755 0 0 ${pkgs.busybox}/bin/busybox
|
/bin/busybox s 0755 0 0 ${pkgs.busybox}/bin/busybox
|
||||||
/etc/s6-rc d 0755 0 0
|
/etc/s6-rc d 0755 0 0
|
||||||
|
|
|
@ -15,15 +15,8 @@ in {
|
||||||
services = mkOption {
|
services = mkOption {
|
||||||
type = types.attrsOf type_service;
|
type = types.attrsOf type_service;
|
||||||
};
|
};
|
||||||
kernel = {
|
kernel = mkOption {
|
||||||
config = mkOption {
|
type = types.anything;
|
||||||
# mostly the values are y n or m, but sometimes
|
|
||||||
# other strings are also used
|
|
||||||
type = types.attrsOf types.nonEmptyStr;
|
|
||||||
};
|
|
||||||
checkedConfig = mkOption {
|
|
||||||
type = types.attrsOf types.nonEmptyStr;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,9 @@ final: prev: {
|
||||||
pseudofile = final.callPackage ./pkgs/pseudofile {};
|
pseudofile = final.callPackage ./pkgs/pseudofile {};
|
||||||
s6-init-files = final.callPackage ./pkgs/s6-init-files {};
|
s6-init-files = final.callPackage ./pkgs/s6-init-files {};
|
||||||
strace = prev.strace.override { libunwind = null; };
|
strace = prev.strace.override { libunwind = null; };
|
||||||
liminix = {
|
liminix = final.callPackage ./pkgs/liminix-tools {};
|
||||||
services = final.callPackage ./pkgs/liminix-tools/services {};
|
|
||||||
networking = final.callPackage ./pkgs/liminix-tools/networking {};
|
|
||||||
};
|
|
||||||
writeAshScript = final.callPackage ./pkgs/write-ash-script {};
|
writeAshScript = final.callPackage ./pkgs/write-ash-script {};
|
||||||
|
|
||||||
s6-init-bin = final.callPackage ./pkgs/s6-init-bin {};
|
|
||||||
|
|
||||||
pppoe = prev.rpPPPoE.overrideAttrs (o: {
|
pppoe = prev.rpPPPoE.overrideAttrs (o: {
|
||||||
# use newer rp-pppoe, it builds cleanly
|
# use newer rp-pppoe, it builds cleanly
|
||||||
src = final.fetchFromGitHub {
|
src = final.fetchFromGitHub {
|
||||||
|
|
|
@ -5,10 +5,8 @@
|
||||||
, busybox
|
, busybox
|
||||||
, callPackage
|
, callPackage
|
||||||
, writeAshScript
|
, writeAshScript
|
||||||
}:
|
} :let
|
||||||
let
|
|
||||||
inherit (builtins) concatStringsSep;
|
inherit (builtins) concatStringsSep;
|
||||||
output = service: name: "/run/service-state/${service.name}/${name}";
|
|
||||||
longrun = {
|
longrun = {
|
||||||
name
|
name
|
||||||
, run
|
, run
|
||||||
|
@ -63,6 +61,33 @@ let
|
||||||
builder = ./builder.sh;
|
builder = ./builder.sh;
|
||||||
};
|
};
|
||||||
bundle = { name, ... } @args : target (args // { name = "${name}.bundle";});
|
bundle = { name, ... } @args : target (args // { name = "${name}.bundle";});
|
||||||
|
|
||||||
in {
|
in {
|
||||||
inherit target bundle oneshot longrun output;
|
networking = {
|
||||||
|
interface = { type, device } @ args: oneshot {
|
||||||
|
name = "${device}.link";
|
||||||
|
up = "ip link set up dev ${device}";
|
||||||
|
down = "ip link set down dev ${device}";
|
||||||
|
} // {
|
||||||
|
inherit device;
|
||||||
|
};
|
||||||
|
address = interface: { family, prefixLength, address } @ args:
|
||||||
|
let inherit (builtins) toString;
|
||||||
|
in oneshot {
|
||||||
|
dependencies = [ interface ];
|
||||||
|
name = "${interface.device}.addr.${address}";
|
||||||
|
up = "ip address add ${address}/${toString prefixLength} dev ${interface.device} ";
|
||||||
|
down = "ip address del ${address}/${toString prefixLength} dev ${interface.device} ";
|
||||||
|
};
|
||||||
|
udhcpc = callPackage ./networking/udhcpc.nix {};
|
||||||
|
odhcpc = interface: { ... } @ args: longrun {
|
||||||
|
name = "${interface.device}.odhcp";
|
||||||
|
run = "odhcpcd ${interface.device}";
|
||||||
|
};
|
||||||
|
pppoe = callPackage ./networking/pppoe.nix {};
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
inherit longrun oneshot bundle target;
|
||||||
|
output = service: name: "/run/service-state/${service.name}/${name}";
|
||||||
|
};
|
||||||
}
|
}
|
|
@ -1,39 +0,0 @@
|
||||||
{
|
|
||||||
callPackage
|
|
||||||
, liminix
|
|
||||||
}:
|
|
||||||
let inherit (liminix.services) oneshot longrun;
|
|
||||||
in {
|
|
||||||
interface = { type, device } @ args: oneshot {
|
|
||||||
name = "${device}.link";
|
|
||||||
up = "ip link set up dev ${device}";
|
|
||||||
down = "ip link set down dev ${device}";
|
|
||||||
} // {
|
|
||||||
inherit device;
|
|
||||||
};
|
|
||||||
address = interface: { family, prefixLength, address } @ args:
|
|
||||||
let inherit (builtins) toString;
|
|
||||||
in oneshot {
|
|
||||||
dependencies = [ interface ];
|
|
||||||
name = "${interface.device}.addr.${address}";
|
|
||||||
up = "ip address add ${address}/${toString prefixLength} dev ${interface.device} ";
|
|
||||||
down = "ip address del ${address}/${toString prefixLength} dev ${interface.device} ";
|
|
||||||
};
|
|
||||||
udhcpc = callPackage ./udhcpc.nix {};
|
|
||||||
odhcpc = interface: { ... } @ args: longrun {
|
|
||||||
name = "${interface.device}.odhcp";
|
|
||||||
run = "odhcpcd ${interface.device}";
|
|
||||||
};
|
|
||||||
pppoe = callPackage ./pppoe.nix {};
|
|
||||||
route = { name, target, via, dependencies }:
|
|
||||||
oneshot {
|
|
||||||
inherit name;
|
|
||||||
up = ''
|
|
||||||
ip route add ${target} via ${via}
|
|
||||||
'';
|
|
||||||
down = ''
|
|
||||||
ip route del ${target} via ${via}
|
|
||||||
'';
|
|
||||||
inherit dependencies;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
{
|
|
||||||
s6-linux-init
|
|
||||||
, execline
|
|
||||||
, writeScript
|
|
||||||
, stdenvNoCC
|
|
||||||
, lib
|
|
||||||
, busybox
|
|
||||||
, s6-rc
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
hpr = name: arg: writeScript name ''
|
|
||||||
#!${execline}/bin/execlineb -S0
|
|
||||||
${s6-linux-init}/bin/s6-linux-init-hpr ${arg} \$@
|
|
||||||
'';
|
|
||||||
init = writeScript "init" ''
|
|
||||||
#!${execline}/bin/execlineb -S0
|
|
||||||
${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [busybox execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- "\$@"
|
|
||||||
'';
|
|
||||||
in stdenvNoCC.mkDerivation {
|
|
||||||
name = "s6-init-bin";
|
|
||||||
phases = ["installPhase"];
|
|
||||||
installPhase = ''
|
|
||||||
bin=$out/bin
|
|
||||||
mkdir -p $bin
|
|
||||||
cd $bin
|
|
||||||
ln -s ${s6-linux-init}/bin/s6-linux-init-shutdown shutdown
|
|
||||||
ln -s ${s6-linux-init}/bin/s6-linux-init-telinit telinit
|
|
||||||
ln -s ${hpr "reboot" "-r"} reboot
|
|
||||||
ln -s ${hpr "poweroff" "-p"} poweroff
|
|
||||||
ln -s ${hpr "halt" "-h"} halt
|
|
||||||
ln -s ${init} init
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -23,6 +23,18 @@ let
|
||||||
};
|
};
|
||||||
dir = contents: { type = "d"; inherit contents; };
|
dir = contents: { type = "d"; inherit contents; };
|
||||||
symlink = target: { type = "s"; inherit target; };
|
symlink = target: { type = "s"; inherit target; };
|
||||||
|
hpr = arg: "#!${execline}/bin/execlineb -S0\n${s6-linux-init}/bin/s6-linux-init-hpr ${arg} \$@";
|
||||||
|
bin = dir {
|
||||||
|
shutdown = symlink "${s6-linux-init}/bin/s6-linux-init-shutdown";
|
||||||
|
telinit = symlink "${s6-linux-init}/bin/s6-linux-init-telinit";
|
||||||
|
reboot = { type="f"; file = hpr "-r"; mode="0755"; };
|
||||||
|
poweroff = { type="f"; file = hpr "-p"; mode="0755"; };
|
||||||
|
halt = { type="f"; file = hpr "-h"; mode="0755"; };
|
||||||
|
init = {
|
||||||
|
type="f"; mode="0755";
|
||||||
|
file = "#!${execline}/bin/execlineb -S0\n${s6-linux-init}/bin/s6-linux-init -c /etc/s6-linux-init/current -m 0022 -p ${lib.makeBinPath [busybox execline s6-linux-init s6-rc]}:/usr/bin:/bin -d /dev -- \"\\$@\"";
|
||||||
|
};
|
||||||
|
};
|
||||||
scripts = symlink "${initscripts}/scripts";
|
scripts = symlink "${initscripts}/scripts";
|
||||||
env = dir {};
|
env = dir {};
|
||||||
run-image = dir {
|
run-image = dir {
|
||||||
|
@ -138,7 +150,7 @@ let
|
||||||
uncaught-logs = (dir {}) // {mode = "2750";};
|
uncaught-logs = (dir {}) // {mode = "2750";};
|
||||||
};
|
};
|
||||||
structure = { etc = dir { s6-linux-init = dir { current = dir {
|
structure = { etc = dir { s6-linux-init = dir { current = dir {
|
||||||
inherit scripts env run-image;
|
inherit bin scripts env run-image;
|
||||||
};};};};
|
};};};};
|
||||||
|
|
||||||
in pseudofile "pseudo.s6-init" structure
|
in pseudofile "pseudo.s6-init" structure
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{ config, pkgs, ... } :
|
{ config, pkgs, ... } :
|
||||||
let
|
let
|
||||||
inherit (pkgs.liminix.networking) interface address pppoe route;
|
inherit (pkgs.liminix.networking) interface address pppoe;
|
||||||
inherit (pkgs.liminix.services) oneshot longrun bundle target output;
|
inherit (pkgs.liminix.services) oneshot longrun bundle target output;
|
||||||
in rec {
|
in rec {
|
||||||
services.loopback =
|
services.loopback =
|
||||||
|
@ -40,32 +40,24 @@ in rec {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.defaultroute4 = route {
|
services.defaultroute4 =
|
||||||
name = "defautlrote";
|
let iface = services.pppoe;
|
||||||
via = "$(cat ${output services.pppoe "address"})";
|
|
||||||
target = "default";
|
|
||||||
dependencies = [ services.pppoe ];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.packet_forwarding =
|
|
||||||
let
|
|
||||||
iface = services.pppoe;
|
|
||||||
filename = "/proc/sys/net/ipv4/conf/$(cat ${output iface "ifname"})/forwarding";
|
|
||||||
in oneshot {
|
in oneshot {
|
||||||
name = "let-the-ip-flow";
|
name = "defaultroute4";
|
||||||
up = "echo 1 > ${filename}";
|
up = ''
|
||||||
down = "echo 0 > ${filename}";
|
ip route add default via $(cat ${output iface "address"})
|
||||||
|
echo "1" > /proc/sys/net/ipv4/conf/$(cat ${output iface "ifname"}/forwarding)
|
||||||
|
'';
|
||||||
|
down = ''
|
||||||
|
ip route del default via $(cat ${output iface "address"})
|
||||||
|
echo "0" > /proc/sys/net/ipv4/conf/$(cat ${output iface "ifname"}/forwarding)
|
||||||
|
'';
|
||||||
dependencies = [iface];
|
dependencies = [iface];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.default = target {
|
services.default = target {
|
||||||
name = "default";
|
name = "default";
|
||||||
contents = with services; [
|
contents = with services; [ loopback defaultroute4 syslogd ];
|
||||||
loopback
|
|
||||||
defaultroute4
|
|
||||||
packet_forwarding
|
|
||||||
syslogd
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
systemPackages = [ pkgs.hello ] ;
|
systemPackages = [ pkgs.hello ] ;
|
||||||
|
|
|
@ -12,7 +12,6 @@ while { $FINISHED < 5 } {
|
||||||
expect {
|
expect {
|
||||||
"192.168.100.1" { set FINISHED 10; set EXIT 0; }
|
"192.168.100.1" { set FINISHED 10; set EXIT 0; }
|
||||||
"can't find device" { send_user "waiting ..." ; send "\r\n"; sleep 3 }
|
"can't find device" { send_user "waiting ..." ; send "\r\n"; sleep 3 }
|
||||||
"DOWN" { send_user "waiting ..." ; send "\r\n"; sleep 2 }
|
|
||||||
}
|
}
|
||||||
set FINISHED [ expr $FINISHED + 1 ]
|
set FINISHED [ expr $FINISHED + 1 ]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{ config, pkgs, ... } :
|
{ config, pkgs, ... } :
|
||||||
let
|
let
|
||||||
inherit (pkgs.liminix.networking) interface address udhcpc odhcpc route;
|
inherit (pkgs.liminix.networking) interface address udhcpc odhcpc;
|
||||||
inherit (pkgs.liminix.services) oneshot longrun bundle target output;
|
inherit (pkgs.liminix.services) oneshot longrun bundle target output;
|
||||||
in rec {
|
in rec {
|
||||||
services.loopback =
|
services.loopback =
|
||||||
|
@ -40,22 +40,18 @@ in rec {
|
||||||
dependencies = [services.dhcpv4];
|
dependencies = [services.dhcpv4];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.defaultroute4 = route {
|
services.defaultroute4 =
|
||||||
name = "defautlrote";
|
let inherit (services) dhcpv4;
|
||||||
via = "$(cat ${output services.dhcpv4 "address"})";
|
|
||||||
target = "default";
|
|
||||||
dependencies = [ services.dhcpv4 ];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.packet_forwarding =
|
|
||||||
let
|
|
||||||
iface = services.dhcpv4;
|
|
||||||
filename = "/proc/sys/net/ipv4/conf/$(cat ${output iface "ifname"})/forwarding";
|
|
||||||
in oneshot {
|
in oneshot {
|
||||||
name = "let-the-ip-flow";
|
name = "defaultroute4";
|
||||||
up = "echo 1 > ${filename}";
|
up = ''
|
||||||
down = "echo 0 > ${filename}";
|
ip route add default gw $(cat ${output dhcpv4 "address"})
|
||||||
dependencies = [iface];
|
echo "1" > /sys/net/ipv4/$(cat ${output dhcpv4 "ifname"})
|
||||||
|
'';
|
||||||
|
down = ''
|
||||||
|
ip route del default gw $(cat ${output dhcpv4 "address"})
|
||||||
|
echo "0" > /sys/net/ipv4/$(cat ${output dhcpv4 "ifname"})
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
services.default = target {
|
services.default = target {
|
||||||
|
|
Loading…
Reference in New Issue