From e18c9ac2f6ec35b25654acfc0ef6eb448786b1a4 Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Thu, 8 Feb 2018 22:38:33 +0100 Subject: [PATCH] Implement wlan connect / disconnect --- addon/lib/rmupdate.tcl | 49 ++++++++++++++++++++++++++ addon/www/index.html | 80 +++++++++++++++++++++++++++++++++++++++--- addon/www/rest.cgi | 7 ++++ 3 files changed, 131 insertions(+), 5 deletions(-) diff --git a/addon/lib/rmupdate.tcl b/addon/lib/rmupdate.tcl index abd8339..dace17a 100644 --- a/addon/lib/rmupdate.tcl +++ b/addon/lib/rmupdate.tcl @@ -1032,6 +1032,7 @@ proc ::rmupdate::wlan_scan {{as_json 0} {device "wlan0"}} { set data [exec /usr/sbin/iw $device scan] set cur_ssid "" set cur_signal "" + set cur_connected 0 foreach d [split $data "\n"] { if { [regexp {^\s*SSID:\s*(\S.*)\s*$} $d match ssid] } { set cur_ssid $ssid @@ -1043,8 +1044,13 @@ proc ::rmupdate::wlan_scan {{as_json 0} {device "wlan0"}} { if {$cur_ssid != "" && $cur_signal != ""} { set ssids(${cur_ssid}::ssid) $cur_ssid set ssids(${cur_ssid}::signal) $cur_signal + set ssids(${cur_ssid}::connected) $cur_connected set cur_ssid "" set cur_signal "" + set cur_connected 0 + } + if { [regexp {associated} $d match] } { + set cur_connected 1 } } } @@ -1060,6 +1066,48 @@ proc ::rmupdate::wlan_scan {{as_json 0} {device "wlan0"}} { } } +proc ::rmupdate::wlan_connect {ssid {password ""}} { + set psk "" + if {$password != ""} { + set data [exec /usr/sbin/wpa_passphrase $ssid $password] + foreach d [split $data "\n"] { + if { [regexp {^\s*psk\s*=\s*(\S+)\s*$} $d match p] } { + set psk $p + } + } + } + set fd [open /etc/config/wpa_supplicant.conf "w"] + puts $fd "ctrl_interface=/var/run/wpa_supplicant" + puts $fd "ap_scan=1" + puts $fd "network=\{" + puts $fd " ssid=\"${ssid}\"" + puts $fd " scan_ssid=1" + if {$psk == ""} { + puts $fd " key_mgmt=NONE" + } else { + puts $fd " proto=WPA RSN" + puts $fd " key_mgmt=WPA-PSK" + puts $fd " pairwise=CCMP TKIP" + puts $fd " group=CCMP TKIP" + puts $fd " psk=${psk}" + } + puts $fd "\}" + close $fd + + catch { exec /sbin/ifdown wlan0 } + catch { exec /sbin/ifup wlan0 } +} + +proc ::rmupdate::wlan_disconnect {} { + set fd [open /etc/config/wpa_supplicant.conf "w"] + puts $fd "ctrl_interface=/var/run/wpa_supplicant" + puts $fd "ap_scan=1" + close $fd + + catch { exec /sbin/ifdown wlan0 } + catch { exec /sbin/ifup wlan0 } +} + #puts [rmupdate::get_latest_firmware_version] #puts [rmupdate::get_firmware_info] #puts [rmupdate::get_available_firmware_images] @@ -1077,3 +1125,4 @@ proc ::rmupdate::wlan_scan {{as_json 0} {device "wlan0"}} { #puts [rmupdate::get_part_uuid "/dev/mmcblk0p3"] #puts [rmupdate::get_addon_info 1 1] #puts [rmupdate::wlan_scan 1] +#rmupdate::wlan_connect xxx yyyyy diff --git a/addon/www/index.html b/addon/www/index.html index 50a2209..345d02c 100644 --- a/addon/www/index.html +++ b/addon/www/index.html @@ -37,6 +37,7 @@ along with this program. If not, see . var running_installation = ""; var current_firmware = '?'; var latest_firmware = '?'; + var wlanScanTimer; function display_message(type, text, millis) { clear_message(); @@ -416,16 +417,38 @@ along with this program. If not, see . rest("GET", "/wlan_scan", null, function(data) { $('#wlan-list tbody').empty(); data.forEach(function(wlan) { - var bconnect = $('
') - .attr('data-connect-ssid', wlan.ssid) + var cls = (wlan.connected == "1") ? "disabled" : ""; + var bconnect = $('
') + .attr('data-ssid', wlan.ssid) .append($(''), i18next.t('connect')); - $("#wlan-list tbody").append($('').append( + bconnect.click(function() { + $('#form-connect-wlan').form('clear'); + $('#form-connect-wlan').attr('data-ssid', this.getAttribute('data-ssid')); + $('#modal-connect-wlan').modal('show'); + }); + + cls = (wlan.connected == "1") ? "" : "disabled"; + var bdisconnect = $('
') + .attr('data-ssid', wlan.ssid) + .append($(''), i18next.t('disconnect')); + bdisconnect.click(function() { + $('.button[data-ssid]').addClass('loading'); + rest("POST", "/wlan_disconnect"); + }); + var connected_checked = ((wlan.connected == "1") ? 'checked=""' : '') + cls = (wlan.connected == "1") ? "positive" : ""; + $("#wlan-list tbody").append($('').append( $('').append($('')), + $('').append($('
').append($(''),$(''))), $('').append($('')), - $('').append(bconnect) + $('').append(bconnect, bdisconnect) )); }); - setTimeout(function(){ wlan_scan(); }, 5000); + wlanScanTimer = setTimeout(function(){ wlan_scan(); }, 5000); + }, + function(xhr, ajaxOptions, thrownError) { + clearTimeout(myVar); + wlanScanTimer = setTimeout(function(){ wlan_scan(); }, 5000); }); } @@ -480,7 +503,11 @@ along with this program. If not, see . wlan: "WLAN", wlan_ssid: "SSID", wlan_signal: "Signal", + wlan_connected: "Connected", + connect_to_wlan: "Connect with wifi", + password: "Password", connect: "Connect", + disconnect: "Disconnect", } }, de: { @@ -529,7 +556,11 @@ along with this program. If not, see . wlan: "WLAN", wlan_ssid: "SSID", wlan_signal: "Signal", + wlan_connected: "Verbunden", + connect_to_wlan: "Mit WLAN verbinden", + password: "Passwort", connect: "Verbinden", + disconnect: "Trennen", } } } @@ -544,6 +575,27 @@ along with this program. If not, see . $('#install-addon-url-button').contents().last()[0].textContent = i18next.t('install'); $('#install-addon-file-button').contents().last()[0].textContent = i18next.t('choose_addon_file'); }); + var form_config = { + on: 'blur', + fields: { + password: { + identifier: 'password' + } + }, + onSuccess: function(event, fields) { + if (wlanScanTimer) { + clearTimeout(wlanScanTimer); + } + wlanScanTimer = setTimeout(function(){ wlan_scan(); }, 10000); + $(event.currentTarget).closest("div.modal").modal('hide'); + var ssid = $('#form-connect-wlan').attr('data-ssid'); + var password = $(event.currentTarget).form('get value', 'password'); + $('.button[data-ssid]').addClass('loading'); + rest("POST", "/wlan_connect", JSON.stringify({"ssid": ssid, "password": password})); + event.preventDefault(); + } + }; + $('#form-connect-wlan').form(form_config); rest("GET", "/version", null, function(version) { document.title = document.title + " " + version; @@ -676,6 +728,7 @@ along with this program. If not, see . + @@ -712,5 +765,22 @@ along with this program. If not, see .
+ + diff --git a/addon/www/rest.cgi b/addon/www/rest.cgi index ba59374..3f96e03 100644 --- a/addon/www/rest.cgi +++ b/addon/www/rest.cgi @@ -121,6 +121,13 @@ proc process {} { return [rmupdate::read_install_log] } elseif {[lindex $path 1] == "wlan_scan"} { return [rmupdate::wlan_scan 1] + } elseif {[lindex $path 1] == "wlan_connect"} { + regexp {\"ssid\"\s*:\s*\"([^\"]+)\"} $data match ssid + set password "" + regexp {\"password\"\s*:\s*\"([^\"]+)\"} $data match password + return [rmupdate::wlan_connect $ssid $password] + } elseif {[lindex $path 1] == "wlan_disconnect"} { + return [rmupdate::wlan_disconnect] } } error "invalid request" "Not found" 404