Module lib.webpage.wifipage
Function define the web page to configure the wifi
Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
""" Function define the web page to configure the wifi """
import server.httpserver
from htmltemplate.htmlclasses import *
import webpage.mainpage
import wifi.station
import tools.lang
import tools.strings
import tools.logger
import tools.support
import tools.features
def static_ip_html(config, disabled):
""" Html to get static ip """
patternIp = br"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
return [
Edit(text=tools.lang.ip_address, name=b"ip_address", pattern=patternIp, placeholder=tools.lang.enter_ip_address, value=config.ip_address, disabled=disabled),
Edit(text=tools.lang.netmask, name=b"netmask", pattern=patternIp, placeholder=tools.lang.enter_netmask, value=config.netmask, disabled=disabled),
Edit(text=tools.lang.gateway, name=b"gateway", pattern=patternIp, placeholder=tools.lang.enter_gateway, value=config.gateway, disabled=disabled),
Edit(text=tools.lang.dns, name=b"dns", pattern=patternIp, placeholder=tools.lang.enter_dns, value=config.dns, disabled=disabled)]
current_networks = []
current_config = None
current_network = None
def select_network(increase=0, reparse=False):
""" Select wifi network """
global current_networks, current_network
if reparse:
current_networks = current_network.list_known()
current = 0
for network in current_networks:
searched = tools.strings.tobytes(tools.strings.tofilename(current_network.ssid))
if searched == network:
break
current += 1
if current + increase < 0:
current = -1
elif current + increase >= len(current_networks):
current = 0
else:
current += increase
current_network = wifi.station.NetworkConfig()
try:
try:
part_filename = current_networks[current]
except:
part_filename = b""
current_network.load(part_filename = part_filename)
except Exception as err:
tools.logger.syslog(err)
return current_network
@server.httpserver.HttpServer.add_route(b'/wifi', menu=tools.lang.menu_network, item=tools.lang.item_wifi, available=tools.features.features.wifi)
async def wifi_config(request, response, args):
""" Page to configure the wifi station """
global current_networks, current_config, current_network
patternDns = rb"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$"
if current_config is None:
current_config = wifi.station.Station.config
current_network = wifi.station.Station.network
current_networks = current_network.list_known()
config = current_config
network = current_network
action = request.params.get(b"action",b"none")
forced = request.params.get(b"forced",b"none")
current = request.params.get(b"current",b"")
dynamic = request.params.get(b"dynamic",b"1")
disabled = False
# If default page
if action == b"none" and len(request.params) == 0:
disabled = True
# If the dynamic ip switch changed
elif action == b"none":
if dynamic == b"1":
forced = b"1"
else:
forced = b"0"
action = b"change"
# If the modify button clicked
elif action == b"modify":
pass
# If the save button clicked
elif action == b"save":
network.update(request.params, show_error=False)
network.save()
network = select_network(0, True)
config.update(request.params, show_error=False)
config.default = network.ssid
config.save()
forced = b"none"
disabled = True
elif action == b"previous":
network = select_network(-1)
forced = b"none"
elif action == b"next":
network = select_network(1)
forced = b"none"
elif action == b"forget":
forced = b"none"
network.forget()
network = select_network(-1,True)
elif action == b"default":
config.default = tools.strings.tostrings(network.ssid)
config.save()
if forced == b"none":
dynamic = network.dynamic
elif forced == b"1":
dynamic = True
else:
dynamic = False
ssids = []
if action in [b"previous",b"next",b"change",b"forget",b"modify",b"default"]:
submit = \
Submit (text=tools.lang.save , name=b"action", value=b"save" ), Space(), \
Submit (text=tools.lang.lt , name=b"action", value=b"previous"), Space(), \
Submit (text=tools.lang.gt , name=b"action", value=b"next" ), Space(), \
Submit (text=tools.lang.forget, name=b"action", value=b"forget" ), Space(), \
Submit (text=tools.lang.set_default,name=b"action", value=b"default" ), Space(), \
Input ( name=b"forced", value=forced , type=b"hidden"), \
Input ( name=b"current", value=current , type=b"hidden")
if wifi.station.Station.is_active() or wifi.accesspoint.AccessPoint().is_active():
networks = wifi.station.Station.scan()
for net in networks:
ssids.append(Option(value=net[0]))
else:
submit = Submit(text=tools.lang.modify, name=b"action", value=b"modify")
page = webpage.mainpage.main_frame(request, response, args, tools.lang.wifi_configuration,
Form([
Switch(text=tools.lang.activated, name=b"activated", checked=config.activated, disabled=disabled),
Edit(text=tools.lang.hostname , name=b"hostname", placeholder=tools.lang.hostname_not_available, pattern=patternDns, value=config.hostname, disabled=disabled) if tools.support.hostname() else None,
Switch(text=tools.lang.fallback_to_the, name=b"fallback", checked=config.fallback, disabled=disabled),
Card(
[
CardHeader(text= tools.lang.wifi if tools.strings.tostrings(network.ssid) != tools.strings.tostrings(config.default) else tools.lang.wifi_default),
CardBody([
ComboBox(ssids, text=tools.lang.ssid, placeholder=tools.lang.enter_ssid, name=b"ssid", value=network.ssid, disabled=disabled),
Edit(text=tools.lang.password, name=b"wifi_password", placeholder=tools.lang.enter_password, type=b"password",value=network.wifi_password, disabled=disabled),
])
]),
Card(
[
CardHeader([\
Switch(text=tools.lang.dynamic_ip, spacer=b"mb-0", checked=dynamic, name=b"dynamic", event=b'onchange="this.form.submit()"', disabled=disabled)]),
None if dynamic else CardBody([\
static_ip_html(network, disabled)])
]),
submit
]))
await response.send_page(page)
@server.httpserver.HttpServer.add_route(b'/accesspoint', menu=tools.lang.menu_network, item=tools.lang.item_access_point, available=tools.features.features.wifi)
async def access_point(request, response, args):
""" Page to configure the access point """
config = wifi.accesspoint.AccessPointConfig()
disabled, action, submit = webpage.mainpage.manage_default_button(request, config)
if action == b"save":
if wifi.accesspoint.AccessPoint.is_active():
wifi.accesspoint.AccessPoint.config = config
authmodes = []
for key, value in wifi.AUTHMODE.items():
if value==config.authmode:
authmodes.append(Option(text=value, selected=b"selected", value=value))
else:
authmodes.append(Option(text=value, value=value))
# pylint: disable=missing-parentheses-for-call-in-test
# pylint: disable=using-constant-test
page = webpage.mainpage.main_frame(request, response, args, tools.lang.access_point_configuration if access_point else b"Wifi configuration",
Form([
Switch(text=tools.lang.activated, name=b"activated", checked=config.activated, disabled=disabled),
Card(
[
CardHeader(text=tools.lang.wifi),
CardBody([
Edit(text=tools.lang.ssid, placeholder=tools.lang.enter_ssid, name=b"ssid", value=config.ssid, disabled=disabled),
Edit(text=tools.lang.password, name=b"wifi_password",type=b"password", placeholder=tools.lang.enter_password, value=config.wifi_password, disabled=disabled),
Label(text=tools.lang.authentication_mode),
Select(authmodes,name=b"authmode", disabled=disabled),
]),
]),
Card(
[
CardHeader(text=tools.lang.static_ip),
CardBody(static_ip_html(config, disabled))
]) if tools.support.static_ip_accesspoint() else None ,
submit
]))
await response.send_page(page)
Functions
async def access_point(request, response, args)-
Page to configure the access point
Expand source code
@server.httpserver.HttpServer.add_route(b'/accesspoint', menu=tools.lang.menu_network, item=tools.lang.item_access_point, available=tools.features.features.wifi) async def access_point(request, response, args): """ Page to configure the access point """ config = wifi.accesspoint.AccessPointConfig() disabled, action, submit = webpage.mainpage.manage_default_button(request, config) if action == b"save": if wifi.accesspoint.AccessPoint.is_active(): wifi.accesspoint.AccessPoint.config = config authmodes = [] for key, value in wifi.AUTHMODE.items(): if value==config.authmode: authmodes.append(Option(text=value, selected=b"selected", value=value)) else: authmodes.append(Option(text=value, value=value)) # pylint: disable=missing-parentheses-for-call-in-test # pylint: disable=using-constant-test page = webpage.mainpage.main_frame(request, response, args, tools.lang.access_point_configuration if access_point else b"Wifi configuration", Form([ Switch(text=tools.lang.activated, name=b"activated", checked=config.activated, disabled=disabled), Card( [ CardHeader(text=tools.lang.wifi), CardBody([ Edit(text=tools.lang.ssid, placeholder=tools.lang.enter_ssid, name=b"ssid", value=config.ssid, disabled=disabled), Edit(text=tools.lang.password, name=b"wifi_password",type=b"password", placeholder=tools.lang.enter_password, value=config.wifi_password, disabled=disabled), Label(text=tools.lang.authentication_mode), Select(authmodes,name=b"authmode", disabled=disabled), ]), ]), Card( [ CardHeader(text=tools.lang.static_ip), CardBody(static_ip_html(config, disabled)) ]) if tools.support.static_ip_accesspoint() else None , submit ])) await response.send_page(page) def select_network(increase=0, reparse=False)-
Select wifi network
Expand source code
def select_network(increase=0, reparse=False): """ Select wifi network """ global current_networks, current_network if reparse: current_networks = current_network.list_known() current = 0 for network in current_networks: searched = tools.strings.tobytes(tools.strings.tofilename(current_network.ssid)) if searched == network: break current += 1 if current + increase < 0: current = -1 elif current + increase >= len(current_networks): current = 0 else: current += increase current_network = wifi.station.NetworkConfig() try: try: part_filename = current_networks[current] except: part_filename = b"" current_network.load(part_filename = part_filename) except Exception as err: tools.logger.syslog(err) return current_network def static_ip_html(config, disabled)-
Html to get static ip
Expand source code
def static_ip_html(config, disabled): """ Html to get static ip """ patternIp = br"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" return [ Edit(text=tools.lang.ip_address, name=b"ip_address", pattern=patternIp, placeholder=tools.lang.enter_ip_address, value=config.ip_address, disabled=disabled), Edit(text=tools.lang.netmask, name=b"netmask", pattern=patternIp, placeholder=tools.lang.enter_netmask, value=config.netmask, disabled=disabled), Edit(text=tools.lang.gateway, name=b"gateway", pattern=patternIp, placeholder=tools.lang.enter_gateway, value=config.gateway, disabled=disabled), Edit(text=tools.lang.dns, name=b"dns", pattern=patternIp, placeholder=tools.lang.enter_dns, value=config.dns, disabled=disabled)] async def wifi_config(request, response, args)-
Page to configure the wifi station
Expand source code
@server.httpserver.HttpServer.add_route(b'/wifi', menu=tools.lang.menu_network, item=tools.lang.item_wifi, available=tools.features.features.wifi) async def wifi_config(request, response, args): """ Page to configure the wifi station """ global current_networks, current_config, current_network patternDns = rb"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$" if current_config is None: current_config = wifi.station.Station.config current_network = wifi.station.Station.network current_networks = current_network.list_known() config = current_config network = current_network action = request.params.get(b"action",b"none") forced = request.params.get(b"forced",b"none") current = request.params.get(b"current",b"") dynamic = request.params.get(b"dynamic",b"1") disabled = False # If default page if action == b"none" and len(request.params) == 0: disabled = True # If the dynamic ip switch changed elif action == b"none": if dynamic == b"1": forced = b"1" else: forced = b"0" action = b"change" # If the modify button clicked elif action == b"modify": pass # If the save button clicked elif action == b"save": network.update(request.params, show_error=False) network.save() network = select_network(0, True) config.update(request.params, show_error=False) config.default = network.ssid config.save() forced = b"none" disabled = True elif action == b"previous": network = select_network(-1) forced = b"none" elif action == b"next": network = select_network(1) forced = b"none" elif action == b"forget": forced = b"none" network.forget() network = select_network(-1,True) elif action == b"default": config.default = tools.strings.tostrings(network.ssid) config.save() if forced == b"none": dynamic = network.dynamic elif forced == b"1": dynamic = True else: dynamic = False ssids = [] if action in [b"previous",b"next",b"change",b"forget",b"modify",b"default"]: submit = \ Submit (text=tools.lang.save , name=b"action", value=b"save" ), Space(), \ Submit (text=tools.lang.lt , name=b"action", value=b"previous"), Space(), \ Submit (text=tools.lang.gt , name=b"action", value=b"next" ), Space(), \ Submit (text=tools.lang.forget, name=b"action", value=b"forget" ), Space(), \ Submit (text=tools.lang.set_default,name=b"action", value=b"default" ), Space(), \ Input ( name=b"forced", value=forced , type=b"hidden"), \ Input ( name=b"current", value=current , type=b"hidden") if wifi.station.Station.is_active() or wifi.accesspoint.AccessPoint().is_active(): networks = wifi.station.Station.scan() for net in networks: ssids.append(Option(value=net[0])) else: submit = Submit(text=tools.lang.modify, name=b"action", value=b"modify") page = webpage.mainpage.main_frame(request, response, args, tools.lang.wifi_configuration, Form([ Switch(text=tools.lang.activated, name=b"activated", checked=config.activated, disabled=disabled), Edit(text=tools.lang.hostname , name=b"hostname", placeholder=tools.lang.hostname_not_available, pattern=patternDns, value=config.hostname, disabled=disabled) if tools.support.hostname() else None, Switch(text=tools.lang.fallback_to_the, name=b"fallback", checked=config.fallback, disabled=disabled), Card( [ CardHeader(text= tools.lang.wifi if tools.strings.tostrings(network.ssid) != tools.strings.tostrings(config.default) else tools.lang.wifi_default), CardBody([ ComboBox(ssids, text=tools.lang.ssid, placeholder=tools.lang.enter_ssid, name=b"ssid", value=network.ssid, disabled=disabled), Edit(text=tools.lang.password, name=b"wifi_password", placeholder=tools.lang.enter_password, type=b"password",value=network.wifi_password, disabled=disabled), ]) ]), Card( [ CardHeader([\ Switch(text=tools.lang.dynamic_ip, spacer=b"mb-0", checked=dynamic, name=b"dynamic", event=b'onchange="this.form.submit()"', disabled=disabled)]), None if dynamic else CardBody([\ static_ip_html(network, disabled)]) ]), submit ])) await response.send_page(page)