Beispiel #1
0
    def render(self):
        supervisord = self.context.supervisord
        form = self.context.form

        if not 'processname' in form:
            tail = 'No process name found'
            processname = None
        else:
            processname = form['processname']
            offset = 0
            limit = form.get('limit', '1024')
            limit = min(-1024, int(limit)*-1 if limit.isdigit() else -1024)
            if not processname:
                tail = 'No process name found'
            else:
                rpcinterface = SupervisorNamespaceRPCInterface(supervisord)
                try:
                    tail = rpcinterface.readProcessStdoutLog(processname,
                                                             limit, offset)
                except RPCError as e:
                    if e.code == Faults.NO_FILE:
                        tail = 'No file for %s' % processname
                    else:
                        tail = 'ERROR: unexpected rpc fault [%d] %s' % (
                            e.code, e.text)

        root = self.clone()

        title = root.findmeld('title')
        title.content('Supervisor tail of process %s' % processname)
        tailbody = root.findmeld('tailbody')
        tailbody.content(tail)

        refresh_anchor = root.findmeld('refresh_anchor')
        if processname is not None:
            refresh_anchor.attributes(
                href='tail.html?processname=%s&limit=%s' % (
                    urllib.quote(processname), urllib.quote(str(abs(limit)))
                    )
            )
        else:
            refresh_anchor.deparent()

        return as_string(root.write_xhtmlstring())
Beispiel #2
0
    def render(self):
        supervisord = self.context.supervisord
        form = self.context.form

        if not 'processname' in form:
            tail = 'No process name found'
            processname = None
        else:
            processname = form['processname']
            offset = 0
            limit = form.get('limit', '1024')
            limit = min(-1024, int(limit)*-1 if limit.isdigit() else -1024)
            if not processname:
                tail = 'No process name found'
            else:
                rpcinterface = SupervisorNamespaceRPCInterface(supervisord)
                try:
                    tail = rpcinterface.readProcessStdoutLog(processname,
                                                             limit, offset)
                except RPCError as e:
                    if e.code == Faults.NO_FILE:
                        tail = 'No file for %s' % processname
                    else:
                        tail = 'ERROR: unexpected rpc fault [%d] %s' % (
                            e.code, e.text)

        root = self.clone()

        title = root.findmeld('title')
        title.content('Supervisor tail of process %s' % processname)
        tailbody = root.findmeld('tailbody')
        tailbody.content(tail)

        refresh_anchor = root.findmeld('refresh_anchor')
        if processname is not None:
            refresh_anchor.attributes(
                href='tail.html?processname=%s&limit=%s' % (
                    urllib.quote(processname), urllib.quote(str(abs(limit)))
                    )
            )
        else:
            refresh_anchor.deparent()

        return as_string(root.write_xhtmlstring())
Beispiel #3
0
 def actions_for_process(self, process):
     state = process.get_state()
     processname = urllib.quote(
         make_namespec(process.group.config.name, process.config.name))
     start = {
         'name': 'Start',
         'href': 'index.html?processname=%s&action=start' % processname,
         'target': None,
     }
     restart = {
         'name': 'Restart',
         'href':
         'index.html?processname=%s&action=restart' % processname,
         'target': None,
     }
     stop = {
         'name': 'Stop',
         'href': 'index.html?processname=%s&action=stop' % processname,
         'target': None,
     }
     clearlog = {
         'name': 'Clear Log',
         'href':
         'index.html?processname=%s&action=clearlog' % processname,
         'target': None,
     }
     tailf = {
         'name': 'Tail -f',
         'href': 'logtail/%s/stderr' % processname,
         'target': '_blank'
     }
     signalhup = {
         'name': 'HUP',
         'href':
         'index.html?processname=%s&action=signalhup' % processname,
         'target': None
     }
     if state == ProcessStates.RUNNING:
         actions = [restart, stop, clearlog, tailf, signalhup]
     elif state in (ProcessStates.STOPPED, ProcessStates.EXITED,
                    ProcessStates.FATAL):
         actions = [start, None, clearlog, tailf]
     else:
         actions = [None, None, clearlog, tailf]
     return actions
