annotate mcserver/mcserver.py @ 5:1adf97ba90c8

added visual client
author gyorgyf
date Thu, 21 Jun 2012 17:14:09 +0100
parents 02b4c5e122e8
children 9d9169751aba
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@0 10 import os,sys,optparse,signal
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@0 28 class MoodConductor:
gyorgyf@0 29
gyorgyf@5 30 def __init__(self):
gyorgyf@5 31 self.x = 0.0
gyorgyf@5 32 self.y = 0.0
gyorgyf@5 33
gyorgyf@0 34 def index(self):
gyorgyf@4 35 return ""
gyorgyf@0 36
gyorgyf@0 37 @cp.expose
gyorgyf@0 38 def mood(self,x,y):
gyorgyf@5 39 print "Received coordinates", x,y, "\n"
gyorgyf@5 40 self.x, self.y = x,y
gyorgyf@5 41 return ""
gyorgyf@5 42
gyorgyf@5 43 @cp.expose
gyorgyf@5 44 def result(self):
gyorgyf@5 45 return "(%s,%s)" %(self.x,self.y)
gyorgyf@5 46
gyorgyf@0 47
gyorgyf@0 48
gyorgyf@0 49
gyorgyf@0 50 def getProcessPids(port,kill=False):
gyorgyf@0 51 '''Get the pid of the offending Python process given a port after an unsuccessful restart.'''
gyorgyf@0 52 print "Running lsof -i :"+str(port)," ...\n\n"
gyorgyf@0 53 command = "lsof -i :"+str(port)
gyorgyf@0 54 w = spopen(command,stdout=sp.PIPE,stderr=sp.PIPE,shell=True)
gyorgyf@0 55 se = w.stderr.readlines()
gyorgyf@0 56 result = w.stdout.readlines()
gyorgyf@0 57 exitcode = w.wait()
gyorgyf@0 58 if not result :
gyorgyf@0 59 print "getProcessPid:: Unable to obtain process pid. (lsof returned nothing. exitcode: %s)" %str(exitcode)
gyorgyf@0 60 return False
gyorgyf@0 61 import pprint
gyorgyf@0 62 pprint.pprint(result)
gyorgyf@0 63
gyorgyf@0 64 # get heading:
gyorgyf@0 65 ix = None
gyorgyf@0 66 head = result[0].upper()
gyorgyf@0 67 if 'PID' in head:
gyorgyf@0 68 head = filter(lambda x: x != str(), head.split(' '))
gyorgyf@0 69 head = map(lambda x: x.strip().replace(' ',''), head)
gyorgyf@0 70 if 'PID' in head : ix = head.index('PID')
gyorgyf@0 71 # get process pid
gyorgyf@0 72 pids = []
gyorgyf@0 73 for line in result :
gyorgyf@0 74 if 'python' in line.lower() :
gyorgyf@0 75 line = filter(lambda x: x != str(), line.split(' '))
gyorgyf@0 76 line = map(lambda x: x.strip().replace(' ',''), line)
gyorgyf@0 77 try :
gyorgyf@0 78 if ix :
gyorgyf@0 79 pids.append(int(line[ix]))
gyorgyf@0 80 else:
gyorgyf@0 81 numbers = filter(lambda x: x.isdigit(), line)
gyorgyf@0 82 pids.append(int(numbers[0]))
gyorgyf@0 83 except:
gyorgyf@0 84 print 'Error parsing lsof results.'
gyorgyf@0 85 return False
gyorgyf@0 86 print 'Pids found: ',pids
gyorgyf@0 87 # kill if specified
gyorgyf@0 88 if kill :
gyorgyf@0 89 pids_killed = []
gyorgyf@0 90 import signal
gyorgyf@0 91 for pid in pids:
gyorgyf@0 92 print 'Killing process: ',pid
gyorgyf@0 93 try :
gyorgyf@0 94 os.kill(pid,signal.SIGKILL)
gyorgyf@0 95 pids_killed.append(pid)
gyorgyf@0 96 except :
gyorgyf@0 97 print 'Failed: ',pid
gyorgyf@0 98 if pids_killed :
gyorgyf@0 99 print 'Processes killed:',pids_killed,' Waiting 10 secods...'
gyorgyf@0 100 import time
gyorgyf@0 101 time.sleep(10)
gyorgyf@0 102 return True
gyorgyf@0 103 return False
gyorgyf@0 104
gyorgyf@0 105
gyorgyf@0 106 def main(argv=None):
gyorgyf@0 107
gyorgyf@0 108 # Configure and start
gyorgyf@3 109 cp.config.update(CONFIG_FILE)
gyorgyf@0 110 cp.config.update({'tools.staticdir.root': os.getcwd()})
gyorgyf@3 111 cp.tree.mount(MoodConductor(),script_name="/moodconductor",config=CONFIG_FILE)
gyorgyf@2 112 port = int(cp.server.socket_port)
gyorgyf@3 113 ip = cp.server.socket_host
gyorgyf@3 114 print "Trying to bind: %(ip)s:%(port)s" %locals()
gyorgyf@0 115 getProcessPids(port,kill=True)
gyorgyf@0 116 cp.quickstart()
gyorgyf@0 117
gyorgyf@0 118 if __name__ == "__main__":
gyorgyf@0 119 main()