Pārlūkot izejas kodu

Make web interface work again (minimally).

Chris McDonough 18 gadi atpakaļ
vecāks
revīzija
3315d9efb9
1 mainītis faili ar 39 papildinājumiem un 24 dzēšanām
  1. 39 24
      src/supervisor/web.py

+ 39 - 24
src/supervisor/web.py

@@ -30,6 +30,9 @@ import meld3
 from supervisor.process import ProcessStates
 from supervisor.http import NOT_DONE_YET
 
+from supervisor.options import make_namespec
+from supervisor.options import split_namespec
+
 from supervisor.xmlrpc import SystemNamespaceRPCInterface
 from supervisor.xmlrpc import RootRPCInterface
 from supervisor.xmlrpc import Faults
@@ -224,7 +227,7 @@ class TailView(MeldView):
         refresh_anchor = root.findmeld('refresh_anchor')
         if processname is not None:
             refresh_anchor.attributes(href='tail.html?processname=%s' %
-                                      processname)
+                                      urllib.quote(processname))
         else:
             refresh_anchor.deparent()
 
@@ -233,7 +236,8 @@ class TailView(MeldView):
 class StatusView(MeldView):
     def actions_for_process(self, process):
         state = process.get_state()
-        processname = process.config.name
+        processname = urllib.quote(make_namespec(process.group.config.name,
+                                                 process.config.name))
         start = {
         'name':'Start',
         'href':'index.html?processname=%s&action=start' % processname,
@@ -276,14 +280,14 @@ class StatusView(MeldView):
         else:
             return 'statusnominal'
 
-    def make_callback(self, processname, action):
+    def make_callback(self, namespec, action):
         message = None
         supervisord = self.context.supervisord
 
         # the rpc interface code is already written to deal properly in a
         # deferred world, so just use it
         main =   ('supervisor', SupervisorNamespaceRPCInterface(supervisord))
-        system = ('system', SystemNamespaceRPCInterface(main))
+        system = ('system', SystemNamespaceRPCInterface([main]))
 
         rpcinterface = RootRPCInterface([main, system])
 
@@ -318,65 +322,66 @@ class StatusView(MeldView):
                 restartall.delay = 0.05
                 return restartall
 
-            elif processname:
+            elif namespec:
                 def wrong():
-                    return 'No such process named %s' % processname
+                    return 'No such process named %s' % namespec
                 wrong.delay = 0.05
-                group = supervisord.process_group.get(processname) # XXX
+                group_name, process_name = split_namespec(namespec)
+                group = supervisord.process_groups.get(group_name)
                 if group is None:
                     return wrong
-                process = group.processes.get(processname)
+                process = group.processes.get(process_name)
                 if process is None:
                     return wrong
 
                 elif action == 'stop':
-                    callback = rpcinterface.supervisor.stopProcess(processname)
+                    callback = rpcinterface.supervisor.stopProcess(namespec)
                     def stopprocess():
                         result = callback()
                         if result is NOT_DONE_YET:
                             return NOT_DONE_YET
-                        return 'Process %s stopped' % processname
+                        return 'Process %s stopped' % namespec
                     stopprocess.delay = 0.05
                     return stopprocess
 
                 elif action == 'restart':
                     callback = rpcinterface.system.multicall(
                         [ {'methodName':'supervisor.stopProcess',
-                           'params': [processname]},
+                           'params': [namespec]},
                           {'methodName':'supervisor.startProcess',
-                           'params': [processname]},
+                           'params': [namespec]},
                           ]
                         )
                     def restartprocess():
                         result = callback()
                         if result is NOT_DONE_YET:
                             return NOT_DONE_YET
-                        return 'Process %s restarted' % processname
+                        return 'Process %s restarted' % namespec
                     restartprocess.delay = 0.05
                     return restartprocess
 
                 elif action == 'start':
                     try:
                         callback = rpcinterface.supervisor.startProcess(
-                            processname)
+                            namespec)
                     except RPCError, e:
                         if e.code == Faults.SPAWN_ERROR:
                             def spawnerr():
-                                return 'Process %s spawn error' % processname
+                                return 'Process %s spawn error' % namespec
                             spawnerr.delay = 0.05
                             return spawnerr
                     def startprocess():
                         if callback() is NOT_DONE_YET:
                             return NOT_DONE_YET
-                        return 'Process %s started' % processname
+                        return 'Process %s started' % namespec
                     startprocess.delay = 0.05
                     return startprocess
                 
                 elif action == 'clearlog':
                     callback = rpcinterface.supervisor.clearProcessLog(
-                        processname)
+                        namespec)
                     def clearlog():
-                        return 'Log for %s cleared' % processname
+                        return 'Log for %s cleared' % namespec
                     clearlog.delay = 0.05
                     return clearlog
 
@@ -417,16 +422,25 @@ class StatusView(MeldView):
               SupervisorNamespaceRPCInterface(supervisord))]
             )
 
-        processnames = supervisord.processes.keys()
+        processnames = []
+        groups = supervisord.process_groups.values()
+        for group in groups:
+            gprocnames = group.processes.keys()
+            for gprocname in gprocnames:
+                processnames.append((group.config.name, gprocname))
+
         processnames.sort()
+
         data = []
-        for processname in processnames:
+        for groupname, processname in processnames:
             actions = self.actions_for_process(
-                supervisord.processes[processname])
-            info = rpcinterface.supervisor.getProcessInfo(processname)
+                supervisord.process_groups[groupname].processes[processname])
+            sent_name = make_namespec(groupname, processname)
+            info = rpcinterface.supervisor.getProcessInfo(sent_name)
             data.append({
                 'status':info['statename'],
                 'name':processname,
+                'group':groupname,
                 'actions':actions,
                 'state':info['state'],
                 'description':info['description'],
@@ -453,8 +467,9 @@ class StatusView(MeldView):
                 info_text.content(item['description'])
 
                 anchor = tr_element.findmeld('name_anchor')
-                processname = item['name']
-                anchor.attributes(href='tail.html?processname=%s' % processname)
+                processname = make_namespec(item['group'], item['name'])
+                anchor.attributes(href='tail.html?processname=%s' %
+                                  urllib.quote(processname))
                 anchor.content(processname)
 
                 actions = item['actions']