summaryrefslogtreecommitdiffstats
path: root/ifupdown/if-pre-up
diff options
context:
space:
mode:
Diffstat (limited to 'ifupdown/if-pre-up')
-rwxr-xr-xifupdown/if-pre-up82
1 files changed, 82 insertions, 0 deletions
diff --git a/ifupdown/if-pre-up b/ifupdown/if-pre-up
new file mode 100755
index 0000000..97d091f
--- /dev/null
+++ b/ifupdown/if-pre-up
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+set -eu
+
+get_iface_opts()
+{
+ local opts_start_cb="${1}"
+ local opt_cb="${2}"
+ local opts_end_cb="${3}"
+ local script=
+ local opts=
+ local opt=
+
+ script="$(printf '
+ /^iface[ \t][ \t]*%s/,/^[^ \t]/{
+ /^$/q;
+ s/^[ \t][ \t]*%s-//p;
+ }
+ ' "${IFACE}" "${0##*/}")"
+
+ opts="$(sed -n "${script}" /var/run/net-ifaces)"
+ if [ "x${opts}" = 'x' ]; then
+ return 0
+ fi
+
+ ${opts_start_cb}
+ while read -r opt; do
+ ${opt_cb} ${opt}
+ done <<-EOF
+ ${opts}
+ EOF
+ ${opts_end_cb}
+
+ return 0
+}
+
+wpa_opts_start_cb()
+{
+ exec 3>"/var/run/wpa_supplicant.${IFACE}.conf"
+ printf 'ctrl_interface=DIR=/var/run/wpa_supplicant\ncountry=US\n\n' >&3
+ printf 'network={\n' >&3
+}
+
+wpa_opt_cb()
+{
+ local field="${1}"
+ shift 1
+ local value="${*}"
+
+ field="$(printf '%s\n' "${field}" | tr '-' '_')"
+ case "${field}" in
+ ssid)
+ if printf '%s\n' "${value}" | grep -q '[^0-9A-Fa-f:]'
+ then
+ if [ "x${value#\"}" = "x${value}" ]; then
+ value="\"${value}\""
+ fi
+ fi
+ ;;
+ psk)
+ if printf '%s\n' "${value}" | grep -q '[^0-9A-Fa-f]'
+ then
+ if [ "x${value#\"}" = "x${value}" ]; then
+ value="\"${value}\""
+ fi
+ fi
+ ;;
+ esac
+ printf '\t%s=%s\n' "${field}" "${value}" >&3
+}
+
+wpa_opts_end_cb()
+{
+ printf '}\n' >&3
+ exec &3>-
+ wpa_supplicant -B -s -Dnl80211 -i"${IFACE}" \
+ -c"/var/run/wpa_supplicant.${IFACE}.conf"
+}
+
+if [ "x${IFACE#wlan}" != "x${IFACE}" ]; then
+ get_iface_opts wpa_opts_start_cb wpa_opt_cb wpa_opts_end
+fi