Add init framework and automatic start-stop
This commit is contained in:
parent
f84fceb767
commit
ae5b425bf2
7 changed files with 208 additions and 14 deletions
|
|
@ -1,11 +1,7 @@
|
|||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0004", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0005", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0006", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0007", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0010", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0011", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0012", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0013", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0014", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0015", GROUP="plugdev"
|
||||
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1ed8", ATTRS{idProduct}=="0016", GROUP="plugdev"
|
||||
# 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"
|
||||
|
||||
# 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"
|
||||
|
|
|
|||
2
60-midi.rules
Normal file
2
60-midi.rules
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
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"
|
||||
50
install.sh
Executable file
50
install.sh
Executable file
|
|
@ -0,0 +1,50 @@
|
|||
#!/bin/bash
|
||||
|
||||
BINDIR=/usr/local/bin
|
||||
INITDIR=/etc/init.d
|
||||
UDEVDIR=/etc/udev/rules.d
|
||||
|
||||
if [ ! -f "mustang_midi" ]; then
|
||||
echo "Must build mustang_midi first!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Create non-privileged user for MIDI bridge"
|
||||
|
||||
useradd -M -s /bin/false mustang-user
|
||||
|
||||
echo "Copy program and support scripts to $BINDIR"
|
||||
|
||||
cp -f mustang_bridge_start $BINDIR
|
||||
chmod 0755 $BINDIR/mustang_bridge_start
|
||||
chown root:root $BINDIR/mustang_bridge_start
|
||||
|
||||
cp -f mustang_bridge_stop $BINDIR
|
||||
chmod 0755 $BINDIR/mustang_bridge_stop
|
||||
chown root:root $BINDIR/mustang_bridge_stop
|
||||
|
||||
cp -f mustang_midi $BINDIR
|
||||
chmod 0755 $BINDIR/mustang_midi
|
||||
chown root:root $BINDIR/mustang_midi
|
||||
|
||||
echo "Copy init script to $INITDIR and register"
|
||||
|
||||
cp -f mustang_bridge $INITDIR
|
||||
chmod 0755 $INITDIR/mustang_bridge
|
||||
chown root:root $INITDIR/mustang_bridge
|
||||
|
||||
update-rc.d mustang_bridge defaults
|
||||
|
||||
echo "Copy udev rules to $UDEVDIR and refresh system"
|
||||
|
||||
cp -f 50-mustang.rules $UDEVDIR
|
||||
chmod 0644 $UDEVDIR/50-mustang.rules
|
||||
chown root:root $UDEVDIR/50-mustang.rules
|
||||
|
||||
cp -f 60-midi.rules $UDEVDIR
|
||||
chmod 0644 $UDEVDIR/60-midi.rules
|
||||
chown root:root $UDEVDIR/60-midi.rules
|
||||
|
||||
udevadm control --reload
|
||||
|
||||
echo "Done!"
|
||||
40
mustang_bridge
Executable file
40
mustang_bridge
Executable file
|
|
@ -0,0 +1,40 @@
|
|||
#! /bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: mustang_bridge
|
||||
# Required-Start: mountkernfs
|
||||
# Required-Stop:
|
||||
# Default-Start: S
|
||||
# Default-Stop:
|
||||
# Short-Description: Setup /var/run/mustang directory
|
||||
### END INIT INFO
|
||||
|
||||
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
||||
|
||||
. /lib/init/vars.sh
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
do_start() {
|
||||
[ -d /var/run/mustang ] || mkdir /var/run/mustang
|
||||
if [ -z "$(ls -A -- "/var/run/mustang")" ]; then
|
||||
touch /var/run/mustang/mustang_0000
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
do_start
|
||||
;;
|
||||
restart|reload|force-reload)
|
||||
echo "Error: argument '$1' not supported" >&2
|
||||
exit 3
|
||||
;;
|
||||
stop|status)
|
||||
# No-op
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 start|stop" >&2
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
72
mustang_bridge_start
Executable file
72
mustang_bridge_start
Executable file
|
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
from os.path import expanduser
|
||||
from pwd import getpwnam
|
||||
from grp import getgrnam
|
||||
|
||||
import glob
|
||||
import syslog
|
||||
from string import split
|
||||
|
||||
import usb.core
|
||||
|
||||
####### Start User Edits #########
|
||||
|
||||
# Controller USB parms
|
||||
control_vid = 0x0763
|
||||
control_pid = 0x0160
|
||||
|
||||
# Mustang USB parms
|
||||
mustang_vid = 0x1ed8
|
||||
mustang_pid = 0x0016
|
||||
|
||||
# Controller MIDI device
|
||||
midi_device = 2
|
||||
|
||||
# MIDI listen channel
|
||||
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 )
|
||||
|
||||
pid = os.getpid()
|
||||
# syslog.syslog( "%d: Starting" % pid )
|
||||
|
||||
# was it found?
|
||||
if controller and mustang:
|
||||
os.chdir( rundir )
|
||||
filelist = glob.glob( 'mustang_*' )
|
||||
|
||||
if len( filelist ) == 1:
|
||||
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 )
|
||||
else:
|
||||
syslog.syslog( "%d: /var/run/mustang is not properly setup" % pid )
|
||||
35
mustang_bridge_stop
Executable file
35
mustang_bridge_stop
Executable file
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
from glob import glob
|
||||
from syslog import syslog
|
||||
from string import split
|
||||
import signal
|
||||
|
||||
pid = os.getpid()
|
||||
# syslog( "%d: Starting" % pid )
|
||||
|
||||
rundir = "/var/run/mustang/"
|
||||
|
||||
# Check for pid file
|
||||
os.chdir( rundir )
|
||||
filelist = glob( 'mustang_*' )
|
||||
|
||||
if len( filelist ) == 1:
|
||||
lockfile = filelist[0]
|
||||
oldpid = split( lockfile, '_' )[1]
|
||||
|
||||
# See if the process still exists
|
||||
# syslog( "%d: Check for path /proc/%s" % (pid, oldpid) )
|
||||
if os.path.exists( "/proc/%s" % oldpid ):
|
||||
# syslog( "%d: Sending sigint to pid %s" % (pid, oldpid) )
|
||||
try:
|
||||
os.kill( int(oldpid), signal.SIGINT )
|
||||
except Exception, e:
|
||||
syslog( "%d: Signal failed: %s" % (pid, e) )
|
||||
pass
|
||||
else:
|
||||
# syslog( "%d: Signal sent" % pid )
|
||||
pass
|
||||
else:
|
||||
syslog( "%d: /var/run/mustang is not properly setup" % pid )
|
||||
|
|
@ -172,9 +172,8 @@ int main( int argc, const char **argv ) {
|
|||
// Don't want sysex, timing, active sense
|
||||
input_handler->ignoreTypes( true, true, true );
|
||||
|
||||
std::cout << "\nTranslating MIDI input - press <enter> to quit.\n";
|
||||
char input;
|
||||
std::cin.get(input);
|
||||
// Block and wait for signal
|
||||
pause();
|
||||
|
||||
delete input_handler;
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue