#!/usr/bin/env python # # EnvBox Protocol implementation # Version 1.0 # """ ChangeLog """ """ v1.0 : Initial Release """ import select import re import time import array import struct from envbox_database import * from envbox_parser import * from envbox_serial import * from envbox_server import * """*****************************************************""" """ """ """ Software Defines & Parmeters """ """ """ """*****************************************************""" SOFTWARE_VERSION = '1.0' RS232_BAUDRATE = 115200 "SERVER_TCP_IP = '192.168.1.1'" SERVER_TCP_IP ='127.0.0.1' SERVER_TCP_PORT = 3081 SERVER_BUFFER_SIZE = 128 SERVER_TIMEOUT = 600 RETRIES = 3 """*****************************************************""" """ """ """ Misc & debug Functions """ """ """ """*****************************************************""" def tsprint( txt ): print time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime()) + ' : ' + txt def test_device( device ): try: d = envbox( device ) try : res = d.cmd( 'BoardType' ) except: res = None if res == 2: print 'PrismaMedia II' return 0 elif res == 3: print 'PrismaMedia-Eco' return 0 else: print 'Unkown Device ' + device return 1 except: print 'Invalid device ' + device return 1 """*****************************************************""" """ """ """ Server & Daemon Functions """ """ """ """*****************************************************""" import sys, os def server( device ): d = envbox( device ) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((SERVER_TCP_IP, SERVER_TCP_PORT)) s.listen( 1 ) while True: conn, addr = s.accept() nxst = NumeriflashXmlServerThread( conn, addr[0], addr[1] ) conn.close() sys.exit(2) import signal conn = None runvar = True def signal_handler(signal, frame): runvar = False conn.close() def daemonize(): try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before #print pid sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) os.setsid() sys.stdout=open("/dev/null", 'w+') sys.stdin=open("/dev/null", 'r') signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) """*****************************************************""" """ """ """ Main Application """ """ """ """*****************************************************""" if __name__ == "__main__": import sys argc = len( sys.argv ) # help call if argc == 1: # Help print 'Usage : envbox [-l|-t|-v|-h|-s] [-d device] [Command [value]]' print sys.exit(1) # # Argument Parsing # cmd_test = False cmd_server = False cmd_query = False device = '/dev/serial/by-id/usb-STMicroelectronics_STM32_Virtual_ComPort_in_FS_Mode_00000000050C-if00' argoff = 1 for arg in sys.argv: # Print Command List if arg == '-l': envbox_db.printCommandList() sys.exit(1) # Print version if arg == '-v': print 'envbox communication utility v' + SOFTWARE_VERSION sys.exit(1) # Help elif arg == '-h': print 'Usage : envbox Command [value]' sys.exit(1) elif arg == '-s': print 'Running as a XML server' cmd_server = True elif arg == '-t': cmd_test = True try: device = sys.argv[ sys.argv.index( arg ) + 1 ] except: print 'Syntax: -t device_to_test' sys.exit(1) elif arg == '-d': try: device = sys.argv[ sys.argv.index( arg ) + 1 ] argoff = argoff+2 except: print 'Syntax: -d device_to_use' sys.exit(1) # # Device Testing # if cmd_test == True: res = test_device( device ) sys.exit( res ) # # Server Operation # if cmd_server == True: try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before #print pid sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) os.setsid() sys.stdout=open('/root/envbox_'+ time.strftime("%a_%d_%b_%Y_%H%M%S", time.localtime()) + '.log', 'w+', 0) sys.stdin=open("/dev/null", 'r') signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) # May fail if udev is not started yet d = envbox( device ) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((SERVER_TCP_IP, SERVER_TCP_PORT)) s.listen( 1 ) s.settimeout( SERVER_TIMEOUT ) clients = [] while runvar: try: conn, addr = s.accept() except socket.timeout: if NumeriflashXmlServerThread.watchdog: tsprint( 'System has been inactive for ' + str(SERVER_TIMEOUT) + ' seconds => Exiting' ) break else: NumeriflashXmlServerThread.watchdog = True continue except: tsprint( 'Server exception -> Exiting' ) break nxst = NumeriflashXmlServerThread( conn, addr[0], addr[1], d, True, device ) clients.append( nxst ) clients[:] = [ x for x in clients if x.isAlive() ] for client in clients: client.stop() sys.exit(0) # # Command Line Operation # d = envbox( device ) if argc == 1+argoff: cmd = sys.argv[argoff] res = d.cmd( cmd ) print res elif argc == 2+argoff: cmd = sys.argv[argoff] if envbox_db.isCommand( cmd ): value = sys.argv[argoff+1] res = d.cmd( cmd, value ) print res else: cmd = cmd + sys.argv[ argoff + 1 ] res = d.cmd( cmd ) print res elif argc == argoff + 3: cmd = sys.argv[ argoff ] + sys.argv[ argoff + 1 ] value = sys.argv[argoff+2] res = d.cmd( cmd, value ) print res else: print 'Usage : envbox Command [value]' sys.exit(2)