Compare commits

...

4 Commits

Author SHA1 Message Date
Daniel Barlow e94bf62ec1 remove dead code (run deadnix) 2024-06-29 22:59:27 +01:00
Daniel Barlow 16a2499d74 avoid makeWrapper on host, it requires bash 2024-06-29 22:36:05 +01:00
Daniel Barlow d4d8093f97 working l2tp-over-wwan stick example 2024-06-20 10:15:54 +01:00
Daniel Barlow 7c9c801afc rename isTrigger to restart-on-upgrade
we're moving away from "trigger" services to "controller" services,
and "restart-on-upgrade" is the name used by s6-rc
2024-06-16 12:58:06 +01:00
114 changed files with 173 additions and 276 deletions

7
ci.nix
View File

@ -4,7 +4,6 @@
, liminix , liminix
, ... }: , ... }:
let let
inherit (builtins) map;
pkgs = (import nixpkgs {}); pkgs = (import nixpkgs {});
borderVmConf = ./bordervm.conf-example.nix; borderVmConf = ./bordervm.conf-example.nix;
inherit (pkgs.lib.attrsets) genAttrs; inherit (pkgs.lib.attrsets) genAttrs;
@ -44,12 +43,6 @@ let
imports = [ ./modules/all-modules.nix ]; imports = [ ./modules/all-modules.nix ];
}; };
}).outputs.optionsJson; }).outputs.optionsJson;
installers = map (f: "system.outputs.${f}") [
"vmroot"
"mtdimage"
"ubimage"
];
inherit (pkgs.lib) concatStringsSep;
in pkgs.stdenv.mkDerivation { in pkgs.stdenv.mkDerivation {
name = "liminix-doc"; name = "liminix-doc";
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [

View File

@ -213,7 +213,6 @@
networkInterfaces = networkInterfaces =
let let
inherit (config.system.service.network) link; inherit (config.system.service.network) link;
inherit (config.system.service) bridge;
in rec { in rec {
wan = link.build { ifname = "wan"; }; wan = link.build { ifname = "wan"; };
lan1 = link.build { ifname = "lan1"; }; lan1 = link.build { ifname = "lan1"; };

View File

@ -92,7 +92,6 @@
''; '';
}; };
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs.liminix.networking) interface;
in { in {
imports = [ imports = [
../../modules/network ../../modules/network

View File

@ -45,7 +45,6 @@
module = { pkgs, config, lib, lim, ...}: module = { pkgs, config, lib, lim, ...}:
let let
inherit (pkgs.liminix.networking) interface;
inherit (pkgs) openwrt; inherit (pkgs) openwrt;
mac80211 = pkgs.kmodloader.override { mac80211 = pkgs.kmodloader.override {
targets = ["rt2800soc"]; targets = ["rt2800soc"];
@ -90,19 +89,6 @@
let let
inherit (config.system.service.network) link; inherit (config.system.service.network) link;
inherit (config.system.service) vlan; inherit (config.system.service) vlan;
inherit (pkgs.liminix.services) oneshot;
swconfig = oneshot {
name = "swconfig";
up = ''
PATH=${pkgs.swconfig}/bin:$PATH
swconfig dev switch0 set reset
swconfig dev switch0 set enable_vlan 1
swconfig dev switch0 vlan 1 set ports '1 2 3 4 6t'
swconfig dev switch0 vlan 2 set ports '0 6t'
swconfig dev switch0 set apply
'';
down = "${pkgs.swconfig}/bin/swconfig dev switch0 set reset";
};
in rec { in rec {
eth = link.build { ifname = "eth0"; }; eth = link.build { ifname = "eth0"; };
# lan and wan ports are both behind a switch on eth0 # lan and wan ports are both behind a switch on eth0

View File

@ -38,7 +38,6 @@
module = { pkgs, config, lib, lim, ...}: module = { pkgs, config, lib, lim, ...}:
let let
inherit (pkgs.liminix.networking) interface;
inherit (pkgs.liminix.services) oneshot; inherit (pkgs.liminix.services) oneshot;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) openwrt; inherit (pkgs) openwrt;

View File

@ -26,7 +26,7 @@
# this device is described by the "qemu" device # this device is described by the "qemu" device
installer = "vmroot"; installer = "vmroot";
module = {pkgs, config, lim, ... }: { module = { config, lim, ... }: {
imports = [ imports = [
../../modules/arch/aarch64.nix ../../modules/arch/aarch64.nix
../families/qemu.nix ../families/qemu.nix

View File

@ -24,7 +24,7 @@
''; '';
installer = "vmroot"; installer = "vmroot";
module = {pkgs, config, lim, ... }: { module = { config, lim, ... }: {
imports = [ imports = [
../../modules/arch/arm.nix ../../modules/arch/arm.nix
../families/qemu.nix ../families/qemu.nix

View File

@ -36,7 +36,7 @@
in the Development manual. in the Development manual.
''; '';
module = {pkgs, config, lib, lim, ... }: { module = { config, lib, lim, ... }: {
imports = [ imports = [
../../modules/arch/mipseb.nix ../../modules/arch/mipseb.nix
../families/qemu.nix ../families/qemu.nix

View File

@ -419,7 +419,6 @@
networkInterfaces = networkInterfaces =
let let
inherit (config.system.service.network) link; inherit (config.system.service.network) link;
inherit (config.system.service) bridge;
in rec { in rec {
lan1 = link.build { ifname = "lan1"; }; lan1 = link.build { ifname = "lan1"; };
lan2 = link.build { ifname = "lan2"; }; lan2 = link.build { ifname = "lan2"; };

View File

@ -155,8 +155,6 @@
module = {pkgs, config, lib, lim, ... }: module = {pkgs, config, lib, lim, ... }:
let let
openwrt = pkgs.openwrt;
inherit (lib) mkOption types;
inherit (pkgs.liminix.services) oneshot; inherit (pkgs.liminix.services) oneshot;
inherit (pkgs) liminix; inherit (pkgs) liminix;
mtd_by_name_links = pkgs.liminix.services.oneshot rec { mtd_by_name_links = pkgs.liminix.services.oneshot rec {
@ -358,7 +356,6 @@
networkInterfaces = networkInterfaces =
let let
inherit (config.system.service.network) link; inherit (config.system.service.network) link;
inherit (config.system.service) bridge;
in rec { in rec {
en70000 = link.build { en70000 = link.build {
# in armada-38x.dtsi this is eth0. # in armada-38x.dtsi this is eth0.

View File

@ -103,8 +103,6 @@
module = { pkgs, config, lib, lim, ...}: module = { pkgs, config, lib, lim, ...}:
let let
inherit (pkgs.liminix.networking) interface;
inherit (pkgs.liminix.services) oneshot;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) openwrt; inherit (pkgs) openwrt;

View File

@ -1,6 +1,5 @@
{ eval, lib, pkgs }: { eval, lib, pkgs }:
let let
inherit (lib) types;
conf = eval.config; conf = eval.config;
rootDir = builtins.toPath ./..; rootDir = builtins.toPath ./..;
stripAnyPrefixes = lib.flip (lib.fold lib.removePrefix) stripAnyPrefixes = lib.flip (lib.fold lib.removePrefix)

View File

@ -9,14 +9,6 @@ let
d' = { d' = {
description = "${n}\n${substring 0 (stringLength n) "********************************"}\n"; description = "${n}\n${substring 0 (stringLength n) "********************************"}\n";
} // d; } // d;
installer =
if d ? description && d ? installer
then ''
The default installation route for this device is
:ref:`system-outputs-${d.installer}`
''
else "";
in d'.description) in d'.description)
devices; devices;
in in

View File

@ -11,9 +11,9 @@
... ...
}: let }: let
secrets = import ./extneder-secrets.nix; secrets = import ./extneder-secrets.nix;
inherit (pkgs.liminix.services) oneshot longrun bundle target; inherit (pkgs.liminix.services) oneshot longrun target;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) writeText dropbear ifwait serviceFns; inherit (pkgs) writeText serviceFns;
svc = config.system.service; svc = config.system.service;
in rec { in rec {
boot = { boot = {

View File

@ -5,9 +5,9 @@
# wherever the text "EDIT" appears - please consult the tutorial # wherever the text "EDIT" appears - please consult the tutorial
# documentation for details. # documentation for details.
{ config, pkgs, lib, ... } : { config, pkgs, ... } :
let let
inherit (pkgs.liminix.services) bundle oneshot longrun; inherit (pkgs.liminix.services) bundle oneshot;
inherit (pkgs) serviceFns; inherit (pkgs) serviceFns;
# EDIT: you can pick your preferred RFC1918 address space # EDIT: you can pick your preferred RFC1918 address space
# for NATted connections, if you don't like this one. # for NATted connections, if you don't like this one.

View File

@ -1,6 +1,5 @@
{ config, pkgs, lib, ... } : { config, pkgs, ... } :
let let
inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
in rec { in rec {

View File

@ -1,6 +1,5 @@
{ config, pkgs, lib, ... } : { config, pkgs, ... } :
let let
inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
in rec { in rec {

View File

@ -6,10 +6,29 @@
}: let }: let
secrets = import ./extneder-secrets.nix; secrets = import ./extneder-secrets.nix;
rsecrets = import ./rotuer-secrets.nix; rsecrets = import ./rotuer-secrets.nix;
lns = "l2tp.aaisp.net.uk";
inherit (pkgs.liminix.services) oneshot longrun bundle target; # https://support.aa.net.uk/Category:Incoming_L2TP says:
# "Please use the DNS name (l2tp.aa.net.uk) instead of hardcoding an
# IP address; IP addresses can and do change. If you have to use an
# IP, use 194.4.172.12, but do check the DNS for l2tp.aa.net.uk in
# case it changes."
# but (1) we don't want to use the wwan stick's dns as our main
# resolver: it's provided by some mobile ISP and they aren't
# necessarily the best at providing unfettered services without
# deciding to do something weird; (2) it's not simple to arrange
# that xl2tpd gets a different resolver than every other process;
# (3) there's no way to specify an lns address to xl2tpd at runtime
# except by rewriting its config file. So what we will do is lookup
# the lns hostname using the mobile ISP's dns server and then refuse
# to start l2tp unless the expected lns address is one of the
# addresses returned. I think this satisfies "do check the DNS"
lns = { hostname = "l2tp.aaisp.net.uk"; address = "194.4.172.12"; };
inherit (pkgs.liminix.services) oneshot target;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) writeText dropbear ifwait serviceFns; inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
in rec { in rec {
boot = { boot = {
@ -46,46 +65,75 @@ in rec {
services.sshd = svc.ssh.build { }; services.sshd = svc.ssh.build { };
services.resolvconf = oneshot rec { services.resolvconf = oneshot rec {
dependencies = [ services.dhcpc ]; dependencies = [ services.l2tp ];
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 ns1 ns2 ; do
echo "nameserver $i" > resolv.conf ns=$(output ${services.l2tp} $i)
done echo "nameserver $ns" >> resolv.conf
) done
)
''; '';
}; };
filesystem = dir { filesystem = dir {
etc = dir { etc = dir {
"resolv.conf" = symlink "${services.resolvconf}/.outputs/resolv.conf"; "resolv.conf" = symlink "${services.resolvconf}/.outputs/resolv.conf";
}; };
srv = dir {};
}; };
services.lnsroute = svc.network.route.build { services.lns-address = let
via = "$(output ${services.dhcpc} router)"; ns = "$(output_word ${services.dhcpc} dns 1)";
target = lns; route-to-bootstrap-nameserver = svc.network.route.build {
dependencies = [services.dhcpc]; via = "$(output ${services.dhcpc} router)";
target = ns;
dependencies = [services.dhcpc];
};
in oneshot rec {
name = "resolve-l2tp-server";
dependencies = [ services.dhcpc route-to-bootstrap-nameserver ];
up = ''
(in_outputs ${name}
DNSCACHEIP="${ns}" ${pkgs.s6-dns}/bin/s6-dnsip4 ${lns.hostname} \
> addresses
)
'';
}; };
services.l2tp = svc.l2tp.build { services.l2tp =
inherit lns; let
ppp-options = [ check-address = oneshot rec {
"debug" "+ipv6" "noauth" name = "check-lns-address";
"name" rsecrets.l2tp.name up = ''
"password" rsecrets.l2tp.password grep -Fx ${lns.address} $(output_path ${services.lns-address} addresses)
]; '';
dependencies = [ services.lnsroute ]; dependencies = [ services.lns-address ];
};
route = svc.network.route.build {
via = "$(output ${services.dhcpc} router)";
target = lns.address;
dependencies = [services.dhcpc check-address];
};
in svc.l2tp.build {
lns = lns.address;
ppp-options = [
"debug" "+ipv6" "noauth"
"name" rsecrets.l2tp.name
"connect-delay" "5000"
"password" rsecrets.l2tp.password
];
dependencies = [config.services.lns-address route check-address];
}; };
services.defaultroute4 = svc.network.route.build { services.defaultroute4 = svc.network.route.build {
via = "$(output ${services.l2tp} router)"; via = "$(output ${services.l2tp} peer-address)";
target = "default"; target = "default";
dependencies = [services.l2tp]; dependencies = [services.l2tp];
}; };
# defaultProfile.packages = [ pkgs.go-l2tp ];
users.root = { users.root = {
passwd = lib.mkForce secrets.root.passwd; passwd = lib.mkForce secrets.root.passwd;
openssh.authorizedKeys.keys = secrets.root.keys; openssh.authorizedKeys.keys = secrets.root.keys;

View File

@ -1,7 +1,6 @@
{ config, pkgs, ... } : { config, pkgs, ... } :
let let
inherit (pkgs.liminix.services) oneshot longrun bundle target; inherit (pkgs.liminix.services) target;
inherit (pkgs) writeText;
svc = config.system.service; svc = config.system.service;
secrets-1 = { secrets-1 = {
ssid = "Zyxel 2G (N)"; ssid = "Zyxel 2G (N)";

View File

@ -3,7 +3,7 @@ let
inherit (pkgs) serviceFns; inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs.liminix.services) oneshot longrun bundle target; inherit (pkgs.liminix.services) oneshot target;
some-util-linux = pkgs.runCommand "some-util-linux" {} '' some-util-linux = pkgs.runCommand "some-util-linux" {} ''
mkdir -p $out/bin mkdir -p $out/bin
cd ${pkgs.util-linux-small}/bin cd ${pkgs.util-linux-small}/bin

View File

@ -12,8 +12,6 @@ let
domainName = "fake.liminix.org"; domainName = "fake.liminix.org";
firewallRules = {}; firewallRules = {};
} // (import ./rotuer-secrets.nix); } // (import ./rotuer-secrets.nix);
inherit (pkgs.liminix.services) oneshot bundle;
inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
wirelessConfig = { wirelessConfig = {
country_code = "GB"; country_code = "GB";

View File

@ -1,6 +1,5 @@
{ config, pkgs, lib, lim, ... } : { config, pkgs, lim, ... } :
let let
inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;
in rec { in rec {

View File

@ -1,4 +1,4 @@
{ lib, lim, pkgs, config, ...}: { lim, pkgs, config, ...}:
{ {
config = { config = {
kernel.config = { kernel.config = {

View File

@ -1,4 +1,4 @@
{ lib, lim, pkgs, config, ...}: { lim, pkgs, config, ...}:
{ {
config = { config = {
kernel.config = { kernel.config = {

View File

@ -1,4 +1,4 @@
{ lib, pkgs, config, lim, ...}: { config, lim, ...}:
{ {
config = { config = {
kernel.config = { kernel.config = {

View File

@ -1,4 +1,4 @@
{ lib, pkgs, config, ...}: { pkgs, config, ...}:
{ {
imports = [ ./mips.nix ]; imports = [ ./mips.nix ];
config = { config = {

View File

@ -1,4 +1,4 @@
{ lib, pkgs, config, ...}: { config, ...}:
{ {
imports = [ ./mips.nix ]; imports = [ ./mips.nix ];
config = { config = {

View File

@ -4,10 +4,8 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkOption types ;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs.liminix.networking) address interface;
inherit (pkgs.liminix.services) bundle;
type_service = pkgs.liminix.lib.types.service; type_service = pkgs.liminix.lib.types.service;

View File

@ -10,7 +10,6 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkOption types; inherit (lib) mkOption types;
inherit (pkgs.liminix.services) oneshot;
inherit (pkgs) liminix; inherit (pkgs) liminix;
in in
{ {

View File

@ -1,7 +1,6 @@
{ {
liminix liminix
, ifwait , ifwait
, lib
, svc , svc
}: }:
{ members, primary } : { members, primary } :
@ -9,7 +8,6 @@
let let
inherit (liminix.networking) interface; inherit (liminix.networking) interface;
inherit (liminix.services) bundle oneshot; inherit (liminix.services) bundle oneshot;
inherit (lib) mkOption types;
addif = member : addif = member :
# how do we get sight of services from here? maybe we need to # how do we get sight of services from here? maybe we need to
# implement ifwait as a regualr derivation instead of a # implement ifwait as a regualr derivation instead of a

View File

@ -1,12 +1,10 @@
{ {
liminix liminix
, ifwait
, lib , lib
}: }:
{ ifname } : { ifname } :
let let
inherit (liminix.services) bundle oneshot; inherit (liminix.services) oneshot;
inherit (lib) mkOption types;
in oneshot rec { in oneshot rec {
name = "${ifname}.link"; name = "${ifname}.link";
up = '' up = ''

View File

@ -8,7 +8,7 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkOption mkEnableOption types mapAttrsToList; inherit (lib) mkOption types mapAttrsToList;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (lib.strings) toUpper; inherit (lib.strings) toUpper;

View File

@ -2,7 +2,6 @@
let let
inherit (pkgs) liminix; inherit (pkgs) liminix;
inherit (lib) mkOption types; inherit (lib) mkOption types;
svc = config.system.service;
in { in {
imports = [ imports = [
../service-trigger ../service-trigger

View File

@ -8,7 +8,7 @@
}: }:
{ apn, username, password, authType }: { apn, username, password, authType }:
let let
inherit (liminix.services) bundle longrun oneshot; inherit (liminix.services) oneshot;
authTypeNum = if authType == "pap" then "1" else "2"; authTypeNum = if authType == "pap" then "1" else "2";
chat = lib.escapeShellArgs [ chat = lib.escapeShellArgs [
# Your usb modem thing might present as a tty that you run PPP # Your usb modem thing might present as a tty that you run PPP

View File

@ -2,7 +2,6 @@
writeFennel writeFennel
, linotify , linotify
, anoia , anoia
, lua
, lualinux , lualinux
}: }:
writeFennel "acquire-delegated-prefix" { writeFennel "acquire-delegated-prefix" {

View File

@ -1,12 +1,10 @@
{ {
liminix liminix
, lib
, callPackage , callPackage
}: }:
{ client, interface } : { client, interface } :
let let
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) mkOption types;
name = "dhcp6c.addr.${client.name}.${interface.name}"; name = "dhcp6c.addr.${client.name}.${interface.name}";
script = callPackage ./acquire-wan-address.nix { }; script = callPackage ./acquire-wan-address.nix { };
in longrun { in longrun {

View File

@ -1,13 +1,11 @@
{ {
liminix liminix
, lib
, odhcp6c , odhcp6c
, odhcp-script , odhcp-script
}: }:
{ interface } : { interface } :
let let
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) mkOption types;
name = "dhcp6c.${interface.name}"; name = "dhcp6c.${interface.name}";
in longrun { in longrun {
inherit name; inherit name;

View File

@ -12,7 +12,6 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkOption types; inherit (lib) mkOption types;
inherit (pkgs.liminix.services) oneshot;
inherit (pkgs) liminix; inherit (pkgs) liminix;
in in
{ {

View File

@ -1,12 +1,10 @@
{ {
liminix liminix
, lib
, callPackage , callPackage
}: }:
{ client, interface } : { client, interface } :
let let
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) mkOption types;
name = "dhcp6c.prefix.${client.name}.${interface.name}"; name = "dhcp6c.prefix.${client.name}.${interface.name}";
script = callPackage ./acquire-delegated-prefix.nix { }; script = callPackage ./acquire-delegated-prefix.nix { };
in longrun { in longrun {

View File

@ -18,7 +18,7 @@ let
name = "${interface.name}.dnsmasq"; name = "${interface.name}.dnsmasq";
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) concatStrings concatStringsSep mapAttrsToList; inherit (lib) concatStrings concatStringsSep mapAttrsToList;
hostOpt = name : { mac, v4, v6, leasetime } @ attrs: hostOpt = name : { mac, v4, v6, leasetime }:
let v6s = concatStrings (map (a : ",[${a}]") v6); let v6s = concatStrings (map (a : ",[${a}]") v6);
in "--dhcp-host=${mac},${v4}${v6s},${name},${builtins.toString leasetime}"; in "--dhcp-host=${mac},${v4}${v6s},${name},${builtins.toString leasetime}";
in in

View File

@ -8,7 +8,6 @@
let let
inherit (lib) mkOption types; inherit (lib) mkOption types;
inherit (pkgs) liminix; inherit (pkgs) liminix;
inherit (pkgs.liminix.services) oneshot;
kmodules = pkgs.kmodloader.override { kmodules = pkgs.kmodloader.override {
inherit (config.system.outputs) kernel; inherit (config.system.outputs) kernel;

View File

@ -7,8 +7,6 @@
{ rules, extraRules }: { rules, extraRules }:
let let
inherit (liminix.services) oneshot; inherit (liminix.services) oneshot;
inherit (liminix.lib) typeChecked;
inherit (lib) mkOption types;
script = firewallgen "firewall.nft" (lib.recursiveUpdate rules extraRules); script = firewallgen "firewall.nft" (lib.recursiveUpdate rules extraRules);
in oneshot { in oneshot {
name = "firewall"; name = "firewall";

View File

@ -6,9 +6,9 @@
## :file:`devices/manuf-model/default.nix` ## :file:`devices/manuf-model/default.nix`
{ lib, pkgs, config, ...}: { lib, ...}:
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkOption types ;
in { in {
options = { options = {
boot = { boot = {

View File

@ -8,8 +8,6 @@
let let
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) concatStringsSep mapAttrsToList; inherit (lib) concatStringsSep mapAttrsToList;
inherit (liminix.lib) typeChecked;
inherit (lib) mkOption types;
# This is not a friendly interface to configuring a wireless AP: it # This is not a friendly interface to configuring a wireless AP: it
# just passes everything straight through to the hostapd config. # just passes everything straight through to the hostapd config.

View File

@ -9,7 +9,7 @@ let
in longrun { in longrun {
name = "ifwait.${interface.name}"; name = "ifwait.${interface.name}";
buildInputs = [ service ]; buildInputs = [ service ];
isTrigger = true; restart-on-upgrade = true;
run = '' run = ''
${ifwait}/bin/ifwait -s ${service.name} $(output ${interface} ifname) ${state} ${ifwait}/bin/ifwait -s ${service.name} $(output ${interface} ifname) ${state}
''; '';

View File

@ -5,14 +5,9 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkOption types ;
inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs.liminix.networking) address interface;
inherit (pkgs.liminix.services) bundle;
inherit (pkgs) liminix; inherit (pkgs) liminix;
type_service = pkgs.liminix.lib.types.service;
mergeConditionals = conf : conditions : mergeConditionals = conf : conditions :
# for each key in conditions, if it is present in conf # for each key in conditions, if it is present in conf
# then merge the associated value into conf # then merge the associated value into conf

View File

@ -1,4 +1,4 @@
{ config, pkgs, lib, ...} : { config, pkgs, ...} :
let inherit (pkgs.liminix.services) oneshot longrun; let inherit (pkgs.liminix.services) oneshot longrun;
in { in {
config = { config = {

View File

@ -7,11 +7,6 @@
let let
inherit (lib) mkOption types; inherit (lib) mkOption types;
inherit (pkgs) liminix; inherit (pkgs) liminix;
mkBoolOption = description : mkOption {
type = types.bool;
inherit description;
default = true;
};
in { in {
options = { options = {

View File

@ -5,7 +5,7 @@
}: }:
{ partlabel, mountpoint, options, fstype }: { partlabel, mountpoint, options, fstype }:
let let
inherit (liminix.services) longrun oneshot; inherit (liminix.services) oneshot;
device = "/dev/disk/by-partlabel/${partlabel}"; device = "/dev/disk/by-partlabel/${partlabel}";
name = "mount.${lib.strings.sanitizeDerivationName (lib.escapeURL mountpoint)}"; name = "mount.${lib.strings.sanitizeDerivationName (lib.escapeURL mountpoint)}";
options_string = options_string =

View File

@ -1,6 +1,5 @@
{ {
liminix liminix
, ifwait
, serviceFns , serviceFns
, lib , lib
}: }:

View File

@ -1,7 +1,5 @@
{ {
liminix liminix
, ifwait
, serviceFns
, lib , lib
}: }:
{ enableIPv4, enableIPv6 }: { enableIPv4, enableIPv6 }:

View File

@ -1,7 +1,5 @@
{ {
liminix liminix
, ifwait
, serviceFns
, lib , lib
}: }:
{ {
@ -11,8 +9,7 @@
# if devpath is supplied, we rename the interface at that # if devpath is supplied, we rename the interface at that
# path to have the specified name. # path to have the specified name.
let let
inherit (liminix.services) longrun oneshot; inherit (liminix.services) oneshot;
inherit (lib) concatStringsSep;
name = "${ifname}.link"; name = "${ifname}.link";
rename = if devpath != null rename = if devpath != null
then '' then ''

View File

@ -1,15 +1,15 @@
{ {
liminix liminix
, ifwait
, serviceFns
, lib , lib
}: }:
{ target, via, interface ? null, metric }: { target, via, interface ? null, metric }:
let let
inherit (liminix.services) oneshot; inherit (liminix.services) oneshot;
with_dev = if interface != null then "dev $(output ${interface} ifname)" else ""; with_dev = if interface != null then "dev $(output ${interface} ifname)" else "";
target_hash = builtins.substring 0 12 (builtins.hashString "sha256" target);
via_hash = builtins.substring 0 12 (builtins.hashString "sha256" via);
in oneshot { in oneshot {
name = "route-${target}-${builtins.substring 0 12 (builtins.hashString "sha256" "${via}-${if interface!=null then interface.name else ""}")}"; name = "route-${target_hash}-${builtins.substring 0 12 (builtins.hashString "sha256" "${via_hash}-${if interface!=null then interface.name else ""}")}";
up = '' up = ''
ip route add ${target} via ${via} metric ${toString metric} ${with_dev} ip route add ${target} via ${via} metric ${toString metric} ${with_dev}
''; '';

View File

@ -1,7 +1,6 @@
{ {
liminix liminix
, chrony , chrony
, serviceFns
, lib , lib
, writeText , writeText
}: }:
@ -9,10 +8,6 @@ params:
let let
inherit (liminix.services) longrun; inherit (liminix.services) longrun;
inherit (lib) concatStringsSep mapAttrsToList; inherit (lib) concatStringsSep mapAttrsToList;
inherit (liminix.lib) typeChecked;
inherit (lib) mkOption types;
serverOpts = types.listOf types.str;
configFile = p: configFile = p:
(mapAttrsToList (name: opts: "server ${name} ${concatStringsSep "" opts}") (mapAttrsToList (name: opts: "server ${name} ${concatStringsSep "" opts}")
p.servers) p.servers)

View File

@ -6,7 +6,7 @@
}: }:
let let
inherit (lib) mkOption types concatStringsSep; inherit (lib) mkOption types concatStringsSep;
inherit (pkgs) liminix callPackage writeText; inherit (pkgs) liminix writeText;
o = config.system.outputs; o = config.system.outputs;
in in
{ {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkIf mkOption types; inherit (lib) mkIf;
o = config.system.outputs; o = config.system.outputs;
in in
{ {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkIf mkOption types; inherit (lib) mkIf;
o = config.system.outputs; o = config.system.outputs;
in in
{ {

View File

@ -6,7 +6,7 @@
}: }:
let let
inherit (lib) mkEnableOption mkOption mkIf types; inherit (lib) mkEnableOption mkOption mkIf types;
inherit (pkgs) runCommand callPackage writeText; inherit (pkgs) runCommand;
in in
{ {
options = { options = {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkIf mkOption types; inherit (lib) mkIf;
o = config.system.outputs; o = config.system.outputs;
in in
{ {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkOption mkForce types concatStringsSep; inherit (lib) mkOption types concatStringsSep;
in { in {
imports = [ ../ramdisk.nix ]; imports = [ ../ramdisk.nix ];
options.system.outputs = { options.system.outputs = {
@ -42,8 +42,7 @@ in {
boot-sh = boot-sh =
let let
inherit (pkgs.lib.trivial) toHexString; inherit (config.system.outputs) rootfs;
inherit (config.system.outputs) rootfs kernel;
cmdline = concatStringsSep " " config.boot.commandLine; cmdline = concatStringsSep " " config.boot.commandLine;
in in
pkgs.buildPackages.runCommand "boot.sh.sh" { pkgs.buildPackages.runCommand "boot.sh.sh" {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkOption types concatStringsSep; inherit (lib) mkOption types;
o = config.system.outputs; o = config.system.outputs;
phram_address = lib.toHexString (config.hardware.ram.startAddress + 256 * 1024 * 1024); phram_address = lib.toHexString (config.hardware.ram.startAddress + 256 * 1024 * 1024);
in { in {

View File

@ -58,7 +58,6 @@ in {
system.outputs = rec { system.outputs = rec {
tftpboot = tftpboot =
let let
inherit (pkgs.lib.trivial) toHexString;
o = config.system.outputs; o = config.system.outputs;
image = let choices = { image = let choices = {
uimage = o.uimage; uimage = o.uimage;

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkOption types concatStringsSep; inherit (lib) mkOption types;
o = config.system.outputs; o = config.system.outputs;
cfg = config.tplink-safeloader; cfg = config.tplink-safeloader;
in { in {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkIf mkEnableOption mkOption types concatStringsSep; inherit (lib) mkIf mkOption types;
cfg = config.boot.tftp; cfg = config.boot.tftp;
instructions = pkgs.writeText "env.scr" '' instructions = pkgs.writeText "env.scr" ''
setenv serverip ${cfg.serverip} setenv serverip ${cfg.serverip}

View File

@ -5,7 +5,6 @@
, ... , ...
}: }:
let let
inherit (pkgs) liminix;
inherit (lib) mkIf mkOption types concatStringsSep optionalString; inherit (lib) mkIf mkOption types concatStringsSep optionalString;
in in
{ {

View File

@ -5,7 +5,7 @@
, ... , ...
}: }:
let let
inherit (lib) mkIf mkEnableOption mkOption types concatStringsSep; inherit (lib) mkIf mkOption types;
models = "6b e1 6f e1 ff ff ff ff ff ff"; models = "6b e1 6f e1 ff ff ff ff ff ff";
in { in {
options.system.outputs = { options.system.outputs = {

View File

@ -1,8 +1,5 @@
{ {
liminix liminix
, lib
, ppp
, pppoe
, writeAshScript , writeAshScript
, writeText , writeText
, serviceFns , serviceFns

View File

@ -2,7 +2,7 @@
let let
svc = config.system.service; svc = config.system.service;
cfg = config.profile.gateway; cfg = config.profile.gateway;
inherit (lib) mkOption mkEnableOption mkIf mdDoc types optional optionals; inherit (lib) mkOption mkEnableOption mkIf types;
inherit (pkgs) liminix serviceFns; inherit (pkgs) liminix serviceFns;
inherit (liminix.services) bundle oneshot; inherit (liminix.services) bundle oneshot;
hostaps = hostaps =

View File

@ -5,9 +5,9 @@
... ...
}: let }: let
inherit (pkgs) liminix; inherit (pkgs) liminix;
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ; inherit (lib) mkOption types ;
inherit (pkgs.liminix.services) oneshot longrun bundle target; inherit (pkgs.liminix.services) oneshot target;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) serviceFns; inherit (pkgs) serviceFns;
svc = config.system.service; svc = config.system.service;

View File

@ -1,11 +1,10 @@
{ {
config config
, pkgs
, lib , lib
, ... , ...
}: }:
let let
inherit (lib) mkIf mkEnableOption mkOption; # types concatStringsSep; inherit (lib) mkIf mkEnableOption; # types concatStringsSep;
in { in {
options = { options = {
boot = { boot = {

View File

@ -1,4 +1,4 @@
{ config, pkgs, lib, ... } : { config, pkgs, ... } :
{ {
config = { config = {
programs.busybox = { programs.busybox = {

View File

@ -1,7 +1,6 @@
{ {
liminix liminix
, uevent-watch , uevent-watch
, serviceFns
, lib }: , lib }:
{ {
serviceName, terms, symlink serviceName, terms, symlink
@ -19,6 +18,6 @@ let
termsString = stringify terms; termsString = stringify terms;
in longrun { in longrun {
name = "watch-for-${serviceName}"; name = "watch-for-${serviceName}";
isTrigger = true; restart-on-upgrade = true;
run = "${uevent-watch}/bin/uevent-watch ${if symlink != null then "-n ${symlink}" else ""} -s ${serviceName} ${termsString}"; run = "${uevent-watch}/bin/uevent-watch ${if symlink != null then "-n ${symlink}" else ""} -s ${serviceName} ${termsString}";
} }

View File

@ -1,7 +1,6 @@
{ {
liminix liminix
, dropbear , dropbear
, serviceFns
, lib , lib
}: }:
p : p :

View File

@ -1,7 +1,7 @@
# support for USB block devices and the common filesystems # support for USB block devices and the common filesystems
# they're likely to provide # they're likely to provide
{lib, config, ... }: { config, ... }:
{ {
kernel = { kernel = {
config = { config = {

View File

@ -16,7 +16,7 @@ let
inherit (lib) inherit (lib)
concatStrings concatStringsSep mapAttrsToList mkOption types; concatStrings concatStringsSep mapAttrsToList mkOption types;
inherit (builtins) toString; inherit (builtins) toString;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir;
passwd-file = passwd-file =
let lines = mapAttrsToList (name: u: "${name}:${if u ? passwd then u.passwd else "!!"}:${toString u.uid}:${toString u.gid}:${u.gecos}:${u.dir}:${u.shell}\n" ) let lines = mapAttrsToList (name: u: "${name}:${if u ? passwd then u.passwd else "!!"}:${toString u.uid}:${toString u.gid}:${u.gecos}:${u.dir}:${u.shell}\n" )
config.users; config.users;

View File

@ -13,7 +13,6 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkOption types; inherit (lib) mkOption types;
inherit (pkgs.liminix.services) oneshot;
inherit (pkgs) liminix; inherit (pkgs) liminix;
in in
{ {

View File

@ -1,6 +1,5 @@
{ lib, pkgs, config, ...}: { lib, pkgs, config, ...}:
let let
inherit (lib) mkEnableOption mkOption types isDerivation hasAttr ;
inherit (pkgs.pseudofile) dir symlink; inherit (pkgs.pseudofile) dir symlink;
inherit (pkgs) stdenv wireless-regdb; inherit (pkgs) stdenv wireless-regdb;
regulatory = stdenv.mkDerivation { regulatory = stdenv.mkDerivation {

View File

@ -3,7 +3,7 @@
, lib , lib
, zyxel-bootconfig , zyxel-bootconfig
}: }:
{ ensureActiveImage, primaryMtdPartition, secondaryMtdPartition, bootConfigurationMtdPartition, kernelCommandLineSource }: { ensureActiveImage, bootConfigurationMtdPartition, kernelCommandLineSource }:
let let
inherit (liminix.services) oneshot; inherit (liminix.services) oneshot;
activeImageIndex = if ensureActiveImage == "primary" then 0 else 1; activeImageIndex = if ensureActiveImage == "primary" then 0 else 1;

View File

@ -1,6 +1,4 @@
{ { nellie
lua
, nellie
, writeFennel , writeFennel
, anoia , anoia
, fennel , fennel

View File

@ -1,9 +1,4 @@
{ { lib
runCommand
, runtimeShell
, fetchurl
, lib
, luaPackages
, lua , lua
, lualinux , lualinux
, writeScriptBin , writeScriptBin

View File

@ -7,8 +7,8 @@ name : ruleset :
let let
inherit (lib.strings) concatStringsSep splitString hasInfix substring; inherit (lib.strings) concatStringsSep splitString hasInfix substring;
inherit (lib.lists) groupBy; inherit (lib.lists) groupBy;
inherit (lib.attrsets) mapAttrsToList nameValuePair; inherit (lib.attrsets) mapAttrsToList;
inherit (builtins) map listToAttrs replaceStrings head tail; inherit (builtins) map head tail;
indentLines = offset : lines : indentLines = offset : lines :
if lines == [] if lines == []
@ -31,7 +31,7 @@ let
indent = text : indentLines 0 (splitString "\n" text); indent = text : indentLines 0 (splitString "\n" text);
dochain = { name, type, family, rules, dochain = { name, type, rules,
policy ? null, policy ? null,
priority ? "filter", priority ? "filter",
hook ? null } : '' hook ? null } : ''

View File

@ -1,6 +1,4 @@
{ { netlink-lua
lua
, netlink-lua
, writeFennelScript , writeFennelScript
, runCommand , runCommand
, anoia , anoia

View File

@ -3,9 +3,7 @@
, python2 , python2
, which , which
, fetchgit , fetchgit
, fetchpatch
, fetchFromGitHub , fetchFromGitHub
, autoreconfHook
, coccinelle , coccinelle
}: }:
let let

View File

@ -1,6 +1,5 @@
{ stdenv { stdenv
, buildPackages , buildPackages
, runCommand
, writeText , writeText
, lib , lib

View File

@ -1,7 +1,4 @@
{ { buildPackages
stdenv
, busybox
, buildPackages
, callPackage , callPackage
, pseudofile , pseudofile
, runCommand , runCommand

View File

@ -1,14 +1,11 @@
{ {
stdenvNoCC stdenvNoCC
, s6-rc
, s6 , s6
, lib , lib
, callPackage
, writeScript , writeScript
, serviceFns , serviceFns
}: }:
let let
inherit (builtins) concatStringsSep any map;
prefix = "/run/services/outputs"; prefix = "/run/services/outputs";
output = service: name: "${prefix}/${service.name}/${name}"; output = service: name: "${prefix}/${service.name}/${name}";
serviceScript = commands : '' serviceScript = commands : ''
@ -28,7 +25,6 @@ let
, up ? null , up ? null
, down ? null , down ? null
, finish ? null , finish ? null
, outputs ? []
, notification-fd ? null , notification-fd ? null
, producer-for ? null , producer-for ? null
, consumer-for ? null , consumer-for ? null
@ -38,15 +34,15 @@ let
, dependencies ? [] , dependencies ? []
, contents ? [] , contents ? []
, buildInputs ? [] , buildInputs ? []
, isTrigger ? false , restart-on-upgrade ? false
, controller ? null , controller ? null
} @ args: }:
stdenvNoCC.mkDerivation { stdenvNoCC.mkDerivation {
# we use stdenvNoCC to avoid generating derivations with names # we use stdenvNoCC to avoid generating derivations with names
# like foo.service-mips-linux-musl # like foo.service-mips-linux-musl
inherit name serviceType up down run finish notification-fd inherit name serviceType up down run finish notification-fd
producer-for consumer-for pipeline-name timeout-up timeout-down; producer-for consumer-for pipeline-name timeout-up timeout-down
restart-on-upgrade = isTrigger; restart-on-upgrade;
buildInputs = buildInputs ++ dependencies ++ contents ++ lib.optional (controller != null) controller; buildInputs = buildInputs ++ dependencies ++ contents ++ lib.optional (controller != null) controller;
inherit controller dependencies contents; inherit controller dependencies contents;
builder = ./builder.sh; builder = ./builder.sh;
@ -55,9 +51,7 @@ let
longrun = { longrun = {
name name
, run , run
, outputs ? []
, notification-fd ? null , notification-fd ? null
, dependencies ? []
, buildInputs ? [] , buildInputs ? []
, ... , ...
} @ args: } @ args:
@ -81,8 +75,6 @@ let
name name
, up , up
, down ? "" , down ? ""
, outputs ? []
, dependencies ? []
, ... , ...
} @ args : service (args // { } @ args : service (args // {
serviceType = "oneshot"; serviceType = "oneshot";
@ -91,9 +83,7 @@ let
"${name}-down" "${name}-down"
"${serviceScript down}\n${cleanupScript name}"; "${serviceScript down}\n${cleanupScript name}";
}); });
bundle = { bundle = { contents ? []
name
, contents ? []
, dependencies ? [] , dependencies ? []
, ... , ...
} @ args: service (args // { } @ args: service (args // {

View File

@ -1,4 +1,4 @@
{ lua, lib, fetchFromGitHub }: { lua, fetchFromGitHub }:
let pname = "linotify"; let pname = "linotify";
in lua.pkgs.buildLuaPackage { in lua.pkgs.buildLuaPackage {
inherit pname; inherit pname;

View File

@ -1,4 +1,4 @@
{ lua, lib, fetchFromGitHub }: { lua, fetchFromGitHub }:
let let
pname = "lualinux"; pname = "lualinux";
src = fetchFromGitHub { src = fetchFromGitHub {

View File

@ -22,7 +22,7 @@ let
rev = "a5265497a4f6da158e95d6a450cb2cb6dc085cab"; rev = "a5265497a4f6da158e95d6a450cb2cb6dc085cab";
hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8="; hash = "sha256-YYi4gkpLjbOK7bM2MGQjAyEBuXJ9JNXoz/JEmYf8xE8=";
}; };
inherit (liminix.services) oneshot longrun; inherit (liminix.services) oneshot;
inherit (lib.lists) foldl; inherit (lib.lists) foldl;
configs = { configs = {
ath9k.kconfig = { ath9k.kconfig = {

View File

@ -1,12 +1,8 @@
{ {
stdenv stdenv
, nix
, cpio
, openssh
}: stdenv.mkDerivation { }: stdenv.mkDerivation {
name = "min-collect-garbage"; name = "min-collect-garbage";
buildInputs = [ ]; buildInputs = [ ];
# propagatedBuildInputs = [ openssh ];
src = ./.; src = ./.;
makeFlags = [ "min-list-garbage" ]; makeFlags = [ "min-list-garbage" ];
installPhase = '' installPhase = ''

View File

@ -1,4 +1,4 @@
{ lua, lib, fetchFromGitHub }: { lua, fetchFromGitHub }:
let let
pname = "minisock"; pname = "minisock";
src = fetchFromGitHub { src = fetchFromGitHub {

View File

@ -1,4 +1,4 @@
{ lua, lib, fetchpatch, fetchFromGitHub, stdenv }: { lua, stdenv }:
let pname = "nellie"; let pname = "nellie";
in lua.pkgs.buildLuaPackage { in lua.pkgs.buildLuaPackage {

View File

@ -1,4 +1,4 @@
{ lua, lib, fetchpatch, fetchFromGitHub, libmnl }: { lua, fetchFromGitHub, libmnl }:
let pname = "netlink"; let pname = "netlink";
in lua.pkgs.buildLuaPackage { in lua.pkgs.buildLuaPackage {
inherit pname; inherit pname;

View File

@ -1,7 +1,6 @@
{ {
writeFennelScript writeFennelScript
, anoia , anoia
, lua
, lualinux , lualinux
}: }:
writeFennelScript "odhcpc-script" [anoia lualinux] ./odhcp6-script.fnl writeFennelScript "odhcpc-script" [anoia lualinux] ./odhcp6-script.fnl

View File

@ -1,5 +1,4 @@
{ stdenv { stdenv
, buildPackages
, cmake , cmake
, fetchFromGitHub , fetchFromGitHub
, ...} : , ...} :

View File

@ -1,6 +1,5 @@
{ {
fetchFromGitHub fetchFromGitHub
, writeShellScript
, pkgsBuildBuild , pkgsBuildBuild
}: }:
let let

View File

@ -2,8 +2,6 @@
, stdenv , stdenv
, fetchFromGitHub , fetchFromGitHub
, ppp } : , ppp } :
let
in
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "rp-pppoe"; pname = "rp-pppoe";
version = "3.15"; version = "3.15";

View File

@ -1,14 +1,7 @@
{ {
stdenv stdenv
, fetchzip
, gdb , gdb
}: }:
let kernel = fetchzip {
name = "linux";
url = "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.gz";
hash = "sha256-pq6QNa0PJVeheaZkuvAPD0rLuEeKrViKk65dz+y4kqo=";
};
in
stdenv.mkDerivation { stdenv.mkDerivation {
name = "preinit"; name = "preinit";
src = ./.; src = ./.;

View File

@ -1,6 +1,18 @@
{writeText}: {writeText}:
writeText "service-fns.sh" '' writeText "service-fns.sh" ''
output() { cat $1/.outputs/$2; } output() { cat $1/.outputs/$2; }
output_word() {
set -f
local i=1
for var in $(cat $1/.outputs/$2); do
if test "$i" == "$3" ; then
echo $var
fi
i=$(expr $i + 1)
done
set +f
}
output_path() { echo $(realpath $1/.outputs)/$2; } output_path() { echo $(realpath $1/.outputs)/$2; }
SERVICE_OUTPUTS=/run/services/outputs SERVICE_OUTPUTS=/run/services/outputs
SERVICE_STATE=/run/services/state SERVICE_STATE=/run/services/state

View File

@ -1,7 +1,6 @@
{ {
lua5_3 lua5_3
, stdenv , stdenv
, fetchFromGitHub
, makeWrapper , makeWrapper
} : } :
let let

Some files were not shown because too many files have changed in this diff Show More