Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
docs:guide-user:base-system:hotplug [2023/10/30 15:27] – Added Environmental Variables to the Event classes / Directories entry ruralrootsdocs:guide-user:base-system:hotplug [2024/08/23 10:25] – Avoid duplication/duplicate execution oliv3r
Line 11: Line 11:
 Which is why most scripts in there use a numeric prefix. Which is why most scripts in there use a numeric prefix.
  
-^ Directory ^ Description ^ +^ Directory     ^ Description                                                                                               
-| **block** | Block device events: device connected/disconnected | +| **block**     | Block device events: device connected/disconnected                                                        
-| **button** | Buttons: not created by default, see [[docs:guide-user:hardware:hardware.button|/etc/rc.button]] instead | +| **button**    | Buttons: not created by default, see [[docs:guide-user:hardware:hardware.button|/etc/rc.button]] instead  
-| **dhcp** | DHCP-related events | +| **dhcp**      | DHCP-related events                                                                                       
-| **dsl** | DSL modem events | +| **dsl**       | DSL modem events                                                                                          
-| **firewall** | Firewall-related events | +| **firewall**  | Firewall-related events                                                                                   
-| **iface** | Interface events: LAN/WAN/etc. is connected/disconnected | +| **iface**     | Interface events: LAN/WAN/etc. is connected/disconnected                                                  
-| **neigh** | Neighbor discovery | +| **neigh**     | Neighbor discovery                                                                                        
-| **net** | Network-related events | +| **net**       | Network-related events                                                                                    
-| **ntp** | Time sync events: time step, time server stratum change | +| **ntp**       | Time sync events: time step, time server stratum change                                                   
-| **tftp** | TFTP-related events | +| **tftp**      | TFTP-related events                                                                                       | 
-| **usb** | USB devices like 3g-modem and tty* |+| **tty**       | TTY-related events, including but not limited to WWAN modems, but pointing directly to TTY interface      
 +| **usb**       | USB devices like 3g-modem and tty*                                                                        | 
 +| **usbmisc**   | Special USB peripherals like printers (scripts in this subsystem have fewer variables available)          |
  
 See also: See also:
Line 145: Line 147:
  
 Even without NTP sync, you will receive a "periodic" hotplug event, with ''stratum=16'', about every 11 minutes out of the box. Even without NTP sync, you will receive a "periodic" hotplug event, with ''stratum=16'', about every 11 minutes out of the box.
 +
 +==== tty ====
 +^ Variable name ^ description ^
 +| ACTION | add, remove, bind, unbind as above |
 +| DEVICENAME | eg "ttyUSB2" |
 +| DEVNAME | only for bind/unbind, eg, "ttyUSB2" |
 +| DEVPATH | eg, "/devices/platform/ahb/1b400000.usb/usb2/2-1/2-1:1.3/ttyUSB2" |
 +| SEQNUM | (action number since boot for this subsystem) eg 335 |
 +| SUBSYSTEM | Specific type of device, eg, "usb-serial" |
 +| MAJOR | eg 189 |
 +| MINOR | eg 1 |
  
 ==== usb ==== ==== usb ====
 ^ Variable name ^ description ^ ^ Variable name ^ description ^
-| ACTION | add, remove as above | +| ACTION | add, remove, bindunbind as above |
-| DEVNAME | eg"bus/usb/001/002"+
-| DEVPATH | eg"/devices/platform/ehci-platform/usb1/1-1" |+
 | DEVICENAME | eg "1-1" | | DEVICENAME | eg "1-1" |
 +| DEVNAME | eg, "bus/usb/001/002" |
 | DEVNUM | eg 002 | | DEVNUM | eg 002 |
-DRIVER | "usb" |+DEVPATH eg, "/devices/platform/ehci-platform/usb1/1-1"
 +| DEVTYPE | eg "usb_device" |
 | TYPE | eg 9/0/1 | | TYPE | eg 9/0/1 |
 | PRODUCT | the vendor/productcode/version, eg "424/2640/0" see lsusb | | PRODUCT | the vendor/productcode/version, eg "424/2640/0" see lsusb |
-| SEQNUM | eg 335 |+| SEQNUM | (action number since boot for this subsystem) eg 335 |
 | BUSNUM | eg 001 | | BUSNUM | eg 001 |
 | MAJOR | eg 189 | | MAJOR | eg 189 |
 | MINOR | eg 1 | | MINOR | eg 1 |
 +
 +==== usbmisc ====
 +^ Variable name  ^ description                                             ^
 +| ACTION         | add, remove as above                                    |
 +| DEVNAME        | eg, "bus/usb/001/002"                                   |
 +| DEVPATH        | eg, "/devices/platform/ehci-platform/usb1/1-1"          |
 +| DEVICENAME     | eg "1-1"                                                |
 +| SEQNUM          (action number since boot for this subsystem) eg 335   |
 +| MAJOR          | eg 189                                                  |
 +| MINOR          | eg 1                                                    |
 +
  
 ===== Examples ===== ===== Examples =====
