Merge tag 'v2.0' into develop
Release 2.0
6
.gitignore
vendored
@ -37,3 +37,9 @@ local.properties
|
||||
|
||||
# ctags
|
||||
.tags*
|
||||
|
||||
# Lang
|
||||
glances.pot
|
||||
|
||||
# Sphinx
|
||||
_build
|
||||
|
50
NEWS
@ -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
|
||||
|
56
README.rst
@ -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
|
||||
|
BIN
docs/_build/doctrees/environment.pickle
vendored
BIN
docs/_build/doctrees/glances-doc.doctree
vendored
BIN
docs/_build/doctrees/index.doctree
vendored
4
docs/_build/html/.buildinfo
vendored
@ -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
|
BIN
docs/_build/html/_images/battery.png
vendored
Before Width: | Height: | Size: 6.8 KiB |
BIN
docs/_build/html/_images/client-connected.png
vendored
Before Width: | Height: | Size: 9.0 KiB |
BIN
docs/_build/html/_images/client-disconnected.png
vendored
Before Width: | Height: | Size: 9.8 KiB |
BIN
docs/_build/html/_images/cpu-wide.png
vendored
Before Width: | Height: | Size: 6.6 KiB |
BIN
docs/_build/html/_images/cpu.png
vendored
Before Width: | Height: | Size: 4.0 KiB |
BIN
docs/_build/html/_images/diskio.png
vendored
Before Width: | Height: | Size: 4.2 KiB |
BIN
docs/_build/html/_images/footer.png
vendored
Before Width: | Height: | Size: 2.9 KiB |
BIN
docs/_build/html/_images/fs.png
vendored
Before Width: | Height: | Size: 9.5 KiB |
BIN
docs/_build/html/_images/hddtemp.png
vendored
Before Width: | Height: | Size: 2.2 KiB |
BIN
docs/_build/html/_images/header.png
vendored
Before Width: | Height: | Size: 4.1 KiB |
BIN
docs/_build/html/_images/load.png
vendored
Before Width: | Height: | Size: 3.6 KiB |
BIN
docs/_build/html/_images/logs.png
vendored
Before Width: | Height: | Size: 12 KiB |
BIN
docs/_build/html/_images/mem-wide.png
vendored
Before Width: | Height: | Size: 9.9 KiB |
BIN
docs/_build/html/_images/mem.png
vendored
Before Width: | Height: | Size: 7.1 KiB |
BIN
docs/_build/html/_images/monitored.png
vendored
Before Width: | Height: | Size: 12 KiB |
BIN
docs/_build/html/_images/network.png
vendored
Before Width: | Height: | Size: 6.0 KiB |
BIN
docs/_build/html/_images/per-cpu.png
vendored
Before Width: | Height: | Size: 7.4 KiB |
BIN
docs/_build/html/_images/processlist-wide.png
vendored
Before Width: | Height: | Size: 90 KiB |
BIN
docs/_build/html/_images/processlist.png
vendored
Before Width: | Height: | Size: 46 KiB |
BIN
docs/_build/html/_images/screenshot-wide.png
vendored
Before Width: | Height: | Size: 204 KiB |
BIN
docs/_build/html/_images/screenshot.png
vendored
Before Width: | Height: | Size: 113 KiB |
BIN
docs/_build/html/_images/sensors.png
vendored
Before Width: | Height: | Size: 4.4 KiB |
529
docs/_build/html/_sources/glances-doc.txt
vendored
@ -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
|
28
docs/_build/html/_sources/index.txt
vendored
@ -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`
|
BIN
docs/_build/html/_static/ajax-loader.gif
vendored
Before Width: | Height: | Size: 673 B |
540
docs/_build/html/_static/basic.css
vendored
@ -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;
|
||||
}
|
||||
}
|
BIN
docs/_build/html/_static/comment-bright.png
vendored
Before Width: | Height: | Size: 3.4 KiB |
BIN
docs/_build/html/_static/comment-close.png
vendored
Before Width: | Height: | Size: 3.5 KiB |
BIN
docs/_build/html/_static/comment.png
vendored
Before Width: | Height: | Size: 3.4 KiB |
256
docs/_build/html/_static/default.css
vendored
@ -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;
|
||||
}
|
247
docs/_build/html/_static/doctools.js
vendored
@ -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();
|
||||
});
|
BIN
docs/_build/html/_static/down-pressed.png
vendored
Before Width: | Height: | Size: 368 B |
BIN
docs/_build/html/_static/down.png
vendored
Before Width: | Height: | Size: 363 B |
BIN
docs/_build/html/_static/file.png
vendored
Before Width: | Height: | Size: 392 B |
9404
docs/_build/html/_static/jquery.js
vendored
BIN
docs/_build/html/_static/minus.png
vendored
Before Width: | Height: | Size: 199 B |
BIN
docs/_build/html/_static/plus.png
vendored
Before Width: | Height: | Size: 199 B |
62
docs/_build/html/_static/pygments.css
vendored
@ -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 */
|
567
docs/_build/html/_static/searchtools.js
vendored
@ -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();
|
||||
});
|
151
docs/_build/html/_static/sidebar.js
vendored
@ -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>«</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();
|
||||
});
|
1226
docs/_build/html/_static/underscore.js
vendored
BIN
docs/_build/html/_static/up-pressed.png
vendored
Before Width: | Height: | Size: 372 B |
BIN
docs/_build/html/_static/up.png
vendored
Before Width: | Height: | Size: 363 B |
808
docs/_build/html/_static/websupport.js
vendored
@ -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 ▹\
|
||||
</a>\
|
||||
<a href="#" id="hc<%id%>" class="hide-propose-change">\
|
||||
Propose a change ▿\
|
||||
</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 ▹</a>\
|
||||
<a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\
|
||||
<a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\
|
||||
<a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</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);
|
||||
}
|
||||
});
|
95
docs/_build/html/genindex.html
vendored
@ -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 — 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> »</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> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2013, Nicolas Hennion.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
665
docs/_build/html/glances-doc.html
vendored
@ -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 — 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 Glances’s 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 Glances’s documentation!"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="index.html">Glances 1.7.3 documentation</a> »</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 <<a class="reference external" href="mailto:nicolas%40nicolargo.com">nicolas<span>@</span>nicolargo<span>.</span>com</a>></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 (>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">@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">>60%</span></tt>, sort processes by I/O read and write</li>
|
||||
<li>If CPU <tt class="docutils literal"><span class="pre">>70%</span></tt>, sort processes by CPU usage</li>
|
||||
<li>If MEM <tt class="docutils literal"><span class="pre">>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\<User>\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\<User>\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">"OK"</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">"CAREFUL"</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">"WARNING"</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">"CRITICAL"</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"><50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">>50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CAREFUL"</span></tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">>70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"WARNING"</span></tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal"><span class="pre">>90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CRITICAL"</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>“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.”</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"><0.7*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal"><span class="pre">>0.7*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CAREFUL"</span></tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal"><span class="pre">>1*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"WARNING"</span></tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal"><span class="pre">>5*core</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CRITICAL"</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"><50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal"><span class="pre">>50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CAREFUL"</span></tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal"><span class="pre">>70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"WARNING"</span></tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal"><span class="pre">>90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CRITICAL"</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"><50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">>50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CAREFUL"</span></tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">>70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"WARNING"</span></tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal"><span class="pre">>90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CRITICAL"</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"><50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">>50%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CAREFUL"</span></tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">>70%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"WARNING"</span></tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal"><span class="pre">>90%</span></tt>, then status is set to <tt class="docutils literal"><span class="pre">"CRITICAL"</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 < 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 > 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">"CRITICAL"</span></tt></div>
|
||||
<div class="line">If number of processes is min < current < max, then status is set to <tt class="docutils literal"><span class="pre">"OK"</span></tt></div>
|
||||
<div class="line">Else status is set to <tt class="docutils literal"><span class="pre">"WARNING"</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 & 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’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 Glances’s documentation!"
|
||||
>previous</a> |</li>
|
||||
<li><a href="index.html">Glances 1.7.3 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2013, Nicolas Hennion.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
146
docs/_build/html/index.html
vendored
@ -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 Glances’s documentation! — 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> »</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’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’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> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2013, Nicolas Hennion.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
docs/_build/html/objects.inv
vendored
101
docs/_build/html/search.html
vendored
@ -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 — 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> »</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> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2013, Nicolas Hennion.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
1
docs/_build/html/searchindex.js
vendored
@ -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’s documentation!"],objnames:{},filenames:["glances-doc","index"]})
|
@ -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.
|
||||
|
@ -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 <<a class="reference external" href="mailto:nicolas@nicolargo.com">nicolas@nicolargo.com</a>></p>
|
||||
<p>November 2013</p>
|
||||
<p>This manual describes <em>Glances</em> version 2.0.</p>
|
||||
<p>Copyright © 2012-2014 Nicolas Hennion <<a class="reference external" href="mailto:nicolas@nicolargo.com">nicolas@nicolargo.com</a>></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 (>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 @server</span>
|
||||
</pre>
|
||||
<p>where <tt class="docutils literal">@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 @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://@server:61208
|
||||
</pre>
|
||||
<p>where <tt class="docutils literal">@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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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\<User>\Application Data</span>
|
||||
<pre class="literal-block">
|
||||
C:\Documents and Settings\<User>\Application Data
|
||||
</pre>
|
||||
<p>Since Windows Vista and newer versions:</p>
|
||||
<pre class="code console literal-block">
|
||||
<span class="generic output">C:\Users\<User>\AppData\Roaming</span>
|
||||
<pre class="literal-block">
|
||||
C:\Users\<User>\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">"WARNING"</tt></div>
|
||||
<div class="line"><tt class="docutils literal">RED</tt> stat counter is <tt class="docutils literal">"CRITICAL"</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"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If user|system|nice CPU is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</tt></div>
|
||||
<div class="line">If user|system CPU is <tt class="docutils literal"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If user|system CPU is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If user|system CPU is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If user|system CPU is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</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>
|
||||
"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."</blockquote>
|
||||
over 1, 5, and 15 minutes time periods."</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"><0.7*core</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal">>0.7*core</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal">>1*core</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If average load is <tt class="docutils literal">>5*core</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</tt></div>
|
||||
<div class="line">If load average is <tt class="docutils literal"><0.7*core</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If load average is <tt class="docutils literal">>0.7*core</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If load average is <tt class="docutils literal">>1*core</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If load average is <tt class="docutils literal">>5*core</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</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"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If memory is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</tt></div>
|
||||
<div class="line">If used memory|swap is <tt class="docutils literal"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If used memory|swap is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If used memory|swap is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If used memory|swap is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</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"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If bit rate is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</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"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If disk used is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</tt></div>
|
||||
<div class="line">If used disk is <tt class="docutils literal"><50%</tt>, then status is set to <tt class="docutils literal">"OK"</tt></div>
|
||||
<div class="line">If used disk is <tt class="docutils literal">>50%</tt>, then status is set to <tt class="docutils literal">"CAREFUL"</tt></div>
|
||||
<div class="line">If used disk is <tt class="docutils literal">>70%</tt>, then status is set to <tt class="docutils literal">"WARNING"</tt></div>
|
||||
<div class="line">If used disk is <tt class="docutils literal">>90%</tt>, then status is set to <tt class="docutils literal">"CRITICAL"</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 < count.</li>
|
||||
<li><tt class="docutils literal">countmax</tt> (optional): maximum number of processes. A warning will be displayed if number of processes > 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 < count.</li>
|
||||
<li><tt class="docutils literal">countmax</tt> (optional): maximum number of processes. A warning will
|
||||
be displayed if number of processes > 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">"CRITICAL"</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 & 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><<<<<<< 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>.
|
||||
>>>>>>> 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>
|
||||
|
@ -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
|
||||
|
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 242 KiB |
@ -25,4 +25,4 @@ Indices and tables
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
* :ref:`search`
|
@ -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;
|
||||
|
@ -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...
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
"""
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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"> %s</span>' % \
|
||||
(self.__style_list[m['decoration']],
|
||||
m['msg'].split(' ', 1)[0].replace(' ', ' ')[:20])
|
||||
m['msg'].split(' ', 1)[0].replace(' ', ' ')[:20])
|
||||
elif m['optional']:
|
||||
# Manage optional stats (responsive design)
|
||||
tpl += '<span class="cell hide" id="%s">%s</span>' % \
|
||||
|
@ -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"]
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 []
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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
|
||||
|
@ -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())
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
@ -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 = []
|
||||
|
||||
|
@ -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 = []
|
||||
|
||||
|