From 03a8aedc53e8ee743b2f014d5541e96a02983b6b Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Sat, 13 Sep 2014 15:39:14 +0200 Subject: Ready to start the 2.1.1 release ! --- glances/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/__init__.py b/glances/__init__.py index 2ca51a14..3fedb3d2 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -20,7 +20,7 @@ """Init the Glances software.""" __appname__ = 'glances' -__version__ = '2.1' +__version__ = '2.1.1_BETA' __author__ = 'Nicolas Hennion ' __license__ = 'LGPL' -- cgit v1.2.3 From ff10056508036b573a32686f9e522e65e6102611 Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Mon, 15 Sep 2014 18:10:13 +0200 Subject: Correct PsUtil issue on proc.memory_maps() - Issue #413 --- glances/core/glances_processes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py index 3d75cbdd..97bb5726 100644 --- a/glances/core/glances_processes.py +++ b/glances/core/glances_processes.py @@ -276,6 +276,9 @@ class GlancesProcesses(object): pass except psutil.AccessDenied: procstat['memory_swap'] = None + except: + # Add a dirty except to handle the PsUtil issue #413 + procstat['memory_swap'] = None # Process network connections (TCP and UDP) try: -- cgit v1.2.3 From 4521f2aa0b74b8a23b17860cd8faf989dc1229d8 Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Mon, 15 Sep 2014 19:06:12 +0200 Subject: Automaticaly compute top processes number for the current screen - issue #408 --- conf/glances-test.conf | 4 ---- conf/glances.conf | 4 ---- glances/core/glances_processes.py | 3 --- glances/core/glances_standalone.py | 10 ++-------- glances/outputs/glances_curses.py | 15 ++++++++++++++- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/conf/glances-test.conf b/conf/glances-test.conf index fef896ec..9ca9175a 100644 --- a/conf/glances-test.conf +++ b/conf/glances-test.conf @@ -96,10 +96,6 @@ core 0_alias=CPU Core 0 core 1_alias=CPU Core 1 [processlist] -# Maximum number of processes to show in the UI -# Note: Only limit number of showed processes (not the one returned by the API) -# Default is 20 processes (Top 20) -max_processes=20 # Limit values for CPU/MEM per process in % # Default values if not defined: 50/70/90 cpu_careful=50 diff --git a/conf/glances.conf b/conf/glances.conf index c0dbb077..b571aed5 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -96,10 +96,6 @@ battery_critical=95 #core 1_alias=CPU Core 1 [processlist] -# Maximum number of processes to show in the UI -# Note: Only limit number of showed processes (not the one returned by the API) -# Default is 20 processes (Top 20) -max_processes=20 # Limit values for CPU/MEM per process in % # Default values if not defined: 50/70/90 cpu_careful=50 diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py index 97bb5726..fb4cefa4 100644 --- a/glances/core/glances_processes.py +++ b/glances/core/glances_processes.py @@ -66,9 +66,6 @@ class GlancesProcesses(object): self.process_filter = None self.process_filter_re = None - # !!! ONLY FOR TEST - # self.set_process_filter('.*python.*') - def enable(self): """Enable process stats.""" self.disable_tag = False diff --git a/glances/core/glances_standalone.py b/glances/core/glances_standalone.py index a6586f6b..4fe860da 100644 --- a/glances/core/glances_standalone.py +++ b/glances/core/glances_standalone.py @@ -34,14 +34,8 @@ class GlancesStandalone(object): # Init stats self.stats = GlancesStats(config=config, args=args) - # If configured, set the maximum processes number to display - try: - max_processes = int(self.stats.get_plugin('processlist').get_conf_value('max_processes')) - logger.debug(_("Limit maximum displayed processes to %s") % max_processes) - except: - max_processes = None - logger.warning(_("Maximum displayed processes is not configured (high CPU consumption)")) - glances_processes.set_max_processes(max_processes) + # Default number of processes to displayed is set to 20 + glances_processes.set_max_processes(20) # If process extended stats is disabled by user if args.disable_process_extended: diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index 9c592964..33454af6 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -383,6 +383,7 @@ class GlancesCurses(object): # Update the stats messages ########################### + # Update the client server status self.args.cs_status = cs_status stats_system = stats.get_plugin('system').get_stats_display(args=self.args) @@ -400,10 +401,22 @@ class GlancesCurses(object): stats_sensors = stats.get_plugin('sensors').get_stats_display(args=self.args) stats_now = stats.get_plugin('now').get_stats_display() stats_processcount = stats.get_plugin('processcount').get_stats_display(args=self.args) - stats_processlist = stats.get_plugin('processlist').get_stats_display(args=self.args) stats_monitor = stats.get_plugin('monitor').get_stats_display(args=self.args) stats_alert = stats.get_plugin('alert').get_stats_display(args=self.args) + # Adapt number of processes to the available space + max_processes_displayed = screen_y - 11 - self.get_stats_display_height(stats_alert) + if not self.args.disable_process_extended: + max_processes_displayed -= 4 + if max_processes_displayed < 0: + max_processes_displayed = 0 + if glances_processes.get_max_processes() is None or \ + glances_processes.get_max_processes() != max_processes_displayed: + logger.debug(_("Set number of displayed processes to %s") % max_processes_displayed) + glances_processes.set_max_processes(max_processes_displayed) + + stats_processlist = stats.get_plugin('processlist').get_stats_display(args=self.args) + # Display the stats on the curses interface ########################################### -- cgit v1.2.3 From 1818c4fbed8d6e6a3fa74a8d4ccecf0d2d4211ba Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Fri, 19 Sep 2014 11:59:46 +0200 Subject: Add try/except for NoSuchProcess error - issue #421 --- glances/core/glances_processes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py index fb4cefa4..ef1490e9 100644 --- a/glances/core/glances_processes.py +++ b/glances/core/glances_processes.py @@ -155,7 +155,7 @@ class GlancesProcesses(object): # Patch for issue #391 try: self.cmdline_cache[procstat['pid']] = ' '.join(proc.cmdline()) - except (AttributeError, psutil.AccessDenied, UnicodeDecodeError): + except (AttributeError, UnicodeDecodeError, psutil.AccessDenied, psutil.NoSuchProcess): self.cmdline_cache[procstat['pid']] = "" procstat['cmdline'] = self.cmdline_cache[procstat['pid']] -- cgit v1.2.3 From 57569b23f326647f567a8668a910148f8239457c Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Fri, 19 Sep 2014 13:26:10 +0200 Subject: Change HTTPlib name for Python 3.4 - issue #419 --- glances/core/glances_client.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/glances/core/glances_client.py b/glances/core/glances_client.py index faf70ae1..a0e76bf1 100644 --- a/glances/core/glances_client.py +++ b/glances/core/glances_client.py @@ -25,9 +25,14 @@ import socket import sys try: from xmlrpc.client import Transport, ServerProxy, ProtocolError, Fault -except ImportError: # Python 2 +except ImportError: + # Python 2 from xmlrpclib import Transport, ServerProxy, ProtocolError, Fault -import httplib +try: + import http.client as httplib +except: + # Python 2 + import httplib # Import Glances libs from glances.core.glances_globals import version, logger -- cgit v1.2.3 From d50f49eb893438c708d395df012fc854f0e43229 Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Tue, 30 Sep 2014 22:29:31 +0200 Subject: Correct issue on Mac OS X running in non root (issue #423) --- glances/core/glances_processes.py | 47 ++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py index ef1490e9..d67de058 100644 --- a/glances/core/glances_processes.py +++ b/glances/core/glances_processes.py @@ -318,7 +318,7 @@ class GlancesProcesses(object): processdict = {} for proc in psutil.process_iter(): # If self.get_max_processes() is None: Only retreive mandatory stats - # Else: retreive mandatoryadn standard stast + # Else: retreive mandatory and standard stats s = self.__get_process_stats(proc, mandatory_stats=True, standard_stats=self.get_max_processes() is None) @@ -348,14 +348,28 @@ class GlancesProcesses(object): except: pass + # Process optimization + # Only retreive stats for visible processes (get_max_processes) if self.get_max_processes() is not None: # Sort the internal dict and cut the top N (Return a list of tuple) # tuple=key (proc), dict (returned by __get_process_stats) - processiter = sorted(processdict.items(), key=lambda x: x[1][self.getsortkey()], reverse=True) - first = True - for i in processiter[0:self.get_max_processes()]: - # Already existing mandatory stats - procstat = i[1] + try: + processiter = sorted(processdict.items(), key=lambda x: x[1][self.getsortkey()], reverse=True) + except TypeError: + # Fallback to all process (issue #423) + processloop = processdict.items() + first = False + else: + processloop = processiter[0:self.get_max_processes()] + first = True + else: + # Get all processes stats + processloop = processdict.items() + first = False + for i in processloop: + # Already existing mandatory stats + procstat = i[1] + if self.get_max_processes() is not None: # Update with standard stats # and extended stats but only for TOP (first) process s = self.__get_process_stats(i[0], @@ -365,21 +379,12 @@ class GlancesProcesses(object): if s is None: continue procstat.update(s) - # Add a specific time_since_update stats for bitrate - procstat['time_since_update'] = time_since_update - # Update process list - self.processlist.append(procstat) - # Next... - first = False - else: - # Get all the processes - for i in processdict.items(): - # Already existing mandatory and standard stats - procstat = i[1] - # Add a specific time_since_update stats for bitrate - procstat['time_since_update'] = time_since_update - # Update process list - self.processlist.append(procstat) + # Add a specific time_since_update stats for bitrate + procstat['time_since_update'] = time_since_update + # Update process list + self.processlist.append(procstat) + # Next... + first = False # Clean internals caches if timeout is reached if self.cache_timer.finished(): -- cgit v1.2.3 From 5ff1caa0513d6dcaa86142cd9143624fedeed8f5 Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Wed, 1 Oct 2014 09:07:39 +0200 Subject: Another patch for non root user on Mac OS X - issue #423 --- glances/plugins/glances_processlist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 269a7e4f..37e6507c 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -343,7 +343,7 @@ class Plugin(GlancesPlugin): listsorted = sorted(self.stats, key=lambda process: process[sortedby], reverse=sortedreverse) - except KeyError: + except KeyError, TypeError: listsorted = sorted(self.stats, key=lambda process: process['name'], reverse=False) -- cgit v1.2.3 From a296f5cea9ce5c28eb7af66d1708bae492ccc8b1 Mon Sep 17 00:00:00 2001 From: Nicolas Hennion Date: Wed, 1 Oct 2014 14:11:32 +0200 Subject: Another patch bis for non root user on Mac OS X - issue #423 --- glances/plugins/glances_processlist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py index 37e6507c..fca5e6f8 100644 --- a/glances/plugins/glances_processlist.py +++ b/glances/plugins/glances_processlist.py @@ -343,7 +343,7 @@ class Plugin(GlancesPlugin): listsorted = sorted(self.stats, key=lambda process: process[sortedby], reverse=sortedreverse) - except KeyError, TypeError: + except (KeyError, TypeError): listsorted = sorted(self.stats, key=lambda process: process['name'], reverse=False) -- cgit v1.2.3 From ef158378d365c21ecb70f1c5eb76118101a98751 Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Thu, 2 Oct 2014 21:20:39 +0200 Subject: version 2.1.1 --- NEWS | 15 +++++++++++++++ docs/glances-doc.html | 4 ++-- docs/glances-doc.rst | 4 ++-- glances/__init__.py | 2 +- man/glances.1 | 2 +- requirements.txt | 2 +- setup.py | 4 ++-- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index 0d17adf7..01b911a8 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,21 @@ Glances Version 2.x ============================================================================== +Version 2.1.1 +============= + +Enhancement: + * Automaticaly compute top processes number for the current screen (issue #408) + * CPU and Memory footprint optimization (issue #401) + +Bugs corrected: + + * Mac OS X 10.9: Exception at start (issue #423) + * Process no longer exists (issue #421) + * Error with Glances Client with Python 3.4.1 (issue #419) + * TypeError: memory_maps() takes exactly 2 arguments (issue #413) + * No filesystem informations since Glances 2.0 bug enhancement (issue #381) + Version 2.1 =========== diff --git a/docs/glances-doc.html b/docs/glances-doc.html index 32501916..719e69e3 100644 --- a/docs/glances-doc.html +++ b/docs/glances-doc.html @@ -123,9 +123,9 @@ td.option-group {

