diff --git a/bin/check b/bin/check index 55b23dd..cf2ba9e 100755 --- a/bin/check +++ b/bin/check @@ -1,5 +1,10 @@ #!/usr/bin/env python3 -"""Check if all scripts and their dependencies are properly configured.""" +""" + Check if all script dependencies are available. + Does not go into venvs, dependencies need to be installed globally. + Prints a list of which commands can be run and which can't. + Basic binaries such as gnu coreutils are expected and not checked for. +""" import os import shutil @@ -9,28 +14,33 @@ from pathlib import Path from typing import Dict, List, Tuple import importlib -# Unicode emoji CHECK = "✅" CROSS = "❌" -def check_command(cmd: str) -> Tuple[bool, str]: - """Check if a command is available in PATH.""" - return (shutil.which(cmd) is not None, f"Command '{cmd}' not found") +def check_command(cmd: str) -> Tuple[bool, str|None]: + if shutil.which(cmd) is not None: + return (True, None) + else: + return (False, f"Command '{cmd}' not found") -def check_env_var(var: str) -> Tuple[bool, str]: - """Check if an environment variable is set.""" - return (var in os.environ, f"Environment variable '{var}' not set") +def check_env_var(var: str) -> Tuple[bool, str|None]: + if var in os.environ: + return (True, None) + else: + return (False, f"Environment variable '{var}' not set") -def check_python_lib(lib: str) -> Tuple[bool, str]: - """Check if a Python library is available.""" +def check_python_lib(lib: str) -> Tuple[bool, str|None]: try: - importlib.import_module(lib.split('.')[0]) - return (True, f"Python library '{lib}' found") + importlib.import_module(lib) + return (True, None) except ImportError: return (False, f"Python library '{lib}' not found") def check_stats_commands() -> List[Tuple[bool, str]]: - """Check if all stat commands in config can run.""" + """ + Checks if all the commands that are configured for the stats daemon + can be executed. + """ results = [] config_home = os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")) config_path = Path(config_home) / "stats/config.ini" @@ -46,25 +56,13 @@ def check_stats_commands() -> List[Tuple[bool, str]]: cmd = config[section]['command'] try: subprocess.run(cmd, shell=True, capture_output=True, check=True) - results.append((True, f"Command '{cmd}' runs successfully")) + results.append((True, None)) except subprocess.CalledProcessError: results.append((False, f"Command '{cmd}' failed to run")) return results -def check_stats_collector_config() -> List[Tuple[bool, str]]: - """Check if stats collector config exists.""" - results = [] - config_home = os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")) - config_path = Path(config_home) / "stats-collector/config.ini" - - if config_path.exists(): - results.append((True, "Stats collector config found")) - else: - results.append((False, f"Stats collector config not found at {config_path}")) - return results - -def check_scripts() -> Dict[str, List[Tuple[bool, str]]]: +def check_scripts() -> Dict[str, List[Tuple[bool, str|None]]]: """Run all checks for each script.""" checks = { "e-ink": [ @@ -78,7 +76,7 @@ def check_scripts() -> Dict[str, List[Tuple[bool, str]]]: check_command("webpmux"), check_command("gifski"), ], - "mover": [], # No specific dependencies + "mover": [], "pushover": [ check_env_var("PUSHOVER_APP_TOKEN"), check_env_var("PUSHOVER_USER_TOKEN"), @@ -93,14 +91,13 @@ def check_scripts() -> Dict[str, List[Tuple[bool, str]]]: check_command("free"), check_command("df"), check_python_lib("configparser"), - check_python_lib("http.server"), + check_python_lib("http"), *check_stats_commands(), ], "stats-collector": [ check_command("python3"), check_python_lib("sqlalchemy"), check_python_lib("requests"), - *check_stats_collector_config(), ], "syncwall": [ check_command("wget"), @@ -132,21 +129,15 @@ def check_scripts() -> Dict[str, List[Tuple[bool, str]]]: def main(): results = check_scripts() - print("Script Status Check") - print("==================") - for script, checks in results.items(): all_passed = all(result[0] for result in checks) if checks else True status = CHECK if all_passed else CROSS - print(f"\n{status} {script}") + print(f"{status} {script}") - if not checks: - print(" No specific requirements") - else: - for passed, message in checks: - status = CHECK if passed else CROSS - if not passed: - print(f" {status} {message}") + for passed, message in checks: + status = CHECK if passed else CROSS + if message: + print(f"\t{status} {message}") if __name__ == "__main__": main()