diff --git a/scrapy/trunk/scrapy/contrib/pbcluster/master/manager.py b/scrapy/trunk/scrapy/contrib/pbcluster/master/manager.py
index 8fd805fd7..85299a61d 100644
--- a/scrapy/trunk/scrapy/contrib/pbcluster/master/manager.py
+++ b/scrapy/trunk/scrapy/contrib/pbcluster/master/manager.py
@@ -31,12 +31,12 @@ class Node:
self.master = master
def _set_status(self, status):
+ self.status_as_dict = status
if not status:
self.available = False
else:
self.available = True
self.running = status['running']
- self.closing = status['closing']
self.maxproc = status['maxproc']
self.starttime = status['starttime']
self.timestamp = status['timestamp']
diff --git a/scrapy/trunk/scrapy/contrib/pbcluster/master/web.py b/scrapy/trunk/scrapy/contrib/pbcluster/master/web.py
index 6a54172f3..1a2c9aae1 100644
--- a/scrapy/trunk/scrapy/contrib/pbcluster/master/web.py
+++ b/scrapy/trunk/scrapy/contrib/pbcluster/master/web.py
@@ -4,7 +4,8 @@ from pydispatch import dispatcher
from scrapy.spider import spiders
from scrapy.management.web import banner, webconsole_discover_module
-from scrapy.contrib.pbcluster.master.manager import ClusterMaster, priorities
+from scrapy.contrib.pbcluster.master.manager import *
+from scrapy.utils.serialization import serialize
class ClusterMasterWeb(ClusterMaster):
webconsole_id = 'cluster_master'
@@ -21,6 +22,8 @@ class ClusterMasterWeb(ClusterMaster):
return self.render_nodes(wc_request)
elif wc_request.path == '/cluster_master/domains/':
return self.render_domains(wc_request)
+ elif wc_request.path == '/cluster_master/ws/':
+ return self.webconsole_control(wc_request, ws=True)
elif wc_request.args:
changes = self.webconsole_control(wc_request)
@@ -44,22 +47,56 @@ class ClusterMasterWeb(ClusterMaster):
return str(s)
- def webconsole_control(self, wc_request):
+ def webconsole_control(self, wc_request, ws=False):
args = wc_request.args
-
if "updatenodes" in args:
self.update_nodes()
+ if ws:
+ return self.ws_status(wc_request)
if "schedule" in args:
- self.schedule(args["schedule"], priority=eval(args["priority"][0]))
+ if ws:
+ sep = ","
+ domains = args["schedule"][0].split(sep)
+ else:
+ sep = "\r"
+ domains = args["schedule"]
+ priority = eval(args.get("priority", ["PRIORITY_NORMAL"])[0])
+ slist = args.get("settings", [""])[0].split(sep)
+ spider_settings = {}
+ for s in slist:
+ try:
+ k, v = s.strip().split("=")
+ except ValueError:
+ pass
+ else:
+ spider_settings[k] = v
+ self.schedule(domains, spider_settings, priority)
+ if ws:
+ return self.ws_status(wc_request)
if "stop" in args:
- self.stop(args["stop"])
+ if ws:
+ domains = args["stop"][0].split(",")
+ else:
+ domains=args["stop"]
+ self.stop(domains)
+ if ws:
+ return self.ws_status(wc_request)
if "remove" in args:
- self.remove(args["remove"])
+ if ws:
+ domains = args["remove"][0].split(",")
+ else:
+ domains=args["remove"]
+ self.remove(domains)
+ if ws:
+ return self.ws_status(wc_request)
- return ""
+ if ws:
+ return self.ws_status(wc_request)
+ else:
+ return ""
def render_nodes(self, wc_request):
if wc_request.args:
@@ -110,7 +147,7 @@ class ClusterMasterWeb(ClusterMaster):
for domain in sorted(inactive_domains):
s += "\n" % domain
s += "\n"
- s += "\n"
+ s += "
\n"
s += "Priority:
\n"
s += "\n"
+ s += "
\n"
+ s += "Spider settings:
\n"
+ s += "\n"
s += "