diff options
Diffstat (limited to 'glances/outputs/glances_curses.py')
-rw-r--r-- | glances/outputs/glances_curses.py | 252 |
1 files changed, 7 insertions, 245 deletions
diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index 4d5934c8..f86f1175 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -2,7 +2,7 @@ # # This file is part of Glances. # -# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com> +# Copyright (C) 2016 Nicolargo <nicolas@nicolargo.com> # # Glances is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by @@ -846,7 +846,7 @@ class _GlancesCurses(object): else: # Display the popup popup.refresh() - curses.napms(duration * 1000) + self.wait(duration * 1000) return True def display_plugin(self, plugin_stats, @@ -986,10 +986,14 @@ class _GlancesCurses(object): # Redraw display self.flush(stats, cs_status=cs_status) # Wait 100ms... - curses.napms(100) + self.wait() return exitkey + def wait(self, delay=100): + """Wait delay in ms""" + curses.napms(100) + def get_stats_display_width(self, curse_msg, without_option=False): """Return the width of the formatted curses message. @@ -1036,248 +1040,6 @@ class GlancesCursesClient(_GlancesCurses): pass -class GlancesCursesBrowser(_GlancesCurses): - - """Class for the Glances curse client browser.""" - - def __init__(self, args=None): - # Init the father class - super(GlancesCursesBrowser, self).__init__(args=args) - - _colors_list = { - 'UNKNOWN': self.no_color, - 'SNMP': self.default_color2, - 'ONLINE': self.default_color2, - 'OFFLINE': self.ifCRITICAL_color2, - 'PROTECTED': self.ifWARNING_color2, - } - self.colors_list.update(_colors_list) - - # First time scan tag - # Used to display a specific message when the browser is started - self.first_scan = True - - # Init refresh time - self.__refresh_time = args.time - - # Init the cursor position for the client browser - self.cursor_position = 0 - - # Active Glances server number - self._active_server = None - - @property - def active_server(self): - """Return the active server or None if it's the browser list.""" - return self._active_server - - @active_server.setter - def active_server(self, index): - """Set the active server or None if no server selected.""" - self._active_server = index - - @property - def cursor(self): - """Get the cursor position.""" - return self.cursor_position - - @cursor.setter - def cursor(self, position): - """Set the cursor position.""" - self.cursor_position = position - - def cursor_up(self, servers_list): - """Set the cursor to position N-1 in the list.""" - if self.cursor_position > 0: - self.cursor_position -= 1 - else: - self.cursor_position = len(servers_list) - 1 - - def cursor_down(self, servers_list): - """Set the cursor to position N-1 in the list.""" - if self.cursor_position < len(servers_list) - 1: - self.cursor_position += 1 - else: - self.cursor_position = 0 - - def __catch_key(self, servers_list): - # Catch the browser pressed key - self.pressedkey = self.get_key(self.term_window) - - # Actions... - if self.pressedkey == ord('\x1b') or self.pressedkey == ord('q'): - # 'ESC'|'q' > Quit - self.end() - logger.info("Stop Glances client browser") - sys.exit(0) - elif self.pressedkey == 10: - # 'ENTER' > Run Glances on the selected server - logger.debug("Server number {0} selected".format(self.cursor + 1)) - self.active_server = self.cursor - elif self.pressedkey == 259: - # 'UP' > Up in the server list - self.cursor_up(servers_list) - elif self.pressedkey == 258: - # 'DOWN' > Down in the server list - self.cursor_down(servers_list) - - # Return the key code - return self.pressedkey - - def update(self, servers_list): - """Update the servers' list screen. - - Wait for __refresh_time sec / catch key every 100 ms. - - servers_list: Dict of dict with servers stats - """ - # Flush display - logger.debug('Servers list: {0}'.format(servers_list)) - self.flush(servers_list) - - # Wait - exitkey = False - countdown = Timer(self.__refresh_time) - while not countdown.finished() and not exitkey: - # Getkey - pressedkey = self.__catch_key(servers_list) - # Is it an exit or select server key ? - exitkey = ( - pressedkey == ord('\x1b') or pressedkey == ord('q') or pressedkey == 10) - if not exitkey and pressedkey > -1: - # Redraw display - self.flush(servers_list) - # Wait 100ms... - curses.napms(100) - - return self.active_server - - def flush(self, servers_list): - """Update the servers' list screen. - - servers_list: List of dict with servers stats - """ - self.erase() - self.display(servers_list) - - def display(self, servers_list): - """Display the servers list. - - Return: - True if the stats have been displayed - False if the stats have not been displayed (no server available) - """ - # Init the internal line/column for Glances Curses - self.init_line_column() - - # Get the current screen size - screen_x = self.screen.getmaxyx()[1] - screen_y = self.screen.getmaxyx()[0] - - # Init position - x = 0 - y = 0 - - # Display top header - if len(servers_list) == 0: - if self.first_scan and not self.args.disable_autodiscover: - msg = 'Glances is scanning your network. Please wait...' - self.first_scan = False - else: - msg = 'No Glances server available' - elif len(servers_list) == 1: - msg = 'One Glances server available' - else: - msg = '{0} Glances servers available'.format(len(servers_list)) - if self.args.disable_autodiscover: - msg += ' ' + '(auto discover is disabled)' - self.term_window.addnstr(y, x, - msg, - screen_x - x, - self.colors_list['TITLE']) - - if len(servers_list) == 0: - return False - - # Display the Glances server list - # ================================ - - # Table of table - # Item description: [stats_id, column name, column size] - column_def = [ - ['name', 'Name', 16], - ['alias', None, None], - ['load_min5', 'LOAD', 6], - ['cpu_percent', 'CPU%', 5], - ['mem_percent', 'MEM%', 5], - ['status', 'STATUS', 9], - ['ip', 'IP', 15], - # ['port', 'PORT', 5], - ['hr_name', 'OS', 16], - ] - y = 2 - - # Display table header - xc = x + 2 - for cpt, c in enumerate(column_def): - if xc < screen_x and y < screen_y and c[1] is not None: - self.term_window.addnstr(y, xc, - c[1], - screen_x - x, - self.colors_list['BOLD']) - xc += c[2] + self.space_between_column - y += 1 - - # If a servers has been deleted from the list... - # ... and if the cursor is in the latest position - if self.cursor > len(servers_list) - 1: - # Set the cursor position to the latest item - self.cursor = len(servers_list) - 1 - - # Display table - line = 0 - for v in servers_list: - # Get server stats - server_stat = {} - for c in column_def: - try: - server_stat[c[0]] = v[c[0]] - except KeyError as e: - logger.debug( - "Cannot grab stats {0} from server (KeyError: {1})".format(c[0], e)) - server_stat[c[0]] = '?' - # Display alias instead of name - try: - if c[0] == 'alias' and v[c[0]] is not None: - server_stat['name'] = v[c[0]] - except KeyError: - pass - - # Display line for server stats - cpt = 0 - xc = x - - # Is the line selected ? - if line == self.cursor: - # Display cursor - self.term_window.addnstr( - y, xc, ">", screen_x - xc, self.colors_list['BOLD']) - - # Display the line - xc += 2 - for c in column_def: - if xc < screen_x and y < screen_y and c[1] is not None: - # Display server stats - self.term_window.addnstr( - y, xc, format(server_stat[c[0]]), c[2], self.colors_list[v['status']]) - xc += c[2] + self.space_between_column - cpt += 1 - # Next line, next server... - y += 1 - line += 1 - - return True - if not WINDOWS: class GlancesTextbox(Textbox, object): |