cosmicpi-rpi_V1.5/cosmicpi/rest/wifi.py
2018-05-21 23:27:10 +02:00

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 :(' }