1
0
Fork 0
mirror of https://github.com/ItsDrike/dotfiles.git synced 2025-04-30 05:28:36 +00:00
dotfiles/src/util/internet.py
2021-04-12 18:06:50 +02:00

95 lines
3 KiB
Python

import sys
import time
import urllib.request
from urllib.error import URLError
import colorama
import inquirer.shortcuts
from src.util.command import command_exists, run_cmd, run_root_cmd
def _connect_wifi() -> bool:
"""
Attempt to connect to internet using WiFI.
This uses `nmtui` with fallback to `iwctl`, if none
of these tools are aviable, either quit or return False,
if the tool was executed properly, return True
Note: True doesn't mean we connected, just that the tool was ran,
it is up to user to use that tool properly and make the connection.
"""
if command_exists("nmtui"):
run_root_cmd("nmtui")
elif command_exists("iwctl"):
run_root_cmd("iwctl")
else:
print(
f"{colorama.Fore.RED}{colorama.Style.BRIGHT}ERROR: "
"WiFi connection tool not found: `nmtui`/`iwctl`, please use Ethernet instead.\n"
"Alternatively, connect manually outside of this script and re-run it."
)
opt = inquirer.shortcuts.list_input(
"How do you wish to proceed?",
choices=["Quit and connect manually", "Proceed with Ethernet"]
)
if opt == "Quit and connect manually":
sys.exit()
else:
return False
return True
def _connect_ethernet(max_wait_time: int = 20, iteration_time: int = 1) -> bool:
"""
Attempt to connect to internet using Ethernet.
This will simply wait for the user to plug in the ethernet cable,
once that happens loop is interrupted and True is returned. In case
it takes over the `max_wait_time`, loop ends and False is returned.
`iteration_time` is the time of each loop iteration, after whcih we
check if connection is valid, if not, we continue iterating.
"""
print(f"{colorama.Style.DIM}Please plug in the Ethernet cable, waiting 20s")
time_elapsed = 0
while not check_connection() and time_elapsed < max_wait_time:
time.sleep(iteration_time)
time_elapsed += iteration_time
if time_elapsed >= max_wait_time:
# We stopped because max wait time was crossed
return False
else:
# We stopped because connection to internet was successful
return True
def connect_internet():
wifi_possible = True
while not check_connection():
run_cmd("clear")
print(f"{colorama.Fore.RED}Internet connection unaviable")
if wifi_possible:
connect_opt = inquirer.shortcuts.list_input("How do you wish to connect to internet?", choices=["Wi-Fi", "Ethernet"])
else:
connect_opt = "Ethernet"
if connect_opt == "Wi-Fi":
wifi_possible = _connect_wifi()
else:
if _connect_ethernet():
break
print(f"{colorama.Fore.GREEN}Internet connection successful")
def check_connection(host="https://google.com") -> bool:
"""Check if system is connected to the internet"""
try:
urllib.request.urlopen(host)
return True
except URLError:
return False