Line 174: Line 198:
 ==== Symlink instead of rename a device ==== ==== Symlink instead of rename a device ====
 An other script to create a symlink instead of renaming the device. An other script to create a symlink instead of renaming the device.
-I test if DEVICE_NAME is empty because when I plug usb device I retrieve two add event, and the first come before created device, so symlink fails. 
  
 <code bash> <code bash>
 cat << "EOF" > /etc/hotplug.d/usb/20-cp210x cat << "EOF" > /etc/hotplug.d/usb/20-cp210x
-CP210_PRODID="10c4/ea60/100"+CP210_PRODID='10c4/ea60/100'
 SYMLINK="my_link" SYMLINK="my_link"
  
-if [ "${PRODUCT}" = "${CP210_PRODID}" ]; then +set -eu
-    if [ "${ACTION}" = "add" ]; then +
-          DEVICE_NAME=$(ls /sys/${DEVPATH} | grep tty) +
-          if [ -z ${DEVICE_NAME} ]; then +
-              logger -t hotplug "Warning DEVICE_NAME is empty" +
-              exit 0 +
-          fi +
-          logger -t hotplug "Device name of cp210 is ${DEVICE_NAME}" +
-          ln -s /dev/${DEVICE_NAME} /dev/${SYMLINK} +
-          logger -t hotplug "Symlink from /dev/${DEVICE_NAME} to /dev/${SYMLINK} created" +
-    fi +
-fi+
  
-if [ "${PRODUCT}" = "${CP210_PRODID}" ]; then +if [ "${DEVTYPE:-}" = 'usb_interface' ] && \ 
-    if [ "${ACTION}" = "remove" ]; then +   [ "${PRODUCT:-}" = "${CP210_PRODID}" ]; then 
-        rm /dev/${SYMLINK} + if [ "${ACTION:-}" = 'bind' ]; then 
-        logger -t hotplug "Symlink /dev/${SYMLINK} removed" + if [ -L "/dev/${SYMLINK}" ]; then 
-    fi+ logger -t hotplug "Symlink '/dev/${SYMLINK}' already exists" 
 + exit 0 
 + fi 
 + 
 + DEVICE_NAME="$(find /sys${DEVPATH:-} -maxdepth 1 -type d -iname 'ttyUSB*' -exec basename {} \;)" 
 + if [ -z "${DEVICE_NAME}" ]; then 
 + logger -t hotplug 'Warning: DEVICE_NAME is empty' 
 + exit 0 
 + fi 
 + 
 + logger -t hotplug "Device name of cp210 is '${DEVICE_NAME}'" 
 + ln -s "/dev/${DEVICE_NAME}" "/dev/${SYMLINK}" 
 + logger -t hotplug "Symlink from '/dev/${DEVICE_NAME}' to '/dev/${SYMLINK}' created" 
 + fi 
 + 
 + 
 + if [ "${ACTION:-}" = 'unbind' ]; then 
 + rm "/dev/${SYMLINK}" 
 + logger -t hotplug "Symlink '/dev/${SYMLINK}removed" 
 + fi
 fi fi
 EOF EOF
 </code> </code>
- +==== Script that detects whether plugged usb device is bluetooth or not ====
-==== Script that detects if plugged usb device is bluetooth or not ====+
 <code bash> <code bash>
 cat << "EOF" > /etc/hotplug.d/usb/20-bt_test cat << "EOF" > /etc/hotplug.d/usb/20-bt_test
Line 273: Line 303:
  
 ==== Coldplug ==== ==== Coldplug ====
-If you had notice the udev and eudev were removed in the openwrt 18.0.* release, don'be afraid because you still can make the things works.+You may have noticed that the udev and eudev were removed in the openwrt 18.0.* release. Don'worry, because you still can make things work.
 You can use hotplug scripts as coldplug. You can use hotplug scripts as coldplug.
-Pay attention at the ACTION environment variable, at the boot are executed 'bind' actions. +Pay attention to the ACTION environment variable, at boot 'bind' actions are executed
-So, just add this option to hotplug run accordinly.+So, just add this option to hotplug and run accordingly. 
 In my case I used this: In my case I used this:
  