Beispiel #4
0
    def render(self):
        supervisord = self.context.supervisord
        form = self.context.form

        if not "processname" in form:
            tail = "No process name found"
            processname = None
        else:
            processname = form["processname"]
            offset = 0
            limit = form.get("limit", "1024")
            limit = min(-1024, int(limit) * -1 if limit.isdigit() else -1024)
            if not processname:
                tail = "No process name found"
            else:
                rpcinterface = SupervisorNamespaceRPCInterface(supervisord)
                try:
                    tail = rpcinterface.readProcessLog(processname, limit, offset)
                    tail = rpcinterface.readProcessLog(processname, -1024, 0)
                except RPCError as e:
                    if e.code == Faults.NO_FILE:
                        tail = "No file for %s" % processname
                    else:
                        raise

        root = self.clone()

        title = root.findmeld("title")
        title.content("Supervisor tail of process %s" % processname)
        tailbody = root.findmeld("tailbody")
        tailbody.content(tail)

        refresh_anchor = root.findmeld("refresh_anchor")
        if processname is not None:
            refresh_anchor.attributes(
                href="tail.html?processname=%s&limit=%s" % (urllib.quote(processname), urllib.quote(str(abs(limit))))
            )
        else:
            refresh_anchor.deparent()

        return as_string(root.write_xhtmlstring())
Beispiel #5
0
 def actions_for_process(self, process):
     state = process.get_state()
     processname = urllib.quote(make_namespec(process.group.config.name, process.config.name))
     start = {"name": "Start", "href": "index.html?processname=%s&action=start" % processname, "target": None}
     restart = {
         "name": "Restart",
         "href": "index.html?processname=%s&action=restart" % processname,
         "target": None,
     }
     stop = {"name": "Stop", "href": "index.html?processname=%s&action=stop" % processname, "target": None}
     clearlog = {
         "name": "Clear Log",
         "href": "index.html?processname=%s&action=clearlog" % processname,
         "target": None,
     }
     tailf = {"name": "Tail -f", "href": "logtail/%s" % processname, "target": "_blank"}
     if state == ProcessStates.RUNNING:
         actions = [restart, stop, clearlog, tailf]
     elif state in (ProcessStates.STOPPED, ProcessStates.EXITED, ProcessStates.FATAL):
         actions = [start, None, clearlog, tailf]
     else:
         actions = [None, None, clearlog, tailf]
     return actions
Beispiel #6
0
 def actions_for_process(self, process):
     state = process.get_state()
     processname = urllib.quote(make_namespec(process.group.config.name,
                                              process.config.name))
     start = {
     'name':'Start',
     'href':'index.html?processname=%s&action=start' % processname,
     'target':None,
     }
     restart = {
     'name':'Restart',
     'href':'index.html?processname=%s&action=restart' % processname,
     'target':None,
     }
     stop = {
     'name':'Stop',
     'href':'index.html?processname=%s&action=stop' % processname,
     'target':None,
     }
     clearlog = {
     'name':'Clear Log',
     'href':'index.html?processname=%s&action=clearlog' % processname,
     'target':None,
     }
     tailf = {
     'name':'Tail -f',
     'href':'logtail/%s' % processname,
     'target':'_blank'
     }
     if state == ProcessStates.RUNNING:
         actions = [restart, stop, clearlog, tailf]
     elif state in (ProcessStates.STOPPED, ProcessStates.EXITED,
                    ProcessStates.FATAL):
         actions = [start, None, clearlog, tailf]
     else:
         actions = [None, None, clearlog, tailf]
     return actions
