--- /dev/null
+"""
+TracebackPrinter.py - Prints the current stack trace to a specified
+file when SIGUSR1 is received.
+---
+Based-On: python-traceback-signal
+ <https://github.com/angelcam/python-traceback-signal>
+"""
+
+import os
+import sys
+import traceback
+import signal
+
+def print_traceback(wfd, frame):
+ msg = "Traceback signal received.\nTraceback (most recent call last):\n"
+ msg += ''.join(traceback.format_stack(frame))
+ os.write(wfd, msg)
+
+def register_sigusr(wfd):
+ def sigusr_handler(_, frame):
+ # first param is which signal
+ print_traceback(wfd, frame)
+
+ signal.signal(signal.SIGUSR1, sigusr_handler)
+
+def traceback_init(f):
+ wfd = os.open(f, os.O_WRONLY | os.O_APPEND | os.O_CREAT, 0o600)
+ register_sigusr(wfd)
import socket
from posix import geteuid
from OpenDispense import OpenDispense as Dispense
+import TracebackPrinter
CREDITS="""
This vending machine software brought to you by:
op.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='spit out lots of debug output')
op.add_option('-q', '--quiet', dest='quiet', action='store_true', default=False, help='only report errors')
op.add_option('--pid-file', dest='pid_file', metavar='FILE', default='', help='store daemon\'s pid in the given file')
+ op.add_option('--traceback-file', dest='traceback_file', default='', help='destination to print tracebacks when receiving SIGUSR1')
options, args = op.parse_args()
if len(args) != 0:
if options.daemon: become_daemon()
set_up_logging(options)
if options.pid_file != '': create_pid_file(options.pid_file)
-
+ if options.traceback_file != '': TracebackPrinter.traceback_init(options.traceback_file)
return options, config_opts
def clean_up_nicely(options, config_opts):
continue
# run_forever(rfh, wfh, options, config_opts)
-
+
try:
vserver = VendServer()
vserver.run_forever(rfh, wfh, options, config_opts)
NAME=vendserver
DAEMON="/usr/local/uccvend-vendserver/vendserver"
PIDFILE=/var/run/$NAME.pid
+TBFILE=/var/run/vendtraces.log
SCRIPTNAME=/etc/init.d/$NAME
DAEMON_ARGS=""
d_start() {
start-stop-daemon --start --pidfile $PIDFILE --nicelevel 5 \
--startas $DAEMON -- -d -sdaemon --pid-file=$PIDFILE \
- $DAEMON_ARGS
+ --traceback-file=$TBFILE $DAEMON_ARGS
}
d_stop() {
setup(
name='uccvend-vendserver',
- version='1.1',
+ version='1.1.1',
description='UCC Snack Machine Server Code',
long_description=readme + '\n\n' + history,
author='ACC Murphy',