Major features: - P2P Mesh distributed recovery infrastructure with blockchain catalog - MITM analytics proxy for external access monitoring (IP, country, scans) - SecuBox Swiss unified CLI tool for management & recovery - Python remote management console (secubox-console) - Multi-theme landing page generator (mirrorbox, cyberpunk, minimal, terminal, light) - Service Registry enhancements with health check and network diagnostics - Services page modernization with Service Registry API integration New components: - secubox-swiss: Swiss Army Knife unified management tool - secubox-mesh: P2P mesh networking and sync - secubox-recover: Snapshot, profiles, rollback, reborn scripts - secubox-console: Python remote management app - secubox_analytics.py: MITM traffic analysis addon Fixes: - Service Registry ACL permissions for secubox services page - Port status display (firewall_open detection) - RPC response handling for list_services Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
293 lines
7.4 KiB
JavaScript
293 lines
7.4 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require rpc';
|
|
|
|
// RPC method declarations
|
|
var callListServices = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'list_services'
|
|
});
|
|
|
|
var callGetService = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'get_service',
|
|
params: ['service_id'],
|
|
expect: {}
|
|
});
|
|
|
|
var callPublishService = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'publish_service',
|
|
params: ['name', 'local_port', 'domain', 'tor_enabled', 'category', 'icon'],
|
|
expect: {}
|
|
});
|
|
|
|
var callUnpublishService = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'unpublish_service',
|
|
params: ['service_id'],
|
|
expect: {}
|
|
});
|
|
|
|
var callUpdateService = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'update_service',
|
|
params: ['service_id', 'name', 'category', 'icon'],
|
|
expect: {}
|
|
});
|
|
|
|
var callDeleteService = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'delete_service',
|
|
params: ['service_id'],
|
|
expect: {}
|
|
});
|
|
|
|
var callSyncProviders = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'sync_providers',
|
|
expect: {}
|
|
});
|
|
|
|
var callGenerateLandingPage = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'generate_landing_page',
|
|
expect: {}
|
|
});
|
|
|
|
var callGetQrData = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'get_qr_data',
|
|
params: ['service_id', 'url_type'],
|
|
expect: {}
|
|
});
|
|
|
|
var callListCategories = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'list_categories'
|
|
});
|
|
|
|
var callGetCertificateStatus = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'get_certificate_status',
|
|
params: ['service_id'],
|
|
expect: {}
|
|
});
|
|
|
|
var callGetLandingConfig = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'get_landing_config',
|
|
expect: {}
|
|
});
|
|
|
|
var callSaveLandingConfig = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'save_landing_config',
|
|
params: ['auto_regen'],
|
|
expect: {}
|
|
});
|
|
|
|
var callSetLandingTheme = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'set_landing_theme',
|
|
params: ['theme'],
|
|
expect: {}
|
|
});
|
|
|
|
var callCheckServiceHealth = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'check_service_health',
|
|
params: ['service_id', 'domain'],
|
|
expect: {}
|
|
});
|
|
|
|
var callCheckAllHealth = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'check_all_health',
|
|
expect: {}
|
|
});
|
|
|
|
var callGetNetworkInfo = rpc.declare({
|
|
object: 'luci.service-registry',
|
|
method: 'get_network_info',
|
|
expect: {}
|
|
});
|
|
|
|
// HAProxy status for provider info
|
|
var callHAProxyStatus = rpc.declare({
|
|
object: 'luci.haproxy',
|
|
method: 'status',
|
|
expect: {}
|
|
});
|
|
|
|
// Tor Shield status for provider info
|
|
var callTorStatus = rpc.declare({
|
|
object: 'luci.tor-shield',
|
|
method: 'status',
|
|
expect: {}
|
|
});
|
|
|
|
return baseclass.extend({
|
|
// List all services from all providers
|
|
listServices: function() {
|
|
return callListServices();
|
|
},
|
|
|
|
// Get single service details
|
|
getService: function(serviceId) {
|
|
return callGetService(serviceId);
|
|
},
|
|
|
|
// Publish a new service
|
|
publishService: function(name, localPort, domain, torEnabled, category, icon) {
|
|
return callPublishService(
|
|
name,
|
|
parseInt(localPort) || 0,
|
|
domain || '',
|
|
torEnabled ? true : false,
|
|
category || 'services',
|
|
icon || ''
|
|
);
|
|
},
|
|
|
|
// Unpublish a service
|
|
unpublishService: function(serviceId) {
|
|
return callUnpublishService(serviceId);
|
|
},
|
|
|
|
// Update service metadata
|
|
updateService: function(serviceId, name, category, icon) {
|
|
return callUpdateService(serviceId, name || '', category || '', icon || '');
|
|
},
|
|
|
|
// Delete a service
|
|
deleteService: function(serviceId) {
|
|
return callDeleteService(serviceId);
|
|
},
|
|
|
|
// Sync all providers
|
|
syncProviders: function() {
|
|
return callSyncProviders();
|
|
},
|
|
|
|
// Generate landing page
|
|
generateLandingPage: function() {
|
|
return callGenerateLandingPage();
|
|
},
|
|
|
|
// Get QR code data for a service URL
|
|
getQrData: function(serviceId, urlType) {
|
|
return callGetQrData(serviceId, urlType || 'local');
|
|
},
|
|
|
|
// List available categories
|
|
listCategories: function() {
|
|
return callListCategories();
|
|
},
|
|
|
|
// Get certificate status for a service
|
|
getCertificateStatus: function(serviceId) {
|
|
return callGetCertificateStatus(serviceId);
|
|
},
|
|
|
|
// Get landing page configuration
|
|
getLandingConfig: function() {
|
|
return callGetLandingConfig();
|
|
},
|
|
|
|
// Save landing page configuration
|
|
saveLandingConfig: function(autoRegen) {
|
|
return callSaveLandingConfig(autoRegen ? true : false);
|
|
},
|
|
|
|
// Set landing page theme
|
|
setLandingTheme: function(theme) {
|
|
return callSetLandingTheme(theme || 'mirrorbox');
|
|
},
|
|
|
|
// Get dashboard data (services + provider status)
|
|
getDashboardData: function() {
|
|
return Promise.all([
|
|
callListServices().catch(function(e) { console.error('list_services failed:', e); return { services: [], providers: {} }; }),
|
|
callListCategories().catch(function(e) { console.error('list_categories failed:', e); return { categories: [] }; }),
|
|
callGetLandingConfig().catch(function(e) { console.error('get_landing_config failed:', e); return {}; }),
|
|
callHAProxyStatus().catch(function() { return { enabled: false }; }),
|
|
callTorStatus().catch(function() { return { enabled: false }; })
|
|
]).then(function(results) {
|
|
return {
|
|
services: results[0].services || [],
|
|
providers: results[0].providers || {},
|
|
categories: results[1].categories || [],
|
|
landing: results[2],
|
|
haproxy: results[3],
|
|
tor: results[4]
|
|
};
|
|
});
|
|
},
|
|
|
|
// Get published services only
|
|
getPublishedServices: function() {
|
|
return callListServices().then(function(data) {
|
|
return (data.services || []).filter(function(s) {
|
|
return s.published;
|
|
});
|
|
});
|
|
},
|
|
|
|
// Get unpublished (discoverable) services
|
|
getUnpublishedServices: function() {
|
|
return callListServices().then(function(data) {
|
|
return (data.services || []).filter(function(s) {
|
|
return !s.published;
|
|
});
|
|
});
|
|
},
|
|
|
|
// Quick publish with defaults
|
|
quickPublish: function(name, port) {
|
|
return this.publishService(name, port, '', false, 'services', '');
|
|
},
|
|
|
|
// Full publish with HAProxy + Tor
|
|
fullPublish: function(name, port, domain) {
|
|
return this.publishService(name, port, domain, true, 'services', '');
|
|
},
|
|
|
|
// Check health of a single service
|
|
checkServiceHealth: function(serviceId, domain) {
|
|
return callCheckServiceHealth(serviceId || '', domain || '');
|
|
},
|
|
|
|
// Check health of all published services
|
|
checkAllHealth: function() {
|
|
return callCheckAllHealth();
|
|
},
|
|
|
|
// Get network connectivity info (public IPs, port accessibility)
|
|
getNetworkInfo: function() {
|
|
return callGetNetworkInfo();
|
|
},
|
|
|
|
// Get dashboard data with health status
|
|
getDashboardDataWithHealth: function() {
|
|
return Promise.all([
|
|
callListServices().catch(function(e) { console.error('list_services failed:', e); return { services: [], providers: {} }; }),
|
|
callListCategories().catch(function(e) { console.error('list_categories failed:', e); return { categories: [] }; }),
|
|
callGetLandingConfig().catch(function(e) { console.error('get_landing_config failed:', e); return {}; }),
|
|
callHAProxyStatus().catch(function() { return { enabled: false }; }),
|
|
callTorStatus().catch(function() { return { enabled: false }; }),
|
|
callCheckAllHealth().catch(function(e) { console.error('check_all_health failed:', e); return { health: {} }; })
|
|
]).then(function(results) {
|
|
return {
|
|
services: results[0].services || [],
|
|
providers: results[0].providers || {},
|
|
categories: results[1].categories || [],
|
|
landing: results[2],
|
|
haproxy: results[3],
|
|
tor: results[4],
|
|
health: results[5].health || {}
|
|
};
|
|
});
|
|
}
|
|
});
|