Fixed Two Display Issues:
1. Version Parsing (was showing "regex)")
Before: Used awk '{print $NF}' which extracted last field
netifyd -V output: "Netify Agent/5.2.1 (...regex)"
Result: Displayed "regex)" as version
After: Use sed to extract version number
Pattern: sed 's/.*Agent\/\([0-9.]*\).*/\1/'
Result: Correctly displays "5.2.1"
2. Socket Connectivity (was showing "Disconnected")
Before: Checked for unix socket file existence
Problem: Netifyd doesn't create unix socket in current config
Result: Always showed "Disconnected"
After: Check if netifyd is running and producing data
Logic: Process running + status.json exists + readable
Result: Correctly shows "Connected" when service is operational
Also: Removed stat command usage (not available on OpenWrt)
Technical Details:
- Socket detection now based on service health, not socket file
- Works with both sink-only and socket-enabled configurations
- Simplified logic compatible with busybox/OpenWrt environment
Dashboard Now Shows:
✓ Version: 5.2.1 (was: regex))
✓ Socket: Connected (was: Disconnected)
✓ Status: Running
✓ Uptime: Accurate duration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Issue Identified:
- Netifyd 5.2.1 was crashing with JSON assertion error on startup
- Error: "Assertion failed: m_it.object_iterator != m_object->m_data.m_value.object->end()"
- Root cause: Legacy categories.json format incompatible with netifyd 5.2.1+
The Fix:
- Removed auto-creation of netify-categories.json from UCI defaults
- Let netifyd manage this file itself or operate without it
- Both approaches work correctly with netifyd 5.2.1
Technical Details:
The UCI defaults script was creating categories.json in v1.0 format:
```json
{
"version": "1.0",
"categories": []
}
```
This format is detected as "legacy" by netifyd 5.2.1, which then attempts
to parse it with newer code expecting a different structure. When accessing
JSON object iterators, the assertion fails because expected keys don't exist.
Solution: Don't create the file. Netifyd works perfectly without it and will
create its own if needed in the correct format for its version.
Verified Working:
- Netifyd now starts successfully
- 22 active flows captured on br-lan and br-wan
- Both interfaces online with 0% packet drops
- CPU utilization: 0.1%
- Memory: 14.5 MB
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Removed Features:
- Debug mode toggle button
- Debug panel and log display
- Update indicator (count and time since last update)
- Debug logging functions (debug, toggleDebug)
- Debug state variables (debugMode, updateCount, errorCount, lastUpdate)
- REFRESH-DEBUG.md documentation
Preserved Features:
✅ Race condition fix (containers created before poll.add)
✅ Auto-refresh functionality (5-second polling)
✅ Data caching (latestDashboardData, latestTopApps, latestTopProtocols)
✅ Application aggregation function
✅ All core rendering functions
✅ Service control and statistics display
Benefits:
- Cleaner, production-ready code
- Reduced code complexity (~120 lines removed)
- Maintains all critical functionality
- Better performance (no debug overhead)
The dashboard now provides a streamlined interface focused on
displaying network intelligence data without development debug features.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
CrowdSec Central API (CAPI) Fixed:
- Removed code that disabled online_client on install
- Added proper CAPI registration in crowdsec.defaults
- Registration now works (previous 403 errors were transient)
- Graceful fallback if CAPI registration fails
CAPI Features Now Working:
- Threat intelligence sharing enabled
- Pulling community blocklist (14,997+ IPs)
- Hub updates working without 403 errors
- SSH bruteforce: 12,388 bans from CAPI
- Generic scans: 1,176 bans from CAPI
- SSH exploits: 1,433 bans from CAPI
Registration Flow:
1. Create /etc/machine-id if missing
2. Register local API machine
3. Register with Central API (CAPI)
4. On CAPI failure, create minimal credentials file
5. Update hub index
6. Install default collections
Benefits of CAPI Integration:
- Real-time threat intelligence from global network
- Community-contributed IP blocklists
- Automatic updates for detection scenarios
- Signal sharing to help protect others
- Enhanced protection without manual IP list management
NetIfyd Dashboard Improvements:
- Added data caching for smoother updates
- Application aggregation function
- Fallback stats when data temporarily unavailable
- Better handling of undefined values
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Dashboard Refresh Problem Fixed:
- Race condition where poll.add() was called before containers existed
- Containers were undefined during first poll callback
- DOM updates failed silently with no error logging
- Fixed by creating containers BEFORE setting up polling
Debug Features Added:
- Toggle debug mode with button in header
- Visual debug panel showing last 20 log entries
- Browser console logging with timestamps
- Live update indicator (count + time since last update)
- Error tracking and counting
- Detailed logging of all RPC calls and responses
Debug Panel Features:
- Timestamps for all events
- JSON data preview for API responses
- Auto-scroll with newest entries at top
- Max 20 entries to prevent memory issues
- Hidden by default, shown when debug enabled
Update Indicator:
- Shows "Updates: N | Last: Xs ago" in header
- Updates every second
- Visual feedback that polling is working
- Easy to spot stalled/broken polling
Error Handling:
- Try/catch around all poll callbacks
- Errors logged to debug panel and console
- Error counting for diagnostics
- Polling continues even after errors
Code Improvements:
- Proper container creation order
- Better error handling in load() and polling
- Debug logging throughout lifecycle
- Performance metrics tracking
Documentation:
- Complete analysis in REFRESH-DEBUG.md
- Troubleshooting guide
- Debug mode usage instructions
- Performance considerations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Network Intelligence Dashboard Enhancements:
- Add detailed protocol breakdown (TCP/UDP/ICMP) with visual bars
- Display flow metrics (active, expired, purged)
- Show CPU and memory usage for netifyd process
- Add IP bytes vs wire bytes differentiation
- Enhanced stat cards with subtitles and better formatting
RPC Backend Improvements:
- Add tcp_packets, udp_packets, icmp_packets metrics
- Add ip_bytes (payload without ethernet overhead)
- Add flows_active, flows_expired, flows_purged counters
- Add cpu_usage and memory_kb from netifyd status
- Calculate CPU total from user + system time
Directory Structure Fix:
- Create /etc/netify.d/plugins.d on package install
- Create /etc/netify.d/address-groups.d
- Generate minimal netify-categories.json to prevent errors
- Auto-initialize UCI config for secubox-netifyd
- Auto-restart netifyd after directory creation
UCI Configuration:
- Settings: auto_refresh, socket configuration
- Analytics: limits for top apps/protocols/devices
- Data retention configuration
Issue Resolved:
- Netifyd was running but showing 0 flows due to missing directories
- Service now properly captures and analyzes network traffic
- All metrics displaying correctly in dashboard
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Netifyd crée nativement /var/run/netifyd/status.json avec toutes
les stats nécessaires. Le collecteur custom n'est plus nécessaire.
Supprimé:
- /usr/sbin/netifyd-collector
- /etc/cron.d/netifyd-collector
- Installation dans Makefile
Le backend RPC lit maintenant directement le fichier natif de netifyd.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Netifyd crée automatiquement /var/run/netifyd/status.json avec toutes
les stats. Pas besoin de collecteur custom !
Changements:
- Lit flow_count directement depuis le fichier natif
- Compte unique_devices depuis la table ARP (ip neigh)
- Lit dns_hint_cache.cache_size pour applications
- Calcule total_bytes depuis stats.*.wire_bytes
Fix testé sur routeur:
- active_flows: 16 ✓
- unique_devices: 4 ✓
- unique_applications: 5 ✓
- total_bytes: 48302 ✓
Le collecteur n'est plus nécessaire - netifyd gère tout !
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Modifié le collecteur pour fonctionner sans socket Unix.
Parse netifyd -s + table ARP + stats réseau.
- Supprimé dépendance socat
- Parse netifyd -s pour metrics
- Utilise ARP pour device count
- Calcule bytes depuis /sys/class/net
- Mis à jour RPC pour device_count et total_bytes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added netifyd-collector daemon to aggregate real-time statistics from
netifyd and populate the dashboard with actual data.
New Features:
- Added /usr/sbin/netifyd-collector script
- Queries netifyd socket for flow data
- Aggregates devices, applications, protocols
- Writes /var/run/netifyd/status.json
- Runs every minute via cron
- Added /etc/cron.d/netifyd-collector cron job
- Added socat dependency for socket communication
Changes:
- Bumped version to 1.0.2
- Updated Makefile to install collector and cron job
- Fixed dashboard empty metrics issue:
* Unique Devices will now show count
* Applications will now show count
* Total Traffic will now show bytes
This fixes the "0" values issue in dashboard Network Statistics.
Dashboard will now show real metrics after 1 minute of netifyd running.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed critical bug in get_top_applications() and get_top_protocols()
RPC methods where data was extracted with jq but never added to the
JSON output. The functions were using jshn arrays but only echoing
data instead of adding it to the array.
Changes:
- Rewrote get_top_applications() to output complete JSON via jq
- Rewrote get_top_protocols() to output complete JSON via jq
- Removed broken jshn array manipulation
- Added proper fallback to empty arrays when no data available
This fixes the "metrics vides" (empty metrics) issue in LuCI dashboard.
The dashboard will now properly display:
- Top applications with traffic stats
- Top protocols with bandwidth usage
- Flow counts and bytes transferred
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>