From 9614e2bb19c6bdd512fea5dafbed1250da0049d9 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Tue, 27 Dec 2022 10:45:51 +0100 Subject: [PATCH 01/18] First version but UI should be improved and when user is in program mode, it did not work... --- glances/main.py | 12 ++ glances/outputs/glances_curses.py | 6 +- glances/plugins/glances_processlist.py | 185 +++++++++++++++---------- glances/processes.py | 136 +++++++++++------- glances/standalone.py | 3 + 5 files changed, 216 insertions(+), 126 deletions(-) diff --git a/glances/main.py b/glances/main.py index aff37d4f..059655f6 100644 --- a/glances/main.py +++ b/glances/main.py @@ -236,6 +236,13 @@ Examples of use: dest='enable_separator', help='enable separator in the UI', ), + parser.add_argument( + '--disable-cursor', + action='store_true', + default=False, + dest='disable_cursor', + help='disable cursor (process selection) in the UI', + ), # Sort processes list parser.add_argument( '--sort-processes', @@ -700,6 +707,11 @@ Examples of use: logger.critical("Process filter is only available in standalone mode") sys.exit(2) + # Cursor option is only available in standalone mode + if not args.disable_cursor and not self.is_standalone(): + logger.critical("Cursor is only available in standalone mode") + sys.exit(2) + # Disable HDDTemp if sensors are disabled if getattr(self.args, 'disable_sensors', False): disable(self.args, 'hddtemp') diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index f3be8980..02796aa6 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -414,6 +414,8 @@ class _GlancesCurses(object): glances_processes.disable_extended() else: glances_processes.enable_extended() + # When a process is selected (and only in standalone mode), disable the cursor + self.args.disable_cursor = self.args.enable_process_extended and self.args.is_standalone elif self.pressedkey == ord('E'): # 'E' > Erase the process filter glances_processes.process_filter = None @@ -451,11 +453,11 @@ class _GlancesCurses(object): # ">" (right arrow) navigation through process sort next_sort = (self.loop_position() + 1) % len(self._sort_loop) glances_processes.set_sort_key(self._sort_loop[next_sort], False) - elif self.pressedkey == curses.KEY_UP or self.pressedkey == 65: + elif self.pressedkey == curses.KEY_UP or self.pressedkey == 65 and not self.args.disable_cursor: # 'UP' > Up in the server list if self.args.cursor_position > 0: self.args.cursor_position -= 1 - elif self.pressedkey == curses.KEY_DOWN or self.pressedkey == 66: + elif self.pressedkey == curses.KEY_DOWN or self.pressedkey == 66 and not self.args.disable_cursor: # 'DOWN' > Down in the server list # if self.args.cursor_position < glances_processes.max_processes - 2: if self.args.cursor_position < glances_processes.processes_count: diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 7a9efd57..a7417e3c 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -353,11 +353,11 @@ class Plugin(GlancesPlugin): - selected is a tag=True if p is the selected process """ ret = [self.curse_new_line()] + # When a process is selected: # * display a special character at the beginning of the line # * underline the command name - if args.is_standalone: - ret.append(self.curse_add_line(unicode_message('PROCESS_SELECTOR') if selected else ' ', 'SELECTED')) + ret.append(self.curse_add_line(unicode_message('PROCESS_SELECTOR') if (selected and not args.disable_cursor) else ' ', 'SELECTED')) # CPU ret.append(self._get_process_curses_cpu(p, selected, args)) @@ -404,7 +404,7 @@ class Plugin(GlancesPlugin): cmdline = p.get('cmdline', '?') try: - process_decoration = 'PROCESS_SELECTED' if (selected and args.is_standalone) else 'PROCESS' + process_decoration = 'PROCESS_SELECTED' if (selected and not args.disable_cursor) else 'PROCESS' if cmdline: path, cmd, arguments = split_cmdline(bare_process_name, cmdline) # Manage end of line in arguments (see #1692) @@ -428,74 +428,14 @@ class Plugin(GlancesPlugin): logger.debug("Can not decode command line '{}' ({})".format(cmdline, e)) ret.append(self.curse_add_line('', splittable=True)) - # Add extended stats but only for the top processes - if args.cursor_position == 0 and 'extended_stats' in p and args.enable_process_extended: - # 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' in p and p['memory_info'] is not None: - ret.append(self.curse_new_line()) - msg = '{}Memory info: {}'.format(xpad, p['memory_info']) - 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 open files/network sessions - msg = '' - if 'num_threads' in p and p['num_threads'] is not None: - msg += str(p['num_threads']) + ' threads ' - if 'num_fds' in p and p['num_fds'] is not None: - msg += str(p['num_fds']) + ' files ' - if 'num_handles' in p and p['num_handles'] is not None: - msg += str(p['num_handles']) + ' handles ' - if 'tcp' in p and p['tcp'] is not None: - msg += str(p['tcp']) + ' TCP ' - if 'udp' in p and p['udp'] is not None: - msg += str(p['udp']) + ' UDP' - if msg != '': - ret.append(self.curse_new_line()) - msg = xpad + 'Open: ' + msg - ret.append(self.curse_add_line(msg, splittable=True)) - # Fourth line is IO nice level (only Linux and Windows OS) - if 'ionice' in p and p['ionice'] is not None and hasattr(p['ionice'], 'ioclass'): - 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 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)) - return ret + def is_selected_process(self, args): + return args.is_standalone and \ + self.args.enable_process_extended and \ + args.cursor_position is not None and \ + glances_processes.extended_process is not None + def msg_curse(self, args=None, max_width=None): """Return the dict to display in the curse interface.""" # Init the return message @@ -507,6 +447,16 @@ class Plugin(GlancesPlugin): # Compute the sort key process_sort_key = glances_processes.sort_key + processes_list_sorted = self.__sort_stats(process_sort_key) + + # Display extended stats for selected process + ############################################# + + if self.is_selected_process(args): + self.__msg_curse_extended_process(ret, glances_processes.extended_process) + + # Display others processes list + ############################### # Header self.__msg_curse_header(ret, process_sort_key, args) @@ -515,10 +465,10 @@ class Plugin(GlancesPlugin): # Loop over processes (sorted by the sort key previously compute) # This is a Glances bottleneck (see flame graph), # get_process_curses_data should be optimzed - i = 0 - for p in self.__sort_stats(process_sort_key): - ret.extend(self.get_process_curses_data(p, i == args.cursor_position, args)) - i += 1 + for position, process in enumerate(processes_list_sorted): + ret.extend(self.get_process_curses_data(process, + position == args.cursor_position, + args)) # A filter is set Display the stats summaries if glances_processes.process_filter is not None: @@ -532,6 +482,95 @@ class Plugin(GlancesPlugin): # Return the message with decoration return ret + def __msg_curse_extended_process(self, ret, p): + """Get extended curses data tfor the selected process (see issue #2225) + p: the process dict + {'status': 'S', + 'memory_info': pmem(rss=466890752, vms=3365347328, shared=68153344, text=659456, lib=0, data=774647808, dirty=0), + 'pid': 4980, + 'io_counters': [165385216, 0, 165385216, 0, 1], + 'num_threads': 20, + 'nice': 0, + 'memory_percent': 5.958135664449709, + 'cpu_percent': 0.0, + 'gids': pgids(real=1000, effective=1000, saved=1000), + 'cpu_times': pcputimes(user=696.38, system=119.98, children_user=0.0, children_system=0.0, iowait=0.0), + 'name': 'WebExtensions', + 'key': 'pid', + 'time_since_update': 2.1997854709625244, + 'cmdline': ['/snap/firefox/2154/usr/lib/firefox/firefox', '-contentproc', '-childID', '...'], + 'username': 'nicolargo'} + """ + # Title + msg = 'Selected {} {}'.format('program' if self.args.programs else 'thread', + p['name']) + ret.append(self.curse_add_line(msg, "TITLE")) + + # First line is CPU affinity + if 'cpu_affinity' in p and p['cpu_affinity'] is not None: + ret.append(self.curse_new_line()) + msg = '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' in p and p['memory_info'] is not None: + ret.append(self.curse_new_line()) + msg = 'Memory info: {}'.format(p['memory_info']) + 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 open files/network sessions + msg = '' + if 'num_threads' in p and p['num_threads'] is not None: + msg += str(p['num_threads']) + ' threads ' + if 'num_fds' in p and p['num_fds'] is not None: + msg += str(p['num_fds']) + ' files ' + if 'num_handles' in p and p['num_handles'] is not None: + msg += str(p['num_handles']) + ' handles ' + if 'tcp' in p and p['tcp'] is not None: + msg += str(p['tcp']) + ' TCP ' + if 'udp' in p and p['udp'] is not None: + msg += str(p['udp']) + ' UDP' + if msg != '': + ret.append(self.curse_new_line()) + msg = 'Open: ' + msg + ret.append(self.curse_add_line(msg, splittable=True)) + # Fourth line is IO nice level (only Linux and Windows OS) + if 'ionice' in p and p['ionice'] is not None and hasattr(p['ionice'], 'ioclass'): + ret.append(self.curse_new_line()) + msg = '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 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)) + + ret.append(self.curse_new_line()) + ret.append(self.curse_new_line()) + def __msg_curse_header(self, ret, process_sort_key, args=None): """Build the header and add it to the ret dict.""" sort_style = 'SORT' diff --git a/glances/processes.py b/glances/processes.py index 0d41c5be..873983f4 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -37,6 +37,10 @@ class GlancesProcesses(object): def __init__(self, cache_timeout=60): """Init the class to collect stats about processes.""" + # Init the args, coming from the GlancesStandalone class + # Should be set by the set_args method + self.args = None + # Add internals caches because psutil do not cache all the stats # See: https://github.com/giampaolo/psutil/issues/462 self.username_cache = {} @@ -70,6 +74,7 @@ class GlancesProcesses(object): # Extended stats for top process is enable by default self.disable_extended_tag = False + self.extended_process = None # Test if the system can grab io_counters try: @@ -109,6 +114,10 @@ class GlancesProcesses(object): self._max_values = {} self.reset_max_values() + def set_args(self, args): + """Set args.""" + self.args = args + def reset_processcount(self): """Reset the global process count""" self.processcount = {'total': 0, 'running': 0, 'sleeping': 0, 'thread': 0, 'pid_max': None} @@ -247,6 +256,64 @@ class GlancesProcesses(object): for k in self._max_values_list: self._max_values[k] = 0.0 + def get_extended_stats(self, proc): + """Get the extended stats for the given PID.""" + # - cpu_affinity (Linux, Windows, FreeBSD) + # - ionice (Linux and Windows > Vista) + # - num_ctx_switches (not available on Illumos/Solaris) + # - num_fds (Unix-like) + # - num_handles (Windows) + # - memory_maps (only swap, Linux) + # https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ + # - connections (TCP and UDP) + ret = {} + try: + selected_process = psutil.Process(proc['pid']) + extended_stats = ['cpu_affinity', 'ionice', 'num_ctx_switches'] + if LINUX: + # num_fds only available on Unix system (see issue #1351) + extended_stats += ['num_fds'] + if WINDOWS: + extended_stats += ['num_handles'] + + # Get the extended stats + ret = selected_process.as_dict(attrs=extended_stats, ad_value=None) + + if LINUX: + try: + ret['memory_swap'] = sum([v.swap for v in selected_process.memory_maps()]) + except (psutil.NoSuchProcess, KeyError): + # (KeyError catch for issue #1551) + pass + except (psutil.AccessDenied, NotImplementedError): + # NotImplementedError: /proc/${PID}/smaps file doesn't exist + # on kernel < 2.6.14 or CONFIG_MMU kernel configuration option + # is not enabled (see psutil #533/glances #413). + ret['memory_swap'] = None + try: + ret['tcp'] = len(selected_process.connections(kind="tcp")) + ret['udp'] = len(selected_process.connections(kind="udp")) + except (psutil.AccessDenied, psutil.NoSuchProcess): + # Manage issue1283 (psutil.AccessDenied) + ret['tcp'] = None + ret['udp'] = None + except (psutil.NoSuchProcess, ValueError, AttributeError) as e: + logger.error('Can not grab extended stats ({})'.format(e)) + ret['extended_stats'] = False + self.extended_process = None + else: + logger.debug('Grab extended stats for process {}'.format(proc['pid'])) + ret['extended_stats'] = True + return ret + + def is_selected_process(self, position): + """Return True if the process is the selected one.""" + return self.args.enable_process_extended and \ + not self.disable_extended_tag and \ + hasattr(self.args, 'cursor_position') and \ + position == self.args.cursor_position and \ + not self.args.disable_cursor + def update(self): """Update the processes stats.""" # Reset the stats @@ -303,59 +370,26 @@ class GlancesProcesses(object): # Update the processcount self.update_processcount(self.processlist) - # Loop over processes and add metadata - first = True - for proc in self.processlist: - # Get extended stats, only for top processes (see issue #403). - if first and not self.disable_extended_tag: - # - cpu_affinity (Linux, Windows, FreeBSD) - # - ionice (Linux and Windows > Vista) - # - num_ctx_switches (not available on Illumos/Solaris) - # - num_fds (Unix-like) - # - num_handles (Windows) - # - memory_maps (only swap, Linux) - # https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ - # - connections (TCP and UDP) - extended = {} - try: - top_process = psutil.Process(proc['pid']) - extended_stats = ['cpu_affinity', 'ionice', 'num_ctx_switches'] - if LINUX: - # num_fds only available on Unix system (see issue #1351) - extended_stats += ['num_fds'] - if WINDOWS: - extended_stats += ['num_handles'] + # Loop over processes and : + # - add extended stats for selected process + # - add metadata + for position, proc in enumerate(self.processlist): + # Extended stats + ################ - # Get the extended stats - extended = top_process.as_dict(attrs=extended_stats, ad_value=None) + # Get the selected process + if self.is_selected_process(position): + # logger.info('Selected process: {}'.format(proc)) + self.extended_process = proc - if LINUX: - try: - extended['memory_swap'] = sum([v.swap for v in top_process.memory_maps()]) - except (psutil.NoSuchProcess, KeyError): - # (KeyError catch for issue #1551) - pass - except (psutil.AccessDenied, NotImplementedError): - # NotImplementedError: /proc/${PID}/smaps file doesn't exist - # on kernel < 2.6.14 or CONFIG_MMU kernel configuration option - # is not enabled (see psutil #533/glances #413). - extended['memory_swap'] = None - try: - extended['tcp'] = len(top_process.connections(kind="tcp")) - extended['udp'] = len(top_process.connections(kind="udp")) - except (psutil.AccessDenied, psutil.NoSuchProcess): - # Manage issue1283 (psutil.AccessDenied) - extended['tcp'] = None - extended['udp'] = None - except (psutil.NoSuchProcess, ValueError, AttributeError) as e: - logger.error('Can not grab extended stats ({})'.format(e)) - extended['extended_stats'] = False - else: - logger.debug('Grab extended stats for process {}'.format(proc['pid'])) - extended['extended_stats'] = True - proc.update(extended) - first = False - # /End of extended stats + # Grab extended stats only for the selected process (see issue #2225) + if self.extended_process is not None and \ + proc['pid'] == self.extended_process['pid']: + self.extended_process = proc + proc.update(self.get_extended_stats(self.extended_process)) + + # Meta data + ########### # PID is the key proc['key'] = 'pid' diff --git a/glances/standalone.py b/glances/standalone.py index c1268580..9d5aadc0 100644 --- a/glances/standalone.py +++ b/glances/standalone.py @@ -51,6 +51,9 @@ class GlancesStandalone(object): self.display_modules_list() sys.exit(0) + # The args is needed to get the selected process in the process list (Curses mode) + glances_processes.set_args(args) + # If process extended stats is disabled by user if not args.enable_process_extended: logger.debug("Extended stats for top process are disabled") From d6bdb8dd8e5be7495f842a480ee88aaedf04078e Mon Sep 17 00:00:00 2001 From: nicolargo Date: Wed, 28 Dec 2022 10:57:29 +0100 Subject: [PATCH 02/18] Before bar for threads --- glances/outputs/glances_curses.py | 2 +- glances/plugins/glances_processlist.py | 31 +++++++++++++++++++------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index 02796aa6..a81192c6 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -429,7 +429,7 @@ class _GlancesCurses(object): elif self.pressedkey == ord('-'): # '+' > Decrease process nice level self.decrease_nice_process = not self.decrease_nice_process - elif self.pressedkey == ord('k'): + elif self.pressedkey == ord('k') and not self.args.disable_cursor: # 'k' > Kill selected process (after confirmation) self.kill_process = not self.kill_process elif self.pressedkey == ord('w'): diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index a7417e3c..66a62f32 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -483,8 +483,11 @@ class Plugin(GlancesPlugin): return ret def __msg_curse_extended_process(self, ret, p): - """Get extended curses data tfor the selected process (see issue #2225) - p: the process dict + """Get extended curses data for the selected process (see issue #2225) + + The result depends of the process type (process or thread). + + Input p is a dict with the following keys: {'status': 'S', 'memory_info': pmem(rss=466890752, vms=3365347328, shared=68153344, text=659456, lib=0, data=774647808, dirty=0), 'pid': 4980, @@ -501,9 +504,22 @@ class Plugin(GlancesPlugin): 'cmdline': ['/snap/firefox/2154/usr/lib/firefox/firefox', '-contentproc', '-childID', '...'], 'username': 'nicolargo'} """ + if self.args.programs: + self.__msg_curse_extended_process_program(ret, p) + else: + self.__msg_curse_extended_process_thread(ret, p) + + def __msg_curse_extended_process_program(self, ret, p): # Title - msg = 'Selected {} {}'.format('program' if self.args.programs else 'thread', - p['name']) + msg = "Pinned program {} ('e' to unpin)".format(p['name']) + ret.append(self.curse_add_line(msg, "TITLE")) + + ret.append(self.curse_new_line()) + ret.append(self.curse_new_line()) + + def __msg_curse_extended_process_thread(self, ret, p): + # Title + msg = "Pinned thread {} ('e' to unpin)".format(p['name']) ret.append(self.curse_add_line(msg, "TITLE")) # First line is CPU affinity @@ -617,10 +633,9 @@ class Plugin(GlancesPlugin): msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True ) ) - if not self.args.programs: - msg = self.layout_header['command'].format('Command', "('k' to kill)" if args.is_standalone else "") - else: - msg = self.layout_header['command'].format('Programs', "('k' to kill)" if args.is_standalone else "") + shortkey = "('e' to pin | 'k' to kill)" if args.is_standalone and not args.disable_cursor else "" + msg = self.layout_header['command'].format("Programs" if self.args.programs else "Command", + shortkey) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'name' else 'DEFAULT')) def __msg_curse_sum(self, ret, sep_char='_', mmm=None, args=None): From ab68b362a11a256560646050a06568e875ea54be Mon Sep 17 00:00:00 2001 From: nicolargo Date: Thu, 29 Dec 2022 12:05:01 +0100 Subject: [PATCH 03/18] CPU and MEM ok --- glances/outputs/glances_curses.py | 3 ++ glances/plugins/glances_processlist.py | 31 ++++++++++++----- glances/processes.py | 46 +++++++++++++++++++------- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index a81192c6..debdd8b8 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -268,6 +268,7 @@ class _GlancesCurses(object): self.ifCAREFUL_color2 = curses.color_pair(8) | A_BOLD self.ifWARNING_color2 = curses.color_pair(5) | A_BOLD self.ifCRITICAL_color2 = curses.color_pair(6) | A_BOLD + self.ifINFO_color = curses.color_pair(8) self.filter_color = A_BOLD self.selected_color = A_BOLD @@ -301,6 +302,7 @@ class _GlancesCurses(object): self.ifCAREFUL_color2 = curses.A_UNDERLINE self.ifWARNING_color2 = A_BOLD self.ifCRITICAL_color2 = curses.A_REVERSE + self.ifINFO_color = A_BOLD self.filter_color = A_BOLD self.selected_color = A_BOLD @@ -328,6 +330,7 @@ class _GlancesCurses(object): 'CRITICAL_LOG': self.ifCRITICAL_color, 'PASSWORD': curses.A_PROTECT, 'SELECTED': self.selected_color, + 'INFO': self.ifINFO_color } def set_cursor(self, value): diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 66a62f32..c715b98c 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -20,6 +20,7 @@ from glances.outputs.glances_unicode import unicode_message from glances.plugins.glances_core import Plugin as CorePlugin from glances.plugins.glances_plugin import GlancesPlugin from glances.programs import processes_to_programs +from glances.outputs.glances_bars import Bar def seconds_to_hms(input_seconds): @@ -502,7 +503,10 @@ class Plugin(GlancesPlugin): 'key': 'pid', 'time_since_update': 2.1997854709625244, 'cmdline': ['/snap/firefox/2154/usr/lib/firefox/firefox', '-contentproc', '-childID', '...'], - 'username': 'nicolargo'} + 'username': 'nicolargo', + 'cpu_min': 0.0, + 'cpu_max': 7.0, + 'cpu_mean': 3.2} """ if self.args.programs: self.__msg_curse_extended_process_program(ret, p) @@ -519,21 +523,32 @@ class Plugin(GlancesPlugin): def __msg_curse_extended_process_thread(self, ret, p): # Title - msg = "Pinned thread {} ('e' to unpin)".format(p['name']) - ret.append(self.curse_add_line(msg, "TITLE")) + ret.append(self.curse_add_line("Pinned thread ", "TITLE")) + ret.append(self.curse_add_line(p['name'], "UNDERLINE")) + ret.append(self.curse_add_line(" ('e' to unpin)")) # First line is CPU affinity + ret.append(self.curse_new_line()) + ret.append(self.curse_add_line(' CPU affinity ')) if 'cpu_affinity' in p and p['cpu_affinity'] is not None: - ret.append(self.curse_new_line()) - msg = 'CPU affinity: ' + str(len(p['cpu_affinity'])) + ' cores' - ret.append(self.curse_add_line(msg, splittable=True)) + ret.append(self.curse_add_line(str(len(p['cpu_affinity'])), decoration='INFO')) + ret.append(self.curse_add_line(' cores', decoration='INFO')) + else: + ret.append(self.curse_add_line('N/A', decoration='INFO')) + # and min/max/mean CPU usage + ret.append(self.curse_add_line(' - Min/Max/Mean ')) + msg = '{:.1f}/{:.1f}/{:.1f}%'.format(p['cpu_min'], p['cpu_max'], p['cpu_mean']) + ret.append(self.curse_add_line(msg, decoration='INFO')) + # Second line is memory info if 'memory_info' in p and p['memory_info'] is not None: ret.append(self.curse_new_line()) - msg = 'Memory info: {}'.format(p['memory_info']) + ret.append(self.curse_add_line(' Memory info ')) + msg = ' '.join(['{} {}'.format(k, self.auto_unit(p['memory_info']._asdict()[k], low_precision=False)) for k in p['memory_info']._asdict()]) 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)) + ret.append(self.curse_add_line(msg, decoration='INFO', splittable=True)) + # Third line is for open files/network sessions msg = '' if 'num_threads' in p and p['num_threads'] is not None: diff --git a/glances/processes.py b/glances/processes.py index 873983f4..5ec5214c 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -266,17 +266,20 @@ class GlancesProcesses(object): # - memory_maps (only swap, Linux) # https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ # - connections (TCP and UDP) + # - CPU min/max/mean + + # Set the extended stats list (OS dependant) + extended_stats = ['cpu_affinity', 'ionice', 'num_ctx_switches'] + if LINUX: + # num_fds only available on Unix system (see issue #1351) + extended_stats += ['num_fds'] + if WINDOWS: + extended_stats += ['num_handles'] + ret = {} try: - selected_process = psutil.Process(proc['pid']) - extended_stats = ['cpu_affinity', 'ionice', 'num_ctx_switches'] - if LINUX: - # num_fds only available on Unix system (see issue #1351) - extended_stats += ['num_fds'] - if WINDOWS: - extended_stats += ['num_handles'] - # Get the extended stats + selected_process = psutil.Process(proc['pid']) ret = selected_process.as_dict(attrs=extended_stats, ad_value=None) if LINUX: @@ -299,10 +302,30 @@ class GlancesProcesses(object): ret['udp'] = None except (psutil.NoSuchProcess, ValueError, AttributeError) as e: logger.error('Can not grab extended stats ({})'.format(e)) - ret['extended_stats'] = False self.extended_process = None + ret['extended_stats'] = False else: logger.debug('Grab extended stats for process {}'.format(proc['pid'])) + + # Compute CPU min/max/mean + if 'cpu_min' not in self.extended_process: + ret['cpu_min'] = proc['cpu_percent'] + else: + ret['cpu_min'] = proc['cpu_percent'] if proc['cpu_min'] > proc['cpu_percent'] else proc['cpu_min'] + if 'cpu_max' not in self.extended_process: + ret['cpu_max'] = proc['cpu_percent'] + else: + ret['cpu_max'] = proc['cpu_percent'] if proc['cpu_max'] < proc['cpu_percent'] else proc['cpu_max'] + if 'cpu_mean_sum' not in self.extended_process: + ret['cpu_mean_sum'] = proc['cpu_percent'] + else: + ret['cpu_mean_sum'] = proc['cpu_mean_sum'] + proc['cpu_percent'] + if 'cpu_mean_counter' not in self.extended_process: + ret['cpu_mean_counter'] = 1 + else: + ret['cpu_mean_counter'] = proc['cpu_mean_counter'] + 1 + ret['cpu_mean'] = ret['cpu_mean_sum'] / ret['cpu_mean_counter'] + ret['extended_stats'] = True return ret @@ -377,16 +400,15 @@ class GlancesProcesses(object): # Extended stats ################ - # Get the selected process + # Get the selected process when the 'e' key is pressed if self.is_selected_process(position): - # logger.info('Selected process: {}'.format(proc)) self.extended_process = proc # Grab extended stats only for the selected process (see issue #2225) if self.extended_process is not None and \ proc['pid'] == self.extended_process['pid']: - self.extended_process = proc proc.update(self.get_extended_stats(self.extended_process)) + self.extended_process = proc # Meta data ########### From fc6a647e11bd55446369f85861c9754ca2c40f0b Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 8 Jan 2023 15:57:48 +0100 Subject: [PATCH 04/18] Work almost done for threads. Had to decide what the behavor for programs --- glances/plugins/glances_processlist.py | 63 +++++++++++--------------- glances/processes.py | 37 +++++++-------- 2 files changed, 46 insertions(+), 54 deletions(-) diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index c715b98c..9b10699d 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -529,46 +529,15 @@ class Plugin(GlancesPlugin): # First line is CPU affinity ret.append(self.curse_new_line()) - ret.append(self.curse_add_line(' CPU affinity ')) + ret.append(self.curse_add_line(' CPU Min/Max/Mean: ')) + msg = '{: >7.1f}{: >7.1f}{: >7.1f}%'.format(p['cpu_min'], p['cpu_max'], p['cpu_mean']) + ret.append(self.curse_add_line(msg, decoration='INFO')) if 'cpu_affinity' in p and p['cpu_affinity'] is not None: + ret.append(self.curse_add_line(' Affinity: ')) ret.append(self.curse_add_line(str(len(p['cpu_affinity'])), decoration='INFO')) ret.append(self.curse_add_line(' cores', decoration='INFO')) - else: - ret.append(self.curse_add_line('N/A', decoration='INFO')) - # and min/max/mean CPU usage - ret.append(self.curse_add_line(' - Min/Max/Mean ')) - msg = '{:.1f}/{:.1f}/{:.1f}%'.format(p['cpu_min'], p['cpu_max'], p['cpu_mean']) - ret.append(self.curse_add_line(msg, decoration='INFO')) - - # Second line is memory info - if 'memory_info' in p and p['memory_info'] is not None: - ret.append(self.curse_new_line()) - ret.append(self.curse_add_line(' Memory info ')) - msg = ' '.join(['{} {}'.format(k, self.auto_unit(p['memory_info']._asdict()[k], low_precision=False)) for k in p['memory_info']._asdict()]) - 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, decoration='INFO', splittable=True)) - - # Third line is for open files/network sessions - msg = '' - if 'num_threads' in p and p['num_threads'] is not None: - msg += str(p['num_threads']) + ' threads ' - if 'num_fds' in p and p['num_fds'] is not None: - msg += str(p['num_fds']) + ' files ' - if 'num_handles' in p and p['num_handles'] is not None: - msg += str(p['num_handles']) + ' handles ' - if 'tcp' in p and p['tcp'] is not None: - msg += str(p['tcp']) + ' TCP ' - if 'udp' in p and p['udp'] is not None: - msg += str(p['udp']) + ' UDP' - if msg != '': - ret.append(self.curse_new_line()) - msg = 'Open: ' + msg - ret.append(self.curse_add_line(msg, splittable=True)) - # Fourth line is IO nice level (only Linux and Windows OS) if 'ionice' in p and p['ionice'] is not None and hasattr(p['ionice'], 'ioclass'): - ret.append(self.curse_new_line()) - msg = 'IO nice: ' + msg = ' 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. @@ -599,6 +568,28 @@ class Plugin(GlancesPlugin): msg += ' (value %s/7)' % str(p['ionice'].value) ret.append(self.curse_add_line(msg, splittable=True)) + # Second line is memory info + ret.append(self.curse_new_line()) + ret.append(self.curse_add_line(' MEM Min/Max/Mean: ')) + msg = '{: >7.1f}{: >7.1f}{: >7.1f}%'.format(p['memory_min'], p['memory_max'], p['memory_mean']) + ret.append(self.curse_add_line(msg, decoration='INFO')) + if 'memory_info' in p and p['memory_info'] is not None: + ret.append(self.curse_add_line(' Memory info: ')) + for k in p['memory_info']._asdict(): + ret.append(self.curse_add_line(self.auto_unit(p['memory_info']._asdict()[k], low_precision=False), decoration='INFO', splittable=True)) + ret.append(self.curse_add_line(' ' + k + ' ', splittable=True)) + if 'memory_swap' in p and p['memory_swap'] is not None: + ret.append(self.curse_add_line(self.auto_unit(p['memory_swap'], low_precision=False), decoration='INFO', splittable=True)) + ret.append(self.curse_add_line(' swap ', splittable=True)) + + # Third line is for open files/network sessions + ret.append(self.curse_new_line()) + ret.append(self.curse_add_line(' Open: ')) + for stat_prefix in ['num_threads', 'num_fds', 'num_handles', 'tcp', 'udp']: + if stat_prefix in p and p[stat_prefix] is not None: + ret.append(self.curse_add_line(str(p[stat_prefix]), decoration='INFO')) + ret.append(self.curse_add_line(' {} '.format(stat_prefix.replace('num_', '')))) + ret.append(self.curse_new_line()) ret.append(self.curse_new_line()) diff --git a/glances/processes.py b/glances/processes.py index 5ec5214c..6fc52cb3 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -307,24 +307,25 @@ class GlancesProcesses(object): else: logger.debug('Grab extended stats for process {}'.format(proc['pid'])) - # Compute CPU min/max/mean - if 'cpu_min' not in self.extended_process: - ret['cpu_min'] = proc['cpu_percent'] - else: - ret['cpu_min'] = proc['cpu_percent'] if proc['cpu_min'] > proc['cpu_percent'] else proc['cpu_min'] - if 'cpu_max' not in self.extended_process: - ret['cpu_max'] = proc['cpu_percent'] - else: - ret['cpu_max'] = proc['cpu_percent'] if proc['cpu_max'] < proc['cpu_percent'] else proc['cpu_max'] - if 'cpu_mean_sum' not in self.extended_process: - ret['cpu_mean_sum'] = proc['cpu_percent'] - else: - ret['cpu_mean_sum'] = proc['cpu_mean_sum'] + proc['cpu_percent'] - if 'cpu_mean_counter' not in self.extended_process: - ret['cpu_mean_counter'] = 1 - else: - ret['cpu_mean_counter'] = proc['cpu_mean_counter'] + 1 - ret['cpu_mean'] = ret['cpu_mean_sum'] / ret['cpu_mean_counter'] + # Compute CPU and MEM min/max/mean + for stat_prefix in ['cpu', 'memory']: + if stat_prefix + '_min' not in self.extended_process: + ret[stat_prefix + '_min'] = proc[stat_prefix + '_percent'] + else: + ret[stat_prefix + '_min'] = proc[stat_prefix + '_percent'] if proc[stat_prefix + '_min'] > proc[stat_prefix + '_percent'] else proc[stat_prefix + '_min'] + if stat_prefix + '_max' not in self.extended_process: + ret[stat_prefix + '_max'] = proc[stat_prefix + '_percent'] + else: + ret[stat_prefix + '_max'] = proc[stat_prefix + '_percent'] if proc[stat_prefix + '_max'] < proc[stat_prefix + '_percent'] else proc[stat_prefix + '_max'] + if stat_prefix + '_mean_sum' not in self.extended_process: + ret[stat_prefix + '_mean_sum'] = proc[stat_prefix + '_percent'] + else: + ret[stat_prefix + '_mean_sum'] = proc[stat_prefix + '_mean_sum'] + proc[stat_prefix + '_percent'] + if stat_prefix + '_mean_counter' not in self.extended_process: + ret[stat_prefix + '_mean_counter'] = 1 + else: + ret[stat_prefix + '_mean_counter'] = proc[stat_prefix + '_mean_counter'] + 1 + ret[stat_prefix + '_mean'] = ret[stat_prefix + '_mean_sum'] / ret[stat_prefix + '_mean_counter'] ret['extended_stats'] = True return ret From bf46e85e1ccd3f5ebcec2f9e86051ec4c5c702a2 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 8 Jan 2023 16:08:11 +0100 Subject: [PATCH 05/18] Correct an issue on check for extended stats --- glances/processes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/glances/processes.py b/glances/processes.py index 6fc52cb3..c50b89fe 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -332,7 +332,8 @@ class GlancesProcesses(object): def is_selected_process(self, position): """Return True if the process is the selected one.""" - return self.args.enable_process_extended and \ + return hasattr(self.args, 'enable_process_extended') and \ + self.args.enable_process_extended and \ not self.disable_extended_tag and \ hasattr(self.args, 'cursor_position') and \ position == self.args.cursor_position and \ From b715fc2aba0cbd6d21264f2c87896a3f5086b0d6 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 8 Jan 2023 17:45:47 +0100 Subject: [PATCH 06/18] First version only for threads, not programs --- glances/outputs/glances_curses.py | 2 +- glances/plugins/glances_processlist.py | 14 ++++++++++---- glances/processes.py | 21 ++++++++++++++------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index debdd8b8..3b23ace0 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -410,7 +410,7 @@ class _GlancesCurses(object): elif self.pressedkey == ord('9'): # '9' > Theme from black to white and reverse self._init_colors() - elif self.pressedkey == ord('e'): + elif self.pressedkey == ord('e') and not self.args.programs: # 'e' > Enable/Disable process extended self.args.enable_process_extended = not self.args.enable_process_extended if not self.args.enable_process_extended: diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 9b10699d..96872a4b 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -19,7 +19,6 @@ from glances.processes import glances_processes, sort_stats from glances.outputs.glances_unicode import unicode_message from glances.plugins.glances_core import Plugin as CorePlugin from glances.plugins.glances_plugin import GlancesPlugin -from glances.programs import processes_to_programs from glances.outputs.glances_bars import Bar @@ -147,9 +146,10 @@ class Plugin(GlancesPlugin): # Update stats using the standard system lib # Note: Update is done in the processcount plugin # Just return the processes list - stats = glances_processes.getlist() if self.args.programs: - stats = processes_to_programs(stats) + stats = glances_processes.getlist(as_programs=True) + else: + stats = glances_processes.getlist() elif self.input_method == 'snmp': # No SNMP grab for processes @@ -639,7 +639,13 @@ class Plugin(GlancesPlugin): msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True ) ) - shortkey = "('e' to pin | 'k' to kill)" if args.is_standalone and not args.disable_cursor else "" + if args.is_standalone and not args.disable_cursor: + if self.args.programs: + shortkey = "('k' to kill)" + else: + shortkey = "('e' to pin | 'k' to kill)" + else: + shortkey = "" msg = self.layout_header['command'].format("Programs" if self.args.programs else "Command", shortkey) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'name' else 'DEFAULT')) diff --git a/glances/processes.py b/glances/processes.py index c50b89fe..9504f137 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -13,6 +13,7 @@ from glances.compat import iterkeys from glances.globals import BSD, LINUX, MACOS, WINDOWS from glances.timer import Timer, getTimeSinceLastUpdate from glances.filter import GlancesFilter +from glances.programs import processes_to_programs from glances.logger import logger import psutil @@ -330,9 +331,10 @@ class GlancesProcesses(object): ret['extended_stats'] = True return ret - def is_selected_process(self, position): - """Return True if the process is the selected one.""" - return hasattr(self.args, 'enable_process_extended') and \ + def is_selected_extended_process(self, position): + """Return True if the process is the selected one for extended stats.""" + return not self.args.programs and \ + hasattr(self.args, 'enable_process_extended') and \ self.args.enable_process_extended and \ not self.disable_extended_tag and \ hasattr(self.args, 'cursor_position') and \ @@ -403,7 +405,7 @@ class GlancesProcesses(object): ################ # Get the selected process when the 'e' key is pressed - if self.is_selected_process(position): + if self.is_selected_extended_process(position): self.extended_process = proc # Grab extended stats only for the selected process (see issue #2225) @@ -481,9 +483,14 @@ class GlancesProcesses(object): """Get the number of processes.""" return self.processcount - def getlist(self, sorted_by=None): - """Get the processlist.""" - return self.processlist + def getlist(self, sorted_by=None, as_programs=False): + """Get the processlist. + By default, return the list of threads. + If as_programs is True, return the list of programs.""" + if as_programs: + return processes_to_programs(self.processlist) + else: + return self.processlist @property def sort_key(self): From 2aa7ea15c5d5ff804c64098bb2cab6a6a3043e51 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 8 Jan 2023 17:58:32 +0100 Subject: [PATCH 07/18] Correct an issue with unit tests --- glances/processes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/glances/processes.py b/glances/processes.py index 9504f137..7c856bbe 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -333,7 +333,8 @@ class GlancesProcesses(object): def is_selected_extended_process(self, position): """Return True if the process is the selected one for extended stats.""" - return not self.args.programs and \ + return hasattr(self.args, 'programs') and \ + not self.args.programs and \ hasattr(self.args, 'enable_process_extended') and \ self.args.enable_process_extended and \ not self.disable_extended_tag and \ From 69be665406d0ebd7a715df3a23143f6e253f3ca1 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 4 Mar 2023 09:23:57 +0100 Subject: [PATCH 08/18] Correct issue on docker compose with latest docker-compose version --- docker-compose/docker-compose.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index ee50dc4b..acf17cbe 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -5,8 +5,7 @@ services: context: ./ dockerfile: Dockerfile restart: always - ports: - - "61208:61208" + network_mode: "host" environment: GLANCES_OPT: "-C /glances/conf/glances.conf -w" volumes: @@ -14,4 +13,3 @@ services: - "./glances.conf:/glances/conf/glances.conf" pid: "host" privileged: true - network_mode: "host" From 6b637bcc57b2a97e2de216784a5159b1b2307db6 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 5 Mar 2023 09:25:53 +0100 Subject: [PATCH 09/18] All times displayed in UTC - Container not using TZ/localtime (Docker) #2278 --- Makefile | 12 ++++++------ README.rst | 6 +++--- docker-compose/docker-compose-with-traefik.yml | 6 ++++-- docker-compose/docker-compose.yml | 9 +++++---- docker-files/alpine.Dockerfile | 6 ++++-- docker-files/ubuntu.Dockerfile | 2 ++ 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 8244da7f..6953d09d 100644 --- a/Makefile +++ b/Makefile @@ -159,22 +159,22 @@ run-local-conf: ## Start Glances in console mode with the system conf file ./venv/bin/python -m glances run-docker-alpine-minimal: ## Start Glances Alpine Docker minimal in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-minimal + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-minimal run-docker-alpine-full: ## Start Glances Alpine Docker full in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-full + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-full run-docker-alpine-dev: ## Start Glances Alpine Docker dev in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-dev + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-dev run-docker-ubuntu-minimal: ## Start Glances Ubuntu Docker minimal in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-minimal + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-minimal run-docker-ubuntu-full: ## Start Glances Ubuntu Docker full in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-full + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-full run-docker-ubuntu-dev: ## Start Glances Ubuntu Docker dev in console mode - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-dev + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-dev run-webserver: ## Start Glances in Web server mode ./venv/bin/python -m glances -C ./conf/glances.conf -w diff --git a/README.rst b/README.rst index 9deffbd9..b3b2ec4b 100644 --- a/README.rst +++ b/README.rst @@ -220,7 +220,7 @@ Run last version of Glances container in *console mode*: .. code-block:: console - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it nicolargo/glances:latest-full + docker run --rm -e TZ="${TZ}" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it nicolargo/glances:latest-full Additionally, if you want to use your own glances.conf file, you can create your own Dockerfile: @@ -237,7 +237,7 @@ variable setting parameters for the glances startup command): .. code-block:: console - docker run -v `pwd`/glances.conf:/etc/glances.conf -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host -e GLANCES_OPT="-C /etc/glances.conf" -it nicolargo/glances:latest-full + docker run -e TZ="${TZ}" -v `pwd`/glances.conf:/etc/glances.conf -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host -e GLANCES_OPT="-C /etc/glances.conf" -it nicolargo/glances:latest-full Where \`pwd\`/glances.conf is a local directory containing your glances.conf file. @@ -245,7 +245,7 @@ Run the container in *Web server mode*: .. code-block:: console - docker run -d --restart="always" -p 61208-61209:61208-61209 -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host nicolargo/glances:latest-full + docker run -d --restart="always" -p 61208-61209:61208-61209 -e TZ="${TZ}" -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host nicolargo/glances:latest-full GNU/Linux --------- diff --git a/docker-compose/docker-compose-with-traefik.yml b/docker-compose/docker-compose-with-traefik.yml index db29890f..786aa905 100644 --- a/docker-compose/docker-compose-with-traefik.yml +++ b/docker-compose/docker-compose-with-traefik.yml @@ -21,9 +21,11 @@ services: privileged: true network_mode: "host" volumes: - - /var/run/docker.sock:/var/run/docker.sock + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "./glances.conf:/glances/conf/glances.conf" environment: - - "GLANCES_OPT=-w" + - GLANCES_OPT: "-C /glances/conf/glances.conf -w" + - TZ: "${TZ}" labels: - "traefik.port=61208" - "traefik.frontend.rule=Host:glances.docker.localhost" diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index acf17cbe..703d8775 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -5,11 +5,12 @@ services: context: ./ dockerfile: Dockerfile restart: always + pid: "host" + privileged: true network_mode: "host" - environment: - GLANCES_OPT: "-C /glances/conf/glances.conf -w" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" - "./glances.conf:/glances/conf/glances.conf" - pid: "host" - privileged: true + environment: + - GLANCES_OPT: "-C /glances/conf/glances.conf -w" + - TZ: "${TZ}" diff --git a/docker-files/alpine.Dockerfile b/docker-files/alpine.Dockerfile index 3a4b64ef..53e78f47 100644 --- a/docker-files/alpine.Dockerfile +++ b/docker-files/alpine.Dockerfile @@ -27,7 +27,8 @@ RUN apk add --no-cache \ lm-sensors \ wireless-tools \ smartmontools \ - iputils + iputils \ + tzdata ############################################################################## # Install the dependencies beforehand to make them cacheable @@ -95,7 +96,8 @@ RUN apk add --no-cache \ lm-sensors \ wireless-tools \ smartmontools \ - iputils + iputils \ + tzdata COPY --from=buildRequirements /root/.local/bin /usr/local/bin/ COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/site-packages/ diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 22394169..2fa00d27 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -27,6 +27,7 @@ RUN apt-get update \ wireless-tools \ smartmontools \ net-tools \ + tzdata \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -105,6 +106,7 @@ RUN apt-get update \ wireless-tools \ smartmontools \ net-tools \ + tzdata \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From 52cf4984f2163dbb0b12e3168e7911b677f0d765 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 5 Mar 2023 10:35:50 +0100 Subject: [PATCH 10/18] Dissociate 2 sensors with exactly the same names #2280 --- docs/aoa/sensors.rst | 6 ++++++ glances/plugins/glances_sensors.py | 14 ++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/aoa/sensors.rst b/docs/aoa/sensors.rst index e637af61..87d64933 100644 --- a/docs/aoa/sensors.rst +++ b/docs/aoa/sensors.rst @@ -31,6 +31,12 @@ There is no alert on this information. unitname_fan_speed_alias=Alias for fan speed .. note 4:: + If a sensors has multiple identical features names (see #2280), then + Glances will add a suffix to the feature name. + For example, if you have one sensor with two Composite features, the + second one will be named Composite_1. + +.. note 5:: The plugin could crash on some operating system (FreeBSD) with the TCP or UDP blackhole option > 0 (see issue #2106). In this case, you should disable the sensors (--disable-plugin sensors or from the diff --git a/glances/plugins/glances_sensors.py b/glances/plugins/glances_sensors.py index 00df5dac..910f11d4 100644 --- a/glances/plugins/glances_sensors.py +++ b/glances/plugins/glances_sensors.py @@ -175,7 +175,7 @@ class Plugin(GlancesPlugin): # Alert processing if i['type'] == SENSOR_TEMP_TYPE: if self.is_limit('critical', stat_name='sensors_temperature_' + i['label']): - # By default use the thresholds confiured in the glances.conf file (see #2058) + # By default use the thresholds configured in the glances.conf file (see #2058) alert = self.get_alert(current=i['value'], header='temperature_' + i['label']) else: # Else use the system thresholds @@ -197,7 +197,7 @@ class Plugin(GlancesPlugin): self.views[i[self.get_key()]]['value']['decoration'] = alert def battery_trend(self, stats): - """Return the trend characterr for the battery""" + """Return the trend character for the battery""" if 'status' not in stats: return '' if stats['status'].startswith('Charg'): @@ -331,12 +331,15 @@ class GlancesGrabSensors(object): else: return ret for chip_name, chip in iteritems(input_list): - i = 1 - for feature in chip: + label_index = 1 + for chip_name_index, feature in enumerate(chip): sensors_current = {} # Sensor name if feature.label == '': - sensors_current['label'] = chip_name + ' ' + str(i) + sensors_current['label'] = chip_name + ' ' + str(chip_name_index) + elif feature.label in [i['label'] for i in ret]: + sensors_current['label'] = feature.label + ' ' + str(label_index) + label_index += 1 else: sensors_current['label'] = feature.label # Sensors value, limit and unit @@ -348,7 +351,6 @@ class GlancesGrabSensors(object): sensors_current['critical'] = int(system_critical) if system_critical is not None else None # Add sensor to the list ret.append(sensors_current) - i += 1 return ret def get(self, sensor_type=SENSOR_TEMP_TYPE): From a798d10ab18ff0c2b10b5a33f4502f4a3438430f Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 5 Mar 2023 14:59:28 +0100 Subject: [PATCH 11/18] Set the min=0 ans max=100 for the sparklines axe --- glances/outputs/glances_sparklines.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/outputs/glances_sparklines.py b/glances/outputs/glances_sparklines.py index 95825d2e..d345c821 100644 --- a/glances/outputs/glances_sparklines.py +++ b/glances/outputs/glances_sparklines.py @@ -77,7 +77,7 @@ class Sparkline(object): def get(self): """Return the sparkline.""" - ret = sparklines(self.percents)[0] + ret = sparklines(self.percents, minimum=0, maximum=100)[0] if self.__with_text: percents_without_none = [x for x in self.percents if x is not None] if len(percents_without_none) > 0: From 635dc2e3bbebedadaf8edcaf9bf3bf79c784f4e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 00:11:59 +0000 Subject: [PATCH 12/18] chore(deps): update nvidia/cuda docker tag to v12.1.0 --- docker-files/ubuntu.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 2fa00d27..4f0383f3 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -8,7 +8,7 @@ # Ex: Python 3.10 for Ubuntu 22.04 # Note: ENV is for future running containers. ARG for building your Docker image. -ARG IMAGE_VERSION=12.0.1-base-ubuntu22.04 +ARG IMAGE_VERSION=12.1.0-base-ubuntu22.04 ARG PYTHON_VERSION=3.10 ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ FROM nvidia/cuda:${IMAGE_VERSION} as build From d3bc9061f418088f824d7abda686c91dcd5414eb Mon Sep 17 00:00:00 2001 From: Raz Crimson <52282402+RazCrimson@users.noreply.github.com> Date: Fri, 10 Mar 2023 19:03:01 +0530 Subject: [PATCH 13/18] chore: missed out formatting --- glances/standalone.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/glances/standalone.py b/glances/standalone.py index 439d5207..63089ff9 100644 --- a/glances/standalone.py +++ b/glances/standalone.py @@ -193,5 +193,7 @@ class GlancesStandalone(object): ) print("You should consider upgrading using: pip install --upgrade glances") print("Disable this warning temporarily using: glances --disable-check-update") - print("To disable it permanently, refer config reference at " - "https://glances.readthedocs.io/en/latest/config.html#syntax") + print( + "To disable it permanently, refer config reference at " + "https://glances.readthedocs.io/en/latest/config.html#syntax" + ) From 53c1d64aff134a14cee3048165171435c3b2744a Mon Sep 17 00:00:00 2001 From: Raz Crimson <52282402+RazCrimson@users.noreply.github.com> Date: Fri, 10 Mar 2023 19:05:24 +0530 Subject: [PATCH 14/18] fix: Bottle - /api/%s/status endpoint prob: failure in compressing `None` with zlib --- glances/outputs/glances_bottle.py | 2 +- unitest-restful.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/glances/outputs/glances_bottle.py b/glances/outputs/glances_bottle.py index ed5013f2..69af77f7 100644 --- a/glances/outputs/glances_bottle.py +++ b/glances/outputs/glances_bottle.py @@ -230,7 +230,7 @@ class GlancesBottle(object): """ response.status = 200 - return None + return "Active" @compress def _api_help(self): diff --git a/unitest-restful.py b/unitest-restful.py index 362fce61..fa36f88b 100755 --- a/unitest-restful.py +++ b/unitest-restful.py @@ -221,6 +221,16 @@ class TestGlances(unittest.TestCase): self.assertIsInstance(req.json(), dict) self.assertIsInstance(req.json()['interface_name'], list) + def test_012_status(self): + """Check status endpoint.""" + method = "status" + print('INFO: [TEST_012] Status') + print("HTTP RESTful request: %s/%s" % (URL, method)) + req = self.http_get("%s/%s" % (URL, method)) + + self.assertTrue(req.ok) + self.assertEqual(req.text, "Active") + def test_999_stop_server(self): """Stop the Glances Web Server.""" print('INFO: [TEST_999] Stop the Glances Web Server') From d28a696fc188499fc50fbe48a7851d5b5b98146b Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 11 Mar 2023 11:01:29 +0100 Subject: [PATCH 15/18] Refactor the Cloud plugin, disable it by default in the default configuration file - Related to #2279 --- conf/glances.conf | 5 + docs/_static/cloud.png | Bin 0 -> 21111 bytes docs/aoa/cloud.rst | 15 + docs/aoa/index.rst | 1 + docs/api.rst | 1020 ++++++++--------- docs/man/glances.1 | 2 +- .../static/js/components/plugin-cloud.vue | 6 +- glances/outputs/static/public/glances.js | 2 +- glances/plugins/glances_cloud.py | 76 +- 9 files changed, 544 insertions(+), 583 deletions(-) create mode 100644 docs/_static/cloud.png create mode 100644 docs/aoa/cloud.rst diff --git a/conf/glances.conf b/conf/glances.conf index cf3a8f7d..8057a7be 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -263,6 +263,11 @@ disable=False #folder_3_path=/nonexisting #folder_4_path=/root +[cloud] +# Documentation: https://glances.readthedocs.io/en/stable/aoa/cloud.html +# This plugin is disabled by default +disable=True + [raid] # Documentation: https://glances.readthedocs.io/en/stable/aoa/raid.html # This plugin is disabled by default diff --git a/docs/_static/cloud.png b/docs/_static/cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..ac20d590e7d02b2f8063922362c84b2448a7566c GIT binary patch literal 21111 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 SU*vKC00000;function eo(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on".concat(t),(function(){n(window.event)}))}function to(e,t){for(var n=t.slice(0,t.length-1),r=0;r=0;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}for(var ro={backspace:8,"⌫":8,tab:9,clear:12,enter:13,"↩":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"⇪":20,",":188,".":190,"/":191,"`":192,"-":Ys?173:189,"=":Ys?61:187,";":Ys?59:186,"'":222,"[":219,"]":221,"\\":220},io={"⇧":16,shift:16,"⌥":18,alt:18,option:18,"⌃":17,ctrl:17,control:17,"⌘":91,cmd:91,command:91},so={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},oo={16:!1,18:!1,17:!1,91:!1},ao={},lo=1;lo<20;lo++)ro["f".concat(lo)]=111+lo;var co=[],uo=!1,fo="all",po=[],ho=function(e){return ro[e.toLowerCase()]||io[e.toLowerCase()]||e.toUpperCase().charCodeAt(0)};function go(e){fo=e||"all"}function mo(){return fo||"all"}var bo=function(e){var t=e.key,n=e.scope,r=e.method,i=e.splitKey,s=void 0===i?"+":i;no(t).forEach((function(e){var t=e.split(s),i=t.length,o=t[i-1],a="*"===o?"*":ho(o);if(ao[a]){n||(n=mo());var l=i>1?to(io,t):[];ao[a]=ao[a].filter((function(e){return!((!r||e.method===r)&&e.scope===n&&function(e,t){for(var n=e.length>=t.length?e:t,r=e.length>=t.length?t:e,i=!0,s=0;s0,oo)Object.prototype.hasOwnProperty.call(oo,s)&&(!oo[s]&&t.mods.indexOf(+s)>-1||oo[s]&&-1===t.mods.indexOf(+s))&&(i=!1);(0!==t.mods.length||oo[16]||oo[18]||oo[17]||oo[91])&&!i&&"*"!==t.shortcut||!1===t.method(e,t)&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0))}}function yo(e,t){var n=ao["*"],r=e.keyCode||e.which||e.charCode;if(wo.filter.call(this,e)){if(93!==r&&224!==r||(r=91),-1===co.indexOf(r)&&229!==r&&co.push(r),["ctrlKey","altKey","shiftKey","metaKey"].forEach((function(t){var n=so[t];e[t]&&-1===co.indexOf(n)?co.push(n):!e[t]&&co.indexOf(n)>-1?co.splice(co.indexOf(n),1):"metaKey"===t&&e[t]&&3===co.length&&(e.ctrlKey||e.shiftKey||e.altKey||(co=co.slice(co.indexOf(n))))})),r in oo){for(var i in oo[r]=!0,io)io[i]===r&&(wo[i]=!0);if(!n)return}for(var s in oo)Object.prototype.hasOwnProperty.call(oo,s)&&(oo[s]=e[so[s]]);e.getModifierState&&(!e.altKey||e.ctrlKey)&&e.getModifierState("AltGraph")&&(-1===co.indexOf(17)&&co.push(17),-1===co.indexOf(18)&&co.push(18),oo[17]=!0,oo[18]=!0);var o=mo();if(n)for(var a=0;a1&&(i=to(io,e)),(e="*"===(e=e[e.length-1])?"*":ho(e))in ao||(ao[e]=[]),ao[e].push({keyup:l,keydown:c,scope:s,mods:i,shortcut:r[a],method:n,key:r[a],splitKey:u,element:o});void 0!==o&&!function(e){return po.indexOf(e)>-1}(o)&&window&&(po.push(o),eo(o,"keydown",(function(e){yo(e,o)}),d),uo||(uo=!0,eo(window,"focus",(function(){co=[]}),d)),eo(o,"keyup",(function(e){yo(e,o),function(e){var t=e.keyCode||e.which||e.charCode,n=co.indexOf(t);if(n>=0&&co.splice(n,1),e.key&&"meta"===e.key.toLowerCase()&&co.splice(0,co.length),93!==t&&224!==t||(t=91),t in oo)for(var r in oo[t]=!1,io)io[r]===t&&(wo[r]=!1)}(e)}),d))}var xo={getPressedKeyString:function(){return co.map((function(e){return t=e,Object.keys(ro).find((function(e){return ro[e]===t}))||function(e){return Object.keys(io).find((function(t){return io[t]===e}))}(e)||String.fromCharCode(e);var t}))},setScope:go,getScope:mo,deleteScope:function(e,t){var n,r;for(var i in e||(e=mo()),ao)if(Object.prototype.hasOwnProperty.call(ao,i))for(n=ao[i],r=0;r1&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(ao).forEach((function(n){ao[n].filter((function(n){return n.scope===t&&n.shortcut===e})).forEach((function(e){e&&e.method&&e.method()}))}))},unbind:function(e){if(void 0===e)Object.keys(ao).forEach((function(e){return delete ao[e]}));else if(Array.isArray(e))e.forEach((function(e){e.key&&bo(e)}));else if("object"==typeof e)e.key&&bo(e);else if("string"==typeof e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=this.limits[e][l]){var c=l.lastIndexOf("_");return l.substring(c+1)+s}}return"ok"+s}getAlertLog(e,t,n,r){return this.getAlert(e,t,n,r,!0)}};const Eo=new class{data=void 0;init(e=60){let t;const n=()=>(Co.status="PENDING",Promise.all([fetch("api/3/all",{method:"GET"}).then((e=>e.json())),fetch("api/3/all/views",{method:"GET"}).then((e=>e.json()))]).then((e=>{const t={stats:e[0],views:e[1],isBsd:"FreeBSD"===e[0].system.os_name,isLinux:"Linux"===e[0].system.os_name,isSunOS:"SunOS"===e[0].system.os_name,isMac:"Darwin"===e[0].system.os_name,isWindows:"Windows"===e[0].system.os_name};this.data=t,Co.data=t,Co.status="SUCCESS"})).catch((e=>{console.log(e),Co.status="FAILURE"})).then((()=>{t&&clearTimeout(t),t=setTimeout(n,1e3*e)})));n(),fetch("api/3/all/limits",{method:"GET"}).then((e=>e.json())).then((e=>{Ao.setLimits(e)})),fetch("api/3/args",{method:"GET"}).then((e=>e.json())).then(((e={})=>{Co.args={...Co.args,...e}})),fetch("api/3/config",{method:"GET"}).then((e=>e.json())).then(((e={})=>{Co.config={...Co.config,...e}}))}getData(){return this.data}};const Oo=new class{constructor(){this.favico=new(So())({animation:"none"})}badge(e){this.favico.badge(e)}reset(){this.favico.reset()}},Io={key:0},Lo={class:"container-fluid"},Po={class:"row"},No={class:"col-sm-12 col-lg-24"},Do=ui("div",{class:"row"}," ",-1),Mo={class:"row"},jo={class:"col-sm-12 col-lg-24"},Ro=ui("div",{class:"row"}," ",-1),qo={class:"divTable",style:{width:"100%"}},Bo={class:"divTableBody"},Uo={class:"divTableRow"},Fo={class:"divTableHead"},zo={class:"divTableHead"},$o={class:"divTableHead"},Ho={class:"divTableHead"},Vo={class:"divTableRow"},Go={class:"divTableCell"},Wo={class:"divTableCell"},Zo={class:"divTableCell"},Ko={class:"divTableCell"},Xo={class:"divTableRow"},Qo={class:"divTableCell"},Jo={class:"divTableCell"},Yo={class:"divTableCell"},ea={class:"divTableCell"},ta={class:"divTableRow"},na={class:"divTableCell"},ra={class:"divTableCell"},ia={class:"divTableCell"},sa={class:"divTableCell"},oa={class:"divTableRow"},aa={class:"divTableCell"},la={class:"divTableCell"},ca={class:"divTableCell"},ua={class:"divTableCell"},da={class:"divTableRow"},fa={class:"divTableCell"},pa={class:"divTableCell"},ha={class:"divTableCell"},ga={class:"divTableCell"},ma={class:"divTableRow"},ba={class:"divTableCell"},va={class:"divTableCell"},ya={class:"divTableCell"},wa={class:"divTableCell"},xa={class:"divTableRow"},_a={class:"divTableCell"},ka={class:"divTableCell"},Ca={class:"divTableCell"},Ta={class:"divTableCell"},Sa={class:"divTableRow"},Aa=ui("div",{class:"divTableCell"}," ",-1),Ea={class:"divTableCell"},Oa={class:"divTableCell"},Ia={class:"divTableCell"},La={class:"divTableRow"},Pa=ui("div",{class:"divTableCell"}," ",-1),Na={class:"divTableCell"},Da={class:"divTableCell"},Ma={class:"divTableCell"},ja={class:"divTableRow"},Ra=ui("div",{class:"divTableCell"}," ",-1),qa={class:"divTableCell"},Ba={class:"divTableCell"},Ua={class:"divTableCell"},Fa={class:"divTableRow"},za=ui("div",{class:"divTableCell"}," ",-1),$a={class:"divTableCell"},Ha=ui("div",{class:"divTableCell"}," ",-1),Va={class:"divTableCell"},Ga={class:"divTableRow"},Wa=ui("div",{class:"divTableCell"}," ",-1),Za={class:"divTableCell"},Ka=ui("div",{class:"divTableCell"}," ",-1),Xa=ui("div",{class:"divTableCell"}," ",-1),Qa={class:"divTableRow"},Ja=ui("div",{class:"divTableCell"}," ",-1),Ya={class:"divTableCell"},el=ui("div",{class:"divTableCell"}," ",-1),tl=ui("div",{class:"divTableCell"}," ",-1),nl={class:"divTableRow"},rl=ui("div",{class:"divTableCell"}," ",-1),il={class:"divTableCell"},sl=ui("div",{class:"divTableCell"}," ",-1),ol=ui("div",{class:"divTableCell"}," ",-1),al={class:"divTableRow"},ll=ui("div",{class:"divTableCell"}," ",-1),cl={class:"divTableCell"},ul=ui("div",{class:"divTableCell"}," ",-1),dl=ui("div",{class:"divTableCell"}," ",-1),fl={class:"divTableRow"},pl=ui("div",{class:"divTableCell"}," ",-1),hl={class:"divTableCell"},gl=ui("div",{class:"divTableCell"}," ",-1),ml=ui("div",{class:"divTableCell"}," ",-1),bl={class:"divTableRow"},vl=ui("div",{class:"divTableCell"}," ",-1),yl={class:"divTableCell"},wl=ui("div",{class:"divTableCell"}," ",-1),xl=ui("div",{class:"divTableCell"}," ",-1),_l={class:"divTableRow"},kl=ui("div",{class:"divTableCell"}," ",-1),Cl={class:"divTableCell"},Tl=ui("div",{class:"divTableCell"}," ",-1),Sl=ui("div",{class:"divTableCell"}," ",-1),Al={class:"divTableRow"},El=ui("div",{class:"divTableCell"}," ",-1),Ol={class:"divTableCell"},Il=ui("div",{class:"divTableCell"}," ",-1),Ll=ui("div",{class:"divTableCell"}," ",-1),Pl={class:"divTableRow"},Nl=ui("div",{class:"divTableCell"}," ",-1),Dl={class:"divTableCell"},Ml=ui("div",{class:"divTableCell"}," ",-1),jl=ui("div",{class:"divTableCell"}," ",-1),Rl=ui("div",null,[ui("p",null,[hi(" For an exhaustive list of key bindings, "),ui("a",{href:"https://glances.readthedocs.io/en/latest/cmds.html#interactive-commands"},"click here"),hi(". ")])],-1),ql=ui("div",null,[ui("p",null,[hi("Press "),ui("b",null,"h"),hi(" to came back to Glances.")])],-1);const Bl={data:()=>({help:void 0}),mounted(){fetch("api/3/help",{method:"GET"}).then((e=>e.json())).then((e=>this.help=e))}};var Ul=n(3744);const Fl=(0,Ul.Z)(Bl,[["render",function(e,t,n,r,i,s){return i.help?(Jr(),ri("div",Io,[ui("div",Lo,[ui("div",Po,[ui("div",No,E(i.help.version)+" "+E(i.help.psutil_version),1)]),Do,ui("div",Mo,[ui("div",jo,E(i.help.configuration_file),1)]),Ro]),ui("div",qo,[ui("div",Bo,[ui("div",Uo,[ui("div",Fo,E(i.help.header_sort.replace(":","")),1),ui("div",zo,E(i.help.header_show_hide.replace(":","")),1),ui("div",$o,E(i.help.header_toggle.replace(":","")),1),ui("div",Ho,E(i.help.header_miscellaneous.replace(":","")),1)]),ui("div",Vo,[ui("div",Go,E(i.help.sort_auto),1),ui("div",Wo,E(i.help.show_hide_application_monitoring),1),ui("div",Zo,E(i.help.toggle_bits_bytes),1),ui("div",Ko,E(i.help.misc_erase_process_filter),1)]),ui("div",Xo,[ui("div",Qo,E(i.help.sort_cpu),1),ui("div",Jo,E(i.help.show_hide_diskio),1),ui("div",Yo,E(i.help.toggle_count_rate),1),ui("div",ea,E(i.help.misc_generate_history_graphs),1)]),ui("div",ta,[ui("div",na,E(i.help.sort_io_rate),1),ui("div",ra,E(i.help.show_hide_docker),1),ui("div",ia,E(i.help.toggle_used_free),1),ui("div",sa,E(i.help.misc_help),1)]),ui("div",oa,[ui("div",aa,E(i.help.sort_mem),1),ui("div",la,E(i.help.show_hide_top_extended_stats),1),ui("div",ca,E(i.help.toggle_bar_sparkline),1),ui("div",ua,E(i.help.misc_accumulate_processes_by_program),1)]),ui("div",da,[ui("div",fa,E(i.help.sort_process_name),1),ui("div",pa,E(i.help.show_hide_filesystem),1),ui("div",ha,E(i.help.toggle_separate_combined),1),ui("div",ga,E(i.help.misc_kill_process)+" - N/A in WebUI ",1)]),ui("div",ma,[ui("div",ba,E(i.help.sort_cpu_times),1),ui("div",va,E(i.help.show_hide_gpu),1),ui("div",ya,E(i.help.toggle_live_cumulative),1),ui("div",wa,E(i.help.misc_reset_processes_summary_min_max),1)]),ui("div",xa,[ui("div",_a,E(i.help.sort_user),1),ui("div",ka,E(i.help.show_hide_ip),1),ui("div",Ca,E(i.help.toggle_linux_percentage),1),ui("div",Ta,E(i.help.misc_quit),1)]),ui("div",Sa,[Aa,ui("div",Ea,E(i.help.show_hide_tcp_connection),1),ui("div",Oa,E(i.help.toggle_cpu_individual_combined),1),ui("div",Ia,E(i.help.misc_reset_history),1)]),ui("div",La,[Pa,ui("div",Na,E(i.help.show_hide_alert),1),ui("div",Da,E(i.help.toggle_gpu_individual_combined),1),ui("div",Ma,E(i.help.misc_delete_warning_alerts),1)]),ui("div",ja,[Ra,ui("div",qa,E(i.help.show_hide_network),1),ui("div",Ba,E(i.help.toggle_short_full),1),ui("div",Ua,E(i.help.misc_delete_warning_and_critical_alerts),1)]),ui("div",Fa,[za,ui("div",$a,E(i.help.sort_cpu_times),1),Ha,ui("div",Va,E(i.help.misc_edit_process_filter_pattern)+" - N/A in WebUI ",1)]),ui("div",Ga,[Wa,ui("div",Za,E(i.help.show_hide_irq),1),Ka,Xa]),ui("div",Qa,[Ja,ui("div",Ya,E(i.help.show_hide_raid_plugin),1),el,tl]),ui("div",nl,[rl,ui("div",il,E(i.help.show_hide_sensors),1),sl,ol]),ui("div",al,[ll,ui("div",cl,E(i.help.show_hide_wifi_module),1),ul,dl]),ui("div",fl,[pl,ui("div",hl,E(i.help.show_hide_processes),1),gl,ml]),ui("div",bl,[vl,ui("div",yl,E(i.help.show_hide_left_sidebar),1),wl,xl]),ui("div",_l,[kl,ui("div",Cl,E(i.help.show_hide_quick_look),1),Tl,Sl]),ui("div",Al,[El,ui("div",Ol,E(i.help.show_hide_cpu_mem_swap),1),Il,Ll]),ui("div",Pl,[Nl,ui("div",Dl,E(i.help.show_hide_all),1),Ml,jl])])]),Rl,ql])):mi("v-if",!0)}]]),zl={class:"plugin"},$l={id:"alerts"},Hl={key:0,class:"title"},Vl={key:1,class:"title"},Gl={id:"alert"},Wl={class:"table"},Zl={class:"table-cell text-left"};var Kl=n(6486);const Xl={props:{data:{type:Object}},computed:{stats(){return this.data.stats.alert},alerts(){return(this.stats||[]).map((e=>{const t={};if(t.name=e[3],t.level=e[2],t.begin=1e3*e[0],t.end=1e3*e[1],t.ongoing=-1==e[1],t.min=e[6],t.mean=e[5],t.max=e[4],!t.ongoing){const e=t.end-t.begin,n=parseInt(e/1e3%60),r=parseInt(e/6e4%60),i=parseInt(e/36e5%24);t.duration=(0,Kl.padStart)(i,2,"0")+":"+(0,Kl.padStart)(r,2,"0")+":"+(0,Kl.padStart)(n,2,"0")}return t}))},hasAlerts(){return this.countAlerts>0},countAlerts(){return this.alerts.length},hasOngoingAlerts(){return this.countOngoingAlerts>0},countOngoingAlerts(){return this.alerts.filter((({ongoing:e})=>e)).length}},watch:{countOngoingAlerts(){this.countOngoingAlerts?Oo.badge(this.countOngoingAlerts):Oo.reset()}},methods:{formatDate:e=>new Date(e).toISOString().slice(0,19).replace(/[^\d-:]/," ")}},Ql=(0,Ul.Z)(Xl,[["render",function(e,t,n,r,i,s){return Jr(),ri("div",zl,[ui("section",$l,[s.hasAlerts?(Jr(),ri("span",Hl," Warning or critical alerts (last "+E(s.countAlerts)+" entries) ",1)):(Jr(),ri("span",Vl,"No warning or critical alert detected"))]),ui("section",Gl,[ui("div",Wl,[(Jr(!0),ri(Gr,null,cr(s.alerts,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Zl,[hi(E(s.formatDate(t.begin))+" ("+E(t.ongoing?"ongoing":t.duration)+") - ",1),nr(ui("span",null,E(t.level)+" on ",513),[[ws,!t.ongoing]]),ui("span",{class:C(t.level.toLowerCase())},E(t.name),3),hi(" ("+E(e.$filters.number(t.max,1))+") ",1)])])))),128))])])])}]]),Jl={key:0,id:"cloud",class:"plugin"},Yl={class:"title"};const ec={props:{data:{type:Object}},computed:{stats(){return this.data.stats.cloud},provider(){return void 0!==this.stats["ami-id"]?"AWS EC2":null},instance(){const{stats:e}=this;return void 0!==this.stats["ami-id"]?`${e["instance-type"]} instance ${e["instance-id"]} (${e.reggion})`:null}}},tc=(0,Ul.Z)(ec,[["render",function(e,t,n,r,i,s){return s.instance||s.provider?(Jr(),ri("section",Jl,[ui("span",Yl,E(s.provider),1),hi(" "+E(s.instance),1)])):mi("v-if",!0)}]]),nc={class:"plugin",id:"connections"},rc=ui("div",{class:"table-row"},[ui("div",{class:"table-cell text-left title"},"TCP CONNECTIONS"),ui("div",{class:"table-cell"})],-1),ic={class:"table-row"},sc=ui("div",{class:"table-cell text-left"},"Listen",-1),oc=ui("div",{class:"table-cell"},null,-1),ac={class:"table-cell"},lc={class:"table-row"},cc=ui("div",{class:"table-cell text-left"},"Initiated",-1),uc=ui("div",{class:"table-cell"},null,-1),dc={class:"table-cell"},fc={class:"table-row"},pc=ui("div",{class:"table-cell text-left"},"Established",-1),hc=ui("div",{class:"table-cell"},null,-1),gc={class:"table-cell"},mc={class:"table-row"},bc=ui("div",{class:"table-cell text-left"},"Terminated",-1),vc=ui("div",{class:"table-cell"},null,-1),yc={class:"table-cell"},wc={class:"table-row"},xc=ui("div",{class:"table-cell text-left"},"Tracked",-1),_c=ui("div",{class:"table-cell"},null,-1);const kc={props:{data:{type:Object}},computed:{stats(){return this.data.stats.connections},view(){return this.data.views.connections},listen(){return this.stats.LISTEN},initiated(){return this.stats.initiated},established(){return this.stats.ESTABLISHED},terminated(){return this.stats.terminated},tracked(){return{count:this.stats.nf_conntrack_count,max:this.stats.nf_conntrack_max}}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},Cc=(0,Ul.Z)(kc,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",nc,[rc,ui("div",ic,[sc,oc,ui("div",ac,E(s.listen),1)]),ui("div",lc,[cc,uc,ui("div",dc,E(s.initiated),1)]),ui("div",fc,[pc,hc,ui("div",gc,E(s.established),1)]),ui("div",mc,[bc,vc,ui("div",yc,E(s.terminated),1)]),ui("div",wc,[xc,_c,ui("div",{class:C(["table-cell",s.getDecoration("nf_conntrack_percent")])},E(s.tracked.count)+"/"+E(s.tracked.max),3)])])}]]),Tc={id:"cpu",class:"plugin"},Sc={class:"row"},Ac={class:"col-sm-24 col-md-12 col-lg-8"},Ec={class:"table"},Oc={class:"table-row"},Ic=ui("div",{class:"table-cell text-left title"},"CPU",-1),Lc={class:"table-cell"},Pc={class:"table-row"},Nc=ui("div",{class:"table-cell text-left"},"user:",-1),Dc={class:"table-row"},Mc=ui("div",{class:"table-cell text-left"},"system:",-1),jc={class:"table-row"},Rc=ui("div",{class:"table-cell text-left"},"iowait:",-1),qc={class:"table-row"},Bc=ui("div",{class:"table-cell text-left"},"dpc:",-1),Uc={class:"hidden-xs hidden-sm col-md-12 col-lg-8"},Fc={class:"table"},zc={class:"table-row"},$c=ui("div",{class:"table-cell text-left"},"idle:",-1),Hc={class:"table-cell"},Vc={class:"table-row"},Gc=ui("div",{class:"table-cell text-left"},"irq:",-1),Wc={class:"table-cell"},Zc={class:"table-row"},Kc=ui("div",{class:"table-cell text-left"},"inter:",-1),Xc={class:"table-cell"},Qc={class:"table-row"},Jc=ui("div",{class:"table-cell text-left"},"nice:",-1),Yc={class:"table-cell"},eu={key:0,class:"table-row"},tu=ui("div",{class:"table-cell text-left"},"ctx_sw:",-1),nu={class:"table-row"},ru=ui("div",{class:"table-cell text-left"},"steal:",-1),iu={key:1,class:"table-row"},su=ui("div",{class:"table-cell text-left"},"syscal:",-1),ou={class:"table-cell"},au={class:"hidden-xs hidden-sm hidden-md col-lg-8"},lu={class:"table"},cu={key:0,class:"table-row"},uu=ui("div",{class:"table-cell text-left"},"ctx_sw:",-1),du={key:1,class:"table-row"},fu=ui("div",{class:"table-cell text-left"},"inter:",-1),pu={class:"table-cell"},hu={key:2,class:"table-row"},gu=ui("div",{class:"table-cell text-left"},"sw_int:",-1),mu={class:"table-cell"};const bu={props:{data:{type:Object}},computed:{stats(){return this.data.stats.cpu},view(){return this.data.views.cpu},isLinux(){return this.data.isLinux},isSunOS(){return this.data.isSunOS},isWindows(){return this.data.isWindows},total(){return this.stats.total},user(){return this.stats.user},system(){return this.stats.system},idle(){return this.stats.idle},nice(){return this.stats.nice},irq(){return this.stats.irq},iowait(){return this.stats.iowait},dpc(){return this.stats.dpc},steal(){return this.stats.steal},ctx_switches(){const{stats:e}=this;return e.ctx_switches?Math.floor(e.ctx_switches/e.time_since_update):null},interrupts(){const{stats:e}=this;return e.interrupts?Math.floor(e.interrupts/e.time_since_update):null},soft_interrupts(){const{stats:e}=this;return e.soft_interrupts?Math.floor(e.soft_interrupts/e.time_since_update):null},syscalls(){const{stats:e}=this;return e.syscalls?Math.floor(e.syscalls/e.time_since_update):null}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},vu=(0,Ul.Z)(bu,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Tc,[ui("div",Sc,[ui("div",Ac,[ui("div",Ec,[ui("div",Oc,[Ic,ui("div",Lc,E(s.total)+"%",1)]),ui("div",Pc,[Nc,ui("div",{class:C(["table-cell",s.getDecoration("user")])},E(s.user)+"%",3)]),ui("div",Dc,[Mc,ui("div",{class:C(["table-cell",s.getDecoration("system")])},E(s.system)+"%",3)]),nr(ui("div",jc,[Rc,ui("div",{class:C(["table-cell",s.getDecoration("iowait")])},E(s.iowait)+"%",3)],512),[[ws,null!=s.iowait]]),nr(ui("div",qc,[Bc,ui("div",{class:C(["table-cell",s.getDecoration("dpc")])},E(s.dpc)+"%",3)],512),[[ws,null==s.iowait&&null!=s.dpc]])])]),ui("div",Uc,[ui("div",Fc,[ui("div",zc,[$c,ui("div",Hc,E(s.idle)+"%",1)]),nr(ui("div",Vc,[Gc,ui("div",Wc,E(s.irq)+"%",1)],512),[[ws,null!=s.irq]]),mi(" If no irq, display interrupts "),nr(ui("div",Zc,[Kc,ui("div",Xc,E(s.interrupts),1)],512),[[ws,null==s.irq]]),nr(ui("div",Qc,[Jc,ui("div",Yc,E(s.nice)+"%",1)],512),[[ws,null!=s.nice]]),mi(" If no nice, display ctx_switches "),null==s.nice&&s.ctx_switches?(Jr(),ri("div",eu,[tu,ui("div",{class:C(["table-cell",s.getDecoration("ctx_switches")])},E(s.ctx_switches),3)])):mi("v-if",!0),nr(ui("div",nu,[ru,ui("div",{class:C(["table-cell",s.getDecoration("steal")])},E(s.steal)+"%",3)],512),[[ws,null!=s.steal]]),!s.isLinux&&s.syscalls?(Jr(),ri("div",iu,[su,ui("div",ou,E(s.syscalls),1)])):mi("v-if",!0)])]),ui("div",au,[ui("div",lu,[mi(" If not already display instead of nice, then display ctx_switches "),null!=s.nice&&s.ctx_switches?(Jr(),ri("div",cu,[uu,ui("div",{class:C(["table-cell",s.getDecoration("ctx_switches")])},E(s.ctx_switches),3)])):mi("v-if",!0),mi(" If not already display instead of irq, then display interrupts "),null!=s.irq&&s.interrupts?(Jr(),ri("div",du,[fu,ui("div",pu,E(s.interrupts),1)])):mi("v-if",!0),s.isWindows||s.isSunOS||!s.soft_interrupts?mi("v-if",!0):(Jr(),ri("div",hu,[gu,ui("div",mu,E(s.soft_interrupts),1)]))])])])])}]]),yu={class:"plugin",id:"diskio"},wu={key:0,class:"table-row"},xu=ui("div",{class:"table-cell text-left title"},"DISK I/O",-1),_u={class:"table-cell"},ku={class:"table-cell"},Cu={class:"table-cell"},Tu={class:"table-cell"},Su={class:"table-cell text-left"};var Au=n(1036),Eu=n.n(Au);function Ou(e,t){return Iu(e=8*Math.round(e),t)+"b"}function Iu(e,t){if(t=t||!1,isNaN(parseFloat(e))||!isFinite(e)||0==e)return e;const n=["Y","Z","E","P","T","G","M","K"],r={Y:12089258196146292e8,Z:11805916207174113e5,E:0x1000000000000000,P:0x4000000000000,T:1099511627776,G:1073741824,M:1048576,K:1024};for(var i=0;i1){var a=0;return o<10?a=2:o<100&&(a=1),t?a="MK"==s?0:(0,Kl.min)([1,a]):"K"==s&&(a=0),parseFloat(o).toFixed(a)+s}}return e.toFixed(0)}function Lu(e){return void 0===e||""===e?"?":e}function Pu(e,t,n){return t=t||0,n=n||" ",String(e).padStart(t,n)}function Nu(e,t){return"function"!=typeof e.slice&&(e=String(e)),e.slice(0,t)}function Du(e,t){return t=t||8,e.length>t?"_"+e.substring(e.length-t+1):e}function Mu(e){if(void 0===e)return e;var t=function(e){var t=document.createElement("div");return t.innerText=e,t.innerHTML}(e),n=t.replace(/\n/g,"
");return Eu()(n)}function ju(e,t){return new Intl.NumberFormat(void 0,"number"==typeof t?{maximumFractionDigits:t}:t).format(e)}function Ru(e){for(var t=0,n=0;n({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.diskio},disks(){const e=this.stats.map((e=>{const t=e.time_since_update;return{name:e.disk_name,bitrate:{txps:Iu(e.read_bytes/t),rxps:Iu(e.write_bytes/t)},count:{txps:Iu(e.read_count/t),rxps:Iu(e.write_count/t)},alias:void 0!==e.alias?e.alias:null}}));return(0,Kl.orderBy)(e,["name"])}}},Uu=(0,Ul.Z)(Bu,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",yu,[s.disks.length>0?(Jr(),ri("div",wu,[xu,nr(ui("div",_u,"R/s",512),[[ws,!s.args.diskio_iops]]),nr(ui("div",ku,"W/s",512),[[ws,!s.args.diskio_iops]]),nr(ui("div",Cu,"IOR/s",512),[[ws,s.args.diskio_iops]]),nr(ui("div",Tu,"IOW/s",512),[[ws,s.args.diskio_iops]])])):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.disks,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Su,E(e.$filters.minSize(t.alias?t.alias:t.name,32)),1),nr(ui("div",{class:"table-cell"},E(t.bitrate.txps),513),[[ws,!s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.bitrate.rxps),513),[[ws,!s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.count.txps),513),[[ws,s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.count.rxps),513),[[ws,s.args.diskio_iops]])])))),128))])}]]),Fu={key:0,id:"containers-plugin",class:"plugin"},zu=ui("span",{class:"title"},"CONTAINERS",-1),$u={class:"table"},Hu={class:"table-row"},Vu=ui("div",{class:"table-cell"},"Status",-1),Gu=ui("div",{class:"table-cell"},"Uptime",-1),Wu=gi('
/MAX
IOR/s
IOW/s
RX/s
TX/s
Command
',6),Zu={class:"table-cell text-left"},Ku={class:"table-cell"},Xu={class:"table-cell"},Qu={class:"table-cell"},Ju={class:"table-cell"},Yu={class:"table-cell"},ed={class:"table-cell"},td={class:"table-cell"},nd={class:"table-cell text-left"};const rd={props:{data:{type:Object}},data:()=>({store:Co,sorter:void 0}),computed:{args(){return this.store.args||{}},sortProcessesKey(){return this.args.sort_processes_key},stats(){return this.data.stats.docker},containers(){const{sorter:e}=this,t=(this.stats.containers||[]).map((e=>({id:e.Id,name:e.name,status:e.Status,uptime:e.Uptime,cpu_percent:e.cpu.total,memory_usage:null!=e.memory.usage?e.memory.usage:"?",limit:null!=e.memory.limit?e.memory.limit:"?",ior:null!=e.io.ior?e.io.ior:"?",iow:null!=e.io.iow?e.io.iow:"?",io_time_since_update:e.io.time_since_update,rx:null!=e.network.rx?e.network.rx:"?",tx:null!=e.network.tx?e.network.tx:"?",net_time_since_update:e.network.time_since_update,command:e.Command.join(" "),image:e.Image})));return(0,Kl.orderBy)(t,[e.column].reduce(((e,t)=>("memory_percent"===t&&(t=["memory_usage"]),e.concat(t))),[]),[e.isReverseColumn(e.column)?"desc":"asc"])}},watch:{sortProcessesKey:{immediate:!0,handler(e){e&&!["cpu_percent","memory_percent","name"].includes(e)||(this.sorter={column:this.args.sort_processes_key||"cpu_percent",auto:!this.args.sort_processes_key,isReverseColumn:function(e){return!["name"].includes(e)},getColumnLabel:function(e){return{io_counters:"disk IO",cpu_percent:"CPU consumption",memory_usage:"memory consumption",cpu_times:"uptime",name:"container name",None:"None"}[e]||e}})}}}},id=(0,Ul.Z)(rd,[["render",function(e,t,n,r,i,s){return s.containers.length?(Jr(),ri("section",Fu,[zu,hi(" "+E(s.containers.length)+" sorted by "+E(i.sorter.getColumnLabel(i.sorter.column))+" ",1),ui("div",$u,[ui("div",Hu,[ui("div",{class:C(["table-cell text-left",["sortable","name"===i.sorter.column&&"sort"]]),onClick:t[0]||(t[0]=e=>s.args.sort_processes_key="name")}," Name ",2),Vu,Gu,ui("div",{class:C(["table-cell",["sortable","cpu_percent"===i.sorter.column&&"sort"]]),onClick:t[1]||(t[1]=e=>s.args.sort_processes_key="cpu_percent")}," CPU% ",2),ui("div",{class:C(["table-cell",["sortable","memory_percent"===i.sorter.column&&"sort"]]),onClick:t[2]||(t[2]=e=>s.args.sort_processes_key="memory_percent")}," MEM ",2),Wu]),(Jr(!0),ri(Gr,null,cr(s.containers,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Zu,E(t.name),1),ui("div",{class:C(["table-cell","Paused"==t.status?"careful":"ok"])},E(t.status),3),ui("div",{class:C(["table-cell","Paused"==t.status?"careful":"ok"])},E(t.uptime),3),ui("div",Ku,E(e.$filters.number(t.cpu_percent,1)),1),ui("div",Xu,E(e.$filters.bytes(t.memory_usage)),1),ui("div",Qu,E(e.$filters.bytes(t.limit)),1),ui("div",Ju,E(e.$filters.bits(t.ior/t.io_time_since_update)),1),ui("div",Yu,E(e.$filters.bits(t.iow/t.io_time_since_update)),1),ui("div",ed,E(e.$filters.bits(t.rx/t.net_time_since_update)),1),ui("div",td,E(e.$filters.bits(t.tx/t.net_time_since_update)),1),ui("div",nd,E(t.command),1)])))),128))])])):mi("v-if",!0)}]]),sd={class:"plugin",id:"folders"},od={key:0,class:"table-row"},ad=[ui("div",{class:"table-cell text-left title"},"FOLDERS",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"Size",-1)],ld={class:"table-cell text-left"},cd=ui("div",{class:"table-cell"},null,-1);const ud={props:{data:{type:Object}},computed:{stats(){return this.data.stats.folders},folders(){return this.stats.map((e=>({path:e.path,size:e.size,careful:e.careful,warning:e.warning,critical:e.critical})))}},methods:{getDecoration(e){if(Number.isInteger(e.size))return null!==e.critical&&e.size>1e6*e.critical?"critical":null!==e.warning&&e.size>1e6*e.warning?"warning":null!==e.careful&&e.size>1e6*e.careful?"careful":"ok"}}},dd=(0,Ul.Z)(ud,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",sd,[s.folders.length>0?(Jr(),ri("div",od,ad)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.folders,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",ld,E(t.path),1),cd,ui("div",{class:C(["table-cell",s.getDecoration(t)])},E(e.$filters.bytes(t.size)),3)])))),128))])}]]),fd={class:"plugin",id:"fs"},pd={class:"table-row"},hd=ui("div",{class:"table-cell text-left title"},"FILE SYS",-1),gd={class:"table-cell"},md=ui("div",{class:"table-cell"},"Total",-1),bd={class:"table-cell text-left"},vd={key:0,class:"visible-lg-inline"},yd={class:"table-cell"};const wd={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.fs},view(){return this.data.views.fs},fileSystems(){const e=this.stats.map((e=>{let t=e.mnt_point;return t.length>22&&(t="_"+e.mnt_point.slice(-21)),{name:e.device_name,mountPoint:e.mnt_point,shortMountPoint:t,percent:e.percent,size:e.size,used:e.used,free:e.free}}));return(0,Kl.orderBy)(e,["mnt_point"])}},methods:{getDecoration(e,t){if(null!=this.view[e][t])return this.view[e][t].decoration.toLowerCase()}}},xd=(0,Ul.Z)(wd,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",fd,[ui("div",pd,[hd,ui("div",gd,[nr(ui("span",null,"Used",512),[[ws,!s.args.fs_free_space]]),nr(ui("span",null,"Free",512),[[ws,s.args.fs_free_space]])]),md]),(Jr(!0),ri(Gr,null,cr(s.fileSystems,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",bd,[hi(E(t.shortMountPoint)+" ",1),t.shortMountPoint.length<=12?(Jr(),ri("span",vd," ("+E(t.name)+") ",1)):mi("v-if",!0)]),ui("div",{class:C(["table-cell",s.getDecoration(t.mountPoint,"used")])},[nr(ui("span",null,E(e.$filters.bytes(t.used)),513),[[ws,!s.args.fs_free_space]]),nr(ui("span",null,E(e.$filters.bytes(t.free)),513),[[ws,s.args.fs_free_space]])],2),ui("div",yd,E(e.$filters.bytes(t.size)),1)])))),128))])}]]),_d={id:"gpu",class:"plugin"},kd={class:"gpu-name title"},Cd={class:"table"},Td={key:0,class:"table-row"},Sd=ui("div",{class:"table-cell text-left"},"proc:",-1),Ad={key:1,class:"table-cell"},Ed={key:1,class:"table-row"},Od=ui("div",{class:"table-cell text-left"},"mem:",-1),Id={key:1,class:"table-cell"},Ld={key:2,class:"table-row"},Pd=ui("div",{class:"table-cell text-left"},"temperature::",-1),Nd={key:1,class:"table-cell"},Dd={class:"table-cell text-left"},Md={key:1},jd={key:3},Rd={key:5};const qd={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.gpu},view(){return this.data.views.gpu},gpus(){return this.stats},name(){let e="GPU";const{stats:t}=this;return 1===t.length?e=t[0].name:t.length&&(e=`${t.length} GPU ${t[0].name}`),e},mean(){const e={proc:null,mem:null,temperature:null},{stats:t}=this;if(!t.length)return e;for(let n of t)e.proc+=n.proc,e.mem+=n.mem,e.temperature+=n.temperature;return e.proc=e.proc/t.length,e.mem=e.mem/t.length,e.temperature=e.temperature/t.length,e}},methods:{getDecoration(e,t){if(void 0!==this.view[e][t])return this.view[e][t].decoration.toLowerCase()},getMeanDecoration(e){return this.getDecoration(0,e)}}},Bd=(0,Ul.Z)(qd,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",_d,[ui("div",kd,E(s.name),1),ui("div",Cd,[s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Td,[Sd,null!=s.mean.proc?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("proc")])},E(e.$filters.number(s.mean.proc,0))+"% ",3)):mi("v-if",!0),null==s.mean.proc?(Jr(),ri("div",Ad,"N/A")):mi("v-if",!0)])):mi("v-if",!0),s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Ed,[Od,null!=s.mean.mem?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("mem")])},E(e.$filters.number(s.mean.mem,0))+"% ",3)):mi("v-if",!0),null==s.mean.mem?(Jr(),ri("div",Id,"N/A")):mi("v-if",!0)])):mi("v-if",!0),s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Ld,[Pd,null!=s.mean.temperature?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("temperature")])},E(e.$filters.number(s.mean.temperature,0))+"° ",3)):mi("v-if",!0),null==s.mean.temperature?(Jr(),ri("div",Nd,"N/A")):mi("v-if",!0)])):mi("v-if",!0),!s.args.meangpu&&s.gpus.length>1?(Jr(!0),ri(Gr,{key:3},cr(s.gpus,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Dd,[hi(E(t.gpu_id)+": ",1),null!=t.proc?(Jr(),ri("span",{key:0,class:C(s.getDecoration(t.gpu_id,"proc"))},E(e.$filters.number(t.proc,0))+"% ",3)):mi("v-if",!0),null==t.proc?(Jr(),ri("span",Md,"N/A")):mi("v-if",!0),hi(" mem: "),null!=t.mem?(Jr(),ri("span",{key:2,class:C(s.getDecoration(t.gpu_id,"mem"))},E(e.$filters.number(t.mem,0))+"% ",3)):mi("v-if",!0),null==t.mem?(Jr(),ri("span",jd,"N/A")):mi("v-if",!0),hi(" temp: "),null!=t.temperature?(Jr(),ri("span",{key:4,class:C(s.getDecoration(t.gpu_id,"temperature"))},E(e.$filters.number(t.temperature,0))+"C ",3)):mi("v-if",!0),null==t.temperature?(Jr(),ri("span",Rd,"N/A")):mi("v-if",!0)])])))),128)):mi("v-if",!0)])])}]]),Ud={key:0,class:"plugin",id:"ip"},Fd={key:0,class:"title"},zd={key:1},$d={key:2,class:"title"},Hd={key:3},Vd={key:4};const Gd={props:{data:{type:Object}},computed:{ipStats(){return this.data.stats.ip},address(){return this.ipStats.address},gateway(){return this.ipStats.gateway},maskCdir(){return this.ipStats.mask_cidr},publicAddress(){return this.ipStats.public_address},publicInfo(){return this.ipStats.public_info_human}}},Wd=(0,Ul.Z)(Gd,[["render",function(e,t,n,r,i,s){return null!=s.address?(Jr(),ri("section",Ud,[null!=s.address?(Jr(),ri("span",Fd,"IP")):mi("v-if",!0),null!=s.address?(Jr(),ri("span",zd,E(s.address)+"/"+E(s.maskCdir),1)):mi("v-if",!0),null!=s.publicAddress?(Jr(),ri("span",$d,"Pub")):mi("v-if",!0),null!=s.publicAddress?(Jr(),ri("span",Hd,E(s.publicAddress),1)):mi("v-if",!0),null!=s.publicInfo?(Jr(),ri("span",Vd,E(s.publicInfo),1)):mi("v-if",!0)])):mi("v-if",!0)}]]),Zd={class:"plugin",id:"irq"},Kd={key:0,class:"table-row"},Xd=[ui("div",{class:"table-cell text-left title"},"IRQ",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"Rate/s",-1)],Qd={class:"table-cell text-left"},Jd=ui("div",{class:"table-cell"},null,-1),Yd={class:"table-cell"};const ef={props:{data:{type:Object}},computed:{stats(){return this.data.stats.irq},irqs(){return this.stats.map((e=>({irq_line:e.irq_line,irq_rate:e.irq_rate})))}}},tf=(0,Ul.Z)(ef,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Zd,[s.irqs.length>0?(Jr(),ri("div",Kd,Xd)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.irqs,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",Qd,E(e.irq_line),1),Jd,ui("div",Yd,[ui("span",null,E(e.irq_rate),1)])])))),128))])}]]),nf={key:0,id:"load",class:"plugin"},rf={class:"table"},sf={class:"table-row"},of=ui("div",{class:"table-cell text-left title"},"LOAD",-1),af={class:"table-cell"},lf={class:"table-row"},cf=ui("div",{class:"table-cell text-left"},"1 min:",-1),uf={class:"table-cell"},df={class:"table-row"},ff=ui("div",{class:"table-cell text-left"},"5 min:",-1),pf={class:"table-row"},hf=ui("div",{class:"table-cell text-left"},"15 min:",-1);const gf={props:{data:{type:Object}},computed:{stats(){return this.data.stats.load},view(){return this.data.views.load},cpucore(){return this.stats.cpucore},min1(){return this.stats.min1},min5(){return this.stats.min5},min15(){return this.stats.min15}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},mf=(0,Ul.Z)(gf,[["render",function(e,t,n,r,i,s){return null!=s.cpucore?(Jr(),ri("section",nf,[ui("div",rf,[ui("div",sf,[of,ui("div",af,E(s.cpucore)+"-core",1)]),ui("div",lf,[cf,ui("div",uf,E(e.$filters.number(s.min1,2)),1)]),ui("div",df,[ff,ui("div",{class:C(["table-cell",s.getDecoration("min5")])},E(e.$filters.number(s.min5,2)),3)]),ui("div",pf,[hf,ui("div",{class:C(["table-cell",s.getDecoration("min15")])},E(e.$filters.number(s.min15,2)),3)])])])):mi("v-if",!0)}]]),bf={id:"mem",class:"plugin"},vf={class:"table"},yf={class:"table-row"},wf=ui("div",{class:"table-cell text-left title"},"MEM",-1),xf={class:"table-cell"},_f={class:"table-row"},kf=ui("div",{class:"table-cell text-left"},"total:",-1),Cf={class:"table-cell"},Tf={class:"table-row"},Sf=ui("div",{class:"table-cell text-left"},"used:",-1),Af={class:"table-row"},Ef=ui("div",{class:"table-cell text-left"},"free:",-1),Of={class:"table-cell"};const If={props:{data:{type:Object}},computed:{stats(){return this.data.stats.mem},view(){return this.data.views.mem},percent(){return this.stats.percent},total(){return this.stats.total},used(){return this.stats.used},free(){return this.stats.free}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},Lf=(0,Ul.Z)(If,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",bf,[ui("div",vf,[ui("div",yf,[wf,ui("div",xf,E(s.percent)+"%",1)]),ui("div",_f,[kf,ui("div",Cf,E(e.$filters.bytes(s.total)),1)]),ui("div",Tf,[Sf,ui("div",{class:C(["table-cell",s.getDecoration("used")])},E(e.$filters.bytes(s.used,2)),3)]),ui("div",Af,[Ef,ui("div",Of,E(e.$filters.bytes(s.free)),1)])])])}]]),Pf={id:"mem-more",class:"plugin"},Nf={class:"table"},Df={class:"table-row"},Mf=ui("div",{class:"table-cell text-left"},"active:",-1),jf={class:"table-cell"},Rf={class:"table-row"},qf=ui("div",{class:"table-cell text-left"},"inactive:",-1),Bf={class:"table-cell"},Uf={class:"table-row"},Ff=ui("div",{class:"table-cell text-left"},"buffers:",-1),zf={class:"table-cell"},$f={class:"table-row"},Hf=ui("div",{class:"table-cell text-left"},"cached:",-1),Vf={class:"table-cell"};const Gf={props:{data:{type:Object}},computed:{stats(){return this.data.stats.mem},active(){return this.stats.active},inactive(){return this.stats.inactive},buffers(){return this.stats.buffers},cached(){return this.stats.cached}}},Wf=(0,Ul.Z)(Gf,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Pf,[ui("div",Nf,[nr(ui("div",Df,[Mf,ui("div",jf,E(e.$filters.bytes(s.active)),1)],512),[[ws,null!=s.active]]),nr(ui("div",Rf,[qf,ui("div",Bf,E(e.$filters.bytes(s.inactive)),1)],512),[[ws,null!=s.inactive]]),nr(ui("div",Uf,[Ff,ui("div",zf,E(e.$filters.bytes(s.buffers)),1)],512),[[ws,null!=s.buffers]]),nr(ui("div",$f,[Hf,ui("div",Vf,E(e.$filters.bytes(s.cached)),1)],512),[[ws,null!=s.cached]])])])}]]),Zf={id:"memswap",class:"plugin"},Kf={class:"table"},Xf={class:"table-row"},Qf=ui("div",{class:"table-cell text-left title"},"SWAP",-1),Jf={class:"table-cell"},Yf={class:"table-row"},ep=ui("div",{class:"table-cell text-left"},"total:",-1),tp={class:"table-cell"},np={class:"table-row"},rp=ui("div",{class:"table-cell text-left"},"used:",-1),ip={class:"table-row"},sp=ui("div",{class:"table-cell text-left"},"free:",-1),op={class:"table-cell"};const ap={props:{data:{type:Object}},computed:{stats(){return this.data.stats.memswap},view(){return this.data.views.memswap},percent(){return this.stats.percent},total(){return this.stats.total},used(){return this.stats.used},free(){return this.stats.free}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},lp=(0,Ul.Z)(ap,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Zf,[ui("div",Kf,[ui("div",Xf,[Qf,ui("div",Jf,E(s.percent)+"%",1)]),ui("div",Yf,[ep,ui("div",tp,E(e.$filters.bytes(s.total)),1)]),ui("div",np,[rp,ui("div",{class:C(["table-cell",s.getDecoration("used")])},E(e.$filters.bytes(s.used)),3)]),ui("div",ip,[sp,ui("div",op,E(e.$filters.bytes(s.free)),1)])])])}]]),cp={class:"plugin",id:"network"},up={class:"table-row"},dp=ui("div",{class:"table-cell text-left title"},"NETWORK",-1),fp={class:"table-cell"},pp={class:"table-cell"},hp={class:"table-cell"},gp={class:"table-cell"},mp={class:"table-cell"},bp={class:"table-cell"},vp={class:"table-cell"},yp={class:"table-cell"},wp={class:"table-cell text-left"},xp={class:"visible-lg-inline"},_p={class:"hidden-lg"},kp={class:"table-cell"},Cp={class:"table-cell"};const Tp={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.network},networks(){const e=this.stats.map((e=>{const t=void 0!==e.alias?e.alias:null;return{interfaceName:e.interface_name,ifname:t||e.interface_name,rx:e.rx,tx:e.tx,cx:e.cx,time_since_update:e.time_since_update,cumulativeRx:e.cumulative_rx,cumulativeTx:e.cumulative_tx,cumulativeCx:e.cumulative_cx}}));return(0,Kl.orderBy)(e,["interfaceName"])}}},Sp=(0,Ul.Z)(Tp,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",cp,[ui("div",up,[dp,nr(ui("div",fp,"Rx/s",512),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",pp,"Tx/s",512),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",hp,null,512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",gp,"Rx+Tx/s",512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",mp,"Rx",512),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",bp,"Tx",512),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",vp,null,512),[[ws,s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",yp,"Rx+Tx",512),[[ws,s.args.network_cumul&&s.args.network_sum]])]),(Jr(!0),ri(Gr,null,cr(s.networks,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",wp,[ui("span",xp,E(t.ifname),1),ui("span",_p,E(e.$filters.minSize(t.ifname)),1)]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.rx/t.time_since_update):e.$filters.bits(t.rx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.tx/t.time_since_update):e.$filters.bits(t.tx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",kp,null,512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cx/t.time_since_update):e.$filters.bits(t.cx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeRx):e.$filters.bits(t.cumulativeRx)),513),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeTx):e.$filters.bits(t.cumulativeTx)),513),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",Cp,null,512),[[ws,s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeCx):e.$filters.bits(t.cumulativeCx)),513),[[ws,s.args.network_cumul&&s.args.network_sum]])])))),128))])}]]),Ap={id:"now",class:"plugin"};const Ep={props:{data:{type:Object}},computed:{value(){return this.data.stats.now}}},Op=(0,Ul.Z)(Ep,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Ap,[ui("span",null,E(s.value),1)])}]]),Ip={id:"percpu",class:"plugin"},Lp={class:"table-row"},Pp={class:"table-cell text-left title"},Np={key:0},Dp={class:"table-row"},Mp=ui("div",{class:"table-cell text-left"},"user:",-1),jp={class:"table-row"},Rp=ui("div",{class:"table-cell text-left"},"system:",-1),qp={class:"table-row"},Bp=ui("div",{class:"table-cell text-left"},"idle:",-1),Up={key:0,class:"table-row"},Fp=ui("div",{class:"table-cell text-left"},"iowait:",-1),zp={key:1,class:"table-row"},$p=ui("div",{class:"table-cell text-left"},"steal:",-1);const Hp={props:{data:{type:Object}},computed:{percpuStats(){return this.data.stats.percpu},cpusChunks(){const e=this.percpuStats.map((e=>({number:e.cpu_number,total:e.total,user:e.user,system:e.system,idle:e.idle,iowait:e.iowait,steal:e.steal})));return(0,Kl.chunk)(e,4)}},methods:{getUserAlert:e=>Ao.getAlert("percpu","percpu_user_",e.user),getSystemAlert:e=>Ao.getAlert("percpu","percpu_system_",e.system)}},Vp=(0,Ul.Z)(Hp,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Ip,[(Jr(!0),ri(Gr,null,cr(s.cpusChunks,((e,t)=>(Jr(),ri("div",{class:"table",key:t},[ui("div",Lp,[ui("div",Pp,[0===t?(Jr(),ri("span",Np,"PER CPU")):mi("v-if",!0)]),(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:"table-cell",key:t},E(e.total)+"% ",1)))),128))]),ui("div",Dp,[Mp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getUserAlert(e)]),key:t},E(e.user)+"% ",3)))),128))]),ui("div",jp,[Rp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.system)+"% ",3)))),128))]),ui("div",qp,[Bp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:"table-cell",key:t},E(e.idle)+"% ",1)))),128))]),e[0].iowait?(Jr(),ri("div",Up,[Fp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.iowait)+"% ",3)))),128))])):mi("v-if",!0),e[0].steal?(Jr(),ri("div",zp,[$p,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.steal)+"% ",3)))),128))])):mi("v-if",!0)])))),128))])}]]),Gp={class:"plugin",id:"ports"},Wp={class:"table-cell text-left"},Zp=ui("div",{class:"table-cell"},null,-1),Kp={key:0},Xp={key:1},Qp={key:2},Jp={key:3},Yp={key:0},eh={key:1},th={key:2};const nh={props:{data:{type:Object}},computed:{stats(){return this.data.stats.ports},ports(){return this.stats}},methods:{getPortDecoration:e=>null===e.status?"careful":!1===e.status?"critical":null!==e.rtt_warning&&e.status>e.rtt_warning?"warning":"ok",getWebDecoration:e=>null===e.status?"careful":-1===[200,301,302].indexOf(e.status)?"critical":null!==e.rtt_warning&&e.elapsed>e.rtt_warning?"warning":"ok"}},rh=(0,Ul.Z)(nh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Gp,[(Jr(!0),ri(Gr,null,cr(s.ports,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Wp,[mi(" prettier-ignore "),hi(" "+E(e.$filters.minSize(t.description?t.description:t.host+" "+t.port,20)),1)]),Zp,t.host?(Jr(),ri("div",{key:0,class:C([s.getPortDecoration(t),"table-cell"])},["null"==t.status?(Jr(),ri("span",Kp,"Scanning")):"false"==t.status?(Jr(),ri("span",Xp,"Timeout")):"true"==t.status?(Jr(),ri("span",Qp,"Open")):(Jr(),ri("span",Jp,E(e.$filters.number(1e3*t.status,0))+"ms",1))],2)):mi("v-if",!0),t.url?(Jr(),ri("div",{key:1,class:C([s.getWebDecoration(t),"table-cell"])},["null"==t.status?(Jr(),ri("span",Yp,"Scanning")):"Error"==t.status?(Jr(),ri("span",eh,"Error")):(Jr(),ri("span",th,"Code "+E(t.status),1))],2)):mi("v-if",!0)])))),128))])}]]),ih={key:0},sh={key:1},oh={key:0,class:"row"},ah={class:"col-lg-18"};const lh={id:"amps",class:"plugin"},ch={class:"table"},uh={key:0,class:"table-cell text-left"},dh=["innerHTML"];const fh={props:{data:{type:Object}},computed:{stats(){return this.data.stats.amps},processes(){return this.stats.filter((e=>null!==e.result))}},methods:{getNameDecoration(e){const t=e.count,n=e.countmin,r=e.countmax;let i="ok";return i=t>0?(null===n||t>=n)&&(null===r||t<=r)?"ok":"careful":null===n?"ok":"critical",i}}},ph=(0,Ul.Z)(fh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",lh,[ui("div",ch,[(Jr(!0),ri(Gr,null,cr(s.processes,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",{class:C(["table-cell text-left",s.getNameDecoration(t)])},E(t.name),3),t.regex?(Jr(),ri("div",uh,E(t.count),1)):mi("v-if",!0),ui("div",{class:"table-cell text-left process-result",innerHTML:e.$filters.nl2br(t.result)},null,8,dh)])))),128))])])}]]),hh={id:"processcount",class:"plugin"},gh=ui("span",{class:"title"},"TASKS",-1),mh={class:"title"};const bh={props:{data:{type:Object},sorter:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.processcount},total(){return this.stats.total||0},running(){return this.stats.running||0},sleeping(){return this.stats.sleeping||0},stopped(){return this.stats.stopped||0},thread(){return this.stats.thread||0}}},vh=(0,Ul.Z)(bh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",hh,[gh,ui("span",null,E(s.total)+" ("+E(s.thread)+" thr),",1),ui("span",null,E(s.running)+" run,",1),ui("span",null,E(s.sleeping)+" slp,",1),ui("span",null,E(s.stopped)+" oth",1),ui("span",null,E(s.args.programs?"Programs":"Threads"),1),ui("span",mh,E(n.sorter.auto?"sorted automatically":"sorted"),1),ui("span",null,"by "+E(n.sorter.getColumnLabel(n.sorter.column)),1)])}]]),yh={id:"processlist-plugin",class:"plugin"},wh={class:"table"},xh={class:"table-row"},_h=ui("div",{class:"table-cell hidden-xs hidden-sm"},"VIRT",-1),kh=ui("div",{class:"table-cell hidden-xs hidden-sm"},"RES",-1),Ch=ui("div",{class:"table-cell"},"PID",-1),Th=ui("div",{class:"table-cell"},"NI",-1),Sh=ui("div",{class:"table-cell"},"S",-1),Ah={class:"table-cell hidden-xs hidden-sm"},Eh={class:"table-cell hidden-xs hidden-sm"},Oh={class:"table-cell"},Ih={class:"table-cell text-left"},Lh={key:0,class:"table-cell hidden-xs hidden-sm"},Ph={key:1,class:"table-cell hidden-xs hidden-sm"},Nh={class:"table-cell text-left hidden-xs hidden-sm"};const Dh={props:{data:{type:Object},sorter:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},config(){return this.store.config||{}},stats(){return this.data.stats.processlist},processes(){const{sorter:e}=this,t=this.data.stats.isWindows,n=(this.stats||[]).map((e=>(e.memvirt="?",e.memres="?",e.memory_info&&(e.memvirt=e.memory_info[1],e.memres=e.memory_info[0]),e.timeplus="?",e.timemillis="?",e.cpu_times&&(e.timeplus=qu(e.cpu_times),e.timemillis=Ru(e.cpu_times)),null===e.num_threads&&(e.num_threads=-1),null===e.cpu_percent&&(e.cpu_percent=-1),null===e.memory_percent&&(e.memory_percent=-1),e.io_read=null,e.io_write=null,e.io_counters&&(e.io_read=(e.io_counters[0]-e.io_counters[2])/e.time_since_update,e.io_write=(e.io_counters[1]-e.io_counters[3])/e.time_since_update),e.isNice=void 0!==e.nice&&(t&&32!=e.nice||!t&&0!=e.nice),Array.isArray(e.cmdline)&&(e.cmdline=e.cmdline.join(" ").replace(/\n/g," ")),null===e.cmdline&&(e.cmdline=e.name),t&&null!==e.username&&(e.username=(0,Kl.last)(e.username.split("\\"))),e)));return(0,Kl.orderBy)(n,[e.column].reduce(((e,t)=>("io_counters"===t&&(t=["io_read","io_write"]),e.concat(t))),[]),[e.isReverseColumn(e.column)?"desc":"asc"]).slice(0,this.limit)},ioReadWritePresent(){return(this.stats||[]).some((({io_counters:e})=>e))},limit(){return void 0!==this.config.outputs?this.config.outputs.max_processes_display:void 0}},methods:{getCpuPercentAlert:e=>Ao.getAlert("processlist","processlist_cpu_",e.cpu_percent),getMemoryPercentAlert:e=>Ao.getAlert("processlist","processlist_mem_",e.cpu_percent)}},Mh={components:{GlancesPluginAmps:ph,GlancesPluginProcesscount:vh,GlancesPluginProcesslist:(0,Ul.Z)(Dh,[["render",function(e,t,n,r,i,s){return Jr(),ri(Gr,null,[mi(" prettier-ignore "),ui("section",yh,[ui("div",wh,[ui("div",xh,[ui("div",{class:C(["table-cell",["sortable","cpu_percent"===n.sorter.column&&"sort"]]),onClick:t[0]||(t[0]=t=>e.$emit("update:sorter","cpu_percent"))}," CPU% ",2),ui("div",{class:C(["table-cell",["sortable","memory_percent"===n.sorter.column&&"sort"]]),onClick:t[1]||(t[1]=t=>e.$emit("update:sorter","memory_percent"))}," MEM% ",2),_h,kh,Ch,ui("div",{class:C(["table-cell text-left",["sortable","username"===n.sorter.column&&"sort"]]),onClick:t[2]||(t[2]=t=>e.$emit("update:sorter","username"))}," USER ",2),ui("div",{class:C(["table-cell hidden-xs hidden-sm",["sortable","timemillis"===n.sorter.column&&"sort"]]),onClick:t[3]||(t[3]=t=>e.$emit("update:sorter","timemillis"))}," TIME+ ",2),ui("div",{class:C(["table-cell text-left hidden-xs hidden-sm",["sortable","num_threads"===n.sorter.column&&"sort"]]),onClick:t[4]||(t[4]=t=>e.$emit("update:sorter","num_threads"))}," THR ",2),Th,Sh,nr(ui("div",{class:C(["table-cell hidden-xs hidden-sm",["sortable","io_counters"===n.sorter.column&&"sort"]]),onClick:t[5]||(t[5]=t=>e.$emit("update:sorter","io_counters"))}," IOR/s ",2),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:C(["table-cell text-left hidden-xs hidden-sm",["sortable","io_counters"===n.sorter.column&&"sort"]]),onClick:t[6]||(t[6]=t=>e.$emit("update:sorter","io_counters"))}," IOW/s ",2),[[ws,s.ioReadWritePresent]]),ui("div",{class:C(["table-cell text-left",["sortable","name"===n.sorter.column&&"sort"]]),onClick:t[7]||(t[7]=t=>e.$emit("update:sorter","name"))}," Command ",2)]),(Jr(!0),ri(Gr,null,cr(s.processes,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",{class:C(["table-cell",s.getCpuPercentAlert(t)])},E(-1==t.cpu_percent?"?":e.$filters.number(t.cpu_percent,1)),3),ui("div",{class:C(["table-cell",s.getMemoryPercentAlert(t)])},E(-1==t.memory_percent?"?":e.$filters.number(t.memory_percent,1)),3),ui("div",Ah,E(e.$filters.bytes(t.memvirt)),1),ui("div",Eh,E(e.$filters.bytes(t.memres)),1),ui("div",Oh,E(t.pid),1),ui("div",Ih,E(t.username),1),"?"!=t.timeplus?(Jr(),ri("div",Lh,[nr(ui("span",{class:"highlight"},E(t.timeplus.hours)+"h",513),[[ws,t.timeplus.hours>0]]),hi(" "+E(e.$filters.leftPad(t.timeplus.minutes,2,"0"))+":"+E(e.$filters.leftPad(t.timeplus.seconds,2,"0"))+" ",1),nr(ui("span",null,"."+E(e.$filters.leftPad(t.timeplus.milliseconds,2,"0")),513),[[ws,t.timeplus.hours<=0]])])):mi("v-if",!0),"?"==t.timeplus?(Jr(),ri("div",Ph,"?")):mi("v-if",!0),ui("div",Nh,E(-1==t.num_threads?"?":t.num_threads),1),ui("div",{class:C(["table-cell",{nice:t.isNice}])},E(e.$filters.exclamation(t.nice)),3),ui("div",{class:C(["table-cell",{status:"R"==t.status}])},E(t.status),3),nr(ui("div",{class:"table-cell hidden-xs hidden-sm"},E(e.$filters.bytes(t.io_read)),513),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:"table-cell text-left hidden-xs hidden-sm"},E(e.$filters.bytes(t.io_write)),513),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:"table-cell text-left"},E(t.name),513),[[ws,s.args.process_short_name]]),nr(ui("div",{class:"table-cell text-left"},E(t.cmdline),513),[[ws,!s.args.process_short_name]])])))),128))])])],2112)}]])},props:{data:{type:Object}},data:()=>({store:Co,sorter:void 0}),computed:{args(){return this.store.args||{}},sortProcessesKey(){return this.args.sort_processes_key}},watch:{sortProcessesKey:{immediate:!0,handler(e){e&&!["cpu_percent","memory_percent","username","timemillis","num_threads","io_counters","name"].includes(e)||(this.sorter={column:this.args.sort_processes_key||"cpu_percent",auto:!this.args.sort_processes_key,isReverseColumn:function(e){return!["username","name"].includes(e)},getColumnLabel:function(e){return{io_counters:"disk IO",cpu_percent:"CPU consumption",memory_percent:"memory consumption",cpu_times:"process time",username:"user name",name:"process name",timemillis:"process time",None:"None"}[e]||e}})}}}},jh=(0,Ul.Z)(Mh,[["render",function(e,t,n,r,i,s){const o=sr("glances-plugin-processcount"),a=sr("glances-plugin-amps"),l=sr("glances-plugin-processlist");return s.args.disable_process?(Jr(),ri("div",ih,"PROCESSES DISABLED (press 'z' to display)")):(Jr(),ri("div",sh,[di(o,{sorter:i.sorter,data:n.data},null,8,["sorter","data"]),s.args.disable_amps?mi("v-if",!0):(Jr(),ri("div",oh,[ui("div",ah,[di(a,{data:n.data},null,8,["data"])])])),di(l,{sorter:i.sorter,data:n.data,"onUpdate:sorter":t[0]||(t[0]=e=>s.args.sort_processes_key=e)},null,8,["sorter","data"])]))}]]),Rh={id:"quicklook",class:"plugin"},qh={class:"cpu-name"},Bh={class:"table"},Uh={key:0,class:"table-row"},Fh=ui("div",{class:"table-cell text-left"},"CPU",-1),zh={class:"table-cell"},$h={class:"progress"},Hh=["aria-valuenow"],Vh={class:"table-cell"},Gh={class:"table-cell text-left"},Wh={class:"table-cell"},Zh={class:"progress"},Kh=["aria-valuenow"],Xh={class:"table-cell"},Qh={class:"table-row"},Jh=ui("div",{class:"table-cell text-left"},"MEM",-1),Yh={class:"table-cell"},eg={class:"progress"},tg=["aria-valuenow"],ng={class:"table-cell"},rg={class:"table-row"},ig=ui("div",{class:"table-cell text-left"},"SWAP",-1),sg={class:"table-cell"},og={class:"progress"},ag=["aria-valuenow"],lg={class:"table-cell"};const cg={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.quicklook},view(){return this.data.views.quicklook},mem(){return this.stats.mem},cpu(){return this.stats.cpu},cpu_name(){return this.stats.cpu_name},cpu_hz_current(){return this.stats.cpu_hz_current},cpu_hz(){return this.stats.cpu_hz},swap(){return this.stats.swap},percpus(){return this.stats.percpu.map((({cpu_number:e,total:t})=>({number:e,total:t})))}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},ug=(0,Ul.Z)(cg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Rh,[ui("div",qh,E(s.cpu_name),1),ui("div",Bh,[s.args.percpu?mi("v-if",!0):(Jr(),ri("div",Uh,[Fh,ui("div",zh,[ui("div",$h,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("cpu")}`),role:"progressbar","aria-valuenow":s.cpu,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.cpu}%;`)},"   ",14,Hh)])]),ui("div",Vh,E(s.cpu)+"%",1)])),s.args.percpu?(Jr(!0),ri(Gr,{key:1},cr(s.percpus,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",Gh,"CPU"+E(e.number),1),ui("div",Wh,[ui("div",Zh,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("cpu")}`),role:"progressbar","aria-valuenow":e.total,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${e.total}%;`)},"   ",14,Kh)])]),ui("div",Xh,E(e.total)+"%",1)])))),128)):mi("v-if",!0),ui("div",Qh,[Jh,ui("div",Yh,[ui("div",eg,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("mem")}`),role:"progressbar","aria-valuenow":s.mem,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.mem}%;`)},"   ",14,tg)])]),ui("div",ng,E(s.mem)+"%",1)]),ui("div",rg,[ig,ui("div",sg,[ui("div",og,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("swap")}`),role:"progressbar","aria-valuenow":s.swap,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.swap}%;`)},"   ",14,ag)])]),ui("div",lg,E(s.swap)+"%",1)])])])}]]),dg={class:"plugin",id:"raid"},fg={key:0,class:"table-row"},pg=[ui("div",{class:"table-cell text-left title"},"RAID disks",-1),ui("div",{class:"table-cell"},"Used",-1),ui("div",{class:"table-cell"},"Total",-1)],hg={class:"table-cell text-left"},gg={class:"warning"};const mg={props:{data:{type:Object}},computed:{stats(){return this.data.stats.raid},disks(){const e=Object.entries(this.stats).map((([e,t])=>{const n=Object.entries(t.components).map((([e,t])=>({number:t,name:e})));return{name:e,type:null==t.type?"UNKNOWN":t.type,used:t.used,available:t.available,status:t.status,degraded:t.used0}},methods:{getAlert:e=>e.inactive?"critical":e.degraded?"warning":"ok"}},bg=(0,Ul.Z)(mg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",dg,[s.hasDisks?(Jr(),ri("div",fg,pg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.disks,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",hg,[hi(E(e.type.toUppercase())+" "+E(e.name)+" ",1),nr(ui("div",gg,"└─ Degraded mode",512),[[ws,e.degraded]]),nr(ui("div",null,"   └─ "+E(e.config),513),[[ws,e.degraded]]),nr(ui("div",{class:"critical"},"└─ Status "+E(e.status),513),[[ws,e.inactive]]),e.inactive?(Jr(!0),ri(Gr,{key:0},cr(e.components,((t,n)=>(Jr(),ri("div",{key:n},"    "+E(n===e.components.length-1?"└─":"├─")+" disk "+E(t.number)+": "+E(t.name),1)))),128)):mi("v-if",!0)]),nr(ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.used),3),[[ws,!e.inactive]]),nr(ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.available),3),[[ws,!e.inactive]])])))),128))])}]]),vg={class:"plugin",id:"sensors"},yg={key:0,class:"table-row"},wg=[ui("div",{class:"table-cell text-left title"},"SENSORS",-1)],xg={class:"table-cell text-left"},_g={class:"table-cell"};const kg={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.sensors},sensors(){return this.stats.filter((e=>!(Array.isArray(e.value)&&0===e.value.length||0===e.value))).map((e=>(this.args.fahrenheit&&"battery"!=e.type&&"fan_speed"!=e.type&&(e.value=parseFloat(1.8*e.value+32).toFixed(1),e.unit="F"),e)))}},methods:{getAlert(e){const t="battery"==e.type?100-e.value:e.value;return Ao.getAlert("sensors","sensors_"+e.type+"_",t)}}},Cg=(0,Ul.Z)(kg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",vg,[s.sensors.length>0?(Jr(),ri("div",yg,wg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.sensors,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",xg,E(e.label),1),ui("div",_g,E(e.unit),1),ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.value),3)])))),128))])}]]),Tg={class:"plugin",id:"system"},Sg={key:0,class:"critical"},Ag={class:"title"},Eg={key:1,class:"hidden-xs hidden-sm"},Og={key:2,class:"hidden-xs hidden-sm"};const Ig={props:{data:{type:Object}},data:()=>({store:Co}),computed:{stats(){return this.data.stats.system},isLinux(){return this.data.isLinux},hostname(){return this.stats.hostname},platform(){return this.stats.platform},os(){return{name:this.stats.os_name,version:this.stats.os_version}},humanReadableName(){return this.stats.hr_name},isDisconnected(){return"FAILURE"===this.store.status}}},Lg=(0,Ul.Z)(Ig,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Tg,[s.isDisconnected?(Jr(),ri("span",Sg,"Disconnected from")):mi("v-if",!0),ui("span",Ag,E(s.hostname),1),s.isLinux?(Jr(),ri("span",Eg," ("+E(s.humanReadableName)+" / "+E(s.os.name)+" "+E(s.os.version)+") ",1)):mi("v-if",!0),s.isLinux?mi("v-if",!0):(Jr(),ri("span",Og," ("+E(s.os.name)+" "+E(s.os.version)+" "+E(s.platform)+") ",1))])}]]),Pg={class:"plugin",id:"uptime"};const Ng={props:{data:{type:Object}},computed:{value(){return this.data.stats.uptime}}},Dg=(0,Ul.Z)(Ng,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Pg,[ui("span",null,"Uptime: "+E(s.value),1)])}]]),Mg={class:"plugin",id:"wifi"},jg={key:0,class:"table-row"},Rg=[ui("div",{class:"table-cell text-left title"},"WIFI",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"dBm",-1)],qg={class:"table-cell text-left"},Bg={key:0},Ug=ui("div",{class:"table-cell"},null,-1);const Fg={props:{data:{type:Object}},computed:{stats(){return this.data.stats.wifi},view(){return this.data.views.wifi},hotspots(){const e=this.stats.map((e=>{if(""!==e.ssid)return{ssid:e.ssid,encrypted:e.encrypted,signal:e.signal,encryption_type:e.encryption_type}})).filter(Boolean);return(0,Kl.orderBy)(e,["ssid"])}},methods:{getDecoration(e,t){if(void 0!==this.view[e.ssid][t])return this.view[e.ssid][t].decoration.toLowerCase()}}},zg={components:{GlancesHelp:Fl,GlancesPluginAlert:Ql,GlancesPluginCloud:tc,GlancesPluginConnections:Cc,GlancesPluginCpu:vu,GlancesPluginDiskio:Uu,GlancesPluginDocker:id,GlancesPluginFolders:dd,GlancesPluginFs:xd,GlancesPluginGpu:Bd,GlancesPluginIp:Wd,GlancesPluginIrq:tf,GlancesPluginLoad:mf,GlancesPluginMem:Lf,GlancesPluginMemMore:Wf,GlancesPluginMemswap:lp,GlancesPluginNetwork:Sp,GlancesPluginNow:Op,GlancesPluginPercpu:Vp,GlancesPluginPorts:rh,GlancesPluginProcess:jh,GlancesPluginQuicklook:ug,GlancesPluginRaid:bg,GlancesPluginSensors:Cg,GlancesPluginSystem:Lg,GlancesPluginUptime:Dg,GlancesPluginWifi:(0,Ul.Z)(Fg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Mg,[s.hotspots.length>0?(Jr(),ri("div",jg,Rg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.hotspots,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",qg,[hi(E(e.$filters.limitTo(t.ssid,20))+" ",1),t.encrypted?(Jr(),ri("span",Bg,E(t.encryption_type),1)):mi("v-if",!0)]),Ug,ui("div",{class:C(["table-cell",s.getDecoration(t,"signal")])},E(t.signal),3)])))),128))])}]])},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},data(){return this.store.data||{}},dataLoaded(){return void 0!==this.store.data},hasGpu(){return this.store.data.stats.gpu.length>0},isLinux(){return this.store.data.isLinux},title(){const{data:e}=this,t=e.stats&&e.stats.system&&e.stats.system.hostname||"";return t?`${t} - Glances`:"Glances"}},watch:{title(){document&&(document.title=this.title)}},methods:{setupHotKeys(){wo("a",(()=>{this.store.args.sort_processes_key=null})),wo("c",(()=>{this.store.args.sort_processes_key="cpu_percent"})),wo("m",(()=>{this.store.args.sort_processes_key="memory_percent"})),wo("u",(()=>{this.store.args.sort_processes_key="username"})),wo("p",(()=>{this.store.args.sort_processes_key="name"})),wo("i",(()=>{this.store.args.sort_processes_key="io_counters"})),wo("t",(()=>{this.store.args.sort_processes_key="timemillis"})),wo("shift+A",(()=>{this.store.args.disable_amps=!this.store.args.disable_amps})),wo("d",(()=>{this.store.args.disable_diskio=!this.store.args.disable_diskio})),wo("shift+Q",(()=>{this.store.args.enable_irq=!this.store.args.enable_irq})),wo("f",(()=>{this.store.args.disable_fs=!this.store.args.disable_fs})),wo("j",(()=>{this.store.args.programs=!this.store.args.programs})),wo("k",(()=>{this.store.args.disable_connections=!this.store.args.disable_connections})),wo("n",(()=>{this.store.args.disable_network=!this.store.args.disable_network})),wo("s",(()=>{this.store.args.disable_sensors=!this.store.args.disable_sensors})),wo("2",(()=>{this.store.args.disable_left_sidebar=!this.store.args.disable_left_sidebar})),wo("z",(()=>{this.store.args.disable_process=!this.store.args.disable_process})),wo("/",(()=>{this.store.args.process_short_name=!this.store.args.process_short_name})),wo("shift+D",(()=>{this.store.args.disable_docker=!this.store.args.disable_docker})),wo("b",(()=>{this.store.args.byte=!this.store.args.byte})),wo("shift+B",(()=>{this.store.args.diskio_iops=!this.store.args.diskio_iops})),wo("l",(()=>{this.store.args.disable_alert=!this.store.args.disable_alert})),wo("1",(()=>{this.store.args.percpu=!this.store.args.percpu})),wo("h",(()=>{this.store.args.help_tag=!this.store.args.help_tag})),wo("shift+T",(()=>{this.store.args.network_sum=!this.store.args.network_sum})),wo("shift+U",(()=>{this.store.args.network_cumul=!this.store.args.network_cumul})),wo("shift+F",(()=>{this.store.args.fs_free_space=!this.store.args.fs_free_space})),wo("3",(()=>{this.store.args.disable_quicklook=!this.store.args.disable_quicklook})),wo("6",(()=>{this.store.args.meangpu=!this.store.args.meangpu})),wo("shift+G",(()=>{this.store.args.disable_gpu=!this.store.args.disable_gpu})),wo("5",(()=>{this.store.args.disable_quicklook=!this.store.args.disable_quicklook,this.store.args.disable_cpu=!this.store.args.disable_cpu,this.store.args.disable_mem=!this.store.args.disable_mem,this.store.args.disable_memswap=!this.store.args.disable_memswap,this.store.args.disable_load=!this.store.args.disable_load,this.store.args.disable_gpu=!this.store.args.disable_gpu})),wo("shift+I",(()=>{this.store.args.disable_ip=!this.store.args.disable_ip})),wo("shift+P",(()=>{this.store.args.disable_ports=!this.store.args.disable_ports})),wo("shift+W",(()=>{this.store.args.disable_wifi=!this.store.args.disable_wifi}))}},mounted(){const e=window.__GLANCES__||{},t=isFinite(e["refresh-time"])?parseInt(e["refresh-time"],10):void 0;Eo.init(t),this.setupHotKeys()},beforeUnmount(){wo.unbind()}};const $g=((...e)=>{const t=Cs().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=Ts(e);if(!r)return;const i=t._component;H(i)||i.render||i.template||(i.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t})((0,Ul.Z)(zg,[["render",function(e,t,n,r,i,s){const o=sr("glances-help"),a=sr("glances-plugin-system"),l=sr("glances-plugin-ip"),c=sr("glances-plugin-uptime"),u=sr("glances-plugin-cloud"),d=sr("glances-plugin-quicklook"),f=sr("glances-plugin-cpu"),p=sr("glances-plugin-percpu"),h=sr("glances-plugin-gpu"),g=sr("glances-plugin-mem"),m=sr("glances-plugin-mem-more"),b=sr("glances-plugin-memswap"),v=sr("glances-plugin-load"),y=sr("glances-plugin-network"),w=sr("glances-plugin-connections"),x=sr("glances-plugin-wifi"),_=sr("glances-plugin-ports"),k=sr("glances-plugin-diskio"),C=sr("glances-plugin-fs"),T=sr("glances-plugin-irq"),S=sr("glances-plugin-folders"),A=sr("glances-plugin-raid"),E=sr("glances-plugin-sensors"),O=sr("glances-plugin-now"),I=sr("glances-plugin-docker"),L=sr("glances-plugin-process"),P=sr("glances-plugin-alert");return s.dataLoaded?s.args.help_tag?(Jr(),ii(o,{key:1})):(Jr(),ri("main",Es,[ui("div",Os,[ui("div",Is,[ui("div",Ls,[ui("div",Ps,[di(a,{data:s.data},null,8,["data"])]),s.args.disable_ip?mi("v-if",!0):(Jr(),ri("div",Ns,[di(l,{data:s.data},null,8,["data"])])),ui("div",Ds,[di(c,{data:s.data},null,8,["data"])])])])]),ui("div",Ms,[ui("div",js,[ui("div",Rs,[ui("div",qs,[di(u,{data:s.data},null,8,["data"])])])]),ui("div",Bs,[s.args.disable_quicklook?mi("v-if",!0):(Jr(),ri("div",Us,[di(d,{data:s.data},null,8,["data"])])),s.args.disable_cpu||s.args.percpu?mi("v-if",!0):(Jr(),ri("div",Fs,[di(f,{data:s.data},null,8,["data"])])),!s.args.disable_cpu&&s.args.percpu?(Jr(),ri("div",zs,[di(p,{data:s.data},null,8,["data"])])):mi("v-if",!0),!s.args.disable_gpu&&s.hasGpu?(Jr(),ri("div",$s,[di(h,{data:s.data},null,8,["data"])])):mi("v-if",!0),s.args.disable_mem?mi("v-if",!0):(Jr(),ri("div",Hs,[di(g,{data:s.data},null,8,["data"])])),mi(" NOTE: display if MEM enabled and GPU disabled "),s.args.disable_mem||!s.args.disable_gpu&&s.hasGpu?mi("v-if",!0):(Jr(),ri("div",Vs,[di(m,{data:s.data},null,8,["data"])])),s.args.disable_memswap?mi("v-if",!0):(Jr(),ri("div",Gs,[di(b,{data:s.data},null,8,["data"])])),s.args.disable_load?mi("v-if",!0):(Jr(),ri("div",Ws,[di(v,{data:s.data},null,8,["data"])]))])]),ui("div",Zs,[ui("div",Ks,[s.args.disable_left_sidebar?mi("v-if",!0):(Jr(),ri("div",Xs,[ui("div",Qs,[s.args.disable_network?mi("v-if",!0):(Jr(),ii(y,{key:0,id:"plugin-network",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.isLinux&&!s.args.disable_connections?(Jr(),ii(w,{key:1,id:"plugin-connections",class:"plugin table-row-group",data:s.data},null,8,["data"])):mi("v-if",!0),s.args.disable_wifi?mi("v-if",!0):(Jr(),ii(x,{key:2,id:"plugin-wifi",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_ports?mi("v-if",!0):(Jr(),ii(_,{key:3,id:"plugin-ports",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_diskio?mi("v-if",!0):(Jr(),ii(k,{key:4,id:"plugin-diskio",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_fs?mi("v-if",!0):(Jr(),ii(C,{key:5,id:"plugin-fs",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.enable_irq?(Jr(),ii(T,{key:6,id:"plugin-irq",class:"plugin table-row-group",data:s.data},null,8,["data"])):mi("v-if",!0),s.args.disable_folders?mi("v-if",!0):(Jr(),ii(S,{key:7,id:"plugin-folders",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.raid?mi("v-if",!0):(Jr(),ii(A,{key:8,id:"plugin-raid",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_sensors?mi("v-if",!0):(Jr(),ii(E,{key:9,id:"plugin-sensors",class:"plugin table-row-group",data:s.data},null,8,["data"])),di(O,{data:s.data},null,8,["data"])])])),ui("div",Js,[s.args.disable_docker?mi("v-if",!0):(Jr(),ii(I,{key:0,data:s.data},null,8,["data"])),di(L,{data:s.data},null,8,["data"]),s.args.disable_alert?mi("v-if",!0):(Jr(),ii(P,{key:1,data:s.data},null,8,["data"]))])])])])):(Jr(),ri("div",Ss,As))}]]));$g.config.globalProperties.$filters=e,$g.mount("#app")})()})(); \ No newline at end of file +var Ys="undefined"!=typeof navigator&&navigator.userAgent.toLowerCase().indexOf("firefox")>0;function eo(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on".concat(t),(function(){n(window.event)}))}function to(e,t){for(var n=t.slice(0,t.length-1),r=0;r=0;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}for(var ro={backspace:8,"⌫":8,tab:9,clear:12,enter:13,"↩":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"⇪":20,",":188,".":190,"/":191,"`":192,"-":Ys?173:189,"=":Ys?61:187,";":Ys?59:186,"'":222,"[":219,"]":221,"\\":220},io={"⇧":16,shift:16,"⌥":18,alt:18,option:18,"⌃":17,ctrl:17,control:17,"⌘":91,cmd:91,command:91},so={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},oo={16:!1,18:!1,17:!1,91:!1},ao={},lo=1;lo<20;lo++)ro["f".concat(lo)]=111+lo;var co=[],uo=!1,fo="all",po=[],ho=function(e){return ro[e.toLowerCase()]||io[e.toLowerCase()]||e.toUpperCase().charCodeAt(0)};function go(e){fo=e||"all"}function mo(){return fo||"all"}var bo=function(e){var t=e.key,n=e.scope,r=e.method,i=e.splitKey,s=void 0===i?"+":i;no(t).forEach((function(e){var t=e.split(s),i=t.length,o=t[i-1],a="*"===o?"*":ho(o);if(ao[a]){n||(n=mo());var l=i>1?to(io,t):[];ao[a]=ao[a].filter((function(e){return!((!r||e.method===r)&&e.scope===n&&function(e,t){for(var n=e.length>=t.length?e:t,r=e.length>=t.length?t:e,i=!0,s=0;s0,oo)Object.prototype.hasOwnProperty.call(oo,s)&&(!oo[s]&&t.mods.indexOf(+s)>-1||oo[s]&&-1===t.mods.indexOf(+s))&&(i=!1);(0!==t.mods.length||oo[16]||oo[18]||oo[17]||oo[91])&&!i&&"*"!==t.shortcut||!1===t.method(e,t)&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0))}}function yo(e,t){var n=ao["*"],r=e.keyCode||e.which||e.charCode;if(wo.filter.call(this,e)){if(93!==r&&224!==r||(r=91),-1===co.indexOf(r)&&229!==r&&co.push(r),["ctrlKey","altKey","shiftKey","metaKey"].forEach((function(t){var n=so[t];e[t]&&-1===co.indexOf(n)?co.push(n):!e[t]&&co.indexOf(n)>-1?co.splice(co.indexOf(n),1):"metaKey"===t&&e[t]&&3===co.length&&(e.ctrlKey||e.shiftKey||e.altKey||(co=co.slice(co.indexOf(n))))})),r in oo){for(var i in oo[r]=!0,io)io[i]===r&&(wo[i]=!0);if(!n)return}for(var s in oo)Object.prototype.hasOwnProperty.call(oo,s)&&(oo[s]=e[so[s]]);e.getModifierState&&(!e.altKey||e.ctrlKey)&&e.getModifierState("AltGraph")&&(-1===co.indexOf(17)&&co.push(17),-1===co.indexOf(18)&&co.push(18),oo[17]=!0,oo[18]=!0);var o=mo();if(n)for(var a=0;a1&&(i=to(io,e)),(e="*"===(e=e[e.length-1])?"*":ho(e))in ao||(ao[e]=[]),ao[e].push({keyup:l,keydown:c,scope:s,mods:i,shortcut:r[a],method:n,key:r[a],splitKey:u,element:o});void 0!==o&&!function(e){return po.indexOf(e)>-1}(o)&&window&&(po.push(o),eo(o,"keydown",(function(e){yo(e,o)}),d),uo||(uo=!0,eo(window,"focus",(function(){co=[]}),d)),eo(o,"keyup",(function(e){yo(e,o),function(e){var t=e.keyCode||e.which||e.charCode,n=co.indexOf(t);if(n>=0&&co.splice(n,1),e.key&&"meta"===e.key.toLowerCase()&&co.splice(0,co.length),93!==t&&224!==t||(t=91),t in oo)for(var r in oo[t]=!1,io)io[r]===t&&(wo[r]=!1)}(e)}),d))}var xo={getPressedKeyString:function(){return co.map((function(e){return t=e,Object.keys(ro).find((function(e){return ro[e]===t}))||function(e){return Object.keys(io).find((function(t){return io[t]===e}))}(e)||String.fromCharCode(e);var t}))},setScope:go,getScope:mo,deleteScope:function(e,t){var n,r;for(var i in e||(e=mo()),ao)if(Object.prototype.hasOwnProperty.call(ao,i))for(n=ao[i],r=0;r1&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(ao).forEach((function(n){ao[n].filter((function(n){return n.scope===t&&n.shortcut===e})).forEach((function(e){e&&e.method&&e.method()}))}))},unbind:function(e){if(void 0===e)Object.keys(ao).forEach((function(e){return delete ao[e]}));else if(Array.isArray(e))e.forEach((function(e){e.key&&bo(e)}));else if("object"==typeof e)e.key&&bo(e);else if("string"==typeof e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=this.limits[e][l]){var c=l.lastIndexOf("_");return l.substring(c+1)+s}}return"ok"+s}getAlertLog(e,t,n,r){return this.getAlert(e,t,n,r,!0)}};const Eo=new class{data=void 0;init(e=60){let t;const n=()=>(Co.status="PENDING",Promise.all([fetch("api/3/all",{method:"GET"}).then((e=>e.json())),fetch("api/3/all/views",{method:"GET"}).then((e=>e.json()))]).then((e=>{const t={stats:e[0],views:e[1],isBsd:"FreeBSD"===e[0].system.os_name,isLinux:"Linux"===e[0].system.os_name,isSunOS:"SunOS"===e[0].system.os_name,isMac:"Darwin"===e[0].system.os_name,isWindows:"Windows"===e[0].system.os_name};this.data=t,Co.data=t,Co.status="SUCCESS"})).catch((e=>{console.log(e),Co.status="FAILURE"})).then((()=>{t&&clearTimeout(t),t=setTimeout(n,1e3*e)})));n(),fetch("api/3/all/limits",{method:"GET"}).then((e=>e.json())).then((e=>{Ao.setLimits(e)})),fetch("api/3/args",{method:"GET"}).then((e=>e.json())).then(((e={})=>{Co.args={...Co.args,...e}})),fetch("api/3/config",{method:"GET"}).then((e=>e.json())).then(((e={})=>{Co.config={...Co.config,...e}}))}getData(){return this.data}};const Oo=new class{constructor(){this.favico=new(So())({animation:"none"})}badge(e){this.favico.badge(e)}reset(){this.favico.reset()}},Io={key:0},Lo={class:"container-fluid"},Po={class:"row"},No={class:"col-sm-12 col-lg-24"},Do=ui("div",{class:"row"}," ",-1),Mo={class:"row"},jo={class:"col-sm-12 col-lg-24"},Ro=ui("div",{class:"row"}," ",-1),qo={class:"divTable",style:{width:"100%"}},Bo={class:"divTableBody"},Uo={class:"divTableRow"},Fo={class:"divTableHead"},zo={class:"divTableHead"},$o={class:"divTableHead"},Ho={class:"divTableHead"},Vo={class:"divTableRow"},Go={class:"divTableCell"},Wo={class:"divTableCell"},Zo={class:"divTableCell"},Ko={class:"divTableCell"},Xo={class:"divTableRow"},Qo={class:"divTableCell"},Jo={class:"divTableCell"},Yo={class:"divTableCell"},ea={class:"divTableCell"},ta={class:"divTableRow"},na={class:"divTableCell"},ra={class:"divTableCell"},ia={class:"divTableCell"},sa={class:"divTableCell"},oa={class:"divTableRow"},aa={class:"divTableCell"},la={class:"divTableCell"},ca={class:"divTableCell"},ua={class:"divTableCell"},da={class:"divTableRow"},fa={class:"divTableCell"},pa={class:"divTableCell"},ha={class:"divTableCell"},ga={class:"divTableCell"},ma={class:"divTableRow"},ba={class:"divTableCell"},va={class:"divTableCell"},ya={class:"divTableCell"},wa={class:"divTableCell"},xa={class:"divTableRow"},_a={class:"divTableCell"},ka={class:"divTableCell"},Ca={class:"divTableCell"},Ta={class:"divTableCell"},Sa={class:"divTableRow"},Aa=ui("div",{class:"divTableCell"}," ",-1),Ea={class:"divTableCell"},Oa={class:"divTableCell"},Ia={class:"divTableCell"},La={class:"divTableRow"},Pa=ui("div",{class:"divTableCell"}," ",-1),Na={class:"divTableCell"},Da={class:"divTableCell"},Ma={class:"divTableCell"},ja={class:"divTableRow"},Ra=ui("div",{class:"divTableCell"}," ",-1),qa={class:"divTableCell"},Ba={class:"divTableCell"},Ua={class:"divTableCell"},Fa={class:"divTableRow"},za=ui("div",{class:"divTableCell"}," ",-1),$a={class:"divTableCell"},Ha=ui("div",{class:"divTableCell"}," ",-1),Va={class:"divTableCell"},Ga={class:"divTableRow"},Wa=ui("div",{class:"divTableCell"}," ",-1),Za={class:"divTableCell"},Ka=ui("div",{class:"divTableCell"}," ",-1),Xa=ui("div",{class:"divTableCell"}," ",-1),Qa={class:"divTableRow"},Ja=ui("div",{class:"divTableCell"}," ",-1),Ya={class:"divTableCell"},el=ui("div",{class:"divTableCell"}," ",-1),tl=ui("div",{class:"divTableCell"}," ",-1),nl={class:"divTableRow"},rl=ui("div",{class:"divTableCell"}," ",-1),il={class:"divTableCell"},sl=ui("div",{class:"divTableCell"}," ",-1),ol=ui("div",{class:"divTableCell"}," ",-1),al={class:"divTableRow"},ll=ui("div",{class:"divTableCell"}," ",-1),cl={class:"divTableCell"},ul=ui("div",{class:"divTableCell"}," ",-1),dl=ui("div",{class:"divTableCell"}," ",-1),fl={class:"divTableRow"},pl=ui("div",{class:"divTableCell"}," ",-1),hl={class:"divTableCell"},gl=ui("div",{class:"divTableCell"}," ",-1),ml=ui("div",{class:"divTableCell"}," ",-1),bl={class:"divTableRow"},vl=ui("div",{class:"divTableCell"}," ",-1),yl={class:"divTableCell"},wl=ui("div",{class:"divTableCell"}," ",-1),xl=ui("div",{class:"divTableCell"}," ",-1),_l={class:"divTableRow"},kl=ui("div",{class:"divTableCell"}," ",-1),Cl={class:"divTableCell"},Tl=ui("div",{class:"divTableCell"}," ",-1),Sl=ui("div",{class:"divTableCell"}," ",-1),Al={class:"divTableRow"},El=ui("div",{class:"divTableCell"}," ",-1),Ol={class:"divTableCell"},Il=ui("div",{class:"divTableCell"}," ",-1),Ll=ui("div",{class:"divTableCell"}," ",-1),Pl={class:"divTableRow"},Nl=ui("div",{class:"divTableCell"}," ",-1),Dl={class:"divTableCell"},Ml=ui("div",{class:"divTableCell"}," ",-1),jl=ui("div",{class:"divTableCell"}," ",-1),Rl=ui("div",null,[ui("p",null,[hi(" For an exhaustive list of key bindings, "),ui("a",{href:"https://glances.readthedocs.io/en/latest/cmds.html#interactive-commands"},"click here"),hi(". ")])],-1),ql=ui("div",null,[ui("p",null,[hi("Press "),ui("b",null,"h"),hi(" to came back to Glances.")])],-1);const Bl={data:()=>({help:void 0}),mounted(){fetch("api/3/help",{method:"GET"}).then((e=>e.json())).then((e=>this.help=e))}};var Ul=n(3744);const Fl=(0,Ul.Z)(Bl,[["render",function(e,t,n,r,i,s){return i.help?(Jr(),ri("div",Io,[ui("div",Lo,[ui("div",Po,[ui("div",No,E(i.help.version)+" "+E(i.help.psutil_version),1)]),Do,ui("div",Mo,[ui("div",jo,E(i.help.configuration_file),1)]),Ro]),ui("div",qo,[ui("div",Bo,[ui("div",Uo,[ui("div",Fo,E(i.help.header_sort.replace(":","")),1),ui("div",zo,E(i.help.header_show_hide.replace(":","")),1),ui("div",$o,E(i.help.header_toggle.replace(":","")),1),ui("div",Ho,E(i.help.header_miscellaneous.replace(":","")),1)]),ui("div",Vo,[ui("div",Go,E(i.help.sort_auto),1),ui("div",Wo,E(i.help.show_hide_application_monitoring),1),ui("div",Zo,E(i.help.toggle_bits_bytes),1),ui("div",Ko,E(i.help.misc_erase_process_filter),1)]),ui("div",Xo,[ui("div",Qo,E(i.help.sort_cpu),1),ui("div",Jo,E(i.help.show_hide_diskio),1),ui("div",Yo,E(i.help.toggle_count_rate),1),ui("div",ea,E(i.help.misc_generate_history_graphs),1)]),ui("div",ta,[ui("div",na,E(i.help.sort_io_rate),1),ui("div",ra,E(i.help.show_hide_docker),1),ui("div",ia,E(i.help.toggle_used_free),1),ui("div",sa,E(i.help.misc_help),1)]),ui("div",oa,[ui("div",aa,E(i.help.sort_mem),1),ui("div",la,E(i.help.show_hide_top_extended_stats),1),ui("div",ca,E(i.help.toggle_bar_sparkline),1),ui("div",ua,E(i.help.misc_accumulate_processes_by_program),1)]),ui("div",da,[ui("div",fa,E(i.help.sort_process_name),1),ui("div",pa,E(i.help.show_hide_filesystem),1),ui("div",ha,E(i.help.toggle_separate_combined),1),ui("div",ga,E(i.help.misc_kill_process)+" - N/A in WebUI ",1)]),ui("div",ma,[ui("div",ba,E(i.help.sort_cpu_times),1),ui("div",va,E(i.help.show_hide_gpu),1),ui("div",ya,E(i.help.toggle_live_cumulative),1),ui("div",wa,E(i.help.misc_reset_processes_summary_min_max),1)]),ui("div",xa,[ui("div",_a,E(i.help.sort_user),1),ui("div",ka,E(i.help.show_hide_ip),1),ui("div",Ca,E(i.help.toggle_linux_percentage),1),ui("div",Ta,E(i.help.misc_quit),1)]),ui("div",Sa,[Aa,ui("div",Ea,E(i.help.show_hide_tcp_connection),1),ui("div",Oa,E(i.help.toggle_cpu_individual_combined),1),ui("div",Ia,E(i.help.misc_reset_history),1)]),ui("div",La,[Pa,ui("div",Na,E(i.help.show_hide_alert),1),ui("div",Da,E(i.help.toggle_gpu_individual_combined),1),ui("div",Ma,E(i.help.misc_delete_warning_alerts),1)]),ui("div",ja,[Ra,ui("div",qa,E(i.help.show_hide_network),1),ui("div",Ba,E(i.help.toggle_short_full),1),ui("div",Ua,E(i.help.misc_delete_warning_and_critical_alerts),1)]),ui("div",Fa,[za,ui("div",$a,E(i.help.sort_cpu_times),1),Ha,ui("div",Va,E(i.help.misc_edit_process_filter_pattern)+" - N/A in WebUI ",1)]),ui("div",Ga,[Wa,ui("div",Za,E(i.help.show_hide_irq),1),Ka,Xa]),ui("div",Qa,[Ja,ui("div",Ya,E(i.help.show_hide_raid_plugin),1),el,tl]),ui("div",nl,[rl,ui("div",il,E(i.help.show_hide_sensors),1),sl,ol]),ui("div",al,[ll,ui("div",cl,E(i.help.show_hide_wifi_module),1),ul,dl]),ui("div",fl,[pl,ui("div",hl,E(i.help.show_hide_processes),1),gl,ml]),ui("div",bl,[vl,ui("div",yl,E(i.help.show_hide_left_sidebar),1),wl,xl]),ui("div",_l,[kl,ui("div",Cl,E(i.help.show_hide_quick_look),1),Tl,Sl]),ui("div",Al,[El,ui("div",Ol,E(i.help.show_hide_cpu_mem_swap),1),Il,Ll]),ui("div",Pl,[Nl,ui("div",Dl,E(i.help.show_hide_all),1),Ml,jl])])]),Rl,ql])):mi("v-if",!0)}]]),zl={class:"plugin"},$l={id:"alerts"},Hl={key:0,class:"title"},Vl={key:1,class:"title"},Gl={id:"alert"},Wl={class:"table"},Zl={class:"table-cell text-left"};var Kl=n(6486);const Xl={props:{data:{type:Object}},computed:{stats(){return this.data.stats.alert},alerts(){return(this.stats||[]).map((e=>{const t={};if(t.name=e[3],t.level=e[2],t.begin=1e3*e[0],t.end=1e3*e[1],t.ongoing=-1==e[1],t.min=e[6],t.mean=e[5],t.max=e[4],!t.ongoing){const e=t.end-t.begin,n=parseInt(e/1e3%60),r=parseInt(e/6e4%60),i=parseInt(e/36e5%24);t.duration=(0,Kl.padStart)(i,2,"0")+":"+(0,Kl.padStart)(r,2,"0")+":"+(0,Kl.padStart)(n,2,"0")}return t}))},hasAlerts(){return this.countAlerts>0},countAlerts(){return this.alerts.length},hasOngoingAlerts(){return this.countOngoingAlerts>0},countOngoingAlerts(){return this.alerts.filter((({ongoing:e})=>e)).length}},watch:{countOngoingAlerts(){this.countOngoingAlerts?Oo.badge(this.countOngoingAlerts):Oo.reset()}},methods:{formatDate:e=>new Date(e).toISOString().slice(0,19).replace(/[^\d-:]/," ")}},Ql=(0,Ul.Z)(Xl,[["render",function(e,t,n,r,i,s){return Jr(),ri("div",zl,[ui("section",$l,[s.hasAlerts?(Jr(),ri("span",Hl," Warning or critical alerts (last "+E(s.countAlerts)+" entries) ",1)):(Jr(),ri("span",Vl,"No warning or critical alert detected"))]),ui("section",Gl,[ui("div",Wl,[(Jr(!0),ri(Gr,null,cr(s.alerts,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Zl,[hi(E(s.formatDate(t.begin))+" ("+E(t.ongoing?"ongoing":t.duration)+") - ",1),nr(ui("span",null,E(t.level)+" on ",513),[[ws,!t.ongoing]]),ui("span",{class:C(t.level.toLowerCase())},E(t.name),3),hi(" ("+E(e.$filters.number(t.max,1))+") ",1)])])))),128))])])])}]]),Jl={key:0,id:"cloud",class:"plugin"},Yl={class:"title"};const ec={props:{data:{type:Object}},computed:{stats(){return this.data.stats.cloud},provider(){return void 0!==this.stats.id?`${stats.platform}`:null},instance(){const{stats:e}=this;return void 0!==this.stats.id?`${e.type} instance ${e.name} (${e.region})`:null}}},tc=(0,Ul.Z)(ec,[["render",function(e,t,n,r,i,s){return s.instance||s.provider?(Jr(),ri("section",Jl,[ui("span",Yl,E(s.provider),1),hi(" "+E(s.instance),1)])):mi("v-if",!0)}]]),nc={class:"plugin",id:"connections"},rc=ui("div",{class:"table-row"},[ui("div",{class:"table-cell text-left title"},"TCP CONNECTIONS"),ui("div",{class:"table-cell"})],-1),ic={class:"table-row"},sc=ui("div",{class:"table-cell text-left"},"Listen",-1),oc=ui("div",{class:"table-cell"},null,-1),ac={class:"table-cell"},lc={class:"table-row"},cc=ui("div",{class:"table-cell text-left"},"Initiated",-1),uc=ui("div",{class:"table-cell"},null,-1),dc={class:"table-cell"},fc={class:"table-row"},pc=ui("div",{class:"table-cell text-left"},"Established",-1),hc=ui("div",{class:"table-cell"},null,-1),gc={class:"table-cell"},mc={class:"table-row"},bc=ui("div",{class:"table-cell text-left"},"Terminated",-1),vc=ui("div",{class:"table-cell"},null,-1),yc={class:"table-cell"},wc={class:"table-row"},xc=ui("div",{class:"table-cell text-left"},"Tracked",-1),_c=ui("div",{class:"table-cell"},null,-1);const kc={props:{data:{type:Object}},computed:{stats(){return this.data.stats.connections},view(){return this.data.views.connections},listen(){return this.stats.LISTEN},initiated(){return this.stats.initiated},established(){return this.stats.ESTABLISHED},terminated(){return this.stats.terminated},tracked(){return{count:this.stats.nf_conntrack_count,max:this.stats.nf_conntrack_max}}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},Cc=(0,Ul.Z)(kc,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",nc,[rc,ui("div",ic,[sc,oc,ui("div",ac,E(s.listen),1)]),ui("div",lc,[cc,uc,ui("div",dc,E(s.initiated),1)]),ui("div",fc,[pc,hc,ui("div",gc,E(s.established),1)]),ui("div",mc,[bc,vc,ui("div",yc,E(s.terminated),1)]),ui("div",wc,[xc,_c,ui("div",{class:C(["table-cell",s.getDecoration("nf_conntrack_percent")])},E(s.tracked.count)+"/"+E(s.tracked.max),3)])])}]]),Tc={id:"cpu",class:"plugin"},Sc={class:"row"},Ac={class:"col-sm-24 col-md-12 col-lg-8"},Ec={class:"table"},Oc={class:"table-row"},Ic=ui("div",{class:"table-cell text-left title"},"CPU",-1),Lc={class:"table-cell"},Pc={class:"table-row"},Nc=ui("div",{class:"table-cell text-left"},"user:",-1),Dc={class:"table-row"},Mc=ui("div",{class:"table-cell text-left"},"system:",-1),jc={class:"table-row"},Rc=ui("div",{class:"table-cell text-left"},"iowait:",-1),qc={class:"table-row"},Bc=ui("div",{class:"table-cell text-left"},"dpc:",-1),Uc={class:"hidden-xs hidden-sm col-md-12 col-lg-8"},Fc={class:"table"},zc={class:"table-row"},$c=ui("div",{class:"table-cell text-left"},"idle:",-1),Hc={class:"table-cell"},Vc={class:"table-row"},Gc=ui("div",{class:"table-cell text-left"},"irq:",-1),Wc={class:"table-cell"},Zc={class:"table-row"},Kc=ui("div",{class:"table-cell text-left"},"inter:",-1),Xc={class:"table-cell"},Qc={class:"table-row"},Jc=ui("div",{class:"table-cell text-left"},"nice:",-1),Yc={class:"table-cell"},eu={key:0,class:"table-row"},tu=ui("div",{class:"table-cell text-left"},"ctx_sw:",-1),nu={class:"table-row"},ru=ui("div",{class:"table-cell text-left"},"steal:",-1),iu={key:1,class:"table-row"},su=ui("div",{class:"table-cell text-left"},"syscal:",-1),ou={class:"table-cell"},au={class:"hidden-xs hidden-sm hidden-md col-lg-8"},lu={class:"table"},cu={key:0,class:"table-row"},uu=ui("div",{class:"table-cell text-left"},"ctx_sw:",-1),du={key:1,class:"table-row"},fu=ui("div",{class:"table-cell text-left"},"inter:",-1),pu={class:"table-cell"},hu={key:2,class:"table-row"},gu=ui("div",{class:"table-cell text-left"},"sw_int:",-1),mu={class:"table-cell"};const bu={props:{data:{type:Object}},computed:{stats(){return this.data.stats.cpu},view(){return this.data.views.cpu},isLinux(){return this.data.isLinux},isSunOS(){return this.data.isSunOS},isWindows(){return this.data.isWindows},total(){return this.stats.total},user(){return this.stats.user},system(){return this.stats.system},idle(){return this.stats.idle},nice(){return this.stats.nice},irq(){return this.stats.irq},iowait(){return this.stats.iowait},dpc(){return this.stats.dpc},steal(){return this.stats.steal},ctx_switches(){const{stats:e}=this;return e.ctx_switches?Math.floor(e.ctx_switches/e.time_since_update):null},interrupts(){const{stats:e}=this;return e.interrupts?Math.floor(e.interrupts/e.time_since_update):null},soft_interrupts(){const{stats:e}=this;return e.soft_interrupts?Math.floor(e.soft_interrupts/e.time_since_update):null},syscalls(){const{stats:e}=this;return e.syscalls?Math.floor(e.syscalls/e.time_since_update):null}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},vu=(0,Ul.Z)(bu,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Tc,[ui("div",Sc,[ui("div",Ac,[ui("div",Ec,[ui("div",Oc,[Ic,ui("div",Lc,E(s.total)+"%",1)]),ui("div",Pc,[Nc,ui("div",{class:C(["table-cell",s.getDecoration("user")])},E(s.user)+"%",3)]),ui("div",Dc,[Mc,ui("div",{class:C(["table-cell",s.getDecoration("system")])},E(s.system)+"%",3)]),nr(ui("div",jc,[Rc,ui("div",{class:C(["table-cell",s.getDecoration("iowait")])},E(s.iowait)+"%",3)],512),[[ws,null!=s.iowait]]),nr(ui("div",qc,[Bc,ui("div",{class:C(["table-cell",s.getDecoration("dpc")])},E(s.dpc)+"%",3)],512),[[ws,null==s.iowait&&null!=s.dpc]])])]),ui("div",Uc,[ui("div",Fc,[ui("div",zc,[$c,ui("div",Hc,E(s.idle)+"%",1)]),nr(ui("div",Vc,[Gc,ui("div",Wc,E(s.irq)+"%",1)],512),[[ws,null!=s.irq]]),mi(" If no irq, display interrupts "),nr(ui("div",Zc,[Kc,ui("div",Xc,E(s.interrupts),1)],512),[[ws,null==s.irq]]),nr(ui("div",Qc,[Jc,ui("div",Yc,E(s.nice)+"%",1)],512),[[ws,null!=s.nice]]),mi(" If no nice, display ctx_switches "),null==s.nice&&s.ctx_switches?(Jr(),ri("div",eu,[tu,ui("div",{class:C(["table-cell",s.getDecoration("ctx_switches")])},E(s.ctx_switches),3)])):mi("v-if",!0),nr(ui("div",nu,[ru,ui("div",{class:C(["table-cell",s.getDecoration("steal")])},E(s.steal)+"%",3)],512),[[ws,null!=s.steal]]),!s.isLinux&&s.syscalls?(Jr(),ri("div",iu,[su,ui("div",ou,E(s.syscalls),1)])):mi("v-if",!0)])]),ui("div",au,[ui("div",lu,[mi(" If not already display instead of nice, then display ctx_switches "),null!=s.nice&&s.ctx_switches?(Jr(),ri("div",cu,[uu,ui("div",{class:C(["table-cell",s.getDecoration("ctx_switches")])},E(s.ctx_switches),3)])):mi("v-if",!0),mi(" If not already display instead of irq, then display interrupts "),null!=s.irq&&s.interrupts?(Jr(),ri("div",du,[fu,ui("div",pu,E(s.interrupts),1)])):mi("v-if",!0),s.isWindows||s.isSunOS||!s.soft_interrupts?mi("v-if",!0):(Jr(),ri("div",hu,[gu,ui("div",mu,E(s.soft_interrupts),1)]))])])])])}]]),yu={class:"plugin",id:"diskio"},wu={key:0,class:"table-row"},xu=ui("div",{class:"table-cell text-left title"},"DISK I/O",-1),_u={class:"table-cell"},ku={class:"table-cell"},Cu={class:"table-cell"},Tu={class:"table-cell"},Su={class:"table-cell text-left"};var Au=n(1036),Eu=n.n(Au);function Ou(e,t){return Iu(e=8*Math.round(e),t)+"b"}function Iu(e,t){if(t=t||!1,isNaN(parseFloat(e))||!isFinite(e)||0==e)return e;const n=["Y","Z","E","P","T","G","M","K"],r={Y:12089258196146292e8,Z:11805916207174113e5,E:0x1000000000000000,P:0x4000000000000,T:1099511627776,G:1073741824,M:1048576,K:1024};for(var i=0;i1){var a=0;return o<10?a=2:o<100&&(a=1),t?a="MK"==s?0:(0,Kl.min)([1,a]):"K"==s&&(a=0),parseFloat(o).toFixed(a)+s}}return e.toFixed(0)}function Lu(e){return void 0===e||""===e?"?":e}function Pu(e,t,n){return t=t||0,n=n||" ",String(e).padStart(t,n)}function Nu(e,t){return"function"!=typeof e.slice&&(e=String(e)),e.slice(0,t)}function Du(e,t){return t=t||8,e.length>t?"_"+e.substring(e.length-t+1):e}function Mu(e){if(void 0===e)return e;var t=function(e){var t=document.createElement("div");return t.innerText=e,t.innerHTML}(e),n=t.replace(/\n/g,"
");return Eu()(n)}function ju(e,t){return new Intl.NumberFormat(void 0,"number"==typeof t?{maximumFractionDigits:t}:t).format(e)}function Ru(e){for(var t=0,n=0;n({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.diskio},disks(){const e=this.stats.map((e=>{const t=e.time_since_update;return{name:e.disk_name,bitrate:{txps:Iu(e.read_bytes/t),rxps:Iu(e.write_bytes/t)},count:{txps:Iu(e.read_count/t),rxps:Iu(e.write_count/t)},alias:void 0!==e.alias?e.alias:null}}));return(0,Kl.orderBy)(e,["name"])}}},Uu=(0,Ul.Z)(Bu,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",yu,[s.disks.length>0?(Jr(),ri("div",wu,[xu,nr(ui("div",_u,"R/s",512),[[ws,!s.args.diskio_iops]]),nr(ui("div",ku,"W/s",512),[[ws,!s.args.diskio_iops]]),nr(ui("div",Cu,"IOR/s",512),[[ws,s.args.diskio_iops]]),nr(ui("div",Tu,"IOW/s",512),[[ws,s.args.diskio_iops]])])):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.disks,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Su,E(e.$filters.minSize(t.alias?t.alias:t.name,32)),1),nr(ui("div",{class:"table-cell"},E(t.bitrate.txps),513),[[ws,!s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.bitrate.rxps),513),[[ws,!s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.count.txps),513),[[ws,s.args.diskio_iops]]),nr(ui("div",{class:"table-cell"},E(t.count.rxps),513),[[ws,s.args.diskio_iops]])])))),128))])}]]),Fu={key:0,id:"containers-plugin",class:"plugin"},zu=ui("span",{class:"title"},"CONTAINERS",-1),$u={class:"table"},Hu={class:"table-row"},Vu=ui("div",{class:"table-cell"},"Status",-1),Gu=ui("div",{class:"table-cell"},"Uptime",-1),Wu=gi('
/MAX
IOR/s
IOW/s
RX/s
TX/s
Command
',6),Zu={class:"table-cell text-left"},Ku={class:"table-cell"},Xu={class:"table-cell"},Qu={class:"table-cell"},Ju={class:"table-cell"},Yu={class:"table-cell"},ed={class:"table-cell"},td={class:"table-cell"},nd={class:"table-cell text-left"};const rd={props:{data:{type:Object}},data:()=>({store:Co,sorter:void 0}),computed:{args(){return this.store.args||{}},sortProcessesKey(){return this.args.sort_processes_key},stats(){return this.data.stats.docker},containers(){const{sorter:e}=this,t=(this.stats.containers||[]).map((e=>({id:e.Id,name:e.name,status:e.Status,uptime:e.Uptime,cpu_percent:e.cpu.total,memory_usage:null!=e.memory.usage?e.memory.usage:"?",limit:null!=e.memory.limit?e.memory.limit:"?",ior:null!=e.io.ior?e.io.ior:"?",iow:null!=e.io.iow?e.io.iow:"?",io_time_since_update:e.io.time_since_update,rx:null!=e.network.rx?e.network.rx:"?",tx:null!=e.network.tx?e.network.tx:"?",net_time_since_update:e.network.time_since_update,command:e.Command.join(" "),image:e.Image})));return(0,Kl.orderBy)(t,[e.column].reduce(((e,t)=>("memory_percent"===t&&(t=["memory_usage"]),e.concat(t))),[]),[e.isReverseColumn(e.column)?"desc":"asc"])}},watch:{sortProcessesKey:{immediate:!0,handler(e){e&&!["cpu_percent","memory_percent","name"].includes(e)||(this.sorter={column:this.args.sort_processes_key||"cpu_percent",auto:!this.args.sort_processes_key,isReverseColumn:function(e){return!["name"].includes(e)},getColumnLabel:function(e){return{io_counters:"disk IO",cpu_percent:"CPU consumption",memory_usage:"memory consumption",cpu_times:"uptime",name:"container name",None:"None"}[e]||e}})}}}},id=(0,Ul.Z)(rd,[["render",function(e,t,n,r,i,s){return s.containers.length?(Jr(),ri("section",Fu,[zu,hi(" "+E(s.containers.length)+" sorted by "+E(i.sorter.getColumnLabel(i.sorter.column))+" ",1),ui("div",$u,[ui("div",Hu,[ui("div",{class:C(["table-cell text-left",["sortable","name"===i.sorter.column&&"sort"]]),onClick:t[0]||(t[0]=e=>s.args.sort_processes_key="name")}," Name ",2),Vu,Gu,ui("div",{class:C(["table-cell",["sortable","cpu_percent"===i.sorter.column&&"sort"]]),onClick:t[1]||(t[1]=e=>s.args.sort_processes_key="cpu_percent")}," CPU% ",2),ui("div",{class:C(["table-cell",["sortable","memory_percent"===i.sorter.column&&"sort"]]),onClick:t[2]||(t[2]=e=>s.args.sort_processes_key="memory_percent")}," MEM ",2),Wu]),(Jr(!0),ri(Gr,null,cr(s.containers,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Zu,E(t.name),1),ui("div",{class:C(["table-cell","Paused"==t.status?"careful":"ok"])},E(t.status),3),ui("div",{class:C(["table-cell","Paused"==t.status?"careful":"ok"])},E(t.uptime),3),ui("div",Ku,E(e.$filters.number(t.cpu_percent,1)),1),ui("div",Xu,E(e.$filters.bytes(t.memory_usage)),1),ui("div",Qu,E(e.$filters.bytes(t.limit)),1),ui("div",Ju,E(e.$filters.bits(t.ior/t.io_time_since_update)),1),ui("div",Yu,E(e.$filters.bits(t.iow/t.io_time_since_update)),1),ui("div",ed,E(e.$filters.bits(t.rx/t.net_time_since_update)),1),ui("div",td,E(e.$filters.bits(t.tx/t.net_time_since_update)),1),ui("div",nd,E(t.command),1)])))),128))])])):mi("v-if",!0)}]]),sd={class:"plugin",id:"folders"},od={key:0,class:"table-row"},ad=[ui("div",{class:"table-cell text-left title"},"FOLDERS",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"Size",-1)],ld={class:"table-cell text-left"},cd=ui("div",{class:"table-cell"},null,-1);const ud={props:{data:{type:Object}},computed:{stats(){return this.data.stats.folders},folders(){return this.stats.map((e=>({path:e.path,size:e.size,careful:e.careful,warning:e.warning,critical:e.critical})))}},methods:{getDecoration(e){if(Number.isInteger(e.size))return null!==e.critical&&e.size>1e6*e.critical?"critical":null!==e.warning&&e.size>1e6*e.warning?"warning":null!==e.careful&&e.size>1e6*e.careful?"careful":"ok"}}},dd=(0,Ul.Z)(ud,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",sd,[s.folders.length>0?(Jr(),ri("div",od,ad)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.folders,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",ld,E(t.path),1),cd,ui("div",{class:C(["table-cell",s.getDecoration(t)])},E(e.$filters.bytes(t.size)),3)])))),128))])}]]),fd={class:"plugin",id:"fs"},pd={class:"table-row"},hd=ui("div",{class:"table-cell text-left title"},"FILE SYS",-1),gd={class:"table-cell"},md=ui("div",{class:"table-cell"},"Total",-1),bd={class:"table-cell text-left"},vd={key:0,class:"visible-lg-inline"},yd={class:"table-cell"};const wd={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.fs},view(){return this.data.views.fs},fileSystems(){const e=this.stats.map((e=>{let t=e.mnt_point;return t.length>22&&(t="_"+e.mnt_point.slice(-21)),{name:e.device_name,mountPoint:e.mnt_point,shortMountPoint:t,percent:e.percent,size:e.size,used:e.used,free:e.free}}));return(0,Kl.orderBy)(e,["mnt_point"])}},methods:{getDecoration(e,t){if(null!=this.view[e][t])return this.view[e][t].decoration.toLowerCase()}}},xd=(0,Ul.Z)(wd,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",fd,[ui("div",pd,[hd,ui("div",gd,[nr(ui("span",null,"Used",512),[[ws,!s.args.fs_free_space]]),nr(ui("span",null,"Free",512),[[ws,s.args.fs_free_space]])]),md]),(Jr(!0),ri(Gr,null,cr(s.fileSystems,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",bd,[hi(E(t.shortMountPoint)+" ",1),t.shortMountPoint.length<=12?(Jr(),ri("span",vd," ("+E(t.name)+") ",1)):mi("v-if",!0)]),ui("div",{class:C(["table-cell",s.getDecoration(t.mountPoint,"used")])},[nr(ui("span",null,E(e.$filters.bytes(t.used)),513),[[ws,!s.args.fs_free_space]]),nr(ui("span",null,E(e.$filters.bytes(t.free)),513),[[ws,s.args.fs_free_space]])],2),ui("div",yd,E(e.$filters.bytes(t.size)),1)])))),128))])}]]),_d={id:"gpu",class:"plugin"},kd={class:"gpu-name title"},Cd={class:"table"},Td={key:0,class:"table-row"},Sd=ui("div",{class:"table-cell text-left"},"proc:",-1),Ad={key:1,class:"table-cell"},Ed={key:1,class:"table-row"},Od=ui("div",{class:"table-cell text-left"},"mem:",-1),Id={key:1,class:"table-cell"},Ld={key:2,class:"table-row"},Pd=ui("div",{class:"table-cell text-left"},"temperature::",-1),Nd={key:1,class:"table-cell"},Dd={class:"table-cell text-left"},Md={key:1},jd={key:3},Rd={key:5};const qd={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.gpu},view(){return this.data.views.gpu},gpus(){return this.stats},name(){let e="GPU";const{stats:t}=this;return 1===t.length?e=t[0].name:t.length&&(e=`${t.length} GPU ${t[0].name}`),e},mean(){const e={proc:null,mem:null,temperature:null},{stats:t}=this;if(!t.length)return e;for(let n of t)e.proc+=n.proc,e.mem+=n.mem,e.temperature+=n.temperature;return e.proc=e.proc/t.length,e.mem=e.mem/t.length,e.temperature=e.temperature/t.length,e}},methods:{getDecoration(e,t){if(void 0!==this.view[e][t])return this.view[e][t].decoration.toLowerCase()},getMeanDecoration(e){return this.getDecoration(0,e)}}},Bd=(0,Ul.Z)(qd,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",_d,[ui("div",kd,E(s.name),1),ui("div",Cd,[s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Td,[Sd,null!=s.mean.proc?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("proc")])},E(e.$filters.number(s.mean.proc,0))+"% ",3)):mi("v-if",!0),null==s.mean.proc?(Jr(),ri("div",Ad,"N/A")):mi("v-if",!0)])):mi("v-if",!0),s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Ed,[Od,null!=s.mean.mem?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("mem")])},E(e.$filters.number(s.mean.mem,0))+"% ",3)):mi("v-if",!0),null==s.mean.mem?(Jr(),ri("div",Id,"N/A")):mi("v-if",!0)])):mi("v-if",!0),s.args.meangpu||1===s.gpus.length?(Jr(),ri("div",Ld,[Pd,null!=s.mean.temperature?(Jr(),ri("div",{key:0,class:C(["table-cell",s.getMeanDecoration("temperature")])},E(e.$filters.number(s.mean.temperature,0))+"° ",3)):mi("v-if",!0),null==s.mean.temperature?(Jr(),ri("div",Nd,"N/A")):mi("v-if",!0)])):mi("v-if",!0),!s.args.meangpu&&s.gpus.length>1?(Jr(!0),ri(Gr,{key:3},cr(s.gpus,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Dd,[hi(E(t.gpu_id)+": ",1),null!=t.proc?(Jr(),ri("span",{key:0,class:C(s.getDecoration(t.gpu_id,"proc"))},E(e.$filters.number(t.proc,0))+"% ",3)):mi("v-if",!0),null==t.proc?(Jr(),ri("span",Md,"N/A")):mi("v-if",!0),hi(" mem: "),null!=t.mem?(Jr(),ri("span",{key:2,class:C(s.getDecoration(t.gpu_id,"mem"))},E(e.$filters.number(t.mem,0))+"% ",3)):mi("v-if",!0),null==t.mem?(Jr(),ri("span",jd,"N/A")):mi("v-if",!0),hi(" temp: "),null!=t.temperature?(Jr(),ri("span",{key:4,class:C(s.getDecoration(t.gpu_id,"temperature"))},E(e.$filters.number(t.temperature,0))+"C ",3)):mi("v-if",!0),null==t.temperature?(Jr(),ri("span",Rd,"N/A")):mi("v-if",!0)])])))),128)):mi("v-if",!0)])])}]]),Ud={key:0,class:"plugin",id:"ip"},Fd={key:0,class:"title"},zd={key:1},$d={key:2,class:"title"},Hd={key:3},Vd={key:4};const Gd={props:{data:{type:Object}},computed:{ipStats(){return this.data.stats.ip},address(){return this.ipStats.address},gateway(){return this.ipStats.gateway},maskCdir(){return this.ipStats.mask_cidr},publicAddress(){return this.ipStats.public_address},publicInfo(){return this.ipStats.public_info_human}}},Wd=(0,Ul.Z)(Gd,[["render",function(e,t,n,r,i,s){return null!=s.address?(Jr(),ri("section",Ud,[null!=s.address?(Jr(),ri("span",Fd,"IP")):mi("v-if",!0),null!=s.address?(Jr(),ri("span",zd,E(s.address)+"/"+E(s.maskCdir),1)):mi("v-if",!0),null!=s.publicAddress?(Jr(),ri("span",$d,"Pub")):mi("v-if",!0),null!=s.publicAddress?(Jr(),ri("span",Hd,E(s.publicAddress),1)):mi("v-if",!0),null!=s.publicInfo?(Jr(),ri("span",Vd,E(s.publicInfo),1)):mi("v-if",!0)])):mi("v-if",!0)}]]),Zd={class:"plugin",id:"irq"},Kd={key:0,class:"table-row"},Xd=[ui("div",{class:"table-cell text-left title"},"IRQ",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"Rate/s",-1)],Qd={class:"table-cell text-left"},Jd=ui("div",{class:"table-cell"},null,-1),Yd={class:"table-cell"};const ef={props:{data:{type:Object}},computed:{stats(){return this.data.stats.irq},irqs(){return this.stats.map((e=>({irq_line:e.irq_line,irq_rate:e.irq_rate})))}}},tf=(0,Ul.Z)(ef,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Zd,[s.irqs.length>0?(Jr(),ri("div",Kd,Xd)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.irqs,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",Qd,E(e.irq_line),1),Jd,ui("div",Yd,[ui("span",null,E(e.irq_rate),1)])])))),128))])}]]),nf={key:0,id:"load",class:"plugin"},rf={class:"table"},sf={class:"table-row"},of=ui("div",{class:"table-cell text-left title"},"LOAD",-1),af={class:"table-cell"},lf={class:"table-row"},cf=ui("div",{class:"table-cell text-left"},"1 min:",-1),uf={class:"table-cell"},df={class:"table-row"},ff=ui("div",{class:"table-cell text-left"},"5 min:",-1),pf={class:"table-row"},hf=ui("div",{class:"table-cell text-left"},"15 min:",-1);const gf={props:{data:{type:Object}},computed:{stats(){return this.data.stats.load},view(){return this.data.views.load},cpucore(){return this.stats.cpucore},min1(){return this.stats.min1},min5(){return this.stats.min5},min15(){return this.stats.min15}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},mf=(0,Ul.Z)(gf,[["render",function(e,t,n,r,i,s){return null!=s.cpucore?(Jr(),ri("section",nf,[ui("div",rf,[ui("div",sf,[of,ui("div",af,E(s.cpucore)+"-core",1)]),ui("div",lf,[cf,ui("div",uf,E(e.$filters.number(s.min1,2)),1)]),ui("div",df,[ff,ui("div",{class:C(["table-cell",s.getDecoration("min5")])},E(e.$filters.number(s.min5,2)),3)]),ui("div",pf,[hf,ui("div",{class:C(["table-cell",s.getDecoration("min15")])},E(e.$filters.number(s.min15,2)),3)])])])):mi("v-if",!0)}]]),bf={id:"mem",class:"plugin"},vf={class:"table"},yf={class:"table-row"},wf=ui("div",{class:"table-cell text-left title"},"MEM",-1),xf={class:"table-cell"},_f={class:"table-row"},kf=ui("div",{class:"table-cell text-left"},"total:",-1),Cf={class:"table-cell"},Tf={class:"table-row"},Sf=ui("div",{class:"table-cell text-left"},"used:",-1),Af={class:"table-row"},Ef=ui("div",{class:"table-cell text-left"},"free:",-1),Of={class:"table-cell"};const If={props:{data:{type:Object}},computed:{stats(){return this.data.stats.mem},view(){return this.data.views.mem},percent(){return this.stats.percent},total(){return this.stats.total},used(){return this.stats.used},free(){return this.stats.free}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},Lf=(0,Ul.Z)(If,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",bf,[ui("div",vf,[ui("div",yf,[wf,ui("div",xf,E(s.percent)+"%",1)]),ui("div",_f,[kf,ui("div",Cf,E(e.$filters.bytes(s.total)),1)]),ui("div",Tf,[Sf,ui("div",{class:C(["table-cell",s.getDecoration("used")])},E(e.$filters.bytes(s.used,2)),3)]),ui("div",Af,[Ef,ui("div",Of,E(e.$filters.bytes(s.free)),1)])])])}]]),Pf={id:"mem-more",class:"plugin"},Nf={class:"table"},Df={class:"table-row"},Mf=ui("div",{class:"table-cell text-left"},"active:",-1),jf={class:"table-cell"},Rf={class:"table-row"},qf=ui("div",{class:"table-cell text-left"},"inactive:",-1),Bf={class:"table-cell"},Uf={class:"table-row"},Ff=ui("div",{class:"table-cell text-left"},"buffers:",-1),zf={class:"table-cell"},$f={class:"table-row"},Hf=ui("div",{class:"table-cell text-left"},"cached:",-1),Vf={class:"table-cell"};const Gf={props:{data:{type:Object}},computed:{stats(){return this.data.stats.mem},active(){return this.stats.active},inactive(){return this.stats.inactive},buffers(){return this.stats.buffers},cached(){return this.stats.cached}}},Wf=(0,Ul.Z)(Gf,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Pf,[ui("div",Nf,[nr(ui("div",Df,[Mf,ui("div",jf,E(e.$filters.bytes(s.active)),1)],512),[[ws,null!=s.active]]),nr(ui("div",Rf,[qf,ui("div",Bf,E(e.$filters.bytes(s.inactive)),1)],512),[[ws,null!=s.inactive]]),nr(ui("div",Uf,[Ff,ui("div",zf,E(e.$filters.bytes(s.buffers)),1)],512),[[ws,null!=s.buffers]]),nr(ui("div",$f,[Hf,ui("div",Vf,E(e.$filters.bytes(s.cached)),1)],512),[[ws,null!=s.cached]])])])}]]),Zf={id:"memswap",class:"plugin"},Kf={class:"table"},Xf={class:"table-row"},Qf=ui("div",{class:"table-cell text-left title"},"SWAP",-1),Jf={class:"table-cell"},Yf={class:"table-row"},ep=ui("div",{class:"table-cell text-left"},"total:",-1),tp={class:"table-cell"},np={class:"table-row"},rp=ui("div",{class:"table-cell text-left"},"used:",-1),ip={class:"table-row"},sp=ui("div",{class:"table-cell text-left"},"free:",-1),op={class:"table-cell"};const ap={props:{data:{type:Object}},computed:{stats(){return this.data.stats.memswap},view(){return this.data.views.memswap},percent(){return this.stats.percent},total(){return this.stats.total},used(){return this.stats.used},free(){return this.stats.free}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},lp=(0,Ul.Z)(ap,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Zf,[ui("div",Kf,[ui("div",Xf,[Qf,ui("div",Jf,E(s.percent)+"%",1)]),ui("div",Yf,[ep,ui("div",tp,E(e.$filters.bytes(s.total)),1)]),ui("div",np,[rp,ui("div",{class:C(["table-cell",s.getDecoration("used")])},E(e.$filters.bytes(s.used)),3)]),ui("div",ip,[sp,ui("div",op,E(e.$filters.bytes(s.free)),1)])])])}]]),cp={class:"plugin",id:"network"},up={class:"table-row"},dp=ui("div",{class:"table-cell text-left title"},"NETWORK",-1),fp={class:"table-cell"},pp={class:"table-cell"},hp={class:"table-cell"},gp={class:"table-cell"},mp={class:"table-cell"},bp={class:"table-cell"},vp={class:"table-cell"},yp={class:"table-cell"},wp={class:"table-cell text-left"},xp={class:"visible-lg-inline"},_p={class:"hidden-lg"},kp={class:"table-cell"},Cp={class:"table-cell"};const Tp={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.network},networks(){const e=this.stats.map((e=>{const t=void 0!==e.alias?e.alias:null;return{interfaceName:e.interface_name,ifname:t||e.interface_name,rx:e.rx,tx:e.tx,cx:e.cx,time_since_update:e.time_since_update,cumulativeRx:e.cumulative_rx,cumulativeTx:e.cumulative_tx,cumulativeCx:e.cumulative_cx}}));return(0,Kl.orderBy)(e,["interfaceName"])}}},Sp=(0,Ul.Z)(Tp,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",cp,[ui("div",up,[dp,nr(ui("div",fp,"Rx/s",512),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",pp,"Tx/s",512),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",hp,null,512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",gp,"Rx+Tx/s",512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",mp,"Rx",512),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",bp,"Tx",512),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",vp,null,512),[[ws,s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",yp,"Rx+Tx",512),[[ws,s.args.network_cumul&&s.args.network_sum]])]),(Jr(!0),ri(Gr,null,cr(s.networks,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",wp,[ui("span",xp,E(t.ifname),1),ui("span",_p,E(e.$filters.minSize(t.ifname)),1)]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.rx/t.time_since_update):e.$filters.bits(t.rx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.tx/t.time_since_update):e.$filters.bits(t.tx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",kp,null,512),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cx/t.time_since_update):e.$filters.bits(t.cx/t.time_since_update)),513),[[ws,!s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeRx):e.$filters.bits(t.cumulativeRx)),513),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeTx):e.$filters.bits(t.cumulativeTx)),513),[[ws,s.args.network_cumul&&!s.args.network_sum]]),nr(ui("div",Cp,null,512),[[ws,s.args.network_cumul&&s.args.network_sum]]),nr(ui("div",{class:"table-cell"},E(s.args.byte?e.$filters.bytes(t.cumulativeCx):e.$filters.bits(t.cumulativeCx)),513),[[ws,s.args.network_cumul&&s.args.network_sum]])])))),128))])}]]),Ap={id:"now",class:"plugin"};const Ep={props:{data:{type:Object}},computed:{value(){return this.data.stats.now}}},Op=(0,Ul.Z)(Ep,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Ap,[ui("span",null,E(s.value),1)])}]]),Ip={id:"percpu",class:"plugin"},Lp={class:"table-row"},Pp={class:"table-cell text-left title"},Np={key:0},Dp={class:"table-row"},Mp=ui("div",{class:"table-cell text-left"},"user:",-1),jp={class:"table-row"},Rp=ui("div",{class:"table-cell text-left"},"system:",-1),qp={class:"table-row"},Bp=ui("div",{class:"table-cell text-left"},"idle:",-1),Up={key:0,class:"table-row"},Fp=ui("div",{class:"table-cell text-left"},"iowait:",-1),zp={key:1,class:"table-row"},$p=ui("div",{class:"table-cell text-left"},"steal:",-1);const Hp={props:{data:{type:Object}},computed:{percpuStats(){return this.data.stats.percpu},cpusChunks(){const e=this.percpuStats.map((e=>({number:e.cpu_number,total:e.total,user:e.user,system:e.system,idle:e.idle,iowait:e.iowait,steal:e.steal})));return(0,Kl.chunk)(e,4)}},methods:{getUserAlert:e=>Ao.getAlert("percpu","percpu_user_",e.user),getSystemAlert:e=>Ao.getAlert("percpu","percpu_system_",e.system)}},Vp=(0,Ul.Z)(Hp,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Ip,[(Jr(!0),ri(Gr,null,cr(s.cpusChunks,((e,t)=>(Jr(),ri("div",{class:"table",key:t},[ui("div",Lp,[ui("div",Pp,[0===t?(Jr(),ri("span",Np,"PER CPU")):mi("v-if",!0)]),(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:"table-cell",key:t},E(e.total)+"% ",1)))),128))]),ui("div",Dp,[Mp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getUserAlert(e)]),key:t},E(e.user)+"% ",3)))),128))]),ui("div",jp,[Rp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.system)+"% ",3)))),128))]),ui("div",qp,[Bp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:"table-cell",key:t},E(e.idle)+"% ",1)))),128))]),e[0].iowait?(Jr(),ri("div",Up,[Fp,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.iowait)+"% ",3)))),128))])):mi("v-if",!0),e[0].steal?(Jr(),ri("div",zp,[$p,(Jr(!0),ri(Gr,null,cr(e,((e,t)=>(Jr(),ri("div",{class:C(["table-cell",s.getSystemAlert(e)]),key:t},E(e.steal)+"% ",3)))),128))])):mi("v-if",!0)])))),128))])}]]),Gp={class:"plugin",id:"ports"},Wp={class:"table-cell text-left"},Zp=ui("div",{class:"table-cell"},null,-1),Kp={key:0},Xp={key:1},Qp={key:2},Jp={key:3},Yp={key:0},eh={key:1},th={key:2};const nh={props:{data:{type:Object}},computed:{stats(){return this.data.stats.ports},ports(){return this.stats}},methods:{getPortDecoration:e=>null===e.status?"careful":!1===e.status?"critical":null!==e.rtt_warning&&e.status>e.rtt_warning?"warning":"ok",getWebDecoration:e=>null===e.status?"careful":-1===[200,301,302].indexOf(e.status)?"critical":null!==e.rtt_warning&&e.elapsed>e.rtt_warning?"warning":"ok"}},rh=(0,Ul.Z)(nh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Gp,[(Jr(!0),ri(Gr,null,cr(s.ports,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",Wp,[mi(" prettier-ignore "),hi(" "+E(e.$filters.minSize(t.description?t.description:t.host+" "+t.port,20)),1)]),Zp,t.host?(Jr(),ri("div",{key:0,class:C([s.getPortDecoration(t),"table-cell"])},["null"==t.status?(Jr(),ri("span",Kp,"Scanning")):"false"==t.status?(Jr(),ri("span",Xp,"Timeout")):"true"==t.status?(Jr(),ri("span",Qp,"Open")):(Jr(),ri("span",Jp,E(e.$filters.number(1e3*t.status,0))+"ms",1))],2)):mi("v-if",!0),t.url?(Jr(),ri("div",{key:1,class:C([s.getWebDecoration(t),"table-cell"])},["null"==t.status?(Jr(),ri("span",Yp,"Scanning")):"Error"==t.status?(Jr(),ri("span",eh,"Error")):(Jr(),ri("span",th,"Code "+E(t.status),1))],2)):mi("v-if",!0)])))),128))])}]]),ih={key:0},sh={key:1},oh={key:0,class:"row"},ah={class:"col-lg-18"};const lh={id:"amps",class:"plugin"},ch={class:"table"},uh={key:0,class:"table-cell text-left"},dh=["innerHTML"];const fh={props:{data:{type:Object}},computed:{stats(){return this.data.stats.amps},processes(){return this.stats.filter((e=>null!==e.result))}},methods:{getNameDecoration(e){const t=e.count,n=e.countmin,r=e.countmax;let i="ok";return i=t>0?(null===n||t>=n)&&(null===r||t<=r)?"ok":"careful":null===n?"ok":"critical",i}}},ph=(0,Ul.Z)(fh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",lh,[ui("div",ch,[(Jr(!0),ri(Gr,null,cr(s.processes,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",{class:C(["table-cell text-left",s.getNameDecoration(t)])},E(t.name),3),t.regex?(Jr(),ri("div",uh,E(t.count),1)):mi("v-if",!0),ui("div",{class:"table-cell text-left process-result",innerHTML:e.$filters.nl2br(t.result)},null,8,dh)])))),128))])])}]]),hh={id:"processcount",class:"plugin"},gh=ui("span",{class:"title"},"TASKS",-1),mh={class:"title"};const bh={props:{data:{type:Object},sorter:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.processcount},total(){return this.stats.total||0},running(){return this.stats.running||0},sleeping(){return this.stats.sleeping||0},stopped(){return this.stats.stopped||0},thread(){return this.stats.thread||0}}},vh=(0,Ul.Z)(bh,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",hh,[gh,ui("span",null,E(s.total)+" ("+E(s.thread)+" thr),",1),ui("span",null,E(s.running)+" run,",1),ui("span",null,E(s.sleeping)+" slp,",1),ui("span",null,E(s.stopped)+" oth",1),ui("span",null,E(s.args.programs?"Programs":"Threads"),1),ui("span",mh,E(n.sorter.auto?"sorted automatically":"sorted"),1),ui("span",null,"by "+E(n.sorter.getColumnLabel(n.sorter.column)),1)])}]]),yh={id:"processlist-plugin",class:"plugin"},wh={class:"table"},xh={class:"table-row"},_h=ui("div",{class:"table-cell hidden-xs hidden-sm"},"VIRT",-1),kh=ui("div",{class:"table-cell hidden-xs hidden-sm"},"RES",-1),Ch=ui("div",{class:"table-cell"},"PID",-1),Th=ui("div",{class:"table-cell"},"NI",-1),Sh=ui("div",{class:"table-cell"},"S",-1),Ah={class:"table-cell hidden-xs hidden-sm"},Eh={class:"table-cell hidden-xs hidden-sm"},Oh={class:"table-cell"},Ih={class:"table-cell text-left"},Lh={key:0,class:"table-cell hidden-xs hidden-sm"},Ph={key:1,class:"table-cell hidden-xs hidden-sm"},Nh={class:"table-cell text-left hidden-xs hidden-sm"};const Dh={props:{data:{type:Object},sorter:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},config(){return this.store.config||{}},stats(){return this.data.stats.processlist},processes(){const{sorter:e}=this,t=this.data.stats.isWindows,n=(this.stats||[]).map((e=>(e.memvirt="?",e.memres="?",e.memory_info&&(e.memvirt=e.memory_info[1],e.memres=e.memory_info[0]),e.timeplus="?",e.timemillis="?",e.cpu_times&&(e.timeplus=qu(e.cpu_times),e.timemillis=Ru(e.cpu_times)),null===e.num_threads&&(e.num_threads=-1),null===e.cpu_percent&&(e.cpu_percent=-1),null===e.memory_percent&&(e.memory_percent=-1),e.io_read=null,e.io_write=null,e.io_counters&&(e.io_read=(e.io_counters[0]-e.io_counters[2])/e.time_since_update,e.io_write=(e.io_counters[1]-e.io_counters[3])/e.time_since_update),e.isNice=void 0!==e.nice&&(t&&32!=e.nice||!t&&0!=e.nice),Array.isArray(e.cmdline)&&(e.cmdline=e.cmdline.join(" ").replace(/\n/g," ")),null===e.cmdline&&(e.cmdline=e.name),t&&null!==e.username&&(e.username=(0,Kl.last)(e.username.split("\\"))),e)));return(0,Kl.orderBy)(n,[e.column].reduce(((e,t)=>("io_counters"===t&&(t=["io_read","io_write"]),e.concat(t))),[]),[e.isReverseColumn(e.column)?"desc":"asc"]).slice(0,this.limit)},ioReadWritePresent(){return(this.stats||[]).some((({io_counters:e})=>e))},limit(){return void 0!==this.config.outputs?this.config.outputs.max_processes_display:void 0}},methods:{getCpuPercentAlert:e=>Ao.getAlert("processlist","processlist_cpu_",e.cpu_percent),getMemoryPercentAlert:e=>Ao.getAlert("processlist","processlist_mem_",e.cpu_percent)}},Mh={components:{GlancesPluginAmps:ph,GlancesPluginProcesscount:vh,GlancesPluginProcesslist:(0,Ul.Z)(Dh,[["render",function(e,t,n,r,i,s){return Jr(),ri(Gr,null,[mi(" prettier-ignore "),ui("section",yh,[ui("div",wh,[ui("div",xh,[ui("div",{class:C(["table-cell",["sortable","cpu_percent"===n.sorter.column&&"sort"]]),onClick:t[0]||(t[0]=t=>e.$emit("update:sorter","cpu_percent"))}," CPU% ",2),ui("div",{class:C(["table-cell",["sortable","memory_percent"===n.sorter.column&&"sort"]]),onClick:t[1]||(t[1]=t=>e.$emit("update:sorter","memory_percent"))}," MEM% ",2),_h,kh,Ch,ui("div",{class:C(["table-cell text-left",["sortable","username"===n.sorter.column&&"sort"]]),onClick:t[2]||(t[2]=t=>e.$emit("update:sorter","username"))}," USER ",2),ui("div",{class:C(["table-cell hidden-xs hidden-sm",["sortable","timemillis"===n.sorter.column&&"sort"]]),onClick:t[3]||(t[3]=t=>e.$emit("update:sorter","timemillis"))}," TIME+ ",2),ui("div",{class:C(["table-cell text-left hidden-xs hidden-sm",["sortable","num_threads"===n.sorter.column&&"sort"]]),onClick:t[4]||(t[4]=t=>e.$emit("update:sorter","num_threads"))}," THR ",2),Th,Sh,nr(ui("div",{class:C(["table-cell hidden-xs hidden-sm",["sortable","io_counters"===n.sorter.column&&"sort"]]),onClick:t[5]||(t[5]=t=>e.$emit("update:sorter","io_counters"))}," IOR/s ",2),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:C(["table-cell text-left hidden-xs hidden-sm",["sortable","io_counters"===n.sorter.column&&"sort"]]),onClick:t[6]||(t[6]=t=>e.$emit("update:sorter","io_counters"))}," IOW/s ",2),[[ws,s.ioReadWritePresent]]),ui("div",{class:C(["table-cell text-left",["sortable","name"===n.sorter.column&&"sort"]]),onClick:t[7]||(t[7]=t=>e.$emit("update:sorter","name"))}," Command ",2)]),(Jr(!0),ri(Gr,null,cr(s.processes,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",{class:C(["table-cell",s.getCpuPercentAlert(t)])},E(-1==t.cpu_percent?"?":e.$filters.number(t.cpu_percent,1)),3),ui("div",{class:C(["table-cell",s.getMemoryPercentAlert(t)])},E(-1==t.memory_percent?"?":e.$filters.number(t.memory_percent,1)),3),ui("div",Ah,E(e.$filters.bytes(t.memvirt)),1),ui("div",Eh,E(e.$filters.bytes(t.memres)),1),ui("div",Oh,E(t.pid),1),ui("div",Ih,E(t.username),1),"?"!=t.timeplus?(Jr(),ri("div",Lh,[nr(ui("span",{class:"highlight"},E(t.timeplus.hours)+"h",513),[[ws,t.timeplus.hours>0]]),hi(" "+E(e.$filters.leftPad(t.timeplus.minutes,2,"0"))+":"+E(e.$filters.leftPad(t.timeplus.seconds,2,"0"))+" ",1),nr(ui("span",null,"."+E(e.$filters.leftPad(t.timeplus.milliseconds,2,"0")),513),[[ws,t.timeplus.hours<=0]])])):mi("v-if",!0),"?"==t.timeplus?(Jr(),ri("div",Ph,"?")):mi("v-if",!0),ui("div",Nh,E(-1==t.num_threads?"?":t.num_threads),1),ui("div",{class:C(["table-cell",{nice:t.isNice}])},E(e.$filters.exclamation(t.nice)),3),ui("div",{class:C(["table-cell",{status:"R"==t.status}])},E(t.status),3),nr(ui("div",{class:"table-cell hidden-xs hidden-sm"},E(e.$filters.bytes(t.io_read)),513),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:"table-cell text-left hidden-xs hidden-sm"},E(e.$filters.bytes(t.io_write)),513),[[ws,s.ioReadWritePresent]]),nr(ui("div",{class:"table-cell text-left"},E(t.name),513),[[ws,s.args.process_short_name]]),nr(ui("div",{class:"table-cell text-left"},E(t.cmdline),513),[[ws,!s.args.process_short_name]])])))),128))])])],2112)}]])},props:{data:{type:Object}},data:()=>({store:Co,sorter:void 0}),computed:{args(){return this.store.args||{}},sortProcessesKey(){return this.args.sort_processes_key}},watch:{sortProcessesKey:{immediate:!0,handler(e){e&&!["cpu_percent","memory_percent","username","timemillis","num_threads","io_counters","name"].includes(e)||(this.sorter={column:this.args.sort_processes_key||"cpu_percent",auto:!this.args.sort_processes_key,isReverseColumn:function(e){return!["username","name"].includes(e)},getColumnLabel:function(e){return{io_counters:"disk IO",cpu_percent:"CPU consumption",memory_percent:"memory consumption",cpu_times:"process time",username:"user name",name:"process name",timemillis:"process time",None:"None"}[e]||e}})}}}},jh=(0,Ul.Z)(Mh,[["render",function(e,t,n,r,i,s){const o=sr("glances-plugin-processcount"),a=sr("glances-plugin-amps"),l=sr("glances-plugin-processlist");return s.args.disable_process?(Jr(),ri("div",ih,"PROCESSES DISABLED (press 'z' to display)")):(Jr(),ri("div",sh,[di(o,{sorter:i.sorter,data:n.data},null,8,["sorter","data"]),s.args.disable_amps?mi("v-if",!0):(Jr(),ri("div",oh,[ui("div",ah,[di(a,{data:n.data},null,8,["data"])])])),di(l,{sorter:i.sorter,data:n.data,"onUpdate:sorter":t[0]||(t[0]=e=>s.args.sort_processes_key=e)},null,8,["sorter","data"])]))}]]),Rh={id:"quicklook",class:"plugin"},qh={class:"cpu-name"},Bh={class:"table"},Uh={key:0,class:"table-row"},Fh=ui("div",{class:"table-cell text-left"},"CPU",-1),zh={class:"table-cell"},$h={class:"progress"},Hh=["aria-valuenow"],Vh={class:"table-cell"},Gh={class:"table-cell text-left"},Wh={class:"table-cell"},Zh={class:"progress"},Kh=["aria-valuenow"],Xh={class:"table-cell"},Qh={class:"table-row"},Jh=ui("div",{class:"table-cell text-left"},"MEM",-1),Yh={class:"table-cell"},eg={class:"progress"},tg=["aria-valuenow"],ng={class:"table-cell"},rg={class:"table-row"},ig=ui("div",{class:"table-cell text-left"},"SWAP",-1),sg={class:"table-cell"},og={class:"progress"},ag=["aria-valuenow"],lg={class:"table-cell"};const cg={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.quicklook},view(){return this.data.views.quicklook},mem(){return this.stats.mem},cpu(){return this.stats.cpu},cpu_name(){return this.stats.cpu_name},cpu_hz_current(){return this.stats.cpu_hz_current},cpu_hz(){return this.stats.cpu_hz},swap(){return this.stats.swap},percpus(){return this.stats.percpu.map((({cpu_number:e,total:t})=>({number:e,total:t})))}},methods:{getDecoration(e){if(void 0!==this.view[e])return this.view[e].decoration.toLowerCase()}}},ug=(0,Ul.Z)(cg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Rh,[ui("div",qh,E(s.cpu_name),1),ui("div",Bh,[s.args.percpu?mi("v-if",!0):(Jr(),ri("div",Uh,[Fh,ui("div",zh,[ui("div",$h,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("cpu")}`),role:"progressbar","aria-valuenow":s.cpu,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.cpu}%;`)},"   ",14,Hh)])]),ui("div",Vh,E(s.cpu)+"%",1)])),s.args.percpu?(Jr(!0),ri(Gr,{key:1},cr(s.percpus,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",Gh,"CPU"+E(e.number),1),ui("div",Wh,[ui("div",Zh,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("cpu")}`),role:"progressbar","aria-valuenow":e.total,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${e.total}%;`)},"   ",14,Kh)])]),ui("div",Xh,E(e.total)+"%",1)])))),128)):mi("v-if",!0),ui("div",Qh,[Jh,ui("div",Yh,[ui("div",eg,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("mem")}`),role:"progressbar","aria-valuenow":s.mem,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.mem}%;`)},"   ",14,tg)])]),ui("div",ng,E(s.mem)+"%",1)]),ui("div",rg,[ig,ui("div",sg,[ui("div",og,[ui("div",{class:C(`progress-bar progress-bar-${s.getDecoration("swap")}`),role:"progressbar","aria-valuenow":s.swap,"aria-valuemin":"0","aria-valuemax":"100",style:y(`width: ${s.swap}%;`)},"   ",14,ag)])]),ui("div",lg,E(s.swap)+"%",1)])])])}]]),dg={class:"plugin",id:"raid"},fg={key:0,class:"table-row"},pg=[ui("div",{class:"table-cell text-left title"},"RAID disks",-1),ui("div",{class:"table-cell"},"Used",-1),ui("div",{class:"table-cell"},"Total",-1)],hg={class:"table-cell text-left"},gg={class:"warning"};const mg={props:{data:{type:Object}},computed:{stats(){return this.data.stats.raid},disks(){const e=Object.entries(this.stats).map((([e,t])=>{const n=Object.entries(t.components).map((([e,t])=>({number:t,name:e})));return{name:e,type:null==t.type?"UNKNOWN":t.type,used:t.used,available:t.available,status:t.status,degraded:t.used0}},methods:{getAlert:e=>e.inactive?"critical":e.degraded?"warning":"ok"}},bg=(0,Ul.Z)(mg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",dg,[s.hasDisks?(Jr(),ri("div",fg,pg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.disks,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",hg,[hi(E(e.type.toUppercase())+" "+E(e.name)+" ",1),nr(ui("div",gg,"└─ Degraded mode",512),[[ws,e.degraded]]),nr(ui("div",null,"   └─ "+E(e.config),513),[[ws,e.degraded]]),nr(ui("div",{class:"critical"},"└─ Status "+E(e.status),513),[[ws,e.inactive]]),e.inactive?(Jr(!0),ri(Gr,{key:0},cr(e.components,((t,n)=>(Jr(),ri("div",{key:n},"    "+E(n===e.components.length-1?"└─":"├─")+" disk "+E(t.number)+": "+E(t.name),1)))),128)):mi("v-if",!0)]),nr(ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.used),3),[[ws,!e.inactive]]),nr(ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.available),3),[[ws,!e.inactive]])])))),128))])}]]),vg={class:"plugin",id:"sensors"},yg={key:0,class:"table-row"},wg=[ui("div",{class:"table-cell text-left title"},"SENSORS",-1)],xg={class:"table-cell text-left"},_g={class:"table-cell"};const kg={props:{data:{type:Object}},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},stats(){return this.data.stats.sensors},sensors(){return this.stats.filter((e=>!(Array.isArray(e.value)&&0===e.value.length||0===e.value))).map((e=>(this.args.fahrenheit&&"battery"!=e.type&&"fan_speed"!=e.type&&(e.value=parseFloat(1.8*e.value+32).toFixed(1),e.unit="F"),e)))}},methods:{getAlert(e){const t="battery"==e.type?100-e.value:e.value;return Ao.getAlert("sensors","sensors_"+e.type+"_",t)}}},Cg=(0,Ul.Z)(kg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",vg,[s.sensors.length>0?(Jr(),ri("div",yg,wg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.sensors,((e,t)=>(Jr(),ri("div",{class:"table-row",key:t},[ui("div",xg,E(e.label),1),ui("div",_g,E(e.unit),1),ui("div",{class:C(["table-cell",s.getAlert(e)])},E(e.value),3)])))),128))])}]]),Tg={class:"plugin",id:"system"},Sg={key:0,class:"critical"},Ag={class:"title"},Eg={key:1,class:"hidden-xs hidden-sm"},Og={key:2,class:"hidden-xs hidden-sm"};const Ig={props:{data:{type:Object}},data:()=>({store:Co}),computed:{stats(){return this.data.stats.system},isLinux(){return this.data.isLinux},hostname(){return this.stats.hostname},platform(){return this.stats.platform},os(){return{name:this.stats.os_name,version:this.stats.os_version}},humanReadableName(){return this.stats.hr_name},isDisconnected(){return"FAILURE"===this.store.status}}},Lg=(0,Ul.Z)(Ig,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Tg,[s.isDisconnected?(Jr(),ri("span",Sg,"Disconnected from")):mi("v-if",!0),ui("span",Ag,E(s.hostname),1),s.isLinux?(Jr(),ri("span",Eg," ("+E(s.humanReadableName)+" / "+E(s.os.name)+" "+E(s.os.version)+") ",1)):mi("v-if",!0),s.isLinux?mi("v-if",!0):(Jr(),ri("span",Og," ("+E(s.os.name)+" "+E(s.os.version)+" "+E(s.platform)+") ",1))])}]]),Pg={class:"plugin",id:"uptime"};const Ng={props:{data:{type:Object}},computed:{value(){return this.data.stats.uptime}}},Dg=(0,Ul.Z)(Ng,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Pg,[ui("span",null,"Uptime: "+E(s.value),1)])}]]),Mg={class:"plugin",id:"wifi"},jg={key:0,class:"table-row"},Rg=[ui("div",{class:"table-cell text-left title"},"WIFI",-1),ui("div",{class:"table-cell"},null,-1),ui("div",{class:"table-cell"},"dBm",-1)],qg={class:"table-cell text-left"},Bg={key:0},Ug=ui("div",{class:"table-cell"},null,-1);const Fg={props:{data:{type:Object}},computed:{stats(){return this.data.stats.wifi},view(){return this.data.views.wifi},hotspots(){const e=this.stats.map((e=>{if(""!==e.ssid)return{ssid:e.ssid,encrypted:e.encrypted,signal:e.signal,encryption_type:e.encryption_type}})).filter(Boolean);return(0,Kl.orderBy)(e,["ssid"])}},methods:{getDecoration(e,t){if(void 0!==this.view[e.ssid][t])return this.view[e.ssid][t].decoration.toLowerCase()}}},zg={components:{GlancesHelp:Fl,GlancesPluginAlert:Ql,GlancesPluginCloud:tc,GlancesPluginConnections:Cc,GlancesPluginCpu:vu,GlancesPluginDiskio:Uu,GlancesPluginDocker:id,GlancesPluginFolders:dd,GlancesPluginFs:xd,GlancesPluginGpu:Bd,GlancesPluginIp:Wd,GlancesPluginIrq:tf,GlancesPluginLoad:mf,GlancesPluginMem:Lf,GlancesPluginMemMore:Wf,GlancesPluginMemswap:lp,GlancesPluginNetwork:Sp,GlancesPluginNow:Op,GlancesPluginPercpu:Vp,GlancesPluginPorts:rh,GlancesPluginProcess:jh,GlancesPluginQuicklook:ug,GlancesPluginRaid:bg,GlancesPluginSensors:Cg,GlancesPluginSystem:Lg,GlancesPluginUptime:Dg,GlancesPluginWifi:(0,Ul.Z)(Fg,[["render",function(e,t,n,r,i,s){return Jr(),ri("section",Mg,[s.hotspots.length>0?(Jr(),ri("div",jg,Rg)):mi("v-if",!0),(Jr(!0),ri(Gr,null,cr(s.hotspots,((t,n)=>(Jr(),ri("div",{class:"table-row",key:n},[ui("div",qg,[hi(E(e.$filters.limitTo(t.ssid,20))+" ",1),t.encrypted?(Jr(),ri("span",Bg,E(t.encryption_type),1)):mi("v-if",!0)]),Ug,ui("div",{class:C(["table-cell",s.getDecoration(t,"signal")])},E(t.signal),3)])))),128))])}]])},data:()=>({store:Co}),computed:{args(){return this.store.args||{}},data(){return this.store.data||{}},dataLoaded(){return void 0!==this.store.data},hasGpu(){return this.store.data.stats.gpu.length>0},isLinux(){return this.store.data.isLinux},title(){const{data:e}=this,t=e.stats&&e.stats.system&&e.stats.system.hostname||"";return t?`${t} - Glances`:"Glances"}},watch:{title(){document&&(document.title=this.title)}},methods:{setupHotKeys(){wo("a",(()=>{this.store.args.sort_processes_key=null})),wo("c",(()=>{this.store.args.sort_processes_key="cpu_percent"})),wo("m",(()=>{this.store.args.sort_processes_key="memory_percent"})),wo("u",(()=>{this.store.args.sort_processes_key="username"})),wo("p",(()=>{this.store.args.sort_processes_key="name"})),wo("i",(()=>{this.store.args.sort_processes_key="io_counters"})),wo("t",(()=>{this.store.args.sort_processes_key="timemillis"})),wo("shift+A",(()=>{this.store.args.disable_amps=!this.store.args.disable_amps})),wo("d",(()=>{this.store.args.disable_diskio=!this.store.args.disable_diskio})),wo("shift+Q",(()=>{this.store.args.enable_irq=!this.store.args.enable_irq})),wo("f",(()=>{this.store.args.disable_fs=!this.store.args.disable_fs})),wo("j",(()=>{this.store.args.programs=!this.store.args.programs})),wo("k",(()=>{this.store.args.disable_connections=!this.store.args.disable_connections})),wo("n",(()=>{this.store.args.disable_network=!this.store.args.disable_network})),wo("s",(()=>{this.store.args.disable_sensors=!this.store.args.disable_sensors})),wo("2",(()=>{this.store.args.disable_left_sidebar=!this.store.args.disable_left_sidebar})),wo("z",(()=>{this.store.args.disable_process=!this.store.args.disable_process})),wo("/",(()=>{this.store.args.process_short_name=!this.store.args.process_short_name})),wo("shift+D",(()=>{this.store.args.disable_docker=!this.store.args.disable_docker})),wo("b",(()=>{this.store.args.byte=!this.store.args.byte})),wo("shift+B",(()=>{this.store.args.diskio_iops=!this.store.args.diskio_iops})),wo("l",(()=>{this.store.args.disable_alert=!this.store.args.disable_alert})),wo("1",(()=>{this.store.args.percpu=!this.store.args.percpu})),wo("h",(()=>{this.store.args.help_tag=!this.store.args.help_tag})),wo("shift+T",(()=>{this.store.args.network_sum=!this.store.args.network_sum})),wo("shift+U",(()=>{this.store.args.network_cumul=!this.store.args.network_cumul})),wo("shift+F",(()=>{this.store.args.fs_free_space=!this.store.args.fs_free_space})),wo("3",(()=>{this.store.args.disable_quicklook=!this.store.args.disable_quicklook})),wo("6",(()=>{this.store.args.meangpu=!this.store.args.meangpu})),wo("shift+G",(()=>{this.store.args.disable_gpu=!this.store.args.disable_gpu})),wo("5",(()=>{this.store.args.disable_quicklook=!this.store.args.disable_quicklook,this.store.args.disable_cpu=!this.store.args.disable_cpu,this.store.args.disable_mem=!this.store.args.disable_mem,this.store.args.disable_memswap=!this.store.args.disable_memswap,this.store.args.disable_load=!this.store.args.disable_load,this.store.args.disable_gpu=!this.store.args.disable_gpu})),wo("shift+I",(()=>{this.store.args.disable_ip=!this.store.args.disable_ip})),wo("shift+P",(()=>{this.store.args.disable_ports=!this.store.args.disable_ports})),wo("shift+W",(()=>{this.store.args.disable_wifi=!this.store.args.disable_wifi}))}},mounted(){const e=window.__GLANCES__||{},t=isFinite(e["refresh-time"])?parseInt(e["refresh-time"],10):void 0;Eo.init(t),this.setupHotKeys()},beforeUnmount(){wo.unbind()}};const $g=((...e)=>{const t=Cs().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=Ts(e);if(!r)return;const i=t._component;H(i)||i.render||i.template||(i.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t})((0,Ul.Z)(zg,[["render",function(e,t,n,r,i,s){const o=sr("glances-help"),a=sr("glances-plugin-system"),l=sr("glances-plugin-ip"),c=sr("glances-plugin-uptime"),u=sr("glances-plugin-cloud"),d=sr("glances-plugin-quicklook"),f=sr("glances-plugin-cpu"),p=sr("glances-plugin-percpu"),h=sr("glances-plugin-gpu"),g=sr("glances-plugin-mem"),m=sr("glances-plugin-mem-more"),b=sr("glances-plugin-memswap"),v=sr("glances-plugin-load"),y=sr("glances-plugin-network"),w=sr("glances-plugin-connections"),x=sr("glances-plugin-wifi"),_=sr("glances-plugin-ports"),k=sr("glances-plugin-diskio"),C=sr("glances-plugin-fs"),T=sr("glances-plugin-irq"),S=sr("glances-plugin-folders"),A=sr("glances-plugin-raid"),E=sr("glances-plugin-sensors"),O=sr("glances-plugin-now"),I=sr("glances-plugin-docker"),L=sr("glances-plugin-process"),P=sr("glances-plugin-alert");return s.dataLoaded?s.args.help_tag?(Jr(),ii(o,{key:1})):(Jr(),ri("main",Es,[ui("div",Os,[ui("div",Is,[ui("div",Ls,[ui("div",Ps,[di(a,{data:s.data},null,8,["data"])]),s.args.disable_ip?mi("v-if",!0):(Jr(),ri("div",Ns,[di(l,{data:s.data},null,8,["data"])])),ui("div",Ds,[di(c,{data:s.data},null,8,["data"])])])])]),ui("div",Ms,[ui("div",js,[ui("div",Rs,[ui("div",qs,[di(u,{data:s.data},null,8,["data"])])])]),ui("div",Bs,[s.args.disable_quicklook?mi("v-if",!0):(Jr(),ri("div",Us,[di(d,{data:s.data},null,8,["data"])])),s.args.disable_cpu||s.args.percpu?mi("v-if",!0):(Jr(),ri("div",Fs,[di(f,{data:s.data},null,8,["data"])])),!s.args.disable_cpu&&s.args.percpu?(Jr(),ri("div",zs,[di(p,{data:s.data},null,8,["data"])])):mi("v-if",!0),!s.args.disable_gpu&&s.hasGpu?(Jr(),ri("div",$s,[di(h,{data:s.data},null,8,["data"])])):mi("v-if",!0),s.args.disable_mem?mi("v-if",!0):(Jr(),ri("div",Hs,[di(g,{data:s.data},null,8,["data"])])),mi(" NOTE: display if MEM enabled and GPU disabled "),s.args.disable_mem||!s.args.disable_gpu&&s.hasGpu?mi("v-if",!0):(Jr(),ri("div",Vs,[di(m,{data:s.data},null,8,["data"])])),s.args.disable_memswap?mi("v-if",!0):(Jr(),ri("div",Gs,[di(b,{data:s.data},null,8,["data"])])),s.args.disable_load?mi("v-if",!0):(Jr(),ri("div",Ws,[di(v,{data:s.data},null,8,["data"])]))])]),ui("div",Zs,[ui("div",Ks,[s.args.disable_left_sidebar?mi("v-if",!0):(Jr(),ri("div",Xs,[ui("div",Qs,[s.args.disable_network?mi("v-if",!0):(Jr(),ii(y,{key:0,id:"plugin-network",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.isLinux&&!s.args.disable_connections?(Jr(),ii(w,{key:1,id:"plugin-connections",class:"plugin table-row-group",data:s.data},null,8,["data"])):mi("v-if",!0),s.args.disable_wifi?mi("v-if",!0):(Jr(),ii(x,{key:2,id:"plugin-wifi",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_ports?mi("v-if",!0):(Jr(),ii(_,{key:3,id:"plugin-ports",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_diskio?mi("v-if",!0):(Jr(),ii(k,{key:4,id:"plugin-diskio",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_fs?mi("v-if",!0):(Jr(),ii(C,{key:5,id:"plugin-fs",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.enable_irq?(Jr(),ii(T,{key:6,id:"plugin-irq",class:"plugin table-row-group",data:s.data},null,8,["data"])):mi("v-if",!0),s.args.disable_folders?mi("v-if",!0):(Jr(),ii(S,{key:7,id:"plugin-folders",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.raid?mi("v-if",!0):(Jr(),ii(A,{key:8,id:"plugin-raid",class:"plugin table-row-group",data:s.data},null,8,["data"])),s.args.disable_sensors?mi("v-if",!0):(Jr(),ii(E,{key:9,id:"plugin-sensors",class:"plugin table-row-group",data:s.data},null,8,["data"])),di(O,{data:s.data},null,8,["data"])])])),ui("div",Js,[s.args.disable_docker?mi("v-if",!0):(Jr(),ii(I,{key:0,data:s.data},null,8,["data"])),di(L,{data:s.data},null,8,["data"]),s.args.disable_alert?mi("v-if",!0):(Jr(),ii(P,{key:1,data:s.data},null,8,["data"]))])])])])):(Jr(),ri("div",Ss,As))}]]));$g.config.globalProperties.$filters=e,$g.mount("#app")})()})(); \ No newline at end of file diff --git a/glances/plugins/glances_cloud.py b/glances/plugins/glances_cloud.py index 75840aa8..955425a4 100644 --- a/glances/plugins/glances_cloud.py +++ b/glances/plugins/glances_cloud.py @@ -10,7 +10,8 @@ """Cloud plugin. Supported Cloud API: -- OpenStack meta data (class ThreadOpenStack, see below): AWS, OVH... +- OpenStack meta data (class ThreadOpenStack) - Vanilla OpenStack +- OpenStackEC2 meta data (class ThreadOpenStackEC2) - Amazon EC2 compatible """ import threading @@ -53,13 +54,16 @@ class Plugin(GlancesPlugin): # Init thread to grab OpenStack stats asynchronously self.OPENSTACK = ThreadOpenStack() + self.OPENSTACKEC2 = ThreadOpenStackEC2() # Run the thread self.OPENSTACK.start() + self.OPENSTACKEC2.start() def exit(self): """Overwrite the exit method to close threads.""" self.OPENSTACK.stop() + self.OPENSTACKEC2.stop() # Call the father class super(Plugin, self).exit() @@ -80,12 +84,15 @@ class Plugin(GlancesPlugin): # Update the stats if self.input_method == 'local': stats = self.OPENSTACK.stats + if not stats: + stats = self.OPENSTACKEC2.stats # Example: - # Uncomment to test on physical computer - # stats = {'ami-id': 'ami-id', - # 'instance-id': 'instance-id', - # 'instance-type': 'instance-type', - # 'region': 'placement/availability-zone'} + # Uncomment to test on physical computer (only for test purpose) + # stats = {'id': 'ami-id', + # 'name': 'My VM', + # 'type': 'Gold', + # 'region': 'France', + # 'platform': 'OpenStack'} # Update the stats self.stats = stats @@ -101,13 +108,14 @@ class Plugin(GlancesPlugin): return ret # Generate the output - if 'instance-type' in self.stats and 'instance-id' in self.stats and 'region' in self.stats: - msg = 'Cloud ' - ret.append(self.curse_add_line(msg, "TITLE")) - msg = '{} instance {} ({})'.format( - self.stats['instance-type'], self.stats['instance-id'], self.stats['region'] - ) - ret.append(self.curse_add_line(msg)) + msg = self.stats.get('platform', 'Unknown') + ret.append(self.curse_add_line(msg, "TITLE")) + msg = ' {} instance {} ({})'.format( + self.stats.get('type', 'Unknown'), + self.stats.get('name', 'Unknown'), + self.stats.get('region', 'Unknown') + ) + ret.append(self.curse_add_line(msg)) # Return the message with decoration # logger.info(ret) @@ -121,13 +129,19 @@ class ThreadOpenStack(threading.Thread): stats is a dict """ + # The metadata service provides a way for instances to retrieve + # instance-specific data via a REST API. Instances access this + # service at 169.254.169.254 or at fe80::a9fe:a9fe. + # All types of metadata, be it user-, nova- or vendor-provided, + # can be accessed via this service. # https://docs.openstack.org/nova/latest/user/metadata-service.html - OPENSTACK_API_URL = 'http://169.254.169.254/latest/meta-data' + OPENSTACK_PLATFORM = "OpenStack" + OPENSTACK_API_URL = 'http://169.254.169.254/openstack/latest/meta-data' OPENSTACK_API_METADATA = { - 'ami-id': 'ami-id', - 'instance-id': 'instance-id', - 'instance-type': 'instance-type', - 'region': 'placement/availability-zone', + 'id': 'project_id', + 'name': 'name', + 'type': 'meta/role', + 'region': 'availability_zone', } def __init__(self): @@ -159,6 +173,9 @@ class ThreadOpenStack(threading.Thread): else: if r.ok: self._stats[k] = to_ascii(r.content) + else: + # No break during the loop, so we can set the platform + self._stats['platform'] = self.OPENSTACK_PLATFORM return True @@ -180,3 +197,26 @@ class ThreadOpenStack(threading.Thread): def stopped(self): """Return True is the thread is stopped.""" return self._stopper.is_set() + + +class ThreadOpenStackEC2(ThreadOpenStack): + """ + Specific thread to grab OpenStack EC2 (Amazon cloud) stats. + + stats is a dict + """ + + # The metadata service provides a way for instances to retrieve + # instance-specific data via a REST API. Instances access this + # service at 169.254.169.254 or at fe80::a9fe:a9fe. + # All types of metadata, be it user-, nova- or vendor-provided, + # can be accessed via this service. + # https://docs.openstack.org/nova/latest/user/metadata-service.html + OPENSTACK_PLATFORM = "Amazon EC2" + OPENSTACK_API_URL = 'http://169.254.169.254/latest/meta-data' + OPENSTACK_API_METADATA = { + 'id': 'ami-id', + 'name': 'instance-id', + 'type': 'instance-type', + 'region': 'placement/availability-zone', + } From 7a60fcd010e5d5c6228632945b346542915bd4e3 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 11 Mar 2023 11:13:23 +0100 Subject: [PATCH 16/18] Links to documents in sample glances.conf are not valid. #2271 --- conf/glances.conf | 10 +++++----- docker-compose/glances.conf | 13 +++++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/conf/glances.conf b/conf/glances.conf index 8057a7be..b273e5ea 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -237,12 +237,12 @@ critical=90 #allow=shm [irq] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/irq.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/irq.html # This plugin is disabled by default disable=True [folders] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/folders.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/folders.html disable=False # Define a folder list to monitor # The list is composed of items (list_#nb <= 10) @@ -264,17 +264,17 @@ disable=False #folder_4_path=/root [cloud] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/cloud.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/cloud.html # This plugin is disabled by default disable=True [raid] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/raid.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/raid.html # This plugin is disabled by default disable=True [smart] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/smart.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/smart.html # This plugin is disabled by default disable=True diff --git a/docker-compose/glances.conf b/docker-compose/glances.conf index 78cb3174..d666b01a 100644 --- a/docker-compose/glances.conf +++ b/docker-compose/glances.conf @@ -237,12 +237,12 @@ critical=90 #allow=shm [irq] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/irq.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/irq.html # This plugin is disabled by default disable=True [folders] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/folders.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/folders.html disable=False # Define a folder list to monitor # The list is composed of items (list_#nb <= 10) @@ -263,13 +263,18 @@ disable=False #folder_3_path=/nonexisting #folder_4_path=/root +[cloud] +# Documentation: https://glances.readthedocs.io/en/latest/aoa/cloud.html +# This plugin is disabled by default +disable=True + [raid] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/raid.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/raid.html # This plugin is disabled by default disable=True [smart] -# Documentation: https://glances.readthedocs.io/en/stable/aoa/smart.html +# Documentation: https://glances.readthedocs.io/en/latest/aoa/smart.html # This plugin is disabled by default disable=True From bca45ca43e5ff18930f4156c4364e68fd6c2cdde Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 11 Mar 2023 17:32:13 +0100 Subject: [PATCH 17/18] Add documentation --- docs/_static/processlist-extended.png | Bin 0 -> 63154 bytes docs/aoa/ps.rst | 12 +- docs/api.rst | 516 ++++++++++++-------------- 3 files changed, 250 insertions(+), 278 deletions(-) create mode 100644 docs/_static/processlist-extended.png diff --git a/docs/_static/processlist-extended.png b/docs/_static/processlist-extended.png new file mode 100644 index 0000000000000000000000000000000000000000..a45f7c0ada3c368502aafd7c27d0e9b91b335d9d GIT binary patch literal 63154 zcmc$`WpG?gvMnkLEw-2?i{rM??SAfy+n+aZ zM?neYuYX=%UyVZl^s$^o)SZ-UO`Kfy9gIOtZEUTLX&nt6jE!v^&1{`6!MgcCK)!=W z2n#5?Wt?reI-#oI^z3Y%6~*a%4@CZcx5-UGAtUfBnni$X4oTq)QUcK&H$@I=B3Vhc zVggm>4B?NjBtOIjsR*Nt>bbWFpgWC{Xb5*-GnfxCGddl|*SVQ5H(Sd=s06jghAE*HBKZJ*OU17SN|A|#FE&N{?qg;p#urD7W9AHhT=;6zi7JH zojR3B#S1lG6*xIQH5yUOA>Xwj&v&YYUrs}AB9}TPbfh^8F$k)GB4|`&#y=@A?4k40 z$AZrim*uQ&T;YyfN|2kl`(t$}0P|g^HDhfn=+ED{?i1fW*^<1@*))~X;5lNI#BlOv z#h%+thpAr9k94F-l*$YEi0Y8w|dR;JjMr* z7l}7XWA=sL4&8NImowRY471qz8FfRzeVEWUFTS=@(-pdxD{*71P>Sl9TFxQoxBAS+ zoS*ubOfRC|k+w5?3c@-JTj}p^qdnnRQ!c(+4zWKDxf#O5 zDJM5+Zx$+K-k^@-jbyk&*3t=jzs;mBxaU5SF*ath`of(~7HrI>WYr{F=Qd-u+u<%g zdW%O;l8bv%gc;lcK2ZWB`Q2a&>P~^|m^Yqz58n7ZI@bsjPc|&h#29l;K&C3pNg9=F z1nI1`Uw9h`y99;@A(Q%WJC8B1`RUiRy3*M{*1~-V zTyhjtbRE{#cMb*vtWtP0(L(S!iqTA|oUlfRd9fA8ln7t?=u~C1dSi-#49$l;5gwLM zC~Fyn$(xxbx^y`q5c5-M(nIjfujZ=8V*HKfH>^-5?7a`r(-anSs=>=233$~$$*)$amS<&Z74#)f14xccbg}Q%S(#@UbTZ>{?w+~ErJ{`r%uVNzz7)~LrD@srz z_?*oHi?{b-skJ)RlCuf}7OIuRN*Uu~-xWu8heGNe?tH#{DQKL?W}#LuKFIh03_i5+ z?dSTPFtKK;JGKpM&wQ!&sY~jQ?Xv6VId>)$a~HM&f;T_t2%%Qso>V>}B!fe=;0VBQ z6$?>MtP$xpb%`fqUl-oMswO&*7V>6vpjBO@!FczhAhN;g%K8?eS23(+zcb|}Feh=d5>=+{AolD7gp(%YTb^@;ps zCL;#XBVy!P?eJz&NApOwO?t==q#Vra4a69-%iJ1@%%AuT0f)7jqD|b4bPLKbn56xv$!%CZFlEP7}yP^SyNjYpVtKcQZ|zeQh^|Gk+3H$`MPX)BLn`)P=r=2KqZ zK8Eu6Fp4sZ0qpIym;w5lM>&tpSG4^nXn}Uu2<+*;=1@N_r-^3p=Am{`HNMn+%6Y}p z0hFxR@u*TA_M(=xgvyse7`00;j#v7^;RNsXTKnE&7pP#LhM#c{yhk7Bg~{51pD9)+ z7=QL=9c))0BDgO6_t|ux&!2 ziLuzjMVJ^w!g^xKg(Ylo{oB=bvekGfi8?1oj+{pySeXox=7Y5iW4dycmHNQY&%0D* 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 Date: Sun, 12 Mar 2023 09:08:12 +0100 Subject: [PATCH 18/18] Ubuntu is back as additional Docker images. Alpine stays the default one. Related to #2185 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbf905ab..cbe49e79 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,7 +96,7 @@ jobs: strategy: fail-fast: false matrix: - os: ['alpine'] + os: ['alpine', 'ubuntu'] tag: ${{ fromJson(needs.create_Docker_builds.outputs.tags) }} steps: - name: Checkout