Glances

-

This manual describes Glances version 2.1.

+

This manual describes Glances version 2.1.1.

Copyright © 2012-2014 Nicolas Hennion <nicolas@nicolargo.com>

-

September 2014

+

October 2014

Table of Contents

    diff --git a/docs/glances-doc.rst b/docs/glances-doc.rst index 7f5f0b63..a2b1932e 100644 --- a/docs/glances-doc.rst +++ b/docs/glances-doc.rst @@ -2,11 +2,11 @@ Glances ======= -This manual describes *Glances* version 2.1. +This manual describes *Glances* version 2.1.1. Copyright © 2012-2014 Nicolas Hennion -September 2014 +October 2014 .. contents:: Table of Contents diff --git a/glances/__init__.py b/glances/__init__.py index 3fedb3d2..18b9743a 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -20,7 +20,7 @@ """Init the Glances software.""" __appname__ = 'glances' -__version__ = '2.1.1_BETA' +__version__ = '2.1.1' __author__ = 'Nicolas Hennion ' __license__ = 'LGPL' diff --git a/man/glances.1 b/man/glances.1 index c2389d83..d8cd2951 100644 --- a/man/glances.1 +++ b/man/glances.1 @@ -1,4 +1,4 @@ -.TH glances 1 "September, 2014" "version 2.1" "USER COMMANDS" +.TH glances 1 "October, 2014" "version 2.1.1" "USER COMMANDS" .SH NAME glances \- A cross-platform curses-based system monitoring tool .SH SYNOPSIS diff --git a/requirements.txt b/requirements.txt index b7a63a89..52546a76 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -psutil==2.1.1 +psutil==2.1.3 diff --git a/setup.py b/setup.py index 1ef63962..9013a503 100755 --- a/setup.py +++ b/setup.py @@ -40,13 +40,13 @@ def get_requires(): setup( name='Glances', - version='2.1', + version='2.1.1', description="A cross-platform curses-based monitoring tool", long_description=open('README.rst').read(), author='Nicolas Hennion', author_email='nicolas@nicolargo.com', url='https://github.com/nicolargo/glances', - # download_url='https://s3.amazonaws.com/glances/glances-2.1.tar.gz', + # download_url='https://s3.amazonaws.com/glances/glances-2.1.1.tar.gz', license="LGPL", keywords="cli curses monitoring system", install_requires=get_requires(), -- cgit v1.2.3