Compare commits
No commits in common. "c4185617c039dacfe1afdc6b051c9507069fa99f" and "29a869b4faeac291947c5783d15580e92fcb1018" have entirely different histories.
c4185617c0
...
29a869b4fa
46
THOUGHTS.txt
46
THOUGHTS.txt
|
@ -5114,50 +5114,6 @@ service that's down
|
||||||
s6-rc -u change $service
|
s6-rc -u change $service
|
||||||
for s in $(s6-rc-db -d all-dependencies $service); do
|
for s in $(s6-rc-db -d all-dependencies $service); do
|
||||||
if (s6-rc-db all-dependencies $s | grep controlled); do
|
if (s6-rc-db all-dependencies $s | grep controlled); do
|
||||||
# do nothing: if it's stopped, we don't want to start it,
|
start s: nothing
|
||||||
# and if it's already running there's no need to.
|
|
||||||
# XXX what if it's running but its children are not?
|
|
||||||
# XXX 2 this fails as written because _every_ service $s depends
|
|
||||||
# on the controlled service $service
|
|
||||||
else
|
else
|
||||||
start s
|
start s
|
||||||
|
|
||||||
"[service] Names cannot be duplicated and cannot contain a slash or a
|
|
||||||
newline; they can contain spaces and tabs, but using anything else
|
|
||||||
than alphanumerical characters, underscores and dashes is discouraged"
|
|
||||||
|
|
||||||
would this be simpler in fennel?
|
|
||||||
|
|
||||||
(each [l (lines (io.popen (%. "s6-rc-db -d all-dependencies %s" service)))]
|
|
||||||
(if (not (controlled-ancestor l))
|
|
||||||
(tset to-start l true)))
|
|
||||||
|
|
||||||
Sat Jun 15 08:51:21 BST 2024
|
|
||||||
|
|
||||||
# do this at boot
|
|
||||||
for s in $(s6-rc-db -d dependencies controlled); do
|
|
||||||
mkdir -p /run/services/controlled
|
|
||||||
touch /run/services/controlled/$s
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# now we can do this to start a service tree
|
|
||||||
|
|
||||||
for controlled in $(cd /run/services/controlled/ && echo *); do
|
|
||||||
if down $controlled; then
|
|
||||||
blocks="$blocks $controlled "
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for s in $(s6-rc-db -d all-dependencies $service); do
|
|
||||||
for dep in $(s6-rc-db all-dependencies $s)
|
|
||||||
case "$blocks" in
|
|
||||||
"* $dep *")
|
|
||||||
: don't start
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
s6-rc -u change $s
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
|
@ -36,22 +36,18 @@ in rec {
|
||||||
username = "user";
|
username = "user";
|
||||||
password = "one2one";
|
password = "one2one";
|
||||||
authType = "chap";
|
authType = "chap";
|
||||||
};
|
|
||||||
|
|
||||||
services.dhcpc = svc.network.dhcp.client.build {
|
|
||||||
interface = config.services.wwan;
|
|
||||||
dependencies = [ config.services.hostname ];
|
dependencies = [ config.services.hostname ];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.sshd = svc.ssh.build { };
|
services.sshd = svc.ssh.build { };
|
||||||
|
|
||||||
services.resolvconf = oneshot rec {
|
services.resolvconf = oneshot rec {
|
||||||
dependencies = [ services.dhcpc ];
|
dependencies = [ services.wwan ];
|
||||||
name = "resolvconf";
|
name = "resolvconf";
|
||||||
up = ''
|
up = ''
|
||||||
. ${serviceFns}
|
. ${serviceFns}
|
||||||
( in_outputs ${name}
|
( in_outputs ${name}
|
||||||
for i in $(output ${services.dhcpc} dns); do
|
for i in $(output ${services.wwan} dns); do
|
||||||
echo "nameserver $i" > resolv.conf
|
echo "nameserver $i" > resolv.conf
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
|
@ -53,6 +53,7 @@ let
|
||||||
};
|
};
|
||||||
symlink = "/dev/modem";
|
symlink = "/dev/modem";
|
||||||
});
|
});
|
||||||
|
# XXX need an ip-up script here to collect the IP address
|
||||||
up = ''
|
up = ''
|
||||||
ls -l /dev/modem
|
ls -l /dev/modem
|
||||||
test -L /dev/modem || exit 1
|
test -L /dev/modem || exit 1
|
||||||
|
|
|
@ -11,7 +11,7 @@ in {
|
||||||
devout = longrun {
|
devout = longrun {
|
||||||
name = "devout";
|
name = "devout";
|
||||||
notification-fd = 10;
|
notification-fd = 10;
|
||||||
run = "exec ${pkgs.devout}/bin/devout /run/devout.sock 4";
|
run = "${pkgs.devout}/bin/devout /run/devout.sock 4";
|
||||||
};
|
};
|
||||||
coldplug = oneshot {
|
coldplug = oneshot {
|
||||||
name ="coldplug";
|
name ="coldplug";
|
||||||
|
|
|
@ -17,7 +17,7 @@ let
|
||||||
ip address replace $ip/$mask dev $interface
|
ip address replace $ip/$mask dev $interface
|
||||||
(in_outputs ${name}
|
(in_outputs ${name}
|
||||||
for i in lease mask ip router siaddr dns serverid subnet opt53 interface ; do
|
for i in lease mask ip router siaddr dns serverid subnet opt53 interface ; do
|
||||||
(printenv $i || true) > $i
|
printenv $i > $i
|
||||||
done)
|
done)
|
||||||
}
|
}
|
||||||
case $action in
|
case $action in
|
||||||
|
@ -40,7 +40,7 @@ let
|
||||||
'';
|
'';
|
||||||
in longrun {
|
in longrun {
|
||||||
inherit name;
|
inherit name;
|
||||||
run = "exec /bin/udhcpc -f -i $(output ${interface} ifname) -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}";
|
run = "/bin/udhcpc -f -i $(output ${interface} ifname) -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}";
|
||||||
notification-fd = 10;
|
notification-fd = 10;
|
||||||
dependencies = [ interface ];
|
dependencies = [ interface ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ let
|
||||||
stdenvNoCC;
|
stdenvNoCC;
|
||||||
inherit (lib.lists) unique concatMap;
|
inherit (lib.lists) unique concatMap;
|
||||||
inherit (pkgs.pseudofile) dir symlink;
|
inherit (pkgs.pseudofile) dir symlink;
|
||||||
inherit (pkgs.liminix.services) oneshot bundle;
|
inherit (pkgs.liminix.services) bundle;
|
||||||
|
|
||||||
s6-rc-db =
|
s6-rc-db =
|
||||||
let
|
let
|
||||||
|
@ -31,25 +31,12 @@ let
|
||||||
isControlled s ||
|
isControlled s ||
|
||||||
(lib.lists.any isDependentOnControlled s.dependencies);
|
(lib.lists.any isDependentOnControlled s.dependencies);
|
||||||
|
|
||||||
# all controlled services depend on this oneshot, which
|
|
||||||
# makes a list of them so we can identify them at runtime
|
|
||||||
controlled = oneshot {
|
|
||||||
name = "controlled";
|
|
||||||
up = ''
|
|
||||||
mkdir -p /run/services/controlled
|
|
||||||
for s in $(s6-rc-db -d dependencies controlled); do
|
|
||||||
touch /run/services/controlled/$s
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
down = "rm -r /run/services/controlled";
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultStart =
|
defaultStart =
|
||||||
builtins.filter
|
builtins.filter
|
||||||
(s: !(isDependentOnControlled s)) allServices;
|
(s: !(isDependentOnControlled s)) allServices;
|
||||||
defaultDefaultTarget = bundle {
|
defaultDefaultTarget = bundle {
|
||||||
name = "default";
|
name = "default";
|
||||||
contents = defaultStart ++ [controlled];
|
contents = defaultStart;
|
||||||
};
|
};
|
||||||
servicesAttrs = {
|
servicesAttrs = {
|
||||||
default = defaultDefaultTarget;
|
default = defaultDefaultTarget;
|
||||||
|
|
|
@ -98,7 +98,6 @@ in {
|
||||||
run-liminix-vm = callPackage ./run-liminix-vm {};
|
run-liminix-vm = callPackage ./run-liminix-vm {};
|
||||||
s6-init-bin = callPackage ./s6-init-bin {};
|
s6-init-bin = callPackage ./s6-init-bin {};
|
||||||
s6-rc-database = callPackage ./s6-rc-database {};
|
s6-rc-database = callPackage ./s6-rc-database {};
|
||||||
s6-rc-up-tree = callPackage ./s6-rc-up-tree {};
|
|
||||||
|
|
||||||
# schnapps is written by Turris and provides a high-level interface
|
# schnapps is written by Turris and provides a high-level interface
|
||||||
# to btrfs snapshots. It may be useful on the Turris Omnia to
|
# to btrfs snapshots. It may be useful on the Turris Omnia to
|
||||||
|
@ -113,7 +112,6 @@ in {
|
||||||
uevent-watch = callPackage ./uevent-watch {};
|
uevent-watch = callPackage ./uevent-watch {};
|
||||||
usb-modeswitch = callPackage ./usb-modeswitch {};
|
usb-modeswitch = callPackage ./usb-modeswitch {};
|
||||||
writeAshScript = callPackage ./write-ash-script {};
|
writeAshScript = callPackage ./write-ash-script {};
|
||||||
writeAshScriptBin = callPackage ./write-ash-script/bin.nix {};
|
|
||||||
writeFennel = callPackage ./write-fennel {};
|
writeFennel = callPackage ./write-fennel {};
|
||||||
writeFennelScript = callPackage ./write-fennel-script {};
|
writeFennelScript = callPackage ./write-fennel-script {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,6 @@ done
|
||||||
if test -n "$controller" ; then
|
if test -n "$controller" ; then
|
||||||
d=$(dirname $(cd ${controller} && ls -d */type))
|
d=$(dirname $(cd ${controller} && ls -d */type))
|
||||||
echo "$d)" > $out/${name}/controller
|
echo "$d)" > $out/${name}/controller
|
||||||
# ^ why is there a closing paren here?
|
|
||||||
touch $out/${name}/dependencies.d/controlled
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for i in timeout-up timeout-down run notification-fd up down finish consumer-for producer-for pipeline-name restart-on-upgrade; do
|
for i in timeout-up timeout-down run notification-fd up down finish consumer-for producer-for pipeline-name restart-on-upgrade; do
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
writeAshScriptBin
|
|
||||||
}:
|
|
||||||
writeAshScriptBin "s6-rc-up-tree" {} (builtins.readFile ./s6-rc-up-tree.sh)
|
|
|
@ -1,24 +0,0 @@
|
||||||
service=$1
|
|
||||||
|
|
||||||
blocks=""
|
|
||||||
for controlled in $(cd /run/services/controlled/ && echo *); do
|
|
||||||
down=$(s6-rc -b -un0 change $controlled)
|
|
||||||
echo $controlled $down
|
|
||||||
if test -n "$down"; then
|
|
||||||
blocks="$blocks $controlled "
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for s in $(s6-rc-db -d all-dependencies $service); do
|
|
||||||
for dep in $(s6-rc-db all-dependencies $s); do
|
|
||||||
case "$blocks" in
|
|
||||||
"* $dep *")
|
|
||||||
echo "not starting $s, blocked by $dep"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "starting $s because $service"
|
|
||||||
s6-rc -b -u change $s
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
done
|
|
|
@ -1,7 +0,0 @@
|
||||||
|
|
||||||
the service starts
|
|
||||||
uncontrolled descendants start
|
|
||||||
controlled descendants don't start
|
|
||||||
descendants which depend on a _different_ controlled service, which is down, don't start
|
|
||||||
descendants which depend on a _different_ controlled service, which is up, do start
|
|
||||||
|
|
|
@ -8,21 +8,17 @@
|
||||||
, fennel
|
, fennel
|
||||||
, stdenv
|
, stdenv
|
||||||
, fennelrepl
|
, fennelrepl
|
||||||
, s6-rc-up-tree
|
|
||||||
, makeWrapper
|
|
||||||
}:
|
}:
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "uevent-watch";
|
name = "uevent-watch";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
nativeBuildInputs = [ fennelrepl makeWrapper ];
|
nativeBuildInputs = [ fennelrepl ];
|
||||||
propagatedBuildInputs = [ s6-rc-up-tree ];
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cp -p ${writeFennel "uevent-watch" {
|
cp -p ${writeFennel "uevent-watch" {
|
||||||
packages = [fennel anoia nellie lualinux];
|
packages = [fennel anoia nellie lualinux];
|
||||||
mainFunction = "run";
|
mainFunction = "run";
|
||||||
} ./watch.fnl} $out/bin/uevent-watch
|
} ./watch.fnl} $out/bin/uevent-watch
|
||||||
wrapProgram $out/bin/uevent-watch --prefix PATH : "${s6-rc-up-tree}/bin"
|
|
||||||
'';
|
'';
|
||||||
checkPhase = ''
|
checkPhase = ''
|
||||||
fennelrepl ./test.fnl
|
fennelrepl ./test.fnl
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
(fn start-service [devname linkname service]
|
(fn start-service [devname linkname service]
|
||||||
(match (if linkname (symlink (.. "/dev/" devname) linkname) true)
|
(match (if linkname (symlink (.. "/dev/" devname) linkname) true)
|
||||||
ok (pcall system (%% "s6-rc-up-tree %q" service))
|
ok (pcall system (%% "s6-rc -b -u change %q" service))
|
||||||
(nil err) false))
|
(nil err) false))
|
||||||
|
|
||||||
(fn stop-service [linkname service]
|
(fn stop-service [linkname service]
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
{
|
|
||||||
writeScriptBin
|
|
||||||
, lib
|
|
||||||
}
|
|
||||||
: name : { runtimeInputs ? [] } : text : writeScriptBin name ''
|
|
||||||
#!/bin/sh
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
export PATH="${lib.makeBinPath runtimeInputs}:$PATH"
|
|
||||||
${text}
|
|
||||||
''
|
|
Loading…
Reference in New Issue