Sindbad~EG File Manager

Current Path : /opt/dedrads/
Upload File :
Current File : //opt/dedrads/check_php

#!/usr/bin/imh-python3
"""Written by MuhammadK"""

import argparse
import json
import subprocess
import re
from prettytable import PrettyTable

# Using IMH's in-house color library
from rads.color import red, green, blue, yellow


def color_php_version(phpver):
    """Color PHP version red if < 7.2, green otherwise."""
    m = re.search(r'php(\d)(\d)', phpver)
    if m:
        version = float(f"{m.group(1)}.{m.group(2)}")
        if version < 7.2:
            return red(phpver)
    return green(phpver)


def color_domain(domain):
    return blue(domain)


def color_username(user):
    return yellow(user)


def visible_len(s):
    """Length without ANSI color codes."""
    return len(re.sub(r'\x1B[@-_][0-?]*[ -/]*[@-~]', '', s))


def get_php_fpm_info():
    try:
        output = subprocess.check_output(
            ['whmapi1', 'php_get_vhost_versions', '--output=json'], text=True
        )
        data = json.loads(output)
        return data.get('data', {}).get('versions', [])
    except Exception as e:
        print(f"Error getting PHP-FPM info: {e}")
        return []


def print_installed_php_versions():
    """Use WHM API to get installed PHP versions."""
    try:
        output = subprocess.check_output(
            ['whmapi1', 'php_get_installed_versions', '--output=json'],
            text=True,
        )
        data = json.loads(output)
        versions = data.get('data', {}).get('versions', [])
        print(green("Installed PHP Versions:"))
        print("\n".join(versions))
        print()
    except Exception as e:
        print(f"Error getting installed PHP versions: {e}")


def print_php_sorted_table(pairs):
    if not pairs:
        print("No PHP-FPM pool data found.")
        return

    headers = [
        "PHP Version",
        "Domain",
        "User",
        "Docroot",
        "MaxChildren",
        "MaxRequests",
        "IdleTimeout",
    ]

    table = PrettyTable()
    # table.set_style(TableStyle.DOUBLE_BORDER)
    table.horizontal_char = "═"
    table.vertical_char = "║"
    table.junction_char = "╬"

    table.field_names = headers
    table.align = "l"

    for item in pairs:
        phpver = item.get('version', 'unknown')
        domain = item.get('vhost', 'unknown')
        user = item.get('user', 'unknown')
        docroot = item.get('docroot', 'unknown')

        pool = item.get('php_fpm_pool_parms', {})
        mc = str(pool.get('pm_max_children', ''))
        mr = str(pool.get('pm_max_requests', ''))
        pit = str(pool.get('pm_process_idle_timeout', ''))

        row = [
            color_php_version(phpver),
            color_domain(domain),
            color_username(user),
            docroot,
            mc,
            mr,
            pit,
        ]
        table.add_row(row)

    print(table)


def main():
    parser = argparse.ArgumentParser(
        description="List domains with PHP version and PHP-FPM info"
    )
    parser.add_argument(
        "-v", "--phpver", help="Filter by PHP version (e.g. php7.4, php8.1)"
    )
    parser.add_argument(
        "-d", "--domain", nargs="+", help="Filter by specific domain(s)"
    )
    parser.add_argument("-u", "--user", help="Filter by cPanel username")
    args = parser.parse_args()

    if not args.phpver and not args.domain and not args.user:
        print_installed_php_versions()

    versions = get_php_fpm_info()
    filtered = []

    for item in versions:
        phpver = item.get('version', '')
        domain = item.get('vhost', '')
        user = item.get('account', 'unknown')
        docroot = item.get('documentroot', 'unknown')

        if args.phpver:
            filt = args.phpver.lower().replace('.', '').replace('php', '')
            curr = phpver.lower().replace('ea-php', '')
            if filt != curr:
                continue

        if args.domain and domain not in args.domain:
            continue

        if args.user and user != args.user:
            continue

        item['user'] = user
        item['docroot'] = docroot
        filtered.append(item)

    def php_sort_key(item):
        match = re.search(r'php(\d)(\d)', item.get('version', ''))
        return float(f"{match.group(1)}.{match.group(2)}") if match else 0.0

    filtered.sort(key=php_sort_key)
    print_php_sorted_table(filtered)


if __name__ == "__main__":
    main()

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists