Merge tag 'v2.0' into develop

Release 2.0
This commit is contained in:
Nicolargo 2014-06-14 09:44:23 +02:00
commit 5f0508252b
113 changed files with 2652 additions and 16747 deletions

6
.gitignore vendored
View File

@ -37,3 +37,9 @@ local.properties
# ctags
.tags*
# Lang
glances.pot
# Sphinx
_build

50
NEWS
View File

@ -1,3 +1,12 @@
<<<<<<< HEAD
Version 1.7.7
=============
* Fix CVS export [issue #348]
* Adapt to PSUtil 2.1.1
* Compatibility with Python 3.4
* Improve German update
=======
==============================================================================
Glances Version 2.x
==============================================================================
@ -62,6 +71,40 @@ Version 2.0
Glances Version 1.x
==============================================================================
Version 1.7.7
=============
* Fix CVS export [issue #348]
* Adapt to PSUtil 2.1.1
* Compatibility with Python 3.4
* Improve German update
>>>>>>> release/v2.0
Version 1.7.6
=============
<<<<<<< HEAD
* Adapt to psutil 2.0.0 API
* Fixed psutil 0.5.x support on Windows
* Fix help screen in 80x24 terminal size
* Implement toggle of process list display ('z' key)
=======
* Adapt to psutil 2.0.0 API
* Fixed psutil 0.5.x support on Windows
* Fix help screen in 80x24 terminal size
* Implement toggle of process list display ('z' key)
>>>>>>> release/v2.0
Version 1.7.5
=============
<<<<<<< HEAD
* Force the Pypi installer to use the PsUtil branch 1.x (#333)
=======
* Force the Pypi installer to use the PsUtil branch 1.x (#333)
>>>>>>> release/v2.0
Version 1.7.4
=============
@ -116,13 +159,14 @@ Version 1.7
* Add a uninstall script
* Add getNetTimeSinceLastUpdate() getDiskTimeSinceLastUpdate() and getProcessDiskTimeSinceLastUpdate() in the API
* Add more translation: Italien, Chinese
* and last but not least... up to 100 hundred bugs corrected / software and docs improvments
* and last but not least... up to 100 hundred bugs corrected / software and
* docs improvements
Version 1.6.1
=============
* Add per-user settings (configuration file) support
* Add -z/--nobold option for better appearence under Solarized terminal
* Add -z/--nobold option for better appearance under Solarized terminal
* Key 'u' shows cumulative net traffic
* Work in improving autoUnit
* Take into account the number of core in the CPU process limit
@ -263,7 +307,7 @@ Version 1.3.4
Version 1.3.3
=============
* Automaticaly swith between process short and long name
* Automatically swith between process short and long name
* Center the host / system information
* Always put the hour/date in the bottom/right
* Correct a bug if there is a lot of Disk/IO

View File

@ -18,7 +18,8 @@ Glances - An eye on your system
.. image:: https://raw.github.com/nicolargo/glances/master/docs/images/glances-white-256.png
:width: 128
**Glances** is a cross-platform curses-based system monitoring tool written in Python.
**Glances** is a cross-platform curses-based system monitoring tool
written in Python.
It uses the `psutil`_ library to get information from your system.
@ -27,16 +28,29 @@ It uses the `psutil`_ library to get information from your system.
Requirements
============
<<<<<<< HEAD
- ``python >= 2.6`` (tested with version 2.6, 2.7, 3.2, 3.3, 3.4)
- ``psutil >= 0.5.1`` (recommended version >= 2.0.0)
=======
- ``python >= 2.6`` (tested with version 2.6, 2.7, 3.3, 3.4)
- ``psutil >= 2.0.0``
>>>>>>> release/v2.0
- ``setuptools``
Optional dependencies:
- ``bottle`` (for Web Server mode)
- ``py3sensors`` (for hardware monitoring support) [Linux-only]
<<<<<<< HEAD
- ``jinja2`` (for HTML output)
- ``pysensors`` (for HW monitoring support) [Linux-only]
- ``hddtemp`` (for HDD temperature monitoring support)
- ``batinfo`` (for battery monitoring support) [Linux-only]
=======
- ``bottle`` (for Web server mode)
- ``py3sensors`` (for hardware monitoring support) [Linux-only]
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
- ``batinfo`` (for battery monitoring support) [Linux-only]
- ``pysnmp`` (for SNMP support)
>>>>>>> release/v2.0
Installation
============
@ -44,7 +58,8 @@ Installation
PyPI: The simple way
--------------------
Glances is on `PyPI`_. By using Pypi, you are sure to have the latest stable version.
Glances is on `PyPI`_. By using PyPI, you are sure to have the latest
stable version.
To install, simply use `pip`_:
@ -52,8 +67,13 @@ To install, simply use `pip`_:
pip install Glances
*Note*: Python headers are required to install PSutil. For example,
<<<<<<< HEAD
*Note*: Python headers are required to install psutil.
For example, on Debian/Ubuntu you need to install first the *python-dev* package.
=======
*Note*: Python headers are required to install psutil. For example,
on Debian/Ubuntu you need to install first the *python-dev* package.
>>>>>>> release/v2.0
To upgrade Glances to the latest version:
@ -64,7 +84,11 @@ To upgrade Glances to the latest version:
GNU/Linux
---------
<<<<<<< HEAD
At the moment, packages exist for the following distributions:
=======
At the moment, packages exist for the following GNU/Linux distributions:
>>>>>>> release/v2.0
- Arch Linux
- Debian (Testing/Sid)
@ -121,9 +145,21 @@ MacPorts
Windows
-------
<<<<<<< HEAD
Glances proposes a Windows client based on the `colorconsole`_ Python library.
Glances version < 1.7.2 only works in server mode.
To install Glances on Windows OS, you have to follow these steps:
Thanks to Nicolas Bourges, a Windows installer is available:
- Glances-1.7.2-win32.msi_ (32-bit, MD5: dba4f6cc9f47b6806ffaeb665c093270)
Otherwise, you have to follow these steps:
=======
Glances proposes a Windows client based on the `colorconsole`_ Python
library.
To install Glances on Windows, you have to follow these steps:
>>>>>>> release/v2.0
- Install Python for Windows: http://www.python.org/getit/
- Install the psutil library: https://pypi.python.org/pypi?:action=display&name=psutil#downloads
@ -142,8 +178,13 @@ To install Glances version X.Y from source:
$ cd glances-*
# python setup.py install
<<<<<<< HEAD
*Note*: Python headers are required to install psutil.
For example, on Debian/Ubuntu you need to install first the *python-dev* package.
=======
*Note*: Python headers are required to install psutil. For example,
on Debian/Ubuntu you need to install first the *python-dev* package.
>>>>>>> release/v2.0
Puppet
------
@ -166,7 +207,7 @@ For the Web server mode, run:
$ glances -w
and enter the URL http://<ip>:61208 in your favorite Web Browser.
and enter the URL ``http://<ip>:61208`` in your favorite web browser.
For the client/server mode, run:
@ -206,7 +247,6 @@ LGPL. See ``COPYING`` for more details.
.. _pip: http://www.pip-installer.org/
.. _Homebrew: http://brew.sh/
.. _MacPorts: https://www.macports.org/
.. _Glances-1.7.2-win32.msi: http://glances.s3.amazonaws.com/Glances-1.7.2-win32.msi
.. _colorconsole: https://pypi.python.org/pypi/colorconsole
.. _Puppet: https://puppetlabs.com/puppet/what-is-puppet/
.. _glances-doc: https://github.com/nicolargo/glances/blob/master/docs/glances-doc.rst

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +0,0 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 88f9709ac94d939db26f5322044ea5df
tags: fbb0d17656682115ca4d033fb2f83ba1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -1,529 +0,0 @@
=======
Glances
=======
This manual describes *Glances* version 1.7.3.
Copyright © 2012-2013 Nicolas Hennion <nicolas@nicolargo.com>
November 2013
.. contents:: Table of Contents
Introduction
============
Glances is a cross-platform curses-based monitoring tool which aims to
present a maximum of information in a minimum of space, ideally to fit
in a classical 80x24 terminal or higher to have additional information.
Glances can adapt dynamically the displayed information depending on the
terminal size. It can also work in a client/server mode for remote monitoring.
Glances is written in Python and uses the `psutil`_ library to get information from your system.
Console (80x24)
.. image:: images/screenshot.png
Full view (>80x24)
.. image:: images/screenshot-wide.png
Usage
=====
Standalone mode
---------------
Simply run:
.. code-block:: console
$ glances
Client/Server mode
------------------
If you want to remotely monitor a machine, called ``server``, from another one, called ``client``,
just run on the server:
.. code-block:: console
server$ glances -s
and on the client:
.. code-block:: console
client$ glances -c @server
where ``@server`` is the IP address or hostname of the server.
In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``.
In client mode, you can set the TCP port of the server ``-p PORT``.
Default binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``.
In client/server mode, limits are set by the server side.
You can also set a password to access to the server ``-P password``.
Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to all IPv6 addresses.
Command reference
=================
Command-line options
--------------------
-b Display network rate in Byte per second (default: bit per second)
-B IP Bind server to the given IPv4/IPv6 address or hostname
-c IP Connect to a Glances server by IPv4/IPv6 address or hostname
-C FILE Path to the configuration file
-d Disable disk I/O module
-e Enable sensors module (requires pysensors, Linux-only)
-f FILE Set the HTML output folder or CSV file
-h Display the help and exit
-m Disable mount module
-n Disable network module
-o OUTPUT Define additional output (available: HTML or CSV)
-p PORT Define the client/server TCP port (default: 61209)
-P PASSWORD Define a client/server password
--password Define a client/server password from the prompt
-r Disable process list (for low CPU consumption)
-s Run Glances in server mode
-t SECONDS Set refresh time in seconds (default: 3 sec)
-v Display the version and exit
-y Enable hddtemp module (requires hddtemp)
-z Do not use the bold color attribute
-1 Start Glances in per-CPU mode
Interactive commands
--------------------
The following commands (key pressed) are supported while in Glances:
``a``
Sort process list automatically
- If CPU iowait ``>60%``, sort processes by I/O read and write
- If CPU ``>70%``, sort processes by CPU usage
- If MEM ``>70%``, sort processes by memory usage
``b``
Switch between bit/s or Byte/s for network I/O
``c``
Sort processes by CPU usage
``d``
Show/hide disk I/O stats
``f``
Show/hide file system stats
``h``
Show/hide the help screen
``i``
Sort processes by I/O rate (may need root privileges on some OSes)
``l``
Show/hide log messages
``m``
Sort processes by MEM usage
``n``
Show/hide network stats
``p``
Sort processes by name
``q``
Quit
``s``
Show/hide sensors stats (only available with -e flag)
``t``
View network I/O as combination
``u``
View cumulative network I/O
``w``
Delete finished warning log messages
``x``
Delete finished warning and critical log messages
``y``
Show/hide hddtemp stats (only available with -y flag)
``1``
Switch between global CPU and per-CPU stats
Configuration
=============
No configuration file is mandatory to use Glances.
Furthermore a configuration file is needed for setup limits and/or monitored processes list.
By default, the configuration file is under:
:Linux: ``/etc/glances/glances.conf``
:\*BSD and OS X: ``/usr/local/etc/glances/glances.conf``
:Windows: ``%APPDATA%\glances\glances.conf``
On Windows XP, the ``%APPDATA%`` path is:
.. code-block:: console
C:\Documents and Settings\<User>\Application Data
Since Windows Vista and newer versions:
.. code-block:: console
C:\Users\<User>\AppData\Roaming
You can override the default configuration, located in one of the above
directories on your system, except for Windows.
Just copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory, e.g. Linux:
.. code-block:: console
mkdir -p $XDG_CONFIG_HOME/glances
cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/
On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``.
Anatomy of the application
==========================
Legend
------
| ``GREEN`` stat counter is ``"OK"``
| ``BLUE`` stat counter is ``"CAREFUL"``
| ``MAGENTA`` stat counter is ``"WARNING"``
| ``RED`` stat counter is ``"CRITICAL"``
Header
------
.. image:: images/header.png
The header shows the OS name, release version, platform architecture and the hostname.
On Linux, it shows also the kernel version.
CPU
---
Short view:
.. image:: images/cpu.png
If enough horizontal space is available, extended CPU informations are displayed.
Extended view:
.. image:: images/cpu-wide.png
To switch to per-CPU stats, just hit the ``1`` key:
.. image:: images/per-cpu.png
The CPU stats are shown as a percentage and for the configured refresh time.
The total CPU usage is displayed on the first line.
| If user|system|nice CPU is ``<50%``, then status is set to ``"OK"``
| If user|system|nice CPU is ``>50%``, then status is set to ``"CAREFUL"``
| If user|system|nice CPU is ``>70%``, then status is set to ``"WARNING"``
| If user|system|nice CPU is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[cpu]`` section.
Load
----
.. image:: images/load.png
On the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_:
"In short it is the average sum of the number of processes
waiting in the run-queue plus the number currently executing
over 1, 5, and 15 minute time periods."
Glances gets the number of CPU core to adapt the alerts.
Alerts on average load are only set on 5 and 15 min.
The first line also display the number of CPU core.
| If average load is ``<0.7*core``, then status is set to ``"OK"``
| If average load is ``>0.7*core``, then status is set to ``"CAREFUL"``
| If average load is ``>1*core``, then status is set to ``"WARNING"``
| If average load is ``>5*core``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[load]`` section.
Memory
------
Glances uses two columns: one for the ``RAM`` and another one for the ``Swap``.
.. image:: images/mem.png
If enough space is available, Glances displays extended informations:
.. image:: images/mem-wide.png
With Glances, alerts are only set for on used memory and used swap.
| If memory is ``<50%``, then status is set to ``"OK"``
| If memory is ``>50%``, then status is set to ``"CAREFUL"``
| If memory is ``>70%``, then status is set to ``"WARNING"``
| If memory is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[memory]`` and ``[swap]`` sections.
Network
-------
.. image:: images/network.png
Glances displays the network interface bit rate. The unit is adapted
dynamically (bits per second, kbits per second, Mbits per second, etc).
Alerts are only set if the network interface maximum speed is available.
For example, on a 100 Mbps ethernet interface, the warning status is set
if the bit rate is higher than 70 Mbps.
| If bit rate is ``<50%``, then status is set to ``"OK"``
| If bit rate is ``>50%``, then status is set to ``"CAREFUL"``
| If bit rate is ``>70%``, then status is set to ``"WARNING"``
| If bit rate is ``>90%``, then status is set to ``"CRITICAL"``
Sensors
-------
Glances can displays the sensors informations trough `lm-sensors` (only available on Linux).
As of lm-sensors, a filter is processed in order to display temperature only:
.. image:: images/sensors.png
Glances can also grab hard disk temperature through the `hddtemp` daemon (see here [2]_ to install hddtemp on your system):
.. image:: images/hddtemp.png
To enable the lm-sensors module:
.. code-block:: console
$ glances -e
To enable the hddtemp module:
.. code-block:: console
$ glances -y
There is no alert on this information.
*Note*: limit values can be overwritten in the configuration file under the ``[temperature]`` and ``[hddtemperature]`` sections.
Disk I/O
--------
.. image:: images/diskio.png
Glances displays the disk I/O throughput. The unit is adapted dynamically.
*Note*: There is no alert on this information.
File system
-----------
.. image:: images/fs.png
Glances displays the used and total file system disk space. The unit is
adapted dynamically.
Alerts are set for used disk space:
| If disk used is ``<50%``, then status is set to ``"OK"``
| If disk used is ``>50%``, then status is set to ``"CAREFUL"``
| If disk used is ``>70%``, then status is set to ``"WARNING"``
| If disk used is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under ``[filesystem]`` section.
Processes list
--------------
Compact view:
.. image:: images/processlist.png
Full view:
.. image:: images/processlist-wide.png
Three views are available for processes:
* Processes summary
* Optional monitored processes list (new in 1.7)
* Processes list
By default, or if you hit the ``a`` key, the processes list is automatically
sorted by CPU of memory usage.
*Note*: limit values can be overwritten in the configuration file under the ``[process]`` section.
The number of processes in the list is adapted to the screen size.
``VIRT``
Total program size (VMS)
``RES``
Resident set size (RSS)
``CPU%``
% of CPU used by the process
``MEM%``
% of MEM used by the process
``PID``
Process ID
``USER``
User ID per process
``NI``
Nice level of the process
``S``
Process status
``TIME+``
Cumulative CPU time used
``IOR/s``
Per process IO read rate (in Byte/s)
``IOW/s``
Per process IO write rate (in Byte/s)
``NAME``
Process name or command line
Process status legend:
``R``
running
``S``
sleeping (may be interrupted)
``D``
disk sleep (may not be interrupted)
``T``
traced/stopped
``Z``
zombie
Monitored processes list
------------------------
New in version 1.7. Optional.
The monitored processes list allows user, through the configuration file,
to group processes and quickly show if the number of running process is not good.
.. image:: images/monitored.png
Each item is defined by:
* ``description``: description of the processes (max 16 chars).
* ``regex``: regular expression of the processes to monitor.
* ``command`` (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.
* ``countmin`` (optional): minimal number of processes. A warning will be displayed if number of processes < count.
* ``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count.
Up to 10 items can be defined.
For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:
.. code-block:: console
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
If you also want to monitor the PHP-FPM daemon processes, you should add another item:
.. code-block:: console
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
list_1_description=PHP-FPM
list_1_regex=.*php-fpm.*
list_1_countmin=1
list_1_countmax=20
In client/server mode, the list is defined on the server side.
A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.
Alerts are set as following:
| If number of processes is 0, then status is set to ``"CRITICAL"``
| If number of processes is min < current < max, then status is set to ``"OK"``
| Else status is set to ``"WARNING"``
Logs
----
.. image:: images/logs.png
A log messages list is displayed in the bottom of the screen if (and only if):
- at least one ``WARNING`` or ``CRITICAL`` alert was occurred
- space is available in the bottom of the console/terminal
Each alert message displays the following information:
1. start date
2. end date
3. alert name
4. {min/avg/max} values or number of running processes for monitored processes list alerts
Footer
------
.. image:: images/footer.png
Glances displays the current date & time and access to the embedded help screen.
If one or mode batteries were found on your machine and if the batinfo Python library [3]_
is installed on your system then Glances displays the available percent capacity in the middle on the footer.
.. image:: images/battery.png
If you have ran Glances in client mode ``-c``, you can also see if the client is connected to the server.
If client is connected:
.. image:: images/client-connected.png
else:
.. image:: images/client-disconnected.png
On the left, you can easily see if you are connected to a Glances server.
API documentation
=================
Glances uses a `XML-RPC server`_ and can be used by another client software.
API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To
Support
=======
To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues
Feel free to contribute!
.. [1] http://nosheep.net/story/defining-unix-load-average/
.. [2] http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html
.. [3] https://github.com/nicolargo/batinfo
.. _psutil: https://code.google.com/p/psutil/
.. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.html

View File

@ -1,28 +0,0 @@
Welcome to Glances's documentation!
===================================
**Glances** is a cross-platform curses-based monitoring tool written in Python.
It uses the psutil library and some internal code to get information from your system.
.. image:: https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png
Get the code
------------
The `source <http://github.com/nicolargo/glances>`_ is available on GitHub.
Contents
--------
.. toctree::
:maxdepth: 2
glances-doc
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

View File

@ -1,540 +0,0 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
div.sphinxsidebar #searchbox input[type="submit"] {
width: 30px;
}
img {
border: 0;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable dl, table.indextable dd {
margin-top: 0;
margin-bottom: 0;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- general body styles --------------------------------------------------- */
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.field-list ul {
padding-left: 1em;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.field-list td, table.field-list th {
border: 0 !important;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
dl {
margin-bottom: 15px;
}
dd p {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.refcount {
color: #060;
}
.optional {
font-size: 1.3em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
tt.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
tt.descclassname {
background-color: transparent;
}
tt.xref, a tt {
background-color: transparent;
font-weight: bold;
}
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,256 +0,0 @@
/*
* default.css_t
* ~~~~~~~~~~~~~
*
* Sphinx stylesheet -- default theme.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: sans-serif;
font-size: 100%;
background-color: #11303d;
color: #000;
margin: 0;
padding: 0;
}
div.document {
background-color: #1c4e63;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 230px;
}
div.body {
background-color: #ffffff;
color: #000000;
padding: 0 20px 30px 20px;
}
div.footer {
color: #ffffff;
width: 100%;
padding: 9px 0 9px 0;
text-align: center;
font-size: 75%;
}
div.footer a {
color: #ffffff;
text-decoration: underline;
}
div.related {
background-color: #133f52;
line-height: 30px;
color: #ffffff;
}
div.related a {
color: #ffffff;
}
div.sphinxsidebar {
}
div.sphinxsidebar h3 {
font-family: 'Trebuchet MS', sans-serif;
color: #ffffff;
font-size: 1.4em;
font-weight: normal;
margin: 0;
padding: 0;
}
div.sphinxsidebar h3 a {
color: #ffffff;
}
div.sphinxsidebar h4 {
font-family: 'Trebuchet MS', sans-serif;
color: #ffffff;
font-size: 1.3em;
font-weight: normal;
margin: 5px 0 0 0;
padding: 0;
}
div.sphinxsidebar p {
color: #ffffff;
}
div.sphinxsidebar p.topless {
margin: 5px 10px 10px 10px;
}
div.sphinxsidebar ul {
margin: 10px;
padding: 0;
color: #ffffff;
}
div.sphinxsidebar a {
color: #98dbcc;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
/* -- hyperlink styles ------------------------------------------------------ */
a {
color: #355f7c;
text-decoration: none;
}
a:visited {
color: #355f7c;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* -- body styles ----------------------------------------------------------- */
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: 'Trebuchet MS', sans-serif;
background-color: #f2f2f2;
font-weight: normal;
color: #20435c;
border-bottom: 1px solid #ccc;
margin: 20px -20px 10px -20px;
padding: 3px 0 3px 10px;
}
div.body h1 { margin-top: 0; font-size: 200%; }
div.body h2 { font-size: 160%; }
div.body h3 { font-size: 140%; }
div.body h4 { font-size: 120%; }
div.body h5 { font-size: 110%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #c60f0f;
font-size: 0.8em;
padding: 0 4px 0 4px;
text-decoration: none;
}
a.headerlink:hover {
background-color: #c60f0f;
color: white;
}
div.body p, div.body dd, div.body li {
text-align: justify;
line-height: 130%;
}
div.admonition p.admonition-title + p {
display: inline;
}
div.admonition p {
margin-bottom: 5px;
}
div.admonition pre {
margin-bottom: 5px;
}
div.admonition ul, div.admonition ol {
margin-bottom: 5px;
}
div.note {
background-color: #eee;
border: 1px solid #ccc;
}
div.seealso {
background-color: #ffc;
border: 1px solid #ff6;
}
div.topic {
background-color: #eee;
}
div.warning {
background-color: #ffe4e4;
border: 1px solid #f66;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre {
padding: 5px;
background-color: #eeffcc;
color: #333333;
line-height: 120%;
border: 1px solid #ac9;
border-left: none;
border-right: none;
}
tt {
background-color: #ecf0f3;
padding: 0 1px 0 1px;
font-size: 0.95em;
}
th {
background-color: #ede;
}
.warning tt {
background: #efc2c2;
}
.note tt {
background: #d6d6d6;
}
.viewcode-back {
font-family: sans-serif;
}
div.viewcode-block:target {
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}

View File

@ -1,247 +0,0 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
}
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s == 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* small function to check if an array contains
* a given item.
*/
jQuery.contains = function(arr, item) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == item)
return true;
}
return false;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node) {
if (node.nodeType == 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
var span = document.createElement("span");
span.className = className;
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this);
});
}
}
return this.each(function() {
highlight(this);
});
};
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated == 'undefined')
return string;
return (typeof translated == 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated == 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) == 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this == '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

View File

@ -1,62 +0,0 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

View File

@ -1,567 +0,0 @@
/*
* searchtools.js_t
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilties for the full-text search.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurance, the
* latter for highlighting it.
*/
jQuery.makeSearchSummary = function(text, keywords, hlwords) {
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
/**
* Search Module
*/
var Search = {
_index : null,
_queued_query : null,
_pulse_status : -1,
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() {
return this._index !== null;
},
deferQuery : function(query) {
this._queued_query = query;
},
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (var i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something
*/
performSearch : function(query) {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p style="display: none"></p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
},
query : function(query) {
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
// Stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = query.split(/\s+/);
var objectterms = [];
for (var i = 0; i < tmp.length; i++) {
if (tmp[i] != "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] == "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i]).toLowerCase();
// select the correct list
if (word[0] == '-') {
var toAppend = excluded;
word = word.substr(1);
}
else {
var toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$.contains(toAppend, word))
toAppend.push(word);
};
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// prepare search
var filenames = this._index.filenames;
var titles = this._index.titles;
var terms = this._index.terms;
var fileMap = {};
var files = null;
// different result priorities
var importantResults = [];
var objectResults = [];
var regularResults = [];
var unimportantResults = [];
$('#search-progress').empty();
// lookup as object
for (var i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0,i),
objectterms.slice(i+1, objectterms.length))
var results = this.performObjectSearch(objectterms[i], others);
// Assume first word is most likely to be the object,
// other words more likely to be in description.
// Therefore put matches for earlier words first.
// (Results are eventually used in reverse order).
objectResults = results[0].concat(objectResults);
importantResults = results[1].concat(importantResults);
unimportantResults = results[2].concat(unimportantResults);
}
// perform the search on the required terms
for (var i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
// no match but word was a required one
if ((files = terms[word]) == null)
break;
if (files.length == undefined) {
files = [files];
}
// create the mapping
for (var j = 0; j < files.length; j++) {
var file = files[j];
if (file in fileMap)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms
for (var file in fileMap) {
var valid = true;
// check if all requirements are matched
if (fileMap[file].length != searchterms.length)
continue;
// ensure that none of the excluded terms is in the
// search result.
for (var i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
$.contains(terms[excluded[i]] || [], file)) {
valid = false;
break;
}
}
// if we have still a valid result we can add it
// to the result list
if (valid)
regularResults.push([filenames[file], titles[file], '', null]);
}
// delete unused variables in order to not waste
// memory until list is retrieved completely
delete filenames, titles, terms;
// now sort the regular results descending by title
regularResults.sort(function(a, b) {
var left = a[1].toLowerCase();
var right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
});
// combine all results
var results = unimportantResults.concat(regularResults)
.concat(objectResults).concat(importantResults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
listItem.append($('<a/>').attr('href',
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
highlightstring + item[2]).html(item[1]));
} else {
// normal html builders
listItem.append($('<a/>').attr('href',
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
highlightstring + item[2]).html(item[1]));
}
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '') {
listItem.append($.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}});
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
},
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
var importantResults = [];
var objectResults = [];
var unimportantResults = [];
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
if (fullname.toLowerCase().indexOf(object) > -1) {
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (var i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
anchor = match[3];
if (anchor == '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
result = [filenames[match[0]], fullname, '#'+anchor, descr];
switch (match[2]) {
case 1: objectResults.push(result); break;
case 0: importantResults.push(result); break;
case 2: unimportantResults.push(result); break;
}
}
}
}
// sort results descending
objectResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
importantResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
unimportantResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
return [importantResults, objectResults, unimportantResults]
}
}
$(document).ready(function() {
Search.init();
});

View File

@ -1,151 +0,0 @@
/*
* sidebar.js
* ~~~~~~~~~~
*
* This script makes the Sphinx sidebar collapsible.
*
* .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
* in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
* used to collapse and expand the sidebar.
*
* When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
* and the width of the sidebar and the margin-left of the document
* are decreased. When the sidebar is expanded the opposite happens.
* This script saves a per-browser/per-session cookie used to
* remember the position of the sidebar among the pages.
* Once the browser is closed the cookie is deleted and the position
* reset to the default (expanded).
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
$(function() {
// global elements used by the functions.
// the 'sidebarbutton' element is defined as global after its
// creation, in the add_sidebar_button function
var bodywrapper = $('.bodywrapper');
var sidebar = $('.sphinxsidebar');
var sidebarwrapper = $('.sphinxsidebarwrapper');
// for some reason, the document has no sidebar; do not run into errors
if (!sidebar.length) return;
// original margin-left of the bodywrapper and width of the sidebar
// with the sidebar expanded
var bw_margin_expanded = bodywrapper.css('margin-left');
var ssb_width_expanded = sidebar.width();
// margin-left of the bodywrapper and width of the sidebar
// with the sidebar collapsed
var bw_margin_collapsed = '.8em';
var ssb_width_collapsed = '.8em';
// colors used by the current theme
var dark_color = $('.related').css('background-color');
var light_color = $('.document').css('background-color');
function sidebar_is_collapsed() {
return sidebarwrapper.is(':not(:visible)');
}
function toggle_sidebar() {
if (sidebar_is_collapsed())
expand_sidebar();
else
collapse_sidebar();
}
function collapse_sidebar() {
sidebarwrapper.hide();
sidebar.css('width', ssb_width_collapsed);
bodywrapper.css('margin-left', bw_margin_collapsed);
sidebarbutton.css({
'margin-left': '0',
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('»');
sidebarbutton.attr('title', _('Expand sidebar'));
document.cookie = 'sidebar=collapsed';
}
function expand_sidebar() {
bodywrapper.css('margin-left', bw_margin_expanded);
sidebar.css('width', ssb_width_expanded);
sidebarwrapper.show();
sidebarbutton.css({
'margin-left': ssb_width_expanded-12,
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('«');
sidebarbutton.attr('title', _('Collapse sidebar'));
document.cookie = 'sidebar=expanded';
}
function add_sidebar_button() {
sidebarwrapper.css({
'float': 'left',
'margin-right': '0',
'width': ssb_width_expanded - 28
});
// create the button
sidebar.append(
'<div id="sidebarbutton"><span>&laquo;</span></div>'
);
var sidebarbutton = $('#sidebarbutton');
light_color = sidebarbutton.css('background-color');
// find the height of the viewport to center the '<<' in the page
var viewport_height;
if (window.innerHeight)
viewport_height = window.innerHeight;
else
viewport_height = $(window).height();
sidebarbutton.find('span').css({
'display': 'block',
'margin-top': (viewport_height - sidebar.position().top - 20) / 2
});
sidebarbutton.click(toggle_sidebar);
sidebarbutton.attr('title', _('Collapse sidebar'));
sidebarbutton.css({
'color': '#FFFFFF',
'border-left': '1px solid ' + dark_color,
'font-size': '1.2em',
'cursor': 'pointer',
'height': bodywrapper.height(),
'padding-top': '1px',
'margin-left': ssb_width_expanded - 12
});
sidebarbutton.hover(
function () {
$(this).css('background-color', dark_color);
},
function () {
$(this).css('background-color', light_color);
}
);
}
function set_position_from_cookie() {
if (!document.cookie)
return;
var items = document.cookie.split(';');
for(var k=0; k<items.length; k++) {
var key_val = items[k].split('=');
var key = key_val[0];
if (key == 'sidebar') {
var value = key_val[1];
if ((value == 'collapsed') && (!sidebar_is_collapsed()))
collapse_sidebar();
else if ((value == 'expanded') && (sidebar_is_collapsed()))
expand_sidebar();
}
}
}
add_sidebar_button();
var sidebarbutton = $('#sidebarbutton');
set_position_from_cookie();
});

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

View File

@ -1,808 +0,0 @@
/*
* websupport.js
* ~~~~~~~~~~~~~
*
* sphinx.websupport utilties for all documentation.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
(function($) {
$.fn.autogrow = function() {
return this.each(function() {
var textarea = this;
$.fn.autogrow.resize(textarea);
$(textarea)
.focus(function() {
textarea.interval = setInterval(function() {
$.fn.autogrow.resize(textarea);
}, 500);
})
.blur(function() {
clearInterval(textarea.interval);
});
});
};
$.fn.autogrow.resize = function(textarea) {
var lineHeight = parseInt($(textarea).css('line-height'), 10);
var lines = textarea.value.split('\n');
var columns = textarea.cols;
var lineCount = 0;
$.each(lines, function() {
lineCount += Math.ceil(this.length / columns) || 1;
});
var height = lineHeight * (lineCount + 1);
$(textarea).css('height', height);
};
})(jQuery);
(function($) {
var comp, by;
function init() {
initEvents();
initComparator();
}
function initEvents() {
$('a.comment-close').live("click", function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
});
$('a.vote').live("click", function(event) {
event.preventDefault();
handleVote($(this));
});
$('a.reply').live("click", function(event) {
event.preventDefault();
openReply($(this).attr('id').substring(2));
});
$('a.close-reply').live("click", function(event) {
event.preventDefault();
closeReply($(this).attr('id').substring(2));
});
$('a.sort-option').live("click", function(event) {
event.preventDefault();
handleReSort($(this));
});
$('a.show-proposal').live("click", function(event) {
event.preventDefault();
showProposal($(this).attr('id').substring(2));
});
$('a.hide-proposal').live("click", function(event) {
event.preventDefault();
hideProposal($(this).attr('id').substring(2));
});
$('a.show-propose-change').live("click", function(event) {
event.preventDefault();
showProposeChange($(this).attr('id').substring(2));
});
$('a.hide-propose-change').live("click", function(event) {
event.preventDefault();
hideProposeChange($(this).attr('id').substring(2));
});
$('a.accept-comment').live("click", function(event) {
event.preventDefault();
acceptComment($(this).attr('id').substring(2));
});
$('a.delete-comment').live("click", function(event) {
event.preventDefault();
deleteComment($(this).attr('id').substring(2));
});
$('a.comment-markup').live("click", function(event) {
event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2));
});
}
/**
* Set comp, which is a comparator function used for sorting and
* inserting comments into the list.
*/
function setComparator() {
// If the first three letters are "asc", sort in ascending order
// and remove the prefix.
if (by.substring(0,3) == 'asc') {
var i = by.substring(3);
comp = function(a, b) { return a[i] - b[i]; };
} else {
// Otherwise sort in descending order.
comp = function(a, b) { return b[by] - a[by]; };
}
// Reset link styles and format the selected sort option.
$('a.sel').attr('href', '#').removeClass('sel');
$('a.by' + by).removeAttr('href').addClass('sel');
}
/**
* Create a comp function. If the user has preferences stored in
* the sortBy cookie, use those, otherwise use the default.
*/
function initComparator() {
by = 'rating'; // Default to sort by rating.
// If the sortBy cookie is set, use that instead.
if (document.cookie.length > 0) {
var start = document.cookie.indexOf('sortBy=');
if (start != -1) {
start = start + 7;
var end = document.cookie.indexOf(";", start);
if (end == -1) {
end = document.cookie.length;
by = unescape(document.cookie.substring(start, end));
}
}
}
setComparator();
}
/**
* Show a comment div.
*/
function show(id) {
$('#ao' + id).hide();
$('#ah' + id).show();
var context = $.extend({id: id}, opts);
var popup = $(renderTemplate(popupTemplate, context)).hide();
popup.find('textarea[name="proposal"]').hide();
popup.find('a.by' + by).addClass('sel');
var form = popup.find('#cf' + id);
form.submit(function(event) {
event.preventDefault();
addComment(form);
});
$('#s' + id).after(popup);
popup.slideDown('fast', function() {
getComments(id);
});
}
/**
* Hide a comment div.
*/
function hide(id) {
$('#ah' + id).hide();
$('#ao' + id).show();
var div = $('#sc' + id);
div.slideUp('fast', function() {
div.remove();
});
}
/**
* Perform an ajax request to get comments for a node
* and insert the comments into the comments tree.
*/
function getComments(id) {
$.ajax({
type: 'GET',
url: opts.getCommentsURL,
data: {node: id},
success: function(data, textStatus, request) {
var ul = $('#cl' + id);
var speed = 100;
$('#cf' + id)
.find('textarea[name="proposal"]')
.data('source', data.source);
if (data.comments.length === 0) {
ul.html('<li>No comments yet.</li>');
ul.data('empty', true);
} else {
// If there are comments, sort them and put them in the list.
var comments = sortComments(data.comments);
speed = data.comments.length * 100;
appendComments(comments, ul);
ul.data('empty', false);
}
$('#cn' + id).slideUp(speed + 200);
ul.slideDown(speed);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem retrieving the comments.');
},
dataType: 'json'
});
}
/**
* Add a comment via ajax and insert the comment into the comment tree.
*/
function addComment(form) {
var node_id = form.find('input[name="node"]').val();
var parent_id = form.find('input[name="parent"]').val();
var text = form.find('textarea[name="comment"]').val();
var proposal = form.find('textarea[name="proposal"]').val();
if (text == '') {
showError('Please enter a comment.');
return;
}
// Disable the form that is being submitted.
form.find('textarea,input').attr('disabled', 'disabled');
// Send the comment to the server.
$.ajax({
type: "POST",
url: opts.addCommentURL,
dataType: 'json',
data: {
node: node_id,
parent: parent_id,
text: text,
proposal: proposal
},
success: function(data, textStatus, error) {
// Reset the form.
if (node_id) {
hideProposeChange(node_id);
}
form.find('textarea')
.val('')
.add(form.find('input'))
.removeAttr('disabled');
var ul = $('#cl' + (node_id || parent_id));
if (ul.data('empty')) {
$(ul).empty();
ul.data('empty', false);
}
insertComment(data.comment);
var ao = $('#ao' + node_id);
ao.find('img').attr({'src': opts.commentBrightImage});
if (node_id) {
// if this was a "root" comment, remove the commenting box
// (the user can get it back by reopening the comment popup)
$('#ca' + node_id).slideUp();
}
},
error: function(request, textStatus, error) {
form.find('textarea,input').removeAttr('disabled');
showError('Oops, there was a problem adding the comment.');
}
});
}
/**
* Recursively append comments to the main comment list and children
* lists, creating the comment tree.
*/
function appendComments(comments, ul) {
$.each(comments, function() {
var div = createCommentDiv(this);
ul.append($(document.createElement('li')).html(div));
appendComments(this.children, div.find('ul.comment-children'));
// To avoid stagnating data, don't store the comments children in data.
this.children = null;
div.data('comment', this);
});
}
/**
* After adding a new comment, it must be inserted in the correct
* location in the comment tree.
*/
function insertComment(comment) {
var div = createCommentDiv(comment);
// To avoid stagnating data, don't store the comments children in data.
comment.children = null;
div.data('comment', comment);
var ul = $('#cl' + (comment.node || comment.parent));
var siblings = getChildren(ul);
var li = $(document.createElement('li'));
li.hide();
// Determine where in the parents children list to insert this comment.
for(i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
.before(li.html(div));
li.slideDown('fast');
return;
}
}
// If we get here, this comment rates lower than all the others,
// or it is the only comment in the list.
ul.append(li.html(div));
li.slideDown('fast');
}
function acceptComment(id) {
$.ajax({
type: 'POST',
url: opts.acceptCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
$('#cm' + id).fadeOut('fast');
$('#cd' + id).removeClass('moderate');
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem accepting the comment.');
}
});
}
function deleteComment(id) {
$.ajax({
type: 'POST',
url: opts.deleteCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
var div = $('#cd' + id);
if (data == 'delete') {
// Moderator mode: remove the comment and all children immediately
div.slideUp('fast', function() {
div.remove();
});
return;
}
// User mode: only mark the comment as deleted
div
.find('span.user-id:first')
.text('[deleted]').end()
.find('div.comment-text:first')
.text('[deleted]').end()
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
.remove();
var comment = div.data('comment');
comment.username = '[deleted]';
comment.text = '[deleted]';
div.data('comment', comment);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem deleting the comment.');
}
});
}
function showProposal(id) {
$('#sp' + id).hide();
$('#hp' + id).show();
$('#pr' + id).slideDown('fast');
}
function hideProposal(id) {
$('#hp' + id).hide();
$('#sp' + id).show();
$('#pr' + id).slideUp('fast');
}
function showProposeChange(id) {
$('#pc' + id).hide();
$('#hc' + id).show();
var textarea = $('#pt' + id);
textarea.val(textarea.data('source'));
$.fn.autogrow.resize(textarea[0]);
textarea.slideDown('fast');
}
function hideProposeChange(id) {
$('#hc' + id).hide();
$('#pc' + id).show();
var textarea = $('#pt' + id);
textarea.val('').removeAttr('disabled');
textarea.slideUp('fast');
}
function toggleCommentMarkupBox(id) {
$('#mb' + id).toggle();
}
/** Handle when the user clicks on a sort by link. */
function handleReSort(link) {
var classes = link.attr('class').split(/\s+/);
for (var i=0; i<classes.length; i++) {
if (classes[i] != 'sort-option') {
by = classes[i].substring(2);
}
}
setComparator();
// Save/update the sortBy cookie.
var expiration = new Date();
expiration.setDate(expiration.getDate() + 365);
document.cookie= 'sortBy=' + escape(by) +
';expires=' + expiration.toUTCString();
$('ul.comment-ul').each(function(index, ul) {
var comments = getChildren($(ul), true);
comments = sortComments(comments);
appendComments(comments, $(ul).empty());
});
}
/**
* Function to process a vote when a user clicks an arrow.
*/
function handleVote(link) {
if (!opts.voting) {
showError("You'll need to login to vote.");
return;
}
var id = link.attr('id');
if (!id) {
// Didn't click on one of the voting arrows.
return;
}
// If it is an unvote, the new vote value is 0,
// Otherwise it's 1 for an upvote, or -1 for a downvote.
var value = 0;
if (id.charAt(1) != 'u') {
value = id.charAt(0) == 'u' ? 1 : -1;
}
// The data to be sent to the server.
var d = {
comment_id: id.substring(2),
value: value
};
// Swap the vote and unvote links.
link.hide();
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
.show();
// The div the comment is displayed in.
var div = $('div#cd' + d.comment_id);
var data = div.data('comment');
// If this is not an unvote, and the other vote arrow has
// already been pressed, unpress it.
if ((d.value !== 0) && (data.vote === d.value * -1)) {
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
}
// Update the comments rating in the local data.
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
data.vote = d.value;
div.data('comment', data);
// Change the rating text.
div.find('.rating:first')
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
// Send the vote information to the server.
$.ajax({
type: "POST",
url: opts.processVoteURL,
data: d,
error: function(request, textStatus, error) {
showError('Oops, there was a problem casting that vote.');
}
});
}
/**
* Open a reply form used to reply to an existing comment.
*/
function openReply(id) {
// Swap out the reply link for the hide link
$('#rl' + id).hide();
$('#cr' + id).show();
// Add the reply li to the children ul.
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
$('#cl' + id)
.prepend(div)
// Setup the submit handler for the reply form.
.find('#rf' + id)
.submit(function(event) {
event.preventDefault();
addComment($('#rf' + id));
closeReply(id);
})
.find('input[type=button]')
.click(function() {
closeReply(id);
});
div.slideDown('fast', function() {
$('#rf' + id).find('textarea').focus();
});
}
/**
* Close the reply form opened with openReply.
*/
function closeReply(id) {
// Remove the reply div from the DOM.
$('#rd' + id).slideUp('fast', function() {
$(this).remove();
});
// Swap out the hide link for the reply link
$('#cr' + id).hide();
$('#rl' + id).show();
}
/**
* Recursively sort a tree of comments using the comp comparator.
*/
function sortComments(comments) {
comments.sort(comp);
$.each(comments, function() {
this.children = sortComments(this.children);
});
return comments;
}
/**
* Get the children comments from a ul. If recursive is true,
* recursively include childrens' children.
*/
function getChildren(ul, recursive) {
var children = [];
ul.children().children("[id^='cd']")
.each(function() {
var comment = $(this).data('comment');
if (recursive)
comment.children = getChildren($(this).find('#cl' + comment.id), true);
children.push(comment);
});
return children;
}
/** Create a div to display a comment in. */
function createCommentDiv(comment) {
if (!comment.displayed && !opts.moderator) {
return $('<div class="moderate">Thank you! Your comment will show up '
+ 'once it is has been approved by a moderator.</div>');
}
// Prettify the comment rating.
comment.pretty_rating = comment.rating + ' point' +
(comment.rating == 1 ? '' : 's');
// Make a class (for displaying not yet moderated comments differently)
comment.css_class = comment.displayed ? '' : ' moderate';
// Create a div for this comment.
var context = $.extend({}, opts, comment);
var div = $(renderTemplate(commentTemplate, context));
// If the user has voted on this comment, highlight the correct arrow.
if (comment.vote) {
var direction = (comment.vote == 1) ? 'u' : 'd';
div.find('#' + direction + 'v' + comment.id).hide();
div.find('#' + direction + 'u' + comment.id).show();
}
if (opts.moderator || comment.text != '[deleted]') {
div.find('a.reply').show();
if (comment.proposal_diff)
div.find('#sp' + comment.id).show();
if (opts.moderator && !comment.displayed)
div.find('#cm' + comment.id).show();
if (opts.moderator || (opts.username == comment.username))
div.find('#dc' + comment.id).show();
}
return div;
}
/**
* A simple template renderer. Placeholders such as <%id%> are replaced
* by context['id'] with items being escaped. Placeholders such as <#id#>
* are not escaped.
*/
function renderTemplate(template, context) {
var esc = $(document.createElement('div'));
function handle(ph, escape) {
var cur = context;
$.each(ph.split('.'), function() {
cur = cur[this];
});
return escape ? esc.text(cur || "").html() : cur;
}
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
return handle(arguments[2], arguments[1] == '%' ? true : false);
});
}
/** Flash an error message briefly. */
function showError(message) {
$(document.createElement('div')).attr({'class': 'popup-error'})
.append($(document.createElement('div'))
.attr({'class': 'error-message'}).text(message))
.appendTo('body')
.fadeIn("slow")
.delay(2000)
.fadeOut("slow");
}
/** Add a link the user uses to open the comments popup. */
$.fn.comment = function() {
return this.each(function() {
var id = $(this).attr('id').substring(1);
var count = COMMENT_METADATA[id];
var title = count + ' comment' + (count == 1 ? '' : 's');
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
var addcls = count == 0 ? ' nocomment' : '';
$(this)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-open' + addcls,
id: 'ao' + id
})
.append($(document.createElement('img')).attr({
src: image,
alt: 'comment',
title: title
}))
.click(function(event) {
event.preventDefault();
show($(this).attr('id').substring(2));
})
)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-close hidden',
id: 'ah' + id
})
.append($(document.createElement('img')).attr({
src: opts.closeCommentImage,
alt: 'close',
title: 'close'
}))
.click(function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
})
);
});
};
var opts = {
processVoteURL: '/_process_vote',
addCommentURL: '/_add_comment',
getCommentsURL: '/_get_comments',
acceptCommentURL: '/_accept_comment',
deleteCommentURL: '/_delete_comment',
commentImage: '/static/_static/comment.png',
closeCommentImage: '/static/_static/comment-close.png',
loadingImage: '/static/_static/ajax-loader.gif',
commentBrightImage: '/static/_static/comment-bright.png',
upArrow: '/static/_static/up.png',
downArrow: '/static/_static/down.png',
upArrowPressed: '/static/_static/up-pressed.png',
downArrowPressed: '/static/_static/down-pressed.png',
voting: false,
moderator: false
};
if (typeof COMMENT_OPTIONS != "undefined") {
opts = jQuery.extend(opts, COMMENT_OPTIONS);
}
var popupTemplate = '\
<div class="sphinx-comments" id="sc<%id%>">\
<p class="sort-options">\
Sort by:\
<a href="#" class="sort-option byrating">best rated</a>\
<a href="#" class="sort-option byascage">newest</a>\
<a href="#" class="sort-option byage">oldest</a>\
</p>\
<div class="comment-header">Comments</div>\
<div class="comment-loading" id="cn<%id%>">\
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
<ul id="cl<%id%>" class="comment-ul"></ul>\
<div id="ca<%id%>">\
<p class="add-a-comment">Add a comment\
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<tt>``code``</tt>, \
code blocks: <tt>::</tt> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\
<a href="#" id="pc<%id%>" class="show-propose-change">\
Propose a change &#9657;\
</a>\
<a href="#" id="hc<%id%>" class="hide-propose-change">\
Propose a change &#9663;\
</a>\
</p>\
<textarea name="proposal" id="pt<%id%>" cols="80"\
spellcheck="false"></textarea>\
<input type="submit" value="Add comment" />\
<input type="hidden" name="node" value="<%id%>" />\
<input type="hidden" name="parent" value="" />\
</form>\
</div>\
</div>';
var commentTemplate = '\
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
<div class="vote">\
<div class="arrow">\
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
<img src="<%upArrow%>" />\
</a>\
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
<img src="<%upArrowPressed%>" />\
</a>\
</div>\
<div class="arrow">\
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
<img src="<%downArrow%>" id="da<%id%>" />\
</a>\
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
<img src="<%downArrowPressed%>" />\
</a>\
</div>\
</div>\
<div class="comment-content">\
<p class="tagline comment">\
<span class="user-id"><%username%></span>\
<span class="rating"><%pretty_rating%></span>\
<span class="delta"><%time.delta%></span>\
</p>\
<div class="comment-text comment"><#text#></div>\
<p class="comment-opts comment">\
<a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
<a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
<a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
<a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
<span id="cm<%id%>" class="moderation hidden">\
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
</span>\
</p>\
<pre class="proposal" id="pr<%id%>">\
<#proposal_diff#>\
</pre>\
<ul class="comment-children" id="cl<%id%>"></ul>\
</div>\
<div class="clearleft"></div>\
</div>\
</div>';
var replyTemplate = '\
<li>\
<div class="reply-div" id="rd<%id%>">\
<form id="rf<%id%>">\
<textarea name="comment" cols="80"></textarea>\
<input type="submit" value="Add reply" />\
<input type="button" value="Cancel" />\
<input type="hidden" name="parent" value="<%id%>" />\
<input type="hidden" name="node" value="" />\
</form>\
</div>\
</li>';
$(document).ready(function() {
init();
});
})(jQuery);
$(document).ready(function() {
// add comment anchors for all paragraphs that are commentable
$('.sphinx-has-comment').comment();
// highlight search words in search results
$("div.context").each(function() {
var params = $.getQueryParameters();
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
var result = $(this);
$.each(terms, function() {
result.highlightText(this.toLowerCase(), 'highlighted');
});
});
// directly open comment window if requested
var anchor = document.location.hash;
if (anchor.substring(0, 9) == '#comment-') {
$('#ao' + anchor.substring(9)).click();
document.location.hash = '#s' + anchor.substring(9);
}
});

View File

