From 7b34bca6395d8280bc33a112db3bd372eb9dfaad Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 2 Jun 2026 09:07:57 -0500 Subject: [PATCH] feat: enhanced cpanel module with stats, disk, IP, and quick actions (#117) - Article count, user count, pending updates with badges - Disk usage progress bar with color coding - Current IP display - Clear Cache button with AJAX spinner - Check Updates + update count button - Module defaults to ordering=-1 (top) and access=Super Users - Added padding to module container Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/Dispatcher/Dispatcher.php | 3 + .../src/Helper/CpanelHelper.php | 56 ++++++ .../mod_mokowaas_cpanel/tmpl/default.php | 179 ++++++++++++++---- src/script.php | 4 +- 4 files changed, 203 insertions(+), 39 deletions(-) diff --git a/src/packages/mod_mokowaas_cpanel/src/Dispatcher/Dispatcher.php b/src/packages/mod_mokowaas_cpanel/src/Dispatcher/Dispatcher.php index d71bf1f..d3b1c19 100644 --- a/src/packages/mod_mokowaas_cpanel/src/Dispatcher/Dispatcher.php +++ b/src/packages/mod_mokowaas_cpanel/src/Dispatcher/Dispatcher.php @@ -30,6 +30,9 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI $data['siteInfo'] = $helper->getSiteInfo($db); $data['plugins'] = $helper->getFeaturePlugins($db); $data['healthOk'] = $helper->isDatabaseOk($db); + $data['counts'] = $helper->getCounts($db); + $data['disk'] = $helper->getDiskInfo(); + $data['currentIp'] = $helper->getCurrentIp(); return $data; } diff --git a/src/packages/mod_mokowaas_cpanel/src/Helper/CpanelHelper.php b/src/packages/mod_mokowaas_cpanel/src/Helper/CpanelHelper.php index ef5f793..96e6bbf 100644 --- a/src/packages/mod_mokowaas_cpanel/src/Helper/CpanelHelper.php +++ b/src/packages/mod_mokowaas_cpanel/src/Helper/CpanelHelper.php @@ -79,4 +79,60 @@ class CpanelHelper return false; } } + + /** + * Get content and system counts. + */ + public function getCounts(DatabaseInterface $db): object + { + $counts = (object) [ + 'articles' => 0, + 'users' => 0, + 'extensions' => 0, + 'updates' => 0, + ]; + + try + { + $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__content'))); + $counts->articles = (int) $db->loadResult(); + + $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__users'))); + $counts->users = (int) $db->loadResult(); + + $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__extensions'))->where($db->quoteName('enabled') . ' = 1')); + $counts->extensions = (int) $db->loadResult(); + + $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from($db->quoteName('#__updates'))->where($db->quoteName('extension_id') . ' != 0')); + $counts->updates = (int) $db->loadResult(); + } + catch (\Throwable $e) + { + // Silent + } + + return $counts; + } + + /** + * Get disk usage info. + */ + public function getDiskInfo(): object + { + $free = @disk_free_space(JPATH_ROOT); + $total = @disk_total_space(JPATH_ROOT); + + return (object) [ + 'free_mb' => $free !== false ? round($free / 1048576) : null, + 'total_mb' => $total !== false ? round($total / 1048576) : null, + ]; + } + + /** + * Get the current visitor's IP address. + */ + public function getCurrentIp(): string + { + return $_SERVER['REMOTE_ADDR'] ?? ''; + } } diff --git a/src/packages/mod_mokowaas_cpanel/tmpl/default.php b/src/packages/mod_mokowaas_cpanel/tmpl/default.php index b9df334..47de43e 100644 --- a/src/packages/mod_mokowaas_cpanel/tmpl/default.php +++ b/src/packages/mod_mokowaas_cpanel/tmpl/default.php @@ -10,15 +10,20 @@ defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; +use Joomla\CMS\Session\Session; -$siteInfo = $siteInfo ?? (object) []; -$plugins = $plugins ?? []; -$healthOk = $healthOk ?? true; -$showHealth = $params->get('show_health', 1); +$siteInfo = $siteInfo ?? (object) []; +$plugins = $plugins ?? []; +$healthOk = $healthOk ?? true; +$counts = $counts ?? (object) ['articles' => 0, 'users' => 0, 'extensions' => 0, 'updates' => 0]; +$disk = $disk ?? (object) ['free_mb' => null, 'total_mb' => null]; +$currentIp = $currentIp ?? ''; +$showHealth = $params->get('show_health', 1); $showPlugins = $params->get('show_plugins', 1); +$token = Session::getFormToken(); -$enabledCount = 0; -$totalCount = count($plugins); +$enabledCount = 0; +$totalCount = count($plugins); foreach ($plugins as $p) { @@ -28,7 +33,6 @@ foreach ($plugins as $p) } } -// Label map for plugin elements $labels = [ 'mokowaas' => 'Core', 'mokowaas_firewall' => 'Firewall', @@ -36,58 +40,159 @@ $labels = [ 'mokowaas_devtools' => 'DevTools', 'mokowaas_monitor' => 'Monitor', ]; + +$diskPct = ($disk->total_mb && $disk->total_mb > 0) + ? round((($disk->total_mb - ($disk->free_mb ?? 0)) / $disk->total_mb) * 100) + : null; +$diskColor = ($diskPct !== null && $diskPct > 90) ? 'bg-danger' : (($diskPct !== null && $diskPct > 75) ? 'bg-warning' : 'bg-success'); ?>
- +
-
+
+ + MokoWaaS mokowaas_version ?? ''); ?> debug)): ?> - + Debug offline)): ?> - + Offline
- + +
- -
- - - - - - + +
+
+
+ + + Healthy + + + DB Error + +
+
+
+
+ articles; ?> + Articles +
+
+
+
+ users; ?> + Users +
+
+
+
+ updates > 0): ?> + updates; ?> + Updates + + + Up to date + +
+
+
+ + +
+ +
+ + Disk % +
+
+
+ free_mb ?? 0) / 1024, 1); ?> GB free +
- + +
+ + Your IP: +
+ +
Joomla joomla_version ?? ''); ?> / PHP php_version ?? ''); ?> - +
- -
+ +
-
-
- - element] ?? $p->element; - $badge = $p->enabled ? 'bg-success' : 'bg-secondary'; - $icon = $p->enabled ? 'icon-check' : 'icon-times'; - ?> - - - - - +
+ + element] ?? $p->element; + $badge = $p->enabled ? 'bg-success' : 'bg-secondary'; + $icon = $p->enabled ? 'icon-check' : 'icon-times'; + ?> + + + + + +
+ + +
+ + diff --git a/src/script.php b/src/script.php index 2490e9f..3ea7f7f 100644 --- a/src/script.php +++ b/src/script.php @@ -472,7 +472,7 @@ class Pkg_MokowaasInstallerScript 'title' => 'MokoWaaS', 'note' => '', 'content' => '', - 'ordering' => 1, + 'ordering' => -1, 'position' => 'cpanel', 'checked_out' => null, 'checked_out_time' => null, @@ -480,7 +480,7 @@ class Pkg_MokowaasInstallerScript 'publish_down' => null, 'published' => 1, 'module' => 'mod_mokowaas_cpanel', - 'access' => 3, // Special access (admin only) + 'access' => 6, // Super Users only 'showtitle' => 1, 'params' => '{"show_health":"1","show_plugins":"1"}', 'client_id' => 1, // Administrator