1
0
Files
scripts/bin/check
T
2024-12-18 20:19:25 +01:00

153 lines
4.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""Check if all scripts and their dependencies are properly configured."""
import os
import shutil
import subprocess
import configparser
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_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_python_lib(lib: str) -> Tuple[bool, str]:
"""Check if a Python library is available."""
try:
importlib.import_module(lib.split('.')[0])
return (True, f"Python library '{lib}' found")
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."""
results = []
config_home = os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config"))
config_path = Path(config_home) / "stats/config.ini"
if not config_path.exists():
return [(False, f"Stats config not found at {config_path}")]
config = configparser.ConfigParser(interpolation=None)
config.read(config_path)
for section in config.sections():
if section.startswith('stat.'):
cmd = config[section]['command']
try:
subprocess.run(cmd, shell=True, capture_output=True, check=True)
results.append((True, f"Command '{cmd}' runs successfully"))
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]]]:
"""Run all checks for each script."""
checks = {
"e-ink": [
check_command("python3"),
check_python_lib("PIL"),
],
"indeel": [
check_command("file"),
check_command("magick"),
check_command("dctfilename"),
check_command("webpmux"),
check_command("gifski"),
],
"mover": [], # No specific dependencies
"pushover": [
check_env_var("PUSHOVER_APP_TOKEN"),
check_env_var("PUSHOVER_USER_TOKEN"),
check_command("curl"),
check_python_lib("requests"),
],
"stats": [
check_command("python3"),
check_command("sensors"),
check_command("jq"),
check_command("top"),
check_command("free"),
check_command("df"),
check_python_lib("configparser"),
check_python_lib("http.server"),
*check_stats_commands(),
],
"stats-collector": [
check_command("python3"),
check_python_lib("sqlalchemy"),
check_python_lib("requests"),
*check_stats_collector_config(),
],
"syncwall": [
check_command("wget"),
check_command("wal"),
],
"tclean": [
check_command("python3"),
check_command("transmission-remote"),
check_python_lib("argparse"),
check_python_lib("datetime"),
],
"vc": [
check_command("ffmpeg"),
check_command("yt-dlp"),
check_python_lib("argparse"),
],
"vcmp": [
check_command("ffmpeg"),
check_command("ffprobe"),
check_command("nice"),
check_python_lib("pathlib"),
check_python_lib("argparse"),
check_python_lib("logging"),
check_python_lib("tempfile"),
],
}
return checks
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}")
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}")
if __name__ == "__main__":
main()