From 45feec3d78f39233656da00bf65054a1eb9bd260 Mon Sep 17 00:00:00 2001 From: hirsch Date: Sun, 31 Jul 2016 19:17:30 -0400 Subject: [PATCH] Polish up framework to auto-detect Mustang --- 50-mustang.rules | 9 ++--- 60-midi.rules | 1 + install.sh | 7 ++-- mustang_bridge_start | 84 ++++++++++++++++++++++++-------------------- 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/50-mustang.rules b/50-mustang.rules index 7b1a0b5..f210dd0 100644 --- a/50-mustang.rules +++ b/50-mustang.rules @@ -1,7 +1,4 @@ -# Mustang III (original) -ACTION=="add|change", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0005", GROUP="plugdev", RUN+="/bin/bash -c '/bin/echo /usr/local/bin/mustang_bridge_start | /usr/bin/at now'" -ACTION=="remove", ENV{ID_VENDOR_ID}=="1ed8", ENV{ID_MODEL_ID}=="0005", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/mustang_bridge_stop" +# Cover all known Mustang models +ACTION=="add|change", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0004|0005|000a|0010|0012|0014|0016", GROUP="plugdev", RUN+="/bin/bash -c '/bin/echo /usr/local/bin/mustang_bridge_start | /usr/bin/at now'" +ACTION=="remove", ENV{ID_VENDOR_ID}=="1ed8", ENV{ID_MODEL_ID}=="0004|0005|000a|0010|0012|0014|0016", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/mustang_bridge_stop" -# Mustang III v2 -ACTION=="add|change", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0016", GROUP="plugdev", RUN+="/bin/bash -c '/bin/echo /usr/local/bin/mustang_bridge_start | /usr/bin/at now'" -ACTION=="remove", ENV{ID_VENDOR_ID}=="1ed8", ENV{ID_MODEL_ID}=="0016", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/mustang_bridge_stop" diff --git a/60-midi.rules b/60-midi.rules index 0ef0c83..4f22c80 100644 --- a/60-midi.rules +++ b/60-midi.rules @@ -1,2 +1,3 @@ +# Must customize vendor and product id for your controller ACTION=="add|change", SUBSYSTEM=="usb", ATTRS{idVendor}=="0763", ATTRS{idProduct}=="0160", RUN+="/bin/bash -c '/bin/echo /usr/local/bin/mustang_bridge_start | /usr/bin/at now'" ACTION=="remove", ENV{ID_VENDOR_ID}=="0763", ENV{ID_MODEL_ID}=="0160", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/mustang_bridge_stop" diff --git a/install.sh b/install.sh index 40d4ddf..5eee2de 100755 --- a/install.sh +++ b/install.sh @@ -9,9 +9,10 @@ if [ ! -f "mustang_midi" ]; then exit 1 fi -echo "Create non-privileged user for MIDI bridge" - -useradd -M -s /bin/false mustang-user +if ! `grep -q mustang-user /etc/passwd`; then + echo "Create non-privileged user for MIDI bridge" + useradd -M -s /bin/false mustang-user +fi echo "Copy program and support scripts to $BINDIR" diff --git a/mustang_bridge_start b/mustang_bridge_start index 0c2fdfa..0b97d85 100755 --- a/mustang_bridge_start +++ b/mustang_bridge_start @@ -11,7 +11,7 @@ from string import split import usb.core -####### Start User Edits ######### +rundir = "/var/run/mustang/" # Controller USB parms control_vid = 0x0763 @@ -19,12 +19,9 @@ control_pid = 0x0160 # Mustang USB parms mustang_vid = 0x1ed8 +mustang_pids = ( 0x0004, 0x0005, 0x000a, 0x0010, 0x0012, 0x0014, 0x0016 ) -# Mustang III (original) -# mustang_pid = 0x0005 - -# Mustang III v2 -mustang_pid = 0x0016 +####### Start User Edits ######### # Controller MIDI device midi_device = 1 @@ -34,44 +31,53 @@ midi_channel = 1 ######## End User Edits ########## -rundir = "/var/run/mustang/" - # Look for devices -controller = usb.core.find( idVendor=control_vid, idProduct=control_pid ) -mustang = usb.core.find( idVendor=mustang_vid, idProduct=mustang_pid ) +controller = usb.core.find( idVendor = control_vid, idProduct = control_pid ) +if ( not controller ): + sys.exit( 0 ) + +mustang = False +for pid in mustang_pids: + device = usb.core.find( idVendor = mustang_vid, idProduct = pid ) + if ( device ): + mustang = True + break + +if ( not mustang ): + sys.exit( 0 ) pid = os.getpid() # syslog.syslog( "%d: Starting" % pid ) -# was it found? -if controller and mustang: - os.chdir( rundir ) - filelist = glob.glob( 'mustang_*' ) +# Look for atomic pid file +os.chdir( rundir ) +filelist = glob.glob( 'mustang_*' ) +if len( filelist ) != 1: + syslog.syslog( "%d: /var/run/mustang is not properly setup" % pid ) + sys.exit( 0 ) - if len( filelist ) == 1: - lockfile = filelist[0] - oldpid = split( lockfile, '_' )[1] +# Found file. Parse out the PID of the process that created it. +lockfile = filelist[0] +oldpid = split( lockfile, '_' )[1] - # syslog.syslog( "%d: Check for path /proc/%s" % (pid, oldpid) ) - if not os.path.exists( "/proc/%s" % oldpid ): - # No such process, ok to start ours - # syslog.syslog( "%d: Renaming %s to mustang_%d" % (pid, lockfile, pid) ) - try: - os.rename( lockfile, "mustang_%d" % os.getpid() ) - except Exception, e: - pass - # syslog.syslog( "%d: Unable to rename file" % pid ) - else: - # syslog.syslog( "%d: About to exec" % pid ) - # Drop privileges and start the program - pwObj = getpwnam('mustang-user') - os.setgid( pwObj.pw_gid ) - - # Need secondary groups to access MIDI and USB devices - sec_gids = ( getgrnam('plugdev').gr_gid, getgrnam('audio').gr_gid ) - os.setgroups( sec_gids ) - - os.setuid( pwObj.pw_uid ) - os.execl( "/usr/local/bin/mustang_midi", "mustang_midi", "%s" % midi_device, "%s" % midi_channel ) +# syslog.syslog( "%d: Check for path /proc/%s" % (pid, oldpid) ) +if not os.path.exists( "/proc/%s" % oldpid ): + # No such process, ok to start ours + # syslog.syslog( "%d: Renaming %s to mustang_%d" % (pid, lockfile, pid) ) + try: + os.rename( lockfile, "mustang_%d" % os.getpid() ) + except Exception, e: + pass + # syslog.syslog( "%d: Unable to rename file" % pid ) else: - syslog.syslog( "%d: /var/run/mustang is not properly setup" % pid ) + # syslog.syslog( "%d: About to exec" % pid ) + # Drop privileges and start the program + pwObj = getpwnam('mustang-user') + os.setgid( pwObj.pw_gid ) + + # Need secondary groups to access MIDI and USB devices + sec_gids = ( getgrnam('plugdev').gr_gid, getgrnam('audio').gr_gid ) + os.setgroups( sec_gids ) + + os.setuid( pwObj.pw_uid ) + os.execl( "/usr/local/bin/mustang_midi", "mustang_midi", "%s" % midi_device, "%s" % midi_channel )