scheduler in widget menu, thanks Niphlod
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-08-01 01:02:41) dev
|
Version 2.00.0 (2012-08-01 09:04:27) dev
|
||||||
|
|||||||
+96
-7
@@ -14,6 +14,7 @@ import sys
|
|||||||
import cStringIO
|
import cStringIO
|
||||||
import time
|
import time
|
||||||
import thread
|
import thread
|
||||||
|
import threading
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
@@ -173,6 +174,7 @@ class web2pyDialog(object):
|
|||||||
root.title('web2py server')
|
root.title('web2py server')
|
||||||
self.root = Tkinter.Toplevel(root)
|
self.root = Tkinter.Toplevel(root)
|
||||||
self.options = options
|
self.options = options
|
||||||
|
self.scheduler_processes = {}
|
||||||
self.menu = Tkinter.Menu(self.root)
|
self.menu = Tkinter.Menu(self.root)
|
||||||
servermenu = Tkinter.Menu(self.menu, tearoff=0)
|
servermenu = Tkinter.Menu(self.menu, tearoff=0)
|
||||||
httplog = os.path.join(self.options.folder, 'httpserver.log')
|
httplog = os.path.join(self.options.folder, 'httpserver.log')
|
||||||
@@ -190,6 +192,12 @@ class web2pyDialog(object):
|
|||||||
self.pagesmenu = Tkinter.Menu(self.menu, tearoff=0)
|
self.pagesmenu = Tkinter.Menu(self.menu, tearoff=0)
|
||||||
self.menu.add_cascade(label='Pages', menu=self.pagesmenu)
|
self.menu.add_cascade(label='Pages', menu=self.pagesmenu)
|
||||||
|
|
||||||
|
#scheduler menu
|
||||||
|
self.schedmenu = Tkinter.Menu(self.menu, tearoff=0)
|
||||||
|
self.menu.add_cascade(label='Scheduler', menu=self.schedmenu)
|
||||||
|
#start and register schedulers from options
|
||||||
|
self.update_schedulers(start=True)
|
||||||
|
|
||||||
helpmenu = Tkinter.Menu(self.menu, tearoff=0)
|
helpmenu = Tkinter.Menu(self.menu, tearoff=0)
|
||||||
|
|
||||||
# Home Page
|
# Home Page
|
||||||
@@ -230,7 +238,7 @@ class web2pyDialog(object):
|
|||||||
self.ips[ip] = Tkinter.Radiobutton(
|
self.ips[ip] = Tkinter.Radiobutton(
|
||||||
self.root,text='%s (%s)' % (legend,ip),
|
self.root,text='%s (%s)' % (legend,ip),
|
||||||
variable=self.selected_ip, value=ip)
|
variable=self.selected_ip, value=ip)
|
||||||
self.ips[ip].grid(row=row, column=1, sticky=sticky)
|
self.ips[ip].grid(row=row, column=1, sticky=sticky)
|
||||||
if row==0: self.ips[ip].select()
|
if row==0: self.ips[ip].select()
|
||||||
row+=1
|
row+=1
|
||||||
shift = row
|
shift = row
|
||||||
@@ -295,6 +303,63 @@ class web2pyDialog(object):
|
|||||||
else:
|
else:
|
||||||
self.tb = None
|
self.tb = None
|
||||||
|
|
||||||
|
def update_schedulers(self, start=False):
|
||||||
|
x = 0
|
||||||
|
apps = []
|
||||||
|
available_apps = [arq for arq in os.listdir('applications/')]
|
||||||
|
available_apps = [arq for arq in available_apps
|
||||||
|
if os.path.exists('applications/%s/models/scheduler.py' % arq)]
|
||||||
|
if start:
|
||||||
|
#the widget takes care of starting the scheduler
|
||||||
|
if self.options.scheduler and self.options.with_scheduler:
|
||||||
|
apps = [app.strip() for app in self.options.scheduler.split(',')
|
||||||
|
if app in available_apps]
|
||||||
|
for app in apps:
|
||||||
|
self.try_start_scheduler(app)
|
||||||
|
|
||||||
|
#reset the menu
|
||||||
|
self.schedmenu.delete(0, len(available_apps))
|
||||||
|
for arq in available_apps:
|
||||||
|
if arq not in self.scheduler_processes:
|
||||||
|
item = lambda u = arq: self.try_start_scheduler(u)
|
||||||
|
self.schedmenu.add_command(label="start %s" % arq,
|
||||||
|
command=item)
|
||||||
|
if arq in self.scheduler_processes:
|
||||||
|
item = lambda u = arq: self.try_stop_scheduler(u)
|
||||||
|
self.schedmenu.add_command(label="stop %s" % arq,
|
||||||
|
command=item)
|
||||||
|
|
||||||
|
def start_schedulers(self, app):
|
||||||
|
try:
|
||||||
|
from multiprocessing import Process
|
||||||
|
except:
|
||||||
|
sys.stderr.write('Sorry, -K only supported for python 2.6-2.7\n')
|
||||||
|
return
|
||||||
|
code = "from gluon import current;current._scheduler.loop()"
|
||||||
|
print 'starting scheduler from widget for "%s"...' % app
|
||||||
|
args = (app,True,True,None,False,code)
|
||||||
|
logging.getLogger().setLevel(self.options.debuglevel)
|
||||||
|
p = Process(target=run, args=args)
|
||||||
|
self.scheduler_processes[app] = p
|
||||||
|
self.update_schedulers()
|
||||||
|
print "Currently running %s scheduler processes" % (len(self.scheduler_processes))
|
||||||
|
p.start()
|
||||||
|
print "Processes started"
|
||||||
|
|
||||||
|
def try_stop_scheduler(self, app):
|
||||||
|
if app in self.scheduler_processes:
|
||||||
|
p = self.scheduler_processes[app]
|
||||||
|
del self.scheduler_processes[app]
|
||||||
|
p.terminate()
|
||||||
|
p.join()
|
||||||
|
self.update_schedulers()
|
||||||
|
|
||||||
|
def try_start_scheduler(self, app):
|
||||||
|
if app not in self.scheduler_processes:
|
||||||
|
t = threading.Thread(target=self.start_schedulers, args=(app,))
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
|
||||||
def checkTaskBar(self):
|
def checkTaskBar(self):
|
||||||
""" Check taskbar status """
|
""" Check taskbar status """
|
||||||
|
|
||||||
@@ -339,15 +404,19 @@ class web2pyDialog(object):
|
|||||||
|
|
||||||
def quit(self, justHide=False):
|
def quit(self, justHide=False):
|
||||||
""" Finish the program execution """
|
""" Finish the program execution """
|
||||||
|
|
||||||
if justHide:
|
if justHide:
|
||||||
self.root.withdraw()
|
self.root.withdraw()
|
||||||
else:
|
else:
|
||||||
|
try:
|
||||||
|
scheds = self.scheduler_processes.keys()
|
||||||
|
for t in scheds:
|
||||||
|
self.try_stop_scheduler(t)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
try:
|
try:
|
||||||
self.server.stop()
|
self.server.stop()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.tb.Destroy()
|
self.tb.Destroy()
|
||||||
except:
|
except:
|
||||||
@@ -385,11 +454,11 @@ class web2pyDialog(object):
|
|||||||
proto = 'https'
|
proto = 'https'
|
||||||
else:
|
else:
|
||||||
proto = 'http'
|
proto = 'http'
|
||||||
|
|
||||||
self.url = '%s://%s:%s' % (proto, ip, port)
|
self.url = '%s://%s:%s' % (proto, ip, port)
|
||||||
self.connect_pages()
|
self.connect_pages()
|
||||||
self.button_start.configure(state='disabled')
|
self.button_start.configure(state='disabled')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
options = self.options
|
options = self.options
|
||||||
req_queue_size = options.request_queue_size
|
req_queue_size = options.request_queue_size
|
||||||
@@ -692,6 +761,14 @@ def console():
|
|||||||
default=None,
|
default=None,
|
||||||
help=msg)
|
help=msg)
|
||||||
|
|
||||||
|
msg = 'run schedulers alongside webserver'
|
||||||
|
parser.add_option('-X',
|
||||||
|
'--with-scheduler',
|
||||||
|
action='store_true',
|
||||||
|
default=False,
|
||||||
|
dest='with_scheduler',
|
||||||
|
help=msg)
|
||||||
|
|
||||||
msg = 'run doctests in web2py environment; ' +\
|
msg = 'run doctests in web2py environment; ' +\
|
||||||
'TEST_PATH like a/c/f (c,f optional)'
|
'TEST_PATH like a/c/f (c,f optional)'
|
||||||
parser.add_option('-T',
|
parser.add_option('-T',
|
||||||
@@ -889,7 +966,7 @@ def start_schedulers(options):
|
|||||||
except:
|
except:
|
||||||
p.terminate()
|
p.terminate()
|
||||||
p.join()
|
p.join()
|
||||||
|
|
||||||
|
|
||||||
def start(cron=True):
|
def start(cron=True):
|
||||||
""" Start server """
|
""" Start server """
|
||||||
@@ -958,13 +1035,14 @@ def start(cron=True):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# ## if -K
|
# ## if -K
|
||||||
if options.scheduler:
|
if options.scheduler and not options.with_scheduler:
|
||||||
try:
|
try:
|
||||||
start_schedulers(options)
|
start_schedulers(options)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# ## if -N or not cron disable cron in this *process*
|
# ## if -N or not cron disable cron in this *process*
|
||||||
# ## if --softcron use softcron
|
# ## if --softcron use softcron
|
||||||
# ## use hardcron in all other cases
|
# ## use hardcron in all other cases
|
||||||
@@ -1047,6 +1125,11 @@ end tell
|
|||||||
if not options.password and not options.nobanner:
|
if not options.password and not options.nobanner:
|
||||||
print 'no password, no admin interface'
|
print 'no password, no admin interface'
|
||||||
|
|
||||||
|
# ##-X (if no tk, the widget takes care of it himself)
|
||||||
|
if not root and options.scheduler and options.with_scheduler:
|
||||||
|
t = threading.Thread(target=start_schedulers, args=(options,))
|
||||||
|
t.start()
|
||||||
|
|
||||||
# ## start server
|
# ## start server
|
||||||
|
|
||||||
(ip, port) = (options.ip, int(options.port))
|
(ip, port) = (options.ip, int(options.port))
|
||||||
@@ -1086,9 +1169,15 @@ end tell
|
|||||||
server.start()
|
server.start()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
server.stop()
|
server.stop()
|
||||||
|
try:
|
||||||
|
t.join()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
logging.shutdown()
|
logging.shutdown()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user