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()
|