Beispiel #7
0
    def render(self):
        form = self.context.form
        response = self.context.response
        processname = form.get('processname')
        action = form.get('action')
        message = form.get('message')

        if action:
            if not self.callback:
                self.callback = self.make_callback(processname, action)
                return NOT_DONE_YET

            else:
                message = self.callback()
                if message is NOT_DONE_YET:
                    return NOT_DONE_YET
                if message is not None:
                    server_url = form['SERVER_URL']
                    location = server_url + "/" + '?message=%s' % urllib.quote(
                        message)
                    response['headers']['Location'] = location

        supervisord = self.context.supervisord
        rpcinterface = RootRPCInterface([
            ('supervisor', SupervisorNamespaceRPCInterface(supervisord))
        ])

        processnames = []
        for group in supervisord.process_groups.values():
            for gprocname in group.processes.keys():
                processnames.append((group.config.name, gprocname))

        processnames.sort()

        data = []
        for groupname, processname in processnames:
            actions = self.actions_for_process(
                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'],
            })

        root = self.clone()

        if message is not None:
            statusarea = root.findmeld('statusmessage')
            statusarea.attrib['class'] = 'status_msg'
            statusarea.content(message)

        if data:
            iterator = root.findmeld('tr').repeat(data)
            shaded_tr = False

            for tr_element, item in iterator:
                status_text = tr_element.findmeld('status_text')
                status_text.content(item['status'].lower())
                status_text.attrib['class'] = self.css_class_for_state(
                    item['state'])

                info_text = tr_element.findmeld('info_text')
                info_text.content(item['description'])

                anchor = tr_element.findmeld('name_anchor')
                processname = make_namespec(item['group'], item['name'])
                anchor.attributes(href='tail.html?processname=%s' %
                                  urllib.quote(processname))
                anchor.content(processname)

                actions = item['actions']
                actionitem_td = tr_element.findmeld('actionitem_td')

                for li_element, actionitem in actionitem_td.repeat(actions):
                    anchor = li_element.findmeld('actionitem_anchor')
                    if actionitem is None:
                        anchor.attrib['class'] = 'hidden'
                    else:
                        anchor.attributes(href=actionitem['href'],
                                          name=actionitem['name'])
                        anchor.content(actionitem['name'])
                        if actionitem['target']:
                            anchor.attributes(target=actionitem['target'])
                if shaded_tr:
                    tr_element.attrib['class'] = 'shade'
                shaded_tr = not shaded_tr
        else:
            table = root.findmeld('statustable')
            table.replace('No programs to manage')

        root.findmeld('supervisor_version').content(VERSION)
        copyright_year = str(datetime.date.today().year)
        root.findmeld('copyright_date').content(copyright_year)

        return as_string(root.write_xhtmlstring())
Beispiel #8
0
    def render(self):
        form = self.context.form
        response = self.context.response
        processname = form.get('processname')
        action = form.get('action')
        message = form.get('message')

        if action:
            if not self.callback:
                self.callback = self.make_callback(processname, action)
                return NOT_DONE_YET

            else:
                message =  self.callback()
                if message is NOT_DONE_YET:
                    return NOT_DONE_YET
                if message is not None:
                    server_url = form['SERVER_URL']
                    location = server_url + '?message=%s' % urllib.quote(
                        message)
                    response['headers']['Location'] = location

        supervisord = self.context.supervisord
        rpcinterface = RootRPCInterface(
            [('supervisor',
              SupervisorNamespaceRPCInterface(supervisord))]
            )

        processnames = []
        for group in supervisord.process_groups.values():
            for gprocname in group.processes.keys():
                processnames.append((group.config.name, gprocname))

        processnames.sort()

        data = []
        for groupname, processname in processnames:
            actions = self.actions_for_process(
                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'],
                })

        root = self.clone()

        if message is not None:
            statusarea = root.findmeld('statusmessage')
            statusarea.attrib['class'] = 'status_msg'
            statusarea.content(message)

        if data:
            iterator = root.findmeld('tr').repeat(data)
            shaded_tr = False

            for tr_element, item in iterator:
                status_text = tr_element.findmeld('status_text')
                status_text.content(item['status'].lower())
                status_text.attrib['class'] = self.css_class_for_state(
                    item['state'])

                info_text = tr_element.findmeld('info_text')
                info_text.content(item['description'])

                anchor = tr_element.findmeld('name_anchor')
                processname = make_namespec(item['group'], item['name'])
                anchor.attributes(href='tail.html?processname=%s' %
                                  urllib.quote(processname))
                anchor.content(processname)

                actions = item['actions']
                actionitem_td = tr_element.findmeld('actionitem_td')

                for li_element, actionitem in actionitem_td.repeat(actions):
                    anchor = li_element.findmeld('actionitem_anchor')
                    if actionitem is None:
                        anchor.attrib['class'] = 'hidden'
                    else:
                        anchor.attributes(href=actionitem['href'],
                                          name=actionitem['name'])
                        anchor.content(actionitem['name'])
                        if actionitem['target']:
                            anchor.attributes(target=actionitem['target'])
                if shaded_tr:
                    tr_element.attrib['class'] = 'shade'
                shaded_tr = not shaded_tr
        else:
            table = root.findmeld('statustable')
            table.replace('No programs to manage')

        root.findmeld('supervisor_version').content(VERSION)
        copyright_year = str(datetime.date.today().year)
        root.findmeld('copyright_date').content(copyright_year)

        return as_string(root.write_xhtmlstring())