@ -1,95 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; Glances 1.7.3 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.7.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Glances 1.7.3 documentation" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
accesskey="I">index</a></li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1 id="index">Index</h1>
<div class="genindex-jumpbox">
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
>index</a></li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013, Nicolas Hennion.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -1,665 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Glances &mdash; Glances 1.7.3 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.7.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Glances 1.7.3 documentation" href="index.html" />
<link rel="prev" title="Welcome to Glancess documentation!" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="index.html" title="Welcome to Glancess documentation!"
accesskey="P">previous</a> |</li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="glances">
<h1><a class="toc-backref" href="#id7">Glances</a><a class="headerlink" href="#glances" title="Permalink to this headline"></a></h1>
<p>This manual describes <em>Glances</em> version 1.7.3.</p>
<p>Copyright © 2012-2013 Nicolas Hennion &lt;<a class="reference external" href="mailto:nicolas&#37;&#52;&#48;nicolargo&#46;com">nicolas<span>&#64;</span>nicolargo<span>&#46;</span>com</a>&gt;</p>
<p>November 2013</p>
<div class="contents topic" id="table-of-contents">
<p class="topic-title first">Table of Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#glances" id="id7">Glances</a><ul>
<li><a class="reference internal" href="#introduction" id="id8">Introduction</a></li>
<li><a class="reference internal" href="#usage" id="id9">Usage</a><ul>
<li><a class="reference internal" href="#standalone-mode" id="id10">Standalone mode</a></li>
<li><a class="reference internal" href="#client-server-mode" id="id11">Client/Server mode</a></li>
</ul>
</li>
<li><a class="reference internal" href="#command-reference" id="id12">Command reference</a><ul>
<li><a class="reference internal" href="#command-line-options" id="id13">Command-line options</a></li>
<li><a class="reference internal" href="#interactive-commands" id="id14">Interactive commands</a></li>
</ul>
</li>
<li><a class="reference internal" href="#configuration" id="id15">Configuration</a></li>
<li><a class="reference internal" href="#anatomy-of-the-application" id="id16">Anatomy of the application</a><ul>
<li><a class="reference internal" href="#legend" id="id17">Legend</a></li>
<li><a class="reference internal" href="#header" id="id18">Header</a></li>
<li><a class="reference internal" href="#cpu" id="id19">CPU</a></li>
<li><a class="reference internal" href="#load" id="id20">Load</a></li>
<li><a class="reference internal" href="#memory" id="id21">Memory</a></li>
<li><a class="reference internal" href="#network" id="id22">Network</a></li>
<li><a class="reference internal" href="#sensors" id="id23">Sensors</a></li>
<li><a class="reference internal" href="#disk-i-o" id="id24">Disk I/O</a></li>
<li><a class="reference internal" href="#file-system" id="id25">File system</a></li>
<li><a class="reference internal" href="#processes-list" id="id26">Processes list</a></li>
<li><a class="reference internal" href="#monitored-processes-list" id="id27">Monitored processes list</a></li>
<li><a class="reference internal" href="#logs" id="id28">Logs</a></li>
<li><a class="reference internal" href="#footer" id="id29">Footer</a></li>
</ul>
</li>
<li><a class="reference internal" href="#api-documentation" id="id30">API documentation</a></li>
<li><a class="reference internal" href="#support" id="id31">Support</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="introduction">
<h2><a class="toc-backref" href="#id8">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
<p>Glances is a cross-platform curses-based monitoring tool which aims to
present a maximum of information in a minimum of space, ideally to fit
in a classical 80x24 terminal or higher to have additional information.</p>
<p>Glances can adapt dynamically the displayed information depending on the
terminal size. It can also work in a client/server mode for remote monitoring.</p>
<p>Glances is written in Python and uses the <a class="reference external" href="https://code.google.com/p/psutil/">psutil</a> library to get information from your system.</p>
<p>Console (80x24)</p>
<img alt="_images/screenshot.png" src="_images/screenshot.png" />
<p>Full view (&gt;80x24)</p>
<img alt="_images/screenshot-wide.png" src="_images/screenshot-wide.png" />
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#id9">Usage</a><a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="section" id="standalone-mode">
<h3><a class="toc-backref" href="#id10">Standalone mode</a><a class="headerlink" href="#standalone-mode" title="Permalink to this headline"></a></h3>
<p>Simply run:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> glances
</pre></div>
</div>
</div>
<div class="section" id="client-server-mode">
<h3><a class="toc-backref" href="#id11">Client/Server mode</a><a class="headerlink" href="#client-server-mode" title="Permalink to this headline"></a></h3>
<p>If you want to remotely monitor a machine, called <tt class="docutils literal"><span class="pre">server</span></tt>, from another one, called <tt class="docutils literal"><span class="pre">client</span></tt>,
just run on the server:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">server$ glances -s</span>
</pre></div>
</div>
<p>and on the client:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">client$ glances -c @server</span>
</pre></div>
</div>
<p>where <tt class="docutils literal"><span class="pre">&#64;server</span></tt> is the IP address or hostname of the server.</p>
<p>In server mode, you can set the bind address <tt class="docutils literal"><span class="pre">-B</span> <span class="pre">ADDRESS</span></tt> and listening TCP port <tt class="docutils literal"><span class="pre">-p</span> <span class="pre">PORT</span></tt>.</p>
<p>In client mode, you can set the TCP port of the server <tt class="docutils literal"><span class="pre">-p</span> <span class="pre">PORT</span></tt>.</p>
<p>Default binding address is <tt class="docutils literal"><span class="pre">0.0.0.0</span></tt> (Glances will listen on all the network interfaces) and TCP port is <tt class="docutils literal"><span class="pre">61209</span></tt>.</p>
<p>In client/server mode, limits are set by the server side.</p>
<p>You can also set a password to access to the server <tt class="docutils literal"><span class="pre">-P</span> <span class="pre">password</span></tt>.</p>
<p>Glances is <tt class="docutils literal"><span class="pre">IPv6</span></tt> compatible. Just use the <tt class="docutils literal"><span class="pre">-B</span> <span class="pre">::</span></tt> option to bind to all IPv6 addresses.</p>
</div>
</div>
<div class="section" id="command-reference">
<h2><a class="toc-backref" href="#id12">Command reference</a><a class="headerlink" href="#command-reference" title="Permalink to this headline"></a></h2>
<div class="section" id="command-line-options">
<h3><a class="toc-backref" href="#id13">Command-line options</a><a class="headerlink" href="#command-line-options" title="Permalink to this headline"></a></h3>
<table class="docutils option-list" frame="void" rules="none">
<col class="option" />
<col class="description" />
<tbody valign="top">
<tr><td class="option-group">
<kbd><span class="option">-b</span></kbd></td>
<td>Display network rate in Byte per second (default: bit per second)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-B <var>IP</var></span></kbd></td>
<td>Bind server to the given IPv4/IPv6 address or hostname</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-c <var>IP</var></span></kbd></td>
<td>Connect to a Glances server by IPv4/IPv6 address or hostname</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-C <var>FILE</var></span></kbd></td>
<td>Path to the configuration file</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-d</span></kbd></td>
<td>Disable disk I/O module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-e</span></kbd></td>
<td>Enable sensors module (requires pysensors, Linux-only)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-f <var>FILE</var></span></kbd></td>
<td>Set the HTML output folder or CSV file</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-h</span></kbd></td>
<td>Display the help and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-m</span></kbd></td>
<td>Disable mount module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-n</span></kbd></td>
<td>Disable network module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-o <var>OUTPUT</var></span></kbd></td>
<td>Define additional output (available: HTML or CSV)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-p <var>PORT</var></span></kbd></td>
<td>Define the client/server TCP port (default: 61209)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-P <var>PASSWORD</var></span></kbd></td>
<td>Define a client/server password</td></tr>
<tr><td class="option-group">
<kbd><span class="option">--password</span></kbd></td>
<td>Define a client/server password from the prompt</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-r</span></kbd></td>
<td>Disable process list (for low CPU consumption)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-s</span></kbd></td>
<td>Run Glances in server mode</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-t <var>SECONDS</var></span></kbd></td>
<td>Set refresh time in seconds (default: 3 sec)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-v</span></kbd></td>
<td>Display the version and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-y</span></kbd></td>
<td>Enable hddtemp module (requires hddtemp)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-z</span></kbd></td>
<td>Do not use the bold color attribute</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-1</span></kbd></td>
<td>Start Glances in per-CPU mode</td></tr>
</tbody>
</table>
</div>
<div class="section" id="interactive-commands">
<h3><a class="toc-backref" href="#id14">Interactive commands</a><a class="headerlink" href="#interactive-commands" title="Permalink to this headline"></a></h3>
<p>The following commands (key pressed) are supported while in Glances:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">a</span></tt></dt>
<dd><p class="first">Sort process list automatically</p>
<ul class="last simple">
<li>If CPU iowait <tt class="docutils literal"><span class="pre">&gt;60%</span></tt>, sort processes by I/O read and write</li>
<li>If CPU <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, sort processes by CPU usage</li>
<li>If MEM <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, sort processes by memory usage</li>
</ul>
</dd>
<dt><tt class="docutils literal"><span class="pre">b</span></tt></dt>
<dd>Switch between bit/s or Byte/s for network I/O</dd>
<dt><tt class="docutils literal"><span class="pre">c</span></tt></dt>
<dd>Sort processes by CPU usage</dd>
<dt><tt class="docutils literal"><span class="pre">d</span></tt></dt>
<dd>Show/hide disk I/O stats</dd>
<dt><tt class="docutils literal"><span class="pre">f</span></tt></dt>
<dd>Show/hide file system stats</dd>
<dt><tt class="docutils literal"><span class="pre">h</span></tt></dt>
<dd>Show/hide the help screen</dd>
<dt><tt class="docutils literal"><span class="pre">i</span></tt></dt>
<dd>Sort processes by I/O rate (may need root privileges on some OSes)</dd>
<dt><tt class="docutils literal"><span class="pre">l</span></tt></dt>
<dd>Show/hide log messages</dd>
<dt><tt class="docutils literal"><span class="pre">m</span></tt></dt>
<dd>Sort processes by MEM usage</dd>
<dt><tt class="docutils literal"><span class="pre">n</span></tt></dt>
<dd>Show/hide network stats</dd>
<dt><tt class="docutils literal"><span class="pre">p</span></tt></dt>
<dd>Sort processes by name</dd>
<dt><tt class="docutils literal"><span class="pre">q</span></tt></dt>
<dd>Quit</dd>
<dt><tt class="docutils literal"><span class="pre">s</span></tt></dt>
<dd>Show/hide sensors stats (only available with -e flag)</dd>
<dt><tt class="docutils literal"><span class="pre">t</span></tt></dt>
<dd>View network I/O as combination</dd>
<dt><tt class="docutils literal"><span class="pre">u</span></tt></dt>
<dd>View cumulative network I/O</dd>
<dt><tt class="docutils literal"><span class="pre">w</span></tt></dt>
<dd>Delete finished warning log messages</dd>
<dt><tt class="docutils literal"><span class="pre">x</span></tt></dt>
<dd>Delete finished warning and critical log messages</dd>
<dt><tt class="docutils literal"><span class="pre">y</span></tt></dt>
<dd>Show/hide hddtemp stats (only available with -y flag)</dd>
<dt><tt class="docutils literal"><span class="pre">1</span></tt></dt>
<dd>Switch between global CPU and per-CPU stats</dd>
</dl>
</div>
</div>
<div class="section" id="configuration">
<h2><a class="toc-backref" href="#id15">Configuration</a><a class="headerlink" href="#configuration" title="Permalink to this headline"></a></h2>
<p>No configuration file is mandatory to use Glances.</p>
<p>Furthermore a configuration file is needed for setup limits and/or monitored processes list.</p>
<p>By default, the configuration file is under:</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Linux:</th><td class="field-body"><tt class="docutils literal"><span class="pre">/etc/glances/glances.conf</span></tt></td>
</tr>
<tr class="field-even field"><th class="field-name">*BSD and OS X:</th><td class="field-body"><tt class="docutils literal"><span class="pre">/usr/local/etc/glances/glances.conf</span></tt></td>
</tr>
<tr class="field-odd field"><th class="field-name">Windows:</th><td class="field-body"><tt class="docutils literal"><span class="pre">%APPDATA%\glances\glances.conf</span></tt></td>
</tr>
</tbody>
</table>
<p>On Windows XP, the <tt class="docutils literal"><span class="pre">%APPDATA%</span></tt> path is:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">C:\Documents and Settings\&lt;User&gt;\Application Data</span>
</pre></div>
</div>
<p>Since Windows Vista and newer versions:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">C:\Users\&lt;User&gt;\AppData\Roaming</span>
</pre></div>
</div>
<p>You can override the default configuration, located in one of the above
directories on your system, except for Windows.</p>
<p>Just copy the <tt class="docutils literal"><span class="pre">glances.conf</span></tt> file to your <tt class="docutils literal"><span class="pre">$XDG_CONFIG_HOME</span></tt> directory, e.g. Linux:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">mkdir -p $XDG_CONFIG_HOME/glances</span>
<span class="go">cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/</span>
</pre></div>
</div>
<p>On OS X, you should copy the configuration file to <tt class="docutils literal"><span class="pre">~/Library/Application</span> <span class="pre">Support/glances/</span></tt>.</p>
</div>
<div class="section" id="anatomy-of-the-application">
<h2><a class="toc-backref" href="#id16">Anatomy of the application</a><a class="headerlink" href="#anatomy-of-the-application" title="Permalink to this headline"></a></h2>
<div class="section" id="legend">
<h3><a class="toc-backref" href="#id17">Legend</a><a class="headerlink" href="#legend" title="Permalink to this headline"></a></h3>
<div class="line-block">
<div class="line"><tt class="docutils literal"><span class="pre">GREEN</span></tt> stat counter is <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line"><tt class="docutils literal"><span class="pre">BLUE</span></tt> stat counter is <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line"><tt class="docutils literal"><span class="pre">MAGENTA</span></tt> stat counter is <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line"><tt class="docutils literal"><span class="pre">RED</span></tt> stat counter is <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
</div>
<div class="section" id="header">
<h3><a class="toc-backref" href="#id18">Header</a><a class="headerlink" href="#header" title="Permalink to this headline"></a></h3>
<img alt="_images/header.png" src="_images/header.png" />
<p>The header shows the OS name, release version, platform architecture and the hostname.
On Linux, it shows also the kernel version.</p>
</div>
<div class="section" id="cpu">
<h3><a class="toc-backref" href="#id19">CPU</a><a class="headerlink" href="#cpu" title="Permalink to this headline"></a></h3>
<p>Short view:</p>
<img alt="_images/cpu.png" src="_images/cpu.png" />
<p>If enough horizontal space is available, extended CPU informations are displayed.</p>
<p>Extended view:</p>
<img alt="_images/cpu-wide.png" src="_images/cpu-wide.png" />
<p>To switch to per-CPU stats, just hit the <tt class="docutils literal"><span class="pre">1</span></tt> key:</p>
<img alt="_images/per-cpu.png" src="_images/per-cpu.png" />
<p>The CPU stats are shown as a percentage and for the configured refresh time.
The total CPU usage is displayed on the first line.</p>
<div class="line-block">
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">&lt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">&gt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">&gt;90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal"><span class="pre">[cpu]</span></tt> section.</p>
</div>
<div class="section" id="load">
<h3><a class="toc-backref" href="#id20">Load</a><a class="headerlink" href="#load" title="Permalink to this headline"></a></h3>
<img alt="_images/load.png" src="_images/load.png" />
<p>On the <em>No Sheep</em> blog, <em>Zachary Tirrell</em> defines the average load <a class="footnote-reference" href="#id4" id="id1">[1]</a>:</p>
<blockquote>
<div>&#8220;In short it is the average sum of the number of processes
waiting in the run-queue plus the number currently executing
over 1, 5, and 15 minute time periods.&#8221;</div></blockquote>
<p>Glances gets the number of CPU core to adapt the alerts.
Alerts on average load are only set on 5 and 15 min.
The first line also display the number of CPU core.</p>
<div class="line-block">
<div class="line">If average load is <tt class="docutils literal"><span class="pre">&lt;0.7*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">If average load is <tt class="docutils literal"><span class="pre">&gt;0.7*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line">If average load is <tt class="docutils literal"><span class="pre">&gt;1*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line">If average load is <tt class="docutils literal"><span class="pre">&gt;5*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal"><span class="pre">[load]</span></tt> section.</p>
</div>
<div class="section" id="memory">
<h3><a class="toc-backref" href="#id21">Memory</a><a class="headerlink" href="#memory" title="Permalink to this headline"></a></h3>
<p>Glances uses two columns: one for the <tt class="docutils literal"><span class="pre">RAM</span></tt> and another one for the <tt class="docutils literal"><span class="pre">Swap</span></tt>.</p>
<img alt="_images/mem.png" src="_images/mem.png" />
<p>If enough space is available, Glances displays extended informations:</p>
<img alt="_images/mem-wide.png" src="_images/mem-wide.png" />
<p>With Glances, alerts are only set for on used memory and used swap.</p>
<div class="line-block">
<div class="line">If memory is <tt class="docutils literal"><span class="pre">&lt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">If memory is <tt class="docutils literal"><span class="pre">&gt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line">If memory is <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line">If memory is <tt class="docutils literal"><span class="pre">&gt;90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal"><span class="pre">[memory]</span></tt> and <tt class="docutils literal"><span class="pre">[swap]</span></tt> sections.</p>
</div>
<div class="section" id="network">
<h3><a class="toc-backref" href="#id22">Network</a><a class="headerlink" href="#network" title="Permalink to this headline"></a></h3>
<img alt="_images/network.png" src="_images/network.png" />
<p>Glances displays the network interface bit rate. The unit is adapted
dynamically (bits per second, kbits per second, Mbits per second, etc).</p>
<p>Alerts are only set if the network interface maximum speed is available.</p>
<p>For example, on a 100 Mbps ethernet interface, the warning status is set
if the bit rate is higher than 70 Mbps.</p>
<div class="line-block">
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">&lt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">&gt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">&gt;90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
</div>
<div class="section" id="sensors">
<h3><a class="toc-backref" href="#id23">Sensors</a><a class="headerlink" href="#sensors" title="Permalink to this headline"></a></h3>
<p>Glances can displays the sensors informations trough <cite>lm-sensors</cite> (only available on Linux).</p>
<p>As of lm-sensors, a filter is processed in order to display temperature only:</p>
<img alt="_images/sensors.png" src="_images/sensors.png" />
<p>Glances can also grab hard disk temperature through the <cite>hddtemp</cite> daemon (see here <a class="footnote-reference" href="#id5" id="id2">[2]</a> to install hddtemp on your system):</p>
<img alt="_images/hddtemp.png" src="_images/hddtemp.png" />
<p>To enable the lm-sensors module:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> glances -e
</pre></div>
</div>
<p>To enable the hddtemp module:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> glances -y
</pre></div>
</div>
<p>There is no alert on this information.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal"><span class="pre">[temperature]</span></tt> and <tt class="docutils literal"><span class="pre">[hddtemperature]</span></tt> sections.</p>
</div>
<div class="section" id="disk-i-o">
<h3><a class="toc-backref" href="#id24">Disk I/O</a><a class="headerlink" href="#disk-i-o" title="Permalink to this headline"></a></h3>
<img alt="_images/diskio.png" src="_images/diskio.png" />
<p>Glances displays the disk I/O throughput. The unit is adapted dynamically.</p>
<p><em>Note</em>: There is no alert on this information.</p>
</div>
<div class="section" id="file-system">
<h3><a class="toc-backref" href="#id25">File system</a><a class="headerlink" href="#file-system" title="Permalink to this headline"></a></h3>
<img alt="_images/fs.png" src="_images/fs.png" />
<p>Glances displays the used and total file system disk space. The unit is
adapted dynamically.</p>
<p>Alerts are set for used disk space:</p>
<div class="line-block">
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">&lt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">&gt;50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CAREFUL&quot;</span></tt></div>
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">&gt;70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">&gt;90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under <tt class="docutils literal"><span class="pre">[filesystem]</span></tt> section.</p>
</div>
<div class="section" id="processes-list">
<h3><a class="toc-backref" href="#id26">Processes list</a><a class="headerlink" href="#processes-list" title="Permalink to this headline"></a></h3>
<p>Compact view:</p>
<img alt="_images/processlist.png" src="_images/processlist.png" />
<p>Full view:</p>
<img alt="_images/processlist-wide.png" src="_images/processlist-wide.png" />
<p>Three views are available for processes:</p>
<ul class="simple">
<li>Processes summary</li>
<li>Optional monitored processes list (new in 1.7)</li>
<li>Processes list</li>
</ul>
<p>By default, or if you hit the <tt class="docutils literal"><span class="pre">a</span></tt> key, the processes list is automatically
sorted by CPU of memory usage.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal"><span class="pre">[process]</span></tt> section.</p>
<p>The number of processes in the list is adapted to the screen size.</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">VIRT</span></tt></dt>
<dd>Total program size (VMS)</dd>
<dt><tt class="docutils literal"><span class="pre">RES</span></tt></dt>
<dd>Resident set size (RSS)</dd>
<dt><tt class="docutils literal"><span class="pre">CPU%</span></tt></dt>
<dd>% of CPU used by the process</dd>
<dt><tt class="docutils literal"><span class="pre">MEM%</span></tt></dt>
<dd>% of MEM used by the process</dd>
<dt><tt class="docutils literal"><span class="pre">PID</span></tt></dt>
<dd>Process ID</dd>
<dt><tt class="docutils literal"><span class="pre">USER</span></tt></dt>
<dd>User ID per process</dd>
<dt><tt class="docutils literal"><span class="pre">NI</span></tt></dt>
<dd>Nice level of the process</dd>
<dt><tt class="docutils literal"><span class="pre">S</span></tt></dt>
<dd>Process status</dd>
<dt><tt class="docutils literal"><span class="pre">TIME+</span></tt></dt>
<dd>Cumulative CPU time used</dd>
<dt><tt class="docutils literal"><span class="pre">IOR/s</span></tt></dt>
<dd>Per process IO read rate (in Byte/s)</dd>
<dt><tt class="docutils literal"><span class="pre">IOW/s</span></tt></dt>
<dd>Per process IO write rate (in Byte/s)</dd>
<dt><tt class="docutils literal"><span class="pre">NAME</span></tt></dt>
<dd>Process name or command line</dd>
</dl>
<p>Process status legend:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">R</span></tt></dt>
<dd>running</dd>
<dt><tt class="docutils literal"><span class="pre">S</span></tt></dt>
<dd>sleeping (may be interrupted)</dd>
<dt><tt class="docutils literal"><span class="pre">D</span></tt></dt>
<dd>disk sleep (may not be interrupted)</dd>
<dt><tt class="docutils literal"><span class="pre">T</span></tt></dt>
<dd>traced/stopped</dd>
<dt><tt class="docutils literal"><span class="pre">Z</span></tt></dt>
<dd>zombie</dd>
</dl>
</div>
<div class="section" id="monitored-processes-list">
<h3><a class="toc-backref" href="#id27">Monitored processes list</a><a class="headerlink" href="#monitored-processes-list" title="Permalink to this headline"></a></h3>
<p>New in version 1.7. Optional.</p>
<p>The monitored processes list allows user, through the configuration file,
to group processes and quickly show if the number of running process is not good.</p>
<img alt="_images/monitored.png" src="_images/monitored.png" />
<p>Each item is defined by:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">description</span></tt>: description of the processes (max 16 chars).</li>
<li><tt class="docutils literal"><span class="pre">regex</span></tt>: regular expression of the processes to monitor.</li>
<li><tt class="docutils literal"><span class="pre">command</span></tt> (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.</li>
<li><tt class="docutils literal"><span class="pre">countmin</span></tt> (optional): minimal number of processes. A warning will be displayed if number of processes &lt; count.</li>
<li><tt class="docutils literal"><span class="pre">countmax</span></tt> (optional): maximum number of processes. A warning will be displayed if number of processes &gt; count.</li>
</ul>
<p>Up to 10 items can be defined.</p>
<p>For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">[monitor]</span>
<span class="go">list_1_description=Nginx server</span>
<span class="go">list_1_regex=.*nginx.*</span>
<span class="go">list_1_command=nginx -v</span>
<span class="go">list_1_countmin=1</span>
<span class="go">list_1_countmax=4</span>
</pre></div>
</div>
<p>If you also want to monitor the PHP-FPM daemon processes, you should add another item:</p>
<div class="highlight-console"><div class="highlight"><pre><span class="go">[monitor]</span>
<span class="go">list_1_description=Nginx server</span>
<span class="go">list_1_regex=.*nginx.*</span>
<span class="go">list_1_command=nginx -v</span>
<span class="go">list_1_countmin=1</span>
<span class="go">list_1_countmax=4</span>
<span class="go">list_1_description=PHP-FPM</span>
<span class="go">list_1_regex=.*php-fpm.*</span>
<span class="go">list_1_countmin=1</span>
<span class="go">list_1_countmax=20</span>
</pre></div>
</div>
<p>In client/server mode, the list is defined on the server side.
A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.</p>
<p>Alerts are set as following:</p>
<div class="line-block">
<div class="line">If number of processes is 0, then status is set to <tt class="docutils literal"><span class="pre">&quot;CRITICAL&quot;</span></tt></div>
<div class="line">If number of processes is min &lt; current &lt; max, then status is set to <tt class="docutils literal"><span class="pre">&quot;OK&quot;</span></tt></div>
<div class="line">Else status is set to <tt class="docutils literal"><span class="pre">&quot;WARNING&quot;</span></tt></div>
</div>
</div>
<div class="section" id="logs">
<h3><a class="toc-backref" href="#id28">Logs</a><a class="headerlink" href="#logs" title="Permalink to this headline"></a></h3>
<img alt="_images/logs.png" src="_images/logs.png" />
<p>A log messages list is displayed in the bottom of the screen if (and only if):</p>
<ul class="simple">
<li>at least one <tt class="docutils literal"><span class="pre">WARNING</span></tt> or <tt class="docutils literal"><span class="pre">CRITICAL</span></tt> alert was occurred</li>
<li>space is available in the bottom of the console/terminal</li>
</ul>
<p>Each alert message displays the following information:</p>
<ol class="arabic simple">
<li>start date</li>
<li>end date</li>
<li>alert name</li>
<li>{min/avg/max} values or number of running processes for monitored processes list alerts</li>
</ol>
</div>
<div class="section" id="footer">
<h3><a class="toc-backref" href="#id29">Footer</a><a class="headerlink" href="#footer" title="Permalink to this headline"></a></h3>
<img alt="_images/footer.png" src="_images/footer.png" />
<p>Glances displays the current date &amp; time and access to the embedded help screen.</p>
<p>If one or mode batteries were found on your machine and if the batinfo Python library <a class="footnote-reference" href="#id6" id="id3">[3]</a>
is installed on your system then Glances displays the available percent capacity in the middle on the footer.</p>
<img alt="_images/battery.png" src="_images/battery.png" />
<p>If you have ran Glances in client mode <tt class="docutils literal"><span class="pre">-c</span></tt>, you can also see if the client is connected to the server.</p>
<p>If client is connected:</p>
<img alt="_images/client-connected.png" src="_images/client-connected.png" />
<p>else:</p>
<img alt="_images/client-disconnected.png" src="_images/client-disconnected.png" />
<p>On the left, you can easily see if you are connected to a Glances server.</p>
</div>
</div>
<div class="section" id="api-documentation">
<h2><a class="toc-backref" href="#id30">API documentation</a><a class="headerlink" href="#api-documentation" title="Permalink to this headline"></a></h2>
<p>Glances uses a <a class="reference external" href="http://docs.python.org/2/library/simplexmlrpcserver.html">XML-RPC server</a> and can be used by another client software.</p>
<p>API documentation is available at <a class="reference external" href="https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To">https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To</a></p>
</div>
<div class="section" id="support">
<h2><a class="toc-backref" href="#id31">Support</a><a class="headerlink" href="#support" title="Permalink to this headline"></a></h2>
<p>To report a bug or a feature request use the bug tracking system at <a class="reference external" href="https://github.com/nicolargo/glances/issues">https://github.com/nicolargo/glances/issues</a></p>
<p>Feel free to contribute!</p>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td><a class="reference external" href="http://nosheep.net/story/defining-unix-load-average/">http://nosheep.net/story/defining-unix-load-average/</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id5" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td><a class="reference external" href="http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html">http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id6" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td><a class="reference external" href="https://github.com/nicolargo/batinfo">https://github.com/nicolargo/batinfo</a></td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Glances</a><ul>
<li><a class="reference internal" href="#introduction">Introduction</a></li>
<li><a class="reference internal" href="#usage">Usage</a><ul>
<li><a class="reference internal" href="#standalone-mode">Standalone mode</a></li>
<li><a class="reference internal" href="#client-server-mode">Client/Server mode</a></li>
</ul>
</li>
<li><a class="reference internal" href="#command-reference">Command reference</a><ul>
<li><a class="reference internal" href="#command-line-options">Command-line options</a></li>
<li><a class="reference internal" href="#interactive-commands">Interactive commands</a></li>
</ul>
</li>
<li><a class="reference internal" href="#configuration">Configuration</a></li>
<li><a class="reference internal" href="#anatomy-of-the-application">Anatomy of the application</a><ul>
<li><a class="reference internal" href="#legend">Legend</a></li>
<li><a class="reference internal" href="#header">Header</a></li>
<li><a class="reference internal" href="#cpu">CPU</a></li>
<li><a class="reference internal" href="#load">Load</a></li>
<li><a class="reference internal" href="#memory">Memory</a></li>
<li><a class="reference internal" href="#network">Network</a></li>
<li><a class="reference internal" href="#sensors">Sensors</a></li>
<li><a class="reference internal" href="#disk-i-o">Disk I/O</a></li>
<li><a class="reference internal" href="#file-system">File system</a></li>
<li><a class="reference internal" href="#processes-list">Processes list</a></li>
<li><a class="reference internal" href="#monitored-processes-list">Monitored processes list</a></li>
<li><a class="reference internal" href="#logs">Logs</a></li>
<li><a class="reference internal" href="#footer">Footer</a></li>
</ul>
</li>
<li><a class="reference internal" href="#api-documentation">API documentation</a></li>
<li><a class="reference internal" href="#support">Support</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="index.html"
title="previous chapter">Welcome to Glances&#8217;s documentation!</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/glances-doc.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="index.html" title="Welcome to Glancess documentation!"
>previous</a> |</li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013, Nicolas Hennion.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -1,146 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to Glancess documentation! &mdash; Glances 1.7.3 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.7.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Glances 1.7.3 documentation" href="#" />
<link rel="next" title="Glances" href="glances-doc.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="glances-doc.html" title="Glances"
accesskey="N">next</a> |</li>
<li><a href="#">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="welcome-to-glances-s-documentation">
<h1>Welcome to Glances&#8217;s documentation!<a class="headerlink" href="#welcome-to-glances-s-documentation" title="Permalink to this headline"></a></h1>
<p><strong>Glances</strong> is a cross-platform curses-based monitoring tool written in Python.</p>
<p>It uses the psutil library and some internal code to get information from your system.</p>
<img alt="https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png" src="https://raw.github.com/nicolargo/glances/master/docs/images/screenshot-wide.png" />
<div class="section" id="get-the-code">
<h2>Get the code<a class="headerlink" href="#get-the-code" title="Permalink to this headline"></a></h2>
<p>The <a class="reference external" href="http://github.com/nicolargo/glances">source</a> is available on GitHub.</p>
</div>
<div class="section" id="contents">
<h2>Contents<a class="headerlink" href="#contents" title="Permalink to this headline"></a></h2>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="glances-doc.html">Glances</a><ul>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#introduction">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#usage">Usage</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#command-reference">Command reference</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#configuration">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#anatomy-of-the-application">Anatomy of the application</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#api-documentation">API documentation</a></li>
<li class="toctree-l2"><a class="reference internal" href="glances-doc.html#support">Support</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<ul class="simple">
<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li>
<li><a class="reference internal" href="py-modindex.html"><em>Module Index</em></a></li>
<li><a class="reference internal" href="search.html"><em>Search Page</em></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="#">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Welcome to Glances&#8217;s documentation!</a><ul>
<li><a class="reference internal" href="#get-the-code">Get the code</a></li>
<li><a class="reference internal" href="#contents">Contents</a><ul>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
</ul>
<h4>Next topic</h4>
<p class="topless"><a href="glances-doc.html"
title="next chapter">Glances</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/index.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="glances-doc.html" title="Glances"
>next</a> |</li>
<li><a href="#">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013, Nicolas Hennion.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

Binary file not shown.

View File

@ -1,101 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; Glances 1.7.3 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.7.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="top" title="Glances 1.7.3 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.
</p>
<form action="" method="get">
<input type="text" name="q" value="" />
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li><a href="index.html">Glances 1.7.3 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013, Nicolas Hennion.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -1 +0,0 @@
Search.setIndex({objects:{},terms:{represent:0,all:0,code:1,appdata:0,global:0,sleep:0,follow:0,disk:0,compact:0,middl:0,depend:0,program:0,swap:0,under:0,list_1_command:0,sourc:1,string:0,iowait:0,trough:0,pocess:[],level:0,list:0,item:0,rate:0,port:0,compat:0,index:1,hide:0,sum:0,access:0,delet:0,version:0,"new":0,net:0,method:0,full:0,mem:0,batinfo:0,here:0,address:0,path:0,legend:0,valu:0,wait:0,search:1,queue:0,throughput:0,list_1_countmax:0,modul:[0,1],unix:0,api:[0,1],xdg_config_hom:0,instal:0,total:0,unit:0,regex:0,from:[0,1],describ:0,memori:0,two:0,call:0,usr:0,sort:0,warn:0,flag:0,setup:0,work:0,can:0,root:0,overrid:0,prompt:0,process:0,indic:1,critic:0,minimum:0,caution:0,want:0,magenta:0,occur:0,end:0,fpm:0,anoth:0,write:0,how:0,low:0,csv:0,max:0,mai:0,data:0,averag:0,"short":0,footer:0,bind:0,counter:0,issu:0,inform:[0,1],"switch":0,curent:[],combin:0,allow:0,ethernet:0,order:0,hennion:0,cyberc:0,help:0,over:0,privileg:0,dynam:0,group:0,monitor:[0,1],fit:0,platform:[0,1],window:0,good:0,"return":0,python:[0,1],interrupt:0,introduct:[0,1],name:0,refresh:0,psutil:[0,1],mode:0,each:0,found:0,side:0,hard:0,connect:0,tirrel:0,shown:0,network:0,space:0,content:[0,1],adapt:0,sensor:0,red:0,free:0,standalon:0,base:[0,1],zombi:0,releas:0,"byte":0,care:0,mbit:0,filter:0,view:0,first:0,softwar:0,feel:0,number:0,system:[0,1],date:0,messag:0,size:0,sheep:0,given:0,script:0,interact:0,mkdir:0,capac:0,least:0,stori:0,cumul:0,termin:0,listen:0,shell:0,consol:0,option:0,tool:[0,1],copi:0,github:[0,1],hddtemp:0,list_1_regex:0,than:0,rss:0,remot:0,second:0,horizont:0,were:0,consumpt:0,minut:0,zachari:0,countmin:0,ran:0,ram:0,have:0,tabl:[0,1],need:0,min:0,note:0,also:0,ideal:0,client:0,which:0,green:0,singl:0,anatomi:[0,1],blue:0,trace:0,track:0,regular:0,"80x24":0,bsd:0,request:0,drive:0,section:0,show:0,xml:0,current:0,onli:0,locat:0,execut:0,copyright:0,configur:[0,1],written:[0,1],should:0,folder:0,local:0,overwritten:0,hit:0,contribut:0,get:[0,1],express:0,stop:0,report:0,requir:0,enabl:0,through:0,grab:0,septemb:[],where:0,summari:0,wiki:0,kernel:0,set:0,maximum:0,see:0,sec:0,statu:0,kei:0,list_1_descript:0,enough:0,between:0,attribut:0,hddtemperatur:0,august:[],extend:0,screen:0,job:0,addit:0,etc:0,com:0,load:0,simpli:0,color:0,period:0,header:0,rpc:0,linux:0,batteri:0,nicola:0,quit:0,three:0,sinc:0,json:0,quickli:0,present:0,mount:0,aim:0,defin:0,"while":0,abov:0,mandatori:0,glanc:[0,1],list_1_countmin:0,virt:0,conf:0,nicolargo:0,avg:0,welcom:1,minim:0,cross:[0,1],html:0,nosheep:0,document:[0,1],higher:0,finish:0,http:0,hostnam:0,iow:0,ior:0,alert:0,user:0,php:0,exampl:0,command:[0,1],thi:0,filesystem:0,left:0,just:0,percent:0,tcp:0,speed:0,web:0,except:0,blog:0,add:0,els:0,applic:[0,1],read:0,howto:0,nginx:0,temperatur:0,biz:0,press:0,bit:0,password:0,daemon:0,resid:0,manual:0,server:0,kbit:0,output:0,nice:0,page:1,www:0,some:[0,1],percentag:0,intern:1,librari:[0,1],bottom:0,definit:0,per:0,pysensor:0,exit:0,refer:[0,1],machin:0,core:0,plu:0,run:0,bold:0,usag:[0,1],column:0,roam:0,disabl:0,countmax:0,automat:0,mbp:0,your:[0,1],log:0,support:[0,1],avail:[0,1],start:0,interfac:0,ipv4:0,ipv6:0,newer:0,line:0,bug:0,count:0,"default":0,displai:0,limit:0,embed:0,featur:0,curs:[0,1],classic:0,pid:0,"char":0,novemb:0,file:0,vista:0,tip:0,virtual:[],you:0,architectur:0,stat:0,easili:0,furthermor:0,directori:0,descript:0,getallmonitor:0,time:0,cpu:0},objtypes:{},titles:["Glances","Welcome to Glances&#8217;s documentation!"],objnames:{},filenames:["glances-doc","index"]})

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
#
# Glances documentation build configuration file, created by
# sphinx-quickstart on Tue Aug 20 13:33:45 2013.
# sphinx-quickstart on Tue Mar 25 19:57:21 2014.
#
# This file is execfile()d with the current directory set to its containing dir.
#
@ -41,16 +41,16 @@ master_doc = 'index'
# General information about the project.
project = u'Glances'
copyright = u'2013, Nicolas Hennion'
copyright = u'2014, Nicolas Hennion'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.7.3'
version = '1.7.5'
# The full version, including alpha/beta/rc tags.
release = '1.7.3'
release = '1.7.5'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -70,12 +70,12 @@ p.topic-title {
font-weight: bold;
}
pre.code {
pre {
margin-left: 2em;
margin-right: 2em;
}
.console {
.console, .literal-block {
background-color: #eeeeee;
border: 1px solid #cccccc;
max-width: 60em;
@ -123,70 +123,78 @@ td.option-group {
<div class="document" id="glances">
<h1 class="title">Glances</h1>
<p>This manual describes <em>Glances</em> version 1.7.3.</p>
<p>Copyright © 2012-2013 Nicolas Hennion &lt;<a class="reference external" href="mailto:nicolas&#64;nicolargo.com">nicolas&#64;nicolargo.com</a>&gt;</p>
<p>November 2013</p>
<p>This manual describes <em>Glances</em> version 2.0.</p>
<p>Copyright © 2012-2014 Nicolas Hennion &lt;<a class="reference external" href="mailto:nicolas&#64;nicolargo.com">nicolas&#64;nicolargo.com</a>&gt;</p>
<p>June 2014</p>
<div class="contents topic" id="table-of-contents">
<p class="topic-title first">Table of Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#introduction" id="id7">Introduction</a></li>
<li><a class="reference internal" href="#usage" id="id8">Usage</a><ul>
<li><a class="reference internal" href="#standalone-mode" id="id9">Standalone mode</a></li>
<li><a class="reference internal" href="#client-server-mode" id="id10">Client/Server mode</a></li>
<li><a class="reference internal" href="#introduction" id="id6">Introduction</a></li>
<li><a class="reference internal" href="#usage" id="id7">Usage</a><ul>
<li><a class="reference internal" href="#standalone-mode" id="id8">Standalone Mode</a></li>
<li><a class="reference internal" href="#client-server-mode" id="id9">Client/Server Mode</a></li>
<li><a class="reference internal" href="#web-server-mode" id="id10">Web Server Mode</a></li>
</ul>
</li>
<li><a class="reference internal" href="#command-reference" id="id11">Command reference</a><ul>
<li><a class="reference internal" href="#command-line-options" id="id12">Command-line options</a></li>
<li><a class="reference internal" href="#interactive-commands" id="id13">Interactive commands</a></li>
<li><a class="reference internal" href="#command-reference" id="id11">Command Reference</a><ul>
<li><a class="reference internal" href="#command-line-options" id="id12">Command-Line Options</a></li>
<li><a class="reference internal" href="#interactive-commands" id="id13">Interactive Commands</a></li>
</ul>
</li>
<li><a class="reference internal" href="#configuration" id="id14">Configuration</a></li>
<li><a class="reference internal" href="#anatomy-of-the-application" id="id15">Anatomy of the application</a><ul>
<li><a class="reference internal" href="#anatomy-of-the-application" id="id15">Anatomy Of The Application</a><ul>
<li><a class="reference internal" href="#legend" id="id16">Legend</a></li>
<li><a class="reference internal" href="#header" id="id17">Header</a></li>
<li><a class="reference internal" href="#cpu" id="id18">CPU</a></li>
<li><a class="reference internal" href="#load" id="id19">Load</a></li>
<li><a class="reference internal" href="#memory" id="id20">Memory</a></li>
<li><a class="reference internal" href="#network" id="id21">Network</a></li>
<li><a class="reference internal" href="#sensors" id="id22">Sensors</a></li>
<li><a class="reference internal" href="#disk-i-o" id="id23">Disk I/O</a></li>
<li><a class="reference internal" href="#file-system" id="id24">File system</a></li>
<li><a class="reference internal" href="#processes-list" id="id25">Processes list</a></li>
<li><a class="reference internal" href="#monitored-processes-list" id="id26">Monitored processes list</a></li>
<li><a class="reference internal" href="#disk-i-o" id="id22">Disk I/O</a></li>
<li><a class="reference internal" href="#file-system" id="id23">File System</a></li>
<li><a class="reference internal" href="#sensors" id="id24">Sensors</a></li>
<li><a class="reference internal" href="#processes-list" id="id25">Processes List</a></li>
<li><a class="reference internal" href="#monitored-processes-list" id="id26">Monitored Processes List</a></li>
<li><a class="reference internal" href="#logs" id="id27">Logs</a></li>
<li><a class="reference internal" href="#footer" id="id28">Footer</a></li>
</ul>
</li>
<li><a class="reference internal" href="#api-documentation" id="id29">API documentation</a></li>
<li><a class="reference internal" href="#support" id="id30">Support</a></li>
<li><a class="reference internal" href="#other-outputs" id="id28">Other Outputs</a></li>
<li><a class="reference internal" href="#api-documentation" id="id29">API Documentation</a></li>
<li><a class="reference internal" href="#id3" id="id30">Other outputs</a></li>
<li><a class="reference internal" href="#note-the-css-and-img-folders-glances-data-should-be-in-the-tmp-folder" id="id31"><em>Note</em>: The css and img folders (glances/data) should be in the /tmp folder.</a></li>
<li><a class="reference internal" href="#support" id="id32">Support</a></li>
</ul>
</div>
<div class="section" id="introduction">
<h1><a class="toc-backref" href="#id7">Introduction</a></h1>
<p>Glances is a cross-platform curses-based monitoring tool which aims to
present a maximum of information in a minimum of space, ideally to fit
in a classical 80x24 terminal or higher to have additional information.</p>
<p>Glances can adapt dynamically the displayed information depending on the
terminal size. It can also work in a client/server mode for remote monitoring.</p>
<p>Glances is written in Python and uses the <a class="reference external" href="https://code.google.com/p/psutil/">psutil</a> library to get information from your system.</p>
<h1><a class="toc-backref" href="#id6">Introduction</a></h1>
<p>Glances is a cross-platform curses-based system monitoring tool which
aims to present a maximum of information in a minimum of space, ideally
to fit in a classical 80x24 terminal or higher to have additional
information. It can adapt dynamically the displayed information depending
on the terminal size.</p>
<p>Glances can also work in client/server mode. Remote monitoring could be
done via terminal or web interface.</p>
<p>Glances is written in Python and uses the <a class="reference external" href="https://code.google.com/p/psutil/">psutil</a> library to get
information from your system.</p>
<p>Console (80x24)</p>
<img alt="images/screenshot.png" src="images/screenshot.png" />
<p>Full view (&gt;80x24)</p>
<img alt="images/screenshot-wide.png" src="images/screenshot-wide.png" />
<p>Web interface (Firefox)</p>
<img alt="images/screenshot-web.png" src="images/screenshot-web.png" />
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id8">Usage</a></h1>
<h1><a class="toc-backref" href="#id7">Usage</a></h1>
<div class="section" id="standalone-mode">
<h2><a class="toc-backref" href="#id9">Standalone mode</a></h2>
<h2><a class="toc-backref" href="#id8">Standalone Mode</a></h2>
<p>Simply run:</p>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances
</pre>
</div>
<div class="section" id="client-server-mode">
<h2><a class="toc-backref" href="#id10">Client/Server mode</a></h2>
<p>If you want to remotely monitor a machine, called <tt class="docutils literal">server</tt>, from another one, called <tt class="docutils literal">client</tt>,
just run on the server:</p>
<h2><a class="toc-backref" href="#id9">Client/Server Mode</a></h2>
<p>If you want to remotely monitor a machine, called <tt class="docutils literal">server</tt>, from
another one, called <tt class="docutils literal">client</tt>, just run on the server:</p>
<pre class="code console literal-block">
<span class="generic output">server$ glances -s</span>
</pre>
@ -195,90 +203,146 @@ just run on the server:</p>
<span class="generic output">client$ glances -c &#64;server</span>
</pre>
<p>where <tt class="docutils literal">&#64;server</tt> is the IP address or hostname of the server.</p>
<p>In server mode, you can set the bind address <tt class="docutils literal"><span class="pre">-B</span> ADDRESS</tt> and listening TCP port <tt class="docutils literal"><span class="pre">-p</span> PORT</tt>.</p>
<p>In server mode, you can set the bind address <tt class="docutils literal"><span class="pre">-B</span> ADDRESS</tt> and listening
TCP port <tt class="docutils literal"><span class="pre">-p</span> PORT</tt>.</p>
<p>In client mode, you can set the TCP port of the server <tt class="docutils literal"><span class="pre">-p</span> PORT</tt>.</p>
<p>Default binding address is <tt class="docutils literal">0.0.0.0</tt> (Glances will listen on all the network interfaces) and TCP port is <tt class="docutils literal">61209</tt>.</p>
<p>You can also set a password to access to the server <tt class="docutils literal"><span class="pre">--password</span></tt>.</p>
<p>Default binding address is <tt class="docutils literal">0.0.0.0</tt> (Glances will listen on all the
network interfaces) and TCP port is <tt class="docutils literal">61209</tt>.</p>
<p>In client/server mode, limits are set by the server side.</p>
<p>You can also set a password to access to the server <tt class="docutils literal"><span class="pre">-P</span> password</tt>.</p>
<p>Glances is <tt class="docutils literal">IPv6</tt> compatible. Just use the <tt class="docutils literal"><span class="pre">-B</span> ::</tt> option to bind to all IPv6 addresses.</p>
<p>Glances is <tt class="docutils literal">IPv6</tt> compatible. Just use the <tt class="docutils literal"><span class="pre">-B</span> ::</tt> option to bind to
all IPv6 addresses.</p>
<p>As an experimental feature, if Glances server is not detected by the
client, the latter will try to grab stats using the <tt class="docutils literal">SNMP</tt> protocol:</p>
<pre class="code console literal-block">
<span class="generic output">client$ glances -c &#64;snmpserver</span>
</pre>
<p>Known issues: grab using SNMP is only validated for GNU/Linux with SNMP
v2/2c server.</p>
</div>
<div class="section" id="web-server-mode">
<h2><a class="toc-backref" href="#id10">Web Server Mode</a></h2>
<p>If you want to remotely monitor a machine, called <tt class="docutils literal">server</tt>, from any
device with a web browser, called <tt class="docutils literal">client</tt>, just run on the server:</p>
<pre class="code console literal-block">
<span class="generic output">server$ glances -w</span>
</pre>
<p>and on the client enter the following URL in your favorite web browser:</p>
<pre class="literal-block">
http://&#64;server:61208
</pre>
<p>where <tt class="docutils literal">&#64;server</tt> is the IP address or hostname of the server.</p>
<p>The Glances web interface follows responsive web design principles.</p>
<p>Screenshot from Chrome on Android</p>
<img alt="images/screenshot-web2.png" src="images/screenshot-web2.png" />
</div>
</div>
<div class="section" id="command-reference">
<h1><a class="toc-backref" href="#id11">Command reference</a></h1>
<h1><a class="toc-backref" href="#id11">Command Reference</a></h1>
<div class="section" id="command-line-options">
<h2><a class="toc-backref" href="#id12">Command-line options</a></h2>
<h2><a class="toc-backref" href="#id12">Command-Line Options</a></h2>
<table class="docutils option-list" frame="void" rules="none">
<col class="option" />
<col class="description" />
<tbody valign="top">
<tr><td class="option-group">
<kbd><span class="option">-b</span></kbd></td>
<td>Display network rate in Byte per second (default: bit per second)</td></tr>
<kbd><span class="option">-h</span>, <span class="option">--help</span></kbd></td>
<td>show this help message and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-B <var>IP</var></span></kbd></td>
<td>Bind server to the given IPv4/IPv6 address or hostname</td></tr>
<kbd><span class="option">-V</span>, <span class="option">--version</span></kbd></td>
<td>show program's version number and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-c <var>IP</var></span></kbd></td>
<td>Connect to a Glances server by IPv4/IPv6 address or hostname</td></tr>
<kbd><span class="option">-b</span>, <span class="option">--byte</span></kbd></td>
<td>display network rate in byte per second</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-B <var>BIND_ADDRESS</var></span>, <span class="option">--bind <var>BIND_ADDRESS</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>bind server to the given IPv4/IPv6 address or hostname</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-c <var>CLIENT</var></span>, <span class="option">--client <var>CLIENT</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>connect to a Glances server by IPv4/IPv6 address or
hostname</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-C <var>CONF_FILE</var></span>, <span class="option">--config <var>CONF_FILE</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>path to the configuration file</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-C <var>FILE</var></span></kbd></td>
<td>Path to the configuration file</td></tr>
<kbd><span class="option">--disable-bold</span></kbd></td>
<td>disable bold mode in the terminal</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--disable-diskio</span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>disable disk I/O module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-d</span></kbd></td>
<td>Disable disk I/O module</td></tr>
<kbd><span class="option">--disable-fs</span></kbd></td>
<td>disable file system module</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--disable-network</span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>disable network module</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--disable-sensors</span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>disable sensors module</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--disable-process</span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>disable process module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-e</span></kbd></td>
<td>Enable sensors module (requires pysensors, Linux-only)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-f <var>FILE</var></span></kbd></td>
<td>Set the HTML output folder or CSV file</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-h</span></kbd></td>
<td>Display the help and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-m</span></kbd></td>
<td>Disable mount module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-n</span></kbd></td>
<td>Disable network module</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-o <var>OUTPUT</var></span></kbd></td>
<td>Define additional output (available: HTML or CSV)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-p <var>PORT</var></span></kbd></td>
<td>Define the client/server TCP port (default: 61209)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-P <var>PASSWORD</var></span></kbd></td>
<td>Define a client/server password</td></tr>
<kbd><span class="option">--disable-log</span></kbd></td>
<td>disable log module</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--output-csv <var>OUTPUT_CSV</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>export stats to a CSV file</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-p <var>PORT</var></span>, <span class="option">--port <var>PORT</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>define the client/server TCP port [default: 61209]</td></tr>
<tr><td class="option-group">
<kbd><span class="option">--password</span></kbd></td>
<td>Define a client/server password from the prompt</td></tr>
<td>define a client/server password from the prompt or
file</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-r</span></kbd></td>
<td>Disable process list (for low CPU consumption)</td></tr>
<kbd><span class="option">-s</span>, <span class="option">--server</span></kbd></td>
<td>run Glances in server mode</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--snmp-community <var>SNMP_COMMUNITY</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>SNMP community</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--snmp-port <var>SNMP_PORT</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>SNMP port</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--snmp-version <var>SNMP_VERSION</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>SNMP version (1, 2c or 3)</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--snmp-user <var>SNMP_USER</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>SNMP username (only for SNMPv3)</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">--snmp-auth <var>SNMP_AUTH</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>SNMP authentication key (only for SNMPv3)</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-t <var>TIME</var></span>, <span class="option">--time <var>TIME</var></span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>set refresh time in seconds [default: 3 sec]</td></tr>
<tr><td class="option-group" colspan="2">
<kbd><span class="option">-w</span>, <span class="option">--webserver</span></kbd></td>
</tr>
<tr><td>&nbsp;</td><td>run Glances in Web server mode</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-s</span></kbd></td>
<td>Run Glances in server mode</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-t <var>SECONDS</var></span></kbd></td>
<td>Set refresh time in seconds (default: 3 sec)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-v</span></kbd></td>
<td>Display the version and exit</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-y</span></kbd></td>
<td>Enable hddtemp module (requires hddtemp)</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-z</span></kbd></td>
<td>Do not use the bold color attribute</td></tr>
<tr><td class="option-group">
<kbd><span class="option">-1</span></kbd></td>
<td>Start Glances in per-CPU mode</td></tr>
<kbd><span class="option">-1</span>, <span class="option">--percpu</span></kbd></td>
<td>start Glances in per CPU mode</td></tr>
</tbody>
</table>
</div>
<div class="section" id="interactive-commands">
<h2><a class="toc-backref" href="#id13">Interactive commands</a></h2>
<h2><a class="toc-backref" href="#id13">Interactive Commands</a></h2>
<p>The following commands (key pressed) are supported while in Glances:</p>
<dl class="docutils">
<dt><tt class="docutils literal">a</tt></dt>
@ -300,7 +364,7 @@ just run on the server:</p>
<dt><tt class="docutils literal">h</tt></dt>
<dd>Show/hide the help screen</dd>
<dt><tt class="docutils literal">i</tt></dt>
<dd>Sort processes by I/O rate (may need root privileges on some OSes)</dd>
<dd>Sort processes by I/O rate</dd>
<dt><tt class="docutils literal">l</tt></dt>
<dd>Show/hide log messages</dd>
<dt><tt class="docutils literal">m</tt></dt>
@ -312,7 +376,7 @@ just run on the server:</p>
<dt><tt class="docutils literal">q</tt></dt>
<dd>Quit</dd>
<dt><tt class="docutils literal">s</tt></dt>
<dd>Show/hide sensors stats (only available with -e flag)</dd>
<dd>Show/hide sensors stats</dd>
<dt><tt class="docutils literal">t</tt></dt>
<dd>View network I/O as combination</dd>
<dt><tt class="docutils literal">u</tt></dt>
@ -321,8 +385,8 @@ just run on the server:</p>
<dd>Delete finished warning log messages</dd>
<dt><tt class="docutils literal">x</tt></dt>
<dd>Delete finished warning and critical log messages</dd>
<dt><tt class="docutils literal">y</tt></dt>
<dd>Show/hide hddtemp stats (only available with -y flag)</dd>
<dt><tt class="docutils literal">z</tt></dt>
<dd>Show/hide processes stats</dd>
<dt><tt class="docutils literal">1</tt></dt>
<dd>Switch between global CPU and per-CPU stats</dd>
</dl>
@ -330,8 +394,11 @@ just run on the server:</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id14">Configuration</a></h1>
<p><strong>Caution! Glances version 1.x configuration files are not compatible
with the version 2.x.</strong></p>
<p>No configuration file is mandatory to use Glances.</p>
<p>Furthermore a configuration file is needed for setup limits and/or monitored processes list.</p>
<p>Furthermore a configuration file is needed to set up limits, disks or
network interfaces to hide and/or monitored processes list.</p>
<p>By default, the configuration file is under:</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
@ -346,24 +413,26 @@ just run on the server:</p>
</tbody>
</table>
<p>On Windows XP, the <tt class="docutils literal">%APPDATA%</tt> path is:</p>
<pre class="code console literal-block">
<span class="generic output">C:\Documents and Settings\&lt;User&gt;\Application Data</span>
<pre class="literal-block">
C:\Documents and Settings\&lt;User&gt;\Application Data
</pre>
<p>Since Windows Vista and newer versions:</p>
<pre class="code console literal-block">
<span class="generic output">C:\Users\&lt;User&gt;\AppData\Roaming</span>
<pre class="literal-block">
C:\Users\&lt;User&gt;\AppData\Roaming
</pre>
<p>You can override the default configuration, located in one of the above
directories on your system, except for Windows.</p>
<p>Just copy the <tt class="docutils literal">glances.conf</tt> file to your <tt class="docutils literal">$XDG_CONFIG_HOME</tt> directory, e.g. Linux:</p>
<p>Just copy the <tt class="docutils literal">glances.conf</tt> file to your <tt class="docutils literal">$XDG_CONFIG_HOME</tt> directory,
e.g., on Linux:</p>
<pre class="code console literal-block">
<span class="generic output">mkdir -p $XDG_CONFIG_HOME/glances
cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/</span>
cp /usr/share/doc/glances/glances.conf $XDG_CONFIG_HOME/glances/</span>
</pre>
<p>On OS X, you should copy the configuration file to <tt class="docutils literal">~/Library/Application Support/glances/</tt>.</p>
<p>On OS X, you should copy the configuration file to
<tt class="docutils literal">~/Library/Application Support/glances/</tt>.</p>
</div>
<div class="section" id="anatomy-of-the-application">
<h1><a class="toc-backref" href="#id15">Anatomy of the application</a></h1>
<h1><a class="toc-backref" href="#id15">Anatomy Of The Application</a></h1>
<div class="section" id="legend">
<h2><a class="toc-backref" href="#id16">Legend</a></h2>
<div class="line-block">
@ -372,121 +441,127 @@ cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/</span>
<div class="line"><tt class="docutils literal">MAGENTA</tt> stat counter is <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line"><tt class="docutils literal">RED</tt> stat counter is <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
<p><em>Note</em>: only stats with colored background will be logged in the alert
view.</p>
</div>
<div class="section" id="header">
<h2><a class="toc-backref" href="#id17">Header</a></h2>
<img alt="images/header.png" src="images/header.png" />
<p>The header shows the OS name, release version, platform architecture and the hostname.
On Linux, it shows also the kernel version.</p>
<p>The header shows the hostname, OS name, release version, platform
architecture and system uptime (on the upper right corner).
Additionally, on GNU/Linux, it also shows the kernel version.</p>
<p>In client mode, the server connection status is displayed.</p>
<p>Connected:</p>
<img alt="images/connected.png" src="images/connected.png" />
<p>Disconnected:</p>
<img alt="images/disconnected.png" src="images/disconnected.png" />
</div>
<div class="section" id="cpu">
<h2><a class="toc-backref" href="#id18">CPU</a></h2>
<p>Short view:</p>
<img alt="images/cpu.png" src="images/cpu.png" />
<p>If enough horizontal space is available, extended CPU informations are displayed.</p>
<p>If enough horizontal space is available, extended CPU information are
displayed.</p>
<p>Extended view:</p>
<img alt="images/cpu-wide.png" src="images/cpu-wide.png" />
<p>To switch to per-CPU stats, just hit the <tt class="docutils literal">1</tt> key:</p>
<img alt="images/per-cpu.png" src="images/per-cpu.png" />
<p>The CPU stats are shown as a percentage and for the configured refresh time.
The total CPU usage is displayed on the first line.</p>
<p>The CPU stats are shown as a percentage and for the configured refresh
time. The total CPU usage is displayed on the first line.</p>
<div class="line-block">
<div class="line">If user|system|nice CPU is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If user|system|nice CPU is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
<div class="line">If user|system CPU is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If user|system CPU is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If user|system CPU is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If user|system CPU is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal">[cpu]</tt> section.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under
the <tt class="docutils literal">[cpu]</tt> and/or <tt class="docutils literal">[percpu]</tt> sections.</p>
</div>
<div class="section" id="load">
<h2><a class="toc-backref" href="#id19">Load</a></h2>
<img alt="images/load.png" src="images/load.png" />
<p>On the <em>No Sheep</em> blog, <em>Zachary Tirrell</em> defines the average load <a class="footnote-reference" href="#id4" id="id1">[1]</a>:</p>
<p>On the <em>No Sheep</em> blog, <em>Zachary Tirrell</em> defines the load average <a class="footnote-reference" href="#id4" id="id1">[1]</a>:</p>
<blockquote>
&quot;In short it is the average sum of the number of processes
waiting in the run-queue plus the number currently executing
over 1, 5, and 15 minute time periods.&quot;</blockquote>
over 1, 5, and 15 minutes time periods.&quot;</blockquote>
<p>Glances gets the number of CPU core to adapt the alerts.
Alerts on average load are only set on 5 and 15 min.
The first line also display the number of CPU core.</p>
Alerts on load average are only set on 15 minutes time period.
The first line also displays the number of CPU core.</p>
<div class="line-block">
<div class="line">If average load is <tt class="docutils literal">&lt;0.7*core</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If average load is <tt class="docutils literal">&gt;0.7*core</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If average load is <tt class="docutils literal">&gt;1*core</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If average load is <tt class="docutils literal">&gt;5*core</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
<div class="line">If load average is <tt class="docutils literal">&lt;0.7*core</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If load average is <tt class="docutils literal">&gt;0.7*core</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If load average is <tt class="docutils literal">&gt;1*core</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If load average is <tt class="docutils literal">&gt;5*core</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal">[load]</tt> section.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under
the <tt class="docutils literal">[load]</tt> section.</p>
</div>
<div class="section" id="memory">
<h2><a class="toc-backref" href="#id20">Memory</a></h2>
<p>Glances uses two columns: one for the <tt class="docutils literal">RAM</tt> and another one for the <tt class="docutils literal">Swap</tt>.</p>
<p>Glances uses two columns: one for the <tt class="docutils literal">RAM</tt> and one for the <tt class="docutils literal">SWAP</tt>.</p>
<img alt="images/mem.png" src="images/mem.png" />
<p>If enough space is available, Glances displays extended informations:</p>
<p>If enough space is available, Glances displays extended information for
the <tt class="docutils literal">RAM</tt>:</p>
<img alt="images/mem-wide.png" src="images/mem-wide.png" />
<p>With Glances, alerts are only set for on used memory and used swap.</p>
<p>Alerts are only set for used memory and used swap.</p>
<div class="line-block">
<div class="line">If memory is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If memory is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If memory is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If memory is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
<div class="line">If used memory|swap is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If used memory|swap is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If used memory|swap is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If used memory|swap is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal">[memory]</tt> and <tt class="docutils literal">[swap]</tt> sections.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under
the <tt class="docutils literal">[memory]</tt> and/or <tt class="docutils literal">[memswap]</tt> sections.</p>
</div>
<div class="section" id="network">
<h2><a class="toc-backref" href="#id21">Network</a></h2>
<img alt="images/network.png" src="images/network.png" />
<p>Glances displays the network interface bit rate. The unit is adapted
dynamically (bits per second, kbits per second, Mbits per second, etc).</p>
<p>Alerts are only set if the network interface maximum speed is available.</p>
<p>For example, on a 100 Mbps ethernet interface, the warning status is set
if the bit rate is higher than 70 Mbps.</p>
<div class="line-block">
<div class="line">If bit rate is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If bit rate is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If bit rate is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If bit rate is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
</div>
<div class="section" id="sensors">
<h2><a class="toc-backref" href="#id22">Sensors</a></h2>
<p>Glances can displays the sensors informations trough <cite>lm-sensors</cite> (only available on Linux).</p>
<p>As of lm-sensors, a filter is processed in order to display temperature only:</p>
<img alt="images/sensors.png" src="images/sensors.png" />
<p>Glances can also grab hard disk temperature through the <cite>hddtemp</cite> daemon (see here <a class="footnote-reference" href="#id5" id="id2">[2]</a> to install hddtemp on your system):</p>
<img alt="images/hddtemp.png" src="images/hddtemp.png" />
<p>To enable the lm-sensors module:</p>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances -e
</pre>
<p>To enable the hddtemp module:</p>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances -y
</pre>
<p>There is no alert on this information.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal">[temperature]</tt> and <tt class="docutils literal">[hddtemperature]</tt> sections.</p>
<p>Alerts are only set if the maximum speed per network interface is available
(see sample in the configuration file).</p>
<p><em>Note</em>: it is possibile to define a list of network interfaces to hide
and per-interface limit values in the <tt class="docutils literal">[network]</tt> section of the
configuration file.</p>
</div>
<div class="section" id="disk-i-o">
<h2><a class="toc-backref" href="#id23">Disk I/O</a></h2>
<h2><a class="toc-backref" href="#id22">Disk I/O</a></h2>
<img alt="images/diskio.png" src="images/diskio.png" />
<p>Glances displays the disk I/O throughput. The unit is adapted dynamically.</p>
<p><em>Note</em>: There is no alert on this information.</p>
<p>There is no alert on this information.</p>
<p><em>Note</em>: it is possible to define a list of disks to hide under the
<tt class="docutils literal">[diskio]</tt> section in the configuration file.</p>
</div>
<div class="section" id="file-system">
<h2><a class="toc-backref" href="#id24">File system</a></h2>
<h2><a class="toc-backref" href="#id23">File System</a></h2>
<img alt="images/fs.png" src="images/fs.png" />
<p>Glances displays the used and total file system disk space. The unit is
adapted dynamically.</p>
<p>Alerts are set for used disk space:</p>
<p>Alerts are set for used disk space.</p>
<div class="line-block">
<div class="line">If disk used is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If disk used is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If disk used is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If disk used is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
<div class="line">If used disk is <tt class="docutils literal">&lt;50%</tt>, then status is set to <tt class="docutils literal">&quot;OK&quot;</tt></div>
<div class="line">If used disk is <tt class="docutils literal">&gt;50%</tt>, then status is set to <tt class="docutils literal">&quot;CAREFUL&quot;</tt></div>
<div class="line">If used disk is <tt class="docutils literal">&gt;70%</tt>, then status is set to <tt class="docutils literal">&quot;WARNING&quot;</tt></div>
<div class="line">If used disk is <tt class="docutils literal">&gt;90%</tt>, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
</div>
<p><em>Note</em>: limit values can be overwritten in the configuration file under <tt class="docutils literal">[filesystem]</tt> section.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under
the <tt class="docutils literal">[filesystem]</tt> section.</p>
</div>
<div class="section" id="sensors">
<h2><a class="toc-backref" href="#id24">Sensors</a></h2>
<p>Glances can displays the sensors information using <cite>lm-sensors</cite>,
<cite>hddtemp</cite> and <cite>batinfo</cite> <a class="footnote-reference" href="#id5" id="id2">[2]</a>.</p>
<p>All of the above libraries are available only on Linux.</p>
<p>As of lm-sensors, a filter is being applied in order to display
temperature only.</p>
<img alt="images/sensors.png" src="images/sensors.png" />
<p>There is no alert on this information.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under
the <tt class="docutils literal">[sensors]</tt> section.</p>
</div>
<div class="section" id="processes-list">
<h2><a class="toc-backref" href="#id25">Processes list</a></h2>
<h2><a class="toc-backref" href="#id25">Processes List</a></h2>
<p>Compact view:</p>
<img alt="images/processlist.png" src="images/processlist.png" />
<p>Full view:</p>
@ -494,80 +569,101 @@ adapted dynamically.</p>
<p>Three views are available for processes:</p>
<ul class="simple">
<li>Processes summary</li>
<li>Optional monitored processes list (new in 1.7)</li>
<li>Optional monitored processes list (see below)</li>
<li>Processes list</li>
</ul>
<p>By default, or if you hit the <tt class="docutils literal">a</tt> key, the processes list is automatically
sorted by CPU of memory usage.</p>
<p><em>Note</em>: limit values can be overwritten in the configuration file under the <tt class="docutils literal">[process]</tt> section.</p>
<p>The processes summary line display:</p>
<ul class="simple">
<li>Tasks number (total number of processes)</li>
<li>Threads number</li>
<li>Running tasks number</li>
<li>Sleeping tasks number</li>
<li>Other tasks number (not running or sleeping)</li>
<li>Sort key</li>
</ul>
<p>By default, or if you hit the <tt class="docutils literal">a</tt> key, the processes list is
automatically sorted by:</p>
<ul class="simple">
<li><tt class="docutils literal">CPU</tt> if there is no alert (default behavior)</li>
<li><tt class="docutils literal">CPU</tt> if a CPU or LOAD alert is detected</li>
<li><tt class="docutils literal">MEM</tt> if a memory alert is detected</li>
<li><tt class="docutils literal">Disk I/O</tt> if a CPU iowait alert is detected</li>
</ul>
<p>The number of processes in the list is adapted to the screen size.</p>
<dl class="docutils">
<dt><tt class="docutils literal">VIRT</tt></dt>
<dd>Total program size (VMS)</dd>
<dt><tt class="docutils literal">RES</tt></dt>
<dd>Resident set size (RSS)</dd>
<dt><tt class="docutils literal">CPU%</tt></dt>
<dd>% of CPU used by the process</dd>
<dt><tt class="docutils literal">MEM%</tt></dt>
<dd>% of MEM used by the process</dd>
<dt><tt class="docutils literal">VIRT</tt></dt>
<dd>Total program size aka Virtual Memory Size (VMS)</dd>
<dt><tt class="docutils literal">RES</tt></dt>
<dd>Resident Set Size (RSS)</dd>
<dt><tt class="docutils literal">PID</tt></dt>
<dd>Process ID</dd>
<dt><tt class="docutils literal">USER</tt></dt>
<dd>User ID per process</dd>
<dd>User ID</dd>
<dt><tt class="docutils literal">NI</tt></dt>
<dd>Nice level of the process</dd>
<dd>Nice level of the process (niceness other than 0 is highlighted)</dd>
<dt><tt class="docutils literal">S</tt></dt>
<dd>Process status</dd>
<dd>Process status (running process is highlighted)</dd>
<dt><tt class="docutils literal">TIME+</tt></dt>
<dd>Cumulative CPU time used</dd>
<dt><tt class="docutils literal">IOR/s</tt></dt>
<dd>Per process IO read rate (in Byte/s)</dd>
<dd>Per process I/O read rate (in Byte/s)</dd>
<dt><tt class="docutils literal">IOW/s</tt></dt>
<dd>Per process IO write rate (in Byte/s)</dd>
<dt><tt class="docutils literal">NAME</tt></dt>
<dd>Process name or command line</dd>
<dd>Per process I/O write rate (in Byte/s)</dd>
<dt><tt class="docutils literal">COMMAND</tt></dt>
<dd>Process command line (process name is highlighted)</dd>
</dl>
<p>Process status legend:</p>
<dl class="docutils">
<dt><tt class="docutils literal">R</tt></dt>
<dd>running</dd>
<dd>Running</dd>
<dt><tt class="docutils literal">S</tt></dt>
<dd>sleeping (may be interrupted)</dd>
<dd>Sleeping (may be interrupted)</dd>
<dt><tt class="docutils literal">D</tt></dt>
<dd>disk sleep (may not be interrupted)</dd>
<dd>Disk sleep (may not be interrupted)</dd>
<dt><tt class="docutils literal">T</tt></dt>
<dd>traced/stopped</dd>
<dd>Traced / Stopped</dd>
<dt><tt class="docutils literal">Z</tt></dt>
<dd>zombie</dd>
<dd>Zombie</dd>
</dl>
<p><em>Note</em>: limits values can be overwritten in the configuration file under
the <tt class="docutils literal">[process]</tt> section.</p>
</div>
<div class="section" id="monitored-processes-list">
<h2><a class="toc-backref" href="#id26">Monitored processes list</a></h2>
<p>New in version 1.7. Optional.</p>
<h2><a class="toc-backref" href="#id26">Monitored Processes List</a></h2>
<p>The monitored processes list allows user, through the configuration file,
to group processes and quickly show if the number of running process is not good.</p>
to group processes and quickly show if the number of running processes is
not good.</p>
<img alt="images/monitored.png" src="images/monitored.png" />
<p>Each item is defined by:</p>
<ul class="simple">
<li><tt class="docutils literal">description</tt>: description of the processes (max 16 chars).</li>
<li><tt class="docutils literal">regex</tt>: regular expression of the processes to monitor.</li>
<li><tt class="docutils literal">command</tt> (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.</li>
<li><tt class="docutils literal">countmin</tt> (optional): minimal number of processes. A warning will be displayed if number of processes &lt; count.</li>
<li><tt class="docutils literal">countmax</tt> (optional): maximum number of processes. A warning will be displayed if number of processes &gt; count.</li>
<li><tt class="docutils literal">command</tt> (optional): full path to shell command/script for extended
stat. Should return a single line string. Use with caution.</li>
<li><tt class="docutils literal">countmin</tt> (optional): minimal number of processes. A warning will
be displayed if number of processes &lt; count.</li>
<li><tt class="docutils literal">countmax</tt> (optional): maximum number of processes. A warning will
be displayed if number of processes &gt; count.</li>
</ul>
<p>Up to 10 items can be defined.</p>
<p>For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:</p>
<pre class="code console literal-block">
<span class="generic output">[monitor]
<p>For example, if you want to monitor the Nginx processes on a Web server,
the following definition should do the job:</p>
<pre class="literal-block">
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4</span>
list_1_countmax=4
</pre>
<p>If you also want to monitor the PHP-FPM daemon processes, you should add another item:</p>
<pre class="code console literal-block">
<span class="generic output">[monitor]
<p>If you also want to monitor the PHP-FPM daemon processes, you should add
another item:</p>
<pre class="literal-block">
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
@ -576,10 +672,11 @@ list_1_countmax=4
list_1_description=PHP-FPM
list_1_regex=.*php-fpm.*
list_1_countmin=1
list_1_countmax=20</span>
list_1_countmax=20
</pre>
<p>In client/server mode, the list is defined on the server side.
A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.</p>
A new method, called <cite>getAllMonitored</cite>, is available in the APIs and
get the JSON representation of the monitored processes list.</p>
<p>Alerts are set as following:</p>
<div class="line-block">
<div class="line">If number of processes is 0, then status is set to <tt class="docutils literal">&quot;CRITICAL&quot;</tt></div>
@ -590,42 +687,78 @@ A new method, called getAllMonitored, is available in the APIs and get the JSON
<div class="section" id="logs">
<h2><a class="toc-backref" href="#id27">Logs</a></h2>
<img alt="images/logs.png" src="images/logs.png" />
<p>A log messages list is displayed in the bottom of the screen if (and only if):</p>
<p>A log messages list is displayed in the bottom of the screen if (and
only if):</p>
<ul class="simple">
<li>at least one <tt class="docutils literal">WARNING</tt> or <tt class="docutils literal">CRITICAL</tt> alert was occurred</li>
<li>space is available in the bottom of the console/terminal</li>
</ul>
<p>Each alert message displays the following information:</p>
<ol class="arabic simple">
<li>start date</li>
<li>end date</li>
<li>start datetime</li>
<li>duration if alert is terminated or <cite>ongoing</cite> if the alert is still in
progress</li>
<li>alert name</li>
<li>{min/avg/max} values or number of running processes for monitored processes list alerts</li>
<li>{min,avg,max} values or number of running processes for monitored
processes list alerts</li>
</ol>
</div>
<div class="section" id="footer">
<h2><a class="toc-backref" href="#id28">Footer</a></h2>
<img alt="images/footer.png" src="images/footer.png" />
<p>Glances displays the current date &amp; time and access to the embedded help screen.</p>
<p>If one or mode batteries were found on your machine and if the batinfo Python library <a class="footnote-reference" href="#id6" id="id3">[3]</a>
is installed on your system then Glances displays the available percent capacity in the middle on the footer.</p>
<img alt="images/battery.png" src="images/battery.png" />
<p>If you have ran Glances in client mode <tt class="docutils literal"><span class="pre">-c</span></tt>, you can also see if the client is connected to the server.</p>
<p>If client is connected:</p>
<img alt="images/client-connected.png" src="images/client-connected.png" />
<p>else:</p>
<img alt="images/client-disconnected.png" src="images/client-disconnected.png" />
<p>On the left, you can easily see if you are connected to a Glances server.</p>
</div>
<div class="section" id="other-outputs">
<h1><a class="toc-backref" href="#id28">Other Outputs</a></h1>
<p>It is possible to export statistics to CSV file.</p>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances --output-csv /tmp/glances.csv
</pre>
<p>CSV files have two lines per stats:</p>
<ul class="simple">
<li>Stats description</li>
<li>Stats (comma separated)</li>
</ul>
</div>
<div class="section" id="api-documentation">
<h1><a class="toc-backref" href="#id29">API documentation</a></h1>
<h1><a class="toc-backref" href="#id29">API Documentation</a></h1>
<p>Glances uses a <a class="reference external" href="http://docs.python.org/2/library/simplexmlrpcserver.html">XML-RPC server</a> and can be used by another client software.</p>
<p>API documentation is available at <a class="reference external" href="https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To">https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To</a></p>
<p>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
API documentation is available at <a class="reference external" href="https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To">https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To</a></p>
</div>
<div class="section" id="id3">
<h1><a class="toc-backref" href="#id30">Other outputs</a></h1>
<p>Thanks to the -o (output) option, it is possible to export statistics to <cite>CSV</cite> or <cite>HTML</cite> files.</p>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances -o CSV -f /tmp
</pre>
<p>The CSV output file is named <tt class="docutils literal">glances.csv</tt>.</p>
<p>CSV files have on line per stats:</p>
<ul class="simple">
<li>load,load1,load5,load15</li>
<li>mem,total,used,free</li>
<li>swap,total,used,free</li>
<li>cpu,user,system,nice,idle,iowait,irq</li>
</ul>
<pre class="code console literal-block">
<span class="generic prompt">$</span> glances -o HTML -f /tmp
</pre>
<p>The HTML output file is named <tt class="docutils literal">glances.html</tt>.</p>
</div>
<div class="section" id="note-the-css-and-img-folders-glances-data-should-be-in-the-tmp-folder">
<h1><a class="toc-backref" href="#id31"><em>Note</em>: The css and img folders (glances/data) should be in the /tmp folder.</a></h1>
<div class="system-message">
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">./docs/glances-doc.rst</tt>, line 628)</p>
<p>Title underline too short.</p>
<pre class="literal-block">
*Note*: The css and img folders (glances/data) should be in the /tmp folder.
=======
</pre>
</div>
<p>API documentation is available at
<a class="reference external" href="https://github.com/nicolargo/glances/wiki/The-Glances-2.x-API-How-to">https://github.com/nicolargo/glances/wiki/The-Glances-2.x-API-How-to</a>.
&gt;&gt;&gt;&gt;&gt;&gt;&gt; release/v2.0</p>
</div>
<div class="section" id="support">
<h1><a class="toc-backref" href="#id30">Support</a></h1>
<p>To report a bug or a feature request use the bug tracking system at <a class="reference external" href="https://github.com/nicolargo/glances/issues">https://github.com/nicolargo/glances/issues</a></p>
<h1><a class="toc-backref" href="#id32">Support</a></h1>
<p>To report a bug or a feature request use the bug tracking system at
<a class="reference external" href="https://github.com/nicolargo/glances/issues">https://github.com/nicolargo/glances/issues</a>.</p>
<p>Feel free to contribute!</p>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
@ -636,13 +769,7 @@ is installed on your system then Glances displays the available percent capacity
<table class="docutils footnote" frame="void" id="id5" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td><a class="reference external" href="http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html">http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id6" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td><a class="reference external" href="https://github.com/nicolargo/batinfo">https://github.com/nicolargo/batinfo</a></td></tr>
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td><a class="reference external" href="https://github.com/nicolargo/batinfo">https://github.com/nicolargo/batinfo</a></td></tr>
</tbody>
</table>
</div>

View File

@ -6,23 +6,24 @@ This manual describes *Glances* version 2.0.
Copyright © 2012-2014 Nicolas Hennion <nicolas@nicolargo.com>
May 2014
June 2014
.. contents:: Table of Contents
Introduction
============
Glances is a cross-platform curses-based monitoring tool which aims to
present a maximum of information in a minimum of space, ideally to fit
in a classical 80x24 terminal or higher to have additional information.
Glances can adapt dynamically the displayed information depending on the
terminal size.
Glances is a cross-platform curses-based system monitoring tool which
aims to present a maximum of information in a minimum of space, ideally
to fit in a classical 80x24 terminal or higher to have additional
information. It can adapt dynamically the displayed information depending
on the terminal size.
Glances can also work in a client/server mode. Remote monitoring could be
done via terminal or Web interface.
Glances can also work in client/server mode. Remote monitoring could be
done via terminal or web interface.
Glances is written in Python and uses the `psutil`_ library to get information from your system.
Glances is written in Python and uses the `psutil`_ library to get
information from your system.
Console (80x24)
@ -39,7 +40,7 @@ Web interface (Firefox)
Usage
=====
Standalone mode
Standalone Mode
---------------
Simply run:
@ -48,10 +49,11 @@ Simply run:
$ glances
Client/Server mode
Client/Server Mode
------------------
If you want to remotely monitor a machine, called ``server``, from another one, called ``client``, just run on the server:
If you want to remotely monitor a machine, called ``server``, from
another one, called ``client``, just run on the server:
.. code-block:: console
@ -65,89 +67,100 @@ and on the client:
where ``@server`` is the IP address or hostname of the server.
In server mode, you can set the bind address ``-B ADDRESS`` and listening TCP port ``-p PORT``.
In server mode, you can set the bind address ``-B ADDRESS`` and listening
TCP port ``-p PORT``.
In client mode, you can set the TCP port of the server ``-p PORT``.
You can also set a password to access to the server ``--password``.
Default binding address is ``0.0.0.0`` (Glances will listen on all the network interfaces) and TCP port is ``61209``.
Default binding address is ``0.0.0.0`` (Glances will listen on all the
network interfaces) and TCP port is ``61209``.
In client/server mode, limits are set by the server side.
Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to all IPv6 addresses.
Glances is ``IPv6`` compatible. Just use the ``-B ::`` option to bind to
all IPv6 addresses.
As an experimental feature, if Glances server is not detected by the client, this last one try to grab stats using the SNMP protocol:
As an experimental feature, if Glances server is not detected by the
client, the latter will try to grab stats using the ``SNMP`` protocol:
.. code-block:: console
client$ glances -c @snmpserver
client$ glances -c @snmpserver
Known limitation: Grab using SNMP is only validated for GNU/Linux operating system with SNMP v2/2c server.
Known issues: grab using SNMP is only validated for GNU/Linux with SNMP
v2/2c server.
Web Server mode
----------------
Web Server Mode
---------------
If you want to remotely monitor a machine, called ``server``, from any device with a Web Browser (called ``client``), just run on the server:
If you want to remotely monitor a machine, called ``server``, from any
device with a web browser, called ``client``, just run on the server:
.. code-block:: console
server$ glances -w
and on the client, enter the following URL in your favorite Web Browser:
and on the client enter the following URL in your favorite web browser:
http:\\@server:61208\
::
http://@server:61208
where ``@server`` is the IP address or hostname of the server.
The Glances Web interface is responsive web designed (Android device screenshot):
The Glances web interface follows responsive web design principles.
Screenshot from Chrome on Android
.. image:: images/screenshot-web2.png
Command reference
Command Reference
=================
Command-line options
Command-Line Options
--------------------
-h, --help show this help message and exit
-V, --version show program's version number and exit
-V, --version show program's version number and exit
-b, --byte display network rate in byte per second
-B BIND_ADDRESS, --bind BIND_ADDRESS
bind server to the given IPv4/IPv6 address or hostname
bind server to the given IPv4/IPv6 address or hostname
-c CLIENT, --client CLIENT
connect to a Glances server by IPv4/IPv6 address or
hostname
connect to a Glances server by IPv4/IPv6 address or
hostname
-C CONF_FILE, --config CONF_FILE
path to the configuration file
path to the configuration file
--disable-bold disable bold mode in the terminal
--disable-diskio disable disk I/O module
--disable-fs disable filesystem module
--disable-fs disable file system module
--disable-network disable network module
--disable-sensors disable sensors module
--disable-process disable process module
--disable-log disable log module
--output-csv OUTPUT_CSV
export stats to a csv file
export stats to a CSV file
-p PORT, --port PORT define the client/server TCP port [default: 61209]
--password define a client/server password from the prompt/file
--password define a client/server password from the prompt or
file
-s, --server run Glances in server mode
--snmp-community SNMP_COMMUNITY
SNMP community
SNMP community
--snmp-port SNMP_PORT
SNMP port
SNMP port
--snmp-version SNMP_VERSION
SNMP version (1, 2c or 3)
SNMP version (1, 2c or 3)
--snmp-user SNMP_USER
SNMP username (only for SNMPv3)
SNMP username (only for SNMPv3)
--snmp-auth SNMP_AUTH
SNMP authentication key (only for SNMPv3)
SNMP authentication key (only for SNMPv3)
-t TIME, --time TIME set refresh time in seconds [default: 3 sec]
-w, --webserver run Glances in web server mode
-w, --webserver run Glances in Web server mode
-1, --percpu start Glances in per CPU mode
Interactive commands
Interactive Commands
--------------------
The following commands (key pressed) are supported while in Glances:
@ -169,7 +182,7 @@ The following commands (key pressed) are supported while in Glances:
``h``
Show/hide the help screen
``i``
Sort processes by I/O rate (may need root privileges on some OSes)
Sort processes by I/O rate
``l``
Show/hide log messages
``m``
@ -190,19 +203,21 @@ The following commands (key pressed) are supported while in Glances:
Delete finished warning log messages
``x``
Delete finished warning and critical log messages
``y``
Show/hide hddtemp stats
``z``
Show/hide processes stats
``1``
Switch between global CPU and per-CPU stats
Configuration
=============
**Caution: be aware that the Glances version 1.x configurations files are not comaptible with the version 2.x.**
**Caution! Glances version 1.x configuration files are not compatible
with the version 2.x.**
No configuration file is mandatory to use Glances.
Furthermore a configuration file is needed for setup limits, disks or network interfaces to hide and/or monitored processes list.
Furthermore a configuration file is needed to set up limits, disks or
network interfaces to hide and/or monitored processes list.
By default, the configuration file is under:
@ -212,29 +227,31 @@ By default, the configuration file is under:
On Windows XP, the ``%APPDATA%`` path is:
.. code-block:: console
::
C:\Documents and Settings\<User>\Application Data
Since Windows Vista and newer versions:
.. code-block:: console
::
C:\Users\<User>\AppData\Roaming
You can override the default configuration, located in one of the above
directories on your system, except for Windows.
Just copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory, e.g. Linux:
Just copy the ``glances.conf`` file to your ``$XDG_CONFIG_HOME`` directory,
e.g., on Linux:
.. code-block:: console
mkdir -p $XDG_CONFIG_HOME/glances
cp /etc/glances/glances.conf $XDG_CONFIG_HOME/glances/
cp /usr/share/doc/glances/glances.conf $XDG_CONFIG_HOME/glances/
On OS X, you should copy the configuration file to ``~/Library/Application Support/glances/``.
On OS X, you should copy the configuration file to
``~/Library/Application Support/glances/``.
Anatomy of the application
Anatomy Of The Application
==========================
Legend
@ -245,17 +262,19 @@ Legend
| ``MAGENTA`` stat counter is ``"WARNING"``
| ``RED`` stat counter is ``"CRITICAL"``
Note: Only stats with colored background will be logged in the alert view.
*Note*: only stats with colored background will be logged in the alert
view.
Header
------
.. image:: images/header.png
The header shows the hostname, OS name, release version, platform architecture and system uptime (on the upper right).
Additionnaly, on GNU/Linux operating system, it shows also the kernel version.
The header shows the hostname, OS name, release version, platform
architecture and system uptime (on the upper right corner).
Additionally, on GNU/Linux, it also shows the kernel version.
In client mode, the server connection status is displayed:
In client mode, the server connection status is displayed.
Connected:
@ -272,7 +291,8 @@ Short view:
.. image:: images/cpu.png
If enough horizontal space is available, extended CPU informations are displayed.
If enough horizontal space is available, extended CPU information are
displayed.
Extended view:
@ -282,57 +302,61 @@ To switch to per-CPU stats, just hit the ``1`` key:
.. image:: images/per-cpu.png
The CPU stats are shown as a percentage and for the configured refresh time.
The total CPU usage is displayed on the first line.
The CPU stats are shown as a percentage and for the configured refresh
time. The total CPU usage is displayed on the first line.
| If user|system|iowait CPU is ``<50%``, then status is set to ``"OK"``
| If user|system|iowait CPU is ``>50%``, then status is set to ``"CAREFUL"``
| If user|system|iowait CPU is ``>70%``, then status is set to ``"WARNING"``
| If user|system|iowait CPU is ``>90%``, then status is set to ``"CRITICAL"``
| If user|system CPU is ``<50%``, then status is set to ``"OK"``
| If user|system CPU is ``>50%``, then status is set to ``"CAREFUL"``
| If user|system CPU is ``>70%``, then status is set to ``"WARNING"``
| If user|system CPU is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[cpu]`` or/and ``[percpu]`` sections.
*Note*: limit values can be overwritten in the configuration file under
the ``[cpu]`` and/or ``[percpu]`` sections.
Load
----
.. image:: images/load.png
On the *No Sheep* blog, *Zachary Tirrell* defines the average load [1]_:
On the *No Sheep* blog, *Zachary Tirrell* defines the load average [1]_:
"In short it is the average sum of the number of processes
waiting in the run-queue plus the number currently executing
over 1, 5, and 15 minutes time periods."
Glances gets the number of CPU core to adapt the alerts.
Alerts on average load are only set on 15 minutes time period.
The first line also display the number of CPU core.
Alerts on load average are only set on 15 minutes time period.
The first line also displays the number of CPU core.
| If average load is ``<0.7*core``, then status is set to ``"OK"``
| If average load is ``>0.7*core``, then status is set to ``"CAREFUL"``
| If average load is ``>1*core``, then status is set to ``"WARNING"``
| If average load is ``>5*core``, then status is set to ``"CRITICAL"``
| If load average is ``<0.7*core``, then status is set to ``"OK"``
| If load average is ``>0.7*core``, then status is set to ``"CAREFUL"``
| If load average is ``>1*core``, then status is set to ``"WARNING"``
| If load average is ``>5*core``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[load]`` section.
*Note*: limit values can be overwritten in the configuration file under
the ``[load]`` section.
Memory
------
Glances uses two columns: one for the ``RAM`` and another one for the ``SWAP``.
Glances uses two columns: one for the ``RAM`` and one for the ``SWAP``.
.. image:: images/mem.png
If enough space is available, Glances displays extended informations for the ``RAM``:
If enough space is available, Glances displays extended information for
the ``RAM``:
.. image:: images/mem-wide.png
With Glances, alerts are only set for used memory and swap.
Alerts are only set for used memory and used swap.
| If memory is ``<50%``, then status is set to ``"OK"``
| If memory is ``>50%``, then status is set to ``"CAREFUL"``
| If memory is ``>70%``, then status is set to ``"WARNING"``
| If memory is ``>90%``, then status is set to ``"CRITICAL"``
| If used memory|swap is ``<50%``, then status is set to ``"OK"``
| If used memory|swap is ``>50%``, then status is set to ``"CAREFUL"``
| If used memory|swap is ``>70%``, then status is set to ``"WARNING"``
| If used memory|swap is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under the ``[memory]`` and ``[memswap]`` sections.
*Note*: limit values can be overwritten in the configuration file under
the ``[memory]`` and/or ``[memswap]`` sections.
Network
-------
@ -342,9 +366,12 @@ Network
Glances displays the network interface bit rate. The unit is adapted
dynamically (bits per second, kbits per second, Mbits per second, etc).
Alerts are only set if the network interface maximum speed is available (see sample in the configuration file).
Alerts are only set if the maximum speed per network interface is available
(see sample in the configuration file).
*Note*: In the `[network]`` section of the configuration file, you can define a list of network interfaces to hide and per interface limits value.
*Note*: it is possibile to define a list of network interfaces to hide
and per-interface limit values in the ``[network]`` section of the
configuration file.
Disk I/O
--------
@ -353,11 +380,12 @@ Disk I/O
Glances displays the disk I/O throughput. The unit is adapted dynamically.
*Note*: There is no alert on this information.
There is no alert on this information.
*Note*: In the configuration file, you can define a list of disk to hide.
*Note*: it is possible to define a list of disks to hide under the
``[diskio]`` section in the configuration file.
File system
File System
-----------
.. image:: images/fs.png
@ -365,33 +393,35 @@ File system
Glances displays the used and total file system disk space. The unit is
adapted dynamically.
Alerts are set for used disk space:
Alerts are set for used disk space.
| If disk used is ``<50%``, then status is set to ``"OK"``
| If disk used is ``>50%``, then status is set to ``"CAREFUL"``
| If disk used is ``>70%``, then status is set to ``"WARNING"``
| If disk used is ``>90%``, then status is set to ``"CRITICAL"``
| If used disk is ``<50%``, then status is set to ``"OK"``
| If used disk is ``>50%``, then status is set to ``"CAREFUL"``
| If used disk is ``>70%``, then status is set to ``"WARNING"``
| If used disk is ``>90%``, then status is set to ``"CRITICAL"``
*Note*: limit values can be overwritten in the configuration file under ``[filesystem]`` section.
*Note*: limit values can be overwritten in the configuration file under
the ``[filesystem]`` section.
Sensors
-------
Glances can displays the sensors information trough `lm-sensors` (only available on GNU/Linux), HDDTemp and BatInfo.
Glances can displays the sensors information using `lm-sensors`,
`hddtemp` and `batinfo` [2]_.
As of lm-sensors, a filter is processed in order to display temperature only:
All of the above libraries are available only on Linux.
As of lm-sensors, a filter is being applied in order to display
temperature only.
.. image:: images/sensors.png
Glances can also grab hard disk temperature through the `hddtemp` daemon (see here [2]_ to install hddtemp on your system):
.. image:: images/hddtemp.png
There is no alert on this information.
*Note*: limit values can be overwritten in the configuration file under the ``[sensors]`` section.
*Note*: limit values can be overwritten in the configuration file under
the ``[sensors]`` section.
Processes list
Processes List
--------------
Compact view:
@ -405,25 +435,25 @@ Full view:
Three views are available for processes:
* Processes summary
* Optional monitored processes list (see bellow)
* Optional monitored processes list (see below)
* Processes list
The processes summary line display:
* Tasks number (total number of processes)
* Threads number
* Threads number
* Running tasks number
* Sleeping tasks number
* Other tasks number (not running or sleeping)
* Sort key
By default, or if you hit the ``a`` key, the processes list is automatically
sorted by:
By default, or if you hit the ``a`` key, the processes list is
automatically sorted by:
* CPU if there is no alert (default behavor)
* CPU if a CPU or LOAD alert is detected
* MEM if a memory alert is detected
* DiskIO if a CPU IOWait alert is detected
* ``CPU`` if there is no alert (default behavior)
* ``CPU`` if a CPU or LOAD alert is detected
* ``MEM`` if a memory alert is detected
* ``Disk I/O`` if a CPU iowait alert is detected
The number of processes in the list is adapted to the screen size.
@ -432,27 +462,27 @@ The number of processes in the list is adapted to the screen size.
``MEM%``
% of MEM used by the process
``VIRT``
Total program size (VMS)
Total program size aka Virtual Memory Size (VMS)
``RES``
Resident set size (RSS)
Resident Set Size (RSS)
``PID``
Process ID
``USER``
User ID
``NI``
Nice level of the process
Nice level of the process (niceness other than 0 is highlighted)
``S``
Process status (see details bellow) (running process is highlighted)
Process status (running process is highlighted)
``TIME+``
Cumulative CPU time used
``IOR/s``
Per process IO read rate (in Byte/s)
Per process I/O read rate (in Byte/s)
``IOW/s``
Per process IO write rate (in Byte/s)
Per process I/O write rate (in Byte/s)
``COMMAND``
Process command line (process name is highlighted)
Process Status legend:
Process status legend:
``R``
Running
@ -465,13 +495,15 @@ Process Status legend:
``Z``
Zombie
*Note*: limits values can be overwritten in the configuration file under the ``[process]`` section.
*Note*: limits values can be overwritten in the configuration file under
the ``[process]`` section.
Monitored processes list
Monitored Processes List
------------------------
The monitored processes list allows user, through the configuration file,
to group processes and quickly show if the number of running process is not good.
to group processes and quickly show if the number of running processes is
not good.
.. image:: images/monitored.png
@ -479,15 +511,19 @@ Each item is defined by:
* ``description``: description of the processes (max 16 chars).
* ``regex``: regular expression of the processes to monitor.
* ``command`` (optional): full path to shell command/script for extended stat. Should return a single line string. Use with caution.
* ``countmin`` (optional): minimal number of processes. A warning will be displayed if number of processes < count.
* ``countmax`` (optional): maximum number of processes. A warning will be displayed if number of processes > count.
* ``command`` (optional): full path to shell command/script for extended
stat. Should return a single line string. Use with caution.
* ``countmin`` (optional): minimal number of processes. A warning will
be displayed if number of processes < count.
* ``countmax`` (optional): maximum number of processes. A warning will
be displayed if number of processes > count.
Up to 10 items can be defined.
For example, if you want to monitor the Nginx processes on a Web server, the following definition should do the job:
For example, if you want to monitor the Nginx processes on a Web server,
the following definition should do the job:
.. code-block:: console
::
[monitor]
list_1_description=Nginx server
@ -496,9 +532,10 @@ For example, if you want to monitor the Nginx processes on a Web server, the fol
list_1_countmin=1
list_1_countmax=4
If you also want to monitor the PHP-FPM daemon processes, you should add another item:
If you also want to monitor the PHP-FPM daemon processes, you should add
another item:
.. code-block:: console
::
[monitor]
list_1_description=Nginx server
@ -512,7 +549,8 @@ If you also want to monitor the PHP-FPM daemon processes, you should add another
list_1_countmax=20
In client/server mode, the list is defined on the server side.
A new method, called getAllMonitored, is available in the APIs and get the JSON representation of the monitored processes list.
A new method, called `getAllMonitored`, is available in the APIs and
get the JSON representation of the monitored processes list.
Alerts are set as following:
@ -525,27 +563,23 @@ Logs
.. image:: images/logs.png
A log messages list is displayed in the bottom of the screen if (and only if):
A log messages list is displayed in the bottom of the screen if (and
only if):
- at least one ``WARNING`` or ``CRITICAL`` alert was occurred
- space is available in the bottom of the console/terminal
Each alert message displays the following information:
1. start date
2. duration if alert is terminated or ongoing if the alert is on going
1. start datetime
2. duration if alert is terminated or `ongoing` if the alert is still in
progress
3. alert name
4. {min/avg/max} values or number of running processes for monitored processes list alerts
4. {min,avg,max} values or number of running processes for monitored
processes list alerts
API documentation
=================
Glances uses a `XML-RPC server`_ and can be used by another client software.
API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-2.x-API-How-to
Others outputs
==============
Other Outputs
=============
It is possible to export statistics to CSV file.
@ -558,17 +592,55 @@ CSV files have two lines per stats:
- Stats description
- Stats (comma separated)
API Documentation
=================
Glances uses a `XML-RPC server`_ and can be used by another client software.
<<<<<<< HEAD
API documentation is available at https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To
Other outputs
=============
Thanks to the -o (output) option, it is possible to export statistics to `CSV` or `HTML` files.
.. code-block:: console
$ glances -o CSV -f /tmp
The CSV output file is named ``glances.csv``.
CSV files have on line per stats:
- load,load1,load5,load15
- mem,total,used,free
- swap,total,used,free
- cpu,user,system,nice,idle,iowait,irq
.. code-block:: console
$ glances -o HTML -f /tmp
The HTML output file is named ``glances.html``.
*Note*: The css and img folders (glances/data) should be in the /tmp folder.
=======
API documentation is available at
https://github.com/nicolargo/glances/wiki/The-Glances-2.x-API-How-to.
>>>>>>> release/v2.0
Support
=======
To report a bug or a feature request use the bug tracking system at https://github.com/nicolargo/glances/issues
To report a bug or a feature request use the bug tracking system at
https://github.com/nicolargo/glances/issues.
Feel free to contribute!
.. [1] http://nosheep.net/story/defining-unix-load-average/
.. [2] http://www.cyberciti.biz/tips/howto-monitor-hard-drive-temperature.html
.. [3] https://github.com/nicolargo/batinfo
.. [2] https://github.com/nicolargo/batinfo
.. _psutil: https://code.google.com/p/psutil/
.. _XML-RPC server: http://docs.python.org/2/library/simplexmlrpcserver.html

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

After

Width:  |  Height:  |  Size: 242 KiB

View File

@ -25,4 +25,4 @@ Indices and tables
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
* :ref:`search`

View File

@ -61,12 +61,12 @@ p.topic-title {
font-weight: bold;
}
pre.code {
pre {
margin-left: 2em;
margin-right: 2em;
}
.console {
.console, .literal-block {
background-color: #eeeeee;
border: 1px solid #cccccc;
max-width: 60em;

View File

@ -16,9 +16,13 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Init the Glances software
"""
"""Init the Glances software."""
__appname__ = 'glances'
__version__ = '2.0'
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
__license__ = 'LGPL'
# Import system lib
import gettext
@ -26,6 +30,21 @@ import locale
import signal
import sys
# Import psutil
try:
from psutil import __version__ as __psutil_version
except ImportError:
print('psutil library not found. Glances cannot start.')
sys.exit(1)
# Check psutil version
psutil_min_version = (2, 0, 0)
psutil_version = tuple([int(num) for num in __psutil_version.split('.')])
if psutil_version < psutil_min_version:
print('psutil version {0} detected.').format(__psutil_version)
print('psutil 2.0 or higher is needed. Glances cannot start.')
sys.exit(1)
# Import Glances libs
# Note: others Glances libs will be imported optionally
from glances.core.glances_globals import gettext_domain, locale_dir
@ -33,17 +52,12 @@ from glances.core.glances_main import GlancesMain
def __signal_handler(signal, frame):
"""
Call back for CTRL-C
"""
"""Callback for CTRL-C."""
end()
def end():
"""
Stop Glances
"""
"""Stop Glances."""
if core.is_standalone():
# Stop the standalone (CLI)
standalone.end()
@ -59,8 +73,7 @@ def end():
def main():
"""
Main entry point for Glances
"""Main entry point for Glances.
Select the mode (standalone, client or server)
Run it...

View File

@ -16,9 +16,8 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Manage the Glances' client
"""
"""Manage the Glances client."""
# Import system libs
import json
@ -30,15 +29,14 @@ except ImportError: # Python 2
from xmlrpclib import ServerProxy, ProtocolError
# Import Glances libs
from glances.core.glances_globals import __version__
from glances.core.glances_globals import version
from glances.core.glances_stats import GlancesStatsClient
from glances.outputs.glances_curses import glancesCurses
from glances.outputs.glances_curses import GlancesCurses
class GlancesClient():
"""
This class creates and manages the TCP client
"""
class GlancesClient(object):
"""This class creates and manages the TCP client."""
def __init__(self, config=None, args=None):
# Store the arg/config
@ -63,8 +61,8 @@ class GlancesClient():
sys.exit(2)
def set_mode(self, mode='glances'):
"""
Set the client mode
"""Set the client mode.
- 'glances' = Glances server (default)
- 'snmp' = SNMP (fallback)
"""
@ -72,18 +70,15 @@ class GlancesClient():
return self.mode
def get_mode(self):
"""
Return the client mode
"""Get the client mode.
- 'glances' = Glances server (default)
- 'snmp' = SNMP (fallback)
"""
return self.mode
def login(self):
"""
Logon to the server
"""
"""Logon to the server."""
ret = True
# First of all, trying to connect to a Glances server
@ -102,7 +97,7 @@ class GlancesClient():
print(_("Error: Connection to server failed: {0}").format(err))
sys.exit(2)
if self.get_mode() == 'glances' and __version__[:3] == client_version[:3]:
if self.get_mode() == 'glances' and version[:3] == client_version[:3]:
# Init stats
self.stats = GlancesStatsClient()
self.stats.set_plugins(json.loads(self.client.getAllPlugins()))
@ -126,19 +121,13 @@ class GlancesClient():
self.stats.load_limits(self.config)
# Init screen
self.screen = glancesCurses(args=self.args)
self.screen = GlancesCurses(args=self.args)
# Return result
return ret
def update(self):
"""
Get stats from server
Return the client/server connection status:
- Connected: Connection OK
- Disconnected: Connection NOK
"""
# Update the stats
"""Update stats from Glances/SNMP server."""
if self.get_mode() == 'glances':
return self.update_glances()
elif self.get_mode() == 'snmp':
@ -148,8 +137,8 @@ class GlancesClient():
sys.exit(2)
def update_glances(self):
"""
Get stats from Glances server
"""Get stats from Glances server.
Return the client/server connection status:
- Connected: Connection OK
- Disconnected: Connection NOK
@ -159,7 +148,7 @@ class GlancesClient():
server_stats = json.loads(self.client.getAll())
server_stats['monitor'] = json.loads(self.client.getAllMonitored())
except socket.error:
# Client can not get server stats
# Client cannot get server stats
return "Disconnected"
else:
# Put it in the internal dict
@ -167,8 +156,8 @@ class GlancesClient():
return "Connected"
def update_snmp(self):
"""
Get stats from SNMP server
"""Get stats from SNMP server.
Return the client/server connection status:
- SNMP: Connection with SNMP server OK
- Disconnected: Connection NOK
@ -184,9 +173,7 @@ class GlancesClient():
return "SNMP"
def serve_forever(self):
"""
Main client loop
"""
"""Main client loop."""
while True:
# Update the stats
cs_status = self.update()
@ -197,8 +184,5 @@ class GlancesClient():
# print self.stats.getAll()
def end(self):
"""
End of the client session
"""
"""End of the client session."""
self.screen.end()

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage the configuration file."""
# Import system libs
import os
import sys
@ -29,7 +31,7 @@ except ImportError: # Python 2
# Import Glances lib
from glances.core.glances_globals import (
__appname__,
appname,
is_bsd,
is_linux,
is_mac,
@ -41,8 +43,8 @@ from glances.core.glances_globals import (
class Config(object):
"""
This class is used to access/read config file, if it exists
"""This class is used to access/read config file, if it exists.
:param location: the custom path to search for config file
:type location: str or None
@ -56,9 +58,7 @@ class Config(object):
self.load()
def load(self):
"""
Load a config file from the list of paths, if it exists
"""
"""Load a config file from the list of paths, if it exists."""
for config_file in self.get_config_paths():
if os.path.isfile(config_file) and os.path.getsize(config_file) > 0:
try:
@ -73,9 +73,9 @@ class Config(object):
break
def get_config_paths(self):
"""
Get a list of config file paths, taking into account of the OS,
priority and location.
r"""Get a list of config file paths.
The list is built taking into account of the OS, priority and location.
* running from source: /path/to/glances/conf
* Linux: ~/.config/glances, /etc/glances
@ -101,39 +101,33 @@ class Config(object):
if is_linux or is_bsd:
paths.append(os.path.join(
os.environ.get('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
__appname__, self.config_filename))
appname, self.config_filename))
if hasattr(sys, 'real_prefix') or is_bsd:
paths.append(os.path.join(sys.prefix, 'etc', __appname__, self.config_filename))
paths.append(os.path.join(sys.prefix, 'etc', appname, self.config_filename))
else:
paths.append(os.path.join('/etc', __appname__, self.config_filename))
paths.append(os.path.join('/etc', appname, self.config_filename))
elif is_mac:
paths.append(os.path.join(
os.path.expanduser('~/Library/Application Support/'),
__appname__, self.config_filename))
appname, self.config_filename))
paths.append(os.path.join(
sys_prefix, 'etc', __appname__, self.config_filename))
sys_prefix, 'etc', appname, self.config_filename))
elif is_windows:
paths.append(os.path.join(
os.environ.get('APPDATA'), __appname__, self.config_filename))
os.environ.get('APPDATA'), appname, self.config_filename))
return paths
def items(self, section):
"""
Return the items list of a section
"""
"""Return the items list of a section."""
return self.parser.items(section)
def has_section(self, section):
"""
Return info about the existence of a section
"""
"""Return info about the existence of a section."""
return self.parser.has_section(section)
def get_option(self, section, option):
"""
Get the float value of an option, if it exists
"""
"""Get the float value of an option, if it exists."""
try:
value = self.parser.getfloat(section, option)
except NoOptionError:
@ -142,9 +136,7 @@ class Config(object):
return value
def get_raw_option(self, section, option):
"""
Get the raw value of an option, if it exists
"""
"""Get the raw value of an option, if it exists."""
try:
value = self.parser.get(section, option)
except NoOptionError:

View File

@ -17,30 +17,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Glances informations
__appname__ = 'glances'
__version__ = '2.0_RC4'
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
__license__ = 'LGPL'
"""Common objects shared by all Glances modules."""
# Import system libs
import os
import sys
# Import psutil
try:
from psutil import __version__ as __psutil_version__
except ImportError:
print('psutil library not found. Glances cannot start.')
sys.exit(1)
# Check psutil version
psutil_min_version = (2, 0, 0)
psutil_version = tuple([int(num) for num in __psutil_version__.split('.')])
if psutil_version < psutil_min_version:
print('psutil version {0} detected.').format(__psutil_version__)
print('psutil 2.0 or higher is needed. Glances cannot start.')
sys.exit(1)
# Global information
appname = 'glances'
version = __import__('glances').__version__
psutil_version = __import__('glances').__psutil_version
# PY3?
is_py3 = sys.version_info >= (3, 3)
@ -63,7 +48,7 @@ sys_path = sys.path[:]
sys.path.insert(0, plugins_path)
# i18n
gettext_domain = __appname__
gettext_domain = appname
i18n_path = os.path.realpath(os.path.join(work_path, '..', '..', 'i18n'))
sys_i18n_path = os.path.join(sys_prefix, 'share', 'locale')
if os.path.exists(i18n_path):
@ -73,13 +58,13 @@ elif os.path.exists(sys_i18n_path):
else:
locale_dir = None
# Instances shared between all Glances' scripts
# ===============================================
# Instances shared between all Glances scripts
# ============================================
# glances_processes for processcount and processlist plugins
from glances.core.glances_processes import glancesProcesses
glances_processes = glancesProcesses()
from glances.core.glances_processes import GlancesProcesses
glances_processes = GlancesProcesses()
# The global instance for the logs
from glances.core.glances_logs import glancesLogs
glances_logs = glancesLogs()
from glances.core.glances_logs import GlancesLogs
glances_logs = GlancesLogs()

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage logs."""
# Import system libs
import time
from datetime import datetime
@ -25,14 +27,15 @@ from datetime import datetime
from glances.core.glances_globals import glances_processes
class glancesLogs:
"""
Manage logs inside the Glances software
Logs is a list of list (stored in the self.logs_list var)
class GlancesLogs(object):
"""This class manages logs inside the Glances software.
Logs is a list of list (stored in the self.logs_list var)
item_state = "OK|CAREFUL|WARNING|CRITICAL"
item_type = "CPU*|LOAD|MEM|MON"
item_value = value
Item is defined by:
["begin",
"end",
@ -44,10 +47,7 @@ class glancesLogs:
"""
def __init__(self):
"""
Init the logs class
"""
"""Init the logs class."""
# Maximum size of the logs list
self.logs_max = 10
@ -55,24 +55,20 @@ class glancesLogs:
self.logs_list = []
def get(self):
"""
Return the logs list (RAW)
"""
"""Return the raw logs list."""
return self.logs_list
def len(self):
"""
Return the number of item in the log list
"""
"""Return the number of item in the logs list."""
return self.logs_list.__len__()
def __itemexist__(self, item_type):
"""
"""Return the item position, if it exists.
An item exist in the list if:
* end is < 0
* item_type is matching
Return the item position if exist
-1 if the item is not found
Return -1 if the item is not found.
"""
for i in range(self.len()):
if self.logs_list[i][1] < 0 and self.logs_list[i][3] == item_type:
@ -80,9 +76,7 @@ class glancesLogs:
return -1
def set_process_sort(self, item_type):
"""
Define the process auto sort key from the alert type
"""
"""Define the process auto sort key from the alert type."""
# Process sort depending on alert type
if item_type.startswith("MEM"):
# Sort TOP process by memory_percent
@ -99,9 +93,7 @@ class glancesLogs:
return process_auto_by
def reset_process_sort(self):
"""
Reset the process_auto_by variable
"""
"""Reset the process_auto_by variable."""
# Default sort is...
process_auto_by = 'cpu_percent'
@ -110,11 +102,11 @@ class glancesLogs:
return process_auto_by
def add(self, item_state, item_type, item_value, proc_list=[], proc_desc=""):
"""
If item is a 'new one':
Add the new item at the beginning of the logs list
Else:
Update the existing item
"""Add a new item to the logs list.
If 'item' is a 'new one', add the new item at the beginning of the logs
list.
If 'item' is not a 'new one', update the existing item.
"""
# Add or update the log
item_index = self.__itemexist__(item_type)
@ -190,8 +182,8 @@ class glancesLogs:
return self.len()
def clean(self, critical=False):
"""
Clean the log list by deleting finished item
"""Clean the logs list by deleting finished items.
By default, only delete WARNING message
If critical = True, also delete CRITICAL message
"""

View File

@ -16,26 +16,20 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Main Glances script
"""
"""Glances main class."""
# Import system libs
import argparse
# Import Glances libs
from glances.core.glances_config import Config
from glances.core.glances_globals import (
__appname__,
__psutil_version__,
__version__
)
from glances.core.glances_globals import appname, psutil_version, version
class GlancesMain(object):
"""
Main class to manage Glances instance
"""
"""Main class to manage Glances instance."""
# Default stats' refresh time is 3 seconds
refresh_time = 3
@ -58,9 +52,9 @@ class GlancesMain(object):
def init_args(self):
"""Init all the command line arguments."""
version = "Glances v" + __version__ + " with psutil v" + __psutil_version__
parser = argparse.ArgumentParser(prog=__appname__, conflict_handler='resolve')
parser.add_argument('-V', '--version', action='version', version=version)
_version = "Glances v" + version + " with psutil v" + psutil_version
parser = argparse.ArgumentParser(prog=appname, conflict_handler='resolve')
parser.add_argument('-V', '--version', action='version', version=_version)
parser.add_argument('-b', '--byte', action='store_true', default=False,
dest='byte', help=_('display network rate in byte per second'))
parser.add_argument('-B', '--bind', default='0.0.0.0', dest='bind_address',
@ -161,7 +155,6 @@ class GlancesMain(object):
self.server_ip = args.client
# /!!!
# Interactive cmds like CLI args?
# By default help is hidden
args.help_tag = False
@ -172,59 +165,45 @@ class GlancesMain(object):
return args
def __hash_password(self, plain_password):
"""
Hash a plain password and return the hashed one
"""
from glances.core.glances_password import glancesPassword
"""Hash a plain password and return the hashed one."""
from glances.core.glances_password import GlancesPassword
password = glancesPassword()
password = GlancesPassword()
return password.hash_password(plain_password)
def __get_password(self, description='', confirm=False, clear=False):
"""
Read a password from the command line
- with confirmation if confirm = True
- plain (clear password) if clear = True
"""
from glances.core.glances_password import glancesPassword
"""Read a password from the command line.
password = glancesPassword()
- if confirm = True, with confirmation
- if clear = True, plain (clear password)
"""
from glances.core.glances_password import GlancesPassword
password = GlancesPassword()
return password.get_password(description, confirm, clear)
def is_standalone(self):
"""
Return True if Glances is running in standalone mode
"""
"""Return True if Glances is running in standalone mode."""
return not self.client_tag and not self.server_tag and not self.webserver_tag
def is_client(self):
"""
Return True if Glances is running in client mode
"""
"""Return True if Glances is running in client mode."""
return self.client_tag and not self.server_tag
def is_server(self):
"""
Return True if Glances is running in server mode
"""
"""Return True if Glances is running in server mode."""
return not self.client_tag and self.server_tag
def is_webserver(self):
"""
Return True if Glances is running in Web server mode
"""
"""Return True if Glances is running in Web server mode."""
return not self.client_tag and self.webserver_tag
def get_config(self):
"""
Return configuration file object
"""
"""Return configuration file object."""
return self.config
def get_args(self):
"""
Return the arguments
"""
"""Return the arguments."""
return self.args

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage the monitor list."""
# Import system lib
import re
import subprocess
@ -25,41 +27,40 @@ import subprocess
from glances.core.glances_globals import glances_processes
class monitorList:
"""
This class describes the optionnal monitored processes list
A list of 'important' processes to monitor.
class MonitorList(object):
The list (Python list) is composed of items (Python dict)
An item is defined (Dict keys'):
"""This class describes the optional monitored processes list.
The monitored list is a list of 'important' processes to monitor.
The list (Python list) is composed of items (Python dict).
An item is defined (dict keys):
* description: Description of the processes (max 16 chars)
* regex: regular expression of the processes to monitor
* command: (optional) shell command for extended stat
* countmin: (optional) minimal number of processes
* countmax: (optional) maximum number of processes
"""
# Maximum number of items in the list
__monitor_list_max_size = 10
# The list
__monitor_list = []
def __init__(self, config):
"""
Init the monitoring list from the configuration file
"""
"""Init the monitoring list from the configuration file."""
self.config = config
if self.config is not None and self.config.has_section('monitor'):
# Process monitoring list
self.__setMonitorList('monitor', 'list')
self.__set_monitor_list('monitor', 'list')
else:
self.__monitor_list = []
def __setMonitorList(self, section, key):
"""
Init the monitored processes list
The list is defined in the Glances configuration file
def __set_monitor_list(self, section, key):
"""Init the monitored processes list.
The list is defined in the Glances configuration file.
"""
for l in range(1, self.__monitor_list_max_size + 1):
value = {}
@ -99,9 +100,9 @@ class monitorList:
return len(self.__monitor_list)
def __get__(self, item, key):
"""
Meta function to return key value of item
None if not defined or item > len(list)
"""Meta function to return key value of item.
Return None if not defined or item > len(list)
"""
if item < len(self.__monitor_list):
try:
@ -112,15 +113,12 @@ class monitorList:
return None
def update(self):
"""
Update the command result attributed
"""
"""Update the command result attributed."""
# Only continue if monitor list is not empty
if len(self.__monitor_list) == 0:
return self.__monitor_list
# Iter uppon the monitored list
# Iter upon the monitored list
for i in range(0, len(self.get())):
# Search monitored processes by a regular expression
processlist = glances_processes.getlist()
@ -147,15 +145,11 @@ class monitorList:
return self.__monitor_list
def get(self):
"""
Return the monitored list (list of dict)
"""
"""Return the monitored list (list of dict)."""
return self.__monitor_list
def set(self, newlist):
"""
Set the monitored list (list of dict)
"""
"""Set the monitored list (list of dict)."""
self.__monitor_list = newlist
def getAll(self):
@ -167,37 +161,25 @@ class monitorList:
self.set(newlist)
def description(self, item):
"""
Return the description of the item number (item)
"""
"""Return the description of the item number (item)."""
return self.__get__(item, "description")
def regex(self, item):
"""
Return the regular expression of the item number (item)
"""
"""Return the regular expression of the item number (item)."""
return self.__get__(item, "regex")
def command(self, item):
"""
Return the stats command of the item number (item)
"""
"""Return the stat command of the item number (item)."""
return self.__get__(item, "command")
def result(self, item):
"""
Return the reult command of the item number (item)
"""
"""Return the reult command of the item number (item)."""
return self.__get__(item, "result")
def countmin(self, item):
"""
Return the minimum number of processes of the item number (item)
"""
"""Return the minimum number of processes of the item number (item)."""
return self.__get__(item, "countmin")
def countmax(self, item):
"""
Return the maximum number of processes of the item number (item)
"""
"""Return the maximum number of processes of the item number (item)."""
return self.__get__(item, "countmax")

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage password."""
# Import system libs
import getpass
import hashlib
@ -26,7 +28,7 @@ import uuid
# Import Glances lib
from glances.core.glances_globals import (
__appname__,
appname,
is_bsd,
is_linux,
is_mac,
@ -40,10 +42,9 @@ except NameError:
pass
class glancesPassword:
"""
Manage password
"""
class GlancesPassword(object):
"""This class contains all the methods relating to password."""
def __init__(self):
self.password_path = self.get_password_path()
@ -51,8 +52,8 @@ class glancesPassword:
self.password_filepath = os.path.join(self.password_path, self.password_filename)
def get_password_path(self):
"""
Get the path where the password file will be stored
r"""Get the path where the password file will be stored.
* Linux and BSD: ~/.config/glances
* OS X: ~/Library/glances
* Windows: %APPDATA%\glances
@ -67,45 +68,42 @@ class glancesPassword:
app_path = '.'
# Append the Glances folder
app_path = os.path.join(app_path, __appname__)
app_path = os.path.join(app_path, appname)
return app_path
def get_hash(self, salt, plain_password):
"""
Return the hashed password salt + SHA-256
"""
"""Return the hashed password, salt + SHA-256."""
return hashlib.sha256(salt.encode() + plain_password.encode()).hexdigest()
def hash_password(self, plain_password):
"""
Hash password with a salt based on UUID (universally unique identifier)
"""
"""Hash password with a salt based on UUID (universally unique identifier)."""
salt = uuid.uuid4().hex
encrypted_password = self.get_hash(salt, plain_password)
return salt + '$' + encrypted_password
def check_password(self, hashed_password, plain_password):
"""
Encode the plain_password with the salt of the hashed_password
and return the comparison with the encrypted_password
"""Encode the plain_password with the salt of the hashed_password.
Return the comparison with the encrypted_password.
"""
salt, encrypted_password = hashed_password.split('$')
re_encrypted_password = self.get_hash(salt, plain_password)
return encrypted_password == re_encrypted_password
def get_password(self, description='', confirm=False, clear=False):
"""
For Glances server, get the password (confirm=True, clear=False)
1) from the password file (if it exists)
2) from the CLI
"""Get the password from a Glances client or server.
For Glances server, get the password (confirm=True, clear=False):
1) from the password file (if it exists)
2) from the CLI
Optionally: save the password to a file (hashed with salt + SHA-256)
For Glances client, get the password (confirm=False, clear=True)
1) from the CLI
2) the password is hashed with SHA-256 (only SHA string transit through the network)
For Glances client, get the password (confirm=False, clear=True):
1) from the CLI
2) the password is hashed with SHA-256 (only SHA string transit
through the network)
"""
if os.path.exists(self.password_filepath) and not clear:
# If the password file exist then use it
print(_("Info: Read password from file: {0}").format(self.password_filepath))
@ -142,9 +140,7 @@ class glancesPassword:
return password
def save_password(self, hashed_password):
"""
Save the hashed password to the Glances folder
"""
"""Save the hashed password to the Glances folder."""
# Check if the Glances folder already exists
if not os.path.exists(self.password_path):
# Create the Glances folder
@ -159,9 +155,7 @@ class glancesPassword:
file_pwd.write(hashed_password)
def load_password(self):
"""
Load the hashed password from the Glances folder
"""
"""Load the hashed password from the Glances folder."""
# Read the password file, if it exists
with open(self.password_filepath, 'r') as file_pwd:
hashed_password = file_pwd.read()

View File

@ -17,22 +17,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import psutil
# Import Glances lib
from glances.core.glances_globals import is_bsd, is_mac, is_windows
from glances.core.glances_timer import Timer, getTimeSinceLastUpdate
import psutil
class glancesProcesses:
"""
Get processed stats using the PsUtil lib
"""
class GlancesProcesses(object):
"""Get processed stats using the psutil library."""
def __init__(self, cache_timeout=60):
"""
Init the class to collect stats about processes
"""
"""Init the class to collect stats about processes."""
# Add internals caches because PSUtil do not cache all the stats
# See: https://code.google.com/p/psutil/issues/detail?id=462
self.username_cache = {}
@ -57,22 +53,16 @@ class glancesProcesses:
self.disable_tag = False
def enable(self):
"""
Enable process stats
"""
"""Enable process stats."""
self.disable_tag = False
self.update()
def disable(self):
"""
Enable process stats
"""
"""Disable process stats."""
self.disable_tag = True
def __get_process_stats(self, proc):
"""
Get process statistics
"""
"""Get process stats."""
procstat = {}
# Process ID
@ -157,10 +147,7 @@ class glancesProcesses:
return procstat
def update(self):
"""
Update the processes sats
"""
"""Update the processes stats."""
# Reset the stats
self.processlist = []
self.processcount = {'total': 0, 'running': 0, 'sleeping': 0, 'thread': 0}
@ -213,31 +200,24 @@ class glancesProcesses:
self.cache_timer.reset()
def getcount(self):
"""Get the number of processes."""
return self.processcount
def getlist(self, sortedby=None):
"""
Return the processlist
"""
"""Get the processlist."""
return self.processlist
def getsortkey(self):
"""
Return the current sort key for automatic sort
"""
"""Get the current sort key for automatic sort."""
return self.processsort
def setsortkey(self, sortedby):
"""
Return the current sort key for automatic sort
"""
"""Set the current sort key for automatic sort."""
self.processsort = sortedby
return self.processsort
def getsortlist(self, sortedby=None):
"""
Return the processlist
"""
"""Get the sorted processlist."""
if sortedby is None:
# No need to sort...
return self.processlist

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage the Glances server."""
# Import system libs
import json
import socket
@ -30,15 +32,15 @@ except ImportError: # Python 2
from SimpleXMLRPCServer import SimpleXMLRPCServer
# Import Glances libs
from glances.core.glances_globals import __version__
from glances.core.glances_globals import version
from glances.core.glances_stats import GlancesStatsServer
from glances.core.glances_timer import Timer
class GlancesXMLRPCHandler(SimpleXMLRPCRequestHandler):
"""
Main XMLRPC handler
"""
"""Main XML-RPC handler."""
rpc_paths = ('/RPC2', )
def end_headers(self):
@ -63,24 +65,24 @@ class GlancesXMLRPCHandler(SimpleXMLRPCRequestHandler):
# Client authentication
(basic, _, encoded) = headers.get('Authorization').partition(' ')
assert basic == 'Basic', 'Only basic authentication supported'
# Encoded portion of the header is a string
# Need to convert to bytestring
encodedByteString = encoded.encode()
# Decode Base64 byte String to a decoded Byte String
decodedBytes = b64decode(encodedByteString)
# Convert from byte string to a regular String
decodedString = decodedBytes.decode()
# Get the username and password from the string
(username, _, password) = decodedString.partition(':')
# Check that username and password match internal global dictionary
# Encoded portion of the header is a string
# Need to convert to bytestring
encoded_byte_string = encoded.encode()
# Decode base64 byte string to a decoded byte string
decoded_bytes = b64decode(encoded_byte_string)
# Convert from byte string to a regular string
decoded_string = decoded_bytes.decode()
# Get the username and password from the string
(username, _, password) = decoded_string.partition(':')
# Check that username and password match internal global dictionary
return self.check_user(username, password)
def check_user(self, username, password):
# Check username and password in the dictionnary
# Check username and password in the dictionary
if username in self.server.user_dict:
from glances.core.glances_password import glancesPassword
from glances.core.glances_password import GlancesPassword
pwd = glancesPassword()
pwd = GlancesPassword()
return pwd.check_password(self.server.user_dict[username], password)
else:
@ -102,9 +104,8 @@ class GlancesXMLRPCHandler(SimpleXMLRPCRequestHandler):
class GlancesXMLRPCServer(SimpleXMLRPCServer):
"""
Init a SimpleXMLRPCServer instance (IPv6-ready)
"""
"""Init a SimpleXMLRPCServer instance (IPv6-ready)."""
def __init__(self, bind_address, bind_port=61209,
requestHandler=GlancesXMLRPCHandler):
@ -119,10 +120,9 @@ class GlancesXMLRPCServer(SimpleXMLRPCServer):
requestHandler)
class GlancesInstance():
"""
All the methods of this class are published as XML RPC methods
"""
class GlancesInstance(object):
"""All the methods of this class are published as XML-RPC methods."""
def __init__(self, cached_time=1, config=None):
# Init stats
@ -145,7 +145,7 @@ class GlancesInstance():
def init(self):
# Return the Glances version
return __version__
return version
def getAll(self):
# Update and return all the stats
@ -166,11 +166,10 @@ class GlancesInstance():
return json.dumps(self.stats.getAll()['monitor'])
def __getattr__(self, item):
"""
Overwrite the getattr in case of attribute is not found
The goal is to dynamicaly generate the API get'Stats'() methods
"""
"""Overwrite the getattr method in case of attribute is not found.
The goal is to dynamically generate the API get'Stats'() methods.
"""
# print "DEBUG: Call method: %s" % item
header = 'get'
# Check if the attribute starts with 'get'
@ -189,10 +188,9 @@ class GlancesInstance():
raise AttributeError(item)
class GlancesServer():
"""
This class creates and manages the TCP server
"""
class GlancesServer(object):
"""This class creates and manages the TCP server."""
def __init__(self, requestHandler=GlancesXMLRPCHandler,
cached_time=1,
@ -216,23 +214,18 @@ class GlancesServer():
self.server.register_instance(GlancesInstance(cached_time, config))
def add_user(self, username, password):
"""
Add an user to the dictionnary
"""
"""Add an user to the dictionary."""
self.server.user_dict[username] = password
self.server.isAuth = True
def serve_forever(self):
"""
Call the main loop
"""
"""Call the main loop."""
self.server.serve_forever()
def server_close(self):
"""Close the Glances server session."""
self.server.server_close()
def end(self):
"""
End of the Glances server session
"""
"""End of the Glances server session."""
self.server_close()

View File

@ -28,7 +28,8 @@ except ImportError:
class GlancesSNMPClient(object):
""" SNMP client class (based on PySNMP) """
"""SNMP client class (based on pysnmp library)."""
def __init__(self, host='localhost', port=161, version='2c',
community='public', user='private', auth=''):
@ -46,10 +47,7 @@ class GlancesSNMPClient(object):
self.auth = auth
def __get_result__(self, errorIndication, errorStatus, errorIndex, varBinds):
"""
Put results in table
"""
"""Put results in table."""
ret = {}
if not errorIndication or not errorStatus:
for name, val in varBinds:
@ -60,13 +58,13 @@ class GlancesSNMPClient(object):
return ret
def get_by_oid(self, *oid):
"""
SNMP simple request (list of OID)
One request per OID list
"""SNMP simple request (list of OID).
One request per OID list.
* oid: oid list
> Return a dict
"""
if self.version == '3':
errorIndication, errorStatus, errorIndex, varBinds = self.cmdGen.getCmd(
cmdgen.UsmUserData(self.user, self.auth),
@ -95,16 +93,19 @@ class GlancesSNMPClient(object):
return ret
def getbulk_by_oid(self, non_repeaters, max_repetitions, *oid):
"""
SNMP getbulk request
In contrast to snmpwalk, this information will typically be gathered in a
single transaction with the agent, rather than one transaction per variable found.
* non_repeaters: This specifies the number of supplied variables that should not be iterated over.
* max_repetitions: This specifies the maximum number of iterations over the repeating variables.
"""SNMP getbulk request.
In contrast to snmpwalk, this information will typically be gathered in
a single transaction with the agent, rather than one transaction per
variable found.
* non_repeaters: This specifies the number of supplied variables that
should not be iterated over.
* max_repetitions: This specifies the maximum number of iterations over
the repeating variables.
* oid: oid list
> Return a list of dicts
"""
if self.version.startswith('3'):
errorIndication, errorStatus, errorIndex, varBinds = self.cmdGen.getCmd(
cmdgen.UsmUserData(self.user, self.auth),

View File

@ -17,18 +17,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage the Glances standalone session."""
# Import Glances libs
from glances.core.glances_stats import GlancesStats
from glances.outputs.glances_curses import glancesCurses
from glances.outputs.glances_curses import GlancesCurses
class GlancesStandalone():
"""
This class creates and manages the Glances standalone session
"""
class GlancesStandalone(object):
"""This class creates and manages the Glances standalone session."""
def __init__(self, config=None, args=None):
# Init stats
self.stats = GlancesStats(config)
@ -37,20 +37,18 @@ class GlancesStandalone():
# Init CSV output
if args.output_csv is not None:
from glances.outputs.glances_csv import glancesCSV
from glances.outputs.glances_csv import GlancesCSV
self.csvoutput = glancesCSV(args=args)
self.csvoutput = GlancesCSV(args=args)
self.csv_tag = True
else:
self.csv_tag = False
# Init screen
self.screen = glancesCurses(args=args)
self.screen = GlancesCurses(args=args)
def serve_forever(self):
"""
Main loop for the CLI
"""
"""Main loop for the CLI."""
while True:
# Update system informations
self.stats.update()
@ -63,9 +61,7 @@ class GlancesStandalone():
self.csvoutput.update(self.stats)
def end(self):
"""
End of the CLI
"""
"""End of the CLI."""
self.screen.end()
# Close the CSV file

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""The stats manager."""
import collections
import os
import sys
@ -25,15 +27,10 @@ from glances.core.glances_globals import plugins_path, sys_path
class GlancesStats(object):
"""
This class store, update and give stats
"""
"""This class stores, updates and gives stats."""
def __init__(self, config=None):
"""
Init the stats
"""
# Init the plugin list dict
self._plugins = collections.defaultdict(dict)
@ -44,12 +41,11 @@ class GlancesStats(object):
self.load_limits(config)
def __getattr__(self, item):
"""
Overwrite the getattr in case of attribute is not found
"""Overwrite the getattr method in case of attribute is not found.
The goal is to dynamically generate the following methods:
- getPlugname(): return Plugname stat in JSON format
"""
# Check if the attribute starts with 'get'
if item.startswith('get'):
# Get the plugin name
@ -67,9 +63,7 @@ class GlancesStats(object):
raise AttributeError(item)
def load_plugins(self, args=None):
"""
Load all plugins in the "plugins" folder
"""
"""Load all plugins in the 'plugins' folder."""
header = "glances_"
for item in os.listdir(plugins_path):
if (item.startswith(header) and
@ -87,26 +81,18 @@ class GlancesStats(object):
sys.path = sys_path
def getAllPlugins(self):
"""
Return the plugins list
"""
"""Return the plugins list."""
return [p for p in self._plugins]
def load_limits(self, config=None):
"""
Load the stats limits
"""
"""Load the stats limits."""
# For each plugins, call the init_limits method
for p in self._plugins:
# print "DEBUG: Load limits for %s" % p
self._plugins[p].load_limits(config)
def __update__(self, input_stats):
"""
Update the stats
"""
"""Update all the stats."""
if input_stats == {}:
# For standalone and server modes
# For each plugins, call the update method
@ -120,21 +106,19 @@ class GlancesStats(object):
self._plugins[p].set_stats(input_stats[p])
def update(self, input_stats={}):
# Update the stats
"""Wrapper method to update the stats."""
self.__update__(input_stats)
def getAll(self):
"""
Return all the stats
"""
"""Return all the stats."""
return [self._plugins[p].get_raw() for p in self._plugins]
def get_plugin_list(self):
# Return the plugin list
"""Return the plugin list."""
self._plugins
def get_plugin(self, plugin_name):
# Return the plugin name
"""Return the plugin name."""
if plugin_name in self._plugins:
return self._plugins[plugin_name]
else:
@ -142,9 +126,8 @@ class GlancesStats(object):
class GlancesStatsServer(GlancesStats):
"""
This class store, update and give stats for the server
"""
"""This class stores, updates and gives stats for the server."""
def __init__(self, config=None):
# Init the stats
@ -155,11 +138,7 @@ class GlancesStatsServer(GlancesStats):
self.all_stats = collections.defaultdict(dict)
def update(self, input_stats={}):
"""
Update the stats
"""
# Update the stats
"""Update the stats."""
GlancesStats.update(self)
# Build the all_stats with the get_raw() method of the plugins
@ -167,37 +146,29 @@ class GlancesStatsServer(GlancesStats):
self.all_stats[p] = self._plugins[p].get_raw()
def getAll(self):
"""
Return the stats as a dict
"""
"""Return the stats as a dict."""
return self.all_stats
def getAllPlugins(self):
"""
Return the plugins list
"""
"""Return the plugins list."""
return [p for p in self._plugins]
def getAllLimits(self):
"""
Return the plugins limits list
"""
"""Return the plugins limits list."""
return [self._plugins[p].get_limits() for p in self._plugins]
class GlancesStatsClient(GlancesStats):
"""
This class store, update and give stats for the client
"""
"""This class stores, updates and gives stats for the client."""
def __init__(self):
"""Init the GlancesStatsClient class."""
# Init the plugin list dict
self._plugins = collections.defaultdict(dict)
def set_plugins(self, input_plugins):
"""
Set the plugin list according to the Glances server
"""
"""Set the plugin list according to the Glances server."""
header = "glances_"
for item in input_plugins:
# Import the plugin
@ -213,9 +184,8 @@ class GlancesStatsClient(GlancesStats):
class GlancesStatsClientSNMP(GlancesStats):
"""
This class store, update and give stats for the SNMP client
"""
"""This class stores, updates and gives stats for the SNMP client."""
def __init__(self, config=None, args=None):
# Init the plugin list dict
@ -231,10 +201,7 @@ class GlancesStatsClientSNMP(GlancesStats):
self.load_plugins(args=self.args)
def check_snmp(self):
"""
Chek if SNMP is available on the server
"""
"""Chek if SNMP is available on the server."""
# Import the SNMP client class
from glances.core.glances_snmp import GlancesSNMPClient
@ -249,10 +216,7 @@ class GlancesStatsClientSNMP(GlancesStats):
return clientsnmp.get_by_oid("1.3.6.1.2.1.1.5.0") != {}
def update(self):
"""
Update the stats using SNMP
"""
"""Update the stats using SNMP."""
# For each plugins, call the update method
for p in self._plugins:
# Set the input method to SNMP

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""The timer manager."""
from time import time
# Global list to manage the elapsed time
@ -24,6 +26,7 @@ last_update_times = {}
def getTimeSinceLastUpdate(IOType):
"""Return the elapsed time since last update."""
global last_update_times
# assert(IOType in ['net', 'disk', 'process_disk'])
current_time = time()
@ -36,11 +39,9 @@ def getTimeSinceLastUpdate(IOType):
return time_since_update
class Timer:
"""
The timer class
A simple chrono
"""
class Timer(object):
"""The timer class. A simple chronometer."""
def __init__(self, duration):
self.duration = duration
@ -57,4 +58,3 @@ class Timer:
def finished(self):
return time() > self.target

View File

@ -16,22 +16,19 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances Web Interface (Bottle based)
"""
"""Glances Web Interface (Bottle based)."""
# Import Glances libs
from glances.core.glances_stats import GlancesStats
from glances.outputs.glances_bottle import glancesBottle
from glances.outputs.glances_bottle import GlancesBottle
class GlancesWebServer():
"""
This class creates and manages the Glances Web Server session
"""
class GlancesWebServer(object):
"""This class creates and manages the Glances Web server session."""
def __init__(self, config=None, args=None):
# Init stats
self.stats = GlancesStats(config)
@ -39,16 +36,12 @@ class GlancesWebServer():
self.stats.update()
# Init the Bottle Web server
self.web = glancesBottle(args=args)
self.web = GlancesBottle(args=args)
def serve_forever(self):
"""
Main loop for the Web Server
"""
"""Main loop for the Web server."""
self.web.start(self.stats)
def end(self):
"""
End of the Web Server
"""
"""End of the Web server."""
self.web.end()

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Web interface class."""
import os
import sys
@ -27,13 +29,11 @@ except ImportError:
sys.exit(1)
class glancesBottle:
"""
This class manage the Bottle Web Server
"""
class GlancesBottle(object):
"""This class manages the Bottle Web server."""
def __init__(self, args=None):
# Init args
self.args = args
@ -72,29 +72,25 @@ class glancesBottle:
}
def _route(self):
"""
Define route
"""
"""Define route."""
self._app.route('/', method="GET", callback=self._index)
self._app.route('/<refresh_time:int>', method=["GET", "POST"], callback=self._index)
self._app.route('/<filename:re:.*\.css>', method="GET", callback=self._css)
self._app.route('/<filename:re:.*\.js>', method="GET", callback=self._js)
def start(self, stats):
"""Start the bottle."""
# Init stats
self.stats = stats
# Start the Bottle
self._app.run(host=self.args.bind_address, port=self.args.port)
def end(self):
# End the Bottle
"""End the bottle."""
pass
def _index(self, refresh_time=None):
"""
Bottle callback for index.html (/) file
"""
"""Bottle callback for index.html (/) file."""
# Manage parameter
if refresh_time is None:
refresh_time = self.args.time
@ -106,26 +102,20 @@ class glancesBottle:
return self.display(self.stats, refresh_time=refresh_time)
def _css(self, filename):
"""
Bottle callback for *.css files
"""
"""Bottle callback for *.css files."""
# Return the static file
return static_file(filename, root=os.path.join(self.STATIC_PATH, 'css'))
def _js(self, filename):
"""
Bottle callback for *.js files
"""
"""Bottle callback for *.js files."""
# Return the static file
return static_file(filename, root=os.path.join(self.STATIC_PATH, 'js'))
def display(self, stats, refresh_time=None):
"""
Display stats on the Webpage
"""Display stats on the web page.
stats: Stats database to display
"""
html = template('header', refresh_time=refresh_time)
html += '<header>'
html += self.display_plugin('system', self.stats.get_plugin('system').get_stats_display(args=self.args))
@ -163,10 +153,7 @@ class glancesBottle:
return html
def display_plugin(self, plugin_name, plugin_stats):
"""
Generate the Bootle template for the plugin_stats
"""
"""Generate the Bottle template for the plugin_stats."""
# Template header
tpl = """ \
%#Template for Bottle
@ -186,7 +173,7 @@ class glancesBottle:
if m['msg'].split(' ', 1)[0] != '':
tpl += '<span class="cell" id="%s">&nbsp;%s</span>' % \
(self.__style_list[m['decoration']],
m['msg'].split(' ', 1)[0].replace(' ', '&nbsp;')[:20])
m['msg'].split(' ', 1)[0].replace(' ', '&nbsp;')[:20])
elif m['optional']:
# Manage optional stats (responsive design)
tpl += '<span class="cell hide" id="%s">%s</span>' % \

View File

@ -59,7 +59,7 @@ class ListenGetch(threading.Thread):
return default
class Screen():
class Screen(object):
COLOR_DEFAULT_WIN = '0F' # 07'#'0F'
COLOR_BK_DEFAULT = colorconsole.terminal.colors["BLACK"]
@ -116,7 +116,7 @@ class Screen():
return None
class WCurseLight():
class WCurseLight(object):
COLOR_WHITE = colorconsole.terminal.colors["WHITE"]
COLOR_RED = colorconsole.terminal.colors["RED"]

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""CSV interface class."""
# Import sys libs
import csv
import sys
@ -28,10 +30,9 @@ from glances.core.glances_globals import is_py3
csv_stats_list = ['cpu', 'load', 'mem', 'memswap']
class glancesCSV:
"""
This class manages the CSV output
"""
class GlancesCSV(object):
"""This class manages the CSV output."""
def __init__(self, args=None):
# CSV file name
@ -51,12 +52,11 @@ class glancesCSV:
print(_("Stats dumped to CSV file: {0}").format(self.csv_filename))
def exit(self):
"""Close the CSV file."""
self.csv_file.close()
def update(self, stats):
"""
Update stats in the CSV output file
"""
"""Update stats in the CSV output file."""
all_stats = stats.getAll()
plugins = stats.getAllPlugins()

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Curses interface class."""
# Import system lib
import sys
@ -37,13 +39,11 @@ else:
curses = WCurseLight()
class glancesCurses:
"""
This class manage the curses display (and key pressed)
"""
class GlancesCurses(object):
"""This class manages the curses display (and key pressed)."""
def __init__(self, args=None):
# Init args
self.args = args
@ -160,10 +160,8 @@ class glancesCurses:
self.term_window.nodelay(1)
self.pressedkey = -1
def __getkey(self, window):
"""
A getKey function to catch ESC key AND Numlock key (issue #163)
"""
def __get_key(self, window):
# Catch ESC key AND numlock key (issue #163)
keycode = [0, 0]
keycode[0] = window.getch()
keycode[1] = window.getch()
@ -174,10 +172,10 @@ class glancesCurses:
else:
return keycode[0]
def __catchKey(self):
# Get key
#~ self.pressedkey = self.term_window.getch()
self.pressedkey = self.__getkey(self.term_window)
def __catch_key(self):
# Catch the pressed key
# ~ self.pressedkey = self.term_window.getch()
self.pressedkey = self.__get_key(self.term_window)
# Actions...
if self.pressedkey == ord('\x1b') or self.pressedkey == ord('q'):
@ -249,15 +247,14 @@ class glancesCurses:
return self.pressedkey
def end(self):
# Shutdown the curses window
"""Shutdown the curses window."""
curses.echo()
curses.nocbreak()
curses.curs_set(1)
curses.endwin()
def display(self, stats, cs_status="None"):
"""
Display stats on the screen
"""Display stats on the screen.
stats: Stats database to display
cs_status:
@ -270,7 +267,6 @@ class glancesCurses:
True if the stats have been displayed
False if the help have been displayed
"""
# Init the internal line/column dict for Glances Curses
self.line_to_y = {}
self.column_to_x = {}
@ -346,9 +342,9 @@ class glancesCurses:
return True
def display_plugin(self, plugin_stats, display_optional=True, max_y=65535):
"""
Display the plugin_stats on the screen
If display_optional=True display the optional stats
"""Display the plugin_stats on the screen.
If display_optional=True display the optional stats.
max_y do not display line > max_y
"""
# Exit if:
@ -425,12 +421,12 @@ class glancesCurses:
self.line_to_y[plugin_stats['line'] + 1] = y + self.space_between_line
def erase(self):
# Erase the content of the screen
"""Erase the content of the screen."""
self.term_window.erase()
def flush(self, stats, cs_status="None"):
"""
Clear and update screen
"""Clear and update the screen.
stats: Stats database to display
cs_status:
"None": standalone or server mode
@ -441,8 +437,10 @@ class glancesCurses:
self.display(stats, cs_status=cs_status)
def update(self, stats, cs_status="None"):
"""
Update the screen and wait __refresh_time sec / catch key every 100 ms
"""Update the screen.
Wait for __refresh_time sec / catch key every 100 ms.
stats: Stats database to display
cs_status:
"None": standalone or server mode
@ -454,18 +452,19 @@ class glancesCurses:
# Wait
countdown = Timer(self.__refresh_time)
while (not countdown.finished()):
while not countdown.finished():
# Getkey
if self.__catchKey() > -1:
if self.__catch_key() > -1:
# flush display
self.flush(stats, cs_status=cs_status)
# Wait 100ms...
curses.napms(100)
def get_stats_display_width(self, curse_msg, without_option=False):
# Return the width of the formated curses message
# The height is defined by the maximum line
"""Return the width of the formatted curses message.
The height is defined by the maximum line.
"""
try:
if without_option:
# Size without options
@ -481,9 +480,10 @@ class glancesCurses:
return c
def get_stats_display_height(self, curse_msg):
# Return the height of the formated curses message
# The height is defined by the number of '\n'
r"""Return the height of the formatted curses message.
The height is defined by the number of '\n' (new line).
"""
try:
c = [i['msg'] for i in curse_msg['msgdict']].count('\n')
except:

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Alert plugin."""
# Import system lib
from datetime import datetime
@ -26,13 +28,14 @@ from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances's alert Plugin
Only for display
"""Glances' alert plugin.
Only for display.
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -48,23 +51,16 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Nothing to do here
Just return the global glances_log
"""
"""Nothing to do here. Just return the global glances_log."""
# Set the stats to the glances_logs
self.stats = glances_logs.get()
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,9 +16,8 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Batinfo (battery) plugin
"""
"""Battery plugin."""
# Batinfo library (optional; Linux-only)
try:
@ -31,17 +30,18 @@ from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances battery capacity plugin
"""Glances' battery capacity plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# Init the sensor class
self.glancesgrabbat = glancesGrabBat()
self.glancesgrabbat = GlancesGrabBat()
# We do not want to display the stat in a dedicated area
# The HDD temp is displayed within the sensors plugin
@ -51,17 +51,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update battery capacity stats using the input method
"""
"""Update battery capacity stats using the input method."""
# Reset stats
self.reset()
@ -78,15 +72,12 @@ class Plugin(GlancesPlugin):
return self.stats
class glancesGrabBat:
"""
Get batteries stats using the Batinfo library
"""
class GlancesGrabBat(object):
"""Get batteries stats using the batinfo library."""
def __init__(self):
"""
Init batteries stats
"""
"""Init batteries stats."""
try:
self.bat = batinfo.batteries()
self.initok = True
@ -97,9 +88,7 @@ class glancesGrabBat:
self.initok = False
def update(self):
"""
Update the stats
"""
"""Update the stats."""
if self.initok:
reply = self.bat.update()
if reply is not None:
@ -111,10 +100,11 @@ class glancesGrabBat:
self.bat_list = []
def get(self):
# Update the stats
"""Get the stats."""
return self.bat_list
def getcapacitypercent(self):
"""Get batteries capacity percent."""
if not self.initok or self.bat.stat == []:
return []

View File

@ -17,20 +17,24 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import psutil
"""CPU core plugin."""
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
class Plugin(GlancesPlugin):
"""
Glances' Core Plugin
Get stats about CPU core number
"""Glances' CPU core plugin.
Get stats about CPU core number.
stats is integer (number of core)
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We dot not want to display the stat in the curse interface
@ -41,17 +45,14 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stat using the input method
"""
"""Reset/init the stat using the input method."""
self.stats = {}
def update(self):
"""
Update core stats
Stats is a dict (with both physical and log cpu number) instead of a integer
"""
"""Update core stats.
Stats is a dict (with both physical and log cpu number) instead of a integer.
"""
# Reset the stats
self.reset()

View File

@ -16,14 +16,13 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances CPU plugin
"""
import psutil
"""CPU plugin."""
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
# SNMP OID
# percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
# percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
@ -34,13 +33,15 @@ snmp_oid = {'user': '1.3.6.1.4.1.2021.11.9.0',
class Plugin(GlancesPlugin):
"""
Glances' Cpu Plugin
Glances' CPU plugin.
stats is a dict
"""
def __init__(self, args=None):
"""Init the CPU plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -57,16 +58,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = {}
def update(self):
"""
Update CPU stats using the input method
"""
"""Update CPU stats using the input method."""
# Reset stats
self.reset()
@ -107,10 +103,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the list to display in the curse interface
"""
"""Return the list to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,25 +16,25 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances DiskIO plugin
"""
import psutil
"""Disk I/O plugin."""
# Import Glances libs
from glances.core.glances_timer import getTimeSinceLastUpdate
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
class Plugin(GlancesPlugin):
"""
Glances's disks IO Plugin
"""Glances' disks I/O plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -50,16 +50,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update disk IO stats using the input method
"""
"""Update disk I/O stats using the input method."""
# Reset stats
self.reset()
@ -118,10 +113,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -17,10 +17,12 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import psutil
"""File system plugin."""
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
# SNMP OID
# The snmpd.conf needs to be edited.
# Add the following to enable it on all disk
@ -43,13 +45,14 @@ snmp_oid = {'mnt_point': '1.3.6.1.4.1.2021.9.1.2',
class Plugin(GlancesPlugin):
"""
Glances's File System (fs) Plugin
"""Glances' file system plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -65,16 +68,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update the FS stats using the input method
"""
"""Update the FS stats using the input method."""
# Reset the list
self.reset()
@ -127,9 +125,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""HDD temperature plugin."""
# Import system libs
import socket
@ -25,17 +27,18 @@ from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances' HDD temperature sensors plugin
"""Glances' HDD temperature sensors plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# Init the sensor class
self.glancesgrabhddtemp = glancesGrabHDDTemp()
self.glancesgrabhddtemp = GlancesGrabHDDTemp()
# We do not want to display the stat in a dedicated area
# The HDD temp is displayed within the sensors plugin
@ -45,16 +48,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update HDD stats using the input method
"""
"""Update HDD stats using the input method."""
# Reset stats
self.reset()
@ -70,25 +68,25 @@ class Plugin(GlancesPlugin):
return self.stats
class glancesGrabHDDTemp:
"""
Get hddtemp stats using a socket connection
"""
def __init__(self, host="127.0.0.1", port=7634):
"""
Init hddtemp stats
"""
class GlancesGrabHDDTemp(object):
"""Get hddtemp stats using a socket connection."""
def __init__(self, host='127.0.0.1', port=7634):
"""Init hddtemp stats."""
self.host = host
self.port = port
self.cache = ""
self.reset()
def reset(self):
"""Reset/init the stats."""
self.hddtemp_list = []
def __update__(self):
"""
Update the stats
"""
"""Update the stats."""
# Reset the list
self.hddtemp_list = []
self.reset()
# Fetch the data
data = self.fetch()
@ -118,9 +116,7 @@ class glancesGrabHDDTemp:
self.hddtemp_list.append(hddtemp_current)
def fetch(self):
"""
Fetch the data from hddtemp daemon
"""
"""Fetch the data from hddtemp daemon."""
# Taking care of sudden deaths/stops of hddtemp daemon
try:
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -133,5 +129,6 @@ class glancesGrabHDDTemp:
return data
def get(self):
"""Get HDDs list."""
self.__update__()
return self.hddtemp_list

View File

@ -16,26 +16,24 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances help plugin
Just a stupid plugin to display the help screen
Help plugin.
Just a stupid plugin to display the help screen.
"""
# Import Glances libs
from glances.core.glances_globals import (
__appname__,
__psutil_version__,
__version__
)
from glances.core.glances_globals import appname, psutil_version, version
from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances' Help Plugin
"""
"""Glances' help plugin."""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -48,24 +46,19 @@ class Plugin(GlancesPlugin):
self.line_curse = 0
def update(self):
"""
No stats, it is just a plugin to display the help...
"""
"""No stats. It is just a plugin to display the help."""
pass
def msg_curse(self, args=None):
"""
Return the list to display in the curse interface
"""
"""Return the list to display in the curse interface."""
# Init the return message
ret = []
# Build the string message
# Header
msg = '{0} {1}'.format(__appname__.title(), __version__)
msg = '{0} {1}'.format(appname.title(), version)
ret.append(self.curse_add_line(msg, "TITLE"))
msg = _(" with psutil {0}").format(__psutil_version__)
msg = _(" with psutil {0}").format(psutil_version)
ret.append(self.curse_add_line(msg))
ret.append(self.curse_new_line())

View File

@ -16,9 +16,8 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances load plugin
"""
"""Load plugin."""
# Import system libs
import os
@ -37,13 +36,14 @@ snmp_oid = {'min1': '1.3.6.1.4.1.2021.10.1.3.1',
class Plugin(GlancesPlugin):
"""
Glances's Load Plugin
"""Glances' load plugin.
stats is a dict
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -59,16 +59,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = {}
def update(self):
"""
Update load stats
"""
"""Update load stats."""
# Reset stats
self.reset()
@ -107,10 +102,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,14 +16,13 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances virtual memory plugin
"""
import psutil
"""Virtual memory plugin."""
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
# SNMP OID
# Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
# Total RAM used: .1.3.6.1.4.1.2021.4.6.0
@ -40,13 +39,14 @@ snmp_oid = {'total': '1.3.6.1.4.1.2021.4.5.0',
class Plugin(GlancesPlugin):
"""
Glances's memory Plugin
"""Glances' memory plugin.
stats is a dict
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -62,16 +62,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = {}
def update(self):
"""
Update MEM (RAM) stats using the input method
"""
"""Update RAM memory stats using the input method."""
# Reset stats
self.reset()
@ -133,9 +128,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,14 +16,13 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances swap memory plugin
"""
import psutil
"""Swap memory plugin."""
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
# SNMP OID
# Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
# Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
@ -32,13 +31,14 @@ snmp_oid = {'total': '1.3.6.1.4.1.2021.4.3.0',
class Plugin(GlancesPlugin):
"""
Glances's swap memory Plugin
"""Glances' swap memory plugin.
stats is a dict
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -54,16 +54,11 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = {}
def update(self):
"""
Update MEM (SWAP) stats using the input method
"""
"""Update swap memory stats using the input method."""
# Reset stats
self.reset()
@ -104,9 +99,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -17,17 +17,19 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Monitor plugin."""
# Import Glances lib
from glances.core.glances_monitor_list import monitorList as glancesMonitorList
from glances.core.glances_monitor_list import MonitorList as glancesMonitorList
from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances's monitor Plugin
"""
"""Glances' monitor plugin."""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -44,17 +46,12 @@ class Plugin(GlancesPlugin):
self.stats = []
def load_limits(self, config):
"""
Load the monitored list from the conf file
"""
"""Load the monitored list from the conf file."""
# print "DEBUG: Monitor plugin load config file %s" % config
self.glances_monitors = glancesMonitorList(config)
def update(self):
"""
Update the monitored list
"""
"""Update the monitored list."""
if self.get_input() == 'local':
# Monitor list only available in a full Glances environment
# Check if the glances_monitor instance is init
@ -72,7 +69,7 @@ class Plugin(GlancesPlugin):
return self.stats
def get_alert(self, nbprocess=0, countmin=None, countmax=None, header="", log=False):
# Return the alert status relative to the process number
"""Return the alert status relative to the process number."""
if nbprocess is None:
return 'OK'
if countmin is None:
@ -91,9 +88,7 @@ class Plugin(GlancesPlugin):
return 'CRITICAL'
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,17 +16,14 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Glances Network interface plugin
"""
# Import system libs
import psutil
"""Network plugin."""
# Import Glances lib
from glances.core.glances_timer import getTimeSinceLastUpdate
from glances.plugins.glances_plugin import GlancesPlugin
import psutil
# SNMP OID
# http://www.net-snmp.org/docs/mibs/interfaces.html
# Dict key = interface_name
@ -36,13 +33,14 @@ snmp_oid = {'interface_name': '1.3.6.1.2.1.2.2.1.2',
class Plugin(GlancesPlugin):
"""
Glances's network Plugin
"""Glances' network Plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -58,17 +56,14 @@ class Plugin(GlancesPlugin):
self.reset()
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update network stats using the input method
"""Update network stats using the input method.
Stats is a list of dict (one dict per interface)
"""
# Reset stats
self.reset()
@ -165,11 +160,8 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to displayoid in the curse interface
"""
#!!! TODO: Add alert on network interface bitrate
"""Return the dict to display in the curse interface."""
# !!! TODO: Add alert on network interface bitrate
# Init the return message
ret = []

View File

@ -25,14 +25,14 @@ from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""
Glances' Core Plugin
Get current date/time
"""Plugin to get the current date/time.
stats is (string)
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -45,19 +45,14 @@ class Plugin(GlancesPlugin):
self.line_curse = -1
def update(self):
"""
Update current date/time
"""
"""Update current date/time."""
# Had to convert it to string because datetime is not JSON serializable
self.stats = datetime.now().strftime(_("%Y-%m-%d %H:%M:%S"))
return self.stats
def msg_curse(self, args=None):
"""
Return the string to display in the curse interface
"""
"""Return the string to display in the curse interface."""
# Init the return message
ret = []

View File

@ -16,25 +16,25 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
CPU stats (per cpu)
"""
# Check for psutil already done in the glances_core script
import psutil
"""Per-CPU plugin."""
# Import Glances libs
from glances.plugins.glances_plugin import GlancesPlugin
# Check for psutil already done in the glances_core script
import psutil
class Plugin(GlancesPlugin):
"""
Glances' PerCpu Plugin
"""Glances' per-CPU plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
GlancesPlugin.__init__(self, args=args)
# We want to display the stat in the curse interface
@ -52,16 +52,11 @@ class Plugin(GlancesPlugin):
self.percputime_new = []
def reset(self):
"""
Reset/init the stats
"""
"""Reset/init the stats."""
self.stats = []
def update(self):
"""
Update Per CPU stats using the input method
"""
"""Update per-CPU stats using the input method."""
# Reset stats
self.reset()
@ -138,10 +133,7 @@ class Plugin(GlancesPlugin):
return self.stats
def msg_curse(self, args=None):
"""
Return the dict to display in the curse interface
"""
"""Return the dict to display in the curse interface."""
# Init the return message
ret = []

Some files were not shown because too many files have changed in this diff Show More