Add Orange Pi Zero 3 specific deployment guide
This commit is contained in:
@@ -0,0 +1,214 @@
|
|||||||
|
# Net Alerter Daemon Deployment to Orange Pi Zero 3 (10.0.0.0)
|
||||||
|
|
||||||
|
## Target Device
|
||||||
|
- **IP**: 10.0.0.0
|
||||||
|
- **OS**: Orange Pi OS (Debian-based)
|
||||||
|
- **User**: root (required for CAP_NET_RAW and Netlink access)
|
||||||
|
|
||||||
|
## Pre-Deployment Checklist
|
||||||
|
|
||||||
|
- [ ] Verify SSH access: `ssh root@10.0.0.0 "uname -a"`
|
||||||
|
- [ ] Verify Python 3: `ssh root@10.0.0.0 "python3 --version"`
|
||||||
|
- [ ] Verify device is on network and has Ethernet/WiFi
|
||||||
|
- [ ] Have Matrix bot credentials ready (homeserver, token, room ID)
|
||||||
|
|
||||||
|
## Step 1: Prepare Matrix Credentials
|
||||||
|
|
||||||
|
Get a fresh access token for the net-alerter bot account:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST https://m.example.org/_matrix/client/v3/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"type": "m.login.password",
|
||||||
|
"identifier": {"type": "m.id.user", "user": "net-alerter"},
|
||||||
|
"password": "<password>"
|
||||||
|
}' | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])"
|
||||||
|
```
|
||||||
|
|
||||||
|
You should get a token like `syt_...`. Save this.
|
||||||
|
|
||||||
|
## Step 2: Deploy Using Deployment Script (Recommended)
|
||||||
|
|
||||||
|
From your local machine (where you have SSH configured):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/tools/bigbrother/net_alerter
|
||||||
|
|
||||||
|
# Deploy and configure automatically
|
||||||
|
./deploy-daemon.sh root@10.0.0.0
|
||||||
|
|
||||||
|
# Script will prompt you to update .env with MATRIX_ACCESS_TOKEN
|
||||||
|
ssh root@10.0.0.0 "cat > /opt/net_alerter/.env <<EOF
|
||||||
|
MATRIX_HOMESERVER=https://m.example.org
|
||||||
|
MATRIX_ACCESS_TOKEN=<your_token_from_step_1>
|
||||||
|
MATRIX_ROOM_ID=!REDACTED:example.org
|
||||||
|
EOF
|
||||||
|
chmod 600 /opt/net_alerter/.env"
|
||||||
|
|
||||||
|
# Restart service to pick up new credentials
|
||||||
|
ssh root@10.0.0.0 "systemctl restart net_alerter"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 3: Manual Deployment (if script fails)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create directory
|
||||||
|
ssh root@10.0.0.0 "mkdir -p /opt/net_alerter"
|
||||||
|
|
||||||
|
# Copy daemon
|
||||||
|
scp ~/tools/bigbrother/net_alerter/net_alerter.py root@10.0.0.0:/opt/net_alerter/
|
||||||
|
|
||||||
|
# Copy systemd unit
|
||||||
|
scp ~/tools/bigbrother/net_alerter/net_alerter.service root@10.0.0.0:/etc/systemd/system/
|
||||||
|
|
||||||
|
# Create config file
|
||||||
|
ssh root@10.0.0.0 "cat > /opt/net_alerter/.env <<EOF
|
||||||
|
MATRIX_HOMESERVER=https://m.example.org
|
||||||
|
MATRIX_ACCESS_TOKEN=<your_token>
|
||||||
|
MATRIX_ROOM_ID=!REDACTED:example.org
|
||||||
|
EOF
|
||||||
|
chmod 600 /opt/net_alerter/.env"
|
||||||
|
|
||||||
|
# Remove old cron entries
|
||||||
|
ssh root@10.0.0.0 "crontab -l 2>/dev/null | grep -v net_alerter | crontab -"
|
||||||
|
|
||||||
|
# Enable and start
|
||||||
|
ssh root@10.0.0.0 "
|
||||||
|
systemctl daemon-reload && \
|
||||||
|
systemctl enable net_alerter && \
|
||||||
|
systemctl restart net_alerter
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 4: Verify Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check service status
|
||||||
|
ssh root@10.0.0.0 "systemctl status net_alerter --no-pager"
|
||||||
|
|
||||||
|
# View startup logs (should see "Seeded X devices")
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter -n 30 --no-pager"
|
||||||
|
|
||||||
|
# Monitor in real-time (Ctrl+C to stop)
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter -f --no-pager"
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected startup log:
|
||||||
|
```
|
||||||
|
2025-04-08T12:34:56 [INFO] Net alerter starting on interface eth0
|
||||||
|
2025-04-08T12:34:57 [INFO] Seeded 8 devices from ARP cache
|
||||||
|
2025-04-08T12:34:57 [INFO] DHCP sniffer started on eth0
|
||||||
|
2025-04-08T12:34:57 [INFO] Netlink neighbor watcher started
|
||||||
|
2025-04-08T12:34:57 [INFO] Net alerter running — DHCP sniffer + Netlink neighbor watcher active
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Test Alerting
|
||||||
|
|
||||||
|
Connect a test device (laptop, phone) to the network and watch for alerts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In one terminal, monitor logs:
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter -f"
|
||||||
|
|
||||||
|
# In another, connect your test device and look for:
|
||||||
|
# [NET] ARRIVED: test-device (192.168.1.XX) [Vendor] MAC:xx:xx:xx:xx:xx:xx
|
||||||
|
```
|
||||||
|
|
||||||
|
Also check Matrix room — alerts should appear in the configured room.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Service not running
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "systemctl status net_alerter"
|
||||||
|
```
|
||||||
|
If failed, check logs:
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter -n 50 | tail -20"
|
||||||
|
```
|
||||||
|
|
||||||
|
### No devices detected
|
||||||
|
- Check ARP cache: `ssh root@10.0.0.0 "ip neigh show"`
|
||||||
|
- Check interface: `ssh root@10.0.0.0 "ip link show"`
|
||||||
|
- Ensure interface is up and connected
|
||||||
|
|
||||||
|
### Alerts not reaching Matrix
|
||||||
|
- Verify token: `curl -s https://m.example.org/_matrix/client/v3/account/whoami -H "Authorization: Bearer <token>"` should return user info
|
||||||
|
- Verify bot is in room (check Matrix room members)
|
||||||
|
- Check logs for HTTP errors: `journalctl -u net_alerter -e`
|
||||||
|
|
||||||
|
### High CPU/Memory
|
||||||
|
- Unlikely — monitor with: `ssh root@10.0.0.0 "top -b -n 1 -p $(pgrep -f net_alerter)"`
|
||||||
|
- Check for spam in logs (malformed packets?)
|
||||||
|
|
||||||
|
## Logs and Debugging
|
||||||
|
|
||||||
|
### View Recent Logs
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter --since '30 min ago'"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Follow Live Logs
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter -f"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Daemon Log File
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "tail -f /opt/net_alerter/net_alerter.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Maintenance
|
||||||
|
|
||||||
|
### Reload Configuration
|
||||||
|
After updating `.env`:
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "systemctl restart net_alerter"
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Tracked Devices
|
||||||
|
The daemon tracks known devices in memory (not persisted). Check active count in logs:
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "journalctl -u net_alerter | grep 'Tracking.*devices' | tail -5"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stop Service
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "systemctl stop net_alerter"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart Service
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "systemctl restart net_alerter"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uninstall
|
||||||
|
|
||||||
|
To remove net_alerter and restore cron (if needed):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@10.0.0.0 "
|
||||||
|
systemctl stop net_alerter
|
||||||
|
systemctl disable net_alerter
|
||||||
|
rm /etc/systemd/system/net_alerter.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
rm -rf /opt/net_alerter
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Characteristics
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| CPU Usage | <1% idle (thread sleeping on socket reads) |
|
||||||
|
| Memory | ~15-20 MB (Python + loaded OUI database) |
|
||||||
|
| Network Traffic | Passive only (no active probing) |
|
||||||
|
| Startup Time | ~2 seconds (ARP cache seed) |
|
||||||
|
| Detection Latency | <100ms (Netlink events) or ~5-10min (ARP timeout) |
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
- Set up monitoring/alerting for service health
|
||||||
|
- Configure retention policy for logs (logrotate)
|
||||||
|
- Document any custom configuration in site-specific notes
|
||||||
Reference in New Issue
Block a user