This release adds major new features for SecuBox management and deployment: ## New Features ### 1. LuCI Admin Control Center (luci-app-secubox-admin) - Unified admin dashboard for managing all SecuBox appstore plugins - **Control Panel**: Real-time stats, system health, alerts, quick actions - **Apps Manager**: Browse catalog, install/remove apps with search & filtering - **App Settings**: Per-app configuration, start/stop controls - **System Health**: Live monitoring (CPU, RAM, disk) with auto-refresh - **System Logs**: Centralized log viewer with download capability - Fully integrated with existing RPCD backend (luci.secubox) - Mobile-responsive design with polished UI components ### 2. Documentation Mirror in SecuBox Bonus - Integrated complete development documentation into luci-app-secubox-bonus - 64+ documentation files now available offline at /luci-static/secubox/docs/ - Beautiful landing page (index-main.html) with 4 sections: - Development guides & references - Live module demos - Tutorials & blog posts - Marketing campaign pages - Accessible locally on router without internet connection ### 3. Automated Docker Plugin Installation - Enhanced secubox-appstore CLI with full Docker automation - One-click installation from web UI now fully automated: - Auto-detects Docker runtime from catalog - Discovers and executes control scripts (*ctl install) - Pulls Docker images automatically - Creates directories and configures UCI - Enables init services - No manual CLI steps required for Docker apps - Works for all Docker apps: AdGuard Home, Mail-in-a-Box, Nextcloud, etc. ### 4. Mail-in-a-Box Plugin - New Docker-based email server plugin (secubox-app-mailinabox) - Complete package with: - UCI configuration (8 port mappings, feature flags) - Control script (mailinaboxctl) with install/check/update/status/logs - Procd init script with auto-restart - Catalog manifest (category: hosting, maturity: beta) - Network mode: host (required for mail server) - Persistent storage: mail, SSL, data, DNS volumes ## Improvements ### Build System - Updated local-build.sh to include luci-app-* packages from package/secubox/ - Now automatically discovers and builds luci-app-secubox-admin and similar packages - Fixed Makefile include paths for feed structure ### Package Releases - Incremented PKG_RELEASE for all 31 SecuBox packages - Ensures clean upgrade path from previous versions ### Catalog Updates - Mail-in-a-Box entry moved from "productivity" to "hosting" category - Status changed to "beta" reflecting community Docker image maturity - Storage requirement increased: 1024MB → 2048MB - Added port 25 accessibility note ## Files Changed ### New Packages (2) - package/secubox/luci-app-secubox-admin/ (12 files) - package/secubox/secubox-app-mailinabox/ (4 files) ### Enhanced Packages (1) - package/secubox/luci-app-secubox-bonus/ (65 new docs files) ### Modified Core (3) - package/secubox/secubox-core/root/usr/sbin/secubox-appstore - package/secubox/secubox-core/root/usr/share/secubox/catalog.json - secubox-tools/local-build.sh ### All Makefiles (31 packages) - Incremented PKG_RELEASE for clean upgrade path ## Technical Details **Admin Control Center Architecture:** - Frontend: 5 views (dashboard, apps, settings, health, logs) - API: Wrapper around luci.secubox RPCD methods - Components: Reusable UI library (cards, badges, alerts, loaders) - Styling: Common + admin-specific CSS with responsive design - Auto-refresh: Polling for live updates (5-30s intervals) **Docker Automation Flow:** ``` Web UI → RPCD → secubox-appstore CLI → opkg install → *ctl install → docker pull → directories → UCI config → init enable → ✓ Ready ``` **Access Points:** - Admin Control: http://router/cgi-bin/luci/admin/secubox/admin/ - Documentation: http://router/luci-static/secubox/index-main.html - Demos: http://router/luci-static/secubox/demo-*.html 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
129 lines
2.7 KiB
JavaScript
129 lines
2.7 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require rpc';
|
|
|
|
// App Management
|
|
var callGetApps = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'get_appstore_apps',
|
|
expect: { apps: [] }
|
|
});
|
|
|
|
var callInstallApp = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'install_appstore_app',
|
|
params: ['app_id'],
|
|
expect: { success: false }
|
|
});
|
|
|
|
var callRemoveApp = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'remove_appstore_app',
|
|
params: ['app_id'],
|
|
expect: { success: false }
|
|
});
|
|
|
|
// Module Management
|
|
var callGetModules = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'getModules',
|
|
expect: { modules: [] }
|
|
});
|
|
|
|
var callEnableModule = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'enable_module',
|
|
params: ['module'],
|
|
expect: { success: false }
|
|
});
|
|
|
|
var callDisableModule = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'disable_module',
|
|
params: ['module'],
|
|
expect: { success: false }
|
|
});
|
|
|
|
// System Health
|
|
var callGetHealth = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'get_system_health',
|
|
expect: { }
|
|
});
|
|
|
|
var callGetAlerts = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'get_alerts',
|
|
expect: { alerts: [] }
|
|
});
|
|
|
|
// Logs
|
|
var callGetLogs = rpc.declare({
|
|
object: 'luci.secubox',
|
|
method: 'getLogs',
|
|
params: ['service', 'lines'],
|
|
expect: { logs: '' }
|
|
});
|
|
|
|
// Utility functions
|
|
function formatBytes(bytes) {
|
|
if (bytes === 0) return '0 B';
|
|
var k = 1024;
|
|
var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
|
|
}
|
|
|
|
function formatUptime(seconds) {
|
|
var days = Math.floor(seconds / 86400);
|
|
var hours = Math.floor((seconds % 86400) / 3600);
|
|
var mins = Math.floor((seconds % 3600) / 60);
|
|
return days + 'd ' + hours + 'h ' + mins + 'm';
|
|
}
|
|
|
|
function getAppStatus(app, modules) {
|
|
// Determine if app is installed by checking modules
|
|
var isInstalled = false;
|
|
var isRunning = false;
|
|
|
|
if (app.packages && app.packages.required) {
|
|
for (var i = 0; i < app.packages.required.length; i++) {
|
|
var pkg = app.packages.required[i];
|
|
if (modules[pkg]) {
|
|
isInstalled = true;
|
|
isRunning = modules[pkg].running || false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
installed: isInstalled,
|
|
running: isRunning,
|
|
status: isRunning ? 'running' : (isInstalled ? 'stopped' : 'available')
|
|
};
|
|
}
|
|
|
|
// Export API
|
|
return baseclass.extend({
|
|
// Apps
|
|
getApps: callGetApps,
|
|
installApp: callInstallApp,
|
|
removeApp: callRemoveApp,
|
|
|
|
// Modules
|
|
getModules: callGetModules,
|
|
enableModule: callEnableModule,
|
|
disableModule: callDisableModule,
|
|
|
|
// System
|
|
getHealth: callGetHealth,
|
|
getAlerts: callGetAlerts,
|
|
getLogs: callGetLogs,
|
|
|
|
// Utilities
|
|
formatBytes: formatBytes,
|
|
formatUptime: formatUptime,
|
|
getAppStatus: getAppStatus
|
|
});
|