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