Beispiel #9
0
    def render(self):
        form = self.context.form
        response = self.context.response
        processname = form.get("processname")
        action = form.get("action")
        message = form.get("message")

        if action:
            if not self.callback:
                self.callback = self.make_callback(processname, action)
                return NOT_DONE_YET

            else:
                message = self.callback()
                if message is NOT_DONE_YET:
                    return NOT_DONE_YET
                if message is not None:
                    server_url = form["SERVER_URL"]
                    location = server_url + "?message=%s" % urllib.quote(message)
                    response["headers"]["Location"] = location

        supervisord = self.context.supervisord
        rpcinterface = RootRPCInterface([("supervisor", SupervisorNamespaceRPCInterface(supervisord))])

        processnames = []
        for group in supervisord.process_groups.values():
            for gprocname in group.processes.keys():
                processnames.append((group.config.name, gprocname))

        processnames.sort()

        data = []
        for groupname, processname in processnames:
            actions = self.actions_for_process(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"],
                }
            )

        root = self.clone()

        if message is not None:
            statusarea = root.findmeld("statusmessage")
            statusarea.attrib["class"] = "status_msg"
            statusarea.content(message)

        if data:
            iterator = root.findmeld("tr").repeat(data)
            shaded_tr = False

            for tr_element, item in iterator:
                status_text = tr_element.findmeld("status_text")
                status_text.content(item["status"].lower())
                status_text.attrib["class"] = self.css_class_for_state(item["state"])

                info_text = tr_element.findmeld("info_text")
                info_text.content(item["description"])

                anchor = tr_element.findmeld("name_anchor")
                processname = make_namespec(item["group"], item["name"])
                anchor.attributes(href="tail.html?processname=%s" % urllib.quote(processname))
                anchor.content(processname)

                actions = item["actions"]
                actionitem_td = tr_element.findmeld("actionitem_td")

                for li_element, actionitem in actionitem_td.repeat(actions):
                    anchor = li_element.findmeld("actionitem_anchor")
                    if actionitem is None:
                        anchor.attrib["class"] = "hidden"
                    else:
                        anchor.attributes(href=actionitem["href"], name=actionitem["name"])
                        anchor.content(actionitem["name"])
                        if actionitem["target"]:
                            anchor.attributes(target=actionitem["target"])
                if shaded_tr:
                    tr_element.attrib["class"] = "shade"
                shaded_tr = not shaded_tr
        else:
            table = root.findmeld("statustable")
            table.replace("No programs to manage")

        root.findmeld("supervisor_version").content(VERSION)
        copyright_year = str(datetime.date.today().year)
        root.findmeld("copyright_date").content(copyright_year)

        return as_string(root.write_xhtmlstring())