From 27fb51e6e14125c3276f5b98d993d8fa3c61dd13 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Sat, 20 Aug 2016 11:56:23 +0100 Subject: [PATCH] import old server code --- server.py | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 server.py diff --git a/server.py b/server.py new file mode 100644 index 0000000..8f0fff5 --- /dev/null +++ b/server.py @@ -0,0 +1,241 @@ +#!/usr/bin/python + +import logging +import sys +import socket +import pwd +import os +import time +from ConfigParser import RawConfigParser +from plibbuddy import BuddyDevice + +######################################### +# Decoding macros +########################################## + +def macro_color (red, green, blue): + message = 'C:%d:%d:%d' % (red, green, blue) + message += "\nX\nS\nZ\nZ\n" + return message + +def macro_heart (): + message = 'H:1' + message += "\nX\nS\nZ\nZ\n" + return message + +def macro_move_flap(): + message = "ML\nX\nS\nS\n" + message += "MR\nX\nS\nS\n" + message += "ML\nX\nS\nS\n" + return message + macro_flap() + +def macro_flap (heart=0): + message = '' + for i in range(2): + message += "L\n" + message += "WU\n" + if heart: + message += "H:1\n" + message += "X\nS\nL\n" + message += "WD\nX\nS\n" + return message + +def macro_heart2(): + message = "H:1\nX\nS\n" + message += "Z\nS\n" + message += "H:1\nX\nS\n" + message += "Z\nS\n\nZ\nZ\n" + return message + +def macro_demo(num = 1): + message = '' + for i in range(num): + message += "C:1:0:0\nH:0\nML\nWD\nX\nS\nS\n" + message += "C:0:1:0\nH:1\nMR\nWU\nX\nS\nS\n" + message += "C:0:0:1\nH:0\nML\nWD\nX\nS\nS\n" + message += "C:1:0:1\nH:1\nMR\nWU\nX\nS\nS\n" + message += "C:1:1:0\nH:0\nML\nWD\nX\nS\nS\n" + message += "C:0:1:1\nH:1\nMR\nWU\nX\nS\nS\n" + message += "C:1:1:1\nH:0\nML\nWD\nX\nS\nS\n" + message += "Z\nZ\n" + return message + +def do_color(buddy, red, green, blue): + r, g, b = buddy.getColors() + try: + param1 = int(red) + param2 = int(green) + param3 = int(blue) + except: + param1 = -1 + param2 = -1 + param3 = -1 + if (param1 == -1): + param1 = r + if (param2 == -1): + param2 = g + if (param3 == -1): + param3 = b + buddy.setHeadColors(param1, param2, param3) + buddy.doCmd(0.5) + +def decode_buddy(buddy, msg): + orders = msg.split("\n") + for str in (orders): + cod = str.split(':') + param = 0 + if cod[0] == 'RED' or cod[0] == 'R': + try: do_color(buddy, cod[1], -1, -1) + except: pass + elif cod[0] == 'GREEN' or cod[0] == 'G': + try: do_color(buddy,-1, cod[1], -1) + except: pass + elif cod[0] == 'BLUE' or cod[0] == 'B': + try: do_color(buddy, -1, -1, cod[1]) + except: pass + elif cod[0] == 'YELLOW': + try: do_color(buddy, cod[1], cod[1], -1) + except: pass + continue + elif cod[0] == 'SAPHIRE': + try: do_color(buddy, -1, cod[1], cod[1]) + except: pass + elif cod[0] == 'VIOLET': + try: do_color(buddy, cod[1], -1, cod[1]) + except: pass + elif cod[0] == 'HEART' or cod[0] == 'H': + try: + param = int(cod[1]) + except: + param = 0 + buddy.setHeart(param) + elif cod[0] == 'C': + try: do_color(buddy, cod[1], cod[2], cod[3]) + except: pass + elif cod[0] == 'MR': + buddy.flick(buddy.RIGHT) + continue + elif cod[0] == 'ML': + buddy.flick(buddy.LEFT) + elif cod[0] == 'SLEEP' or cod[0] == 'S': + time.sleep(0.1) + elif cod[0] == 'WU': + buddy.wing(buddy.UP) + elif cod[0] == 'WD': + buddy.wing(buddy.DOWN) + elif cod[0] == 'EXEC' or cod[0] == 'X': + buddy.pumpMessage() + elif cod[0] == 'CLEAR' or cod[0] == 'L': + buddy.resetMessage() + elif cod[0] == 'RESET' or cod[0] == 'Z': + buddy.resetMessage() + buddy.pumpMessage() + elif cod[0] == 'MACRO_FLAP': + decode_buddy(buddy, macro_move_flap()) + elif cod[0] == 'MACRO_FLAP2': + decode_buddy(buddy, macro_flap()) + elif cod[0] == 'MACRO_RED': + decode_buddy(buddy, macro_color(1, 0, 0)) + elif cod[0] == 'MACRO_GREEN': + decode_buddy(buddy, macro_color(0, 1, 0)) + elif cod[0] == 'MACRO_BLUE': + decode_buddy(buddy, macro_color(0,0,1)) + elif cod[0] == 'MACRO_YELLOW': + decode_buddy(buddy, macro_color(1,1,0)) + elif cod[0] == 'MACRO_VIOLET': + decode_buddy(buddy, macro_color(1,0,1)) + elif cod[0] == 'MACRO_SAPHIRE': + decode_buddy(buddy, macro_color(0,1,1)) + elif cod[0] == 'MACRO_LBLUE': + decode_buddy(buddy, macro_color(1,1,1)) + elif cod[0] == 'MACRO_HEART': + decode_buddy(buddy, macro_heart()) + elif cod[0] == 'MACRO_HEART2': + decode_buddy(buddy, macro_heart2()) + elif cod[0] == 'DEMO': + decode_buddy(buddy, macro_demo()) + +####################################### +# MAIN program +####################################### + +# Default config +config = RawConfigParser( + { 'port': 8888, + 'address': '0.0.0.0', + 'deamon': False, + 'user': 'nobody', + 'loglevel': 'info', + 'logfile': 'console', + 'usbproduct': 0001, + } +) +config._sections = {'network':{}, 'system':{}} +config_files = [ 'pybuddy.cfg', + '~/.pybuddy.cfg', + '/etc/pybuddy/pybuddy.cfg', + '/usr/local/etc/pybuddy.cfg'] + +# Parse config +if len(sys.argv) > 1: + config_files.append(sys.argv[1]) + +config_read = config.read(config_files) + +if config.get('system', 'logfile') != 'console': + logging.basicConfig( + filename = config.get('system', 'logfile'), + format = '%(asctime)s %(levelname)-8s %(message)s', + ) +else: + logging.basicConfig( + stream = sys.stderr, + format = '%(asctime)s %(levelname)-8s %(message)s' + ) + +log = logging.getLogger('pybuddy') +if config.get('system', 'loglevel') == 'debug': + log.setLevel(logging.DEBUG) +elif config.get('system', 'loglevel') == 'info': + log.setLevel(logging.INFO) + +if config_read: + log.info('Read config file: %s', config_read[0]) + +# Initialize device +log.info('Starting search...') +try: + buddy = BuddyDevice(0, int(config.get("system", "usbproduct"))) +except NoBuddyException, e: + log.error('Not found!') + sys.exit(1) + +if config.get('system', 'daemon') == True: + # Daemonize + log.info('Starting daemon...') + if os.fork() == 0: + os.setsid() + else: + sys.exit(0) + +# Create server socket +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) +s.bind((config.get('network', 'address'), int(config.get('network', 'port')))) + +# Drop privileges +try: + uid = pwd.getpwnam(config.get('system', 'user'))[2] +except KeyError: + log.error('Username %s not found, exiting...', config.get('system', 'user')) + sys.exit(1) +os.setuid(uid) + +# Main message loop +while 1: + try: + message, address = s.recvfrom(8192) + log.debug('Got data from %s', address) + decode_buddy(buddy, message) + except (KeyboardInterrupt, SystemExit): + raise \ No newline at end of file