#!/usr/bin/env python import os from yunohost.app import app_list from yunohost.diagnosis import Diagnoser class AppDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] cache_duration = 300 dependencies = [] def run(self): apps = app_list(full=True)["apps"] for app in apps: app["issues"] = list(self.issues(app)) if not any(app["issues"] for app in apps): yield dict( meta={"test": "apps"}, status="SUCCESS", summary="diagnosis_apps_allgood", ) else: for app in apps: if not app["issues"]: continue level = "ERROR" if any(issue[0] == "error" for issue in app["issues"]) else "WARNING" yield dict( meta={"test": "apps", "app": app["name"]}, status=level, summary="diagnosis_apps_issue", details=[issue[1] for issue in app["issues"]] ) def issues(self, app): # Check quality level in catalog if not app.get("from_catalog") or app["from_catalog"].get("state") != "working": yield ("error", "diagnosis_apps_not_in_app_catalog") elif not isinstance(app["from_catalog"].get("level"), int) or app["from_catalog"]["level"] == 0: yield ("error", "diagnosis_apps_broken") elif app["from_catalog"]["level"] <= 4: yield ("warning", "diagnosis_apps_bad_quality") # Check for super old, deprecated practices yunohost_version_req = app["manifest"].get("requirements", {}).get("yunohost", "").strip(">= ") if yunohost_version_req.startswith("2."): yield ("error", "diagnosis_apps_outdated_ynh_requirement") deprecated_helpers = [ "yunohost app setting", "yunohost app checkurl", "yunohost app checkport", "yunohost app initdb", "yunohost tools port-available", ] for deprecated_helper in deprecated_helpers: if os.system(f"grep -nr -q '{deprecated_helper}' {app['setting_path']}/scripts/") == 0: yield ("error", "diagnosis_apps_deprecated_practices") old_arg_regex = r'^domain=\${?[0-9]' if os.system(f"grep -q '{old_arg_regex}' {app['setting_path']}/scripts/install") == 0: yield ("error", "diagnosis_apps_deprecated_practices") def main(args, env, loggers): return AppDiagnoser(args, env, loggers).diagnose()