93 lines
No EOL
3.1 KiB
Python
93 lines
No EOL
3.1 KiB
Python
from flask import request
|
|
from flask_restful import Resource
|
|
from cosmicpi.config import Config
|
|
from .auth import requires_auth
|
|
import subprocess
|
|
import re
|
|
import time
|
|
import os
|
|
from functools import wraps
|
|
try:
|
|
import urllib2
|
|
except:
|
|
import urllib3 as urllib2
|
|
|
|
|
|
DEFAULT_WIFI_NAME = Config.get("Default WiFi", "name")
|
|
DEFAULT_WIFI_PASS = Config.get("Default WiFi", "password")
|
|
WPA_SUPPLICANT_LOCATION = Config.get("MISC", "wpa_supplicant_location")
|
|
|
|
|
|
class Wifi(Resource):
|
|
@requires_auth
|
|
def get(self):
|
|
# Get current network
|
|
connected_network_name_response = ''
|
|
try:
|
|
connected_network_name_response = subprocess.check_output(['sudo', 'iwgetid'])
|
|
except subprocess.CalledProcessError as e:
|
|
err_text = 'ERROR get connected network: %s' % str(e)
|
|
connected_network_name_response = err_text
|
|
print(err_text)
|
|
connected_network_name_str = re.findall('\"(.*?)\"', connected_network_name_response)
|
|
|
|
if len(connected_network_name_str) < 1:
|
|
connected_network_name_str = ''
|
|
else:
|
|
connected_network_name_str = connected_network_name_str[0]
|
|
|
|
# Available networks
|
|
wifi_network_list = [connected_network_name_str]
|
|
available_networks_response = ''
|
|
try:
|
|
available_networks_response = subprocess.check_output(['sudo', 'iw', 'dev', 'wlan0', 'scan'])
|
|
except subprocess.CalledProcessError as e:
|
|
err_text = 'ERROR get list of networks: %s' % str(e)
|
|
print(err_text)
|
|
available_networks_response = err_text
|
|
available_networks_lines = available_networks_response.split('\n')
|
|
for availableNetworksLine in available_networks_lines:
|
|
if 'SSID' in availableNetworksLine:
|
|
essid = availableNetworksLine.replace('SSID:', '').strip()
|
|
wifi_network_list.append(essid)
|
|
wifi_network_list = filter(lambda x: x != '', wifi_network_list)
|
|
|
|
# Print everything
|
|
return {
|
|
'current': connected_network_name_str,
|
|
'available': wifi_network_list,
|
|
}
|
|
|
|
@requires_auth
|
|
def post(self):
|
|
ssid = request.form['ssid']
|
|
psk = request.form['pass']
|
|
|
|
# Try to connect to a new Wifi
|
|
wpa_supplicant_content = """
|
|
country=US
|
|
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
|
update_config=1
|
|
network={
|
|
ssid="%s"
|
|
psk="%s"
|
|
id_str="AP1"
|
|
}
|
|
""" % (ssid, psk)
|
|
with open(WPA_SUPPLICANT_LOCATION, 'w') as file:
|
|
file.write(wpa_supplicant_content)
|
|
os.system('sudo ifdown --force wlan0; sudo ifup wlan0')
|
|
|
|
# Get new IP
|
|
new_ip = subprocess.check_output(
|
|
"ifconfig wlan0 | awk '/inet / {print $2}'",
|
|
shell=True
|
|
).decode('utf-8').strip()
|
|
|
|
# Return result
|
|
if len(new_ip) > 0:
|
|
return {
|
|
'message': 'Great! Your are not connected to %s and you can access to ' \
|
|
'this web panel on http://%s/' % (ssid, new_ip),
|
|
}
|
|
return { 'message': 'Something went wrong, unable to connect :(' } |