Line 408: Line 439:
 dev_rename() { dev_rename() {
 local DEV_CONF="${1}" local DEV_CONF="${1}"
-local DEV_ONAME DEV_NAME DEV_MAC +local DEV_MAC DEV_NAME DEV_ONAME
-config_get DEV_NAME "${DEV_CONF}" name+
 config_get DEV_MAC "${DEV_CONF}" mac config_get DEV_MAC "${DEV_CONF}" mac
 +config_get DEV_NAME "${DEV_CONF}" name
 DEV_ONAME="$(grep -l -e "${DEV_MAC}" \ DEV_ONAME="$(grep -l -e "${DEV_MAC}" \
 $(find /sys/class/net/*/device/uevent \ $(find /sys/class/net/*/device/uevent \
 | sed -e "s|/device/uevent$|/address|") \ | sed -e "s|/device/uevent$|/address|") \
 | awk -F '/' '{print $5}')" | awk -F '/' '{print $5}')"
-if [ "${DEV_ONAME}" != "${DEV_NAME}" ]+if [ -n "${DEV_MAC}" ] \ 
 +&& [ "${DEV_ONAME}" != "${DEV_NAME}" ]
 then ip link set "${DEV_ONAME}" name "${DEV_NAME}" then ip link set "${DEV_ONAME}" name "${DEV_NAME}"
 fi fi
Line 430: Line 462:
 uci -q delete network.${DEV_NAME}_dev uci -q delete network.${DEV_NAME}_dev
 uci set network.${DEV_NAME}_dev="device" uci set network.${DEV_NAME}_dev="device"
-uci set network.${DEV_NAME}_dev.name="${DEV_NAME}" 
 uci set network.${DEV_NAME}_dev.mac="${DEV_MAC}" uci set network.${DEV_NAME}_dev.mac="${DEV_MAC}"
 +uci set network.${DEV_NAME}_dev.name="${DEV_NAME}"
 done << EOI done << EOI
 wana 11:22:33:44:55:66 wana 11:22:33:44:55:66
Line 440: Line 472:
 </code> </code>
  
 +==== Create deterministic/persistent links to USB-serial devices ====
 +Resulting links will be placed in /dev/serial/by-id and /dev/serial/by-path,
 +with a name structure closely resembling links created by udev, but not fully exact.
 +
 +<code bash>
 +set -o pipefail
 +[ "${ACTION}" = "bind" -o "${ACTION}" = "unbind" ] || exit 0
 +[ "${SUBSYSTEM}" = "usb-serial" ] || exit 0
 +[ -n "${DEVICENAME}" -a -n "${DEVPATH}" ] || exit 1
 +
 +if [ "${ACTION}" = "bind" ]; then
 +        subsystem="$(basename $(readlink /sys${DEVPATH}/../subsystem))"
 +
 +        [ "$subsystem" = "usb" ] || exit 0
 +
 +        replace_whitespace="s/^[ \t]*|[ \t]*$//g; s/[ \t]+/_/g"
 +        manufacturer="$(cat /sys${DEVPATH}/../../manufacturer | sed -E "${replace_whitespace}")" || manufacturer="$(cat /sys${DEVPATH}/../../idVendor)"
 +        product="$(cat /sys${DEVPATH}/../../product | sed -E "${replace_whitespace}")" || product="$(cat /sys${DEVPATH}/../../idProduct)"
 +        serial="$(cat /sys${DEVPATH}/../../serial | sed -E "${replace_whitespace}")"
 +        interface="$(cat /sys${DEVPATH}/../bInterfaceNumber)"
 +        port="$(cat /sys${DEVPATH}/port_number)"
 +
 +        replace_chars="s/[^0-9A-Za-z#+.:=@-]/_/g"
 +        id_link=$(echo "${subsystem}"-"${manufacturer}"_"${product}${serial:+_}${serial}"-if"${interface}${port:+-port}${port}" | sed "${replace_chars}")
 +        path_link=$(echo "${DEVPATH}${port:+-port}${port}" | sed "s%/devices/%%; s%/${DEVICENAME}%%g; ${replace_chars}")
 +
 +        mkdir -p /dev/serial/by-id /dev/serial/by-path
 +        ln -sf "/dev/${DEVICENAME}" "/dev/serial/by-id/${id_link}"
 +        ln -sf "/dev/${DEVICENAME}" "/dev/serial/by-path/${path_link}"
 +elif [ "${ACTION}" = "unbind" ]; then
 +        for link in $(find /dev/serial -type l); do
 +                [ -L ${link} -a "$(readlink ${link})" = "/dev/$DEVICENAME" ] && rm ${link}
 +        done
 +fi
 +</code>
 +[[https://gist.github.com/Leo-PL/b5ee737e49b34c1551dba6c182707c8e|(Source)]]
  • Last modified: 2024/12/19 04:42
  • by pythonic