Skip to content
pybox 7.15 KiB
Newer Older
lucasgrelaud's avatar
lucasgrelaud committed
#!/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)