BLE001: fix

This commit is contained in:
Jörg Thalheim
2025-08-20 17:13:38 +02:00
parent c55b369899
commit c9a709783a
16 changed files with 49 additions and 63 deletions

View File

@@ -59,7 +59,7 @@ class ApiBridge(ABC):
f"{middleware.__class__.__name__} => {request.method_name}", f"{middleware.__class__.__name__} => {request.method_name}",
) )
middleware.process(context) middleware.process(context)
except Exception as e: except Exception as e: # noqa: BLE001
# If middleware fails, handle error # If middleware fails, handle error
self.send_api_error_response( self.send_api_error_response(
request.op_key or "unknown", request.op_key or "unknown",

View File

@@ -148,7 +148,7 @@ class HttpBridge(ApiBridge, BaseHTTPRequestHandler):
self.send_header("Content-Type", content_type) self.send_header("Content-Type", content_type)
self.end_headers() self.end_headers()
self.wfile.write(file_data) self.wfile.write(file_data)
except Exception as e: except (OSError, json.JSONDecodeError, UnicodeDecodeError) as e:
log.error(f"Error reading Swagger file: {e!s}") log.error(f"Error reading Swagger file: {e!s}")
self.send_error(500, "Internal Server Error") self.send_error(500, "Internal Server Error")
@@ -252,7 +252,7 @@ class HttpBridge(ApiBridge, BaseHTTPRequestHandler):
gen_op_key = str(uuid.uuid4()) gen_op_key = str(uuid.uuid4())
try: try:
self._handle_api_request(method_name, request_data, gen_op_key) self._handle_api_request(method_name, request_data, gen_op_key)
except Exception as e: except RuntimeError as e:
log.exception(f"Error processing API request {method_name}") log.exception(f"Error processing API request {method_name}")
self.send_api_error_response( self.send_api_error_response(
gen_op_key, gen_op_key,
@@ -275,7 +275,7 @@ class HttpBridge(ApiBridge, BaseHTTPRequestHandler):
["http_bridge", "POST", method_name], ["http_bridge", "POST", method_name],
) )
return None return None
except Exception as e: except (OSError, ValueError, UnicodeDecodeError) as e:
self.send_api_error_response( self.send_api_error_response(
"post", "post",
f"Error reading request: {e!s}", f"Error reading request: {e!s}",
@@ -305,7 +305,7 @@ class HttpBridge(ApiBridge, BaseHTTPRequestHandler):
op_key=op_key, op_key=op_key,
) )
except Exception as e: except (KeyError, TypeError, ValueError) as e:
self.send_api_error_response( self.send_api_error_response(
gen_op_key, gen_op_key,
str(e), str(e),

View File

@@ -81,7 +81,7 @@ class Webview:
msg = message_queue.get() # Blocks until available msg = message_queue.get() # Blocks until available
js_code = f"window.notifyBus({json.dumps(msg)});" js_code = f"window.notifyBus({json.dumps(msg)});"
self.eval(js_code) self.eval(js_code)
except Exception as e: except (json.JSONDecodeError, RuntimeError, AttributeError) as e:
print("Bridge notify error:", e) print("Bridge notify error:", e)
sleep(0.01) # avoid busy loop sleep(0.01) # avoid busy loop
@@ -211,7 +211,7 @@ class Webview:
try: try:
result = callback(*args) result = callback(*args)
success = True success = True
except Exception as e: except Exception as e: # noqa: BLE001
result = str(e) result = str(e)
success = False success = False
self.return_(seq.decode(), 0 if success else 1, json.dumps(result)) self.return_(seq.decode(), 0 if success else 1, json.dumps(result))

View File

@@ -1,6 +1,7 @@
import argparse import argparse
import logging import logging
from clan_lib.errors import ClanError
from clan_lib.flake import require_flake from clan_lib.flake import require_flake
from clan_lib.network.network import networks_from_flake from clan_lib.network.network import networks_from_flake
@@ -54,7 +55,7 @@ def list_command(args: argparse.Namespace) -> None:
try: try:
is_running = network.is_running() is_running = network.is_running()
running_status = "Yes" if is_running else "No" running_status = "Yes" if is_running else "No"
except Exception: except ClanError:
running_status = "Error" running_status = "Error"
print( print(

View File

@@ -83,7 +83,7 @@ class KeyType(enum.Enum):
except FileNotFoundError: except FileNotFoundError:
return return
except Exception as ex: except OSError as ex:
log.warning(f"Could not read age keys from {key_path}", exc_info=ex) log.warning(f"Could not read age keys from {key_path}", exc_info=ex)
if keys := os.environ.get("SOPS_AGE_KEY"): if keys := os.environ.get("SOPS_AGE_KEY"):

View File

@@ -155,7 +155,7 @@ class AsyncThread[**P, R](threading.Thread):
set_should_cancel(lambda: self.stop_event.is_set()) set_should_cancel(lambda: self.stop_event.is_set())
# Arguments for ParamSpec "P@AsyncThread" are missing # Arguments for ParamSpec "P@AsyncThread" are missing
self.result = AsyncResult(_result=self.function(*self.args, **self.kwargs)) self.result = AsyncResult(_result=self.function(*self.args, **self.kwargs))
except Exception as ex: except Exception as ex: # noqa: BLE001
self.result = AsyncResult(_result=ex) self.result = AsyncResult(_result=ex)
finally: finally:
self.finished = True self.finished = True

View File

@@ -846,7 +846,7 @@ class Flake:
return return
try: try:
self._cache.load_from_file(path) self._cache.load_from_file(path)
except Exception as e: except (OSError, json.JSONDecodeError, KeyError, ValueError) as e:
log.warning(f"Failed load eval cache: {e}. Continue without cache") log.warning(f"Failed load eval cache: {e}. Continue without cache")
def prefetch(self) -> None: def prefetch(self) -> None:

View File

@@ -234,7 +234,7 @@ def run_machine_update(
is_mobile = machine.select( is_mobile = machine.select(
"config.system.clan.deployment.nixosMobileWorkaround", "config.system.clan.deployment.nixosMobileWorkaround",
) )
except Exception: except ClanError:
is_mobile = False is_mobile = False
# if the machine is mobile, we retry to deploy with the mobile workaround method # if the machine is mobile, we retry to deploy with the mobile workaround method
if is_mobile: if is_mobile:

View File

@@ -161,12 +161,9 @@ def get_best_remote(machine: "Machine") -> Iterator["Remote"]:
if target_host: if target_host:
log.debug(f"Using targetHost from inventory for {machine.name}: {target_host}") log.debug(f"Using targetHost from inventory for {machine.name}: {target_host}")
# Create a direct network with just this machine # Create a direct network with just this machine
try: remote = Remote.from_ssh_uri(machine_name=machine.name, address=target_host)
remote = Remote.from_ssh_uri(machine_name=machine.name, address=target_host) yield remote
yield remote return
return
except Exception as e:
log.debug(f"Inventory targetHost not reachable for {machine.name}: {e}")
# Step 2: Try existing networks by priority # Step 2: Try existing networks by priority
try: try:
@@ -189,7 +186,7 @@ def get_best_remote(machine: "Machine") -> Iterator["Remote"]:
) )
yield network.remote(machine.name) yield network.remote(machine.name)
return return
except Exception as e: except ClanError as e:
log.debug(f"Failed to reach {machine.name} via {network_name}: {e}") log.debug(f"Failed to reach {machine.name} via {network_name}: {e}")
else: else:
try: try:
@@ -202,34 +199,26 @@ def get_best_remote(machine: "Machine") -> Iterator["Remote"]:
) )
yield connected_network.remote(machine.name) yield connected_network.remote(machine.name)
return return
except Exception as e: except ClanError as e:
log.debug( log.debug(
f"Failed to establish connection to {machine.name} via {network_name}: {e}", f"Failed to establish connection to {machine.name} via {network_name}: {e}",
) )
except Exception as e: except (ImportError, AttributeError, KeyError) as e:
log.debug(f"Failed to use networking modules to determine machines remote: {e}") log.debug(f"Failed to use networking modules to determine machines remote: {e}")
# Step 3: Try targetHost from machine nixos config # Step 3: Try targetHost from machine nixos config
try: target_host = machine.select('config.clan.core.networking."targetHost"')
target_host = machine.select('config.clan.core.networking."targetHost"') if target_host:
if target_host: log.debug(
log.debug( f"Using targetHost from machine config for {machine.name}: {target_host}",
f"Using targetHost from machine config for {machine.name}: {target_host}", )
) # Check if reachable
# Check if reachable remote = Remote.from_ssh_uri(
try: machine_name=machine.name,
remote = Remote.from_ssh_uri( address=target_host,
machine_name=machine.name, )
address=target_host, yield remote
) return
yield remote
return
except Exception as e:
log.debug(
f"Machine config targetHost not reachable for {machine.name}: {e}",
)
except Exception as e:
log.debug(f"Could not get targetHost from machine config: {e}")
# No connection method found # No connection method found
msg = f"Could not find any way to connect to machine '{machine.name}'. No targetHost configured and machine not reachable via any network." msg = f"Could not find any way to connect to machine '{machine.name}'. No targetHost configured and machine not reachable via any network."
@@ -249,12 +238,7 @@ def get_network_overview(networks: dict[str, Network]) -> dict:
else: else:
with module.connection(network) as conn: with module.connection(network) as conn:
for peer_name in conn.peers: for peer_name in conn.peers:
try: result[network_name]["peers"][peer_name] = conn.ping(
result[network_name]["peers"][peer_name] = conn.ping( peer_name,
peer_name, )
)
except ClanError:
log.warning(
f"getting host for machine: {peer_name} in network: {network_name} failed",
)
return result return result

View File

@@ -29,6 +29,7 @@ class QRCodeData:
@contextmanager @contextmanager
def get_best_remote(self) -> Iterator[Remote]: def get_best_remote(self) -> Iterator[Remote]:
errors = []
for address in self.addresses: for address in self.addresses:
try: try:
log.debug(f"Establishing connection via {address}") log.debug(f"Establishing connection via {address}")
@@ -39,8 +40,13 @@ class QRCodeData:
if ping_time is not None: if ping_time is not None:
log.info(f"reachable via {address} after connection") log.info(f"reachable via {address} after connection")
yield address.remote yield address.remote
except Exception as e: except ClanError as e:
log.debug(f"Failed to establish connection via {address}: {e}") errors.append((address, e))
if not errors:
msg = "No reachable remote found in QR code data: " + ", ".join(
f"{addr.remote} ({err})" for addr, err in errors
)
raise ClanError(msg)
def read_qr_json(qr_data: dict[str, Any], flake: Flake) -> QRCodeData: def read_qr_json(qr_data: dict[str, Any], flake: Flake) -> QRCodeData:

View File

@@ -239,7 +239,7 @@ def test_run_exception(hosts: list[Remote], runtime: AsyncRuntime) -> None:
runtime.async_run(None, host.run_local, ["exit 1"], RunOpts(shell=True)) # noqa: S604 runtime.async_run(None, host.run_local, ["exit 1"], RunOpts(shell=True)) # noqa: S604
runtime.join_all() runtime.join_all()
runtime.check_all() runtime.check_all()
except Exception: # noqa: S110 except ClanError:
pass pass
else: else:
msg = "should have raised Exception" msg = "should have raised Exception"
@@ -255,7 +255,7 @@ def test_run_function_exception(hosts: list[Remote], runtime: AsyncRuntime) -> N
runtime.async_run(None, some_func, host) runtime.async_run(None, some_func, host)
runtime.join_all() runtime.join_all()
runtime.check_all() runtime.check_all()
except Exception: # noqa: S110 except ClanError:
pass pass
else: else:
msg = "should have raised Exception" msg = "should have raised Exception"

View File

@@ -90,7 +90,7 @@ class SudoAskpassProxy:
ssh_process.stdin.flush() ssh_process.stdin.flush()
else: else:
print(stripped_line) print(stripped_line)
except Exception as e: except (OSError, ClanError) as e:
logger.error(f"Error processing passwords requests output: {e}") logger.error(f"Error processing passwords requests output: {e}")
def run(self) -> str: def run(self) -> str:

View File

@@ -84,7 +84,7 @@ def _init_proc(
print(linebreak + f" {func.__name__}:{pid} " + linebreak, file=sys.stderr) print(linebreak + f" {func.__name__}:{pid} " + linebreak, file=sys.stderr)
try: try:
func(**kwargs) func(**kwargs)
except Exception as ex: except Exception as ex: # noqa: BLE001
traceback.print_exc() traceback.print_exc()
if on_except is not None: if on_except is not None:
on_except(ex, mp.current_process()) on_except(ex, mp.current_process())

View File

@@ -345,7 +345,7 @@ class VMObject(GObject.Object):
raise ClanError(msg) raise ClanError(msg)
with self.qmp_wrap.qmp_ctx() as qmp: with self.qmp_wrap.qmp_ctx() as qmp:
qmp.command("system_powerdown") qmp.command("system_powerdown")
except Exception as ex: except (ClanError, OSError, ConnectionError) as ex:
log.debug(f"QMP command 'system_powerdown' ignored. Error: {ex}") log.debug(f"QMP command 'system_powerdown' ignored. Error: {ex}")
# Try 20 times to stop the VM # Try 20 times to stop the VM

View File

@@ -139,7 +139,7 @@ class ClanStore:
# Convert the byte array to a string and print it # Convert the byte array to a string and print it
logs_view.set_message(contents.decode("utf-8")) logs_view.set_message(contents.decode("utf-8"))
except Exception as e: except (GLib.Error, UnicodeDecodeError) as e:
print(f"Error reading file: {e}") print(f"Error reading file: {e}")
# only one vm can output logs at a time # only one vm can output logs at a time

View File

@@ -1,7 +1,6 @@
import argparse import argparse
import json import json
import logging import logging
import traceback
from collections.abc import Callable, Iterable from collections.abc import Callable, Iterable
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
@@ -454,8 +453,4 @@ def main() -> None:
if __name__ == "__main__": if __name__ == "__main__":
try: main()
main()
except Exception:
print("An error occurred:")
traceback.print_exc()