|
21 | 21 | cp "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}" xnodeos/bzImage |
22 | 22 | cp "${config.system.build.kexecScript}" xnodeos/install |
23 | 23 | cp "${pkgs.pkgsStatic.kexec-tools}/bin/kexec" xnodeos/kexec |
| 24 | + cp "${pkgs.pkgsStatic.iproute2.override { iptables = null; }}/bin/ip" xnodeos/ip |
24 | 25 | tar -czvf $out/xnodeos-kexec-installer-${pkgs.stdenv.hostPlatform.system}.tar.gz xnodeos |
25 | 26 | ''; |
26 | 27 |
|
|
30 | 31 | pkgs.writeScript "kexec-boot" '' |
31 | 32 | #!/usr/bin/env bash |
32 | 33 | SCRIPT_DIR=$( cd -- "$( dirname -- "''${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) |
| 34 | + NETWORK_CONFIG="{ \"address\": $(''${SCRIPT_DIR}/ip -j address show), \"route\": $(''${SCRIPT_DIR}/ip -j route show) }" |
33 | 35 | ''${SCRIPT_DIR}/kexec --load ''${SCRIPT_DIR}/bzImage \ |
34 | 36 | --initrd=''${SCRIPT_DIR}/initrd \ |
35 | 37 | --command-line "init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams} && $(cat << EOF |
36 | 38 |
|
37 | | - export XNODE_OWNER="''${XNODE_OWNER}" && export DOMAIN="''${DOMAIN}" && export ACME_EMAIL="''${ACME_EMAIL}" && export USER_PASSWD="''${USER_PASSWD}" && export ENCRYPTED="''${ENCRYPTED}" && export INITIAL_CONFIG="''${INITIAL_CONFIG}" |
| 39 | + export XNODE_OWNER="''${XNODE_OWNER}" && export DOMAIN="''${DOMAIN}" && export ACME_EMAIL="''${ACME_EMAIL}" && export USER_PASSWD="''${USER_PASSWD}" && export ENCRYPTED="''${ENCRYPTED}" && export NETWORK_CONFIG="''${NETWORK_CONFIG}" && export INITIAL_CONFIG="''${INITIAL_CONFIG}" |
38 | 40 | EOF |
39 | 41 | )" |
40 | 42 | ''${SCRIPT_DIR}/kexec -e |
|
46 | 48 | sed '2q;d' /proc/cmdline > /tmp/xnode-env |
47 | 49 | source /tmp/xnode-env |
48 | 50 | ''; |
| 51 | + |
| 52 | + systemd.services.apply-network-config = { |
| 53 | + wantedBy = [ "multi-user.target" ]; |
| 54 | + description = "Apply run time provided network config."; |
| 55 | + wants = [ "network-pre.target" ]; |
| 56 | + before = [ "network-pre.target" ]; |
| 57 | + serviceConfig = { |
| 58 | + Type = "oneshot"; |
| 59 | + User = "root"; |
| 60 | + Group = "root"; |
| 61 | + RemainAfterExit = true; |
| 62 | + }; |
| 63 | + path = [ |
| 64 | + pkgs.iproute2 |
| 65 | + pkgs.jq |
| 66 | + ]; |
| 67 | + script = '' |
| 68 | + # Extract environmental variables |
| 69 | + sed '2q;d' /proc/cmdline > /tmp/xnode-env |
| 70 | + source /tmp/xnode-env |
| 71 | +
|
| 72 | + if [[ $NETWORK_CONFIG ]]; then |
| 73 | + interfaces=$(echo "$NETWORK_CONFIG" | jq -c '.address.[]') |
| 74 | + routes=$(echo "$NETWORK_CONFIG" | jq -c '.route.[]') |
| 75 | + for iface in $interfaces; do |
| 76 | + mac=$(echo "$iface" | jq -r '.address') |
| 77 | + og_name=$(echo "$iface" | jq -r '.ifname') |
| 78 | + name=$(grep -l "$mac" /sys/class/net/*/address | sed 's|/sys/class/net/\(.*\)/address|\1|') |
| 79 | +
|
| 80 | + addresses=$(echo "$iface" | jq -c '.addr_info[]') |
| 81 | + for address in $addresses; do |
| 82 | + scope=$(echo "$address" | jq -r '.scope') |
| 83 | + dynamic=$(echo "$address" | jq -r '.dynamic') |
| 84 | +
|
| 85 | + if [ "$scope" != "global" ] || [ "$dynamic" = "true" ]; then |
| 86 | + continue |
| 87 | + fi |
| 88 | +
|
| 89 | + config="$(echo "$address" | jq -r '.local')/$(echo "$address" | jq -r '.prefixlen')" |
| 90 | + ip address add $config dev $name |
| 91 | + done |
| 92 | +
|
| 93 | + for route in $routes; do |
| 94 | + protocol=$(echo "$route" | jq -r '.protocol') |
| 95 | + dev=$(echo "$route" | jq -r '.dev') |
| 96 | +
|
| 97 | + if [ "$protocol" != "static" ] || [ "$dev" != "$og_name" ]; then |
| 98 | + continue |
| 99 | + fi |
| 100 | +
|
| 101 | + config="$(echo "$route" | jq -r '.dst') via $(echo "$route" | jq -r '.gateway')" |
| 102 | + ip route add $config dev $name |
| 103 | + done |
| 104 | + done |
| 105 | + fi |
| 106 | + ''; |
| 107 | + }; |
49 | 108 | } |
0 commit comments