[IP plugin] Make the public ip information more configurable (not only from the Censys service) #2732

This commit is contained in:
nicolargo 2024-04-21 16:47:36 +02:00
parent b6881215f9
commit 9ac1ad88e8
6 changed files with 260 additions and 314 deletions

View File

@ -201,18 +201,29 @@ hide=docker.*,lo
#alias=wlp2s0:WIFI
[ip]
# Disable display of private IP address
disable=False
# Configure the online service where public IP address information will be downloaded
# - public_disabled: Disable public IP address information (set to True for offline platform)
# - public_refresh_interval: Refresh interval between to calls to the online service
# - public_api: URL of the API (the API should return an JSON object)
# - public_username: Login for the online service (if needed)
# - public_password: Password for the online service (if needed)
# - public_field: Field name of the public IP address in onlibe service JSON message
# - public_template: Template to build the public message
#
# Example for IPLeak service:
# public_api=https://ipv4.ipleak.net/json/
# public_field=ip
# public_template={ip} {continent_name}/{country_name}/{city_name}
#
public_disabled=True
public_refresh_interval=300
public_ip_disabled=False
# Configuration for the Censys online service
# Need to create an aacount: https://censys.io/login
censys_url=https://search.censys.io/api
# Get your own credential here: https://search.censys.io/account/api
# Enter your credential and uncomment the following lines
#censys_username=<censys_api_id>
#censys_password=<censys_secret>
# List of fields to be displayed in user interface (comma separated)
censys_fields=location:continent,location:country,autonomous_system:name
public_api=https://ipv4.ipleak.net/json/
#public_username=<myname>
#public_password=<mysecret>
public_field=ip
public_template={continent_name}/{country_name}/{city_name}
[connections]
# Display additional information about TCP connections

View File

@ -201,18 +201,29 @@ tx_critical=90
#alias=wlp2s0:WIFI
[ip]
# Disable display of private IP address
disable=False
# Configure the online service where public IP address information will be downloaded
# - public_disabled: Disable public IP address information (set to True for offline platform)
# - public_refresh_interval: Refresh interval between to calls to the online service
# - public_api: URL of the API (the API should return an JSON object)
# - public_username: Login for the online service (if needed)
# - public_password: Password for the online service (if needed)
# - public_field: Field name of the public IP address in onlibe service JSON message
# - public_template: Template to build the public message
#
# Example for IPLeak service:
# public_api=https://ipv4.ipleak.net/json/
# public_field=ip
# public_template={ip} {continent_name}/{country_name}/{city_name}
#
public_disabled=True
public_refresh_interval=300
public_ip_disabled=False
# Configuration for the Censys online service
# Need to create an aacount: https://censys.io/login
censys_url=https://search.censys.io/api
# Get your own credential here: https://search.censys.io/account/api
# Enter your credential and uncomment the following lines
#censys_username=<censys_api_id>
#censys_password=<censys_secret>
# List of fields to be displayed in user interface (comma separated)
censys_fields=location:continent,location:country,autonomous_system:name
public_api=https://ipv4.ipleak.net/json/
#public_username=<myname>
#public_password=<mysecret>
public_field=ip
public_template={continent_name}/{country_name}/{city_name}
[connections]
# Display additional information about TCP connections

View File

