summaryrefslogtreecommitdiff
path: root/gpsd.hotplug
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-06-25 04:51:30 -0400
committerEric S. Raymond <esr@thyrsus.com>2011-06-25 04:51:30 -0400
commit8cb7bfa3152831fddde0a8e990b07ef43429b24e (patch)
tree0182a3ecfa9ae0637c01da6062a829e5220407c3 /gpsd.hotplug
parentc90e14043d4ddbaca7d12905fe562b127ab89611 (diff)
downloadgpsd-8cb7bfa3152831fddde0a8e990b07ef43429b24e.tar.gz
No more Python in the hotplug sequence.
Diffstat (limited to 'gpsd.hotplug')
-rwxr-xr-xgpsd.hotplug124
1 files changed, 0 insertions, 124 deletions
diff --git a/gpsd.hotplug b/gpsd.hotplug
deleted file mode 100755
index 805f9419..00000000
--- a/gpsd.hotplug
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/python
-#
-# This file is Copyright (c) 2010 by the GPSD project
-# BSD terms apply: see the file COPYING in the distribution root for details.
-#
-# Hotplug script for gpsd by Eric S. Raymond, March 2005
-# This script is part of the gpsd distribution: see http://gpsd.berlios.de
-# Can be called like "gpsd.hotplug [add|remove] /dev/ttyUSB0" for test
-# purposes.
-import sys, time, os, syslog, glob, socket, stat
-
-CONTROL_SOCKET = os.getenv('GPSD_SOCKET') or "/var/run/gpsd.sock"
-GPSD_OPTIONS = os.getenv('GPSD_OPTIONS') or ""
-
-WHEREAMI = __file__
-
-def gpsd_control_connect(complain=True):
- "Acquire a connection to the GPSD control socket."
- if not os.path.exists(CONTROL_SOCKET):
- syslog.syslog("socket %s doesn't exist" % CONTROL_SOCKET)
- return None
- try:
- sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
- sock.connect(CONTROL_SOCKET)
- except socket.error, msg:
- if complain:
- syslog.syslog("socket %s creation failure: %s" % (CONTROL_SOCKET, msg))
- if sock:
- sock.close()
- sock = None
- #else:
- # syslog.syslog("socket %s created OK" % CONTROL_SOCKET)
- return sock
-
-def gpsd_control(action, argument):
- "Pass a command to gpsd; start the daemon if not already running."
- syslog.syslog("gpsd_control(action=%s, arg=%s)" % (action, argument))
- connect = gpsd_control_connect(complain=False)
- if connect:
- syslog.syslog("reached a running gpsd")
- elif action == 'add':
- gpsdcmd = "gpsd %s -F %s" % (GPSD_OPTIONS, CONTROL_SOCKET)
- syslog.syslog("launching %s" % gpsdcmd)
- os.system(gpsdcmd)
- connect = gpsd_control_connect(complain=True)
- if not connect:
- syslog.syslog("can't reach gpsd")
- return None
- # We've got a live connection to the gpsd control socket. No
- # need to parse the response, because gpsd will lock on to the
- # device if it's really a GPS and ignore it if it's not.
- if action == 'add':
- # Force the group-read & group-write bits on, so gpsd will still be
- # able to use this device after dropping root privileges.
- os.chmod(argument, stat.S_IMODE(os.stat(argument)[stat.ST_MODE])|0660)
- connect.sendall("+%s\r\n" % argument)
- connect.recv(12)
- elif action == 'remove':
- connect.sendall("-%s\r\n" % argument)
- connect.recv(12)
- elif action == 'send':
- connect.sendall("%s\r\n" % argument)
- connect.recv(12)
- connect.close()
- #syslog.syslog("gpsd_control ends")
- return action
-
-def hotplug(action, devpath):
- #syslog.syslog("ACTION=%s DEVPATH=%s" % (action,devpath))
- if not devpath:
- syslog.syslog("No device")
- else:
- subnodes = glob.glob("/sys" + devpath + "/*")
- subnodes = map(os.path.basename, subnodes)
- subnodes = filter(lambda s: s.startswith("ttyUSB"), subnodes)
- if len(subnodes) == 0:
- syslog.syslog("no ttyUSB device under " + devpath)
- return
- elif len(subnodes) > 1:
- syslog.syslog("too many ttyUSB devices under " + devpath)
- return
- else:
- tty = "/dev/" + subnodes[0]
-
- syslog.syslog("waiting for " + tty)
- while not os.path.exists(tty):
- time.sleep(1)
- syslog.syslog(tty + " has gone active")
-
- gpsd_control(action, tty)
-
- remover = os.getenv("REMOVER")
- #syslog.syslog("REMOVER=%s" % remover)
- fp = open(remover, "w")
- fp.write(WHEREAMI + " remove " + tty)
- fp.close()
- os.chmod(remover, stat.S_IRUSR|stat.S_IXUSR|stat.S_IRGRP|stat.S_IXGRP)
- return
-
-if __name__ == '__main__':
- # In recent versions of udev, the gpsd script runs in series with
- # the task that creates the real /dev/ttyUSB0 device
- # node. Unfortunately, the gpsd script runs BEFORE the creation of
- # the node, and the node is not created until after you kill the
- # gpsd script, because the gpsd script waits forever for the node
- # to appear.
- #
- # This is a race condition, and is best fixed by running the
- # actual wait/hotplug portion in the background.
- pid = os.fork()
- if not pid:
- syslog.openlog('gpsd.hotplug', 0, syslog.LOG_DAEMON)
- try:
- if len(sys.argv) == 1: # Called as hotplug script
- hotplug(os.getenv("ACTION"), os.getenv("DEVPATH"))
- else: # Called by hand for testing
- gpsd_control(sys.argv[1], sys.argv[2])
- except:
- (exc_type, exc_value, exc_traceback) = sys.exc_info()
- syslog.syslog("gpsd.hotplug: exception %s yields %s" % (exc_type, exc_value))
- raise exc_type, exc_value, exc_traceback
- #syslog.syslog("gpsd.hotplug ends")
- syslog.closelog()
-