diff options
Diffstat (limited to 'ifupdown/if-pre-up')
-rwxr-xr-x | ifupdown/if-pre-up | 82 |
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 |