@ -20,36 +20,43 @@ The system information message can be configured in the configuration file
# Available dynamics information are: hostname, os_name, os_version, os_arch, linux_distro, platform
system_info_msg= | My {os_name} system |
It is possible to disable or define time interval to be used for refreshing the
public IP address (default is 300 seconds) from the configuration
file under the ``[ip]`` section:
The header IP message can be configured from the ip ``[ip]`` section, it allows to display private and
public IP information.
In the default configuration file, public IP address information is disable. Set public_disabled, to False
in order to enable the feature.
.. code-block:: ini
[ip]
# Disable display of private IP address
disable=False
# Configure the online service where public IP address information will be downloaded
# - public_disabled: Disable public IP address information (set to True for offline platform)
# - public_refresh_interval: Refresh interval between to calls to the online service
# - public_api: URL of the API (the API should return an JSON object)
# - public_username: Login for the online service (if needed)
# - public_password: Password for the online service (if needed)
# - public_field: Field name of the public IP address in onlibe service JSON message
# - public_template: Template to build the public message
#
# Example for IPLeak service:
# public_api=https://ipv4.ipleak.net/json/
# public_field=ip
# public_template={ip} {continent_name}/{country_name}/{city_name}
#
public_disabled=False
public_refresh_interval=300
public_ip_disabled=True
public_api=https://ipv4.ipleak.net/json/
#public_username=<myname>
#public_password=<mysecret>
public_field=ip
public_template={continent_name}/{country_name}/{city_name}
**NOTE:** Setting low values for `public_refresh_interval` will result in frequent
HTTP requests to the IP detection servers. Recommended range: 120-600 seconds.
Glances uses online services in order to get the IP addresses. Your IP address could be
blocked if too many requests are done.
HTTP requests to the onlive service defined in public_api. Recommended range: 120-600 seconds.
Glances uses online services in order to get the IP addresses and the additional informations.
Your IP address could be blocked if too many requests are done.
If the Censys options are configured, the public IP address is also analysed (with the same interval)
and additional information is displayed.
.. code-block:: ini
[ip]
public_refresh_interval=300
public_ip_disabled=True
censys_url=https://search.censys.io/api
# Get your own credential here: https://search.censys.io/account/api
censys_username=CENSYS_API_ID
censys_password=CENSYS_API_SECRET
# List of fields to be displayed in user interface (comma separated)
censys_fields=location:continent,location:country,autonomous_system:name
**Note:** Access to the Censys Search API need an account (https://censys.io/login).
Example:

View File

@ -141,7 +141,7 @@ Get plugin stats::
"refresh": 3.0,
"regex": True,
"result": None,
"timer": 0.4279599189758301},
"timer": 0.8853774070739746},
{"count": 0,
"countmax": 20.0,
"countmin": None,
@ -150,7 +150,7 @@ Get plugin stats::
"refresh": 3.0,
"regex": True,
"result": None,
"timer": 0.4277961254119873}]
"timer": 0.8850991725921631}]
Fields descriptions:
@ -178,7 +178,7 @@ Get a specific item when field matches the given value::
"refresh": 3.0,
"regex": True,
"result": None,
"timer": 0.4279599189758301}]}
"timer": 0.8853774070739746}]}
GET cloud
---------
@ -226,18 +226,18 @@ Get plugin stats::
"engine": "docker",
"id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb",
"image": ["portainer/portainer-ce:2.9.3"],
"io": {"cumulative_ior": 589824, "cumulative_iow": 1646592},
"io": {"cumulative_ior": 31543296, "cumulative_iow": 6049792},
"key": "name",
"memory": {"cache": None,
"limit": 7823568896,
"limit": 7823499264,
"max_usage": None,
"rss": None,
"usage": 18767872},
"memory_usage": 18767872,
"usage": 22061056},
"memory_usage": 22061056,
"name": "portainer",
"network": {"cumulative_rx": 4041422, "cumulative_tx": 2406},
"network": {"cumulative_rx": 787796, "cumulative_tx": 0},
"status": "running",
"uptime": "1 weeks"}]
"uptime": "yesterday"}]
Fields descriptions:
@ -273,18 +273,18 @@ Get a specific item when field matches the given value::
"engine": "docker",
"id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb",
"image": ["portainer/portainer-ce:2.9.3"],
"io": {"cumulative_ior": 589824, "cumulative_iow": 1646592},
"io": {"cumulative_ior": 31543296, "cumulative_iow": 6049792},
"key": "name",
"memory": {"cache": None,
"limit": 7823568896,
"limit": 7823499264,
"max_usage": None,
"rss": None,
"usage": 18767872},
"memory_usage": 18767872,
"usage": 22061056},
"memory_usage": 22061056,
"name": "portainer",
"network": {"cumulative_rx": 4041422, "cumulative_tx": 2406},
"network": {"cumulative_rx": 787796, "cumulative_tx": 0},
"status": "running",
"uptime": "1 weeks"}]}
"uptime": "yesterday"}]}
GET core
--------
@ -311,19 +311,19 @@ Get plugin stats::
# curl http://localhost:61208/api/4/cpu
{"cpucore": 4,
"ctx_switches": 1279914863,
"ctx_switches": 48256657,
"guest": 0.0,
"idle": 72.8,
"interrupts": 572348639,
"idle": 69.3,
"interrupts": 20842968,
"iowait": 0.3,
"irq": 0.0,
"nice": 0.0,
"soft_interrupts": 267434589,
"soft_interrupts": 13612488,
"steal": 0.0,
"syscalls": 0,
"system": 3.7,
"total": 26.9,
"user": 23.3}
"system": 4.9,
"total": 30.4,
"user": 25.5}
Fields descriptions:
@ -356,7 +356,7 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/cpu/total
{"total": 26.9}
{"total": 30.4}
GET diskio
----------
@ -366,16 +366,16 @@ Get plugin stats::
# curl http://localhost:61208/api/4/diskio
[{"disk_name": "sda",
"key": "disk_name",
"read_bytes": 119365034496,
"read_count": 6509308,
"write_bytes": 252726218752,
"write_count": 3065941},
"read_bytes": 5068261376,
"read_count": 171820,
"write_bytes": 4500115456,
"write_count": 132716},
{"disk_name": "sda1",
"key": "disk_name",
"read_bytes": 24433664,
"read_count": 675,
"read_bytes": 3715072,
"read_count": 123,
"write_bytes": 0,
"write_count": 52}]
"write_count": 19}]
Fields descriptions:
@ -404,10 +404,10 @@ Get a specific item when field matches the given value::
# curl http://localhost:61208/api/4/diskio/disk_name/sda
{"sda": [{"disk_name": "sda",
"key": "disk_name",
"read_bytes": 119365034496,
"read_count": 6509308,
"write_bytes": 252726218752,
"write_count": 3065941}]}
"read_bytes": 5068261376,
"read_count": 171820,
"write_bytes": 4500115456,
"write_count": 132716}]}
GET folders
-----------
@ -434,13 +434,13 @@ Get plugin stats::
# curl http://localhost:61208/api/4/fs
[{"device_name": "/dev/mapper/ubuntu--gnome--vg-root",
"free": 35493531648,
"free": 36169457664,
"fs_type": "ext4",
"key": "mnt_point",
"mnt_point": "/",
"percent": 84.6,
"percent": 84.3,
"size": 243334156288,
"used": 195453169664},
"used": 194777243648},
{"device_name": "zsfpool",
"free": 31195136,
"fs_type": "zfs",
@ -469,13 +469,13 @@ Get a specific item when field matches the given value::
# curl http://localhost:61208/api/4/fs/mnt_point//
{"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root",
"free": 35493531648,
"free": 36169457664,
"fs_type": "ext4",
"key": "mnt_point",
"mnt_point": "/",
"percent": 84.6,
"percent": 84.3,
"size": 243334156288,
"used": 195453169664}]}
"used": 194777243648}]}
GET gpu
-------
@ -508,11 +508,11 @@ GET ip
Get plugin stats::
# curl http://localhost:61208/api/4/ip
{"address": "192.168.172.139",
"gateway": "192.168.172.240",
{"address": "192.168.0.32",
"gateway": "192.168.0.254",
"mask": "255.255.255.0",
"mask_cidr": 24,
"public_address": "92.184.102.172",
"public_address": "",
"public_info_human": ""}
Fields descriptions:
@ -527,7 +527,7 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/ip/gateway
{"gateway": "192.168.172.240"}
{"gateway": "192.168.0.254"}
GET irq
-------
@ -548,7 +548,7 @@ GET load
Get plugin stats::
# curl http://localhost:61208/api/4/load
{"cpucore": 4, "min1": 1.41845703125, "min15": 1.12744140625, "min5": 1.25}
{"cpucore": 4, "min1": 0.9794921875, "min15": 1.13330078125, "min5": 0.93359375}
Fields descriptions:
@ -560,7 +560,7 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/load/min1
{"min1": 1.41845703125}
{"min1": 0.9794921875}
GET mem
-------
@ -568,16 +568,16 @@ GET mem
Get plugin stats::
# curl http://localhost:61208/api/4/mem
{"active": 2872311808,
"available": 2107265024,
"buffers": 81784832,
"cached": 2386653184,
"free": 2107265024,
"inactive": 3126542336,
"percent": 73.1,
"shared": 662663168,
"total": 7823568896,
"used": 5716303872}
{"active": 1778843648,
"available": 2111156224,
"buffers": 174170112,
"cached": 2605928448,
"free": 2111156224,
"inactive": 4597104640,
"percent": 73.0,
"shared": 771698688,
"total": 7823499264,
"used": 5712343040}
Fields descriptions:
@ -596,7 +596,7 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/mem/total
{"total": 7823568896}
{"total": 7823499264}
GET memswap
-----------
@ -604,13 +604,13 @@ GET memswap
Get plugin stats::
# curl http://localhost:61208/api/4/memswap
{"free": 4571234304,
"percent": 43.4,
"sin": 9645510656,
"sout": 20458577920,
{"free": 7855353856,
"percent": 2.8,
"sin": 10698752,
"sout": 235782144,
"time_since_update": 1,
"total": 8082419712,
"used": 3511185408}
"used": 227065856}
Fields descriptions:
@ -635,15 +635,15 @@ Get plugin stats::
# curl http://localhost:61208/api/4/network
[{"alias": None,
"bytes_all": 0,
"bytes_all_gauge": 11769774846,
"bytes_all_gauge": 532043820,
"bytes_recv": 0,
"bytes_recv_gauge": 11031650851,
"bytes_recv_gauge": 496724294,
"bytes_sent": 0,
"bytes_sent_gauge": 738123995,
"bytes_sent_gauge": 35319526,
"interface_name": "wlp2s0",
"key": "interface_name",
"speed": 0,
"time_since_update": 0.3296170234680176},
"time_since_update": 0.6516900062561035},
{"alias": None,
"bytes_all": 0,
"bytes_all_gauge": 0,
@ -654,7 +654,7 @@ Get plugin stats::
"interface_name": "br-40875d2e2716",
"key": "interface_name",
"speed": 0,
"time_since_update": 0.3296170234680176}]
"time_since_update": 0.6516900062561035}]
Fields descriptions:
@ -679,26 +679,26 @@ Get a specific field::
{"interface_name": ["wlp2s0",
"br-40875d2e2716",
"br_grafana",
"veth0785bc8",
"lxdbr0",
"veth05608da0",
"mpqemubr0",
"veth601e59cb",
"vethfd301c0"]}
"vethe9985946",
"veth20c434a2",
"mpqemubr0"]}
Get a specific item when field matches the given value::
# curl http://localhost:61208/api/4/network/interface_name/wlp2s0
{"wlp2s0": [{"alias": None,
"bytes_all": 0,
"bytes_all_gauge": 11769774846,
"bytes_all_gauge": 532043820,
"bytes_recv": 0,
"bytes_recv_gauge": 11031650851,
"bytes_recv_gauge": 496724294,
"bytes_sent": 0,
"bytes_sent_gauge": 738123995,
"bytes_sent_gauge": 35319526,
"interface_name": "wlp2s0",
"key": "interface_name",
"speed": 0,
"time_since_update": 0.3296170234680176}]}
"time_since_update": 0.6516900062561035}]}
GET now
-------
@ -706,7 +706,7 @@ GET now
Get plugin stats::
# curl http://localhost:61208/api/4/now
"2024-04-07 18:19:47 CEST"
"2024-04-21 16:45:54 CEST"
GET percpu
----------
@ -717,29 +717,29 @@ Get plugin stats::
[{"cpu_number": 0,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 52.0,
"iowait": 1.0,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 4.0,
"total": 48.0,
"user": 21.0},
{"cpu_number": 1,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 71.0,
"idle": 78.6,
"iowait": 0.0,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 1.0,
"total": 29.0,
"user": 4.0}]
"system": 8.2,
"total": 21.4,
"user": 13.2},
{"cpu_number": 1,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 79.7,
"iowait": 0.6,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 3.2,
"total": 20.3,
"user": 16.5}]
Fields descriptions:
@ -768,13 +768,12 @@ Get plugin stats::
# curl http://localhost:61208/api/4/ports
[{"description": "DefaultGateway",
"host": "192.168.172.240",
"host": "192.168.0.254",
"indice": "port_0",
"key": "indice",
"port": 0,
"refresh": 30,
"rtt_warning": None,
"status": 0.007383,
"status": 0.079535,
"timeout": 3}]
Fields descriptions:
@ -790,21 +789,20 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/ports/indice
{"indice": ["port_0"]}
# curl http://localhost:61208/api/4/ports/host
{"host": ["192.168.0.254"]}
Get a specific item when field matches the given value::
# curl http://localhost:61208/api/4/ports/indice/port_0
{"port_0": [{"description": "DefaultGateway",
"host": "192.168.172.240",
"indice": "port_0",
"key": "indice",
"port": 0,
"refresh": 30,
"rtt_warning": None,
"status": 0.007383,
"timeout": 3}]}
# curl http://localhost:61208/api/4/ports/host/192.168.0.254
{"192.168.0.254": [{"description": "DefaultGateway",
"host": "192.168.0.254",
"indice": "port_0",
"port": 0,
"refresh": 30,
"rtt_warning": None,
"status": 0.079535,
"timeout": 3}]}
GET processcount
----------------
@ -812,7 +810,7 @@ GET processcount
Get plugin stats::
# curl http://localhost:61208/api/4/processcount
{"pid_max": 0, "running": 1, "sleeping": 339, "thread": 1665, "total": 407}
{"pid_max": 0, "running": 1, "sleeping": 324, "thread": 1545, "total": 392}
Fields descriptions:
@ -825,7 +823,7 @@ Fields descriptions:
Get a specific field::
# curl http://localhost:61208/api/4/processcount/total
{"total": 407}
{"total": 392}
GET processlist
---------------
@ -865,67 +863,67 @@ GET quicklook
Get plugin stats::
# curl http://localhost:61208/api/4/quicklook
{"cpu": 26.9,
{"cpu": 30.4,
"cpu_hz": 2025000000.0,
"cpu_hz_current": 1718239250.0,
"cpu_hz_current": 1474545750.0,
"cpu_log_core": 4,
"cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz",
"cpu_phys_core": 2,
"load": 28.2,
"mem": 73.1,
"load": 28.3,
"mem": 73.0,
"percpu": [{"cpu_number": 0,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 52.0,
"iowait": 1.0,
"idle": 78.6,
"iowait": 0.0,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 4.0,
"total": 48.0,
"user": 21.0},
"system": 8.2,
"total": 21.4,
"user": 13.2},
{"cpu_number": 1,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 71.0,
"iowait": 0.0,
"idle": 79.7,
"iowait": 0.6,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 1.0,
"total": 29.0,
"user": 4.0},
"system": 3.2,
"total": 20.3,
"user": 16.5},
{"cpu_number": 2,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 43.0,
"idle": 71.4,
"iowait": 0.0,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 4.0,
"total": 57.0,
"user": 31.0},
"system": 4.3,
"total": 28.6,
"user": 24.2},
{"cpu_number": 3,
"guest": 0.0,
"guest_nice": 0.0,
"idle": 62.0,
"idle": 48.8,
"iowait": 0.0,
"irq": 0.0,
"key": "cpu_number",
"nice": 0.0,
"softirq": 0.0,
"steal": 0.0,
"system": 2.0,
"total": 38.0,
"user": 14.0}],
"swap": 43.4}
"system": 4.4,
"total": 51.2,
"user": 46.9}],
"swap": 2.8}
Fields descriptions:
@ -1021,10 +1019,10 @@ Get plugin stats::
# curl http://localhost:61208/api/4/system
{"hostname": "XPS13-9333",
"hr_name": "Ubuntu 22.04 64bit / Linux 5.15.0-94-generic",
"hr_name": "Ubuntu 22.04 64bit / Linux 5.15.0-105-generic",
"linux_distro": "Ubuntu 22.04",
"os_name": "Linux",
"os_version": "5.15.0-94-generic",
"os_version": "5.15.0-105-generic",
"platform": "64bit"}
Fields descriptions:
@ -1047,7 +1045,7 @@ GET uptime
Get plugin stats::
# curl http://localhost:61208/api/4/uptime
"34 days, 9:18:57"
"1 day, 5:26:02"
GET version
-----------
@ -1107,34 +1105,34 @@ GET stats history
History of a plugin::
# curl http://localhost:61208/api/4/cpu/history
{"system": [["2024-04-07T18:19:49.863788", 3.2],
["2024-04-07T18:19:50.897946", 3.2],
["2024-04-07T18:19:52.129196", 2.6]],
"user": [["2024-04-07T18:19:49.863779", 17.0],
["2024-04-07T18:19:50.897925", 17.0],
["2024-04-07T18:19:52.129189", 6.9]]}
{"system": [["2024-04-21T16:45:56.530407", 4.9],
["2024-04-21T16:45:57.594180", 3.4],
["2024-04-21T16:45:59.045979", 3.4]],
"user": [["2024-04-21T16:45:56.530378", 25.5],
["2024-04-21T16:45:57.594127", 12.6],
["2024-04-21T16:45:59.045932", 12.6]]}
Limit history to last 2 values::
# curl http://localhost:61208/api/4/cpu/history/2
{"system": [["2024-04-07T18:19:50.897946", 3.2],
["2024-04-07T18:19:52.129196", 2.6]],
"user": [["2024-04-07T18:19:50.897925", 17.0],
["2024-04-07T18:19:52.129189", 6.9]]}
{"system": [["2024-04-21T16:45:57.594180", 3.4],
["2024-04-21T16:45:59.045979", 3.4]],
"user": [["2024-04-21T16:45:57.594127", 12.6],
["2024-04-21T16:45:59.045932", 12.6]]}
History for a specific field::
# curl http://localhost:61208/api/4/cpu/system/history
{"system": [["2024-04-07T18:19:47.585137", 3.7],
["2024-04-07T18:19:49.863788", 3.2],
["2024-04-07T18:19:50.897946", 3.2],
["2024-04-07T18:19:52.129196", 2.6]]}
{"system": [["2024-04-21T16:45:54.880377", 4.9],
["2024-04-21T16:45:56.530407", 4.9],
["2024-04-21T16:45:57.594180", 3.4],
["2024-04-21T16:45:59.045979", 3.4]]}
Limit history for a specific field to last 2 values::
# curl http://localhost:61208/api/4/cpu/system/history
{"system": [["2024-04-07T18:19:50.897946", 3.2],
["2024-04-07T18:19:52.129196", 2.6]]}
{"system": [["2024-04-21T16:45:57.594180", 3.4],
["2024-04-21T16:45:59.045979", 3.4]]}
GET limits (used for thresholds)
--------------------------------
@ -1195,13 +1193,12 @@ All limits/thresholds::
"history_size": 1200.0},
"help": {"history_size": 1200.0},
"ip": {"history_size": 1200.0,
"ip_censys_fields": ["location:continent",
"location:country",
"autonomous_system:name"],
"ip_censys_url": ["https://search.censys.io/api"],
"ip_disable": ["False"],
"ip_public_ip_disabled": ["False"],
"ip_public_refresh_interval": 300.0},
"ip_public_api": ["https://ipv4.ipleak.net/json/"],
"ip_public_disabled": ["True"],
"ip_public_field": ["ip"],
"ip_public_refresh_interval": 300.0,
"ip_public_template": ["{continent_name}/{country_name}/{city_name}"]},
"load": {"history_size": 1200.0,
"load_careful": 0.7,
"load_critical": 5.0,
@ -1308,6 +1305,7 @@ All limits/thresholds::
"quicklook_swap_careful": 50.0,
"quicklook_swap_critical": 90.0,
"quicklook_swap_warning": 70.0},
"raid": {"history_size": 1200.0, "raid_disable": ["False"]},
"sensors": {"history_size": 1200.0,
"sensors_battery_careful": 80.0,
"sensors_battery_critical": 95.0,

View File

@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "GLANCES" "1" "Apr 07, 2024" "4.0.0_beta01" "Glances"
.TH "GLANCES" "1" "Apr 21, 2024" "4.0.0_beta01" "Glances"
.SH NAME
glances \- An eye on your system
.SH SYNOPSIS

View File

@ -27,17 +27,6 @@ except ImportError as e:
else:
import_error_tag = False
# List of online services to retrieve public IP address
# List of tuple (url, json, key)
# - url: URL of the Web site
# - json: service return a JSON (True) or string (False)
# - key: key of the IP address in the JSON structure
urls = [
('https://httpbin.org/ip', True, 'origin'),
('https://api.ipify.org/?format=json', True, 'ip'),
('https://ipv4.jsonip.com', True, 'ip'),
]
# Fields description
# description: human readable description
# short_name: shortname to use un UI
@ -74,7 +63,6 @@ class PluginModel(GlancesPluginModel):
"""
_default_public_refresh_interval = 300
_default_public_ip_disabled = ["False"]
def __init__(self, args=None, config=None):
"""Init the plugin."""
@ -86,28 +74,22 @@ class PluginModel(GlancesPluginModel):
# We want to display the stat in the curse interface
self.display_curse = True
# For public IP address
# Public information (see issue #2732)
self.public_address = ""
self.public_info = ""
self.public_api = self.get_conf_value("public_api", default=[None])[0]
self.public_username = self.get_conf_value("public_username", default=[None])[0]
self.public_password = self.get_conf_value("public_password", default=[None])[0]
self.public_field = self.get_conf_value("public_field", default=[None])
self.public_template = self.get_conf_value("public_template", default=[None])[0]
self.public_disabled = (
self.get_conf_value('public_disabled', default='False')[0].lower() != 'false' or
self.public_api is None or self.public_field is None
)
self.public_address_refresh_interval = self.get_conf_value(
"public_refresh_interval", default=self._default_public_refresh_interval
)
public_ip_disabled = self.get_conf_value("public_ip_disabled", default=self._default_public_ip_disabled)
self.public_ip_disabled = True if public_ip_disabled == ["True"] else False
# For the Censys options (see issue #2105)
self.public_info = ""
self.censys_url = self.get_conf_value("censys_url", default=[None])[0]
self.censys_username = self.get_conf_value("censys_username", default=[None])[0]
self.censys_password = self.get_conf_value("censys_password", default=[None])[0]
self.censys_fields = self.get_conf_value("censys_fields", default=[None])
self.public_info_disabled = (
self.censys_url is None
or self.censys_username is None
or self.censys_password is None
or self.censys_fields is None
)
@GlancesPluginModel._check_decorator
@GlancesPluginModel._log_result_decorator
def update(self):
@ -119,47 +101,41 @@ class PluginModel(GlancesPluginModel):
stats = self.get_init_value()
if self.input_method == 'local' and not import_error_tag:
# Update stats using the netifaces lib
# Start with the default IP gateway
# Private IP address
# Get the default gateway thanks to the netifaces lib
try:
default_gw = netifaces.gateways()['default'][netifaces.AF_INET]
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab default gateway IP address ({})".format(e))
return {}
return self.get_init_value()
else:
stats['gateway'] = default_gw[0]
# Then the private IP address
# If multiple IP addresses are available, only the one with the default gateway is returned
try:
address = netifaces.ifaddresses(default_gw[1])[netifaces.AF_INET][0]['addr']
mask = netifaces.ifaddresses(default_gw[1])[netifaces.AF_INET][0]['netmask']
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab private IP address ({})".format(e))
return {}
return self.get_init_value()
else:
stats['address'] = address
stats['mask'] = mask
stats['mask_cidr'] = self.ip_to_cidr(stats['mask'])
# Finally with the public IP address
# Public IP address
time_since_update = getTimeSinceLastUpdate('public-ip')
try:
if not self.public_ip_disabled and (
self.stats.get('address') != address or time_since_update > self.public_address_refresh_interval
if not self.public_disabled and (
self.public_address == "" or time_since_update > self.public_address_refresh_interval
):
self.public_address = PublicIpAddress().get()
if not self.public_info_disabled:
self.public_info = PublicIpInfo(
self.public_address, self.censys_url, self.censys_username, self.censys_password
).get()
self.public_info = PublicIpInfo(
self.public_api, self.public_username, self.public_password
).get()
self.public_address = self.public_info['ip']
except (KeyError, AttributeError) as e:
logger.debug("Cannot grab public IP information ({})".format(e))
else:
stats['public_address'] = self.public_address
# Too much information provided in the public_info
# Limit it to public_info_for_human
# stats['public_info'] = self.public_info
stats['public_info_human'] = self.public_info_for_human(self.public_info)
elif self.input_method == 'snmp':
@ -217,14 +193,7 @@ class PluginModel(GlancesPluginModel):
if not public_info:
return ''
field_result = []
for f in self.censys_fields:
field = f.split(':')
if len(field) == 1 and field[0] in public_info:
field_result.append('{}'.format(public_info[field[0]]))
elif len(field) == 2 and field[0] in public_info and field[1] in public_info[field[0]]:
field_result.append('{}'.format(public_info[field[0]][field[1]]))
return '/'.join(field_result)
return self.public_template.format(**public_info)
@staticmethod
def ip_to_cidr(ip):
@ -240,57 +209,11 @@ class PluginModel(GlancesPluginModel):
return sum(bin(int(x)).count('1') for x in ip.split('.'))
class PublicIpAddress(object):
"""Get public IP address from online services."""
def __init__(self, timeout=2):
"""Init the class."""
self.timeout = timeout
def get(self):
"""Get the first public IP address returned by one of the online services."""
q = queue.Queue()
for u, j, k in urls:
t = threading.Thread(target=self._get_ip_public, args=(q, u, j, k))
t.daemon = True
t.start()
timer = Timer(self.timeout)
ip = None
while not timer.finished() and ip is None:
if q.qsize() > 0:
ip = q.get()
if ip is None:
return None
return ', '.join(set([x.strip() for x in ip.split(',')]))
def _get_ip_public(self, queue_target, url, json=False, key=None):
"""Request the url service and put the result in the queue_target."""
try:
response = urlopen(url, timeout=self.timeout).read().decode('utf-8')
except Exception as e:
logger.debug("IP plugin - Cannot open URL {} ({})".format(url, e))
queue_target.put(None)
else:
# Request depend on service
try:
if not json:
queue_target.put(response)
else:
queue_target.put(loads(response)[key])
except ValueError:
queue_target.put(None)
class PublicIpInfo(object):
"""Get public IP information from Censys online service."""
"""Get public IP information from online service."""
def __init__(self, ip, url, username, password, timeout=2):
def __init__(self, url, username, password, timeout=2):
"""Init the class."""
self.ip = ip
self.url = url
self.username = username
self.password = password
@ -300,7 +223,7 @@ class PublicIpInfo(object):
"""Return the public IP information returned by one of the online service."""
q = queue.Queue()
t = threading.Thread(target=self._get_ip_public_info, args=(q, self.ip, self.url, self.username, self.password))
t = threading.Thread(target=self._get_ip_public_info, args=(q, self.url, self.username, self.password))
t.daemon = True
t.start()
@ -310,22 +233,18 @@ class PublicIpInfo(object):
if q.qsize() > 0:
info = q.get()
if info is None:
return None
return info
def _get_ip_public_info(self, queue_target, ip, url, username, password):
def _get_ip_public_info(self, queue_target, url, username, password):
"""Request the url service and put the result in the queue_target."""
request_url = "{}/v2/hosts/{}".format(url, ip)
try:
response = urlopen_auth(request_url, username, password).read()
response = urlopen_auth(url, username, password).read()
except Exception as e:
logger.debug("IP plugin - Cannot open URL {} ({})".format(request_url, e))
logger.debug("IP plugin - Cannot get public IP information from {} ({})".format(url, e))
queue_target.put(None)
else:
try:
queue_target.put(loads(response)['result'])
queue_target.put(loads(response))
except (ValueError, KeyError) as e:
logger.debug("IP plugin - Cannot get result field from {} ({})".format(request_url, e))
logger.debug("IP plugin - Cannot load public IP information from {} ({})".format(url, e))
queue_target.put(None)