Example #1
0
    def msg_curse(self, args=None):
        """Return the dict to display in the curse interface."""
        # Init the return message
        ret = []

        # Only process if stats exist and display plugin enable...
        if self.stats == [] or args.disable_process:
            return ret

        # Compute the sort key
        if glances_processes.getmanualsortkey() is None:
            process_sort_key = glances_processes.getautosortkey()
        else:
            process_sort_key = glances_processes.getmanualsortkey()
        sort_style = 'SORT'

        # Header
        msg = '{0:>6}'.format(_("CPU%"))
        ret.append(
            self.curse_add_line(
                msg, sort_style
                if process_sort_key == 'cpu_percent' else 'DEFAULT'))
        msg = '{0:>6}'.format(_("MEM%"))
        ret.append(
            self.curse_add_line(
                msg, sort_style
                if process_sort_key == 'memory_percent' else 'DEFAULT'))
        msg = '{0:>6}'.format(_("VIRT"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("RES"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("PID"))
        ret.append(self.curse_add_line(msg))
        msg = ' {0:10}'.format(_("USER"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>4}'.format(_("NI"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>2}'.format(_("S"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>9}'.format(_("TIME+"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("IOR/s"))
        ret.append(
            self.curse_add_line(
                msg,
                sort_style if process_sort_key == 'io_counters' else 'DEFAULT',
                optional=True,
                additional=True))
        msg = '{0:>6}'.format(_("IOW/s"))
        ret.append(
            self.curse_add_line(
                msg,
                sort_style if process_sort_key == 'io_counters' else 'DEFAULT',
                optional=True,
                additional=True))
        msg = ' {0:8}'.format(_("Command"))
        ret.append(self.curse_add_line(msg))

        # Trying to display proc time
        tag_proc_time = True

        # Loop over processes (sorted by the sort key previously compute)
        first = True
        for p in self.sortlist(process_sort_key):
            ret.append(self.curse_new_line())
            # CPU
            if 'cpu_percent' in p and p[
                    'cpu_percent'] is not None and p['cpu_percent'] != '':
                msg = '{0:>6.1f}'.format(p['cpu_percent'])
                ret.append(
                    self.curse_add_line(
                        msg, self.get_alert(p['cpu_percent'], header="cpu")))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
            # MEM
            if 'memory_percent' in p and p['memory_percent'] is not None and p[
                    'memory_percent'] != '':
                msg = '{0:>6.1f}'.format(p['memory_percent'])
                ret.append(
                    self.curse_add_line(
                        msg, self.get_alert(p['memory_percent'],
                                            header="mem")))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
            # VMS/RSS
            if 'memory_info' in p and p[
                    'memory_info'] is not None and p['memory_info'] != '':
                # VMS
                msg = '{0:>6}'.format(
                    self.auto_unit(p['memory_info'][1], low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True))
                # RSS
                msg = '{0:>6}'.format(
                    self.auto_unit(p['memory_info'][0], low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
                ret.append(self.curse_add_line(msg))
            # PID
            msg = '{0:>6}'.format(p['pid'])
            ret.append(self.curse_add_line(msg))
            # USER
            if 'username' in p:
                # docker internal users are displayed as ints only, therefore str()
                msg = ' {0:9}'.format(str(p['username'])[:9])
                ret.append(self.curse_add_line(msg))
            else:
                msg = ' {0:9}'.format('?')
                ret.append(self.curse_add_line(msg))
            # NICE
            if 'nice' in p:
                nice = p['nice']
                if nice is None:
                    nice = '?'
                msg = '{0:>5}'.format(nice)
                if isinstance(nice, int) and ((is_windows and nice != 32) or
                                              (not is_windows and nice != 0)):
                    ret.append(self.curse_add_line(msg, decoration='NICE'))
                else:
                    ret.append(self.curse_add_line(msg))
            else:
                msg = '{0:>5}'.format('?')
                ret.append(self.curse_add_line(msg))
            # STATUS
            if 'status' in p:
                status = p['status']
                msg = '{0:>2}'.format(status)
                if status == 'R':
                    ret.append(self.curse_add_line(msg, decoration='STATUS'))
                else:
                    ret.append(self.curse_add_line(msg))
            else:
                msg = '{0:>2}'.format('?')
                ret.append(self.curse_add_line(msg))
            # TIME+
            if tag_proc_time:
                try:
                    dtime = timedelta(seconds=sum(p['cpu_times']))
                except Exception:
                    # Catched on some Amazon EC2 server
                    # See https://github.com/nicolargo/glances/issues/87
                    tag_proc_time = False
                else:
                    msg = '{0}:{1}.{2}'.format(
                        str(dtime.seconds // 60 % 60),
                        str(dtime.seconds % 60).zfill(2),
                        str(dtime.microseconds)[:2].zfill(2))
            else:
                msg = ' '
            msg = '{0:>9}'.format(msg)
            ret.append(self.curse_add_line(msg, optional=True))
            # IO read/write
            if 'io_counters' in p:
                # IO read
                io_rs = (p['io_counters'][0] -
                         p['io_counters'][2]) / p['time_since_update']
                if io_rs == 0:
                    msg = '{0:>6}'.format("0")
                else:
                    msg = '{0:>6}'.format(
                        self.auto_unit(io_rs, low_precision=False))
                ret.append(
                    self.curse_add_line(msg, optional=True, additional=True))
                # IO write
                io_ws = (p['io_counters'][1] -
                         p['io_counters'][3]) / p['time_since_update']
                if io_ws == 0:
                    msg = '{0:>6}'.format("0")
                else:
                    msg = '{0:>6}'.format(
                        self.auto_unit(io_ws, low_precision=False))
                ret.append(
                    self.curse_add_line(msg, optional=True, additional=True))
            else:
                msg = '{0:>6}'.format("?")
                ret.append(
                    self.curse_add_line(msg, optional=True, additional=True))
                ret.append(
                    self.curse_add_line(msg, optional=True, additional=True))

            # Command line
            # If no command line for the process is available, fallback to
            # the bare process name instead
            cmdline = p['cmdline']
            if cmdline == "" or args.process_short_name:
                msg = ' {0}'.format(p['name'])
                ret.append(self.curse_add_line(msg, splittable=True))
            else:
                try:
                    cmd = cmdline.split()[0]
                    argument = ' '.join(cmdline.split()[1:])
                    path, basename = os.path.split(cmd)
                    if os.path.isdir(path):
                        msg = ' {0}'.format(path) + os.sep
                        ret.append(self.curse_add_line(msg, splittable=True))
                        ret.append(
                            self.curse_add_line(basename,
                                                decoration='PROCESS',
                                                splittable=True))
                    else:
                        msg = ' {0}'.format(basename)
                        ret.append(
                            self.curse_add_line(msg,
                                                decoration='PROCESS',
                                                splittable=True))
                    msg = " {0}".format(argument)
                    ret.append(self.curse_add_line(msg, splittable=True))
                except UnicodeEncodeError:
                    ret.append(self.curse_add_line("", splittable=True))

            # Add extended stats but only for the top processes
            # !!! CPU consumption ???
            # TODO: extended stats into the web interface
            if first and 'extended_stats' in p:
                # Left padding
                xpad = ' ' * 13
                # First line is CPU affinity
                if 'cpu_affinity' in p and p['cpu_affinity'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('CPU affinity: ') + str(
                        len(p['cpu_affinity'])) + _(' cores')
                    ret.append(self.curse_add_line(msg, splittable=True))
                # Second line is memory info
                if 'memory_info_ex' in p and p['memory_info_ex'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('Memory info: ')
                    for k, v in p['memory_info_ex']._asdict().items():
                        # Ignore rss and vms (already displayed)
                        if k not in ['rss', 'vms'] and v is not None:
                            msg += k + ' ' + self.auto_unit(
                                v, low_precision=False) + ' '
                    if 'memory_swap' in p and p['memory_swap'] is not None:
                        msg += _('swap ') + self.auto_unit(p['memory_swap'],
                                                           low_precision=False)
                    ret.append(self.curse_add_line(msg, splittable=True))
                # Third line is for openned files/network sessions
                ret.append(self.curse_new_line())
                msg = xpad + _('Openned: ')
                if 'num_threads' in p and p['num_threads'] is not None:
                    msg += _('threads ') + str(p['num_threads']) + ' '
                if 'num_fds' in p and p['num_fds'] is not None:
                    msg += _('files ') + str(p['num_fds']) + ' '
                if 'num_handles' in p and p['num_handles'] is not None:
                    msg += _('handles ') + str(p['num_handles']) + ' '
                if 'tcp' in p and p['tcp'] is not None:
                    msg += _('TCP ') + str(p['tcp']) + ' '
                if 'udp' in p and p['udp'] is not None:
                    msg += _('UDP ') + str(p['udp']) + ' '
                ret.append(self.curse_add_line(msg, splittable=True))
                # Fouth line is IO nice level (only Linux and Windows OS)
                if 'ionice' in p and p['ionice'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('IO nice: ')
                    k = _('Class is ')
                    v = p['ionice'].ioclass
                    # Linux: The scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle.
                    # Windows: On Windows only ioclass is used and it can be set to 2 (normal), 1 (low) or 0 (very low).
                    if is_windows:
                        if v == 0:
                            msg += k + 'Very Low'
                        elif v == 1:
                            msg += k + 'Low'
                        elif v == 2:
                            msg += _('No specific I/O priority')
                        else:
                            msg += k + str(v)
                    else:
                        if v == 0:
                            msg += _('No specific I/O priority')
                        elif v == 1:
                            msg += k + 'Real Time'
                        elif v == 2:
                            msg += k + 'Best Effort'
                        elif v == 3:
                            msg += k + 'IDLE'
                        else:
                            msg += k + str(v)
                    #  value is a number which goes from 0 to 7.
                    # The higher the value, the lower the I/O priority of the process.
                    if hasattr(p['ionice'],
                               'value') and p['ionice'].value != 0:
                        msg += _(' (value %s/7)') % str(p['ionice'].value)
                    ret.append(self.curse_add_line(msg, splittable=True))
                # End of extended stats
                first = False

        # Return the message with decoration
        return ret
Example #2
0
    def msg_curse(self, args=None):
        """Return the dict to display in the curse interface."""
        # Init the return message
        ret = []

        # Only process if stats exist and display plugin enable...
        if args.disable_process:
            msg = _("PROCESSES DISABLED (press 'z' to display)")
            ret.append(self.curse_add_line(msg))
            return ret

        if self.stats == {}:
            return ret

        # Display the filter (if it exists)
        if glances_processes.get_process_filter() is not None:
            msg = _("Processes filter:")
            ret.append(self.curse_add_line(msg, "TITLE"))
            msg = _(" {0} ").format(glances_processes.get_process_filter())
            ret.append(self.curse_add_line(msg, "FILTER"))
            msg = _("(press ENTER to edit)")
            ret.append(self.curse_add_line(msg))
            ret.append(self.curse_new_line())

        # Build the string message
        # Header
        msg = _("TASKS ")
        ret.append(self.curse_add_line(msg, "TITLE"))
        # Compute processes
        other = self.stats['total']
        msg = str(self.stats['total'])
        ret.append(self.curse_add_line(msg))

        if 'thread' in self.stats:
            msg = _(" ({0} thr),").format(self.stats['thread'])
            ret.append(self.curse_add_line(msg))

        if 'running' in self.stats:
            other -= self.stats['running']
            msg = _(" {0} run,").format(self.stats['running'])
            ret.append(self.curse_add_line(msg))

        if 'sleeping' in self.stats:
            other -= self.stats['sleeping']
            msg = _(" {0} slp,").format(self.stats['sleeping'])
            ret.append(self.curse_add_line(msg))

        msg = _(" {0} oth ").format(other)
        ret.append(self.curse_add_line(msg))

        # Display sort information
        if glances_processes.getmanualsortkey() is None:
            msg = _("sorted automatically")
            ret.append(self.curse_add_line(msg))
            msg = _(" by {0}").format(glances_processes.getautosortkey())
            ret.append(self.curse_add_line(msg))
        else:
            msg = _("sorted by {0}").format(glances_processes.getmanualsortkey())
            ret.append(self.curse_add_line(msg))

        # Return the message with decoration
        return ret
Example #3
0
    def msg_curse(self, args=None):
        """Return the dict to display in the curse interface."""
        # Init the return message
        ret = []

        # Only process if stats exist and display plugin enable...
        if args.disable_process:
            msg = _("PROCESSES DISABLED (press 'z' to display)")
            ret.append(self.curse_add_line(msg))
            return ret

        if self.stats == {}:
            return ret

        # Display the filter (if it exists)
        if glances_processes.get_process_filter() is not None:
            msg = _("Processes filter:")
            ret.append(self.curse_add_line(msg, "TITLE"))
            msg = _(" {0} ").format(glances_processes.get_process_filter())
            ret.append(self.curse_add_line(msg, "FILTER"))
            msg = _("(press ENTER to edit)")
            ret.append(self.curse_add_line(msg))
            ret.append(self.curse_new_line())

        # Build the string message
        # Header
        msg = _("TASKS ")
        ret.append(self.curse_add_line(msg, "TITLE"))
        # Compute processes
        other = self.stats['total']
        msg = str(self.stats['total'])
        ret.append(self.curse_add_line(msg))

        if 'thread' in self.stats:
            msg = _(" ({0} thr),").format(self.stats['thread'])
            ret.append(self.curse_add_line(msg))

        if 'running' in self.stats:
            other -= self.stats['running']
            msg = _(" {0} run,").format(self.stats['running'])
            ret.append(self.curse_add_line(msg))

        if 'sleeping' in self.stats:
            other -= self.stats['sleeping']
            msg = _(" {0} slp,").format(self.stats['sleeping'])
            ret.append(self.curse_add_line(msg))

        msg = _(" {0} oth ").format(other)
        ret.append(self.curse_add_line(msg))

        # Display sort information
        if glances_processes.getmanualsortkey() is None:
            msg = _("sorted automatically")
            ret.append(self.curse_add_line(msg))
            msg = _(" by {0}").format(glances_processes.getautosortkey())
            ret.append(self.curse_add_line(msg))
        else:
            msg = _("sorted by {0}").format(
                glances_processes.getmanualsortkey())
            ret.append(self.curse_add_line(msg))

        # Return the message with decoration
        return ret
Example #4
0
    def msg_curse(self, args=None):
        """Return the dict to display in the curse interface."""
        # Init the return message
        ret = []

        # Only process if stats exist and display plugin enable...
        if self.stats == [] or args.disable_process:
            return ret

        # Compute the sort key
        if glances_processes.getmanualsortkey() is None:
            process_sort_key = glances_processes.getautosortkey()
        else:
            process_sort_key = glances_processes.getmanualsortkey()
        sort_style = 'SORT'

        # Header
        msg = '{0:>6}'.format(_("CPU%"))
        ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'cpu_percent' else 'DEFAULT'))
        msg = '{0:>6}'.format(_("MEM%"))
        ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'memory_percent' else 'DEFAULT'))
        msg = '{0:>6}'.format(_("VIRT"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("RES"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("PID"))
        ret.append(self.curse_add_line(msg))
        msg = ' {0:10}'.format(_("USER"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>4}'.format(_("NI"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>2}'.format(_("S"))
        ret.append(self.curse_add_line(msg))
        msg = '{0:>9}'.format(_("TIME+"))
        ret.append(self.curse_add_line(msg, optional=True))
        msg = '{0:>6}'.format(_("IOR/s"))
        ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True))
        msg = '{0:>6}'.format(_("IOW/s"))
        ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True))
        msg = ' {0:8}'.format(_("Command"))
        ret.append(self.curse_add_line(msg))

        # Trying to display proc time
        tag_proc_time = True

        # Loop over processes (sorted by the sort key previously compute)
        first = True
        for p in self.sortlist(process_sort_key):
            ret.append(self.curse_new_line())
            # CPU
            if 'cpu_percent' in p and p['cpu_percent'] is not None and p['cpu_percent'] != '':
                msg = '{0:>6.1f}'.format(p['cpu_percent'])
                ret.append(self.curse_add_line(msg,
                                               self.get_alert(p['cpu_percent'], header="cpu")))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
            # MEM
            if 'memory_percent' in p and p['memory_percent'] is not None and p['memory_percent'] != '':
                msg = '{0:>6.1f}'.format(p['memory_percent'])
                ret.append(self.curse_add_line(msg,
                                               self.get_alert(p['memory_percent'], header="mem")))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
            # VMS/RSS
            if 'memory_info' in p and p['memory_info'] is not None and p['memory_info'] != '':
                # VMS
                msg = '{0:>6}'.format(self.auto_unit(p['memory_info'][1], low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True))
                # RSS
                msg = '{0:>6}'.format(self.auto_unit(p['memory_info'][0], low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True))
            else:
                msg = '{0:>6}'.format('?')
                ret.append(self.curse_add_line(msg))
                ret.append(self.curse_add_line(msg))
            # PID
            msg = '{0:>6}'.format(p['pid'])
            ret.append(self.curse_add_line(msg))
            # USER
            if 'username' in p:
                # docker internal users are displayed as ints only, therefore str()
                msg = ' {0:9}'.format(str(p['username'])[:9])
                ret.append(self.curse_add_line(msg))
            else:
                msg = ' {0:9}'.format('?')
                ret.append(self.curse_add_line(msg))
            # NICE
            if 'nice' in p:
                nice = p['nice']
                if nice is None:
                    nice = '?'
                msg = '{0:>5}'.format(nice)
                if isinstance(nice, int) and ((is_windows and nice != 32) or
                                              (not is_windows and nice != 0)):
                    ret.append(self.curse_add_line(msg, decoration='NICE'))
                else:
                    ret.append(self.curse_add_line(msg))
            else:
                msg = '{0:>5}'.format('?')
                ret.append(self.curse_add_line(msg))
            # STATUS
            if 'status' in p:
                status = p['status']
                msg = '{0:>2}'.format(status)
                if status == 'R':
                    ret.append(self.curse_add_line(msg, decoration='STATUS'))
                else:
                    ret.append(self.curse_add_line(msg))
            else:
                msg = '{0:>2}'.format('?')
                ret.append(self.curse_add_line(msg))
            # TIME+
            if tag_proc_time:
                try:
                    dtime = timedelta(seconds=sum(p['cpu_times']))
                except Exception:
                    # Catched on some Amazon EC2 server
                    # See https://github.com/nicolargo/glances/issues/87
                    tag_proc_time = False
                else:
                    msg = '{0}:{1}.{2}'.format(str(dtime.seconds // 60 % 60),
                                               str(dtime.seconds % 60).zfill(2),
                                               str(dtime.microseconds)[:2].zfill(2))
            else:
                msg = ' '
            msg = '{0:>9}'.format(msg)
            ret.append(self.curse_add_line(msg, optional=True))
            # IO read/write
            if 'io_counters' in p:
                # IO read
                io_rs = (p['io_counters'][0] - p['io_counters'][2]) / p['time_since_update']
                if io_rs == 0:
                    msg = '{0:>6}'.format("0")
                else:
                    msg = '{0:>6}'.format(self.auto_unit(io_rs, low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True, additional=True))
                # IO write
                io_ws = (p['io_counters'][1] - p['io_counters'][3]) / p['time_since_update']
                if io_ws == 0:
                    msg = '{0:>6}'.format("0")
                else:
                    msg = '{0:>6}'.format(self.auto_unit(io_ws, low_precision=False))
                ret.append(self.curse_add_line(msg, optional=True, additional=True))
            else:
                msg = '{0:>6}'.format("?")
                ret.append(self.curse_add_line(msg, optional=True, additional=True))
                ret.append(self.curse_add_line(msg, optional=True, additional=True))

            # Command line
            # If no command line for the process is available, fallback to
            # the bare process name instead
            cmdline = p['cmdline']
            if cmdline == "" or args.process_short_name:
                msg = ' {0}'.format(p['name'])
                ret.append(self.curse_add_line(msg, splittable=True))
            else:
                try:
                    cmd = cmdline.split()[0]
                    argument = ' '.join(cmdline.split()[1:])
                    path, basename = os.path.split(cmd)
                    if os.path.isdir(path):
                        msg = ' {0}'.format(path) + os.sep
                        ret.append(self.curse_add_line(msg, splittable=True))
                        ret.append(self.curse_add_line(basename, decoration='PROCESS', splittable=True))
                    else:
                        msg = ' {0}'.format(basename)
                        ret.append(self.curse_add_line(msg, decoration='PROCESS', splittable=True))
                    msg = " {0}".format(argument)
                    ret.append(self.curse_add_line(msg, splittable=True))
                except UnicodeEncodeError:
                    ret.append(self.curse_add_line("", splittable=True))

            # Add extended stats but only for the top processes
            # !!! CPU consumption ???
            # TODO: extended stats into the web interface
            if first and 'extended_stats' in p:
                # Left padding
                xpad = ' ' * 13
                # First line is CPU affinity
                if 'cpu_affinity' in p and p['cpu_affinity'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('CPU affinity: ') + str(len(p['cpu_affinity'])) + _(' cores')
                    ret.append(self.curse_add_line(msg, splittable=True))
                # Second line is memory info
                if 'memory_info_ex' in p and p['memory_info_ex'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('Memory info: ')
                    for k, v in p['memory_info_ex']._asdict().items():
                        # Ignore rss and vms (already displayed)
                        if k not in ['rss', 'vms'] and v is not None:
                            msg += k + ' ' + self.auto_unit(v, low_precision=False) + ' '
                    if 'memory_swap' in p and p['memory_swap'] is not None:
                        msg += _('swap ') + self.auto_unit(p['memory_swap'], low_precision=False)
                    ret.append(self.curse_add_line(msg, splittable=True))
                # Third line is for openned files/network sessions
                ret.append(self.curse_new_line())
                msg = xpad + _('Openned: ')
                if 'num_threads' in p and p['num_threads'] is not None:
                    msg += _('threads ') + str(p['num_threads']) + ' '
                if 'num_fds' in p and p['num_fds'] is not None:
                    msg += _('files ') + str(p['num_fds']) + ' '
                if 'num_handles' in p and p['num_handles'] is not None:
                    msg += _('handles ') + str(p['num_handles']) + ' '
                if 'tcp' in p and p['tcp'] is not None:
                    msg += _('TCP ') + str(p['tcp']) + ' '
                if 'udp' in p and p['udp'] is not None:
                    msg += _('UDP ') + str(p['udp']) + ' '
                ret.append(self.curse_add_line(msg, splittable=True))
                # Fouth line is IO nice level (only Linux and Windows OS)
                if 'ionice' in p and p['ionice'] is not None:
                    ret.append(self.curse_new_line())
                    msg = xpad + _('IO nice: ')
                    k = _('Class is ')
                    v = p['ionice'].ioclass
                    # Linux: The scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle. 
                    # Windows: On Windows only ioclass is used and it can be set to 2 (normal), 1 (low) or 0 (very low). 
                    if is_windows:
                        if v == 0:
                            msg += k + 'Very Low'
                        elif v == 1:
                            msg += k + 'Low'
                        elif v == 2:
                            msg += _('No specific I/O priority')
                        else:
                            msg += k + str(v)                        
                    else:
                        if v == 0:
                            msg += _('No specific I/O priority')
                        elif v == 1:
                            msg += k + 'Real Time'
                        elif v == 2:
                            msg += k + 'Best Effort'
                        elif v == 3:
                            msg += k + 'IDLE'
                        else:
                            msg += k + str(v)
                    #  value is a number which goes from 0 to 7. 
                    # The higher the value, the lower the I/O priority of the process.
                    if hasattr(p['ionice'], 'value') and p['ionice'].value != 0:
                        msg += _(' (value %s/7)') % str(p['ionice'].value)
                    ret.append(self.curse_add_line(msg, splittable=True))                
                # End of extended stats
                first = False

        # Return the message with decoration
        return ret