Zaurus - hotplug
I tried for a few minutes to put the commands here into a file in /etc/hotplug/usb/usbnet, but things weren't working right. CDCEther kept coming up, and even reading the CDCEther source file didn't tell me what CDCEther was. I had installed hotplug from scratch, and I couldn't tell what it was doing or where it made its decisions.
As I want something quite simple-- run some shell cmds when I plug a device into usb, run some other ones when I disconnect it-- I hacked the top of /etc/hotplug/usb.agent to run my own hotplug system. Here's how to change the top of /etc/hotplug/usb.agent so it runs your own program, and then abort if your program is successful (otherwise, we proceed with the normal usb.agent):
... cd /etc/hotplug . hotplug.functions # DEBUG=yes export DEBUG ############################################################################### ############################################################################### /etc/hotplug/drewp-plug if [ $? = 0 ]; then exit 0 fi mesg "proceed with old usb.agent" ############################################################################### ############################################################################### # generated by modutils, for current 2.4.x (and later) kernels MAP_CURRENT=$MODULE_DIR/modules.usbmap ...
Then, I quickly wrote my own hotplug program:
#!/usr/local/bin/python
import os,sys,logging
# SysLogHandler isn't working, so i log to stdout and
# send that to syslog.
sys.stdout=os.popen("/usr/bin/logger -t drewp-plug","w")
log=logging.getLogger()
hdlr = logging.StreamHandler(sys.stdout)#SysLogHandler()
hdlr.setFormatter(logging.Formatter("%(levelname)s (%(lineno)d): %(message)s"))
log.addHandler(hdlr)
log.setLevel(logging.INFO)
def run(cmd):
log.debug("running %r" % cmd)
os.system(cmd)
def zaurus_add():
for l in """modprobe usbnet
ifconfig usb0 192.168.129.1 netmask 255.255.255.255 up
dhcpd -q usb0
route add -host 192.168.129.201 usb0
iptables -t nat -F
iptables -t nat -A POSTROUTING -j SNAT -o eth0 --to 10.1.0.229
echo 1 > /proc/sys/net/ipv4/ip_forward""".splitlines():
run(l.strip())
def zaurus_remove():
run("kill `cat /var/run/dhcpd.pid`")
##############################################################################
try:
product={'4dd/8004/0':'zaurus',
'4a9/3065/1':'digicam',}[os.getenv("PRODUCT")]
except KeyError:
log.warn("product %s unknown to /etc/hotplug/drewp-plug" % os.getenv('PRODUCT'))
sys.exit(1)
func=locals()["%s_%s"%(product,os.getenv("ACTION"))]
logging.info("calling %r" % func)
func()
sys.exit(0)
Among the unfortunate hacks in this program are:
- spawning /usr/bin/logger because of some issue with SysLogHandler
- hardcoding the product ID codes in here, instead of using whatever table hotplug was using (I don't even know where that is)
- writing the program in the first place instead of u sing the standard hotplug system completely
But the benefits are:
- it's not in written in shell
- my Zaurus is hotplugging sooner than it would have, and I won't have to adjust this for a long time