diff options
author | Jonathan Bauer | 2016-12-01 15:42:58 +0100 |
---|---|---|
committer | Jonathan Bauer | 2016-12-01 15:42:58 +0100 |
commit | 542eae6fa0cea1b0e808510fb313e0c897abc6ef (patch) | |
tree | 11d795c15e58a848c5eb2095ebb99de5968f7210 | |
parent | Merge branch 'master' of git.openslx.org:openslx-ng/systemd-init (diff) | |
download | systemd-init-542eae6fa0cea1b0e808510fb313e0c897abc6ef.tar.gz systemd-init-542eae6fa0cea1b0e808510fb313e0c897abc6ef.tar.xz systemd-init-542eae6fa0cea1b0e808510fb313e0c897abc6ef.zip |
Yannick Bilger's WLAN boot prototype
60 files changed, 2378 insertions, 0 deletions
diff --git a/builder/wlan-boot/README b/builder/wlan-boot/README new file mode 100644 index 00000000..71bc5ff5 --- /dev/null +++ b/builder/wlan-boot/README @@ -0,0 +1,152 @@ +############################################ +### README DRACUT MODUL FOR WLAN SUPPORT ### +############################################ + +SHORT LIST OF FILES +============= + +/hooks +/hooks/parse-wlan-kernel-command-line-parameter.sh +/hooks/start_wlan.sh +/hooks/prepare-newroot.sh +/services +/services/dhcp.service +/services/wpa_supplicant.service +/udev +/udev/80-net-wlan.rules +/binaries +/binaries/systemd-preserve-process-marker +/binaries/dhcpcd +/scripts +/scripts/dhcpcd-hooks +/scripts/dhcpcd-hooks/20-resolv.conf +/scripts/dhcpcd-hooks/10-wpa_supplicant +/scripts/dhcpcd-run-hooks +/certs +/certs/Deutsche_Telekom_Root_CA_2.pem +/debug +/debug/services +/debug/services/debug-shell.service +/debug/binaries +/debug/binaries/busybox.tar +/debug/hooks +/debug/hooks/install_busybox.sh +/debug/scripts +/debug/scripts/restart_wpa.sh +/module-setup.sh +/chroot + + +WIFI DRIVER AND CHIP +==================== + +this module was built with the iwlwifi Linux kernel driver and tested with Intel Corporation Centrino Wireless-N 100 + + +BUILDING THE INITRAMFS +====================== + +./build-initramfs.sh -s -d -p initramfs-wlan - --add "wlan crypt" + + +KERNEL COMMAND LINE EXAMPLE FOR EDUROAM +======================================= + +../vmlinuz-centos-old slxsrv=132.230.8.90 slxbase=slx/cos7/ rd.shell rd.break=switch-root ssid=eduroam user=testoslx@hs-offenburg.de pw=password123 + + +SEQUENCE +======== + + ----------------------- cmdline + / | + / | + parse the command line | + v + ----------------------- udev + / | + / | + set the interface name | + v + pre-mount ------------------------ + | \ + | \ + | ------- start wlan ------- + v / \ + ---------------------- pre-pivot / \ + / set link up start dhcpcd.service ------ + / \ + prepare newroot \ + start wpa_supplicant.service + + + + +HOOKS +===== + +cmdline +------- + +/hooks/parse-wlan-kernel-command-line-parameter.sh +search the command line for 'ssid=' and 'pw=' and generates the wpa_supplicant configuration file /etc/wpa_supplicant.conf If you connect to eduroam you also need 'user='. It is important for dhcpcd that the config file includes the path to the ctrl_interface. + + +pre-mount +--------- + +/hooks/start_wlan.sh +this script sets up the wlan interface and starts the dhcp.service. The dhcp.service runs the dhcp client dhcpcd which starts the wpa_supplicant.service if no wpa_supplicant already running. The script is waiting until its possible to ping the slxsrv from the command line. + + +pre-pivot +--------- + +/hooks/prepare-newroot.sh +copy files to the new system and disable NetworkManager + + + +SERVICES +======== + +/services/dhcp.service +this service manages the dhcp client dhcpcd. It will be invoked by the start_wlan.sh script while pre-mount. + +/services/wpa_supplicant.service +this service manages the wpa_supplicant. It will be invoked by dhcpcd. + + +DHCP +==== + +dhcpcd +------ + +the dhcp client we use is dhcpcd. dhcpcd runs /libexec/dhcpcd-run-hooks if an event occurs like no carrier is available. We want to use this hook event to restart wpa_supplicant every time we lost the connection. But in fact it doesnt work after the switch root, cause of any reason dhcpcd doesnt run the script. + + +dhcpcd-run-hooks +---------------- + +dhcpcd-run-hooks is used by dhcpcd to run any system and user defined hook scripts. It executes all scripts in /libexec/dhcpcd-hooks/. + + +/debug/scripts/restart_wpa.sh +----------------------------- + +this script restarts the wpa_supplicant + +DEBUG +===== + +rescue shell +------------ + +after the new system booted you have a busybox available on tty9. You can use this if you lost the connection after the switch root. + + +CHROOT +====== + +here you find an environment which provides dhcpcd and wpa_supplicant. It isnt included automaticly, because its not really tested. For more Information you find some manual steps at chroot/README. diff --git a/builder/wlan-boot/binaries/dhcpcd b/builder/wlan-boot/binaries/dhcpcd Binary files differnew file mode 100755 index 00000000..933e4cc7 --- /dev/null +++ b/builder/wlan-boot/binaries/dhcpcd diff --git a/builder/wlan-boot/binaries/systemd-preserve-process-marker b/builder/wlan-boot/binaries/systemd-preserve-process-marker Binary files differnew file mode 100755 index 00000000..99d1e0c4 --- /dev/null +++ b/builder/wlan-boot/binaries/systemd-preserve-process-marker diff --git a/builder/wlan-boot/certs/Deutsche_Telekom_Root_CA_2.pem b/builder/wlan-boot/certs/Deutsche_Telekom_Root_CA_2.pem new file mode 100644 index 00000000..05879ff3 --- /dev/null +++ b/builder/wlan-boot/certs/Deutsche_Telekom_Root_CA_2.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- diff --git a/builder/wlan-boot/chroot/README b/builder/wlan-boot/chroot/README new file mode 100644 index 00000000..8d6a5e50 --- /dev/null +++ b/builder/wlan-boot/chroot/README @@ -0,0 +1,44 @@ +rd.break=pre-mount: +=================== + +rm /lib/dracut/hooks/pre-mount/00-start-wlan.sh + +MOUNT +===== + +mkdir /chroot +mount -t tmpfs tmpfs /chroot/ +cd /chroot/ +tar xzf /root/environment.tar + +cd environment + +mount -t proc proc proc/ +mount -o bind /sys sys/ +mount -o bind /dev dev/ + +CONFIG +====== + + +cp /etc/wpa_supplicant.conf etc/ + +cd .. + +chroot environment /usr/bin/systemd-preserver-process-marker wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf +chroot environment /usr/bin/systemd-preserver-process-marker dhcpcd wlan0 + + +rd.break=switch-root +==================== + +rm /sysroot/etc/systemd/system/sysinit.target.wants/dhcp.service +rm /sysroot/etc/systemd/system/sysinit.target.wants/wpa_supplicant.service + + +mkdir /sysroot/chroot +mount -o bind /chroot /sysroot/chroot/ + +mount -t proc proc /sysroot/chroot/environment/proc/ +mount -o bind /sys /sysroot/chroot/environment/sys/ +mount -o bind /dev /sysroot/chroot/environment/dev/ diff --git a/builder/wlan-boot/chroot/environment.tar b/builder/wlan-boot/chroot/environment.tar Binary files differnew file mode 100644 index 00000000..2838ecea --- /dev/null +++ b/builder/wlan-boot/chroot/environment.tar diff --git a/builder/wlan-boot/chroot/environment/bin/sh b/builder/wlan-boot/chroot/environment/bin/sh Binary files differnew file mode 100755 index 00000000..5672e081 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/bin/sh diff --git a/builder/wlan-boot/chroot/environment/etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem b/builder/wlan-boot/chroot/environment/etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem new file mode 100644 index 00000000..05879ff3 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- diff --git a/builder/wlan-boot/chroot/environment/lib64/ld-linux-x86-64.so.2 b/builder/wlan-boot/chroot/environment/lib64/ld-linux-x86-64.so.2 Binary files differnew file mode 100755 index 00000000..b39bc468 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/ld-linux-x86-64.so.2 diff --git a/builder/wlan-boot/chroot/environment/lib64/libc.so.6 b/builder/wlan-boot/chroot/environment/lib64/libc.so.6 Binary files differnew file mode 100755 index 00000000..58b51aa6 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libc.so.6 diff --git a/builder/wlan-boot/chroot/environment/lib64/libcom_err.so.2 b/builder/wlan-boot/chroot/environment/lib64/libcom_err.so.2 Binary files differnew file mode 100755 index 00000000..5617634d --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libcom_err.so.2 diff --git a/builder/wlan-boot/chroot/environment/lib64/libcrypto.so.10 b/builder/wlan-boot/chroot/environment/lib64/libcrypto.so.10 Binary files differnew file mode 100755 index 00000000..fcb9e36a --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libcrypto.so.10 diff --git a/builder/wlan-boot/chroot/environment/lib64/libdbus-1.so.3 b/builder/wlan-boot/chroot/environment/lib64/libdbus-1.so.3 Binary files differnew file mode 100755 index 00000000..b024940b --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libdbus-1.so.3 diff --git a/builder/wlan-boot/chroot/environment/lib64/libdl.so.2 b/builder/wlan-boot/chroot/environment/lib64/libdl.so.2 Binary files differnew file mode 100755 index 00000000..3d6cddcb --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libdl.so.2 diff --git a/builder/wlan-boot/chroot/environment/lib64/libgssapi_krb5.so.2 b/builder/wlan-boot/chroot/environment/lib64/libgssapi_krb5.so.2 Binary files differnew file mode 100755 index 00000000..3f5c6a07 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libgssapi_krb5.so.2 diff --git a/builder/wlan-boot/chroot/environment/lib64/libk5crypto.so.3 b/builder/wlan-boot/chroot/environment/lib64/libk5crypto.so.3 Binary files differnew file mode 100755 index 00000000..18d24b6d --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libk5crypto.so.3 diff --git a/builder/wlan-boot/chroot/environment/lib64/libkeyutils.so.1 b/builder/wlan-boot/chroot/environment/lib64/libkeyutils.so.1 Binary files differnew file mode 100755 index 00000000..c9fdf185 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libkeyutils.so.1 diff --git a/builder/wlan-boot/chroot/environment/lib64/libkrb5.so.3 b/builder/wlan-boot/chroot/environment/lib64/libkrb5.so.3 Binary files differnew file mode 100755 index 00000000..20c40016 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libkrb5.so.3 diff --git a/builder/wlan-boot/chroot/environment/lib64/libkrb5support.so.0 b/builder/wlan-boot/chroot/environment/lib64/libkrb5support.so.0 Binary files differnew file mode 100755 index 00000000..08d42cd7 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libkrb5support.so.0 diff --git a/builder/wlan-boot/chroot/environment/lib64/liblzma.so.5 b/builder/wlan-boot/chroot/environment/lib64/liblzma.so.5 Binary files differnew file mode 100755 index 00000000..3e2841a6 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/liblzma.so.5 diff --git a/builder/wlan-boot/chroot/environment/lib64/libm.so.6 b/builder/wlan-boot/chroot/environment/lib64/libm.so.6 Binary files differnew file mode 100755 index 00000000..9e471ce5 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libm.so.6 diff --git a/builder/wlan-boot/chroot/environment/lib64/libnl-3.so.200 b/builder/wlan-boot/chroot/environment/lib64/libnl-3.so.200 Binary files differnew file mode 100755 index 00000000..03733566 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libnl-3.so.200 diff --git a/builder/wlan-boot/chroot/environment/lib64/libnl-genl-3.so.200 b/builder/wlan-boot/chroot/environment/lib64/libnl-genl-3.so.200 Binary files differnew file mode 100755 index 00000000..2fbb7caa --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libnl-genl-3.so.200 diff --git a/builder/wlan-boot/chroot/environment/lib64/libpcre.so.1 b/builder/wlan-boot/chroot/environment/lib64/libpcre.so.1 Binary files differnew file mode 100755 index 00000000..4e100f6b --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libpcre.so.1 diff --git a/builder/wlan-boot/chroot/environment/lib64/libpthread.so.0 b/builder/wlan-boot/chroot/environment/lib64/libpthread.so.0 Binary files differnew file mode 100755 index 00000000..f3b670d7 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libpthread.so.0 diff --git a/builder/wlan-boot/chroot/environment/lib64/libresolv.so.2 b/builder/wlan-boot/chroot/environment/lib64/libresolv.so.2 Binary files differnew file mode 100755 index 00000000..08ea9aed --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libresolv.so.2 diff --git a/builder/wlan-boot/chroot/environment/lib64/librt.so.1 b/builder/wlan-boot/chroot/environment/lib64/librt.so.1 Binary files differnew file mode 100755 index 00000000..d19805a0 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/librt.so.1 diff --git a/builder/wlan-boot/chroot/environment/lib64/libselinux.so.1 b/builder/wlan-boot/chroot/environment/lib64/libselinux.so.1 Binary files differnew file mode 100755 index 00000000..22335824 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libselinux.so.1 diff --git a/builder/wlan-boot/chroot/environment/lib64/libssl.so.10 b/builder/wlan-boot/chroot/environment/lib64/libssl.so.10 Binary files differnew file mode 100755 index 00000000..163d81b3 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libssl.so.10 diff --git a/builder/wlan-boot/chroot/environment/lib64/libtinfo.so.5 b/builder/wlan-boot/chroot/environment/lib64/libtinfo.so.5 Binary files differnew file mode 100755 index 00000000..74001427 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libtinfo.so.5 diff --git a/builder/wlan-boot/chroot/environment/lib64/libz.so.1 b/builder/wlan-boot/chroot/environment/lib64/libz.so.1 Binary files differnew file mode 100755 index 00000000..257c46b1 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/lib64/libz.so.1 diff --git a/builder/wlan-boot/chroot/environment/libexec/dhcpcd-hooks/10-wpa_supplicant b/builder/wlan-boot/chroot/environment/libexec/dhcpcd-hooks/10-wpa_supplicant new file mode 100755 index 00000000..adea9957 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/libexec/dhcpcd-hooks/10-wpa_supplicant @@ -0,0 +1,118 @@ +# Start, reconfigure and stop wpa_supplicant per wireless interface. +# This is needed because wpa_supplicant lacks hotplugging of any kind +# and the user should not be expected to have to wire it into their system +# if the base system doesn't do this itself. + +if [ -z "$wpa_supplicant_conf" ]; then + for x in \ + /etc/wpa_supplicant/wpa_supplicant-"$interface".conf \ + /etc/wpa_supplicant/wpa_supplicant.conf \ + /etc/wpa_supplicant-"$interface".conf \ + /etc/wpa_supplicant.conf \ + ; do + if [ -s "$x" ]; then + wpa_supplicant_conf="$x" + break + fi + done +fi +: ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf} + +wpa_supplicant_ctrldir() +{ + local dir + + dir=$(key_get_value "[[:space:]]*ctrl_interface=" \ + "$wpa_supplicant_conf") + dir=$(trim "$dir") + case "$dir" in + DIR=*) + dir=${dir##DIR=} + dir=${dir%%[[:space:]]GROUP=*} + dir=$(trim "$dir") + ;; + esac + printf %s "$dir" +} + +wpa_supplicant_start() +{ + local dir err errn + + # If the carrier is up, don't bother checking anything + [ "$ifcarrier" = "up" ] && return 0 + + # Pre flight checks + if [ ! -s "$wpa_supplicant_conf" ]; then + syslog warn \ + "$wpa_supplicant_conf does not exist" + syslog warn "not interacting with wpa_supplicant(8)" + return 1 + fi + dir=$(wpa_supplicant_ctrldir) + if [ -z "$dir" ]; then + syslog warn \ + "ctrl_interface not defined in $wpa_supplicant_conf" + syslog warn "not interacting with wpa_supplicant(8)" + return 1 + fi + + wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0 + syslog info "starting wpa_supplicant" + driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver + err=$(systemctl start wpa_supplicant 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to start wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +wpa_supplicant_reconfigure() +{ + local dir err errn + + dir=$(wpa_supplicant_ctrldir) + [ -z "$dir" ] && return 1 + if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then + wpa_supplicant_start + return $? + fi + syslog info "reconfiguring wpa_supplicant" + err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to reconfigure wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +wpa_supplicant_stop() +{ + local dir err errn + + dir=$(wpa_supplicant_ctrldir) + [ -z "$dir" ] && return 1 + wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0 + syslog info "stopping wpa_supplicant" + err=$(wpa_cli -i"$interface" terminate 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to start wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +if [ "$ifwireless" = "1" ] && \ + type wpa_supplicant >/dev/null 2>&1 && \ + type wpa_cli >/dev/null 2>&1 +then + case "$reason" in + PREINIT|NOCARRIER) wpa_supplicant_start;; + RECONFIGURE) wpa_supplicant_reconfigure;; + DEPARTED) wpa_supplicant_stop;; + esac +fi diff --git a/builder/wlan-boot/chroot/environment/libexec/dhcpcd-run-hooks b/builder/wlan-boot/chroot/environment/libexec/dhcpcd-run-hooks new file mode 100755 index 00000000..8caf0dc9 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/libexec/dhcpcd-run-hooks @@ -0,0 +1,387 @@ +#!/bin/sh +# dhcpcd client configuration script + +# Handy variables and functions for our hooks to use +case "$reason" in + ROUTERADVERT) + ifsuffix=".ra";; + INFORM6|BOUND6|RENEW6|REBIND6|REBOOT6|EXPIRE6|RELEASE6|STOP6) + ifsuffix=".dhcp6";; + IPV4LL) + ifsuffix=".ipv4ll";; + *) + ifsuffix=".dhcp";; +esac +ifname="$interface$ifsuffix" + +from=from +signature_base="# Generated by dhcpcd" +signature="$signature_base $from $ifname" +signature_base_end="# End of dhcpcd" +signature_end="$signature_base_end $from $ifname" +state_dir=/var/run/dhcpcd +_detected_init=false + +: ${if_up:=false} +: ${if_down:=false} +: ${syslog_debug:=false} + +# Ensure that all arguments are unique +uniqify() +{ + local result= i= + for i do + case " $result " in + *" $i "*);; + *) result="$result $i";; + esac + done + echo "${result# *}" +} + +# List interface config files in a directory. +# If dhcpcd is running as a single instance then it will have a list of +# interfaces in the preferred order. +# Otherwise we just use what we have. +list_interfaces() +{ + local i= x= ifaces= + for i in $interface_order; do + for x in "$1"/$i.*; do + [ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}" + done + done + for x in "$1"/*; do + [ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}" + done + uniqify $ifaces +} + +# Trim function +trim() +{ + local var="$*" + + var=${var#"${var%%[![:space:]]*}"} + var=${var%"${var##*[![:space:]]}"} + if [ -z "$var" ]; then + # So it seems our shell doesn't support wctype(3) patterns + # Fall back to sed + var=$(echo "$*" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//') + fi + printf %s "$var" +} + +# We normally use sed to extract values using a key from a list of files +# but sed may not always be available at the time. +key_get_value() +{ + local key="$1" value= x= line= + + shift + if type sed >/dev/null 2>&1; then + sed -n "s/^$key//p" $@ + else + for x do + while read line; do + case "$line" in + "$key"*) echo "${line##$key}";; + esac + done < "$x" + done + fi +} + +# We normally use sed to remove markers from a configuration file +# but sed may not always be available at the time. +remove_markers() +{ + local m1="$1" m2="$2" x= line= in_marker=0 + + shift; shift + if type sed >/dev/null 2>&1; then + sed "/^$m1/,/^$m2/d" $@ + else + for x do + while read line; do + case "$line" in + "$m1"*) in_marker=1;; + "$m2"*) in_marker=0;; + *) [ $in_marker = 0 ] && echo "$line";; + esac + done < "$x" + done + fi +} + +# Compare two files. +comp_file() +{ + + [ -e "$1" -a -e "$2" ] || return 1 + + if type cmp >/dev/null 2>&1; then + cmp -s "$1" "$2" + elif type diff >/dev/null 2>&1; then + diff -q "$1" "$2" >/dev/null + else + # Hopefully we're only working on small text files ... + [ "$(cat "$1")" = "$(cat "$2")" ] + fi +} + +# Compare two files. +# If different, replace first with second otherwise remove second. +change_file() +{ + + if [ -e "$1" ]; then + if comp_file "$1" "$2"; then + rm -f "$2" + return 1 + fi + fi + cat "$2" > "$1" + rm -f "$2" + return 0 +} + +# Compare two files. +# If different, copy or link depending on target type +copy_file() +{ + + if [ -h "$2" ]; then + [ "$(readlink "$2")" = "$1" ] && return 1 + ln -sf "$1" "$2" + else + comp_file "$1" "$2" && return 1 + cat "$1" >"$2" + fi +} + +# Save a config file +save_conf() +{ + + if [ -f "$1" ]; then + rm -f "$1-pre.$interface" + cat "$1" > "$1-pre.$interface" + fi +} + +# Restore a config file +restore_conf() +{ + + [ -f "$1-pre.$interface" ] || return 1 + cat "$1-pre.$interface" > "$1" + rm -f "$1-pre.$interface" +} + +# Write a syslog entry +syslog() +{ + local lvl="$1" + + if [ "$lvl" = debug ]; then + ${syslog_debug} || return 0 + fi + [ -n "$lvl" ] && shift + [ -n "$*" ] || return 0 + case "$lvl" in + err|error) echo "$interface: $*" >&2;; + *) echo "$interface: $*";; + esac + if type logger >/dev/null 2>&1; then + logger -i -p daemon."$lvl" -t dhcpcd-run-hooks "$interface: $*" + fi +} + +# Check for a valid domain name as per RFC1123 with the exception of +# allowing - and _ as they seem to be widely used. +valid_domainname() +{ + local name="$1" label + + [ -z "$name" -o ${#name} -gt 255 ] && return 1 + + while [ -n "$name" ]; do + label="${name%%.*}" + [ -z "$label" -o ${#label} -gt 63 ] && return 1 + case "$label" in + -*|_*|*-|*_) return 1;; + # some sh require - as the first or last character in the class + # when matching it + *[![:alnum:]_-]*) return 1;; + esac + [ "$name" = "${name#*.}" ] && break + name="${name#*.}" + done + return 0 +} + +valid_domainname_list() +{ + local name + + for name do + valid_domainname "$name" || return $? + done + return 0 +} + +# Check for a valid path +valid_path() +{ + + case "$@" in + *[![:alnum:]#%+-_:\.,@~\\/\[\]=\ ]*) return 1;; + esac + return 0 +} + +# With the advent of alternative init systems, it's possible to have +# more than one installed. So we need to try and guess what one we're +# using unless overriden by configure. +detect_init() +{ + _service_exists="" + _service_cmd="" + _service_status="" + + [ -n "$_service_cmd" ] && return 0 + + if ${_detected_init}; then + [ -n "$_service_cmd" ] + return $? + fi + + # Detect the running init system. + # As systemd and OpenRC can be installed on top of legacy init + # systems we try to detect them first. + local status="" + : ${status:=status} + if [ -x /bin/systemctl -a -S /run/systemd/private ]; then + _service_exists="/bin/systemctl --quiet is-enabled \$1.service" + _service_status="/bin/systemctl --quiet is-active \$1.service" + _service_cmd="/bin/systemctl \$2 \$1.service" + elif [ -x /usr/bin/systemctl -a -S /run/systemd/private ]; then + _service_exists="/usr/bin/systemctl --quiet is-enabled \$1.service" + _service_status="/usr/bin/systemctl --quiet is-active \$1.service" + _service_cmd="/usr/bin/systemctl \$2 \$1.service" + elif [ -x /sbin/rc-service -a \ + -s /libexec/rc/init.d/softlevel -o -s /run/openrc/softlevel ] + then + _service_exists="/sbin/rc-service -e \$1" + _service_cmd="/sbin/rc-service \$1 -- -D \$2" + elif [ -x /usr/sbin/invoke-rc.d ]; then + _service_exists="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]" + _service_cmd="/usr/sbin/invoke-rc.d \$1 \$2" + elif [ -x /sbin/service ]; then + _service_exists="/sbin/service \$1 >/dev/null 2>&1" + _service_cmd="/sbin/service \$1 \$2" + elif [ -x /usr/sbin/service ]; then + _service_exists="/usr/sbin/service \$1 $status >/dev/null 2>&1" + _service_cmd="/usr/sbin/service \$1 \$2" + elif [ -x /bin/sv ]; then + _service_exists="/bin/sv status \1 >/dev/null 2>&1" + _service_cmd="/bin/sv \$1 \$2" + elif [ -x /usr/bin/sv ]; then + _service_exists="/usr/bin/sv status \1 >/dev/null 2>&1" + _service_cmd="/usr/bin/sv \$1 \$2" + elif [ -e /etc/slackware-version -a -d /etc/rc.d ]; then + _service_exists="[ -x /etc/rc.d/rc.\$1 ]" + _service_cmd="/etc/rc.d/rc.\$1 \$2" + _service_status="/etc/rc.d/rc.\$1 status >/dev/null 2>&1" + else + for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do + if [ -d $x ]; then + _service_exists="[ -x $x/\$1 ]" + _service_cmd="$x/\$1 \$2" + _service_status="$x/\$1 $status >/dev/null 2>&1" + break + fi + done + if [ -e /etc/arch-release ]; then + _service_status="[ -e /var/run/daemons/\$1 ]" + elif [ "$x" = "/etc/rc.d" -a -e /etc/rc.d/rc.subr ]; then + _service_status="$x/\$1 check >/dev/null 2>&1" + fi + fi + + _detected_init=true + if [ -z "$_service_cmd" ]; then + syslog err "could not detect a useable init system" + return 1 + fi + return 0 +} + +# Check a system service exists +service_exists() +{ + + if [ -z "$_service_exists" ]; then + detect_init || return 1 + fi + eval $_service_exists +} + +# Send a command to a system service +service_cmd() +{ + + if [ -z "$_service_cmd" ]; then + detect_init || return 1 + fi + eval $_service_cmd +} + +# Send a command to a system service if it is running +service_status() +{ + + if [ -z "$_service_cmd" ]; then + detect_init || return 1 + fi + if [ -n "$_service_status" ]; then + eval $_service_status + else + service_command $1 status >/dev/null 2>&1 + fi +} + +# Handy macros for our hooks +service_command() +{ + + service_exists $1 && service_cmd $1 $2 +} +service_condcommand() +{ + + service_exists $1 && service_status $1 && service_cmd $1 $2 +} + +# We source each script into this one so that scripts run earlier can +# remove variables from the environment so later scripts don't see them. +# Thus, the user can create their dhcpcd.enter/exit-hook script to configure +# /etc/resolv.conf how they want and stop the system scripts ever updating it. +for hook in \ + /etc/dhcpcd.enter-hook \ + /libexec/dhcpcd-hooks/* \ + /etc/dhcpcd.exit-hook +do + for skip in $skip_hooks; do + case "$hook" in + */*~) continue 2;; + */"$skip") continue 2;; + */[0-9][0-9]"-$skip") continue 2;; + */[0-9][0-9]"-$skip.sh") continue 2;; + esac + done + if [ -f "$hook" ]; then + . "$hook" + fi +done diff --git a/builder/wlan-boot/chroot/environment/usr/bin/systemd-preserve-process-marker b/builder/wlan-boot/chroot/environment/usr/bin/systemd-preserve-process-marker Binary files differnew file mode 100755 index 00000000..99d1e0c4 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/usr/bin/systemd-preserve-process-marker diff --git a/builder/wlan-boot/chroot/environment/usr/sbin/dhcpcd b/builder/wlan-boot/chroot/environment/usr/sbin/dhcpcd Binary files differnew file mode 100755 index 00000000..933e4cc7 --- /dev/null +++ b/builder/wlan-boot/chroot/environment/usr/sbin/dhcpcd diff --git a/builder/wlan-boot/chroot/environment/usr/sbin/wpa_supplicant b/builder/wlan-boot/chroot/environment/usr/sbin/wpa_supplicant Binary files differnew file mode 100755 index 00000000..39ddd72d --- /dev/null +++ b/builder/wlan-boot/chroot/environment/usr/sbin/wpa_supplicant diff --git a/builder/wlan-boot/chroot/wpa_libs.lst b/builder/wlan-boot/chroot/wpa_libs.lst new file mode 100644 index 00000000..ed5fa99e --- /dev/null +++ b/builder/wlan-boot/chroot/wpa_libs.lst @@ -0,0 +1,21 @@ +/lib64/libnl-3.so.200 +/lib64/libnl-genl-3.so.200 +/lib64/libdl.so.2 +/lib64/libssl.so.10 +/lib64/libcrypto.so.10 +/lib64/libdbus-1.so.3 +/lib64/libc.so.6 +/lib64/libpthread.so.0 +/lib64/libm.so.6 +/lib64/libgssapi_krb5.so.2 +/lib64/libkrb5.so.3 +/lib64/libcom_err.so.2 +/lib64/libk5crypto.so.3 +/lib64/libz.so.1 +/lib64/librt.so.1 +/lib64/libkrb5support.so.0 +/lib64/libkeyutils.so.1 +/lib64/libresolv.so.2 +/lib64/libselinux.so.1 +/lib64/libpcre.so.1 +/lib64/liblzma.so.5 diff --git a/builder/wlan-boot/debug/binaries/busybox.tar b/builder/wlan-boot/debug/binaries/busybox.tar Binary files differnew file mode 100755 index 00000000..b5ac4a64 --- /dev/null +++ b/builder/wlan-boot/debug/binaries/busybox.tar diff --git a/builder/wlan-boot/debug/hooks/install_busybox.sh b/builder/wlan-boot/debug/hooks/install_busybox.sh new file mode 100755 index 00000000..3b763f0e --- /dev/null +++ b/builder/wlan-boot/debug/hooks/install_busybox.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +#tar xf /root/busybox.tar -C /sysroot/usr/sbin/ usr/sbin/udhcpc +#tar xf /root/busybox.tar -C /sysroot/usr/bin/ usr/bin/busybox +tar xf /root/busybox.tar -C /sysroot/opt/openslx/ diff --git a/builder/wlan-boot/debug/scripts/restart_wpa.sh b/builder/wlan-boot/debug/scripts/restart_wpa.sh new file mode 100755 index 00000000..3e284772 --- /dev/null +++ b/builder/wlan-boot/debug/scripts/restart_wpa.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +PID=$(pgrep wpa_supplicant) +systemctl stop wpa_supplicant +kill -9 "$PID" +systemctl start wpa_supplicant +ip route add default via 10.125.1.254 dev wlan0 &>> /tmp/wlan.log diff --git a/builder/wlan-boot/debug/services/debug-shell.service b/builder/wlan-boot/debug/services/debug-shell.service new file mode 100644 index 00000000..462694a6 --- /dev/null +++ b/builder/wlan-boot/debug/services/debug-shell.service @@ -0,0 +1,33 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=Early root shell on /dev/tty9 FOR DEBUGGING ONLY +Documentation=man:sushell(8) +DefaultDependencies=no +IgnoreOnIsolate=yes + +[Service] +Environment=TERM=linux +ExecStart=/opt/openslx/usr/bin/busybox ash +Restart=always +RestartSec=0 +StandardInput=tty +TTYPath=/dev/tty9 +TTYReset=yes +TTYVHangup=yes +KillMode=process +IgnoreSIGPIPE=no +# bash ignores SIGTERM +KillSignal=SIGHUP + +# Unset locale for the console getty since the console has problems +# displaying some internationalized messages. +Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION= + +[Install] +WantedBy=sysinit.target diff --git a/builder/wlan-boot/hooks/parse-wlan-kernel-command-line-parameter.sh b/builder/wlan-boot/hooks/parse-wlan-kernel-command-line-parameter.sh new file mode 100755 index 00000000..dbda284c --- /dev/null +++ b/builder/wlan-boot/hooks/parse-wlan-kernel-command-line-parameter.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# this hook will be executed in cmdline as 10 + +# generate the config file for wpa_supplicant from +# the kernel commandline parameters + +WIFACE=wlan0 +CONFDIR=/etc/ +WPACONF="$CONFDIR"/wpa_supplicant.conf + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +SSID=$(getarg ssid=) +PASSWORD=$(getarg pw=) +USERNAME=$(getarg user=) + +if [ "$SSID" = "eduroam" ]; then + # write ssid and pw in wpa_supplicant.conf + cat > "$WPACONF" << EOF + # path to UNIX socket control interface + ctrl_interface=/var/run/wpa_supplicant + ap_scan=1 + network={ + ssid="$SSID" + proto=RSN + key_mgmt=WPA-EAP + eap=TTLS + identity="$USERNAME" + password="$PASSWORD" + ca_cert="$CONFDIR/ssl/certs/Deutsche_Telekom_Root_CA_2.pem" + phase2="auth=MSCHAPv2" + } +EOF +else + echo "ctrl_interface=/var/run/wpa_supplicant" > "$WPACONF" + wpa_passphrase "$SSID" "$PASSWORD" >> "$WPACONF" +fi diff --git a/builder/wlan-boot/hooks/prepare-newroot.sh b/builder/wlan-boot/hooks/prepare-newroot.sh new file mode 100755 index 00000000..c58ea15c --- /dev/null +++ b/builder/wlan-boot/hooks/prepare-newroot.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +# copy the wpa_supplicant.service to the new system to prevent systemd +# killing the wpa_supplicant process + +# this hook will be executed in pre-pivot as 00 + +# get the systemd path on the new system +systemd_system_unit_path="/etc/systemd/system" +new_systemd_system_unit_path="${NEWROOT}""$systemd_system_unit_path" + +#### copy from the current to the new system +cp "/usr/bin/systemd-preserve-process-marker" "${NEWROOT}/usr/bin/systemd-preserve-process-marker" +#cp "/usr/bin/simple.script" "${NEWROOT}/usr/bin/simple.script" + +## dhcpcd +cp "/etc/systemd/system/dhcp.service" "${new_systemd_system_unit_path}/dhcp.service" +cp "/usr/sbin/dhcpcd" "/sysroot/usr/sbin/dhcpcd" +mkdir -p /sysroot/libexec/ +#mount -t tmpfs tmpfs /sysroot/libexec/ +cp -r /libexec/* "${NEWROOT}/libexec/" + +## wpa_supplicant +cp "/etc/systemd/system/wpa_supplicant.service" "${new_systemd_system_unit_path}/wpa_supplicant.service" +mkdir --parents "${NEWROOT}/etc" +cp /etc/wpa_supplicant.conf "${NEWROOT}/etc/wpa_supplicant.conf" + +## certificate +mkdir --parents "${NEWROOT}/etc/ssl/certs" +cp /etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem "${NEWROOT}/etc/ssl/certs" + +## linking in sysinit.target.wants +mkdir --parents "${new_systemd_system_unit_path}/sysinit.target.wants" +cd "${new_systemd_system_unit_path}/sysinit.target.wants" +! ln --symbolic '../wpa_supplicant.service' +! ln --symbolic '../dhcp.service' + +# disable NetworkManager.service +rm /sysroot/etc/systemd/system/dbus-org.freedesktop.NetworkManager.service +rm /sysroot/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service +rm /sysroot/etc/systemd/system/multi-user.target.wants/NetworkManager.service + + +### DEBUG ### +cp /root/debug-shell.service ${NEWROOT}/etc/systemd/system/debug-shell.service +! ln --symbolic '../debug-shell.service' +cp /usr/sbin/restart_wpa /sysroot/usr/sbin/restart_wpa diff --git a/builder/wlan-boot/hooks/start_wlan.sh b/builder/wlan-boot/hooks/start_wlan.sh new file mode 100755 index 00000000..c39b9161 --- /dev/null +++ b/builder/wlan-boot/hooks/start_wlan.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +shell () { + if [ $# -eq 0 ] ; then + REASON="Unknown Reason" + else + REASON="$1" + fi + warn '' + warn "ERROR: $REASON" + warn ' Entering rescue shell.' + warn ' Exit shell to continue booting.' + emergency_shell +} + +# wiface name should be wlan0, if not udev failed +WIFACE=wlan0 +timeout=20 +#LEASES="/var/lib/dhcp/dhclient.leases" + +### OLD, now use dhcpcd +## Install udhcpc (maybe do this in module-setup-sh) +#[ -f /root/busybox.tar ] || shell "cant find /root/busybox.tar" +#tar xf /root/busybox.tar usr/bin/busybox +#tar xf /root/busybox.tar usr/sbin/udhcpc + +# require the 99base dracut module +type strstr >/dev/null 2>&1 || . /lib/dracut-lib.sh || shell "/lib/dracut-lib.sh doesnt exist" + +# set interface up +cnt=0 +while [ $cnt -lt $timeout ]; do + if [ -e /sys/class/net/wlan0 ] ; then + /sbin/ip link set dev "$WIFACE" up || shell "Could not set dev $WIFACE up" + break + fi + sleep 1 + cnt=$(($cnt+1)) + warn "waiting for wlan interface up ("$cnt"s / 20s)" + [ $cnt -eq $timeout ] && shell "Could not find a valid wlan interface, make sure its enabled by hardware side" +done + +## start wpa_supplicant service +#systemctl start wpa_supplicant.service || shell "Could not start wpa_supplicant.service" +# +## wait for wpa_supplicant, similair to the network dracut module 40network/net-lib.sh +#cnt=0 +#while [ $cnt -lt $timeout ]; do +# li=$(ip -o link show up dev "$WIFACE") +# if ! strstr "$li" "NO-CARRIER"; then +# if [ -n "$li" ]; then +# case "$li" in +# *\<UP*) +# break;; +# *\<*,UP\>*) +# break;; +# *\<*,UP,*\>*) +# break;; +# esac +# fi +# fi +# sleep 1 +# cnt=$(($cnt+1)) +# warn "Waiting for wpa_supplicant. Make sure interface is up and the AP is reachable with the correct credentials ("$cnt"s / 20s)" +# [ $cnt -eq $timeout ] && shell "Could not find a CARRIER please check the credentials and if the AP is active" +#done + +systemctl start dhcp.service || shell "Could not start dhcp.service" + +## wait for dhcpcd +SLXSRV=$(getarg slxsrv=) +cnt=0 +while [ $cnt -lt $timeout ]; do + ping -c 1 -q "$SLXSRV" + if [ $? -eq 0 ] ; then + break + fi + sleep 1 + cnt=$(($cnt+1)) + warn "Waiting for dhcpcd. Make sure wpa_supplicant finished startup and slxserver $SLXSRV is reachable ("$cnt"s / 20s)" + [ $cnt -eq $timeout ] && shell "Could not ping slx server." +done + +## dhclient didnt set route, now i use dhcpcd this works fine +# set route +#TODO: look into /sbin/dhclient-script why no route is set automaticly +##ADDRESS=$(sed -n '/wlan0/,/}/p' $LEASES | grep 'fixed-address' | sort -u | awk -F' ' '{print $2}' | awk -F';' '{print $1}' | head -1) +#ROUTE=$(sed -n '/wlan0/,/}/p' $LEASES | grep 'option routers' | sort -u | awk -F' ' '{print $3}' | awk -F';' '{print $1}'| head -1) +#echo "ROUTE=$ROUTE" >> /tmp/wlan.log +# +##ip addr add "$ADDRESS/24" dev "$WIFACE" +#ip route add default via "$ROUTE" dev "$WIFACE" &>> /tmp/wlan.log +#echo $? >> /tmp/wlan.log diff --git a/builder/wlan-boot/module-setup.sh b/builder/wlan-boot/module-setup.sh new file mode 100755 index 00000000..d944c1a9 --- /dev/null +++ b/builder/wlan-boot/module-setup.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# called by dracut +check() { + return 255 +} + +# called by dracut +depends() { + return 0 +} + +installkernel() { + instmods cfg80211 mac80211 rtl8192cu iwlwifi iwldvm +} + +# called by dracut +install() { + + + # SYSTEMD PRESERVE SCRIPT + inst_script "$moddir/binaries/systemd-preserve-process-marker" /usr/bin/systemd-preserve-process-marker + + # PARSE COMMAND LINE + inst_hook cmdline 10 "$moddir/hooks/parse-wlan-kernel-command-line-parameter.sh" + + # PREPARE NEWROOT + inst_hook pre-pivot 00 "$moddir/hooks/prepare-newroot.sh" + + # STARTSCRIPT WPA AND DHCP + inst_hook pre-mount 00 "$moddir/hooks/start_wlan.sh" + #inst_script "$moddir/scripts/start_wlan.sh" /usr/sbin/start_wlan + + # UDEV + inst_script "$moddir/udev/80-net-wlan.rules" /etc/udev/rules.d/80-net-wlan.rules + + # DHCP + mkdir -m 0755 -p ${initdir}"/libexec" + mkdir -m 0755 -p ${initdir}"/libexec/dhcpcd-hooks" + inst_script "$moddir/scripts/dhcpcd-run-hooks" /libexec/dhcpcd-run-hooks + inst_script "$moddir/binaries/dhcpcd" /usr/sbin/dhcpcd + inst_simple "$moddir/services/dhcp.service" "/etc/systemd/system/dhcp.service" + mkdir -m 0755 -p ${initdir}"/etc/dhcpcd.enter-hook" + inst_script "$moddir/scripts/dhcpcd-hooks/20-resolv.conf" /libexec/dhcpcd-hooks/20-resolv.conf + inst_script "$moddir/scripts/dhcpcd-hooks/10-wpa_supplicant" /libexec/dhcpcd-hooks/10-wpa_supplicant + + # WPA + mkdir -m 0755 -p ${initdir}"/etc/ssl/certs" + inst_simple "$moddir/certs/Deutsche_Telekom_Root_CA_2.pem" /etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem + inst_simple "$moddir/services/wpa_supplicant.service" "/etc/systemd/system/wpa_supplicant.service" + inst_simple "$moddir/services/newroot_wpa_supplicant.service" "/root/newroot_wpa_supplicant.service" + + # CHROOT ENVIRONMENT + inst_simple "$moddir/chroot/environment.tar" "/root/environment.tar" + + #### DEBUG #### + inst_simple "$moddir/debug/binaries/busybox.tar" "/root/busybox.tar" + inst_simple "$moddir/debug/services/debug-shell.service" "/root/debug-shell.service" + inst_simple "$moddir/debug/services/test.service" "/etc/systemd/system/test.service" + inst_simple "$moddir/debug/scripts/test.sh" "/usr/bin/test" + inst_hook pre-pivot 10 "$moddir/debug/hooks/install_busybox.sh" + inst_script "$moddir/debug/scripts/restart_wpa.sh" /usr/sbin/restart_wpa + + inst_multiple wpa_passphrase ip wpa_supplicant wpa_cli rfkill iw crda ps grep sort awk head dhclient vim ifconfig route pgrep wc chmod date +} diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/01-test b/builder/wlan-boot/scripts/dhcpcd-hooks/01-test new file mode 100755 index 00000000..d4cf8281 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/01-test @@ -0,0 +1,8 @@ +# Echo the interface flags, reason and message options + +if [ "$reason" = "TEST" ]; then + set | grep "^\(interface\|pid\|reason\|profile\|skip_hooks\)=" | sort + set | grep "^if\(carrier\|flags\|mtu\|wireless\|ssid\)=" | sort + set | grep "^\(new_\|old_\|nd[0-9]*_\)" | sort + exit 0 +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/02-dump b/builder/wlan-boot/scripts/dhcpcd-hooks/02-dump new file mode 100755 index 00000000..0d515f78 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/02-dump @@ -0,0 +1,8 @@ +# Just echo our DHCP options we have + +case "$reason" in +DUMP|DUMP6) + set | sed -ne 's/^new_//p' | sort + exit 0 + ;; +esac diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/10-wpa_supplicant b/builder/wlan-boot/scripts/dhcpcd-hooks/10-wpa_supplicant new file mode 100755 index 00000000..adea9957 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/10-wpa_supplicant @@ -0,0 +1,118 @@ +# Start, reconfigure and stop wpa_supplicant per wireless interface. +# This is needed because wpa_supplicant lacks hotplugging of any kind +# and the user should not be expected to have to wire it into their system +# if the base system doesn't do this itself. + +if [ -z "$wpa_supplicant_conf" ]; then + for x in \ + /etc/wpa_supplicant/wpa_supplicant-"$interface".conf \ + /etc/wpa_supplicant/wpa_supplicant.conf \ + /etc/wpa_supplicant-"$interface".conf \ + /etc/wpa_supplicant.conf \ + ; do + if [ -s "$x" ]; then + wpa_supplicant_conf="$x" + break + fi + done +fi +: ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf} + +wpa_supplicant_ctrldir() +{ + local dir + + dir=$(key_get_value "[[:space:]]*ctrl_interface=" \ + "$wpa_supplicant_conf") + dir=$(trim "$dir") + case "$dir" in + DIR=*) + dir=${dir##DIR=} + dir=${dir%%[[:space:]]GROUP=*} + dir=$(trim "$dir") + ;; + esac + printf %s "$dir" +} + +wpa_supplicant_start() +{ + local dir err errn + + # If the carrier is up, don't bother checking anything + [ "$ifcarrier" = "up" ] && return 0 + + # Pre flight checks + if [ ! -s "$wpa_supplicant_conf" ]; then + syslog warn \ + "$wpa_supplicant_conf does not exist" + syslog warn "not interacting with wpa_supplicant(8)" + return 1 + fi + dir=$(wpa_supplicant_ctrldir) + if [ -z "$dir" ]; then + syslog warn \ + "ctrl_interface not defined in $wpa_supplicant_conf" + syslog warn "not interacting with wpa_supplicant(8)" + return 1 + fi + + wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0 + syslog info "starting wpa_supplicant" + driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver + err=$(systemctl start wpa_supplicant 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to start wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +wpa_supplicant_reconfigure() +{ + local dir err errn + + dir=$(wpa_supplicant_ctrldir) + [ -z "$dir" ] && return 1 + if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then + wpa_supplicant_start + return $? + fi + syslog info "reconfiguring wpa_supplicant" + err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to reconfigure wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +wpa_supplicant_stop() +{ + local dir err errn + + dir=$(wpa_supplicant_ctrldir) + [ -z "$dir" ] && return 1 + wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0 + syslog info "stopping wpa_supplicant" + err=$(wpa_cli -i"$interface" terminate 2>&1) + errn=$? + if [ $errn != 0 ]; then + syslog err "failed to start wpa_supplicant" + syslog err "$err" + fi + return $errn +} + +if [ "$ifwireless" = "1" ] && \ + type wpa_supplicant >/dev/null 2>&1 && \ + type wpa_cli >/dev/null 2>&1 +then + case "$reason" in + PREINIT|NOCARRIER) wpa_supplicant_start;; + RECONFIGURE) wpa_supplicant_reconfigure;; + DEPARTED) wpa_supplicant_stop;; + esac +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/15-timezone b/builder/wlan-boot/scripts/dhcpcd-hooks/15-timezone new file mode 100755 index 00000000..0ccdc45b --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/15-timezone @@ -0,0 +1,48 @@ +# Configure timezone + +: ${localtime:=/etc/localtime} + +set_zoneinfo() +{ + local zoneinfo_dir= zone_file= + + [ -z "$new_tzdb_timezone" ] && return 0 + + for d in \ + /usr/share/zoneinfo \ + /usr/lib/zoneinfo \ + /var/share/zoneinfo \ + /var/zoneinfo \ + ; do + if [ -d "$d" ]; then + zoneinfo_dir="$d" + break + fi + done + + if [ -z "$zoneinfo_dir" ]; then + syslog warning "timezone directory not found" + return 1 + fi + + zone_file="$zoneinfo_dir/$new_tzdb_timezone" + if [ ! -e "$zone_file" ]; then + syslog warning "no timezone definition for $new_tzdb_timezone" + return 1 + fi + + if copy_file "$zone_file" "$localtime"; then + syslog info "timezone changed to $new_tzdb_timezone" + fi +} + +# For ease of use, map DHCP6 names onto our DHCP4 names +case "$reason" in +BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6) + new_tzdb_timezone="$new_dhcp6_tzdb_timezone" + ;; +esac + +if $if_up; then + set_zoneinfo +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/20-resolv.conf b/builder/wlan-boot/scripts/dhcpcd-hooks/20-resolv.conf new file mode 100755 index 00000000..e4db368d --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/20-resolv.conf @@ -0,0 +1,204 @@ +# Generate /etc/resolv.conf +# Support resolvconf(8) if available +# We can merge other dhcpcd resolv.conf files into one like resolvconf, +# but resolvconf is preferred as other applications like VPN clients +# can readily hook into it. +# Also, resolvconf can configure local nameservers such as bind +# or dnsmasq. This is important as the libc resolver isn't that powerful. + +resolv_conf_dir="$state_dir/resolv.conf" +NL=" +" +: ${resolvconf:=resolvconf} + +build_resolv_conf() +{ + local cf="$state_dir/resolv.conf.$ifname" + local interfaces= header= search= srvs= servers= x= + + # Build a list of interfaces + interfaces=$(list_interfaces "$resolv_conf_dir") + + # Build the resolv.conf + if [ -n "$interfaces" ]; then + # Build the header + for x in ${interfaces}; do + header="$header${header:+, }$x" + done + + # Build the search list + domain=$(cd "$resolv_conf_dir"; \ + key_get_value "domain " ${interfaces}) + search=$(cd "$resolv_conf_dir"; \ + key_get_value "search " ${interfaces}) + set -- ${domain} + domain="$1" + [ -n "$2" ] && search="$search $*" + [ -n "$search" ] && search="$(uniqify $search)" + [ "$domain" = "$search" ] && search= + [ -n "$domain" ] && domain="domain $domain$NL" + [ -n "$search" ] && search="search $search$NL" + + # Build the nameserver list + srvs=$(cd "$resolv_conf_dir"; \ + key_get_value "nameserver " ${interfaces}) + for x in $(uniqify ${srvs}); do + servers="${servers}nameserver $x$NL" + done + fi + header="$signature_base${header:+ $from }$header" + + # Assemble resolv.conf using our head and tail files + [ -f "$cf" ] && rm -f "$cf" + [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" + echo "$header" > "$cf" + if [ -f /etc/resolv.conf.head ]; then + cat /etc/resolv.conf.head >> "$cf" + else + echo "# /etc/resolv.conf.head can replace this line" >> "$cf" + fi + printf %s "$domain$search$servers" >> "$cf" + if [ -f /etc/resolv.conf.tail ]; then + cat /etc/resolv.conf.tail >> "$cf" + else + echo "# /etc/resolv.conf.tail can replace this line" >> "$cf" + fi + if change_file /etc/resolv.conf "$cf"; then + chmod 644 /etc/resolv.conf + fi + rm -f "$cf" +} + +# Extract any ND DNS options from the RA +# For now, we ignore the lifetime of the DNS options unless they +# are absent or zero. +# In this case they are removed from consideration. +# See draft-gont-6man-slaac-dns-config-issues-01 for issues +# regarding DNS option lifetime in ND messages. +eval_nd_dns() +{ + + eval ltime=\$nd${i}_rdnss${j}_lifetime + if [ -z "$ltime" -o "$ltime" = 0 ]; then + rdnss= + else + eval rdnss=\$nd${i}_rdnss${j}_servers + fi + eval ltime=\$nd${i}_dnssl${j}_lifetime + if [ -z "$ltime" -o "$ltime" = 0 ]; then + dnssl= + else + eval dnssl=\$nd${i}_dnssl${j}_search + fi + + [ -z "$rdnss" -a -z "$dnssl" ] && return 1 + + [ -n "$rdnss" ] && new_rdnss="$new_rdnss${new_rdnss:+ }$rdnss" + [ -n "$dnssl" ] && new_dnssl="$new_dnssl${new_dnssl:+ }$dnssl" + j=$(($j + 1)) + return 0 +} + +add_resolv_conf() +{ + local x= conf="$signature$NL" warn=true + local i j ltime rdnss dnssl new_rdnss new_dnssl + + # Loop to extract the ND DNS options using our indexed shell values + i=1 + j=1 + while true; do + while true; do + eval_nd_dns || break + done + i=$(($i + 1)) + j=1 + eval_nd_dns || break + done + [ -n "$new_rdnss" ] && \ + new_domain_name_servers="$new_domain_name_servers${new_domain_name_servers:+ }$new_rdnss" + [ -n "$new_dnssl" ] && \ + new_domain_search="$new_domain_search${new_domain_search:+ }$new_dnssl" + + # Derive a new domain from our various hostname options + if [ -z "$new_domain_name" ]; then + if [ "$new_dhcp6_fqdn" != "${new_dhcp6_fqdn#*.}" ]; then + new_domain_name="${new_dhcp6_fqdn#*.}" + elif [ "$new_fqdn" != "${new_fqdn#*.}" ]; then + new_domain_name="${new_fqdn#*.}" + elif [ "$new_host_name" != "${new_host_name#*.}" ]; then + new_domain_name="${new_host_name#*.}" + fi + fi + + # If we don't have any configuration, remove it + if [ -z "$new_domain_name_servers" -a \ + -z "$new_domain_name" -a \ + -z "$new_domain_search" ]; then + remove_resolv_conf + return $? + fi + + if [ -n "$new_domain_name" ]; then + set -- $new_domain_name + if valid_domainname "$1"; then + conf="${conf}domain $1$NL" + else + syslog err "Invalid domain name: $1" + fi + # If there is no search this, make this one + if [ -z "$new_domain_search" ]; then + new_domain_search="$new_domain_name" + [ "$new_domain_name" = "$1" ] && warn=true + fi + fi + if [ -n "$new_domain_search" ]; then + if valid_domainname_list $new_domain_search; then + conf="${conf}search $new_domain_search$NL" + elif ! $warn; then + syslog err "Invalid domain name in list:" \ + "$new_domain_search" + fi + fi + for x in ${new_domain_name_servers}; do + conf="${conf}nameserver $x$NL" + done + if type "$resolvconf" >/dev/null 2>&1; then + [ -n "$ifmetric" ] && export IF_METRIC="$ifmetric" + printf %s "$conf" | "$resolvconf" -a "$ifname" + return $? + fi + + if [ -e "$resolv_conf_dir/$ifname" ]; then + rm -f "$resolv_conf_dir/$ifname" + fi + [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" + printf %s "$conf" > "$resolv_conf_dir/$ifname" + build_resolv_conf +} + +remove_resolv_conf() +{ + if type "$resolvconf" >/dev/null 2>&1; then + "$resolvconf" -d "$ifname" -f + else + if [ -e "$resolv_conf_dir/$ifname" ]; then + rm -f "$resolv_conf_dir/$ifname" + fi + build_resolv_conf + fi +} + +# For ease of use, map DHCP6 names onto our DHCP4 names +case "$reason" in +BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6) + new_domain_name_servers="$new_dhcp6_name_servers" + new_domain_search="$new_dhcp6_domain_search" + ;; +esac + +if $if_up || [ "$reason" = ROUTERADVERT ]; then + add_resolv_conf +elif $if_down; then + remove_resolv_conf +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/29-lookup-hostname b/builder/wlan-boot/scripts/dhcpcd-hooks/29-lookup-hostname new file mode 100755 index 00000000..04ad275e --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/29-lookup-hostname @@ -0,0 +1,40 @@ +# Lookup the hostname in DNS if not set + +lookup_hostname() +{ + [ -z "$new_ip_address" ] && return 1 + local h= + # Silly ISC programs love to send error text to stdout + if type dig >/dev/null 2>&1; then + h=$(dig +short -x $new_ip_address) + if [ $? = 0 ]; then + echo "$h" | sed 's/\.$//' + return 0 + fi + elif type host >/dev/null 2>&1; then + h=$(host $new_ip_address) + if [ $? = 0 ]; then + echo "$h" \ + | sed 's/.* domain name pointer \(.*\)./\1/' + return 0 + fi + elif type getent >/dev/null 2>&1; then + h=$(getent hosts $new_ip_address) + if [ $? = 0 ]; then + echo "$h" | sed 's/[^ ]* *\([^ ]*\).*/\1/' + return 0 + fi + fi + return 1 +} + +set_hostname() +{ + if [ -z "$new_host_name" -a -z "$new_fqdn_name" ]; then + export new_host_name="$(lookup_hostname)" + fi +} + +if $if_up; then + set_hostname +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/30-hostname b/builder/wlan-boot/scripts/dhcpcd-hooks/30-hostname new file mode 100755 index 00000000..eea6a5ce --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/30-hostname @@ -0,0 +1,155 @@ +# Set the hostname from DHCP data if required + +# A hostname can either be a short hostname or a FQDN. +# hostname_fqdn=true +# hostname_fqdn=false +# hostname_fqdn=server + +# A value of server means just what the server says, don't manipulate it. +# This could lead to an inconsistent hostname on a DHCPv4 and DHCPv6 network +# where the DHCPv4 hostname is short and the DHCPv6 has an FQDN. +# DHCPv6 has no hostname option. +# RFC4702 section 3.1 says FQDN should be prefered over hostname. +# +# As such, the default is hostname_fqdn=true so that a consistent hostname +# is always assigned. +: ${hostname_fqdn:=true} + +# Some systems don't have hostname(1) +_hostname() +{ + local name= + + if [ -z "$1" ]; then + if type hostname >/dev/null 2>&1; then + hostname + elif [ -r /proc/sys/kernel/hostname ]; then + read name </proc/sys/kernel/hostname && echo "$name" + elif sysctl kern.hostname >/dev/null 2>&1; then + sysctl -n kern.hostname + elif sysctl kernel.hostname >/dev/null 2>&1; then + sysctl -n kernel.hostname + else + return 1 + fi + return $? + fi + + # Always prefer hostname(1) if we have it + if type hostname >/dev/null 2>&1; then + hostname "$1" + elif [ -w /proc/sys/kernel/hostname ]; then + echo "$1" >/proc/sys/kernel/hostname + elif sysctl kern.hostname >/dev/null 2>&1; then + sysctl -w "kern.hostname=$1" + elif sysctl kernel.hostname >/dev/null 2>&1; then + sysctl -w "kernel.hostname=$1" + else + # We know this will fail, but it will now fail + # with an error to stdout + hostname "$1" + fi +} + +need_hostname() +{ + local hostname hfqdn=false hshort=false + + case "$force_hostname" in + [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) return 0;; + esac + + hostname="$(_hostname)" + case "$hostname" in + ""|"(none)"|localhost|localhost.localdomain) return 0;; + esac + + case "$hostname_fqdn" in + [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) hfqdn=true;; + ""|[Ss][Ee][Rr][Vv][Ee][Rr]) ;; + *) hshort=true;; + esac + + if [ -n "$old_fqdn" ]; then + if ${hfqdn} || ! ${hsort}; then + [ "$hostname" = "$old_fqdn" ] + else + [ "$hostname" = "${old_fqdn%%.*}" ] + fi + elif [ -n "$old_host_name" ]; then + if ${hfqdn}; then + if [ -n "$old_domain_name" -a \ + "$old_host_name" = "${old_host_name#*.}" ] + then + [ "$hostname" = \ + "$old_host_name.$old_domain_name" ] + else + [ "$hostname" = "$old_host_name" ] + fi + elif ${hshort}; then + [ "$hostname" = "${old_host_name%%.*}" ] + else + [ "$hostname" = "$old_host_name" ] + fi + else + # No old hostname + false + fi +} + +try_hostname() +{ + + if valid_domainname "$1"; then + _hostname "$1" + else + syslog err "Invalid hostname: $1" + fi +} + +set_hostname() +{ + local hfqdn=false hshort=false + + need_hostname || return + + case "$hostname_fqdn" in + [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) hfqdn=true;; + ""|[Ss][Ee][Rr][Vv][Ee][Rr]) ;; + *) hshort=true;; + esac + + if [ -n "$new_fqdn" ]; then + if ${hfqdn} || ! ${hshort}; then + try_hostname "$new_fqdn" + else + try_hostname "${new_fqdn%%.*}" + fi + elif [ -n "$new_host_name" ]; then + if ${hfqdn}; then + if [ -n "$new_domain_name" -a \ + "$new_host_name" = "${new_host_name#*.}" ] + then + try_hostname "$new_host_name.$new_domain_name" + else + try_hostname "$new_host_name" + fi + elif ${hshort}; then + try_hostname "${new_host_name%%.*}" + else + try_hostname "$new_host_name" + fi + fi +} + +# For ease of use, map DHCP6 names onto our DHCP4 names +case "$reason" in +BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6) + new_fqdn="$new_dhcp6_fqdn" + old_fqdn="$old_dhcp6_fqdn" + ;; +esac + +if $if_up; then + set_hostname +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/50-dhcpcd-compat b/builder/wlan-boot/scripts/dhcpcd-hooks/50-dhcpcd-compat new file mode 100755 index 00000000..0d6256e6 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/50-dhcpcd-compat @@ -0,0 +1,41 @@ +# Compat enter hook shim for older dhcpcd versions + +IPADDR=$new_ip_address +INTERFACE=$interface +NETMASK=$new_subnet_mask +BROADCAST=$new_broadcast_address +NETWORK=$new_network_number +DHCPSID=$new_dhcp_server_identifier +GATEWAYS=$new_routers +DNSSERVERS=$new_domain_name_servers +DNSDOMAIN=$new_domain_name +DNSSEARCH=$new_domain_search +NISDOMAIN=$new_nis_domain +NISSERVERS=$new_nis_servers +NTPSERVERS=$new_ntp_servers + +GATEWAY= +for x in $new_routers; do + GATEWAY="$GATEWAY${GATEWAY:+,}$x" +done +DNS= +for x in $new_domain_name_servers; do + DNS="$DNS${DNS:+,}$x" +done + +r="down" +case "$reason" in +RENEW) r="up";; +BOUND|INFORM|REBIND|REBOOT|TEST|TIMEOUT|IPV4LL) r="new";; +esac + +if [ "$r" != "down" ]; then + rm -f /var/lib/dhcpcd-"$INTERFACE".info + for x in IPADDR INTERFACE NETMASK BROADCAST NETWORK DHCPSID GATEWAYS \ + DNSSERVERS DNSDOMAIN DNSSEARCH NISDOMAIN NISSERVERS \ + NTPSERVERS GATEWAY DNS; do + eval echo "$x=\'\$$x\'" >> /var/lib/dhcpcd-"$INTERFACE".info + done +fi + +set -- /var/lib/dhcpcd-"$INTERFACE".info "$r" diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/50-ntp.conf b/builder/wlan-boot/scripts/dhcpcd-hooks/50-ntp.conf new file mode 100755 index 00000000..74805039 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/50-ntp.conf @@ -0,0 +1,141 @@ +# Sample dhcpcd hook script for NTP +# It will configure either one of NTP, OpenNTP or Chrony (in that order) +# and will default to NTP if no default config is found. + +# Like our resolv.conf hook script, we store a database of ntp.conf files +# and merge into /etc/ntp.conf + +# You can set the env var NTP_CONF to override the derived default on +# systems with >1 NTP client installed. +# Here is an example for OpenNTP +# dhcpcd -e NTP_CONF=/usr/pkg/etc/ntpd.conf +# or by adding this to /etc/dhcpcd.conf +# env NTP_CONF=/usr/pkg/etc/ntpd.conf +# or by adding this to /etc/dhcpcd.enter-hook +# NTP_CONF=/usr/pkg/etc/ntpd.conf +# To use Chrony instead, simply change ntpd.conf to chrony.conf in the +# above examples. + +: ${ntp_confs:=ntp.conf ntpd.conf chrony.conf} +: ${ntp_conf_dirs=/etc /usr/pkg/etc /usr/local/etc} +ntp_conf_dir="$state_dir/ntp.conf" + +# If NTP_CONF is not set, work out a good default +if [ -z "$NTP_CONF" ]; then + for d in ${ntp_conf_dirs}; do + for f in ${ntp_confs}; do + if [ -e "$d/$f" ]; then + NTP_CONF="$d/$f" + break 2 + fi + done + done + [ -e "$NTP_CONF" ] || NTP_CONF=/etc/ntp.conf +fi + +# Derive service name from configuration +if [ -z "$ntp_service" ]; then + case "$NTP_CONF" in + *chrony.conf) ntp_service=chronyd;; + *) ntp_service=ntpd;; + esac +fi + +# Debian has a seperate file for DHCP config to avoid stamping on +# the master. +if [ "$ntp_service" = ntpd ] && type invoke-rc.d >/dev/null 2>&1; then + [ -e /var/lib/ntp ] || mkdir /var/lib/ntp + : ${ntp_service:=ntp} + : ${NTP_DHCP_CONF:=/var/lib/ntp/ntp.conf.dhcp} +fi + +: ${ntp_restart_cmd:=service_condcommand $ntp_service restart} + +ntp_conf=${NTP_CONF} +NL=" +" + +build_ntp_conf() +{ + local cf="$state_dir/ntp.conf.$ifname" + local interfaces= header= srvs= servers= x= + + # Build a list of interfaces + interfaces=$(list_interfaces "$ntp_conf_dir") + + if [ -n "$interfaces" ]; then + # Build the header + for x in ${interfaces}; do + header="$header${header:+, }$x" + done + + # Build a server list + srvs=$(cd "$ntp_conf_dir"; + key_get_value "server " $interfaces) + if [ -n "$srvs" ]; then + for x in $(uniqify $srvs); do + servers="${servers}server $x$NL" + done + fi + fi + + # Merge our config into ntp.conf + [ -e "$cf" ] && rm -f "$cf" + [ -d "$ntp_conf_dir" ] || mkdir -p "$ntp_conf_dir" + + if [ -n "$NTP_DHCP_CONF" ]; then + [ -e "$ntp_conf" ] && cp "$ntp_conf" "$cf" + ntp_conf="$NTP_DHCP_CONF" + elif [ -e "$ntp_conf" ]; then + remove_markers "$signature_base" "$signature_base_end" \ + "$ntp_conf" > "$cf" + fi + + if [ -n "$servers" ]; then + echo "$signature_base${header:+ $from }$header" >> "$cf" + printf %s "$servers" >> "$cf" + echo "$signature_base_end${header:+ $from }$header" >> "$cf" + else + [ -e "$ntp_conf" -a -e "$cf" ] || return + fi + + # If we changed anything, restart ntpd + if change_file "$ntp_conf" "$cf"; then + [ -n "$ntp_restart_cmd" ] && eval $ntp_restart_cmd + fi +} + +add_ntp_conf() +{ + local cf="$ntp_conf_dir/$ifname" x= + + [ -e "$cf" ] && rm "$cf" + [ -d "$ntp_conf_dir" ] || mkdir -p "$ntp_conf_dir" + if [ -n "$new_ntp_servers" ]; then + for x in $new_ntp_servers; do + echo "server $x" >> "$cf" + done + fi + build_ntp_conf +} + +remove_ntp_conf() +{ + if [ -e "$ntp_conf_dir/$ifname" ]; then + rm "$ntp_conf_dir/$ifname" + fi + build_ntp_conf +} + +# For ease of use, map DHCP6 names onto our DHCP4 names +case "$reason" in +BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6) + new_ntp_servers="$new_dhcp6_sntp_servers" +;; +esac + +if $if_up; then + add_ntp_conf +elif $if_down; then + remove_ntp_conf +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/50-yp.conf b/builder/wlan-boot/scripts/dhcpcd-hooks/50-yp.conf new file mode 100755 index 00000000..2da68ebc --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/50-yp.conf @@ -0,0 +1,56 @@ +# Sample dhcpcd hook for ypbind +# This script is only suitable for the Linux version. + +ypbind_pid() +{ + [ -s /var/run/ypbind.pid ] && cat /var/run/ypbind.pid +} + +make_yp_conf() +{ + [ -z "$new_nis_domain" -a -z "$new_nis_servers" ] && return 0 + local cf=/etc/yp.conf."$ifname" prefix= x= pid= + rm -f "$cf" + echo "$signature" > "$cf" + if [ -n "$new_nis_domain" ]; then + if ! valid_domainname "$new_nis_domain"; then + syslog err "Invalid NIS domain name: $new_nis_domain" + rm -f "$cf" + return 1 + fi + domainname "$new_nis_domain" + if [ -n "$new_nis_servers" ]; then + prefix="domain $new_nis_domain server " + else + echo "domain $new_nis_domain broadcast" >> "$cf" + fi + else + prefix="ypserver " + fi + for x in $new_nis_servers; do + echo "$prefix$x" >> "$cf" + done + save_conf /etc/yp.conf + cat "$cf" > /etc/yp.conf + rm -f "$cf" + pid="$(ypbind_pid)" + if [ -n "$pid" ]; then + kill -HUP "$pid" + fi +} + +restore_yp_conf() +{ + [ -n "$old_nis_domain" ] && domainname "" + restore_conf /etc/yp.conf || return 0 + local pid="$(ypbind_pid)" + if [ -n "$pid" ]; then + kill -HUP "$pid" + fi +} + +if $if_up; then + make_yp_conf +elif $if_down; then + restore_yp_conf +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-hooks/50-ypbind.in b/builder/wlan-boot/scripts/dhcpcd-hooks/50-ypbind.in new file mode 100755 index 00000000..a9ebbfa6 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-hooks/50-ypbind.in @@ -0,0 +1,86 @@ +# Sample dhcpcd hook for ypbind +# This script is only suitable for the BSD versions. + +: ${ypbind_restart_cmd:=service_command ypbind restart} +: ${ypbind_stop_cmd:=service_condcommand ypbind stop} +ypbind_dir="$state_dir/ypbind" +: ${ypdomain_dir:=@YPDOMAIN_DIR@} +: ${ypdomain_suffix:=@YPDOMAIN_SUFFIX@} + + +best_domain() +{ + local i= + + for i in "$ypbind_dir/$interface_order".*; do + if [ -f "$i" ]; then + cat "$i" + return 0 + fi + done + return 1 +} + +make_yp_binding() +{ + [ -d "$ypbind_dir" ] || mkdir -p "$ypbind_dir" + echo "$new_nis_domain" >"$ypbind_dir/$ifname" + + if [ -z "$ypdomain_dir" ]; then + false + else + local cf="$ypdomain_dir/$new_nis_domain$ypdomain_suffix" + if [ -n "$new_nis_servers" ]; then + local ncf="$cf.$ifname" x= + rm -f "$ncf" + for x in $new_nis_servers; do + echo "$x" >>"$ncf" + done + change_file "$cf" "$ncf" + else + [ -e "$cf" ] && rm "$cf" + fi + fi + + local nd="$(best_domain)" + if [ $? = 0 -a "$nd" != "$(domainname)" ]; then + domainname "$nd" + if [ -n "$ypbind_restart_cmd" ]; then + eval $ypbind_restart_cmd + fi + fi +} + +restore_yp_binding() +{ + + rm -f "$ypbind_dir/$ifname" + local nd="$(best_domain)" + # We need to stop ypbind if there is no best domain + # otherwise it will just stall as we cannot set domainname + # to blank :/ + if [ -z "$nd" ]; then + if [ -n "$ypbind_stop_cmd" ]; then + eval $ypbind_stop_cmd + fi + elif [ "$nd" != "$(domainname)" ]; then + domainname "$nd" + if [ -n "$ypbind_restart_cmd" ]; then + eval $ypbind_restart_cmd + fi + fi +} + +if [ "$reason" = PREINIT ]; then + rm -f "$ypbind_dir/$interface".* +elif $if_up || $if_down; then + if [ -n "$new_nis_domain" ]; then + if valid_domainname "$new_nis_domain"; then + make_yp_binding + else + syslog err "Invalid NIS domain name: $new_nis_domain" + fi + elif [ -n "$old_nis_domain" ]; then + restore_yp_binding + fi +fi diff --git a/builder/wlan-boot/scripts/dhcpcd-run-hooks b/builder/wlan-boot/scripts/dhcpcd-run-hooks new file mode 100755 index 00000000..8caf0dc9 --- /dev/null +++ b/builder/wlan-boot/scripts/dhcpcd-run-hooks @@ -0,0 +1,387 @@ +#!/bin/sh +# dhcpcd client configuration script + +# Handy variables and functions for our hooks to use +case "$reason" in + ROUTERADVERT) + ifsuffix=".ra";; + INFORM6|BOUND6|RENEW6|REBIND6|REBOOT6|EXPIRE6|RELEASE6|STOP6) + ifsuffix=".dhcp6";; + IPV4LL) + ifsuffix=".ipv4ll";; + *) + ifsuffix=".dhcp";; +esac +ifname="$interface$ifsuffix" + +from=from +signature_base="# Generated by dhcpcd" +signature="$signature_base $from $ifname" +signature_base_end="# End of dhcpcd" +signature_end="$signature_base_end $from $ifname" +state_dir=/var/run/dhcpcd +_detected_init=false + +: ${if_up:=false} +: ${if_down:=false} +: ${syslog_debug:=false} + +# Ensure that all arguments are unique +uniqify() +{ + local result= i= + for i do + case " $result " in + *" $i "*);; + *) result="$result $i";; + esac + done + echo "${result# *}" +} + +# List interface config files in a directory. +# If dhcpcd is running as a single instance then it will have a list of +# interfaces in the preferred order. +# Otherwise we just use what we have. +list_interfaces() +{ + local i= x= ifaces= + for i in $interface_order; do + for x in "$1"/$i.*; do + [ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}" + done + done + for x in "$1"/*; do + [ -f "$x" ] && ifaces="$ifaces${ifaces:+ }${x##*/}" + done + uniqify $ifaces +} + +# Trim function +trim() +{ + local var="$*" + + var=${var#"${var%%[![:space:]]*}"} + var=${var%"${var##*[![:space:]]}"} + if [ -z "$var" ]; then + # So it seems our shell doesn't support wctype(3) patterns + # Fall back to sed + var=$(echo "$*" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//') + fi + printf %s "$var" +} + +# We normally use sed to extract values using a key from a list of files +# but sed may not always be available at the time. +key_get_value() +{ + local key="$1" value= x= line= + + shift + if type sed >/dev/null 2>&1; then + sed -n "s/^$key//p" $@ + else + for x do + while read line; do + case "$line" in + "$key"*) echo "${line##$key}";; + esac + done < "$x" + done + fi +} + +# We normally use sed to remove markers from a configuration file +# but sed may not always be available at the time. +remove_markers() +{ + local m1="$1" m2="$2" x= line= in_marker=0 + + shift; shift + if type sed >/dev/null 2>&1; then + sed "/^$m1/,/^$m2/d" $@ + else + for x do + while read line; do + case "$line" in + "$m1"*) in_marker=1;; + "$m2"*) in_marker=0;; + *) [ $in_marker = 0 ] && echo "$line";; + esac + done < "$x" + done + fi +} + +# Compare two files. +comp_file() +{ + + [ -e "$1" -a -e "$2" ] || return 1 + + if type cmp >/dev/null 2>&1; then + cmp -s "$1" "$2" + elif type diff >/dev/null 2>&1; then + diff -q "$1" "$2" >/dev/null + else + # Hopefully we're only working on small text files ... + [ "$(cat "$1")" = "$(cat "$2")" ] + fi +} + +# Compare two files. +# If different, replace first with second otherwise remove second. +change_file() +{ + + if [ -e "$1" ]; then + if comp_file "$1" "$2"; then + rm -f "$2" + return 1 + fi + fi + cat "$2" > "$1" + rm -f "$2" + return 0 +} + +# Compare two files. +# If different, copy or link depending on target type +copy_file() +{ + + if [ -h "$2" ]; then + [ "$(readlink "$2")" = "$1" ] && return 1 + ln -sf "$1" "$2" + else + comp_file "$1" "$2" && return 1 + cat "$1" >"$2" + fi +} + +# Save a config file +save_conf() +{ + + if [ -f "$1" ]; then + rm -f "$1-pre.$interface" + cat "$1" > "$1-pre.$interface" + fi +} + +# Restore a config file +restore_conf() +{ + + [ -f "$1-pre.$interface" ] || return 1 + cat "$1-pre.$interface" > "$1" + rm -f "$1-pre.$interface" +} + +# Write a syslog entry +syslog() +{ + local lvl="$1" + + if [ "$lvl" = debug ]; then + ${syslog_debug} || return 0 + fi + [ -n "$lvl" ] && shift + [ -n "$*" ] || return 0 + case "$lvl" in + err|error) echo "$interface: $*" >&2;; + *) echo "$interface: $*";; + esac + if type logger >/dev/null 2>&1; then + logger -i -p daemon."$lvl" -t dhcpcd-run-hooks "$interface: $*" + fi +} + +# Check for a valid domain name as per RFC1123 with the exception of +# allowing - and _ as they seem to be widely used. +valid_domainname() +{ + local name="$1" label + + [ -z "$name" -o ${#name} -gt 255 ] && return 1 + + while [ -n "$name" ]; do + label="${name%%.*}" + [ -z "$label" -o ${#label} -gt 63 ] && return 1 + case "$label" in + -*|_*|*-|*_) return 1;; + # some sh require - as the first or last character in the class + # when matching it + *[![:alnum:]_-]*) return 1;; + esac + [ "$name" = "${name#*.}" ] && break + name="${name#*.}" + done + return 0 +} + +valid_domainname_list() +{ + local name + + for name do + valid_domainname "$name" || return $? + done + return 0 +} + +# Check for a valid path +valid_path() +{ + + case "$@" in + *[![:alnum:]#%+-_:\.,@~\\/\[\]=\ ]*) return 1;; + esac + return 0 +} + +# With the advent of alternative init systems, it's possible to have +# more than one installed. So we need to try and guess what one we're +# using unless overriden by configure. +detect_init() +{ + _service_exists="" + _service_cmd="" + _service_status="" + + [ -n "$_service_cmd" ] && return 0 + + if ${_detected_init}; then + [ -n "$_service_cmd" ] + return $? + fi + + # Detect the running init system. + # As systemd and OpenRC can be installed on top of legacy init + # systems we try to detect them first. + local status="" + : ${status:=status} + if [ -x /bin/systemctl -a -S /run/systemd/private ]; then + _service_exists="/bin/systemctl --quiet is-enabled \$1.service" + _service_status="/bin/systemctl --quiet is-active \$1.service" + _service_cmd="/bin/systemctl \$2 \$1.service" + elif [ -x /usr/bin/systemctl -a -S /run/systemd/private ]; then + _service_exists="/usr/bin/systemctl --quiet is-enabled \$1.service" + _service_status="/usr/bin/systemctl --quiet is-active \$1.service" + _service_cmd="/usr/bin/systemctl \$2 \$1.service" + elif [ -x /sbin/rc-service -a \ + -s /libexec/rc/init.d/softlevel -o -s /run/openrc/softlevel ] + then + _service_exists="/sbin/rc-service -e \$1" + _service_cmd="/sbin/rc-service \$1 -- -D \$2" + elif [ -x /usr/sbin/invoke-rc.d ]; then + _service_exists="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]" + _service_cmd="/usr/sbin/invoke-rc.d \$1 \$2" + elif [ -x /sbin/service ]; then + _service_exists="/sbin/service \$1 >/dev/null 2>&1" + _service_cmd="/sbin/service \$1 \$2" + elif [ -x /usr/sbin/service ]; then + _service_exists="/usr/sbin/service \$1 $status >/dev/null 2>&1" + _service_cmd="/usr/sbin/service \$1 \$2" + elif [ -x /bin/sv ]; then + _service_exists="/bin/sv status \1 >/dev/null 2>&1" + _service_cmd="/bin/sv \$1 \$2" + elif [ -x /usr/bin/sv ]; then + _service_exists="/usr/bin/sv status \1 >/dev/null 2>&1" + _service_cmd="/usr/bin/sv \$1 \$2" + elif [ -e /etc/slackware-version -a -d /etc/rc.d ]; then + _service_exists="[ -x /etc/rc.d/rc.\$1 ]" + _service_cmd="/etc/rc.d/rc.\$1 \$2" + _service_status="/etc/rc.d/rc.\$1 status >/dev/null 2>&1" + else + for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do + if [ -d $x ]; then + _service_exists="[ -x $x/\$1 ]" + _service_cmd="$x/\$1 \$2" + _service_status="$x/\$1 $status >/dev/null 2>&1" + break + fi + done + if [ -e /etc/arch-release ]; then + _service_status="[ -e /var/run/daemons/\$1 ]" + elif [ "$x" = "/etc/rc.d" -a -e /etc/rc.d/rc.subr ]; then + _service_status="$x/\$1 check >/dev/null 2>&1" + fi + fi + + _detected_init=true + if [ -z "$_service_cmd" ]; then + syslog err "could not detect a useable init system" + return 1 + fi + return 0 +} + +# Check a system service exists +service_exists() +{ + + if [ -z "$_service_exists" ]; then + detect_init || return 1 + fi + eval $_service_exists +} + +# Send a command to a system service +service_cmd() +{ + + if [ -z "$_service_cmd" ]; then + detect_init || return 1 + fi + eval $_service_cmd +} + +# Send a command to a system service if it is running +service_status() +{ + + if [ -z "$_service_cmd" ]; then + detect_init || return 1 + fi + if [ -n "$_service_status" ]; then + eval $_service_status + else + service_command $1 status >/dev/null 2>&1 + fi +} + +# Handy macros for our hooks +service_command() +{ + + service_exists $1 && service_cmd $1 $2 +} +service_condcommand() +{ + + service_exists $1 && service_status $1 && service_cmd $1 $2 +} + +# We source each script into this one so that scripts run earlier can +# remove variables from the environment so later scripts don't see them. +# Thus, the user can create their dhcpcd.enter/exit-hook script to configure +# /etc/resolv.conf how they want and stop the system scripts ever updating it. +for hook in \ + /etc/dhcpcd.enter-hook \ + /libexec/dhcpcd-hooks/* \ + /etc/dhcpcd.exit-hook +do + for skip in $skip_hooks; do + case "$hook" in + */*~) continue 2;; + */"$skip") continue 2;; + */[0-9][0-9]"-$skip") continue 2;; + */[0-9][0-9]"-$skip.sh") continue 2;; + esac + done + if [ -f "$hook" ]; then + . "$hook" + fi +done diff --git a/builder/wlan-boot/services/dhcp.service b/builder/wlan-boot/services/dhcp.service new file mode 100644 index 00000000..6f87ac53 --- /dev/null +++ b/builder/wlan-boot/services/dhcp.service @@ -0,0 +1,14 @@ +[Unit] +Description=DHCP dhclient +ConditionFileIsExecutable=/usr/sbin/dhcpcd +ConditionFileIsExecutable=/usr/bin/systemd-preserve-process-marker +IgnoreOnIsolate=true +DefaultDependencies=no + +[Service] +Type=forking +ExecStart=/usr/bin/systemd-preserve-process-marker /usr/sbin/dhcpcd wlan0 +RemainAfterExit=yes +Restart=always +#KillMode=process +#KillSignal=SIGTERM diff --git a/builder/wlan-boot/services/wpa_supplicant.service b/builder/wlan-boot/services/wpa_supplicant.service new file mode 100644 index 00000000..350e19de --- /dev/null +++ b/builder/wlan-boot/services/wpa_supplicant.service @@ -0,0 +1,16 @@ +[Unit] +Description=WPA supplicant +Before=dhcp.service +#Wants=dhcp.service +ConditionFileIsExecutable=/usr/sbin/wpa_supplicant +ConditionFileIsExecutable=/usr/bin/systemd-preserve-process-marker +ConditionPathExists=/etc/wpa_supplicant.conf +IgnoreOnIsolate=true +DefaultDependencies=no + +[Service] +Type=simple +ExecStart=/usr/bin/systemd-preserve-process-marker /usr/sbin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf +RemainAfterExit=yes +KillMode=process +#KillSignal=SIGTERM diff --git a/builder/wlan-boot/udev/80-net-wlan.rules b/builder/wlan-boot/udev/80-net-wlan.rules new file mode 100644 index 00000000..c2c17b3b --- /dev/null +++ b/builder/wlan-boot/udev/80-net-wlan.rules @@ -0,0 +1,2 @@ +# Set the name of the interface to wlan0 +SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0" |