secubox-openwrt/package/secubox/luci-app-ndpid/htdocs/luci-static/resources/ndpid/api.js
CyberMind-FR 50bd0c872e feat: Enhance monitoring page layout and fix nDPId detailed flows
Monitoring page:
- Move Current Statistics card above histogram charts
- Replace Network Throughput with System Load chart
- Fix API field mapping (usage_percent vs percent)
- Parse load from cpu.load string format

nDPId app:
- Add get_detailed_flows and get_categories RPCD methods
- Fix subshell variable scope bug in RPCD script
- Add interface scanning from /sys/class/net
- Update ACL permissions for new methods
- Enhance flows.js with Array.isArray data handling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 12:43:01 +01:00

193 lines
4.3 KiB
JavaScript

'use strict';
'require baseclass';
'require rpc';
/**
* nDPId API
* Package: luci-app-ndpid
* RPCD object: luci.ndpid
*/
var callServiceStatus = rpc.declare({
object: 'luci.ndpid',
method: 'get_service_status',
expect: { }
});
var callRealtimeFlows = rpc.declare({
object: 'luci.ndpid',
method: 'get_realtime_flows',
expect: { }
});
var callDetailedFlows = rpc.declare({
object: 'luci.ndpid',
method: 'get_detailed_flows',
expect: { flows: [] }
});
var callCategories = rpc.declare({
object: 'luci.ndpid',
method: 'get_categories',
expect: { categories: [] }
});
var callInterfaceStats = rpc.declare({
object: 'luci.ndpid',
method: 'get_interface_stats',
expect: { interfaces: [] }
});
var callTopApplications = rpc.declare({
object: 'luci.ndpid',
method: 'get_top_applications',
expect: { applications: [] }
});
var callTopProtocols = rpc.declare({
object: 'luci.ndpid',
method: 'get_top_protocols',
expect: { protocols: [] }
});
var callConfig = rpc.declare({
object: 'luci.ndpid',
method: 'get_config',
expect: { }
});
var callDashboard = rpc.declare({
object: 'luci.ndpid',
method: 'get_dashboard',
expect: { }
});
var callInterfaces = rpc.declare({
object: 'luci.ndpid',
method: 'get_interfaces',
expect: { interfaces: [], available: [] }
});
var callServiceStart = rpc.declare({
object: 'luci.ndpid',
method: 'service_start',
expect: { success: false }
});
var callServiceStop = rpc.declare({
object: 'luci.ndpid',
method: 'service_stop',
expect: { success: false }
});
var callServiceRestart = rpc.declare({
object: 'luci.ndpid',
method: 'service_restart',
expect: { success: false }
});
var callServiceEnable = rpc.declare({
object: 'luci.ndpid',
method: 'service_enable',
expect: { success: false }
});
var callServiceDisable = rpc.declare({
object: 'luci.ndpid',
method: 'service_disable',
expect: { success: false }
});
var callUpdateConfig = rpc.declare({
object: 'luci.ndpid',
method: 'update_config',
params: ['data'],
expect: { success: false }
});
var callClearCache = rpc.declare({
object: 'luci.ndpid',
method: 'clear_cache',
expect: { success: false }
});
function formatBytes(bytes) {
if (bytes === 0 || bytes === null || bytes === undefined) return '0 B';
var k = 1024;
var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
var i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
function formatNumber(num) {
if (num === null || num === undefined) return '0';
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
function formatUptime(seconds) {
if (!seconds || seconds === 0) return 'Not running';
var days = Math.floor(seconds / 86400);
var hours = Math.floor((seconds % 86400) / 3600);
var minutes = Math.floor((seconds % 3600) / 60);
var parts = [];
if (days > 0) parts.push(days + 'd');
if (hours > 0) parts.push(hours + 'h');
if (minutes > 0) parts.push(minutes + 'm');
return parts.length > 0 ? parts.join(' ') : '< 1m';
}
function getStatusClass(running) {
return running ? 'active' : 'inactive';
}
function getStatusText(running) {
return running ? 'Running' : 'Stopped';
}
return baseclass.extend({
// Read methods
getServiceStatus: callServiceStatus,
getRealtimeFlows: callRealtimeFlows,
getDetailedFlows: callDetailedFlows,
getInterfaceStats: callInterfaceStats,
getTopApplications: callTopApplications,
getTopProtocols: callTopProtocols,
getCategories: callCategories,
getConfig: callConfig,
getDashboard: callDashboard,
getInterfaces: callInterfaces,
// Write methods
serviceStart: callServiceStart,
serviceStop: callServiceStop,
serviceRestart: callServiceRestart,
serviceEnable: callServiceEnable,
serviceDisable: callServiceDisable,
updateConfig: callUpdateConfig,
clearCache: callClearCache,
// Utility functions
formatBytes: formatBytes,
formatNumber: formatNumber,
formatUptime: formatUptime,
getStatusClass: getStatusClass,
getStatusText: getStatusText,
// Aggregate function for dashboard
getAllData: function() {
return Promise.all([
callDashboard(),
callInterfaceStats(),
callTopApplications(),
callTopProtocols()
]).then(function(results) {
return {
dashboard: results[0] || {},
interfaces: results[1] || { interfaces: [] },
applications: results[2] || { applications: [] },
protocols: results[3] || { protocols: [] }
};
});
}
});