Improve connection management-related logic
This commit is contained in:
parent
cba8b1d202
commit
3c216b21b5
3 changed files with 32 additions and 13 deletions
|
|
@ -47,8 +47,8 @@ class Constants:
|
||||||
HV_PRIVILEGE_POLICY_PATH: Final[str] = f'{SYSTEM_CONFIG_PATH}/sudoers.d/hydra-veil'
|
HV_PRIVILEGE_POLICY_PATH: Final[str] = f'{SYSTEM_CONFIG_PATH}/sudoers.d/hydra-veil'
|
||||||
|
|
||||||
HV_SESSION_STATE_HOME: Final[str] = f'{HV_STATE_HOME}/sessions'
|
HV_SESSION_STATE_HOME: Final[str] = f'{HV_STATE_HOME}/sessions'
|
||||||
HV_TOR_SESSION_STATE_HOME: Final[str] = f'{HV_SESSION_STATE_HOME}/tor'
|
HV_TOR_STATE_HOME: Final[str] = f'{HV_STATE_HOME}/tor'
|
||||||
|
|
||||||
HV_TOR_CONTROL_SOCKET_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/tor.sock'
|
HV_TOR_CONTROL_SOCKET_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/tor.sock'
|
||||||
HV_TOR_PROCESS_IDENTIFIER_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/tor.pid'
|
HV_TOR_PROCESS_IDENTIFIER_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/tor.pid'
|
||||||
HV_TOR_INSTANCE_LOCK_PATH: Final[str] = f'{HV_TOR_SESSION_STATE_HOME}/lock'
|
HV_TOR_INSTANCE_LOCK_PATH: Final[str] = f'{HV_TOR_STATE_HOME}/lock'
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,7 @@ class ConnectionController:
|
||||||
|
|
||||||
raise ConnectionError('The connection could not be established.')
|
raise ConnectionError('The connection could not be established.')
|
||||||
|
|
||||||
|
ConnectionController.terminate_tor_connection()
|
||||||
time.sleep(1.0)
|
time.sleep(1.0)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
@ -252,7 +253,7 @@ class ConnectionController:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def establish_tor_connection(connection_observer: Optional[ConnectionObserver] = None):
|
def establish_tor_connection(connection_observer: Optional[ConnectionObserver] = None):
|
||||||
|
|
||||||
Path(Constants.HV_TOR_SESSION_STATE_HOME).mkdir(exist_ok=True, mode=0o700)
|
Path(Constants.HV_TOR_STATE_HOME).mkdir(mode=0o700, parents=True, exist_ok=True)
|
||||||
|
|
||||||
ConnectionController.terminate_tor_connection()
|
ConnectionController.terminate_tor_connection()
|
||||||
|
|
||||||
|
|
@ -264,7 +265,7 @@ class ConnectionController:
|
||||||
future = executor.submit(
|
future = executor.submit(
|
||||||
stem.process.launch_tor_with_config,
|
stem.process.launch_tor_with_config,
|
||||||
config={
|
config={
|
||||||
'DataDirectory': Constants.HV_TOR_SESSION_STATE_HOME,
|
'DataDirectory': Constants.HV_TOR_STATE_HOME,
|
||||||
'ControlSocket': Constants.HV_TOR_CONTROL_SOCKET_PATH,
|
'ControlSocket': Constants.HV_TOR_CONTROL_SOCKET_PATH,
|
||||||
'PIDFile': Constants.HV_TOR_PROCESS_IDENTIFIER_PATH,
|
'PIDFile': Constants.HV_TOR_PROCESS_IDENTIFIER_PATH,
|
||||||
'SocksPort': '0'
|
'SocksPort': '0'
|
||||||
|
|
@ -398,6 +399,7 @@ class ConnectionController:
|
||||||
if completed_successfully or not ConnectionController.system_uses_wireguard_interface():
|
if completed_successfully or not ConnectionController.system_uses_wireguard_interface():
|
||||||
|
|
||||||
subprocess.run(('nmcli', 'connection', 'delete', 'hv-ipv6-sink'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
subprocess.run(('nmcli', 'connection', 'delete', 'hv-ipv6-sink'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
ConnectionController.terminate_tor_connection()
|
||||||
SystemState.dissolve()
|
SystemState.dissolve()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
@ -482,6 +484,9 @@ class ConnectionController:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __establish_system_connection(profile: SystemProfile, connection_observer: Optional[ConnectionObserver] = None):
|
def __establish_system_connection(profile: SystemProfile, connection_observer: Optional[ConnectionObserver] = None):
|
||||||
|
|
||||||
|
if shutil.which('dbus-send') is None:
|
||||||
|
raise CommandNotFoundError('dbus-send')
|
||||||
|
|
||||||
if shutil.which('nmcli') is None:
|
if shutil.which('nmcli') is None:
|
||||||
raise CommandNotFoundError('nmcli')
|
raise CommandNotFoundError('nmcli')
|
||||||
|
|
||||||
|
|
@ -489,19 +494,28 @@ class ConnectionController:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
process_output = subprocess.check_output(('nmcli', 'connection', 'import', '--temporary', 'type', 'wireguard', 'file', profile.get_wireguard_configuration_path()), text=True)
|
process_output = subprocess.check_output(('nmcli', 'connection', 'import', '--temporary', 'type', 'wireguard', 'file', profile.get_wireguard_configuration_path()), text=True)
|
||||||
except CalledProcessError as exception:
|
except CalledProcessError:
|
||||||
raise CalledProcessError(exception.returncode, 'nmcli')
|
raise ConnectionError('The connection could not be established.')
|
||||||
|
|
||||||
connection_id = (m := re.search(r'(?<=\()([a-f0-9-]+?)(?=\))', process_output)) and m.group(1)
|
|
||||||
subprocess.run(('nmcli', 'connection', 'modify', connection_id, 'ipv4.dns-priority', '-1750', 'ipv4.ignore-auto-dns', 'yes'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
connection_id = (m := re.search(r'(?<=\()([a-f0-9-]+?)(?=\))', process_output)) and m.group(1)
|
||||||
ipv6_method = subprocess.check_output(('nmcli', '-g', 'ipv6.method', 'connection', 'show', connection_id), text=True).strip()
|
ipv6_method = subprocess.check_output(('nmcli', '-g', 'ipv6.method', 'connection', 'show', connection_id), text=True).strip()
|
||||||
|
|
||||||
except CalledProcessError:
|
except CalledProcessError:
|
||||||
raise ConnectionError('The connection could not be established.')
|
raise ConnectionError('The connection could not be established.')
|
||||||
|
|
||||||
if ipv6_method in ('disabled', 'ignore'):
|
if ipv6_method in ('disabled', 'ignore'):
|
||||||
subprocess.run(('nmcli', 'connection', 'add', 'type', 'dummy', 'save', 'no', 'con-name', 'hv-ipv6-sink', 'ifname', 'hvipv6sink0', 'ipv6.method', 'manual', 'ipv6.addresses', 'fd7a:fd4b:54e3:077c::/64', 'ipv6.gateway', 'fd7a:fd4b:54e3:077c::1', 'ipv6.route-metric', '72'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
||||||
|
try:
|
||||||
|
subprocess.run(('dbus-send', '--system', '--print-reply', '--dest=org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager', 'org.freedesktop.DBus.Properties.Set', 'string:org.freedesktop.NetworkManager', 'string:ConnectivityCheckEnabled', 'variant:boolean:false'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
|
||||||
|
except CalledProcessError:
|
||||||
|
raise ConnectionError('The connection could not be established.')
|
||||||
|
|
||||||
|
try:
|
||||||
|
subprocess.run(('nmcli', 'connection', 'add', 'type', 'dummy', 'save', 'no', 'con-name', 'hv-ipv6-sink', 'ifname', 'hvipv6sink0', 'ipv6.method', 'manual', 'ipv6.addresses', 'fd7a:fd4b:54e3:077c::/64', 'ipv6.gateway', 'fd7a:fd4b:54e3:077c::1', 'ipv6.dns', '::1', 'ipv6.route-metric', '72'), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
|
||||||
|
except CalledProcessError:
|
||||||
|
raise ConnectionError('The connection could not be established.')
|
||||||
|
|
||||||
SystemStateController.create(profile.id)
|
SystemStateController.create(profile.id)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,9 +67,14 @@ class SessionState:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def all():
|
def all():
|
||||||
|
|
||||||
|
try:
|
||||||
|
directory_entries = os.listdir(Constants.HV_SESSION_STATE_HOME)
|
||||||
|
except FileNotFoundError:
|
||||||
|
return []
|
||||||
|
|
||||||
session_states = []
|
session_states = []
|
||||||
|
|
||||||
for directory_entry in os.listdir(Constants.HV_SESSION_STATE_HOME):
|
for directory_entry in directory_entries:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
id = int(directory_entry)
|
id = int(directory_entry)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue