mirror of https://github.com/nicolargo/glances.git
First step of the migration
This commit is contained in:
parent
bcf4ce45fc
commit
c28089ae47
|
|
@ -101,8 +101,10 @@ Optional dependencies:
|
||||||
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
|
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
|
||||||
- ``influxdb`` (for the InfluxDB version 1 export module)
|
- ``influxdb`` (for the InfluxDB version 1 export module)
|
||||||
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
||||||
|
- ``jinja2`` (for templating, used under the hood by FastAPI)
|
||||||
- ``kafka-python`` (for the Kafka export module)
|
- ``kafka-python`` (for the Kafka export module)
|
||||||
- ``netifaces`` (for the IP plugin)
|
- ``netifaces`` (for the IP plugin)
|
||||||
|
- ``orjson`` (fast JSON library, used under the hood by FastAPI)
|
||||||
- ``py3nvml`` (for the GPU plugin)
|
- ``py3nvml`` (for the GPU plugin)
|
||||||
- ``pycouchdb`` (for the CouchDB export module)
|
- ``pycouchdb`` (for the CouchDB export module)
|
||||||
- ``pika`` (for the RabbitMQ/ActiveMQ export module)
|
- ``pika`` (for the RabbitMQ/ActiveMQ export module)
|
||||||
|
|
@ -319,7 +321,7 @@ Start Termux on your device and enter:
|
||||||
$ apt update
|
$ apt update
|
||||||
$ apt upgrade
|
$ apt upgrade
|
||||||
$ apt install clang python
|
$ apt install clang python
|
||||||
$ pip install fastapi uvicorn
|
$ pip install fastapi uvicorn orjson jinja2
|
||||||
$ pip install glances
|
$ pip install glances
|
||||||
|
|
||||||
And start Glances:
|
And start Glances:
|
||||||
|
|
|
||||||
|
|
@ -315,10 +315,10 @@ def json_dumps(data):
|
||||||
return ujson.dumps(data, ensure_ascii=False)
|
return ujson.dumps(data, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
def json_dumps_dictlist(data, item):
|
def dictlist(data, item):
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
try:
|
try:
|
||||||
return json_dumps({item: data[item]})
|
return {item: data[item]}
|
||||||
except (TypeError, IndexError, KeyError):
|
except (TypeError, IndexError, KeyError):
|
||||||
return None
|
return None
|
||||||
elif isinstance(data, list):
|
elif isinstance(data, list):
|
||||||
|
|
@ -326,13 +326,21 @@ def json_dumps_dictlist(data, item):
|
||||||
# Source:
|
# Source:
|
||||||
# http://stackoverflow.com/questions/4573875/python-get-index-of-dictionary-item-in-list
|
# http://stackoverflow.com/questions/4573875/python-get-index-of-dictionary-item-in-list
|
||||||
# But https://github.com/nicolargo/glances/issues/1401
|
# But https://github.com/nicolargo/glances/issues/1401
|
||||||
return json_dumps({item: list(map(itemgetter(item), data))})
|
return {item: list(map(itemgetter(item), data))}
|
||||||
except (TypeError, IndexError, KeyError):
|
except (TypeError, IndexError, KeyError):
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def json_dumps_dictlist(data, item):
|
||||||
|
dl = dictlist(data, item)
|
||||||
|
if dl is None:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return json_dumps(dl)
|
||||||
|
|
||||||
|
|
||||||
def string_value_to_float(s):
|
def string_value_to_float(s):
|
||||||
"""Convert a string with a value and an unit to a float.
|
"""Convert a string with a value and an unit to a float.
|
||||||
Example:
|
Example:
|
||||||
|
|
|
||||||
|
|
@ -363,7 +363,7 @@ Examples of use:
|
||||||
action='store_true',
|
action='store_true',
|
||||||
default=False,
|
default=False,
|
||||||
dest='webserver',
|
dest='webserver',
|
||||||
help='run Glances in web server mode (FastAPI and Uvicorn lib needed)',
|
help='run Glances in web server mode (FastAPI, Uvicorn, Jinja2 and OrJsonLib needed)',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--cached-time',
|
'--cached-time',
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ I am your father...
|
||||||
import re
|
import re
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from glances.globals import iterkeys, itervalues, listkeys, mean, nativestr, json_dumps, json_dumps_dictlist
|
from glances.globals import iterkeys, itervalues, listkeys, mean, nativestr, json_dumps, json_dumps_dictlist, dictlist
|
||||||
from glances.actions import GlancesActions
|
from glances.actions import GlancesActions
|
||||||
from glances.history import GlancesHistory
|
from glances.history import GlancesHistory
|
||||||
from glances.logger import logger
|
from glances.logger import logger
|
||||||
|
|
@ -395,6 +395,13 @@ class GlancesPluginModel(object):
|
||||||
"""Return the stats object in JSON format."""
|
"""Return the stats object in JSON format."""
|
||||||
return self.get_stats()
|
return self.get_stats()
|
||||||
|
|
||||||
|
def get_raw_stats_item(self, item):
|
||||||
|
"""Return the stats object for a specific item in RAW format.
|
||||||
|
|
||||||
|
Stats should be a list of dict (processlist, network...)
|
||||||
|
"""
|
||||||
|
return dictlist(self.stats, item)
|
||||||
|
|
||||||
def get_stats_item(self, item):
|
def get_stats_item(self, item):
|
||||||
"""Return the stats object for a specific item in JSON format.
|
"""Return the stats object for a specific item in JSON format.
|
||||||
|
|
||||||
|
|
@ -402,8 +409,8 @@ class GlancesPluginModel(object):
|
||||||
"""
|
"""
|
||||||
return json_dumps_dictlist(self.stats, item)
|
return json_dumps_dictlist(self.stats, item)
|
||||||
|
|
||||||
def get_stats_value(self, item, value):
|
def get_raw_stats_value(self, item, value):
|
||||||
"""Return the stats object for a specific item=value in JSON format.
|
"""Return the stats object for a specific item=value.
|
||||||
|
|
||||||
Stats should be a list of dict (processlist, network...)
|
Stats should be a list of dict (processlist, network...)
|
||||||
"""
|
"""
|
||||||
|
|
@ -413,11 +420,22 @@ class GlancesPluginModel(object):
|
||||||
if not isinstance(value, int) and value.isdigit():
|
if not isinstance(value, int) and value.isdigit():
|
||||||
value = int(value)
|
value = int(value)
|
||||||
try:
|
try:
|
||||||
return json_dumps({value: [i for i in self.stats if i[item] == value]})
|
return {value: [i for i in self.stats if i[item] == value]}
|
||||||
except (KeyError, ValueError) as e:
|
except (KeyError, ValueError) as e:
|
||||||
logger.error("Cannot get item({})=value({}) ({})".format(item, value, e))
|
logger.error("Cannot get item({})=value({}) ({})".format(item, value, e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_stats_value(self, item, value):
|
||||||
|
"""Return the stats object for a specific item=value in JSON format.
|
||||||
|
|
||||||
|
Stats should be a list of dict (processlist, network...)
|
||||||
|
"""
|
||||||
|
rsv = self.get_raw_stats_value(item, value)
|
||||||
|
if rsv is None:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return json_dumps(rsv)
|
||||||
|
|
||||||
def update_views_hidden(self):
|
def update_views_hidden(self):
|
||||||
"""Update the hidden views
|
"""Update the hidden views
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,10 @@ graphitesender
|
||||||
hddtemp
|
hddtemp
|
||||||
influxdb>=1.0.0 # For InfluxDB < 1.8
|
influxdb>=1.0.0 # For InfluxDB < 1.8
|
||||||
influxdb-client; python_version >= "3.7" # For InfluxDB >= 1.8
|
influxdb-client; python_version >= "3.7" # For InfluxDB >= 1.8
|
||||||
|
jinja2
|
||||||
kafka-python
|
kafka-python
|
||||||
netifaces
|
netifaces
|
||||||
|
orjson; python_version >= "3.8"
|
||||||
packaging; python_version >= "3.7"
|
packaging; python_version >= "3.7"
|
||||||
paho-mqtt
|
paho-mqtt
|
||||||
pika
|
pika
|
||||||
|
|
|
||||||
4
setup.py
4
setup.py
|
|
@ -46,6 +46,8 @@ def get_install_requires():
|
||||||
if sys.platform.startswith('win'):
|
if sys.platform.startswith('win'):
|
||||||
requires.append('fastapi')
|
requires.append('fastapi')
|
||||||
requires.append('uvicorn')
|
requires.append('uvicorn')
|
||||||
|
requires.append('orjson')
|
||||||
|
requires.append('jinja2')
|
||||||
requires.append('requests')
|
requires.append('requests')
|
||||||
|
|
||||||
return requires
|
return requires
|
||||||
|
|
@ -68,7 +70,7 @@ def get_install_extras_require():
|
||||||
'smart': ['pySMART.smartx'],
|
'smart': ['pySMART.smartx'],
|
||||||
'snmp': ['pysnmp'],
|
'snmp': ['pysnmp'],
|
||||||
'sparklines': ['sparklines'],
|
'sparklines': ['sparklines'],
|
||||||
'web': ['fastapi', 'uvicorn', 'requests'],
|
'web': ['fastapi', 'uvicorn', 'jinja2', 'orjson', 'requests'],
|
||||||
'wifi': ['wifi']
|
'wifi': ['wifi']
|
||||||
}
|
}
|
||||||
if sys.platform.startswith('linux'):
|
if sys.platform.startswith('linux'):
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,28 @@ parts:
|
||||||
organize:
|
organize:
|
||||||
uvicorn-dist: uvicorn/dist
|
uvicorn-dist: uvicorn/dist
|
||||||
|
|
||||||
|
orjson:
|
||||||
|
plugin: python
|
||||||
|
source: https://github.com/ijl/orjson.git
|
||||||
|
source-tag: '3.9.10'
|
||||||
|
source-depth: 1
|
||||||
|
override-build: |
|
||||||
|
mkdir -p $SNAPCRAFT_PART_BUILD/dist
|
||||||
|
cp -r $SNAPCRAFT_PART_BUILD/dist $SNAPCRAFT_PART_INSTALL/orjson-dist
|
||||||
|
organize:
|
||||||
|
orjson-dist: orjson/dist
|
||||||
|
|
||||||
|
jinja2:
|
||||||
|
plugin: python
|
||||||
|
source: https://github.com/pallets/jinja.git
|
||||||
|
source-tag: '3.1.2'
|
||||||
|
source-depth: 1
|
||||||
|
override-build: |
|
||||||
|
mkdir -p $SNAPCRAFT_PART_BUILD/dist
|
||||||
|
cp -r $SNAPCRAFT_PART_BUILD/dist $SNAPCRAFT_PART_INSTALL/jinja2-dist
|
||||||
|
organize:
|
||||||
|
jinja2-dist: jinja2/dist
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
plugin: python
|
plugin: python
|
||||||
source: https://github.com/docker/docker-py.git
|
source: https://github.com/docker/docker-py.git
|
||||||
|
|
|
||||||
2
tox.ini
2
tox.ini
|
|
@ -21,6 +21,8 @@ deps =
|
||||||
ujson
|
ujson
|
||||||
fastapi
|
fastapi
|
||||||
uvicorn
|
uvicorn
|
||||||
|
orjson
|
||||||
|
jinja2
|
||||||
requests
|
requests
|
||||||
commands =
|
commands =
|
||||||
python unitest.py
|
python unitest.py
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,5 @@
|
||||||
|
|
||||||
fastapi; python_version >= "3.8"
|
fastapi; python_version >= "3.8"
|
||||||
uvicorn; python_version >= "3.8"
|
uvicorn; python_version >= "3.8"
|
||||||
|
orjson; python_version >= "3.8"
|
||||||
|
jinja2
|
||||||
Loading…
Reference in New Issue