Source code for insights.parsers.passenger_status

"""
passenger-status command
========================
This module provides processing for the ``passenger-status`` command using the
following parsers:
"""
from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


[docs] @parser(Specs.passenger_status) class PassengerStatus(CommandParser, dict): """ Parse the passenger-status command output. Produces a simple dictionary of keys and values from the command output contents. Sample command output:: Version : 4.0.18 Date : 2018-10-23 15:42:04 +0800 Instance: 1265 ----------- General information ----------- Max pool size : 12 Processes : 2 Requests in top-level queue : 0 ----------- Application groups ----------- /usr/share/foreman#default: App root: /usr/share/foreman Requests in queue: 192 * PID: 30131 Sessions: 1 Processed: 991 Uptime: 2h 9m 8s CPU: 3% Memory : 562M Last used: 1h 53m 51s * PID: 32450 Sessions: 1 Processed: 966 Uptime: 2h 8m 15s CPU: 4% Memory : 463M Last used: 1h 48m 17 * PID: 4693 Sessions: 1 Processed: 939 Uptime: 2h 6m 32s CPU: 3% Memory : 470M Last used: 1h 50m 48 /etc/puppet/rack#default: App root: /etc/puppet/rack Requests in queue: 0 * PID: 21934 Sessions: 1 Processed: 380 Uptime: 1h 33m 34s CPU: 1% Memory : 528M Last used: 1h 29m 4 * PID: 26194 Sessions: 1 Processed: 544 Uptime: 1h 31m 34s CPU: 2% Memory : 490M Last used: 1h 23m 5 * PID: 32384 Sessions: 1 Processed: 36 Uptime: 1h 0m 29s CPU: 0% Memory : 561M Last used: 1h 0m 3s Examples: >>> passenger_status["Version"] '4.0.18' >>> 'rack_default' in passenger_status True >>> len(passenger_status['foreman_default']['p_list']) 3 Raises: SkipComponent: When input content is empty or there is no useful data. """
[docs] def parse_content(self, content): if len(content) <= 1: raise SkipComponent("Empty content") group = '' data = {} for line in content: line = line.strip() if not group and ":" in line and not line.endswith(':'): key, val = [i.strip() for i in line.split(':', 1)] data[key] = val elif line.startswith(("/usr/share/foreman#default", "/etc/puppet/rack#default")): # set the group which the following pid will belong to group = line.strip(':').split('/')[-1].replace('#', '_') data[group] = group_list = {} elif group: if line.startswith(("* PID:", "CPU")): if line.strip().startswith("* PID:"): p_dict = {} if 'p_list' not in group_list: group_list['p_list'] = [] group_list['p_list'].append(p_dict) l = line.lstrip('* ') # parse each key: value pair while (':' in l and l.index(':') != l.rindex(':')): k, l = [i.strip() for i in l.split(':', 1)] v, l = [i.strip() for i in l.split(None, 1)] p_dict[k] = v # for the last key: value pair if l and ':' in l: k, v = [i.strip() for i in l.split(':')] p_dict[k] = v elif ':' in line: key, val = [i.strip() for i in line.split(':', 1)] group_list[key] = val if not data: raise SkipComponent("No useful data") self.update(data)
@property def data(self): """ (dict): A simple dictionary of keys and values from the command output contents """ return self