Desarrollo y bases de datos

Ejemplos de reportes en CSV usando la API de cPanel

Revisado el 5 min de lectura cpanel api reportes

En un artículo anterior tratábamos el uso de la API de cPanel para automatizar tareas de todo tipo, en esta nueva entrega daremos ejemplos con los que utilizar esta misma API para generar reportes en formato CSV, formato compatible para abrir con cualquier procesador de hojas de cálculo como Excel o LibreOffice.

Los siguientes scripts definen una llamada local a UAPI, reciben la respuesta en JSON y presentan los datos como filas separadas por punto y coma. Guárdalos fuera de public_html y ejecútalos únicamente desde la terminal. No publiques un fichero que invoque shell_exec() al visitarlo desde el navegador.

Para guardar el resultado, redirige la salida del script a un fichero privado y descárgalo después:

php /home/usuario_cpanel/reportes/reporte.php > /home/usuario_cpanel/reportes/reporte.csv

Acompañamos además cada caso con un enlace a la documentación de la función ejecutada, de forma que podremos ver qué otros valores devuelve cada llamada y añadir al reporte cualquier otro dato que pueda ser de interés.

Extraer listado de cuentas de correo, espacio en uso y límite

Con el siguiente script ejecutamos la función Email list_pops_with_disk para obtener todas las cuentas de correo creadas en el servicio de hosting, acompañadas del espacio en uso y el espacio límite definido.

<?php

$command = '/usr/local/cpanel/bin/uapi Email list_pops_with_disk --output=json';
$result = shell_exec($command);
$result = json_decode($result)->result->data;
echo "Email; Espacio usado; Espacio límite" . PHP_EOL;
foreach ($result as $account) {
    echo "{$account->email}; \"{$account->humandiskused}\"; \"{$account->humandiskquota}\"" . PHP_EOL;
}

Listado de reenviadores de un dominio y su dirección destino

La operación Email list_forwarders exige indicar un dominio. Repite el script para cada dominio de la cuenta que quieras incluir.

<?php

$domain = 'ejemplo.com';
$command = '/usr/local/cpanel/bin/uapi Email list_forwarders --output=json domain=' . escapeshellarg($domain);
$result = shell_exec($command);
$result = json_decode($result)->result->data;
echo "De; Para" . PHP_EOL;
foreach ($result as $account) {
    echo "{$account->dest}; {$account->forward}" . PHP_EOL;
}

Listado de auto-contestadores de un dominio

Por medio de Email list_auto_responders obtenemos los auto-contestadores de un dominio y, para cada uno, ejecutamos Email get_auto_responder para consultar sus fechas y título.

<?php

$domain = 'ejemplo.com';
$command = '/usr/local/cpanel/bin/uapi Email list_auto_responders --output=json domain=' . escapeshellarg($domain);
$result = shell_exec($command);
$result = json_decode($result)->result->data;

echo "Cuenta; Fecha inicio; Fecha fin; Título" . PHP_EOL;
foreach ($result as $account) {
    [$mailbox] = explode('@', $account->email, 2);
    $responderCommand =
        '/usr/local/cpanel/bin/uapi Email get_auto_responder --output=json email=' .
        escapeshellarg($mailbox);
    $responder = shell_exec($responderCommand);
    $responder = json_decode($responder)->result->data;

    $start = $responder->start;
    $stop = $responder->stop;

    if(is_null($start)) {
        $start = '-';
    } else {
        $start = date('d/m/Y', (int) $start);
    }
 
    if(is_null($stop)) {
        $stop = '-';
    } else {
        $stop = date('d/m/Y', (int) $stop);
    }
    
    echo "{$account->email}; {$start}; {$stop}; \"{$responder->subject}\"" . PHP_EOL;
}

Listado de tareas programadas, cronjobs

Para el listado de tareas programadas no usamos la API de cPanel ya que no hay una función disponible de momento, no obstante tenemos "crontab -l" un comando disponible en cualquier sistema basado en Linux con el que de igual forma podremos obtener esta información.

<?php

$command = 'crontab -l';
$result = shell_exec($command);
$result = explode("\n", $result);

echo "Intervalo;Comando" . PHP_EOL;
foreach ($result as $cron) {
    $cron = trim($cron);

    if (
        str_starts_with($cron, '#') ||
        str_starts_with($cron, 'MAILTO=') ||
        str_starts_with($cron, 'SHELL=')
    ) {
        continue;
    }

    if (empty($cron)) {
        continue;
    }

    $cron = preg_split('/\s+/', $cron, 6);
    if (count($cron) === 6) {
        echo "{$cron[0]} {$cron[1]} {$cron[2]} {$cron[3]} {$cron[4]}; {$cron[5]}" . PHP_EOL;
    }
}

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.