annotate mcserver/mcserver.py @ 12:9d9169751aba

new server
author gyorgyf
date Fri, 22 Jun 2012 11:48:28 +0100
parents 1adf97ba90c8
children de603f9b7cfd
rev   line source
gyorgyf@0 1 #!/usr/bin/env python
gyorgyf@0 2 # encoding: utf-8
gyorgyf@0 3 """
gyorgyf@0 4 mcserver.py
gyorgyf@0 5
gyorgyf@0 6 Created by George Fazekas on 2012-06-16.
gyorgyf@0 7 Copyright (c) 2012 . All rights reserved.
gyorgyf@0 8 """
gyorgyf@0 9
gyorgyf@12 10 import os,sys,optparse,signal,time,math
gyorgyf@0 11 import cherrypy as cp
gyorgyf@0 12
gyorgyf@0 13 from cherrypy.lib import static
gyorgyf@0 14 import subprocess as sp
gyorgyf@0 15 from subprocess import Popen as spopen
gyorgyf@0 16
gyorgyf@0 17
gyorgyf@0 18 op = optparse.OptionParser()
gyorgyf@0 19 op.add_option('-u', '--user', action="store", dest="USER", default="server", type="str")
gyorgyf@0 20 options, args = op.parse_args()
gyorgyf@0 21 CONFIG_FILE = "mc%(USER)s.cfg" %options.__dict__
gyorgyf@0 22
gyorgyf@0 23 if not os.path.isfile(CONFIG_FILE) :
gyorgyf@4 24 print >> sys.stderr, "Config file not found: %s" %CONFIG_FILE
gyorgyf@0 25 sys.exit(-1)
gyorgyf@0 26
gyorgyf@0 27
gyorgyf@12 28 class Input(object):
gyorgyf@12 29
gyorgyf@12 30 def __init__(self,x,y):
gyorgyf@12 31 self.time = time.time()
gyorgyf@12 32 self.x=float(x)
gyorgyf@12 33 self.y=float(y)
gyorgyf@12 34 self.count = 1
gyorgyf@12 35
gyorgyf@12 36 def __cmp__(self,other):
gyorgyf@12 37 d = math.sqrt( math.pow((self.x-other.x),2) + math.pow((self.y-other.y),2) )
gyorgyf@12 38 if d < 0.05 :
gyorgyf@12 39 return 0
gyorgyf@12 40 else :
gyorgyf@12 41 return -1
gyorgyf@12 42
gyorgyf@12 43 def dead(self):
gyorgyf@12 44 return time.time()-self.time > 1.5
gyorgyf@12 45
gyorgyf@12 46 def __repr__(self):
gyorgyf@12 47 return (self.x,self.y,self.count).__repr__()
gyorgyf@12 48
gyorgyf@12 49 def inc(self):
gyorgyf@12 50 self.time = time.time()
gyorgyf@12 51 self.count += 1
gyorgyf@12 52 print self.count
gyorgyf@12 53
gyorgyf@12 54
gyorgyf@0 55 class MoodConductor:
gyorgyf@0 56
gyorgyf@5 57 def __init__(self):
gyorgyf@12 58 self.inputs = []
gyorgyf@5 59
gyorgyf@0 60 def index(self):
gyorgyf@4 61 return ""
gyorgyf@0 62
gyorgyf@0 63 @cp.expose
gyorgyf@0 64 def mood(self,x,y):
gyorgyf@5 65 print "Received coordinates", x,y, "\n"
gyorgyf@12 66 i = Input(x,y)
gyorgyf@12 67 if i in self.inputs :
gyorgyf@12 68 self.inputs[self.inputs.index(i)].inc()
gyorgyf@12 69 else :
gyorgyf@12 70 self.inputs.insert(0,i)
gyorgyf@12 71 self.inputs = self.inputs[:1]
gyorgyf@12 72 return str()
gyorgyf@5 73
gyorgyf@5 74 @cp.expose
gyorgyf@5 75 def result(self):
gyorgyf@12 76 for i in self.inputs :
gyorgyf@12 77 if i.dead() : self.inputs.remove(i)
gyorgyf@12 78 return self.inputs.__repr__()
gyorgyf@5 79
gyorgyf@0 80
gyorgyf@0 81
gyorgyf@0 82
gyorgyf@0 83 def getProcessPids(port,kill=False):
gyorgyf@0 84 '''Get the pid of the offending Python process given a port after an unsuccessful restart.'''
gyorgyf@0 85 print "Running lsof -i :"+str(port)," ...\n\n"
gyorgyf@0 86 command = "lsof -i :"+str(port)
gyorgyf@0 87 w = spopen(command,stdout=sp.PIPE,stderr=sp.PIPE,shell=True)
gyorgyf@0 88 se = w.stderr.readlines()
gyorgyf@0 89 result = w.stdout.readlines()
gyorgyf@0 90 exitcode = w.wait()
gyorgyf@0 91 if not result :
gyorgyf@0 92 print "getProcessPid:: Unable to obtain process pid. (lsof returned nothing. exitcode: %s)" %str(exitcode)
gyorgyf@0 93 return False
gyorgyf@0 94 import pprint
gyorgyf@0 95 pprint.pprint(result)
gyorgyf@0 96
gyorgyf@0 97 # get heading:
gyorgyf@0 98 ix = None
gyorgyf@0 99 head = result[0].upper()
gyorgyf@0 100 if 'PID' in head:
gyorgyf@0 101 head = filter(lambda x: x != str(), head.split(' '))
gyorgyf@0 102 head = map(lambda x: x.strip().replace(' ',''), head)
gyorgyf@0 103 if 'PID' in head : ix = head.index('PID')
gyorgyf@0 104 # get process pid
gyorgyf@0 105 pids = []
gyorgyf@0 106 for line in result :
gyorgyf@0 107 if 'python' in line.lower() :
gyorgyf@0 108 line = filter(lambda x: x != str(), line.split(' '))
gyorgyf@0 109 line = map(lambda x: x.strip().replace(' ',''), line)
gyorgyf@0 110 try :
gyorgyf@0 111 if ix :
gyorgyf@0 112 pids.append(int(line[ix]))
gyorgyf@0 113 else:
gyorgyf@0 114 numbers = filter(lambda x: x.isdigit(), line)
gyorgyf@0 115 pids.append(int(numbers[0]))
gyorgyf@0 116 except:
gyorgyf@0 117 print 'Error parsing lsof results.'
gyorgyf@0 118 return False
gyorgyf@0 119 print 'Pids found: ',pids
gyorgyf@0 120 # kill if specified
gyorgyf@0 121 if kill :
gyorgyf@0 122 pids_killed = []
gyorgyf@0 123 import signal
gyorgyf@0 124 for pid in pids:
gyorgyf@0 125 print 'Killing process: ',pid
gyorgyf@0 126 try :
gyorgyf@0 127 os.kill(pid,signal.SIGKILL)
gyorgyf@0 128 pids_killed.append(pid)
gyorgyf@0 129 except :
gyorgyf@0 130 print 'Failed: ',pid
gyorgyf@0 131 if pids_killed :
gyorgyf@0 132 print 'Processes killed:',pids_killed,' Waiting 10 secods...'
gyorgyf@0 133 import time
gyorgyf@0 134 time.sleep(10)
gyorgyf@0 135 return True
gyorgyf@0 136 return False
gyorgyf@0 137
gyorgyf@0 138
gyorgyf@0 139 def main(argv=None):
gyorgyf@0 140
gyorgyf@0 141 # Configure and start
gyorgyf@3 142 cp.config.update(CONFIG_FILE)
gyorgyf@0 143 cp.config.update({'tools.staticdir.root': os.getcwd()})
gyorgyf@3 144 cp.tree.mount(MoodConductor(),script_name="/moodconductor",config=CONFIG_FILE)
gyorgyf@2 145 port = int(cp.server.socket_port)
gyorgyf@3 146 ip = cp.server.socket_host
gyorgyf@3 147 print "Trying to bind: %(ip)s:%(port)s" %locals()
gyorgyf@0 148 getProcessPids(port,kill=True)
gyorgyf@0 149 cp.quickstart()
gyorgyf@0 150
gyorgyf@0 151 if __name__ == "__main__":
gyorgyf@0 152 main()