mirror of
https://github.com/daniviga/django-ram.git
synced 2026-03-20 23:32:30 +01:00
Compare commits
2 Commits
53c85e017d
...
fbfd207fe8
| Author | SHA1 | Date | |
|---|---|---|---|
|
fbfd207fe8
|
|||
|
e48b35ff4e
|
22
connector/99-dcc-usb-connector.rules
Normal file
22
connector/99-dcc-usb-connector.rules
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Udev rule to auto-start/stop dcc-usb-connector.service when USB device is connected/removed
|
||||||
|
#
|
||||||
|
# This rule detects when a CH340 USB-to-serial adapter (ID 1a86:7523)
|
||||||
|
# is connected/removed on /dev/ttyUSB0, then automatically starts/stops
|
||||||
|
# the dcc-usb-connector.service (user systemd service).
|
||||||
|
#
|
||||||
|
# Installation:
|
||||||
|
# sudo cp 99-dcc-usb-connector.rules /etc/udev/rules.d/
|
||||||
|
# sudo udevadm control --reload-rules
|
||||||
|
# sudo udevadm trigger --subsystem-match=tty
|
||||||
|
#
|
||||||
|
# Testing:
|
||||||
|
# udevadm test /sys/class/tty/ttyUSB0
|
||||||
|
# udevadm monitor --property --subsystem-match=tty
|
||||||
|
#
|
||||||
|
# The service will be started when the device is plugged in and stopped
|
||||||
|
# when the device is unplugged.
|
||||||
|
|
||||||
|
# Match USB device 1a86:7523 on ttyUSB0
|
||||||
|
# TAG+="systemd" tells systemd to track this device
|
||||||
|
# ENV{SYSTEMD_USER_WANTS} starts the service on "add" and stops it on "remove"
|
||||||
|
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", KERNEL=="ttyUSB0", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="dcc-usb-connector.service"
|
||||||
345
connector/INSTALL.md
Normal file
345
connector/INSTALL.md
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
# DCC USB-to-Network Bridge Auto-Start Installation
|
||||||
|
|
||||||
|
This directory contains configuration files to automatically start the `dcc-usb-connector.service` when a specific USB device (CH340 USB-to-serial adapter, ID `1a86:7523`) is connected to `/dev/ttyUSB0`.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The setup uses:
|
||||||
|
- **Udev rule** (`99-dcc-usb-connector.rules`) - Detects USB device connection/disconnection
|
||||||
|
- **Systemd user service** (`dcc-usb-connector.service`) - Bridges serial port to network port 2560
|
||||||
|
- **Installation script** (`install-udev-rule.sh`) - Automated installation helper
|
||||||
|
|
||||||
|
When the USB device is plugged in, the service automatically starts. When unplugged, it stops.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
1. **Operating System**: Linux with systemd and udev
|
||||||
|
2. **Required packages**:
|
||||||
|
```bash
|
||||||
|
sudo dnf install nmap-ncat systemd udev
|
||||||
|
```
|
||||||
|
3. **User permissions**: Your user should be in the `dialout` group:
|
||||||
|
```bash
|
||||||
|
sudo usermod -a -G dialout $USER
|
||||||
|
# Log out and log back in for changes to take effect
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Installation
|
||||||
|
|
||||||
|
Run the installation script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./install-udev-rule.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This script will:
|
||||||
|
- Install the udev rule (requires sudo)
|
||||||
|
- Install the systemd user service to `~/.config/systemd/user/`
|
||||||
|
- Enable systemd lingering for your user
|
||||||
|
- Check for required tools and permissions
|
||||||
|
- Provide testing instructions
|
||||||
|
|
||||||
|
## Manual Installation
|
||||||
|
|
||||||
|
If you prefer to install manually:
|
||||||
|
|
||||||
|
### 1. Install the udev rule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cp 99-dcc-usb-connector.rules /etc/udev/rules.d/
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
sudo udevadm trigger --subsystem-match=tty
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Install the systemd service
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p ~/.config/systemd/user/
|
||||||
|
cp dcc-usb-connector.service ~/.config/systemd/user/
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Enable lingering (optional but recommended)
|
||||||
|
|
||||||
|
This allows your user services to run even when you're not logged in:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo loginctl enable-linger $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
### Test the udev rule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Monitor udev events (plug/unplug device while this runs)
|
||||||
|
udevadm monitor --property --subsystem-match=tty
|
||||||
|
|
||||||
|
# Test udev rule (when device is connected)
|
||||||
|
udevadm test /sys/class/tty/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check service status
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if service is running
|
||||||
|
systemctl --user status dcc-usb-connector.service
|
||||||
|
|
||||||
|
# View service logs
|
||||||
|
journalctl --user -u dcc-usb-connector.service -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test the network bridge
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Connect to the bridge
|
||||||
|
telnet localhost 2560
|
||||||
|
|
||||||
|
# Or using netcat
|
||||||
|
nc localhost 2560
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Automatic Operation
|
||||||
|
|
||||||
|
Once installed, the service will:
|
||||||
|
- **Start automatically** when USB device `1a86:7523` is connected to `/dev/ttyUSB0`
|
||||||
|
- **Stop automatically** when the device is disconnected
|
||||||
|
- Bridge serial communication to network port `2560`
|
||||||
|
|
||||||
|
### Manual Control
|
||||||
|
|
||||||
|
You can still manually control the service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start the service
|
||||||
|
systemctl --user start dcc-usb-connector.service
|
||||||
|
|
||||||
|
# Stop the service
|
||||||
|
systemctl --user stop dcc-usb-connector.service
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
systemctl --user status dcc-usb-connector.service
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
journalctl --user -u dcc-usb-connector.service
|
||||||
|
```
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
### Component Interaction
|
||||||
|
|
||||||
|
```
|
||||||
|
USB Device Connected (1a86:7523 on /dev/ttyUSB0)
|
||||||
|
↓
|
||||||
|
Udev Rule Triggered
|
||||||
|
↓
|
||||||
|
Systemd User Service Started
|
||||||
|
↓
|
||||||
|
stty configures serial port (115200 baud)
|
||||||
|
↓
|
||||||
|
ncat bridges /dev/ttyUSB0 ↔ TCP port 2560
|
||||||
|
↓
|
||||||
|
Client apps connect to localhost:2560
|
||||||
|
```
|
||||||
|
|
||||||
|
### Udev Rule Details
|
||||||
|
|
||||||
|
The udev rule (`99-dcc-usb-connector.rules`) matches:
|
||||||
|
- **Subsystem**: `tty` (TTY/serial devices)
|
||||||
|
- **Vendor ID**: `1a86` (CH340 manufacturer)
|
||||||
|
- **Product ID**: `7523` (CH340 serial adapter)
|
||||||
|
- **Kernel device**: `ttyUSB0` (specific port)
|
||||||
|
|
||||||
|
When matched, it sets `ENV{SYSTEMD_USER_WANTS}="dcc-usb-connector.service"`, telling systemd to start the service.
|
||||||
|
|
||||||
|
### Service Configuration
|
||||||
|
|
||||||
|
The service (`dcc-usb-connector.service`):
|
||||||
|
1. Runs `stty -F /dev/ttyUSB0 -echo 115200` to configure the serial port
|
||||||
|
2. Executes `ncat -n -k -l 2560 </dev/ttyUSB0 >/dev/ttyUSB0` to bridge serial ↔ network
|
||||||
|
3. Uses `KillMode=mixed` for proper process cleanup
|
||||||
|
4. Terminates within 5 seconds when stopped
|
||||||
|
5. **Uses `StopWhenUnneeded=yes`** - This ensures the service stops when the device is removed
|
||||||
|
|
||||||
|
### Auto-Stop Mechanism
|
||||||
|
|
||||||
|
When the USB device is unplugged:
|
||||||
|
1. **Udev detects** the removal event
|
||||||
|
2. **Systemd removes** the device dependency from the service
|
||||||
|
3. **StopWhenUnneeded=yes** tells systemd to automatically stop the service when no longer needed
|
||||||
|
4. **Service terminates** gracefully within 5 seconds
|
||||||
|
|
||||||
|
This combination ensures clean automatic stop without requiring manual intervention or custom scripts.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Service doesn't start automatically
|
||||||
|
|
||||||
|
1. **Check udev rule is loaded**:
|
||||||
|
```bash
|
||||||
|
udevadm test /sys/class/tty/ttyUSB0 | grep SYSTEMD_USER_WANTS
|
||||||
|
```
|
||||||
|
Should show: `ENV{SYSTEMD_USER_WANTS}='dcc-usb-connector.service'`
|
||||||
|
|
||||||
|
2. **Check device is recognized**:
|
||||||
|
```bash
|
||||||
|
lsusb | grep 1a86:7523
|
||||||
|
ls -l /dev/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Verify systemd user instance is running**:
|
||||||
|
```bash
|
||||||
|
systemctl --user status
|
||||||
|
loginctl show-user $USER | grep Linger
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permission denied on /dev/ttyUSB0
|
||||||
|
|
||||||
|
Add your user to the `dialout` group:
|
||||||
|
```bash
|
||||||
|
sudo usermod -a -G dialout $USER
|
||||||
|
# Log out and log back in
|
||||||
|
groups # Verify 'dialout' appears
|
||||||
|
```
|
||||||
|
|
||||||
|
### Device appears as /dev/ttyUSB1 instead of /dev/ttyUSB0
|
||||||
|
|
||||||
|
The udev rule specifically matches `ttyUSB0`. To make it flexible:
|
||||||
|
|
||||||
|
Edit `99-dcc-usb-connector.rules` and change:
|
||||||
|
```
|
||||||
|
KERNEL=="ttyUSB0"
|
||||||
|
```
|
||||||
|
to:
|
||||||
|
```
|
||||||
|
KERNEL=="ttyUSB[0-9]*"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reload:
|
||||||
|
```bash
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
sudo udevadm trigger --subsystem-match=tty
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service starts but ncat fails
|
||||||
|
|
||||||
|
1. **Check ncat is installed**:
|
||||||
|
```bash
|
||||||
|
which ncat
|
||||||
|
ncat --version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Verify serial port works**:
|
||||||
|
```bash
|
||||||
|
stty -F /dev/ttyUSB0
|
||||||
|
cat /dev/ttyUSB0 # Should not error
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check port 2560 is available**:
|
||||||
|
```bash
|
||||||
|
netstat -tuln | grep 2560
|
||||||
|
# Should be empty if nothing is listening
|
||||||
|
```
|
||||||
|
|
||||||
|
### View detailed logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Follow service logs in real-time
|
||||||
|
journalctl --user -u dcc-usb-connector.service -f
|
||||||
|
|
||||||
|
# View all logs for the service
|
||||||
|
journalctl --user -u dcc-usb-connector.service
|
||||||
|
|
||||||
|
# View with timestamps
|
||||||
|
journalctl --user -u dcc-usb-connector.service -o short-iso
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uninstallation
|
||||||
|
|
||||||
|
To remove the auto-start feature:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Remove udev rule
|
||||||
|
sudo rm /etc/udev/rules.d/99-dcc-usb-connector.rules
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
sudo udevadm trigger --subsystem-match=tty
|
||||||
|
|
||||||
|
# Remove systemd service
|
||||||
|
systemctl --user stop dcc-usb-connector.service
|
||||||
|
rm ~/.config/systemd/user/dcc-usb-connector.service
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
|
||||||
|
# (Optional) Disable lingering
|
||||||
|
sudo loginctl disable-linger $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Configuration
|
||||||
|
|
||||||
|
### Customize for different USB device
|
||||||
|
|
||||||
|
Edit `99-dcc-usb-connector.rules` and change:
|
||||||
|
- `ATTRS{idVendor}=="1a86"` - USB vendor ID
|
||||||
|
- `ATTRS{idProduct}=="7523"` - USB product ID
|
||||||
|
|
||||||
|
Find your device IDs with:
|
||||||
|
```bash
|
||||||
|
lsusb
|
||||||
|
# Output: Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics ...
|
||||||
|
# ^^^^:^^^^
|
||||||
|
# VID PID
|
||||||
|
```
|
||||||
|
|
||||||
|
### Change network port
|
||||||
|
|
||||||
|
Edit `dcc-usb-connector.service` and change:
|
||||||
|
```
|
||||||
|
ExecStart=/usr/bin/bash -c "/usr/bin/ncat -n -k -l 2560 ...
|
||||||
|
```
|
||||||
|
Replace `2560` with your desired port number.
|
||||||
|
|
||||||
|
### Enable auto-restart on failure
|
||||||
|
|
||||||
|
Edit `dcc-usb-connector.service` and add under `[Service]`:
|
||||||
|
```
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reload:
|
||||||
|
```bash
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing Without Physical Device
|
||||||
|
|
||||||
|
For development/testing without the actual USB device:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a virtual serial port pair
|
||||||
|
socat -d -d pty,raw,echo=0 pty,raw,echo=0
|
||||||
|
|
||||||
|
# This creates two linked devices, e.g., /dev/pts/3 and /dev/pts/4
|
||||||
|
# Update the service to use one of these instead of /dev/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [systemd user services](https://www.freedesktop.org/software/systemd/man/systemd.service.html)
|
||||||
|
- [udev rules writing](https://www.reactivated.net/writing_udev_rules.html)
|
||||||
|
- [ncat documentation](https://nmap.org/ncat/)
|
||||||
|
- [DCC++ EX](https://dcc-ex.com/) - The DCC command station software
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
See the main project LICENSE file.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues specific to the auto-start feature:
|
||||||
|
1. Check the troubleshooting section above
|
||||||
|
2. Review logs: `journalctl --user -u dcc-usb-connector.service`
|
||||||
|
3. Test udev rules: `udevadm test /sys/class/tty/ttyUSB0`
|
||||||
|
|
||||||
|
For DCC++ EX or django-ram issues, see the main project documentation.
|
||||||
@@ -1,17 +1,53 @@
|
|||||||
# Use a container to implement a serial to net bridge
|
# DCC Serial-to-Network Bridge
|
||||||
|
|
||||||
This uses `ncat` from [nmap](https://nmap.org/ncat/) to bridge a serial port to a network port. The serial port is passed to the Podman command (eg. `/dev/ttyACM0`) and the network port is `2560`.
|
This directory provides two ways to bridge a serial port to a network port using `ncat` from [nmap](https://nmap.org/ncat/):
|
||||||
|
|
||||||
|
1. **Auto-Start with systemd + udev** (Recommended) - Automatically starts/stops when USB device is plugged/unplugged
|
||||||
|
2. **Container-based** - Manual control using Podman/Docker
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> Other variants of `nc` or `ncat` may not work as expected.
|
> Other variants of `nc` or `ncat` may not work as expected.
|
||||||
|
|
||||||
## Build and run the container
|
## Option 1: Auto-Start with systemd + udev (Recommended)
|
||||||
|
|
||||||
|
Automatically start the bridge when USB device `1a86:7523` is connected to `/dev/ttyUSB0` and stop it when removed.
|
||||||
|
|
||||||
|
### Quick Install
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ podman buil -t dcc/bridge .
|
./install-udev-rule.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- ✅ Auto-start when device connected
|
||||||
|
- ✅ Auto-stop when device removed
|
||||||
|
- ✅ User-level service (no root needed)
|
||||||
|
- ✅ Runs on boot (with lingering enabled)
|
||||||
|
|
||||||
|
See [INSTALL.md](INSTALL.md) for detailed documentation.
|
||||||
|
|
||||||
|
### Test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run the test script
|
||||||
|
./test-udev-autostart.sh
|
||||||
|
|
||||||
|
# Or manually check
|
||||||
|
systemctl --user status dcc-usb-connector.service
|
||||||
|
telnet localhost 2560
|
||||||
|
```
|
||||||
|
|
||||||
|
## Option 2: Container-based (Manual)
|
||||||
|
|
||||||
|
### Build and run the container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ podman build -t dcc/bridge .
|
||||||
$ podman run -d --group-add keep-groups --device=/dev/ttyACM0:/dev/arduino -p 2560:2560 --name dcc-bridge dcc/bridge
|
$ podman run -d --group-add keep-groups --device=/dev/ttyACM0:/dev/arduino -p 2560:2560 --name dcc-bridge dcc/bridge
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Test
|
||||||
|
|
||||||
It can be tested with `telnet`:
|
It can be tested with `telnet`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
17
connector/dcc-usb-connector.service
Normal file
17
connector/dcc-usb-connector.service
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=DCC USB-to-Network Bridge Daemon
|
||||||
|
After=network.target
|
||||||
|
# Device will be available via udev rule, but add condition as safety check
|
||||||
|
ConditionPathIsReadWrite=/dev/ttyUSB0
|
||||||
|
# Stop this service when the device is no longer needed (removed)
|
||||||
|
StopWhenUnneeded=yes
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStartPre=/usr/bin/stty -F /dev/ttyUSB0 -echo 115200
|
||||||
|
ExecStart=/usr/bin/bash -c "/usr/bin/ncat -n -k -l 2560 </dev/ttyUSB0 >/dev/ttyUSB0"
|
||||||
|
KillMode=mixed
|
||||||
|
TimeoutStopSec=5
|
||||||
|
PrivateTmp=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
127
connector/install-udev-rule.sh
Executable file
127
connector/install-udev-rule.sh
Executable file
@@ -0,0 +1,127 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Installation script for DCC USB-to-Network Bridge auto-start
|
||||||
|
#
|
||||||
|
# This script installs the udev rule and systemd service to automatically
|
||||||
|
# start the dcc-usb-connector.service when USB device 1a86:7523 is connected.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./install-udev-rule.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Get the directory where this script is located
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
echo -e "${GREEN}DCC USB-to-Network Bridge Auto-Start Installation${NC}"
|
||||||
|
echo "=========================================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check if running as root (not recommended for systemd user service)
|
||||||
|
if [ "$EUID" -eq 0 ]; then
|
||||||
|
echo -e "${YELLOW}Warning: You are running as root.${NC}"
|
||||||
|
echo "This script will install a user systemd service."
|
||||||
|
echo "Please run as a regular user (not with sudo)."
|
||||||
|
echo
|
||||||
|
read -p "Continue anyway? (y/N) " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for required files
|
||||||
|
echo "Checking required files..."
|
||||||
|
if [ ! -f "$SCRIPT_DIR/99-dcc-usb-connector.rules" ]; then
|
||||||
|
echo -e "${RED}Error: 99-dcc-usb-connector.rules not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -f "$SCRIPT_DIR/dcc-usb-connector.service" ]; then
|
||||||
|
echo -e "${RED}Error: dcc-usb-connector.service not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✓ All required files found${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Install udev rule (requires sudo)
|
||||||
|
echo "Installing udev rule..."
|
||||||
|
echo "This requires sudo privileges."
|
||||||
|
sudo cp "$SCRIPT_DIR/99-dcc-usb-connector.rules" /etc/udev/rules.d/
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
sudo udevadm trigger --subsystem-match=tty
|
||||||
|
echo -e "${GREEN}✓ Udev rule installed${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Install systemd user service
|
||||||
|
echo "Installing systemd user service..."
|
||||||
|
mkdir -p ~/.config/systemd/user/
|
||||||
|
cp "$SCRIPT_DIR/dcc-usb-connector.service" ~/.config/systemd/user/
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
echo -e "${GREEN}✓ Systemd service installed${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Enable lingering (allows user services to run without being logged in)
|
||||||
|
echo "Enabling systemd lingering for user..."
|
||||||
|
if loginctl show-user "$USER" | grep -q "Linger=yes"; then
|
||||||
|
echo -e "${GREEN}✓ Lingering already enabled${NC}"
|
||||||
|
else
|
||||||
|
sudo loginctl enable-linger "$USER"
|
||||||
|
echo -e "${GREEN}✓ Lingering enabled${NC}"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check user groups
|
||||||
|
echo "Checking user permissions..."
|
||||||
|
if groups "$USER" | grep -q '\bdialout\b'; then
|
||||||
|
echo -e "${GREEN}✓ User is in 'dialout' group${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}Warning: User is not in 'dialout' group${NC}"
|
||||||
|
echo "You may need to add yourself to the dialout group:"
|
||||||
|
echo " sudo usermod -a -G dialout $USER"
|
||||||
|
echo "Then log out and log back in for changes to take effect."
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check for ncat
|
||||||
|
echo "Checking for required tools..."
|
||||||
|
if command -v ncat &> /dev/null; then
|
||||||
|
echo -e "${GREEN}✓ ncat is installed${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}Warning: ncat is not installed${NC}"
|
||||||
|
echo "Install it with: sudo dnf install nmap-ncat"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo "=========================================================="
|
||||||
|
echo -e "${GREEN}Installation complete!${NC}"
|
||||||
|
echo
|
||||||
|
echo "The service will automatically start when USB device 1a86:7523"
|
||||||
|
echo "is connected to /dev/ttyUSB0"
|
||||||
|
echo
|
||||||
|
echo "To test:"
|
||||||
|
echo " 1. Plug in the USB device"
|
||||||
|
echo " 2. Check service status: systemctl --user status dcc-usb-connector.service"
|
||||||
|
echo " 3. Test connection: telnet localhost 2560"
|
||||||
|
echo
|
||||||
|
echo "To manually control:"
|
||||||
|
echo " Start: systemctl --user start dcc-usb-connector.service"
|
||||||
|
echo " Stop: systemctl --user stop dcc-usb-connector.service"
|
||||||
|
echo " Status: systemctl --user status dcc-usb-connector.service"
|
||||||
|
echo
|
||||||
|
echo "To view logs:"
|
||||||
|
echo " journalctl --user -u dcc-usb-connector.service -f"
|
||||||
|
echo
|
||||||
|
echo "To uninstall:"
|
||||||
|
echo " sudo rm /etc/udev/rules.d/99-dcc-usb-connector.rules"
|
||||||
|
echo " rm ~/.config/systemd/user/dcc-usb-connector.service"
|
||||||
|
echo " systemctl --user daemon-reload"
|
||||||
|
echo " sudo udevadm control --reload-rules"
|
||||||
|
echo
|
||||||
147
connector/test-udev-autostart.sh
Executable file
147
connector/test-udev-autostart.sh
Executable file
@@ -0,0 +1,147 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Test script for DCC USB-to-Network Bridge auto-start/stop functionality
|
||||||
|
#
|
||||||
|
# This script helps verify that the service starts when the USB device
|
||||||
|
# is connected and stops when it's removed.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./test-udev-autostart.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${BLUE}=== DCC USB-to-Network Bridge Auto-Start/Stop Test ===${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check if udev rule is installed
|
||||||
|
echo -e "${BLUE}1. Checking udev rule installation...${NC}"
|
||||||
|
if [ -f /etc/udev/rules.d/99-dcc-usb-connector.rules ]; then
|
||||||
|
echo -e "${GREEN}✓ Udev rule is installed${NC}"
|
||||||
|
echo " Location: /etc/udev/rules.d/99-dcc-usb-connector.rules"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Udev rule is NOT installed${NC}"
|
||||||
|
echo " Run: sudo cp 99-dcc-usb-connector.rules /etc/udev/rules.d/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check if service is installed
|
||||||
|
echo -e "${BLUE}2. Checking systemd service installation...${NC}"
|
||||||
|
if [ -f ~/.config/systemd/user/dcc-usb-connector.service ]; then
|
||||||
|
echo -e "${GREEN}✓ Systemd service is installed${NC}"
|
||||||
|
echo " Location: ~/.config/systemd/user/dcc-usb-connector.service"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Systemd service is NOT installed${NC}"
|
||||||
|
echo " Run: cp dcc-usb-connector.service ~/.config/systemd/user/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check lingering
|
||||||
|
echo -e "${BLUE}3. Checking systemd lingering...${NC}"
|
||||||
|
if loginctl show-user "$USER" | grep -q "Linger=yes"; then
|
||||||
|
echo -e "${GREEN}✓ Lingering is enabled${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ Lingering is NOT enabled${NC}"
|
||||||
|
echo " Services may not start automatically when you're not logged in"
|
||||||
|
echo " Run: sudo loginctl enable-linger $USER"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check if device is connected
|
||||||
|
echo -e "${BLUE}4. Checking USB device...${NC}"
|
||||||
|
if lsusb | grep -q "1a86:7523"; then
|
||||||
|
echo -e "${GREEN}✓ USB device 1a86:7523 is connected${NC}"
|
||||||
|
lsusb | grep "1a86:7523"
|
||||||
|
|
||||||
|
if [ -e /dev/ttyUSB0 ]; then
|
||||||
|
echo -e "${GREEN}✓ /dev/ttyUSB0 exists${NC}"
|
||||||
|
ls -l /dev/ttyUSB0
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ /dev/ttyUSB0 does NOT exist${NC}"
|
||||||
|
echo " The device may be on a different port"
|
||||||
|
echo " Available ttyUSB devices:"
|
||||||
|
ls -l /dev/ttyUSB* 2>/dev/null || echo " (none found)"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ USB device 1a86:7523 is NOT connected${NC}"
|
||||||
|
echo " Please plug in the device to test"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check service status
|
||||||
|
echo -e "${BLUE}5. Checking service status...${NC}"
|
||||||
|
if systemctl --user is-active --quiet dcc-usb-connector.service; then
|
||||||
|
echo -e "${GREEN}✓ Service is RUNNING${NC}"
|
||||||
|
systemctl --user status dcc-usb-connector.service --no-pager -l
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ Service is NOT running${NC}"
|
||||||
|
echo " Status:"
|
||||||
|
systemctl --user status dcc-usb-connector.service --no-pager -l || true
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Test udev rule
|
||||||
|
echo -e "${BLUE}6. Testing udev rule (if device is connected)...${NC}"
|
||||||
|
if [ -e /dev/ttyUSB0 ]; then
|
||||||
|
echo " Running: udevadm test /sys/class/tty/ttyUSB0"
|
||||||
|
echo " Looking for SYSTEMD_USER_WANTS..."
|
||||||
|
if udevadm test /sys/class/tty/ttyUSB0 2>&1 | grep -q "SYSTEMD_USER_WANTS"; then
|
||||||
|
echo -e "${GREEN}✓ Udev rule is triggering systemd${NC}"
|
||||||
|
udevadm test /sys/class/tty/ttyUSB0 2>&1 | grep "SYSTEMD_USER_WANTS"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Udev rule is NOT triggering systemd${NC}"
|
||||||
|
echo " The rule may not be matching correctly"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ Cannot test udev rule - device not connected${NC}"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check network port
|
||||||
|
echo -e "${BLUE}7. Checking network port 2560...${NC}"
|
||||||
|
if netstat -tuln 2>/dev/null | grep -q ":2560" || ss -tuln 2>/dev/null | grep -q ":2560"; then
|
||||||
|
echo -e "${GREEN}✓ Port 2560 is listening${NC}"
|
||||||
|
netstat -tuln 2>/dev/null | grep ":2560" || ss -tuln 2>/dev/null | grep ":2560"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ Port 2560 is NOT listening${NC}"
|
||||||
|
echo " Service may not be running or ncat failed to start"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Summary and instructions
|
||||||
|
echo -e "${BLUE}=== Test Summary ===${NC}"
|
||||||
|
echo
|
||||||
|
echo "To test auto-start/stop behavior:"
|
||||||
|
echo
|
||||||
|
echo "1. ${YELLOW}Monitor the service in one terminal:${NC}"
|
||||||
|
echo " watch -n 1 'systemctl --user status dcc-usb-connector.service'"
|
||||||
|
echo
|
||||||
|
echo "2. ${YELLOW}Monitor udev events in another terminal:${NC}"
|
||||||
|
echo " udevadm monitor --property --subsystem-match=tty"
|
||||||
|
echo
|
||||||
|
echo "3. ${YELLOW}Plug in the USB device${NC} and watch:"
|
||||||
|
echo " - Udev should detect the device"
|
||||||
|
echo " - Service should automatically start"
|
||||||
|
echo " - Port 2560 should become available"
|
||||||
|
echo
|
||||||
|
echo "4. ${YELLOW}Unplug the USB device${NC} and watch:"
|
||||||
|
echo " - Udev should detect device removal"
|
||||||
|
echo " - Service should automatically stop (thanks to StopWhenUnneeded=yes)"
|
||||||
|
echo " - Port 2560 should close"
|
||||||
|
echo
|
||||||
|
echo "5. ${YELLOW}Check logs:${NC}"
|
||||||
|
echo " journalctl --user -u dcc-usb-connector.service -f"
|
||||||
|
echo
|
||||||
|
echo "Expected behavior:"
|
||||||
|
echo " • Device connected → Service starts → Port 2560 opens"
|
||||||
|
echo " • Device removed → Service stops → Port 2560 closes"
|
||||||
|
echo
|
||||||
Reference in New Issue
Block a user