fix(console): switch conman from ser2net-telnet to direct serial access

The ser2net layer between conman and the serial devices was causing
stair-stepping in terminal output. conman's dev="host:port" uses telnet
protocol, but ser2net's accepter was raw TCP (no telnet mode). The telnet
NVT state machine in conman was stripping bare CR characters from device
output — particularly from Dell switches that use old-style \n\r (LF+CR)
line endings instead of standard \r\n. In telnet, a bare \r not followed
by \n or NUL is non-compliant and gets dropped, leaving bare \n that
causes stair-stepping in the raw-mode terminal.

Fix: conman now opens serial devices directly via the stable udev
symlinks (/dev/consoles/<name>) with seropts, eliminating the telnet
layer entirely. ser2net is stopped and disabled but remains installed
for emergency TCP access (documented workflow: stop conmand, start
ser2net, use telnet, then reverse).

Architecture change:
  Before: device → serial → ser2net (raw TCP) → conman (telnet NVT) → terminal
  After:  device → serial → conman (direct) → terminal

Verified: 7/7 serial devices held by conmand, 7/7 log files capturing,
all \r bytes preserved in terminal output (confirmed via PTY capture).

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
2026-07-29 18:29:31 -05:00
parent 80693e4f8e
commit fa0c77fb58
6 changed files with 98 additions and 85 deletions
+20 -17
View File
@@ -61,29 +61,32 @@ echo "--- 5. conmand connection status (journal) ---"
journalctl -u conmand --no-pager -n 50 2>/dev/null | grep -iE "connect|error|fail|console|refused|timeout" | tail -15 || echo " (no relevant journal entries)"
echo ""
echo "--- 6. Verify ser2net is actually proxying data (check for byte flow) ---"
# Pick a known-active port (2007 = pfv-r2-sw, the old Dell with menu UI that responded)
echo " Probing TCP $TS_IP:2007 for data..."
RESPONSE=$(timeout 3 bash -c "printf '\r\r' | nc -w 2 $TS_IP 2007 2>/dev/null" | tr -cd '[:print:][:space:]' | head -5)
if [ -n "$RESPONSE" ]; then
echo " [OK] Data flowing through ser2net TCP 2007:"
echo "$RESPONSE" | sed 's/^/ /'
else
echo " (no immediate response — device may need more interaction)"
fi
echo ""
echo "--- 7. Check if conmand has open connections to ser2net ports ---"
echo "--- 6. Verify serial devices are open by conmand ---"
echo " Checking /dev/consoles/* are held by conmand..."
CONMAND_PID=$(pgrep -x conmand 2>/dev/null || echo "")
if [ -n "$CONMAND_PID" ]; then
echo " conmand PID: $CONMAND_PID"
echo " Open connections to ser2net (expect 7 to 100.x:200X):"
ss -tnp 2>/dev/null | grep "pid=$CONMAND_PID" | grep -oE "100\.[0-9.]+:200[0-9]" | sort | sed 's/^/ /'
COUNT=$(ss -tnp 2>/dev/null | grep "pid=$CONMAND_PID" | grep -c ":200")
echo " Total conmand→ser2net connections: $COUNT (expect 7)"
for devlink in /dev/consoles/*; do
[ -e "$devlink" ] || continue
name=$(basename "$devlink")
if lsof "$devlink" 2>/dev/null | grep -q conmand; then
echo " [OK] $name ($devlink) opened by conmand"
else
echo " [WARN] $name ($devlink) not held by conmand"
fi
done
else
echo " [FAIL] conmand not running"
fi
echo ""
echo "--- 7. Verify ser2net is stopped (conman owns devices) ---"
if systemctl is-active --quiet ser2net 2>/dev/null; then
echo " [WARN] ser2net is running — will conflict with conmand for serial devices!"
echo " Fix: systemctl stop ser2net"
else
echo " [OK] ser2net is stopped (conman owns serial devices directly)"
fi
echo ""
echo "============================================"