Hotplug
Hotplug executes scripts located in the respective hotplug directory: /etc/hotplug.d/ on certain events, like when an interface goes up or down or when a button gets pressed.
It can be very useful with PPPoE-connection or in an unstable network. Hotplug has been available since OpenWrt 'Kamikaze' 7.06.
It is also used by hardware.button
How it works
Every time an interface goes up or down, all scripts in the /etc/hotplug.d/iface/ directory are executed, in alphabetical order. According to an informal convention a numeric prefix is added to each script name to set the correct order of running. That's why the scripts there are named like this:
/etc/hotplug.d/iface/<nn>-<sctiptname> e.g.: 10-routes, 20-firewall
Kernel module: button-hotplug
Configuration
Simply place your script(s) into the respective hotplug subdirectory. Script looks like that:
There are three main environment variables that are passed to each iface hotplug-script:
| Variable name | Description |
|---|---|
| ACTION | Either "ifup" or "ifdown" |
| INTERFACE | Name of the interface which went up or down (e.g. "wan" or "ppp0") |
| DEVICE | Physical device name which interface went up or down (e.g. "eth0.1" or "br-lan") |
Examples
Save the example script at /etc/hotplug.d/iface/99-my-action.
#!/bin/sh
[ "$ACTION" = ifup ] && {
logger -t button-hotplug Device: $DEVICE / Action: $ACTION
} |
Every time an interface goes up then the if/fi statement will be executed.
→ hardware.button makes ample use of hotplug.
Niii has posted this quick example for a USB WiFi device hotplug event to trigger an init.d network restart wlan0 script.
For determine RTL8188SU_PRODID variable, use "lsusb -v":
idVendor 0x0bda Realtek Semiconductor Corp. idProduct 0x8171 RTL8188SU 802.11n WLAN Adapter bcdDevice 2.00
/etc/hotplug.d/usb/20-rtl8188su
#!/bin/sh
BINARY="/sbin/wifi up"
RTL8188SU_PRODID="bda/8171/200"
if [ "${PRODUCT}" = "${RTL8188SU_PRODID}" ]; then
if [ "${ACTION}" = "add" ]; then
${BINARY}
fi
fi |
/etc/hotplug.d/usb/20-cp210x
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.
#!/bin/sh
CP210_PRODID="10c4/ea60/100"
SYMLINK="my_link"
if [ "${PRODUCT}" = "${CP210_PRODID}" ];
then 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
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 [ "${ACTION}" = "remove" ];
then
rm /dev/${SYMLINK}
logger -t Hotplug Symlink /dev/${SYMLINK} removed
fi
fi |
Notes
doc/techref/hotplug.txt · Last modified: 2011/09/08 15:32 by orca