secubox-openwrt/package/secubox/luci-app-service-registry/htdocs/luci-static/resources/service-registry/api.js
CyberMind-FR 9acab29c34 feat(v0.17): P2P Mesh Recovery, MITM Analytics, Swiss Army Knife
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>
2026-01-30 19:46:28 +01:00

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 || {}
};
});
}
});