#!/bin/sh [ -n "$INCLUDE_ONLY" ] || { . /lib/functions.sh . /lib/functions/network.sh . ../netifd-proto.sh init_proto "$@" } cfg_format() { echo "$1" | sed -r 's/^[[:blank:]]+//;/^[[:space:]]*$/d' } ieee8021xclient_exitcode_tostring() { local errorcode=$1 [ -n "$errorcode" ] || errorcode=5 case "$errorcode" in 0) echo "OK" ;; 1) echo "FATAL_ERROR" ;; 5) echo "USER_REQUEST" ;; *) echo "UNKNOWN_ERROR" ;; esac } _wpa_supplicant_common() { local ifname="$1" _config="/var/run/wpa_supplicant-$ifname.conf" _pid="/var/run/wpa_supplicant-$ifname.pid" } proto_ieee8021xclient_setup() { local cfg="$1" local ifname="$2" local eapol_version local identity anonymous_identity password local ca_cert client_cert private_key private_key_passwd dh_file subject_match local phase1 phase2 ca_cert2 client_cert2 private_key2 private_key_passwd2 dh_file2 subject_match2 local eap_workaround json_get_vars eapol_version json_get_vars identity anonymous_identity password json_get_vars ca_cert client_cert private_key private_key_passwd dh_file subject_match json_get_vars phase1 phase2 ca_cert2 client_cert2 private_key2 private_key_passwd2 dh_file2 subject_match2 json_get_vars eap_workaround # launch local _config _pid _wpa_supplicant_common "$ifname" cat > "${_config}" << EOF ${eapol_version:+eapol_version=${eapol_version}} network={ ${identity:+identity=${identity}} ${anonymous_identity:+anonymous_identity=${anonymous_identity}} ${password:+password=${password}} ${ca_cert:+ca_cert=${ca_cert}} ${client_cert:+client_cert=${client_cert}} ${private_key:+private_key=${private_key}} ${private_key_passwd:+private_key_passwd=${private_key_passwd}} ${dh_file:+dh_file=${dh_file}} ${subject_match:+subject_match=${subject_match}} ${phase1:+phase1=${phase1}} ${phase2:+phase2=${phase2}} ${ca_cert2:+ca_cert2=${ca_cert2}} ${client_cert2:+client_cert2=${client_cert2}} ${private_key2:+private_key2=${private_key2}} ${private_key_passwd2:+private_key_passwd2=${private_key_passwd2}} ${dh_file2:+dh_file2=${dh_file2}} ${subject_match2:+subject_match2=${subject_match2}} ${eap_workaround:+eap_workaround=1} } EOF ubus wait_for wpa_supplicant ubus call wpa_supplicant config_add "{ \"driver\":\"wired\", \"iface\": \"$ifname\", \"config\": \"$_config\" }" } proto_ieee8021xclient_teardown() { local ifname="$1" local errorstring=$(ieee8021xclient_exitcode_tostring $ERROR) case "$ERROR" in 0) ;; 2) proto_notify_error "$ifname" "$errorstring" proto_block_restart "$ifname" ;; *) proto_notify_error "$ifname" "$errorstring" ;; esac ubus call wpa_supplicant config_remove "{\"iface\":\"$ifname\"}" } proto_ieee8021xclient_init_config() { proto_config_add_int eapol_version proto_config_add_string identity proto_config_add_string anonymous_identity proto_config_add_string password proto_config_add_string 'ca_cert:file' proto_config_add_string 'client_cert:file' proto_config_add_string 'private_key:file' proto_config_add_string private_key_passwd proto_config_add_string 'dh_file:file' proto_config_add_string subject_match proto_config_add_string phase1 proto_config_add_string phase2 proto_config_add_string 'ca_cert2:file' proto_config_add_string 'client_cert2:file' proto_config_add_string 'private_key2:file' proto_config_add_string private_key_passwd2 proto_config_add_string 'dh_file2:file' proto_config_add_string subject_match2 proto_config_add_boolean eap_workaround } [ -n "$INCLUDE_ONLY" ] || add_protocol ieee8021xclient