From 63b0bc72fedf5f099e3edfc8384597a1d3d15364 Mon Sep 17 00:00:00 2001 From: Hermes Agent service account Date: Sat, 1 Aug 2026 21:18:06 -0500 Subject: [PATCH] jmri: deploy udev rules for stable /dev/jmri/* symlinks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rules were documented but never deployed — /dev/jmri/nce was missing entirely, only /dev/jmri/loconet existed (created manually). Adds: - templates/99-jmri-devices.rules.j2: LocoBuffer-NG -> loconet, NCE Power Pro (Microchip CDC) -> nce - Task to deploy rules + trigger udev settle - Trigger udev handler (reload-rules alone is insufficient) --- ansible/roles/jmri/handlers/main.yml | 4 ++++ ansible/roles/jmri/tasks/main.yml | 21 +++++++++++++++++++ .../jmri/templates/99-jmri-devices.rules.j2 | 10 +++++++++ 3 files changed, 35 insertions(+) create mode 100644 ansible/roles/jmri/templates/99-jmri-devices.rules.j2 diff --git a/ansible/roles/jmri/handlers/main.yml b/ansible/roles/jmri/handlers/main.yml index 90c1765..713d89d 100644 --- a/ansible/roles/jmri/handlers/main.yml +++ b/ansible/roles/jmri/handlers/main.yml @@ -3,6 +3,10 @@ ansible.builtin.command: udevadm control --reload-rules changed_when: false +- name: Trigger udev + ansible.builtin.command: udevadm trigger --subsystem-match=tty + changed_when: false + - name: Reload systemd ansible.builtin.systemd: daemon_reload: true diff --git a/ansible/roles/jmri/tasks/main.yml b/ansible/roles/jmri/tasks/main.yml index 220e7b1..ef86261 100644 --- a/ansible/roles/jmri/tasks/main.yml +++ b/ansible/roles/jmri/tasks/main.yml @@ -43,6 +43,27 @@ groups: dialout append: true +# --------------------------------------------------------------------------- +# Phase 1 — Stable USB device symlinks +# Creates /dev/jmri/loconet and /dev/jmri/nce via udev ID_SERIAL matching. +# --------------------------------------------------------------------------- +- name: Create /dev/jmri directory (udev will populate it) + ansible.builtin.file: + path: /dev/jmri + state: directory + mode: '0755' + +- name: Deploy udev rules for JMRI USB devices + ansible.builtin.template: + src: 99-jmri-devices.rules.j2 + dest: /etc/udev/rules.d/99-jmri-devices.rules + owner: root + group: root + mode: '0644' + notify: + - Reload udev + - Trigger udev + # --------------------------------------------------------------------------- # Phase 2 — LocoNet traffic monitor diff --git a/ansible/roles/jmri/templates/99-jmri-devices.rules.j2 b/ansible/roles/jmri/templates/99-jmri-devices.rules.j2 new file mode 100644 index 0000000..54a4939 --- /dev/null +++ b/ansible/roles/jmri/templates/99-jmri-devices.rules.j2 @@ -0,0 +1,10 @@ +# JMRI USB device symlinks — managed by Ansible, do not edit manually. +# Creates stable /dev/jmri/* symlinks regardless of USB enumeration order. + +# LocoNet interface — RR-CirKits LocoBuffer-NG +SUBSYSTEM=="tty", ENV{ID_SERIAL}=="RR-CirKits_LocoBuffer-NG_CDC_ACM_SERIAL_DEVICE_AA5700218A", \ + SYMLINK+="jmri/loconet", MODE="0666" + +# NCE command station — Microchip CDC (Power Pro) +SUBSYSTEM=="tty", ENV{ID_SERIAL}=="Microchip_Technology_Inc._Simple_CDC_Device_Demo", \ + SYMLINK+="jmri/nce", MODE="0666"