mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2026-01-16 23:00:43 +08:00
feat: update config flow network detect logic
This commit is contained in:
parent
c5b2f43663
commit
742e84d6dd
@ -51,7 +51,7 @@ import ipaddress
|
|||||||
import json
|
import json
|
||||||
import secrets
|
import secrets
|
||||||
import traceback
|
import traceback
|
||||||
from typing import Optional, Set
|
from typing import Optional, Set, Tuple
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
from aiohttp.hdrs import METH_GET
|
from aiohttp.hdrs import METH_GET
|
||||||
@ -255,36 +255,11 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self._cc_network_detect_addr = user_input.get(
|
self._cc_network_detect_addr = user_input.get(
|
||||||
'network_detect_addr', self._cc_network_detect_addr)
|
'network_detect_addr', self._cc_network_detect_addr)
|
||||||
|
|
||||||
ip_list: list[str] = []
|
ip_list, url_list, invalid_list = _handle_network_detect_addr(
|
||||||
url_list: list[str] = []
|
addr_str=self._cc_network_detect_addr)
|
||||||
if self._cc_network_detect_addr:
|
if invalid_list:
|
||||||
invalid_list: list[str] = []
|
return await self.__show_auth_config_form(
|
||||||
for addr in self._cc_network_detect_addr.split(','):
|
reason='invalid_network_addr')
|
||||||
addr = addr.strip()
|
|
||||||
if not addr:
|
|
||||||
continue
|
|
||||||
# pylint: disable=broad-exception-caught
|
|
||||||
try:
|
|
||||||
ipaddress.ip_address(addr)
|
|
||||||
ip_list.append(addr)
|
|
||||||
continue
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
result = urlparse(addr)
|
|
||||||
if (
|
|
||||||
result.netloc
|
|
||||||
and result.scheme.startswith('http')
|
|
||||||
):
|
|
||||||
url_list.append(addr)
|
|
||||||
continue
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
invalid_list.append(addr)
|
|
||||||
if invalid_list:
|
|
||||||
return await self.__show_auth_config_form(
|
|
||||||
reason='invalid_network_addr')
|
|
||||||
network_detect_addr: dict = {}
|
|
||||||
if ip_list or url_list:
|
if ip_list or url_list:
|
||||||
if ip_list and not await self._miot_network.ping_multi_async(
|
if ip_list and not await self._miot_network.ping_multi_async(
|
||||||
ip_list=ip_list):
|
ip_list=ip_list):
|
||||||
@ -294,13 +269,12 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
url_list=url_list):
|
url_list=url_list):
|
||||||
return await self.__show_auth_config_form(
|
return await self.__show_auth_config_form(
|
||||||
reason='invalid_http_addr')
|
reason='invalid_http_addr')
|
||||||
network_detect_addr = {
|
|
||||||
'ip': ip_list, 'url': url_list}
|
|
||||||
else:
|
else:
|
||||||
if not await self._miot_network.get_network_status_async():
|
if not await self._miot_network.get_network_status_async():
|
||||||
return await self.__show_auth_config_form(
|
return await self.__show_auth_config_form(
|
||||||
reason='invalid_default_addr')
|
reason='invalid_default_addr')
|
||||||
network_detect_addr = {'ip': [], 'url': []}
|
network_detect_addr = {
|
||||||
|
'ip': ip_list, 'url': url_list}
|
||||||
if await self._miot_storage.update_user_config_async(
|
if await self._miot_storage.update_user_config_async(
|
||||||
uid='global_config', cloud_server='all', config={
|
uid='global_config', cloud_server='all', config={
|
||||||
'network_detect_addr': network_detect_addr}):
|
'network_detect_addr': network_detect_addr}):
|
||||||
@ -1692,36 +1666,11 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
self._cc_network_detect_addr = user_input.get(
|
self._cc_network_detect_addr = user_input.get(
|
||||||
'network_detect_addr', self._cc_network_detect_addr)
|
'network_detect_addr', self._cc_network_detect_addr)
|
||||||
|
|
||||||
ip_list: list[str] = []
|
ip_list, url_list, invalid_list = _handle_network_detect_addr(
|
||||||
url_list: list[str] = []
|
addr_str=self._cc_network_detect_addr)
|
||||||
if self._cc_network_detect_addr:
|
if invalid_list:
|
||||||
invalid_list: list[str] = []
|
return await self.__show_network_detect_config_form(
|
||||||
for addr in self._cc_network_detect_addr.split(','):
|
reason='invalid_network_addr')
|
||||||
addr = addr.strip()
|
|
||||||
if not addr:
|
|
||||||
continue
|
|
||||||
# pylint: disable=broad-exception-caught
|
|
||||||
try:
|
|
||||||
ipaddress.ip_address(addr)
|
|
||||||
ip_list.append(addr)
|
|
||||||
continue
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
result = urlparse(addr)
|
|
||||||
if (
|
|
||||||
result.netloc
|
|
||||||
and result.scheme.startswith('http')
|
|
||||||
):
|
|
||||||
url_list.append(addr)
|
|
||||||
continue
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
invalid_list.append(addr)
|
|
||||||
if invalid_list:
|
|
||||||
return await self.__show_network_detect_config_form(
|
|
||||||
reason='invalid_network_addr')
|
|
||||||
network_detect_addr: dict = {}
|
|
||||||
if ip_list or url_list:
|
if ip_list or url_list:
|
||||||
if ip_list and not await self._miot_network.ping_multi_async(
|
if ip_list and not await self._miot_network.ping_multi_async(
|
||||||
ip_list=ip_list):
|
ip_list=ip_list):
|
||||||
@ -1731,13 +1680,11 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
url_list=url_list):
|
url_list=url_list):
|
||||||
return await self.__show_network_detect_config_form(
|
return await self.__show_network_detect_config_form(
|
||||||
reason='invalid_http_addr')
|
reason='invalid_http_addr')
|
||||||
network_detect_addr = {
|
|
||||||
'ip': ip_list, 'url': url_list}
|
|
||||||
else:
|
else:
|
||||||
if not await self._miot_network.get_network_status_async():
|
if not await self._miot_network.get_network_status_async():
|
||||||
return await self.__show_network_detect_config_form(
|
return await self.__show_network_detect_config_form(
|
||||||
reason='invalid_default_addr')
|
reason='invalid_default_addr')
|
||||||
network_detect_addr = {'ip': [], 'url': []}
|
network_detect_addr: dict = {'ip': ip_list, 'url': url_list}
|
||||||
|
|
||||||
if await self._miot_storage.update_user_config_async(
|
if await self._miot_storage.update_user_config_async(
|
||||||
uid='global_config', cloud_server='all', config={
|
uid='global_config', cloud_server='all', config={
|
||||||
@ -1932,3 +1879,35 @@ def _handle_devices_filter(
|
|||||||
return {}
|
return {}
|
||||||
return {
|
return {
|
||||||
did: info for did, info in devices.items() if did in include_set}
|
did: info for did, info in devices.items() if did in include_set}
|
||||||
|
|
||||||
|
|
||||||
|
def _handle_network_detect_addr(
|
||||||
|
addr_str: str
|
||||||
|
) -> Tuple[list[str], list[str], list[str]]:
|
||||||
|
ip_list: list[str] = []
|
||||||
|
url_list: list[str] = []
|
||||||
|
invalid_list: list[str] = []
|
||||||
|
if addr_str:
|
||||||
|
for addr in addr_str.split(','):
|
||||||
|
addr = addr.strip()
|
||||||
|
if not addr:
|
||||||
|
continue
|
||||||
|
# pylint: disable=broad-exception-caught
|
||||||
|
try:
|
||||||
|
ipaddress.ip_address(addr)
|
||||||
|
ip_list.append(addr)
|
||||||
|
continue
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
result = urlparse(addr)
|
||||||
|
if (
|
||||||
|
result.netloc
|
||||||
|
and result.scheme.startswith('http')
|
||||||
|
):
|
||||||
|
url_list.append(addr)
|
||||||
|
continue
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
invalid_list.append(addr)
|
||||||
|
return ip_list, url_list, invalid_list
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user