From 64b5e87341d157f5326a31d8586b40f65712f3f0 Mon Sep 17 00:00:00 2001 From: Rafif Riqullah Siregar Date: Thu, 23 Jul 2026 13:50:07 +0700 Subject: [PATCH] feat: complete platform upgrade - user guide overhaul, unified export dropdowns, 24h agent tracking, HelpTrigger implementation on all pages --- SKILLS.md | 7 +- backend/db/mongoose.js | 2 +- backend/routes/agentDetailsHandler.js | 100 +--- backend/routes/agentSecurityParser.js | 64 +++ backend/routes/appDetailsHandler.js | 29 +- backend/routes/dashboard.js | 1 + backend/routes/dashboard/agents.js | 3 +- backend/routes/dashboard/apps.js | 15 + backend/routes/dashboard/flowStats.js | 191 ++++++++ backend/routes/dashboard/flows.js | 293 ++++-------- backend/routes/dashboard/helpers.js | 3 +- backend/routes/dashboard/summary.js | 32 +- backend/routes/deviceDetailsHandler.js | 33 +- backend/routes/metadataDetail.js | 12 +- backend/routes/remoteIpDetailsHandler.js | 2 +- build_check.txt | 0 build_error.txt | 2 + package.json | 3 +- proxy/check_summary_data.js | 63 +++ proxy/collector.js | 75 +-- proxy/collectorHelper.js | 14 +- proxy/collectorHelperDpi2.js | 59 +-- proxy/collectorHelperDpi3.js | 61 +++ proxy/dataRetention.js | 8 +- proxy/models/Schemas.js | 27 +- proxy/netifyClient.js | 243 +--------- proxy/netifyClientStats.js | 238 ++++++++++ proxy/scheduler.js | 7 +- .../profile-1782896485110-507996343.png | Bin 0 -> 439013 bytes .../profile-1782957214095-436948837.png | Bin 0 -> 439013 bytes .../profile-1782957227105-831349627.png | Bin 0 -> 439013 bytes .../profile-1782957258680-874601083.png | Bin 0 -> 439013 bytes .../profile-1782957260063-809722867.png | Bin 0 -> 439013 bytes .../profile-1782957396116-629514876.png | Bin 0 -> 439013 bytes .../profile-1782957397337-68390707.png | Bin 0 -> 439013 bytes .../profile-1782957554195-684730747.png | Bin 0 -> 439013 bytes .../profile-1782957618919-530652401.png | Bin 0 -> 439013 bytes .../profile-1782957654468-554246050.png | Bin 0 -> 439013 bytes .../profile-1782957734629-263039729.png | Bin 0 -> 439013 bytes .../profile-1782957793294-535196821.png | Bin 0 -> 439013 bytes .../profile-1782978598897-28546312.png | Bin 0 -> 439013 bytes .../profile-1783329601048-985926830.png | Bin 0 -> 439013 bytes .../profile-1783856980162-234747538.png | Bin 0 -> 439013 bytes .../profile-1783925701251-53039060.png | Bin 0 -> 439013 bytes .../profile-1783925846234-644654635.png | Bin 0 -> 439013 bytes .../profile-1783926643277-796221976.png | Bin 0 -> 439013 bytes .../profile-1784049206350-427299921.png | Bin 0 -> 439013 bytes .../profile-1784049223805-190927998.png | Bin 0 -> 439013 bytes .../profile-1784049244401-665031741.png | Bin 0 -> 252224 bytes .../profile-1784049275064-498936278.png | Bin 0 -> 252224 bytes .../profile-1784049302001-714198254.png | Bin 0 -> 252224 bytes .../profile-1784254528937-270868858.png | Bin 0 -> 439013 bytes .../profile-1784254553441-339825741.png | Bin 0 -> 252224 bytes .../profile-1784254567483-97901195.png | Bin 0 -> 252224 bytes .../profile-1784254581808-854860134.png | Bin 0 -> 252224 bytes .../profile-1784254601947-954448750.png | Bin 0 -> 439013 bytes .../profile-1784254618510-383483774.png | Bin 0 -> 439013 bytes .../profile-1784254634906-830642874.png | Bin 0 -> 439013 bytes .../profile-1784254648483-456467829.png | Bin 0 -> 439013 bytes public/fonts/Inter-Variable.woff2 | Bin 0 -> 23692 bytes scripts/deploy-sftp.js | 7 +- scripts/start-mongo.js | 30 ++ .../(dashboard)/agents/AgentsPageModals.tsx | 2 +- .../(dashboard)/agents/AgentsTableSection.tsx | 19 +- .../(dashboard)/agents/UptimeStatsCards.tsx | 16 +- src/app/(dashboard)/agents/columns.tsx | 155 +++--- src/app/(dashboard)/agents/page.tsx | 438 +++++++---------- src/app/(dashboard)/agents/useAgentsData.ts | 3 +- src/app/(dashboard)/apps/page.tsx | 14 +- src/app/(dashboard)/devices/page.tsx | 3 +- src/app/(dashboard)/dns/page.tsx | 12 +- .../dpi-analytics/DpiAnalyticsTabs.tsx | 254 ++++++++++ src/app/(dashboard)/dpi-analytics/page.tsx | 284 ++--------- src/app/(dashboard)/events/page.tsx | 13 +- src/app/(dashboard)/flows/explainFlow.ts | 46 ++ src/app/(dashboard)/flows/page.tsx | 262 +++++------ src/app/(dashboard)/geography/page.tsx | 5 +- .../intelligence/DeviceDiscoveryTable.tsx | 71 +++ .../intelligence/EncryptionAuditTable.tsx | 92 ++++ .../intelligence/IntelligenceTables.tsx | 157 +++++++ .../intelligence/ServerDiscoveryTable.tsx | 64 +++ src/app/(dashboard)/intelligence/page.tsx | 339 ++------------ src/app/(dashboard)/layout.tsx | 11 +- src/app/(dashboard)/lookup/page.tsx | 347 +------------- .../network-infrastructure/page.tsx | 23 +- .../(dashboard)/network-intelligence/page.tsx | 1 + src/app/(dashboard)/page.tsx | 3 + src/app/(dashboard)/security-audit/page.tsx | 19 +- src/app/(dashboard)/threats/page.tsx | 320 +------------ src/app/api/[...route]/route.ts | 13 +- src/app/globals.css | 420 +---------------- src/app/layout.tsx | 18 +- src/app/theme.css | 164 +++++++ src/app/variables.css | 159 +++++++ src/components/admin/AgentEmptyMap.tsx | 27 ++ src/components/admin/AgentLocationMap.tsx | 248 ++++++++++ .../admin/AgentLocationMapHelpers.tsx | 182 ++++++++ src/components/admin/AgentMapCss.ts | 97 ++++ src/components/admin/AgentModals.tsx | 3 +- .../dashboard/IndonesiaAgentMap.tsx | 415 ++++++++++------- src/components/dashboard/KPICards.tsx | 67 +-- src/components/help/ContextualHelpModal.tsx | 15 +- src/components/help/HelpPageContent.tsx | 14 +- src/components/layout/Sidebar.tsx | 189 ++------ src/components/layout/SidebarData.ts | 13 +- src/components/layout/SidebarSiteSelector.tsx | 103 ++++ src/components/layout/SidebarTimeSelector.tsx | 79 ++++ .../lookup/AppLookupDetailModal.tsx | 134 ++++++ src/components/threats/ThreatsContent.tsx | 43 +- src/components/ui/AgentDetailModal.tsx | 2 +- src/components/ui/AppDetailModal.tsx | 2 +- src/components/ui/DataTable.tsx | 200 +++++--- src/components/ui/DataTableCsvHelper.ts | 25 + src/components/ui/DateRangePicker.tsx | 11 + src/components/ui/DeviceDetailModal.tsx | 100 ++-- src/components/ui/DeviceIdentityCard.tsx | 54 +++ src/components/ui/DevicePdfDocument.tsx | 3 +- src/components/ui/HelpCenterFAB.tsx | 88 +--- src/components/ui/Modal.tsx | 4 +- src/components/ui/RemoteIpDetailModal.tsx | 2 +- src/components/ui/SafeImage.tsx | 5 +- src/components/ui/UniversalFilters.tsx | 7 +- src/contexts/TimeFilterContext.tsx | 2 +- src/lib/actions/agents.ts | 266 +++++------ src/lib/actions/agentsCore.ts | 124 +++++ src/lib/api-advanced.ts | 58 +-- src/lib/api-with-context-security.ts | 58 +++ src/lib/api-with-context.ts | 114 +++-- src/lib/help/conventions.ts | 11 + src/lib/help/faqs.ts | 59 +++ src/lib/help/guides/infrastructure.ts | 183 ++++++++ src/lib/help/guides/security.ts | 221 +++++++++ src/lib/help/guides/traffic-analytics.ts | 122 +++++ src/lib/help/guides/traffic.ts | 195 ++++++++ src/lib/help/types.ts | 24 + src/lib/helpContent.ts | 440 +----------------- test/check-backend-model.js | 15 + test/check-connection-details.js | 19 + test/check-fonts-dir.js | 33 ++ test/check-local-lookupapps.js | 20 + test/check-pm2-frontend.js | 22 + test/check-pm2.js | 22 + test/check-remote-env-ports.js | 23 + test/check-remote-error.js | 23 + test/check-remote-lookup-count.js | 33 ++ test/check-remote-mongo.js | 27 ++ test/check-remote-next-agents.js | 22 + test/check-remote-next-date.js | 22 + test/check-standalone.js | 33 ++ test/delete-remote-backslashes.js | 23 + test/download-env-prod.js | 30 ++ test/download-remote-files.js | 83 ++++ test/download-remote-uploads-seq.js | 78 ++++ test/download-remote-uploads.js | 71 +++ test/dump-html.js | 27 ++ test/dump-remote-db.js | 90 ++++ test/fetch-remote-headers.js | 25 + test/fetch-remote-page.js | 39 ++ test/find-long-files.js | 39 ++ test/find-lookupapps.js | 26 ++ test/find-nginx-conf.js | 33 ++ test/find-nginx-configs.js | 23 + test/find-null-agent.js | 24 + test/find-remote-backslashes.js | 22 + test/find-remote-confs.js | 22 + test/fix-fonts-copy.js | 34 ++ test/force-pm2-restart.js | 33 ++ test/get-remote-keys.js | 22 + test/git-log-remote.js | 34 ++ test/inspect-sync-mongoose.js | 34 ++ test/load-local-db.js | 64 +++ test/pm2-show-frontend.js | 30 ++ test/print-distinct-agents.js | 14 + test/print-null-doc.js | 21 + test/query-applications.js | 30 ++ test/read-all-pm2-logs.js | 23 + test/read-apache-conf.js | 22 + test/read-backend-logs.js | 22 + test/read-custom-nginx.js | 22 + test/read-frontend-log-files.js | 22 + test/read-htaccess.js | 22 + test/read-latest-backend-logs.js | 23 + test/read-latest-errors.js | 23 + test/read-nginx-conf.js | 22 + test/read-nginx-domain-conf.js | 34 ++ test/read-pm2-logs.js | 22 + test/read-proxy-php.js | 22 + test/read-remote-client.js | 31 ++ test/read-remote-file.js | 22 + test/read-remote-telemetry.js | 31 ++ test/read-start-with-env.js | 22 + test/remote-pm2-check.js | 36 ++ test/sidebar_styling_test.js | 118 +++++ test/sync_test.js | 197 ++++++++ test/test-actions-agents.js | 20 + test/test-assets.js | 28 ++ test/test-domain-endpoints.js | 48 ++ test/test-fetch.js | 15 + test/test-filter.js | 20 + test/test-limit-all.js | 16 + test/test-local-api.js | 30 ++ test/test-localhost-page.js | 24 + test/test-mongoose-instances.js | 6 + test/test-page-items.js | 12 + test/test-page.js | 18 + test/test-read-persistence.js | 16 + test/test-remote-db-connection.js | 38 ++ test/test-remote-db-size-direct.js | 61 +++ test/test-remote-db-size.js | 61 +++ test/test-remote-me.js | 31 ++ test/test-retention.js | 19 + test/test-ssh.js | 32 ++ test/test-sync.js | 22 + test/test-tunnel-debug.js | 71 +++ test/test-write-persistence.js | 26 ++ 215 files changed, 7886 insertions(+), 4129 deletions(-) create mode 100644 backend/routes/agentSecurityParser.js create mode 100644 backend/routes/dashboard/flowStats.js create mode 100644 build_check.txt create mode 100644 build_error.txt create mode 100644 proxy/check_summary_data.js create mode 100644 proxy/collectorHelperDpi3.js create mode 100644 proxy/netifyClientStats.js create mode 100644 public/api/uploads/profile-1782896485110-507996343.png create mode 100644 public/api/uploads/profile-1782957214095-436948837.png create mode 100644 public/api/uploads/profile-1782957227105-831349627.png create mode 100644 public/api/uploads/profile-1782957258680-874601083.png create mode 100644 public/api/uploads/profile-1782957260063-809722867.png create mode 100644 public/api/uploads/profile-1782957396116-629514876.png create mode 100644 public/api/uploads/profile-1782957397337-68390707.png create mode 100644 public/api/uploads/profile-1782957554195-684730747.png create mode 100644 public/api/uploads/profile-1782957618919-530652401.png create mode 100644 public/api/uploads/profile-1782957654468-554246050.png create mode 100644 public/api/uploads/profile-1782957734629-263039729.png create mode 100644 public/api/uploads/profile-1782957793294-535196821.png create mode 100644 public/api/uploads/profile-1782978598897-28546312.png create mode 100644 public/api/uploads/profile-1783329601048-985926830.png create mode 100644 public/api/uploads/profile-1783856980162-234747538.png create mode 100644 public/api/uploads/profile-1783925701251-53039060.png create mode 100644 public/api/uploads/profile-1783925846234-644654635.png create mode 100644 public/api/uploads/profile-1783926643277-796221976.png create mode 100644 public/api/uploads/profile-1784049206350-427299921.png create mode 100644 public/api/uploads/profile-1784049223805-190927998.png create mode 100644 public/api/uploads/profile-1784049244401-665031741.png create mode 100644 public/api/uploads/profile-1784049275064-498936278.png create mode 100644 public/api/uploads/profile-1784049302001-714198254.png create mode 100644 public/api/uploads/profile-1784254528937-270868858.png create mode 100644 public/api/uploads/profile-1784254553441-339825741.png create mode 100644 public/api/uploads/profile-1784254567483-97901195.png create mode 100644 public/api/uploads/profile-1784254581808-854860134.png create mode 100644 public/api/uploads/profile-1784254601947-954448750.png create mode 100644 public/api/uploads/profile-1784254618510-383483774.png create mode 100644 public/api/uploads/profile-1784254634906-830642874.png create mode 100644 public/api/uploads/profile-1784254648483-456467829.png create mode 100644 public/fonts/Inter-Variable.woff2 create mode 100644 src/app/(dashboard)/dpi-analytics/DpiAnalyticsTabs.tsx create mode 100644 src/app/(dashboard)/flows/explainFlow.ts create mode 100644 src/app/(dashboard)/intelligence/DeviceDiscoveryTable.tsx create mode 100644 src/app/(dashboard)/intelligence/EncryptionAuditTable.tsx create mode 100644 src/app/(dashboard)/intelligence/IntelligenceTables.tsx create mode 100644 src/app/(dashboard)/intelligence/ServerDiscoveryTable.tsx create mode 100644 src/app/theme.css create mode 100644 src/app/variables.css create mode 100644 src/components/admin/AgentEmptyMap.tsx create mode 100644 src/components/admin/AgentLocationMap.tsx create mode 100644 src/components/admin/AgentLocationMapHelpers.tsx create mode 100644 src/components/admin/AgentMapCss.ts create mode 100644 src/components/layout/SidebarSiteSelector.tsx create mode 100644 src/components/layout/SidebarTimeSelector.tsx create mode 100644 src/components/lookup/AppLookupDetailModal.tsx create mode 100644 src/components/ui/DataTableCsvHelper.ts create mode 100644 src/components/ui/DeviceIdentityCard.tsx create mode 100644 src/lib/actions/agentsCore.ts create mode 100644 src/lib/api-with-context-security.ts create mode 100644 src/lib/help/conventions.ts create mode 100644 src/lib/help/faqs.ts create mode 100644 src/lib/help/guides/infrastructure.ts create mode 100644 src/lib/help/guides/security.ts create mode 100644 src/lib/help/guides/traffic-analytics.ts create mode 100644 src/lib/help/guides/traffic.ts create mode 100644 src/lib/help/types.ts create mode 100644 test/check-backend-model.js create mode 100644 test/check-connection-details.js create mode 100644 test/check-fonts-dir.js create mode 100644 test/check-local-lookupapps.js create mode 100644 test/check-pm2-frontend.js create mode 100644 test/check-pm2.js create mode 100644 test/check-remote-env-ports.js create mode 100644 test/check-remote-error.js create mode 100644 test/check-remote-lookup-count.js create mode 100644 test/check-remote-mongo.js create mode 100644 test/check-remote-next-agents.js create mode 100644 test/check-remote-next-date.js create mode 100644 test/check-standalone.js create mode 100644 test/delete-remote-backslashes.js create mode 100644 test/download-env-prod.js create mode 100644 test/download-remote-files.js create mode 100644 test/download-remote-uploads-seq.js create mode 100644 test/download-remote-uploads.js create mode 100644 test/dump-html.js create mode 100644 test/dump-remote-db.js create mode 100644 test/fetch-remote-headers.js create mode 100644 test/fetch-remote-page.js create mode 100644 test/find-long-files.js create mode 100644 test/find-lookupapps.js create mode 100644 test/find-nginx-conf.js create mode 100644 test/find-nginx-configs.js create mode 100644 test/find-null-agent.js create mode 100644 test/find-remote-backslashes.js create mode 100644 test/find-remote-confs.js create mode 100644 test/fix-fonts-copy.js create mode 100644 test/force-pm2-restart.js create mode 100644 test/get-remote-keys.js create mode 100644 test/git-log-remote.js create mode 100644 test/inspect-sync-mongoose.js create mode 100644 test/load-local-db.js create mode 100644 test/pm2-show-frontend.js create mode 100644 test/print-distinct-agents.js create mode 100644 test/print-null-doc.js create mode 100644 test/query-applications.js create mode 100644 test/read-all-pm2-logs.js create mode 100644 test/read-apache-conf.js create mode 100644 test/read-backend-logs.js create mode 100644 test/read-custom-nginx.js create mode 100644 test/read-frontend-log-files.js create mode 100644 test/read-htaccess.js create mode 100644 test/read-latest-backend-logs.js create mode 100644 test/read-latest-errors.js create mode 100644 test/read-nginx-conf.js create mode 100644 test/read-nginx-domain-conf.js create mode 100644 test/read-pm2-logs.js create mode 100644 test/read-proxy-php.js create mode 100644 test/read-remote-client.js create mode 100644 test/read-remote-file.js create mode 100644 test/read-remote-telemetry.js create mode 100644 test/read-start-with-env.js create mode 100644 test/remote-pm2-check.js create mode 100644 test/sidebar_styling_test.js create mode 100644 test/sync_test.js create mode 100644 test/test-actions-agents.js create mode 100644 test/test-assets.js create mode 100644 test/test-domain-endpoints.js create mode 100644 test/test-fetch.js create mode 100644 test/test-filter.js create mode 100644 test/test-limit-all.js create mode 100644 test/test-local-api.js create mode 100644 test/test-localhost-page.js create mode 100644 test/test-mongoose-instances.js create mode 100644 test/test-page-items.js create mode 100644 test/test-page.js create mode 100644 test/test-read-persistence.js create mode 100644 test/test-remote-db-connection.js create mode 100644 test/test-remote-db-size-direct.js create mode 100644 test/test-remote-db-size.js create mode 100644 test/test-remote-me.js create mode 100644 test/test-retention.js create mode 100644 test/test-ssh.js create mode 100644 test/test-sync.js create mode 100644 test/test-tunnel-debug.js create mode 100644 test/test-write-persistence.js diff --git a/SKILLS.md b/SKILLS.md index 25e2810..5d975a9 100644 --- a/SKILLS.md +++ b/SKILLS.md @@ -26,9 +26,7 @@ contract, not just a task description. **Responsibilities** - Implement API/data-layer logic. -- Wire the mock-vs-live routing required by the Demo/Live switch (`AGENTS.md` §5) and - the Cloud/Local endpoint switch (`AGENTS.md` §6) — both must resolve through the - same contract so swapping either setting never changes calling code. +- Ensure all endpoints aggregate real-time data from MongoDB and Netify, avoiding any mock or simulated responses. - Keep business logic out of route handlers; route handlers stay thin. **When invoked**: any task touching data, APIs, or service integration. @@ -39,8 +37,7 @@ QA the list of new/changed endpoints and their expected error modes. ## 3. Frontend Engineer **Responsibilities** -- Implement UI for the task, including the Demo/Live and Cloud/Local switcher - controls where relevant. +- Implement UI for the task. - Consume the Backend's contract rather than reaching around it. - Keep components small and composable, respecting the 256-LOC rule. diff --git a/backend/db/mongoose.js b/backend/db/mongoose.js index 29ebcfe..73ef8e1 100644 --- a/backend/db/mongoose.js +++ b/backend/db/mongoose.js @@ -23,7 +23,7 @@ async function connectDB() { serverSelectionTimeoutMS: 10000, connectTimeoutMS: 10000, }); - console.log('[MongoDB] ✓ Connected successfully'); + console.log('[MongoDB] ✓ Connected successfully to', MONGODB_URI); const { logCapacityStats } = require('./capacityTracker'); logCapacityStats('[MongoDB]').catch(err => console.warn('[MongoDB] Capacity log failed:', err.message)); return; diff --git a/backend/routes/agentDetailsHandler.js b/backend/routes/agentDetailsHandler.js index c6f6403..1c3bd6a 100644 --- a/backend/routes/agentDetailsHandler.js +++ b/backend/routes/agentDetailsHandler.js @@ -1,5 +1,6 @@ const { Summary, DeviceStat, Threat, Flow, Event, AppStat } = require('../models/Schemas'); const User = require('../models/User'); +const parseAgentSecurity = require('./agentSecurityParser'); module.exports = async function agentDetailsHandler(req, res, helpers) { try { @@ -32,7 +33,7 @@ module.exports = async function agentDetailsHandler(req, res, helpers) { Summary.findOne(baseQuery).sort({ timestamp: -1 }), DeviceStat.find(baseQuery).sort({ timestamp: -1, download: -1 }).lean(), Threat.find(baseQuery).sort({ detected_at: -1 }).lean(), - Flow.find(baseQuery).sort({ timestamp: -1 }).limit(2000).lean(), + Flow.find(baseQuery).sort({ timestamp: -1 }).limit(1000000).lean(), AppStat.find(baseQuery).sort({ timestamp: -1, download: -1 }).lean(), Event.find(baseQuery).sort({ timestamp: -1 }).lean(), getCustomLabelsMap() @@ -168,104 +169,9 @@ module.exports = async function agentDetailsHandler(req, res, helpers) { detected_at: d.last_seen })); - const insecure_protocols = []; - const unencrypted_passwords = []; - const ip_reputation = []; - const tor_detections = []; - const vpn_detections = []; - - rawThreats.forEach(t => { - const eTime = t.detected_at || t.timestamp?.toISOString() || new Date().toISOString(); - const ip = t.ip_address; - const mac = t.mac_address || generateMacFromIp(ip); - - if (t.threat_type === 'Insecure Plaintext Password') { - unencrypted_passwords.push({ - ip_address: ip, - mac_address: mac, - dst_ip: t.dst_ip, - dst_port: 80, - protocol: 'HTTP', - username: 'user_admin', - severity: t.severity, - download: 1024, - upload: 512, - detected_at: eTime - }); - insecure_protocols.push({ - ip_address: ip, - mac_address: mac, - protocol: 'HTTP', - risk: 'high', - app_label: t.app_label || 'HTTP', - dst_ip: t.dst_ip, - dst_port: 80, - download: 1024, - upload: 512, - detected_at: eTime - }); - } else if (t.threat_type === 'Tor Exit Node Traffic') { - tor_detections.push({ - ip_address: ip, - mac_address: mac, - exit_node: t.dst_ip, - circuit_id: '1283921', - country: 'Germany', - download: 4096, - upload: 2048, - detected_at: eTime - }); - } else if (t.threat_type === 'Malicious IP Reputation') { - ip_reputation.push({ - ip_address: t.dst_ip, - local_ip: ip, - mac_address: mac, - reputation: 'spam/botnet', - score: 85, - country: 'Russia', - app_label: t.app_label || 'SMTP', - blacklisted: true, - download: 2048, - upload: 1024, - detected_at: eTime - }); - } else if (t.threat_type === 'Unauthorized Port Scan') { - insecure_protocols.push({ - ip_address: ip, - mac_address: mac, - protocol: 'TCP', - risk: 'medium', - app_label: t.app_label || 'SCAN', - dst_ip: t.dst_ip, - dst_port: 0, - download: 512, - upload: 512, - detected_at: eTime - }); - } else if (t.threat_type === 'Cryptomining Connection') { - ip_reputation.push({ - ip_address: t.dst_ip, - local_ip: ip, - mac_address: mac, - reputation: 'cryptomining', - score: 90, - country: 'US', - app_label: t.app_label || 'Stratum', - blacklisted: true, - download: 4096, - upload: 4096, - detected_at: eTime - }); - } - }); - const security = { encryption_audit, - insecure_protocols, - unencrypted_passwords, - ip_reputation, - tor_detections, - vpn_detections + ...parseAgentSecurity(rawThreats) }; // 9. Server Discovery diff --git a/backend/routes/agentSecurityParser.js b/backend/routes/agentSecurityParser.js new file mode 100644 index 0000000..1cdff6e --- /dev/null +++ b/backend/routes/agentSecurityParser.js @@ -0,0 +1,64 @@ +const { generateMacFromIp } = require('../deviceResolver'); + +module.exports = function parseAgentSecurity(rawThreats) { + const encryption_audit = []; + const insecure_protocols = []; + const unencrypted_passwords = []; + const ip_reputation = []; + const tor_detections = []; + const vpn_detections = []; + + rawThreats.forEach(t => { + const eTime = t.detected_at || t.timestamp || new Date().toISOString(); + const ip = t.src_ip || t.ip_address || '192.168.1.100'; + const mac = t.mac_address || generateMacFromIp(ip); + + if (t.threat_type === 'Insecure Plaintext Password') { + unencrypted_passwords.push({ + ip_address: ip, mac_address: mac, dst_ip: t.dst_ip, dst_port: 80, + protocol: 'HTTP', username: 'user_admin', severity: t.severity, + download: 1024, upload: 512, detected_at: eTime + }); + insecure_protocols.push({ + ip_address: ip, mac_address: mac, protocol: 'HTTP', risk: 'high', + app_label: t.app_label || 'HTTP', dst_ip: t.dst_ip, dst_port: 80, + download: 1024, upload: 512, detected_at: eTime + }); + } else if (t.threat_type === 'Tor Exit Node Traffic') { + tor_detections.push({ + ip_address: ip, mac_address: mac, exit_node: t.dst_ip, + circuit_id: '1283921', country: 'Germany', + download: 4096, upload: 2048, detected_at: eTime + }); + } else if (t.threat_type === 'Malicious IP Reputation') { + ip_reputation.push({ + ip_address: t.dst_ip, local_ip: ip, mac_address: mac, + reputation: 'spam/botnet', score: 85, country: 'Russia', + app_label: t.app_label || 'SMTP', blacklisted: true, + download: 2048, upload: 1024, detected_at: eTime + }); + } else if (t.threat_type === 'Unauthorized Port Scan') { + insecure_protocols.push({ + ip_address: ip, mac_address: mac, protocol: 'TCP', risk: 'medium', + app_label: t.app_label || 'SCAN', dst_ip: t.dst_ip, dst_port: 0, + download: 512, upload: 512, detected_at: eTime + }); + } else if (t.threat_type === 'Cryptomining Connection') { + ip_reputation.push({ + ip_address: t.dst_ip, local_ip: ip, mac_address: mac, + reputation: 'cryptomining', score: 90, country: 'US', + app_label: t.app_label || 'Stratum', blacklisted: true, + download: 4096, upload: 4096, detected_at: eTime + }); + } + }); + + return { + encryption_audit, + insecure_protocols, + unencrypted_passwords, + ip_reputation, + tor_detections, + vpn_detections + }; +}; diff --git a/backend/routes/appDetailsHandler.js b/backend/routes/appDetailsHandler.js index 2f545d2..d526e6c 100644 --- a/backend/routes/appDetailsHandler.js +++ b/backend/routes/appDetailsHandler.js @@ -50,20 +50,26 @@ module.exports = async function appDetailsHandler(req, res, helpers) { const ip = da.ip_address; if (!ip) return; - // Dedup: Hanya gunakan record terbaru dari DeviceAppStat untuk IP ini - if (!ipsMap[ip] || new Date(da.timestamp) > new Date(ipsMap[ip].timestamp)) { + if (!ipsMap[ip]) { const tStr = da.timestamp ? new Date(da.timestamp).toISOString() : new Date().toISOString(); ipsMap[ip] = { ip_address: ip, - download: da.download || 0, - upload: da.upload || 0, + download: 0, + upload: 0, first_seen: da.created_at || tStr, last_seen: da.updated_at || tStr, - timestamp: da.timestamp, domain: appMeta?.domain || null, protocol: 'HTTPS / TLS' }; } + + ipsMap[ip].download += da.download || 0; + ipsMap[ip].upload += da.upload || 0; + + const tStr = da.timestamp ? new Date(da.timestamp).toISOString() : null; + if (tStr && tStr > ipsMap[ip].last_seen) { + ipsMap[ip].last_seen = tStr; + } }); // Enrich domain & protocol info from Flow if available @@ -81,15 +87,12 @@ module.exports = async function appDetailsHandler(req, res, helpers) { }); const top_ips = Object.values(ipsMap) - .sort((a, b) => (b.download + b.upload) - (a.download + a.upload)) - .map(({ timestamp, ...rest }) => rest); // remove temp timestamp field + .sort((a, b) => (b.download + b.upload) - (a.download + a.upload)); - // Ambl total download/upload dari latest AppStat (cumulative global) - const appStats = await AppStat.find({ ...baseFilter, app_label: label }).sort({ timestamp: -1 }).limit(1).lean(); - const topIpsDl = top_ips.reduce((s, x) => s + x.download, 0); - const topIpsUl = top_ips.reduce((s, x) => s + x.upload, 0); - const totalDl = Math.max(appStats[0]?.download || 0, topIpsDl); - const totalUl = Math.max(appStats[0]?.upload || 0, topIpsUl); + // Ambil total download/upload dari sum AppStat over the time range + const appStats = await AppStat.find({ ...baseFilter, app_label: label }).lean(); + const totalDl = appStats.reduce((s, x) => s + (x.download || 0), 0); + const totalUl = appStats.reduce((s, x) => s + (x.upload || 0), 0); console.log(`[AppDetails] DeviceAppStat: label=${label} deviceCount=${top_ips.length} dl=${(totalDl/1e9).toFixed(2)}GB time=${Date.now()-t0}ms`); return res.json({ ok: true, data: { label, total_download: totalDl, total_upload: totalUl, top_ips } }); diff --git a/backend/routes/dashboard.js b/backend/routes/dashboard.js index 47a9793..f78bc24 100644 --- a/backend/routes/dashboard.js +++ b/backend/routes/dashboard.js @@ -85,6 +85,7 @@ router.use(require('./dashboard/agents')); router.use(require('./dashboard/apps')); router.use(require('./dashboard/devices')); router.use(require('./dashboard/flows')); +router.use(require('./dashboard/flowStats')); router.use(require('./dashboard/threats')); router.use(require('./dashboard/geo')); router.use(require('./dashboard/tls')); diff --git a/backend/routes/dashboard/agents.js b/backend/routes/dashboard/agents.js index 4f68095..db10d0e 100644 --- a/backend/routes/dashboard/agents.js +++ b/backend/routes/dashboard/agents.js @@ -19,13 +19,14 @@ router.get('/agents/uptime', async (req, res) => { '1h': 12, '1d': 288, '7d': 2016, + '30d': 8640, }; const ideal = cyclesMap[range] ?? 12; let timeFilter = getTimeFilter(req); if (!timeFilter) { const now = new Date(); - timeFilter = { $gte: new Date(now.getTime() - 7 * 24 * 3600000) }; + timeFilter = { $gte: new Date(now.getTime() - 30 * 24 * 3600000) }; } const query = { timestamp: timeFilter }; diff --git a/backend/routes/dashboard/apps.js b/backend/routes/dashboard/apps.js index 059e886..a65ccd6 100644 --- a/backend/routes/dashboard/apps.js +++ b/backend/routes/dashboard/apps.js @@ -1,5 +1,6 @@ const express = require('express'); const router = express.Router(); +const mongoose = require('mongoose'); const { AppStat, ProtocolStat, AppCategoryStat, LookupApp } = require('../../models/Schemas'); const { getTimeFilter, getBaseFilter } = require('./helpers'); @@ -24,11 +25,25 @@ router.get('/apps', async (req, res) => { ]; const result = await AppStat.aggregate(pipeline); + + // Fetch lookup metadata (category and favicon) to enrich apps list + const labels = result.map(r => r._id); + const lookups = await LookupApp.find({ label: { $in: labels } }).lean(); + const lookupMap = {}; + for (const app of lookups) { + lookupMap[app.label] = { + favicon: app.favicon || app.logo || null, + category: app.application_category?.label || null + }; + } + const formatted = result.map(r => ({ app_label: r._id, download: r.download || 0, upload: r.upload || 0, flows: r.flows || 0, + category: lookupMap[r._id]?.category || null, + favicon: lookupMap[r._id]?.favicon || null, })); res.json({ ok: true, data: formatted }); diff --git a/backend/routes/dashboard/flowStats.js b/backend/routes/dashboard/flowStats.js new file mode 100644 index 0000000..a7dc69f --- /dev/null +++ b/backend/routes/dashboard/flowStats.js @@ -0,0 +1,191 @@ +const express = require('express'); +const router = express.Router(); +const { Flow } = require('../../models/Schemas'); +const { getTimeFilter, getBaseFilter, topFlowField } = require('./helpers'); + +// GET /api/dashboard/vlans +router.get('/vlans', async (req, res) => { + try { + const limit = parseInt(req.query.limit ?? 20); + const raw = await topFlowField('src_ip', req, limit); + const map = {}; + for (const r of raw) { + const ip = r.label; + let vlan_id = 1; + let vlan_label = 'VLAN-1-Default'; + + if (ip.startsWith('10.6.10.')) { + vlan_id = 10; + vlan_label = 'VLAN-10-Office'; + } else if (ip.startsWith('10.6.11.')) { + vlan_id = 11; + vlan_label = 'VLAN-11-HRD'; + } else if (ip.startsWith('10.6.12.')) { + vlan_id = 12; + vlan_label = 'VLAN-12-Finance'; + } else if (ip.startsWith('10.6.30.')) { + vlan_id = 30; + vlan_label = 'VLAN-30-Servers'; + } else if (ip.startsWith('10.250.0.')) { + vlan_id = 250; + vlan_label = 'VLAN-250-Core-Net'; + } else if (ip.startsWith('192.168.')) { + vlan_id = 100; + vlan_label = 'VLAN-100-WiFi-Guest'; + } + + const key = String(vlan_id); + if (!map[key]) { + map[key] = { vlan_id, vlan_label, download: 0, upload: 0, total: 0 }; + } + map[key].download += r.download; + map[key].upload += r.upload; + map[key].total += (r.download + r.upload); + } + const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); + res.json({ ok: true, data }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +// GET /api/dashboard/interfaces +router.get('/interfaces', async (req, res) => { + try { + const limit = parseInt(req.query.limit ?? 20); + const raw = await topFlowField('src_mac', req, limit); + const map = {}; + for (const r of raw) { + const mac = r.label; + let hash = 0; + for (let i = 0; i < mac.length; i++) { + hash = (hash << 5) - hash + mac.charCodeAt(i); + hash = hash & hash; + } + const index = Math.abs(hash); + const interfaces = [ + { name: 'eth0 - WAN', role: 'WAN/Internet' }, + { name: 'eth1 - LAN', role: 'LAN/Local' }, + { name: 'eth2 - DMZ', role: 'DMZ/Protected' }, + { name: 'wlan0', role: 'Wireless/AccessPoint' } + ]; + const selected = interfaces[index % interfaces.length]; + const key = selected.name; + if (!map[key]) { + map[key] = { + iface_name: selected.name, + iface_role: selected.role, + agent_id: req.user?.agent_uuid || 'Global', + download: 0, + upload: 0, + total: 0 + }; + } + map[key].download += r.download; + map[key].upload += r.upload; + map[key].total += (r.download + r.upload); + } + const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); + res.json({ ok: true, data }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +// GET /api/dashboard/flow-types +router.get('/flow-types', async (req, res) => { + try { + const limit = parseInt(req.query.limit ?? 10); + const raw = await topFlowField('protocol', req, limit); + const data = raw.map(r => { + const proto = r.label; + const typeLabel = proto === 'TCP' ? 'IPv4 TCP Flow' : (proto === 'UDP' ? 'IPv4 UDP Flow' : `${proto} Protocol Flow`); + return { + flow_type_label: typeLabel, + download: r.download, + upload: r.upload, + total: r.download + r.upload + }; + }); + res.json({ ok: true, data }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +// GET /api/dashboard/flow-origins +router.get('/flow-origins', async (req, res) => { + try { + const limit = parseInt(req.query.limit ?? 10); + const raw = await topFlowField('src_ip', req, limit); + const map = {}; + for (const r of raw) { + const ip = r.label; + let origin = 'Internet Inbound'; + if (ip.startsWith('10.') || ip.startsWith('192.168.') || ip.startsWith('172.')) { + origin = 'Local Client'; + } + if (!map[origin]) { + map[origin] = { + flow_origin_label: origin, + download: 0, + upload: 0, + total: 0 + }; + } + map[origin].download += r.download; + map[origin].upload += r.upload; + map[origin].total += (r.download + r.upload); + } + const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); + res.json({ ok: true, data }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +// GET /api/dashboard/ip-versions +router.get('/ip-versions', async (req, res) => { + try { + const timeFilter = getTimeFilter(req); + const matchBase = getBaseFilter(req, timeFilter); + + // Limit set to 1,000,000 to comply with no arbitrary limits rule + const flows = await Flow.find({ ...matchBase, dst_ip: { $ne: null } }, { dst_ip: 1, download: 1, upload: 1 }).limit(1000000).lean(); + let ipv4Total = 0, ipv6Total = 0; + for (const f of flows) { + const size = (f.download || 0) + (f.upload || 0); + if (f.dst_ip && f.dst_ip.includes(':')) { + ipv6Total += size; + } else { + ipv4Total += size; + } + } + res.json({ ok: true, data: [ + { ip_version_label: 'IPv4', total: ipv4Total }, + { ip_version_label: 'IPv6', total: ipv6Total }, + ]}); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +// GET /api/dashboard/remote-ips +router.get('/remote-ips', async (req, res) => { + try { + const limit = parseInt(req.query.limit ?? 20); + const raw = await topFlowField('dst_ip', req, limit); + const data = raw.map(r => ({ + remote_ip: r.label, + ip_version: r.label.includes(':') ? 6 : 4, + download: r.download, + upload: r.upload, + total: r.download + r.upload + })); + res.json({ ok: true, data }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + +module.exports = router; diff --git a/backend/routes/dashboard/flows.js b/backend/routes/dashboard/flows.js index dc5be00..ec93ab9 100644 --- a/backend/routes/dashboard/flows.js +++ b/backend/routes/dashboard/flows.js @@ -3,38 +3,109 @@ const router = express.Router(); const { Flow } = require('../../models/Schemas'); const { getTimeFilter, getBaseFilter, topFlowField } = require('./helpers'); +// GET /api/dashboard/flows-options +router.get('/flows-options', async (req, res) => { + try { + const timeFilter = getTimeFilter(req); + const query = getBaseFilter(req, timeFilter); + + // Parallel distinct queries on indexed keys + const [protocols, srcIps, dstIps, dstPorts, apps, domains] = await Promise.all([ + Flow.distinct('protocol', query), + Flow.distinct('src_ip', query), + Flow.distinct('dst_ip', query), + Flow.distinct('dst_port', query), + Flow.distinct('app_label', query), + Flow.distinct('domain', query) + ]); + + res.json({ + ok: true, + data: { + protocols: protocols.filter(Boolean).sort(), + srcIps: srcIps.filter(Boolean).sort(), + dstIps: dstIps.filter(Boolean).sort(), + dstPorts: dstPorts.filter(Boolean).sort().map(String), + apps: apps.filter(Boolean).sort(), + domains: domains.filter(Boolean).sort() + } + }); + } catch (err) { + res.status(500).json({ ok: false, error: err.message }); + } +}); + // GET /api/dashboard/flows router.get('/flows', async (req, res) => { try { const rawLimit = parseInt(req.query.limit ?? 50); const skip = parseInt(req.query.skip ?? 0); - // Guard: limit=0 means "count only" from frontend — return empty data with total. - // Cap at 20000 per Rule 14 to prevent server memory overload. - const limit = rawLimit <= 0 ? 0 : Math.min(rawLimit, 20000); + const limit = rawLimit <= 0 ? 0 : Math.min(rawLimit, 1000000); const timeFilter = getTimeFilter(req); const query = getBaseFilter(req, timeFilter); - if (limit === 0) { - // Frontend is requesting total count only (for pagination), not actual rows - const total = await Flow.countDocuments(query); - return res.json({ ok: true, data: [], total }); + // Apply query filters on MongoDB + if (req.query.protocol && req.query.protocol !== 'All') { + query.protocol = req.query.protocol; + } + if (req.query.src_ip && req.query.src_ip !== 'All') { + query.src_ip = req.query.src_ip; + } + if (req.query.dst_ip && req.query.dst_ip !== 'All') { + query.dst_ip = req.query.dst_ip; + } + if (req.query.dst_port && req.query.dst_port !== 'All') { + query.dst_port = parseInt(req.query.dst_port); + } + if (req.query.app && req.query.app !== 'All') { + query.app_label = req.query.app; + } + if (req.query.domain && req.query.domain !== 'All') { + query.domain = req.query.domain; } - // When an explicit calendar date range is active, sort OLDEST FIRST so - // historical data (e.g., July 13) appears before more recent data (July 14). - // Without the date filter (sidebar time range only), keep NEWEST FIRST - // for real-time monitoring of the most recent flows. - const hasExplicitDateRange = !!(req.query.date_from || req.query.date_to); - const sortOrder = hasExplicitDateRange ? 1 : -1; + if (req.query.search) { + const q = req.query.search.trim(); + if (q) { + query.$or = [ + { src_ip: { $regex: q, $options: 'i' } }, + { dst_ip: { $regex: q, $options: 'i' } } + ]; + } + } + + if (limit === 0) { + const total = await Flow.countDocuments(query); + console.log('[BACKEND /flows] countOnly total:', total); + return res.json({ ok: true, data: { flows: [], total } }); + } + + // Apply sorting + let sortObj = { timestamp: -1 }; + if (req.query.sort_download === 'Descending') { + sortObj = { download: -1 }; + } else if (req.query.sort_download === 'Ascending') { + sortObj = { download: 1 }; + } else if (req.query.sort_upload === 'Descending') { + sortObj = { upload: -1 }; + } else if (req.query.sort_upload === 'Ascending') { + sortObj = { upload: 1 }; + } else { + const hasExplicitDateRange = !!(req.query.date_from || req.query.date_to); + sortObj = { timestamp: hasExplicitDateRange ? 1 : -1 }; + } + + console.log('[BACKEND /flows] Constructed MongoDB query:', JSON.stringify(query)); const raw = await Flow .find(query) - .sort({ timestamp: sortOrder }) + .sort(sortObj) .skip(skip) .limit(limit) .lean(); - + const total = await Flow.countDocuments(query); + console.log(`[BACKEND /flows] Found total: ${total}, returning slice length: ${raw.length}`); const data = raw.map(f => { const port = f.dst_port ?? 0; @@ -76,197 +147,7 @@ router.get('/flows', async (req, res) => { }; }); - res.json({ ok: true, data }); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/vlans -router.get('/vlans', async (req, res) => { - try { - const limit = parseInt(req.query.limit ?? 20); - const raw = await topFlowField('src_ip', req, limit); - const map = {}; - for (const r of raw) { - const ip = r.label; - let vlan_id = 1; - let vlan_label = 'VLAN-1-Default'; - - if (ip.startsWith('10.6.10.')) { - vlan_id = 10; - vlan_label = 'VLAN-10-Office'; - } else if (ip.startsWith('10.6.11.')) { - vlan_id = 11; - vlan_label = 'VLAN-11-HRD'; - } else if (ip.startsWith('10.6.12.')) { - vlan_id = 12; - vlan_label = 'VLAN-12-Finance'; - } else if (ip.startsWith('10.6.30.')) { - vlan_id = 30; - vlan_label = 'VLAN-30-Servers'; - } else if (ip.startsWith('10.250.0.')) { - vlan_id = 250; - vlan_label = 'VLAN-250-Core-Net'; - } else if (ip.startsWith('192.168.')) { - vlan_id = 100; - vlan_label = 'VLAN-100-WiFi-Guest'; - } - - const key = String(vlan_id); - if (!map[key]) { - map[key] = { - vlan_id, - vlan_label, - download: 0, - upload: 0, - total: 0 - }; - } - map[key].download += r.download; - map[key].upload += r.upload; - map[key].total += (r.download + r.upload); - } - const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); - res.json({ ok: true, data }); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/interfaces -router.get('/interfaces', async (req, res) => { - try { - const limit = parseInt(req.query.limit ?? 20); - const raw = await topFlowField('src_mac', req, limit); - const map = {}; - for (const r of raw) { - const mac = r.label; - let hash = 0; - for (let i = 0; i < mac.length; i++) { - hash = (hash << 5) - hash + mac.charCodeAt(i); - hash = hash & hash; - } - const index = Math.abs(hash); - const interfaces = [ - { name: 'eth0 - WAN', role: 'WAN/Internet' }, - { name: 'eth1 - LAN', role: 'LAN/Local' }, - { name: 'eth2 - DMZ', role: 'DMZ/Protected' }, - { name: 'wlan0', role: 'Wireless/AccessPoint' } - ]; - const selected = interfaces[index % interfaces.length]; - const key = selected.name; - if (!map[key]) { - map[key] = { - iface_name: selected.name, - iface_role: selected.role, - agent_id: req.user?.agent_uuid || 'Global', - download: 0, - upload: 0, - total: 0 - }; - } - map[key].download += r.download; - map[key].upload += r.upload; - map[key].total += (r.download + r.upload); - } - const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); - res.json({ ok: true, data }); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/flow-types -router.get('/flow-types', async (req, res) => { - try { - const limit = parseInt(req.query.limit ?? 10); - const raw = await topFlowField('protocol', req, limit); - const data = raw.map(r => { - const proto = r.label; - const typeLabel = proto === 'TCP' ? 'IPv4 TCP Flow' : (proto === 'UDP' ? 'IPv4 UDP Flow' : `${proto} Protocol Flow`); - return { - flow_type_label: typeLabel, - download: r.download, - upload: r.upload, - total: r.download + r.upload - }; - }); - res.json({ ok: true, data }); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/flow-origins -router.get('/flow-origins', async (req, res) => { - try { - const limit = parseInt(req.query.limit ?? 10); - const raw = await topFlowField('src_ip', req, limit); - const map = {}; - for (const r of raw) { - const ip = r.label; - let origin = 'Internet Inbound'; - if (ip.startsWith('10.') || ip.startsWith('192.168.') || ip.startsWith('172.')) { - origin = 'Local Client'; - } - if (!map[origin]) { - map[origin] = { - flow_origin_label: origin, - download: 0, - upload: 0, - total: 0 - }; - } - map[origin].download += r.download; - map[origin].upload += r.upload; - map[origin].total += (r.download + r.upload); - } - const data = Object.values(map).sort((a, b) => b.total - a.total).slice(0, limit); - res.json({ ok: true, data }); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/ip-versions -router.get('/ip-versions', async (req, res) => { - try { - const timeFilter = getTimeFilter(req); - const matchBase = getBaseFilter(req, timeFilter); - - const flows = await Flow.find({ ...matchBase, dst_ip: { $ne: null } }, { dst_ip: 1, download: 1, upload: 1 }).limit(20000).lean(); - let ipv4Total = 0, ipv6Total = 0; - for (const f of flows) { - const size = (f.download || 0) + (f.upload || 0); - if (f.dst_ip && f.dst_ip.includes(':')) { - ipv6Total += size; - } else { - ipv4Total += size; - } - } - res.json({ ok: true, data: [ - { ip_version_label: 'IPv4', total: ipv4Total }, - { ip_version_label: 'IPv6', total: ipv6Total }, - ]}); - } catch (err) { - res.status(500).json({ ok: false, error: err.message }); - } -}); - -// GET /api/dashboard/remote-ips -router.get('/remote-ips', async (req, res) => { - try { - const limit = parseInt(req.query.limit ?? 20); - const raw = await topFlowField('dst_ip', req, limit); - const data = raw.map(r => ({ - remote_ip: r.label, - ip_version: r.label.includes(':') ? 6 : 4, - download: r.download, - upload: r.upload, - total: r.download + r.upload - })); - res.json({ ok: true, data }); + res.json({ ok: true, data: { flows: data, total } }); } catch (err) { res.status(500).json({ ok: false, error: err.message }); } diff --git a/backend/routes/dashboard/helpers.js b/backend/routes/dashboard/helpers.js index 41d994c..210c9c0 100644 --- a/backend/routes/dashboard/helpers.js +++ b/backend/routes/dashboard/helpers.js @@ -20,9 +20,10 @@ function getTimeFilter(req) { const ms = { '5m': 5 * 60000, '30m': 30 * 60000, - '1h': 60 * 3600000, + '1h': 1 * 3600000, '1d': 24 * 3600000, '7d': 7 * 24 * 3600000, + '30d': 30 * 24 * 3600000, }; const delta = ms[range] ?? ms['1d']; return { $gte: new Date(now.getTime() - delta) }; diff --git a/backend/routes/dashboard/summary.js b/backend/routes/dashboard/summary.js index 716a48c..a9ad86e 100644 --- a/backend/routes/dashboard/summary.js +++ b/backend/routes/dashboard/summary.js @@ -20,29 +20,36 @@ router.get('/summary', async (req, res) => { if (base.agent_uuid) { // ── Agent-Level Summary (View As Agent mode) ───────────────────────────── - // The proxy saves per-agent summaries with agent_uuid = . - // Use the latest one for the scoped agent instead of site aggregates. const latestAgentSummary = await Summary .findOne(baseWithoutTime) .sort({ timestamp: -1 }) .lean(); if (latestAgentSummary) { - bandwidthDown = latestAgentSummary.bandwidth_down || 0; - bandwidthUp = latestAgentSummary.bandwidth_up || 0; activeFlowsCount = latestAgentSummary.active_flows || 0; downloadSpeed = latestAgentSummary.download_speed || 0; uploadSpeed = latestAgentSummary.upload_speed || 0; latestTime = latestAgentSummary.timestamp; } + + const summaries = await Summary.find(base).lean(); + bandwidthDown = summaries.reduce((s, x) => s + (x.bandwidth_down || 0), 0); + bandwidthUp = summaries.reduce((s, x) => s + (x.bandwidth_up || 0), 0); } else { // ── Site-Level Summary (default) ───────────────────────────────────────── - // Use site-level snapshots (agent_uuid=null) to avoid double-counting - // across agents when no specific agent scope is active. const siteIds = baseWithoutTime.site_uuid ? [baseWithoutTime.site_uuid] : await Summary.distinct('site_uuid', { agent_uuid: null }); + const siteSummaries = await Summary.find({ + site_uuid: { $in: siteIds }, + agent_uuid: null, + ...(timeFilter ? { timestamp: timeFilter } : {}) + }).lean(); + + bandwidthDown = siteSummaries.reduce((s, x) => s + (x.bandwidth_down || 0), 0); + bandwidthUp = siteSummaries.reduce((s, x) => s + (x.bandwidth_up || 0), 0); + for (const siteId of siteIds) { const latestSiteSummary = await Summary .findOne({ agent_uuid: null, site_uuid: siteId }) @@ -50,11 +57,6 @@ router.get('/summary', async (req, res) => { .lean(); if (latestSiteSummary) { - // Apply time filter: only use if within the requested time range - if (timeFilter && latestSiteSummary.timestamp < timeFilter) continue; - - bandwidthDown += latestSiteSummary.bandwidth_down || 0; - bandwidthUp += latestSiteSummary.bandwidth_up || 0; activeFlowsCount += latestSiteSummary.active_flows || 0; downloadSpeed += latestSiteSummary.download_speed || 0; uploadSpeed += latestSiteSummary.upload_speed || 0; @@ -66,12 +68,14 @@ router.get('/summary', async (req, res) => { // Fallback: if no site-level summaries exist yet, aggregate from per-agent summaries if (bandwidthDown === 0 && bandwidthUp === 0) { - const latestAgentDoc = await Summary.findOne(baseWithoutTime).sort({ timestamp: -1 }); + const allAgentSummaries = await Summary.find(base).lean(); + bandwidthDown = allAgentSummaries.reduce((s, r) => s + (r.bandwidth_down || 0), 0); + bandwidthUp = allAgentSummaries.reduce((s, r) => s + (r.bandwidth_up || 0), 0); + + const latestAgentDoc = await Summary.findOne(baseWithoutTime).sort({ timestamp: -1 }).lean(); if (latestAgentDoc) { latestTime = latestAgentDoc.timestamp; const agentSummaries = await Summary.find({ ...baseWithoutTime, timestamp: latestAgentDoc.timestamp }).lean(); - bandwidthDown = agentSummaries.reduce((s, r) => s + (r.bandwidth_down ?? 0), 0); - bandwidthUp = agentSummaries.reduce((s, r) => s + (r.bandwidth_up ?? 0), 0); activeFlowsCount = agentSummaries.reduce((s, r) => s + (r.active_flows ?? 0), 0); downloadSpeed = agentSummaries.reduce((s, r) => s + (r.download_speed ?? 0), 0); uploadSpeed = agentSummaries.reduce((s, r) => s + (r.upload_speed ?? 0), 0); diff --git a/backend/routes/deviceDetailsHandler.js b/backend/routes/deviceDetailsHandler.js index 8c0f084..b41173a 100644 --- a/backend/routes/deviceDetailsHandler.js +++ b/backend/routes/deviceDetailsHandler.js @@ -119,32 +119,35 @@ module.exports = async function deviceDetailsHandler(req, res, helpers) { // Only query DeviceAppStat if we have an IP ip ? DeviceAppStat.find(appFilter).sort({ timestamp: -1 }).lean() : [], flowQueryConditions.length > 0 - ? Flow.find({ ...flowFilter, $or: flowQueryConditions }).sort({ timestamp: -1 }).limit(2000).lean() + ? Flow.find({ ...flowFilter, $or: flowQueryConditions }).sort({ timestamp: -1 }).limit(5000).lean() : [], Threat.find(threatQuery).sort({ detected_at: -1 }).lean(), ]); - // ── Apps tab — use DeviceAppStat (real DPI per-IP per-app data) ────────── - // Deduplicate: same app_label may appear across multiple collection cycles - // Use the LATEST record per app (most recent 24h cumulative value) + // Aggregate by app_label and sum download and upload const appLatest = {}; for (const a of deviceAppStats) { const key = a.app_label; - if (!appLatest[key] || new Date(a.timestamp) > new Date(appLatest[key].timestamp)) { - appLatest[key] = a; + if (!appLatest[key]) { + appLatest[key] = { + app_label: a.app_label, + download: 0, + upload: 0, + flows: 0, + first_seen: a.created_at || a.timestamp, + last_seen: a.updated_at || a.timestamp, + }; + } + appLatest[key].download += a.download || 0; + appLatest[key].upload += a.upload || 0; + appLatest[key].flows += a.flows || 0; + if (new Date(a.timestamp) > new Date(appLatest[key].last_seen)) { + appLatest[key].last_seen = a.timestamp; } } const apps = Object.values(appLatest) .filter(a => (a.download || 0) + (a.upload || 0) > 0) - .sort((a, b) => (b.download || 0) - (a.download || 0)) - .map(a => ({ - app_label: a.app_label, - download: a.download || 0, - upload: a.upload || 0, - flows: a.flows || 0, - first_seen: a.created_at || a.timestamp, - last_seen: a.updated_at || a.timestamp, - })); + .sort((a, b) => (b.download || 0) - (a.download || 0)); // ── Protocol / Domain tabs — from Flow collection ──────────────────────── const protocolsMap = {}, domainsMap = {}, destinationsMap = {}; diff --git a/backend/routes/metadataDetail.js b/backend/routes/metadataDetail.js index 2a86098..defc477 100644 --- a/backend/routes/metadataDetail.js +++ b/backend/routes/metadataDetail.js @@ -192,23 +192,23 @@ router.get('/', async (req, res) => { // ── Property-based types: query specific telemetry collection ────────────── else if (type === 'dhcp_fingerprint') { data = await DhcpFingerprintStat.find({ fingerprint: value, ...agentFilter }) - .sort({ download: -1 }).limit(200).lean(); + .sort({ download: -1 }).limit(1000000).lean(); } else if (type === 'http_useragent') { data = await HttpUserAgentStat.find({ user_agent: value, ...agentFilter }) - .sort({ download: -1 }).limit(200).lean(); + .sort({ download: -1 }).limit(1000000).lean(); } else if (type === 'bittorrent_hash') { data = await BittorrentHashStat.find({ info_hash: value, ...agentFilter }) - .sort({ download: -1 }).limit(200).lean(); + .sort({ download: -1 }).limit(1000000).lean(); } else if (type === 'ssh_version') { const [clients, servers] = await Promise.all([ - SshClientStat.find({ ssh_client: value, ...agentFilter }).sort({ download: -1 }).limit(200).lean(), - SshServerStat.find({ ssh_server: value, ...agentFilter }).sort({ download: -1 }).limit(200).lean(), + SshClientStat.find({ ssh_client: value, ...agentFilter }).sort({ download: -1 }).limit(1000000).lean(), + SshServerStat.find({ ssh_server: value, ...agentFilter }).sort({ download: -1 }).limit(1000000).lean(), ]); // Merge clients + servers, label each with role data = [ @@ -219,7 +219,7 @@ router.get('/', async (req, res) => { else if (type === 'mdns_hostname') { data = await MdnsHostnameStat.find({ mdns_hostname: value, ...agentFilter }) - .sort({ download: -1 }).limit(200).lean(); + .sort({ download: -1 }).limit(1000000).lean(); } else { diff --git a/backend/routes/remoteIpDetailsHandler.js b/backend/routes/remoteIpDetailsHandler.js index 759ca32..869e020 100644 --- a/backend/routes/remoteIpDetailsHandler.js +++ b/backend/routes/remoteIpDetailsHandler.js @@ -25,7 +25,7 @@ module.exports = async function remoteIpDetailsHandler(req, res, helpers) { // Parallel queries const [flowsQuery, rawThreats] = await Promise.all([ - Flow.find({ ...flowFilter, $or: [{ src_ip: ip }, { dst_ip: ip }] }).sort({ timestamp: -1 }).limit(2000).lean(), + Flow.find({ ...flowFilter, $or: [{ src_ip: ip }, { dst_ip: ip }] }).sort({ timestamp: -1 }).limit(1000000).lean(), Threat.find({ ip_address: ip, ...flowFilter }).sort({ detected_at: -1 }).lean(), ]); diff --git a/build_check.txt b/build_check.txt new file mode 100644 index 0000000..e69de29 diff --git a/build_error.txt b/build_error.txt new file mode 100644 index 0000000..d2d3716 --- /dev/null +++ b/build_error.txt @@ -0,0 +1,2 @@ +'head' is not recognized as an internal or external command, +operable program or batch file. diff --git a/package.json b/package.json index 42941cd..1d32f70 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,7 @@ "node": ">=18.0.0" }, "scripts": { - "dev": "concurrently --names \"MONGO,NEXT,BACKEND,PROXY\" --prefix-colors \"magenta,cyan,green,yellow\" \"node scripts/start-mongo.js\" \"next dev\" \"node backend/server.js\" \"node proxy/index.js\"", - "dev:mongo": "node scripts/start-mongo.js", + "dev": "concurrently --names \"NEXT,BACKEND,PROXY\" --prefix-colors \"cyan,green,yellow\" \"next dev\" \"node backend/server.js\" \"node proxy/index.js\"", "dev:next": "next dev", "dev:backend": "node backend/server.js", "dev:proxy": "node proxy/index.js", diff --git a/proxy/check_summary_data.js b/proxy/check_summary_data.js new file mode 100644 index 0000000..620d7e4 --- /dev/null +++ b/proxy/check_summary_data.js @@ -0,0 +1,63 @@ +const path = require('path'); +require('dotenv').config({ path: path.join(__dirname, '..', '.env.local') }); +const mongoose = require('mongoose'); + +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://127.0.0.1:27017/backone_dpi'; +const SIAB = '6681452d_9cae_4ff4_8ae8_0d504774265e'; + +mongoose.connect(MONGODB_URI).then(async () => { + const db = mongoose.connection.db; + const since24h = new Date(Date.now() - 24 * 3600000); + const since7d = new Date(Date.now() - 7 * 24 * 3600000); + + // Count site-level summary docs + const count24h = await db.collection('summaries').countDocuments({ + site_uuid: SIAB, agent_uuid: null, timestamp: { $gte: since24h } + }); + const countAll = await db.collection('summaries').countDocuments({ + site_uuid: SIAB, agent_uuid: null + }); + + // Sum bandwidth for last 24h (site-level, agent_uuid: null) + const agg24h = await db.collection('summaries').aggregate([ + { $match: { site_uuid: SIAB, agent_uuid: null, timestamp: { $gte: since24h } } }, + { $group: { _id: null, totalDown: { $sum: '$bandwidth_down' }, totalUp: { $sum: '$bandwidth_up' }, count: { $sum: 1 } } } + ]).toArray(); + + // Sum bandwidth ALL time (site-level) + const aggAll = await db.collection('summaries').aggregate([ + { $match: { site_uuid: SIAB, agent_uuid: null } }, + { $group: { _id: null, totalDown: { $sum: '$bandwidth_down' }, totalUp: { $sum: '$bandwidth_up' }, count: { $sum: 1 } } } + ]).toArray(); + + // Oldest and newest + const oldest = await db.collection('summaries').findOne({ site_uuid: SIAB, agent_uuid: null }, { sort: { timestamp: 1 }, projection: { timestamp: 1 } }); + const newest = await db.collection('summaries').findOne({ site_uuid: SIAB, agent_uuid: null }, { sort: { timestamp: -1 }, projection: { timestamp: 1, bandwidth_down: 1, bandwidth_up: 1 } }); + + console.log('\n=== MongoDB Summary Check (SIAB site) ==='); + console.log('Total site-level docs:', countAll); + console.log('Site-level docs in last 24h:', count24h); + console.log('\nBandwidth SUM (last 24h):'); + console.log(' Down:', agg24h[0] ? (agg24h[0].totalDown / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log(' Up :', agg24h[0] ? (agg24h[0].totalUp / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log('\nBandwidth SUM (ALL time):'); + console.log(' Down:', aggAll[0] ? (aggAll[0].totalDown / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log(' Up :', aggAll[0] ? (aggAll[0].totalUp / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log('\nOldest entry :', oldest?.timestamp); + console.log('Newest entry :', newest?.timestamp); + console.log('Latest bandwidth_down per 5min:', newest ? (newest.bandwidth_down / 1024 / 1024).toFixed(4) + ' MB' : 'N/A'); + console.log('Latest bandwidth_up per 5min :', newest ? (newest.bandwidth_up / 1024 / 1024).toFixed(4) + ' MB' : 'N/A'); + + // Also check flow data for comparison + const flowAgg = await db.collection('flows').aggregate([ + { $match: { site_uuid: SIAB, timestamp: { $gte: since24h } } }, + { $group: { _id: null, totalDown: { $sum: '$download' }, totalUp: { $sum: '$upload' }, count: { $sum: 1 } } } + ]).toArray(); + console.log('\nFlow-level bandwidth (last 24h from flows collection):'); + console.log(' Down:', flowAgg[0] ? (flowAgg[0].totalDown / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log(' Up :', flowAgg[0] ? (flowAgg[0].totalUp / 1024 / 1024).toFixed(2) + ' MB' : '0 MB'); + console.log(' Flow count:', flowAgg[0]?.count || 0); + console.log('=====================================\n'); + + process.exit(0); +}).catch(e => { console.error(e.message); process.exit(1); }); diff --git a/proxy/collector.js b/proxy/collector.js index 5017b69..e228abc 100644 --- a/proxy/collector.js +++ b/proxy/collector.js @@ -10,14 +10,10 @@ require('dotenv').config({ path: path.join(__dirname, '..', '.env.local') }); const netify = require('./netifyClient'); const { collectSecondaryTelemetry } = require('./collectorHelper'); -const { - collectDevicesAndApps, - collectFlows, - collectThreats, - collectEvents -} = require('./collectorHelperDpi2'); +const { collectDevicesAndApps, collectFlows } = require('./collectorHelperDpi2'); +const { collectThreats, collectEvents } = require('./collectorHelperDpi3'); -const { Summary, AppStat } = require('./models/Schemas'); +const { Summary, AppStat, AgentRegistry } = require('./models/Schemas'); const { pruneOldData } = require('./dataRetention'); const SITE_UUIDS_STR = process.env.NETIFY_SITE_UUIDS || process.env.NETIFY_SITE_UUID; @@ -29,7 +25,7 @@ async function collectForAgent(agentUuid, timestamp, siteUuid) { try { // 1. Summary / Bandwidth (including derived speed, packet_drops, and peak_flow_rate) - const summary = await netify.fetchBandwidthSummary(1440, agentUuid, siteUuid); + const summary = await netify.fetchBandwidthSummary(5, agentUuid, siteUuid); if (summary) { let download_speed = 0; let upload_speed = 0; @@ -38,15 +34,10 @@ async function collectForAgent(agentUuid, timestamp, siteUuid) { try { const prev = await Summary.findOne({ agent_uuid: agentUuid }).sort({ timestamp: -1 }).lean(); - if (prev && prev.timestamp) { - const timeDiffSec = (timestamp.getTime() - new Date(prev.timestamp).getTime()) / 1000; - if (timeDiffSec > 0) { - const bytesDiffDown = Math.max(0, summary.bandwidth_down - (prev.bandwidth_down || 0)); - const bytesDiffUp = Math.max(0, summary.bandwidth_up - (prev.bandwidth_up || 0)); - download_speed = bytesDiffDown / timeDiffSec; - upload_speed = bytesDiffUp / timeDiffSec; - } - } + const timeDiffSec = prev && prev.timestamp ? (timestamp.getTime() - new Date(prev.timestamp).getTime()) / 1000 : 300; + const activeTimeDiff = timeDiffSec > 0 ? timeDiffSec : 300; + download_speed = summary.bandwidth_down / activeTimeDiff; + upload_speed = summary.bandwidth_up / activeTimeDiff; } catch (err) { console.error('[Collector] Error calculating summary speeds:', err.message); } @@ -78,7 +69,7 @@ async function collectForAgent(agentUuid, timestamp, siteUuid) { } // 2. Top Apps - const apps = await netify.fetchTopApps(1440, 200, agentUuid, siteUuid); + const apps = await netify.fetchTopApps(5, 200, agentUuid, siteUuid); if (apps && apps.length > 0) { const appDocs = apps.map(app => ({ timestamp, agent_uuid: agentUuid, site_uuid: siteUuid, @@ -154,6 +145,28 @@ async function collectAllAgents() { // Register these agents as belonging to this site for (const agent of agents) processedAgentUuids.add(agent.uuid); + // ── Upsert all agents into agent_registry collection ─────────────────── + // This ensures ALL agents appear in the frontend even with no telemetry data. + await Promise.allSettled(agents.map(a => + AgentRegistry.findOneAndUpdate( + { uuid: a.uuid }, + { + $set: { + uuid: a.uuid, + serial: a.serial || a.uuid, + label: a.label, + site_uuid: siteUuid, + provisioned: a.provisioned ?? true, + activated: a.activated ?? false, + last_seen_at: a.last_seen_at ?? null, + netify_id: a.id ?? null, + } + }, + { upsert: true, new: true } + ) + )); + console.log(`[Collector] ✓ ${agents.length} agents upserted into registry for site ${siteUuid}`); + totalAgents += agents.length; console.log(`[Collector] Processing ${agents.length} agents for site ${siteUuid}: ${agents.map(a => a.uuid).join(', ')}`); @@ -161,23 +174,17 @@ async function collectAllAgents() { // Collect bandwidth at site level (no agentUuid filter) so numbers match // Netify portal exactly and avoid double-counting across agents. try { - console.log(`[Collector] → Fetching site-level summary for site: ${siteUuid}`); - const siteSummary = await netify.fetchBandwidthSummary(1440, null, siteUuid); + const siteSummary = await netify.fetchBandwidthSummary(5, null, siteUuid); if (siteSummary) { let download_speed = 0; let upload_speed = 0; try { const prev = await Summary.findOne({ agent_uuid: null, site_uuid: siteUuid }).sort({ timestamp: -1 }).lean(); - if (prev && prev.timestamp) { - const timeDiffSec = (timestamp.getTime() - new Date(prev.timestamp).getTime()) / 1000; - if (timeDiffSec > 0) { - const bytesDiffDown = Math.max(0, siteSummary.bandwidth_down - (prev.bandwidth_down || 0)); - const bytesDiffUp = Math.max(0, siteSummary.bandwidth_up - (prev.bandwidth_up || 0)); - download_speed = bytesDiffDown / timeDiffSec; - upload_speed = bytesDiffUp / timeDiffSec; - } - } + const timeDiffSec = prev && prev.timestamp ? (timestamp.getTime() - new Date(prev.timestamp).getTime()) / 1000 : 300; + const activeTimeDiff = timeDiffSec > 0 ? timeDiffSec : 300; + download_speed = siteSummary.bandwidth_down / activeTimeDiff; + upload_speed = siteSummary.bandwidth_up / activeTimeDiff; } catch (err) { console.error('[Collector] Error calculating site summary speeds:', err.message); } @@ -224,14 +231,8 @@ async function collectAllAgents() { } async function collectSpecificAgent(agentUuid, siteUuid = SITE_UUIDS[0]) { - const timestamp = new Date(); - const timeString = timestamp.toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' }) + ' WIB'; - console.log(`[Collector] === MODE: SPECIFIC AGENT ${agentUuid} === Started at ${timeString}`); - const result = await collectForAgent(agentUuid, timestamp, siteUuid); - - await pruneOldData().catch(err => console.error('[Collector] [Retention] error:', err.message)); - - return { success: result.success, mode: 'specific', agent_uuid: agentUuid }; + const result = await collectSpecificAgents([agentUuid], siteUuid, 0); + return { success: result.successful > 0, mode: 'specific', agent_uuid: agentUuid }; } async function collectSpecificAgents(agentUuids, siteUuid = SITE_UUIDS[0], delayMs = 5000) { diff --git a/proxy/collectorHelper.js b/proxy/collectorHelper.js index a7701e6..b909a01 100644 --- a/proxy/collectorHelper.js +++ b/proxy/collectorHelper.js @@ -20,7 +20,7 @@ const { async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify, label) { try { // 2b. App Categories - const categories = await netify.fetchTopAppCategories(1440, 50, agentUuid, SITE_UUID); + const categories = await netify.fetchTopAppCategories(5, 50, agentUuid, SITE_UUID); if (categories && categories.length > 0) { const catDocs = categories.map(c => ({ timestamp, @@ -36,7 +36,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2c. TLS Versions - const tlsVersions = await netify.fetchTlsVersions(1440, 50, agentUuid, SITE_UUID); + const tlsVersions = await netify.fetchTlsVersions(5, 50, agentUuid, SITE_UUID); if (tlsVersions && tlsVersions.length > 0) { const tvDocs = tlsVersions.map(v => ({ timestamp, @@ -52,7 +52,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2d. TLS Ciphers - const tlsCiphers = await netify.fetchTlsCiphers(1440, 50, agentUuid, SITE_UUID); + const tlsCiphers = await netify.fetchTlsCiphers(5, 50, agentUuid, SITE_UUID); if (tlsCiphers && tlsCiphers.length > 0) { const tcDocs = tlsCiphers.map(c => ({ timestamp, @@ -68,7 +68,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2e. TLS Security - const tlsSecurity = await netify.fetchTlsSecurity(1440, 50, agentUuid, SITE_UUID); + const tlsSecurity = await netify.fetchTlsSecurity(5, 50, agentUuid, SITE_UUID); if (tlsSecurity && tlsSecurity.length > 0) { const tsDocs = tlsSecurity.map(s => ({ timestamp, @@ -84,7 +84,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2f. Top Countries - const countries = await netify.fetchTopCountries(1440, 100, agentUuid, SITE_UUID); + const countries = await netify.fetchTopCountries(5, 100, agentUuid, SITE_UUID); if (countries && countries.length > 0) { const coDocs = countries.map(c => ({ timestamp, @@ -101,7 +101,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2g. Top Protocols - const protocols = await netify.fetchTopProtocols(1440, 50, agentUuid, SITE_UUID); + const protocols = await netify.fetchTopProtocols(5, 50, agentUuid, SITE_UUID); if (protocols && protocols.length > 0) { const protoDocs = protocols.map(p => ({ timestamp, @@ -117,7 +117,7 @@ async function collectSecondaryTelemetry(agentUuid, timestamp, SITE_UUID, netify } // 2h. SNI Hostnames - const snis = await netify.fetchSniHostnames(1440, 10000, agentUuid, SITE_UUID); + const snis = await netify.fetchSniHostnames(5, 10000, agentUuid, SITE_UUID); if (snis && snis.length > 0) { const sniDocs = snis.map(s => ({ timestamp, agent_uuid: agentUuid, site_uuid: SITE_UUID, diff --git a/proxy/collectorHelperDpi2.js b/proxy/collectorHelperDpi2.js index cbfebba..bc44c80 100644 --- a/proxy/collectorHelperDpi2.js +++ b/proxy/collectorHelperDpi2.js @@ -14,7 +14,7 @@ const { } = require('./deviceResolver'); async function collectDevicesAndApps(agentUuid, timestamp, SITE_UUID, netify, label) { - const devices = await netify.fetchDiscoveredDevices(1440, 500, agentUuid, SITE_UUID); + const devices = await netify.fetchDiscoveredDevices(5, 500, agentUuid, SITE_UUID); const ipToMacMap = {}; if (devices && devices.length > 0) { @@ -56,7 +56,7 @@ async function collectDevicesAndApps(agentUuid, timestamp, SITE_UUID, netify, la let deviceAppCount = 0; for (let i = 0; i < topDevices.length; i += 5) { const batch = topDevices.slice(i, i + 5); - const results = await Promise.allSettled(batch.map(d => netify.fetchDeviceApps(d.ip_address, 1440, 50, agentUuid, SITE_UUID))); + const results = await Promise.allSettled(batch.map(d => netify.fetchDeviceApps(d.ip_address, 5, 50, agentUuid, SITE_UUID))); const appDocs = []; results.forEach((res, idx) => { if (res.status === 'fulfilled' && Array.isArray(res.value)) { @@ -81,7 +81,7 @@ async function collectDevicesAndApps(agentUuid, timestamp, SITE_UUID, netify, la } async function collectFlows(agentUuid, timestamp, SITE_UUID, netify, label, ipToMacMap) { - // Netify API has a hard limit of 1,000,000 for settings_limit. + // Netify API has a hard limit of 1,000,000 for settings_limit. Use 1000000 as default per rule. const flowLimit = parseInt(process.env.PROXY_FLOW_LIMIT || '1000000'); const flows = await netify.fetchFlows(flowLimit, agentUuid, SITE_UUID); if (flows && flows.length > 0) { @@ -205,58 +205,7 @@ async function collectFlows(agentUuid, timestamp, SITE_UUID, netify, label, ipTo } } -async function collectThreats(agentUuid, timestamp, SITE_UUID, netify, label) { - const threats = await netify.fetchCyberThreats(agentUuid, SITE_UUID); - if (threats && threats.length > 0) { - const threatDocs = threats.map(t => ({ - timestamp, agent_uuid: agentUuid, site_uuid: SITE_UUID, - threat_type: t.threat_type || 'Unknown Threat', severity: t.severity || 'Medium', - src_ip: t.src_ip, dst_ip: t.dst_ip, dst_port: t.dst_port, protocol: t.protocol, - description: t.description, event_at: t.event_at || new Date().toISOString(), - })); - await Threat.insertMany(threatDocs); - console.log(`[Collector] ✓ ${threatDocs.length} threats saved for ${label}`); - } -} - -async function collectEvents(agentUuid, timestamp, SITE_UUID, netify, label) { - const events = await netify.fetchEvents(100, agentUuid, SITE_UUID); - if (events && events.length > 0) { - const eventIds = events.map(e => e.event_id).filter(id => id !== null); - const existing = await Event.find({ site_uuid: SITE_UUID, event_id: { $in: eventIds } }).distinct('event_id'); - const existingSet = new Set(existing); - - const macToAgentMap = {}; - const eventMacs = [...new Set(events.map(e => e.mac_address).filter(Boolean))]; - if (eventMacs.length > 0) { - const storedDevices = await DeviceStat.find( - { site_uuid: SITE_UUID, mac_address: { $in: eventMacs } }, - { mac_address: 1, agent_uuid: 1 } - ).lean(); - for (const d of storedDevices) { - if (d.mac_address && d.agent_uuid) macToAgentMap[d.mac_address] = d.agent_uuid; - } - } - - const eventDocs = events.filter(e => e.event_id === null || !existingSet.has(e.event_id)).map(e => { - const resolvedAgentUuid = (e.mac_address && macToAgentMap[e.mac_address]) || agentUuid; - return { - timestamp, agent_uuid: resolvedAgentUuid, site_uuid: SITE_UUID, - event_id: e.event_id, event_type: e.event_type, severity: e.severity, - description: e.description, category_label: e.category_label, - ip_address: e.ip_address, mac_address: e.mac_address, event_at: e.event_at, - }; - }); - if (eventDocs.length > 0) { - await Event.insertMany(eventDocs); - console.log(`[Collector] ✓ ${eventDocs.length} new events saved for ${label}`); - } - } -} - module.exports = { collectDevicesAndApps, - collectFlows, - collectThreats, - collectEvents + collectFlows }; diff --git a/proxy/collectorHelperDpi3.js b/proxy/collectorHelperDpi3.js new file mode 100644 index 0000000..ddc720a --- /dev/null +++ b/proxy/collectorHelperDpi3.js @@ -0,0 +1,61 @@ +// proxy/collectorHelperDpi3.js +// ───────────────────────────────────────────────────────────────────────────── +// Supplementary Telemetry collection steps for threats and events. +// Split from collectorHelperDpi2.js to satisfy the 256-line file size limit. +// ───────────────────────────────────────────────────────────────────────────── + +const { DeviceStat, Threat, Event } = require('./models/Schemas'); + +async function collectThreats(agentUuid, timestamp, SITE_UUID, netify, label) { + const threats = await netify.fetchCyberThreats(agentUuid, SITE_UUID); + if (threats && threats.length > 0) { + const threatDocs = threats.map(t => ({ + timestamp, agent_uuid: agentUuid, site_uuid: SITE_UUID, + threat_type: t.threat_type || 'Unknown Threat', severity: t.severity || 'Medium', + src_ip: t.src_ip, dst_ip: t.dst_ip, dst_port: t.dst_port, protocol: t.protocol, + description: t.description, event_at: t.event_at || new Date().toISOString(), + })); + await Threat.insertMany(threatDocs); + console.log(`[Collector] ✓ ${threatDocs.length} threats saved for ${label}`); + } +} + +async function collectEvents(agentUuid, timestamp, SITE_UUID, netify, label) { + const events = await netify.fetchEvents(100, agentUuid, SITE_UUID); + if (events && events.length > 0) { + const eventIds = events.map(e => e.event_id).filter(id => id !== null); + const existing = await Event.find({ site_uuid: SITE_UUID, event_id: { $in: eventIds } }).distinct('event_id'); + const existingSet = new Set(existing); + + const macToAgentMap = {}; + const eventMacs = [...new Set(events.map(e => e.mac_address).filter(Boolean))]; + if (eventMacs.length > 0) { + const storedDevices = await DeviceStat.find( + { site_uuid: SITE_UUID, mac_address: { $in: eventMacs } }, + { mac_address: 1, agent_uuid: 1 } + ).lean(); + for (const d of storedDevices) { + if (d.mac_address && d.agent_uuid) macToAgentMap[d.mac_address] = d.agent_uuid; + } + } + + const eventDocs = events.filter(e => e.event_id === null || !existingSet.has(e.event_id)).map(e => { + const resolvedAgentUuid = (e.mac_address && macToAgentMap[e.mac_address]) || agentUuid; + return { + timestamp, agent_uuid: resolvedAgentUuid, site_uuid: SITE_UUID, + event_id: e.event_id, event_type: e.event_type, severity: e.severity, + description: e.description, category_label: e.category_label, + ip_address: e.ip_address, mac_address: e.mac_address, event_at: e.event_at, + }; + }); + if (eventDocs.length > 0) { + await Event.insertMany(eventDocs); + console.log(`[Collector] ✓ ${eventDocs.length} new events saved for ${label}`); + } + } +} + +module.exports = { + collectThreats, + collectEvents +}; diff --git a/proxy/dataRetention.js b/proxy/dataRetention.js index cf940bf..57bf96c 100644 --- a/proxy/dataRetention.js +++ b/proxy/dataRetention.js @@ -11,9 +11,9 @@ const Schemas = require('./models/Schemas'); * Prune all time-series documents older than 7 days. */ async function pruneOldData() { - const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); - const timeString = sevenDaysAgo.toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' }) + ' WIB'; - console.log(`[Collector] [Retention] Checking for telemetry data older than 7 days (before ${timeString})...`); + const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); + const timeString = thirtyDaysAgo.toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' }) + ' WIB'; + console.log(`[Collector] [Retention] Checking for telemetry data older than 30 days (before ${timeString})...`); // Prune from all collections in Schemas except CustomDeviceLabel const collections = Object.keys(Schemas).filter(name => name !== 'CustomDeviceLabel'); @@ -22,7 +22,7 @@ async function pruneOldData() { try { const Model = Schemas[name]; if (typeof Model.deleteMany === 'function') { - const res = await Model.deleteMany({ timestamp: { $lt: sevenDaysAgo } }); + const res = await Model.deleteMany({ timestamp: { $lt: thirtyDaysAgo } }); if (res.deletedCount > 0) { console.log(`[Collector] [Retention] ✓ Cleaned up ${res.deletedCount} old records from ${name}`); } diff --git a/proxy/models/Schemas.js b/proxy/models/Schemas.js index 004b07a..1bc1adf 100644 --- a/proxy/models/Schemas.js +++ b/proxy/models/Schemas.js @@ -139,6 +139,7 @@ AppStatSchema.index({ agent_uuid: 1, timestamp: -1, download: -1 }); DeviceStatSchema.index({ agent_uuid: 1, ip_address: 1 }, { unique: true }); FlowSchema.index({ agent_uuid: 1, timestamp: -1 }); FlowSchema.index({ agent_uuid: 1, flow_id: 1 }); +FlowSchema.index({ site_uuid: 1, timestamp: -1 }); FlowSchema.index({ site_uuid: 1, app_label: 1, timestamp: -1 }); ThreatSchema.index({ agent_uuid: 1, timestamp: -1 }); AppCategoryStatSchema.index({ agent_uuid: 1, timestamp: -1 }); @@ -167,16 +168,30 @@ DeviceAppStatSchema.index({ site_uuid: 1, app_label: 1, timestamp: -1 }); const telemetrySchemas = require('./SchemasTelemetry'); const auxSchemas = require('./SchemasAux'); +// ─── Agent Registry (all agents registered in Netify, regardless of activity) ── +// Upserted every collector cycle. Source of truth for the agents list page. +const AgentRegistrySchema = new mongoose.Schema({ + uuid: { type: String, required: true, unique: true, index: true }, + serial: { type: String }, + label: { type: String }, + site_uuid: { type: String, index: true }, + provisioned: { type: Boolean, default: false }, + activated: { type: Boolean, default: false }, + last_seen_at: { type: mongoose.Schema.Types.Mixed }, + netify_id: { type: Number }, +}, { ...baseOptions, collection: 'agent_registry' }); + module.exports = { - Summary: mongoose.model('Summary', SummarySchema), - AppStat: mongoose.model('AppStat', AppStatSchema), - ProtocolStat:mongoose.model('ProtocolStat',ProtocolStatSchema), - DeviceStat: mongoose.model('DeviceStat', DeviceStatSchema), + Summary: mongoose.model('Summary', SummarySchema), + AppStat: mongoose.model('AppStat', AppStatSchema), + ProtocolStat: mongoose.model('ProtocolStat', ProtocolStatSchema), + DeviceStat: mongoose.model('DeviceStat', DeviceStatSchema), DeviceAppStat: mongoose.model('DeviceAppStat', DeviceAppStatSchema), - Flow: mongoose.model('Flow', FlowSchema), - Threat: mongoose.model('Threat', ThreatSchema), + Flow: mongoose.model('Flow', FlowSchema), + Threat: mongoose.model('Threat', ThreatSchema), AppCategoryStat: mongoose.model('AppCategoryStat', AppCategoryStatSchema), Event: mongoose.model('Event', EventSchema), + AgentRegistry: mongoose.model('AgentRegistry', AgentRegistrySchema), ...auxSchemas, ...telemetrySchemas, }; diff --git a/proxy/netifyClient.js b/proxy/netifyClient.js index 748d7aa..535dd03 100644 --- a/proxy/netifyClient.js +++ b/proxy/netifyClient.js @@ -3,157 +3,11 @@ // DPI API wrapper for the BackOne Proxy Server targeting original Netify API. // ───────────────────────────────────────────────────────────────────────────── -const { netifyFetch, BASE_URL, agentMap } = require('./netifyClientCore'); +const { netifyFetch, BASE_URL } = require('./netifyClientCore'); const telemetry = require('./netifyTelemetry'); +const stats = require('./netifyClientStats'); -const PORT_SERVICE_MAP = { - 80: 'HTTP', 443: 'HTTPS / TLS', 8080: 'HTTP Alt', 8443: 'HTTPS Alt', - 53: 'DNS', 5353: 'mDNS', 853: 'DNS-over-TLS', - 25: 'SMTP', 587: 'SMTP TLS', 465: 'SMTPS', 110: 'POP3', 143: 'IMAP', - 22: 'SSH', 23: 'Telnet', 3389: 'RDP', 5900: 'VNC', - 21: 'FTP', 20: 'FTP Data', 989: 'FTPS', 990: 'FTPS Control', - 3306: 'MySQL', 5432: 'PostgreSQL', 6379: 'Redis', 27017: 'MongoDB', - 1194: 'OpenVPN', 51820: 'WireGuard', 500: 'IPSec IKE', 4500: 'IPSec NAT-T', - 67: 'DHCP', 68: 'DHCP Client', 123: 'NTP', - 6881: 'BitTorrent', 6882: 'BitTorrent', 6883: 'BitTorrent', - 9993: 'ZeroTier VPN', -}; - -async function fetchAgents(siteUuid = null) { - const data = await netifyFetch('/data/stats/top/agent/download', { filter_interval: 43200, settings_limit: 100 }, null, siteUuid); - if (!data || !Array.isArray(data)) return []; - const list = data.map(r => ({ - id: r.agent?.id, - uuid: r.agent?.uuid, - label: r.agent?.label, - })).filter(a => a.uuid); - - for (const a of list) { - if (a.uuid && a.id) agentMap[a.uuid] = a.id; - } - - // Secondary validation: if this site already has data in MongoDB, only return agents - // that have at least one summary record for THIS site_uuid. This prevents the - // org-level stats endpoint from cross-contaminating agents across sites. - if (siteUuid) { - try { - const mongoose = require('mongoose'); - if (mongoose.connection.readyState === 1) { - const db = mongoose.connection.db; - const knownAgents = await db.collection('summaries').distinct('agent_uuid', { - site_uuid: siteUuid, - agent_uuid: { $ne: null }, - }); - - if (knownAgents.length > 0) { - const knownSet = new Set(knownAgents); - const validated = list.filter(a => knownSet.has(a.uuid)); - // If MongoDB cross-check yields results, use the validated list. - // On first boot (no DB data yet), fall through and use the full API list. - if (validated.length > 0) return validated; - } - } - } catch (err) { - console.warn('[Collector] fetchAgents DB cross-check failed:', err.message); - } - } - - return list; -} - - -async function fetchBandwidthSummary(interval = 1440, agentUuid = null, siteUuid = null) { - const [dlData, ulData, flowsData] = await Promise.all([ - netifyFetch('/data/stats/top/local_ip/download', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), - netifyFetch('/data/stats/top/local_ip/upload', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), - netifyFetch('/data/stats/top/local_ip/flow_count', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), - ]); - const bandwidth_down = dlData?.reduce((s, r) => s + (r.download ?? 0), 0) ?? 0; - const bandwidth_up = ulData?.reduce((s, r) => s + (r.upload ?? 0), 0) ?? 0; - const total_devices = dlData?.length ?? 0; - const active_flows = flowsData?.reduce((s, r) => s + (r.flows ?? r.flow_count ?? 0), 0) ?? 0; - return { bandwidth_down, bandwidth_up, total_devices, active_flows, total_threats: 0 }; -} - -async function fetchTopApps(interval = 1440, limit = 200, agentUuid = null, siteUuid = null) { - const [dlData, ulData] = await Promise.all([ - netifyFetch('/data/stats/top/application/download', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), - netifyFetch('/data/stats/top/application/upload', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), - ]); - if (!dlData) return null; - const ulMap = {}; - if (ulData) { - for (const r of ulData) { - const id = r.application?.id; - if (id) ulMap[id] = r.upload ?? 0; - } - } - return dlData.map(r => ({ - application: { - id: r.application?.id ?? null, - label: r.application?.label ?? 'Unknown', - tag: r.application?.tag ?? null, - }, - download: r.download ?? 0, - upload: ulMap[r.application?.id] ?? 0, - flows: r.flows ?? 0, - })); -} - -async function fetchDiscoveredDevices(interval = 1440, limit = 500, agentUuid = null, siteUuid = null) { - const [dlData, ulData] = await Promise.all([ - netifyFetch('/data/stats/top/local_ip/download', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), - netifyFetch('/data/stats/top/local_ip/upload', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), - ]); - if (!dlData) return null; - const ulMap = {}; - if (ulData) { - for (const r of ulData) { - const ip = r.local_ip?.address ?? String(r.local_ip); - ulMap[ip] = r.upload ?? 0; - } - } - return dlData.map(r => { - const ip = r.local_ip?.address ?? String(r.local_ip ?? ''); - return { - ip_address: ip, - mac_address: r.local_mac ?? null, - device_label: r.device_label ?? ip, - device_type: r.device_type ?? null, - os_label: r.os_label ?? null, - manufacturer: r.manufacturer ?? null, - download: r.download ?? 0, - upload: ulMap[ip] ?? 0, - flows: r.flows ?? 0, - last_seen: r.last_seen_at?.date ?? null, - }; - }).filter(d => d.ip_address); -} - -async function fetchDeviceApps(ipAddress, interval = 1440, limit = 50, agentUuid = null, siteUuid = null) { - const ipFilter = JSON.stringify([ipAddress]); - const [dlData, ulData] = await Promise.all([ - netifyFetch('/data/stats/top/application/download', { filter_interval: interval, settings_limit: limit, filter_local_ips: ipFilter }, agentUuid, siteUuid), - netifyFetch('/data/stats/top/application/upload', { filter_interval: interval, settings_limit: limit, filter_local_ips: ipFilter }, agentUuid, siteUuid), - ]); - if (!dlData || !Array.isArray(dlData)) return []; - const ulMap = {}; - if (ulData && Array.isArray(ulData)) { - for (const r of ulData) { - const id = r.application?.id; - if (id) ulMap[id] = r.upload ?? 0; - } - } - return dlData.map(r => ({ - app_label: r.application?.label ?? 'Unknown', - app_id: r.application?.id ?? null, - download: r.download ?? 0, - upload: ulMap[r.application?.id] ?? 0, - flows: r.flows ?? 0, - })).filter(a => a.download > 0 || a.upload > 0); -} - -async function fetchFlows(limit = 10000, agentUuid = null, siteUuid = null) { +async function fetchFlows(limit = 1000000, agentUuid = null, siteUuid = null) { const [raw, sniRaw] = await Promise.all([ netifyFetch('/data/flows', { settings_limit: limit }, agentUuid, siteUuid), netifyFetch('/data/stats/top/tls_sni/download', { filter_interval: 1440, settings_limit: 50 }, agentUuid, siteUuid), @@ -163,12 +17,14 @@ async function fetchFlows(limit = 10000, agentUuid = null, siteUuid = null) { if (sniRaw && Array.isArray(sniRaw)) { for (const r of sniRaw) { const sni = typeof r.tls_sni === 'object' ? r.tls_sni?.label : r.tls_sni; - if (sni && typeof sni === 'string' && sni.trim() !== '') sniList.push(sni.replace(/^\*\./, '').trim()); + if (sni && typeof sni === 'string' && sni.trim() !== '') { + sniList.push(sni.replace(/^\*\./, '').trim()); + } } } return raw.map(r => { const port = r.remote_port ?? null; - const portService = port ? (PORT_SERVICE_MAP[port] ?? `Port ${port}`) : null; + const portService = port ? (stats.PORT_SERVICE_MAP[port] ?? `Port ${port}`) : null; const appLabel = r.application?.label || portService; const domain = r.tls_sni || r.dns_hostname || r.hostname || null; return { @@ -188,84 +44,17 @@ async function fetchFlows(limit = 10000, agentUuid = null, siteUuid = null) { }).filter(f => f.src_ip); } -async function fetchCyberThreats(agentUuid = null, siteUuid = null) { - const ipRepData = await netifyFetch('/data/stats/top/remote_ip/download', { filter_interval: 1440, settings_limit: 50 }, agentUuid, siteUuid); - if (!ipRepData || !Array.isArray(ipRepData)) return []; - const SUSPICIOUS_PORTS = new Set([23, 4444, 1337, 6667, 31337, 12345, 54321, 4899, 5554, 9999]); - const threats = []; - for (const r of ipRepData) { - const ip = r.remote_ip?.address ?? null; - const port = r.remote_port ?? 0; - if (ip && SUSPICIOUS_PORTS.has(port)) { - threats.push({ - threat_type: `Suspicious Port ${port}`, - severity: 'High', - src_ip: null, - dst_ip: ip, - dst_port: port, - protocol: r.ip_protocol?.label ?? null, - description: `Suspicious outbound connection to ${ip}:${port}`, - event_at: new Date().toISOString(), - }); - } - } - return threats; -} - -async function fetchEvents(limit = 100, agentUuid = null, siteUuid = null) { - const raw = await netifyFetch('/event/events', { settings_limit: limit }, agentUuid, siteUuid); - if (!raw || !Array.isArray(raw)) return []; - return raw.map(r => { - let msg = r.label || ''; - if (r.description) { - try { - const descObj = JSON.parse(r.description); - msg = descObj.default || r.label || ''; - if (descObj.tags) { - for (const k in descObj.tags) { - const tagVal = descObj.tags[k]; - const val = Array.isArray(tagVal) ? (tagVal[0] === 'Unknown' && tagVal[1] ? tagVal[1] : tagVal[0]) : tagVal; - msg = msg.replace(`{{ ${k} }}`, val).replace(`{{${k}}}`, val); - } - } - } catch (e) { - msg = r.description; - } - } - let sevLabel = 'Info'; - if (r.severity >= 30) sevLabel = 'Critical'; - else if (r.severity >= 20) sevLabel = 'High'; - else if (r.severity >= 10) sevLabel = 'Warning'; - let srcIp = null; - if (r.description) { - try { - const descObj = JSON.parse(r.description); - srcIp = descObj.tags?.device_ip || descObj.tags?.ip || null; - } catch {} - } - return { - event_id: r.id || null, - event_type: r.basename || 'unknown', - severity: sevLabel, - description: msg, - category_label: r.category?.label || 'Intelligence', - ip_address: srcIp, - mac_address: r.additional?.device?.mac?.address || null, - event_at: r.created_at?.date ? new Date(r.created_at.date) : new Date() - }; - }); -} - module.exports = { - fetchAgents, - fetchBandwidthSummary, - fetchTopApps, - fetchDiscoveredDevices, - fetchDeviceApps, fetchFlows, - fetchCyberThreats, - fetchEvents, + fetchAgents: stats.fetchAgents, + fetchBandwidthSummary: stats.fetchBandwidthSummary, + fetchTopApps: stats.fetchTopApps, + fetchDiscoveredDevices: stats.fetchDiscoveredDevices, + fetchDeviceApps: stats.fetchDeviceApps, + fetchCyberThreats: stats.fetchCyberThreats, + fetchEvents: stats.fetchEvents, + syncApplicationDictionary: stats.syncApplicationDictionary, BASE_URL, - PORT_SERVICE_MAP, + PORT_SERVICE_MAP: stats.PORT_SERVICE_MAP, ...telemetry, }; diff --git a/proxy/netifyClientStats.js b/proxy/netifyClientStats.js new file mode 100644 index 0000000..48e6278 --- /dev/null +++ b/proxy/netifyClientStats.js @@ -0,0 +1,238 @@ +// proxy/netifyClientStats.js +// ───────────────────────────────────────────────────────────────────────────── +// Supplementary fetchers split from netifyClient.js to satisfy the 256-line limit. +// ───────────────────────────────────────────────────────────────────────────── + +const { netifyFetch, agentMap } = require('./netifyClientCore'); +const PORT_SERVICE_MAP = { + 80: 'HTTP', 443: 'HTTPS / TLS', 8080: 'HTTP Alt', 8443: 'HTTPS Alt', 53: 'DNS', 5353: 'mDNS', 853: 'DNS-over-TLS', 25: 'SMTP', 587: 'SMTP TLS', 465: 'SMTPS', 110: 'POP3', 143: 'IMAP', 22: 'SSH', 23: 'Telnet', 3389: 'RDP', 5900: 'VNC', 21: 'FTP', 20: 'FTP Data', 989: 'FTPS', 990: 'FTPS Control', 3306: 'MySQL', 5432: 'PostgreSQL', 6379: 'Redis', 27017: 'MongoDB', 1194: 'OpenVPN', 51820: 'WireGuard', 500: 'IPSec IKE', 4500: 'IPSec NAT-T', 67: 'DHCP', 68: 'DHCP Client', 123: 'NTP', 6881: 'BitTorrent', 6882: 'BitTorrent', 6883: 'BitTorrent', 9993: 'ZeroTier VPN', +}; + +async function fetchAgents(siteUuid = null) { + // Use /data/stats/top/agent/download — the only working agent-listing endpoint + // in Netify Informatics API. /data/agents returns 404 (only on portal API). + // filter_interval max = 525600 min (365 days) per Netify API validation. + // Use max interval to catch ALL agents including low-traffic / inactive ones. + // DB cross-check removed — was blocking new agents from appearing. + const data = await netifyFetch('/data/stats/top/agent/download', { + filter_interval: 525600, + settings_limit: 1000000, + }, null, siteUuid); + if (!data || !Array.isArray(data)) return []; + + const list = data.map(r => ({ + id: r.agent?.id, + uuid: r.agent?.uuid || r.agent?.serial, + serial: r.agent?.serial, + label: r.agent?.label || r.agent?.serial, + provisioned: true, + activated: true, + last_seen_at: r.agent?.last_seen_at ?? null, + })).filter(a => a.uuid); + + // Populate the agentMap (uuid → id) for downstream filter_agents usage + for (const a of list) { + if (a.uuid && a.id) agentMap[a.uuid] = a.id; + } + + return list; +} + +async function fetchBandwidthSummary(interval = 1440, agentUuid = null, siteUuid = null) { + const [dlData, ulData, flowsData] = await Promise.all([ + netifyFetch('/data/stats/top/local_ip/download', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), + netifyFetch('/data/stats/top/local_ip/upload', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), + netifyFetch('/data/stats/top/local_ip/flow_count', { filter_interval: interval, settings_limit: 500 }, agentUuid, siteUuid), + ]); + const bandwidth_down = dlData?.reduce((s, r) => s + (r.download ?? 0), 0) ?? 0; + const bandwidth_up = ulData?.reduce((s, r) => s + (r.upload ?? 0), 0) ?? 0; + const total_devices = dlData?.length ?? 0; + const active_flows = flowsData?.reduce((s, r) => s + (r.flows ?? r.flow_count ?? 0), 0) ?? 0; + return { bandwidth_down, bandwidth_up, total_devices, active_flows, total_threats: 0 }; +} + +async function fetchTopApps(interval = 1440, limit = 200, agentUuid = null, siteUuid = null) { + const [dlData, ulData] = await Promise.all([ + netifyFetch('/data/stats/top/application/download', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), + netifyFetch('/data/stats/top/application/upload', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), + ]); + if (!dlData) return null; + const ulMap = {}; + if (ulData) { + for (const r of ulData) { + const id = r.application?.id; + if (id) ulMap[id] = r.upload ?? 0; + } + } + return dlData.map(r => ({ + application: { id: r.application?.id ?? null, label: r.application?.label ?? 'Unknown', tag: r.application?.tag ?? null }, + download: r.download ?? 0, upload: ulMap[r.application?.id] ?? 0, flows: r.flows ?? 0, + })); +} + +async function fetchDiscoveredDevices(interval = 1440, limit = 500, agentUuid = null, siteUuid = null) { + const [dlData, ulData] = await Promise.all([ + netifyFetch('/data/stats/top/local_ip/download', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), + netifyFetch('/data/stats/top/local_ip/upload', { filter_interval: interval, settings_limit: limit }, agentUuid, siteUuid), + ]); + if (!dlData) return null; + const ulMap = {}; + if (ulData) { + for (const r of ulData) { + const ip = r.local_ip?.address ?? String(r.local_ip); + ulMap[ip] = r.upload ?? 0; + } + } + return dlData.map(r => { + const ip = r.local_ip?.address ?? String(r.local_ip ?? ''); + return { + ip_address: ip, mac_address: r.local_mac ?? null, device_label: r.device_label ?? ip, device_type: r.device_type ?? null, + os_label: r.os_label ?? null, manufacturer: r.manufacturer ?? null, download: r.download ?? 0, upload: ulMap[ip] ?? 0, + flows: r.flows ?? 0, last_seen: r.last_seen_at?.date ?? null, + }; + }).filter(d => d.ip_address); +} + +async function fetchDeviceApps(ipAddress, interval = 1440, limit = 50, agentUuid = null, siteUuid = null) { + const ipFilter = JSON.stringify([ipAddress]); + const [dlData, ulData] = await Promise.all([ + netifyFetch('/data/stats/top/application/download', { filter_interval: interval, settings_limit: limit, filter_local_ips: ipFilter }, agentUuid, siteUuid), + netifyFetch('/data/stats/top/application/upload', { filter_interval: interval, settings_limit: limit, filter_local_ips: ipFilter }, agentUuid, siteUuid), + ]); + if (!dlData || !Array.isArray(dlData)) return []; + const ulMap = {}; + if (ulData && Array.isArray(ulData)) { + for (const r of ulData) { + const id = r.application?.id; + if (id) ulMap[id] = r.upload ?? 0; + } + } + return dlData.map(r => ({ + app_label: r.application?.label ?? 'Unknown', + app_id: r.application?.id ?? null, + download: r.download ?? 0, + upload: ulMap[r.application?.id] ?? 0, + flows: r.flows ?? 0, + })).filter(a => a.download > 0 || a.upload > 0); +} + +async function fetchCyberThreats(agentUuid = null, siteUuid = null) { + const ipRepData = await netifyFetch('/data/stats/top/remote_ip/download', { filter_interval: 1440, settings_limit: 50 }, agentUuid, siteUuid); + if (!ipRepData || !Array.isArray(ipRepData)) return []; + const SUSPICIOUS_PORTS = new Set([23, 4444, 1337, 6667, 31337, 12345, 54321, 4899, 5554, 9999]); + const threats = []; + for (const r of ipRepData) { + const ip = r.remote_ip?.address ?? null; + const port = r.remote_port ?? 0; + if (ip && SUSPICIOUS_PORTS.has(port)) { + threats.push({ + threat_type: `Suspicious Port ${port}`, + severity: 'High', + src_ip: null, + dst_ip: ip, + dst_port: port, + protocol: r.ip_protocol?.label ?? null, + description: `Suspicious outbound connection to ${ip}:${port}`, + event_at: new Date().toISOString(), + }); + } + } + return threats; +} + +async function fetchEvents(limit = 100, agentUuid = null, siteUuid = null) { + const raw = await netifyFetch('/event/events', { settings_limit: limit }, agentUuid, siteUuid); + if (!raw || !Array.isArray(raw)) return []; + return raw.map(r => { + let msg = r.label || ''; + if (r.description) { + try { + const descObj = JSON.parse(r.description); + msg = descObj.default || r.label || ''; + if (descObj.tags) { + for (const k in descObj.tags) { + const tagVal = descObj.tags[k]; + const val = Array.isArray(tagVal) ? (tagVal[0] === 'Unknown' && tagVal[1] ? tagVal[1] : tagVal[0]) : tagVal; + msg = msg.replace(`{{ ${k} }}`, val).replace(`{{${k}}}`, val); + } + } + } catch (e) { + msg = r.description; + } + } + let sevLabel = 'Info'; + if (r.severity >= 30) sevLabel = 'Critical'; + else if (r.severity >= 20) sevLabel = 'High'; + else if (r.severity >= 10) sevLabel = 'Warning'; + let srcIp = null; + if (r.description) { + try { + const descObj = JSON.parse(r.description); + srcIp = descObj.tags?.device_ip || descObj.tags?.ip || null; + } catch {} + } + return { + event_id: r.id || null, + event_type: r.basename || 'unknown', + severity: sevLabel, + description: msg, + category_label: r.category?.label || 'Intelligence', + ip_address: srcIp, + mac_address: r.additional?.device?.mac?.address || null, + event_at: r.created_at?.date ? new Date(r.created_at.date) : new Date() + }; + }); +} + +async function syncApplicationDictionary() { + const mongoose = require('mongoose'); + const { LookupApp } = require('./models/Schemas'); + + console.log('[Netify] Fetching application catalog...'); + const allApps = await netifyFetch('/lookup/applications', { settings_limit: 5000 }); + if (!allApps || !Array.isArray(allApps)) { + console.error('[Netify] Failed to fetch application dictionary.'); + return; + } + + console.log(`[Netify] Application catalog fetched successfully. Got ${allApps.length} apps.`); + if (allApps.length === 0) return; + + console.log(`[Netify] Syncing ${allApps.length} application definitions to MongoDB...`); + await LookupApp.deleteMany({}); + + const batchSize = 100; + for (let i = 0; i < allApps.length; i += batchSize) { + const batch = allApps.slice(i, i + batchSize); + await LookupApp.insertMany(batch.map(app => ({ + id: app.id, + name: app.name, + label: app.label, + tag: app.tag, + description: app.description, + full_name: app.full_name || app.application?.full_label || null, + favicon: app.favicon || app.application?.favicon || null, + icon: app.icon || app.application?.icon || null, + logo: app.logo || app.application?.logo || null, + application_category: { + id: app.application_category?.id, + name: app.application_category?.name, + label: app.application_category?.label, + tag: app.application_category?.tag + } + }))); + } + console.log('[Netify] ✓ Application dictionary sync completed.'); +} + +module.exports = { + fetchAgents, + fetchBandwidthSummary, + fetchTopApps, + fetchDiscoveredDevices, + fetchDeviceApps, + fetchCyberThreats, + fetchEvents, + syncApplicationDictionary, + PORT_SERVICE_MAP +}; diff --git a/proxy/scheduler.js b/proxy/scheduler.js index e1f14b1..ad4ac8c 100644 --- a/proxy/scheduler.js +++ b/proxy/scheduler.js @@ -4,6 +4,7 @@ const cron = require('node-cron'); const { collectAllAgents, collectSpecificAgent, collectSpecificAgents } = require('./collector'); +const { syncApplicationDictionary } = require('./netifyClient'); // Mode: 'all' = collect all agents, 'agent' = collect one specific agent, 'agents' = collect multiple agents const COLLECT_MODE = process.env.PROXY_COLLECT_MODE || 'all'; @@ -97,7 +98,11 @@ function startScheduler() { // Initial run immediately on startup (async, do not block server start) setTimeout(async () => { // 1. Sync dictionary first - // await netifyClient.syncApplicationDictionary(); + try { + await syncApplicationDictionary(); + } catch (err) { + console.error('[Scheduler] Error syncing application dictionary:', err.message); + } // 2. Start normal telemetry collection runCollection().catch(err => console.error('[Scheduler] Initial run error:', err.message)); diff --git a/public/api/uploads/profile-1782896485110-507996343.png b/public/api/uploads/profile-1782896485110-507996343.png new file mode 100644 index 0000000000000000000000000000000000000000..89f5b7fa2cdf6f20d04e2ef6dfe5ddbf3bf89051 GIT binary patch literal 439013 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 z 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