From 5e983434a194ce503959a166a5e2b8cd52bd61fb Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 29 Oct 2022 14:40:01 +0200 Subject: [PATCH 01/35] Use of a broken or weak cryptographic hashing algorithm (SHA256) on password storage #2175 --- glances/client_browser.py | 4 +-- glances/compat.py | 8 ++++++ glances/outputs/glances_bottle.py | 3 ++- glances/password.py | 42 ++++++++++++++++--------------- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/glances/client_browser.py b/glances/client_browser.py index 13161e3c..b52160fd 100644 --- a/glances/client_browser.py +++ b/glances/client_browser.py @@ -75,7 +75,7 @@ class GlancesClientBrowser(object): # Try with the preconfigure password (only if status is PROTECTED) clear_password = self.password.get_password(server['name']) if clear_password is not None: - server['password'] = self.password.sha256_hash(clear_password) + server['password'] = self.password.get_hash(clear_password) return 'http://{}:{}@{}:{}'.format(server['username'], server['password'], server['ip'], server['port']) else: return 'http://{}:{}'.format(server['ip'], server['port']) @@ -151,7 +151,7 @@ class GlancesClientBrowser(object): ) # Store the password for the selected server if clear_password is not None: - self.set_in_selected('password', self.password.sha256_hash(clear_password)) + self.set_in_selected('password', self.password.get_hash(clear_password)) # Display the Glance client on the selected server logger.info("Connect Glances client to the {} server".format(server['key'])) diff --git a/glances/compat.py b/glances/compat.py index 81fad5ad..48b35398 100644 --- a/glances/compat.py +++ b/glances/compat.py @@ -68,6 +68,10 @@ if PY3: return s.decode() return s.encode('ascii', 'ignore').decode() + def to_hex(s): + """Convert the bytes string to a hex string""" + return s.hex() + def listitems(d): return list(d.items()) @@ -166,6 +170,10 @@ else: return s return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') + def to_hex(s): + """Convert the string to a hex string in Python 2""" + return s.encode('hex') + def listitems(d): return d.items() diff --git a/glances/outputs/glances_bottle.py b/glances/outputs/glances_bottle.py index cdc54f0e..fc1edf38 100644 --- a/glances/outputs/glances_bottle.py +++ b/glances/outputs/glances_bottle.py @@ -129,7 +129,8 @@ class GlancesBottle(object): pwd = GlancesPassword(username=username, config=self.config) - return pwd.check_password(self.args.password, pwd.sha256_hash(password)) + return pwd.check_password(self.args.password, + pwd.get_hash(password)) else: return False diff --git a/glances/password.py b/glances/password.py index b34c13e0..7cf3fcc5 100644 --- a/glances/password.py +++ b/glances/password.py @@ -16,7 +16,7 @@ import sys import uuid from io import open -from glances.compat import b, input +from glances.compat import b, input, to_hex from glances.config import user_config_dir from glances.globals import safe_makedirs from glances.logger import logger @@ -36,7 +36,7 @@ class GlancesPassword(object): def local_password_path(self): """Return the local password path. - Related toissue: Password files in same configuration dir in effect #2143 + Related to issue: Password files in same configuration dir in effect #2143 """ if self.config is None: return user_config_dir() @@ -45,18 +45,19 @@ class GlancesPassword(object): 'local_password_path', default=user_config_dir()) - def sha256_hash(self, plain_password): - """Return the SHA-256 of the given password.""" - return hashlib.sha256(b(plain_password)).hexdigest() - - def get_hash(self, salt, plain_password): - """Return the hashed password, salt + SHA-256.""" - return hashlib.sha256(salt.encode() + plain_password.encode()).hexdigest() + def get_hash(self, plain_password, salt=''): + """Return the hashed password, salt + pbkdf2_hmac.""" + return to_hex(hashlib.pbkdf2_hmac('sha256', + plain_password.encode(), + salt.encode(), + 100000, + dklen=128)) def hash_password(self, plain_password): """Hash password with a salt based on UUID (universally unique identifier).""" salt = uuid.uuid4().hex - encrypted_password = self.get_hash(salt, plain_password) + encrypted_password = self.get_hash(plain_password, + salt=salt) return salt + '$' + encrypted_password def check_password(self, hashed_password, plain_password): @@ -65,7 +66,8 @@ class GlancesPassword(object): Return the comparison with the encrypted_password. """ salt, encrypted_password = hashed_password.split('$') - re_encrypted_password = self.get_hash(salt, plain_password) + re_encrypted_password = self.get_hash(plain_password, + salt = salt) return encrypted_password == re_encrypted_password def get_password(self, description='', confirm=False, clear=False): @@ -74,11 +76,11 @@ class GlancesPassword(object): 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) + Optionally: save the password to a file (hashed with salt + SHA-pbkdf2_hmac) 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 + 2) the password is hashed with SHA-pbkdf2_hmac (only SHA string transit through the network) """ if os.path.exists(self.password_file) and not clear: @@ -86,21 +88,21 @@ class GlancesPassword(object): logger.info("Read password from file {}".format(self.password_file)) password = self.load_password() else: - # password_sha256 is the plain SHA-256 password - # password_hashed is the salt + SHA-256 password - password_sha256 = self.sha256_hash(getpass.getpass(description)) - password_hashed = self.hash_password(password_sha256) + # password_hash is the plain SHA-pbkdf2_hmac password + # password_hashed is the salt + SHA-pbkdf2_hmac password + password_hash = self.get_hash(getpass.getpass(description)) + password_hashed = self.hash_password(password_hash) if confirm: # password_confirm is the clear password (only used to compare) - password_confirm = self.sha256_hash(getpass.getpass('Password (confirm): ')) + password_confirm = self.get_hash(getpass.getpass('Password (confirm): ')) if not self.check_password(password_hashed, password_confirm): logger.critical("Sorry, passwords do not match. Exit.") sys.exit(1) - # Return the plain SHA-256 or the salted password + # Return the plain SHA-pbkdf2_hmac or the salted password if clear: - password = password_sha256 + password = password_hash else: password = password_hashed From 1fc5795b1e45646225dc4a586ba60b1709387f30 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Thu, 3 Nov 2022 15:42:30 +0100 Subject: [PATCH 02/35] Modify the version (change by error) --- glances/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/__init__.py b/glances/__init__.py index 4db6663f..b49f0afa 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -19,7 +19,7 @@ import sys # Global name # Version should start and end with a numerical char # See https://packaging.python.org/specifications/core-metadata/#version -__version__ = '3.3.1_beta1' +__version__ = '3.3.0.4' __author__ = 'Nicolas Hennion ' __license__ = 'LGPLv3' From 78705d6df187ad87964210ad6cc60f436ddac378 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Dec 2022 05:25:55 +0000 Subject: [PATCH 03/35] Update dependency zeroconf to v0.47.1 --- optional-requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/optional-requirements.txt b/optional-requirements.txt index a38c6e71..867acc1f 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -32,5 +32,5 @@ six sparklines statsd wifi -zeroconf==0.47.0; python_version < "3.7" +zeroconf==0.47.1; python_version < "3.7" zeroconf; python_version >= "3.7" diff --git a/setup.py b/setup.py index 090f65da..9344d0b0 100755 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ def get_install_requires(): def get_install_extras_require(): extras_require = { 'action': ['chevron'], - 'browser': ['zeroconf==0.47.0' if PY2 else 'zeroconf>=0.19.1'], + 'browser': ['zeroconf==0.47.1' if PY2 else 'zeroconf>=0.19.1'], 'cloud': ['requests'], 'docker': ['docker>=2.0.0', 'python-dateutil', 'six'], 'export': ['bernhard', 'cassandra-driver', 'couchdb', 'elasticsearch', From 50f5bfc34b57ede4d4849d98761f2a67a3584366 Mon Sep 17 00:00:00 2001 From: fkwong Date: Thu, 5 Jan 2023 13:19:42 +0800 Subject: [PATCH 04/35] Add ubuntu Dockerfile --- Makefile | 5 ++ docker-files/ubuntu.Dockerfile | 143 +++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 docker-files/ubuntu.Dockerfile diff --git a/Makefile b/Makefile index 23c358bd..4908f51c 100644 --- a/Makefile +++ b/Makefile @@ -137,6 +137,11 @@ docker-alpine: ## Generate local docker images (Alpine) docker build --target minimal -f ./docker-files/alpine.Dockerfile -t glances:local-alpine-minimal . docker build --target dev -f ./docker-files/alpine.Dockerfile -t glances:local-alpine-dev . +docker-ubuntu: ## Generate local docker images (Ubuntu) + docker build --target full -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-full . + docker build --target minimal -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-minimal . + docker build --target dev -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-dev . + # =================================================================== # Run # =================================================================== diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile new file mode 100644 index 00000000..31a5f186 --- /dev/null +++ b/docker-files/ubuntu.Dockerfile @@ -0,0 +1,143 @@ +# +# Glances Dockerfile (based on Ubuntu) +# +# https://github.com/nicolargo/glances +# + +# WARNING: the versions should be set. +# Ex: Python 3.10 for Ubuntu 22.04 +# Note: ENV is for future running containers. ARG for building your Docker image. + +ARG IMAGE_VERSION=11.8.0-base-ubuntu22.04 +ARG PYTHON_VERSION=3.10 +ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ +FROM nvidia/cuda:${IMAGE_VERSION} as build + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + python3 \ + python3-dev \ + python3-pip \ + python3-wheel \ + musl-dev \ + build-essential \ + libzmq5 \ + curl \ + lm-sensors \ + wireless-tools \ + net-tools \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +############################################################################## +# Install the dependencies beforehand to make them cacheable + +FROM build as buildRequirements +ARG PYTHON_VERSION +ARG PIP_MIRROR + +ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ + +COPY requirements.txt . +RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user -r requirements.txt -i ${PIP_MIRROR} + +# Minimal means no webui, but it break what is done previously (see #2155) +# So install the webui requirements... +COPY webui-requirements.txt . +RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user -r webui-requirements.txt -i ${PIP_MIRROR} + +# As minimal image we want to monitor others docker containers +RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user docker -i ${PIP_MIRROR} + +# Force install otherwise it could be cached without rerun +ARG CHANGING_ARG +RUN python${PYTHON_VERSION} -m pip install --no-cache-dir --user glances -i ${PIP_MIRROR} + +############################################################################## + +FROM build as buildOptionalRequirements +ARG PYTHON_VERSION +ARG PIP_MIRROR + +COPY requirements.txt . +COPY optional-requirements.txt . +RUN CASS_DRIVER_NO_CYTHON=1 pip3 install --no-cache-dir --user -r optional-requirements.txt -i ${PIP_MIRROR} + +############################################################################## +# full image +############################################################################## + +FROM build as full +ARG PYTHON_VERSION + +COPY --from=buildRequirements /root/.local/bin /root/.local/bin/ +COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/ +COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/ +COPY ./docker-compose/glances.conf /etc/glances.conf + +# EXPOSE PORT (XMLRPC / WebUI) +EXPOSE 61209 61208 + +# Define default command. +WORKDIR /glances +CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT + +############################################################################## +# minimal image +############################################################################## + +# Create running images without any building dependency +FROM nvidia/cuda:${IMAGE_VERSION} as minimal +ARG PYTHON_VERSION + +ARG DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + python3 \ + python3-packaging \ + python3-dateutil \ + curl \ + lm-sensors \ + wireless-tools \ + net-tools \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=buildRequirements /root/.local/bin /root/.local/bin/ +COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/ +COPY ./docker-compose/glances.conf /etc/glances.conf + +# EXPOSE PORT (XMLRPC / WebUI) +EXPOSE 61209 61208 + +# Define default command. +WORKDIR /glances +CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT + +############################################################################## +# dev image +############################################################################## + +FROM full as dev +ARG PYTHON_VERSION + +COPY --from=buildRequirements /root/.local/bin /root/.local/bin/ +COPY --from=buildRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/ +COPY --from=buildOptionalRequirements /root/.local/lib/python${PYTHON_VERSION}/site-packages /root/.local/lib/python${PYTHON_VERSION}/site-packages/ +COPY ./docker-compose/glances.conf /etc/glances.conf + +# Copy the current Glances source code +COPY . /glances + +# EXPOSE PORT (XMLRPC / WebUI) +EXPOSE 61209 61208 + +# Forward access and error logs to Docker's log collector +RUN ln -sf /dev/stdout /tmp/glances-root.log \ + && ln -sf /dev/stderr /var/log/error.log + +# Define default command. +WORKDIR /glances +CMD python3 -m glances -C /etc/glances.conf $GLANCES_OPT From 848c0ef3abb10b22cd7152e2890c88a7b22a92b9 Mon Sep 17 00:00:00 2001 From: mfridge <15315366+mfridge@users.noreply.github.com> Date: Fri, 6 Jan 2023 16:07:33 +0100 Subject: [PATCH 05/35] Consider quotes when splitting command arguments --- glances/secure.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/glances/secure.py b/glances/secure.py index 65c64945..1bb93a16 100644 --- a/glances/secure.py +++ b/glances/secure.py @@ -11,6 +11,7 @@ from glances.compat import nativestr from subprocess import Popen, PIPE +import re def secure_popen(cmd): @@ -48,8 +49,8 @@ def __secure_popen(cmd): p_last = None # Split by pipe '|' for sub_cmd in cmd.split('|'): - # Split by space ' ' - sub_cmd_split = [i for i in sub_cmd.split(' ') if i] + # Split by space character, but do no split spaces within quotes + sub_cmd_split = [_ for _ in list(filter(None, re.split(r'(\s+)|(".*?"+?)|(\'.*?\'+?)', sub_cmd))) if _ != ' '] p = Popen(sub_cmd_split, shell=False, stdin=sub_cmd_stdin, stdout=PIPE, stderr=PIPE) if p_last is not None: # Allow p_last to receive a SIGPIPE if p exits. From 220de545eb73ff7517b387c906a77afef18a04d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jan 2023 18:48:58 +0000 Subject: [PATCH 06/35] Update crazy-max/ghaction-docker-meta action to v4.2.0 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d9d1376..082066fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,7 @@ jobs: - name: Retrieve Repository Docker metadata id: docker_meta - uses: crazy-max/ghaction-docker-meta@v4.1.1 + uses: crazy-max/ghaction-docker-meta@v4.2.0 with: images: ${{ env.DEFAULT_DOCKER_IMAGE }} labels: | From 416bbed02e2a3e15f867f7400fd90271390bf231 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Fri, 13 Jan 2023 09:01:09 +0100 Subject: [PATCH 07/35] Error when process list is displayed in Programs mode #2209 --- glances/programs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/programs.py b/glances/programs.py index 95837d74..35442aa8 100644 --- a/glances/programs.py +++ b/glances/programs.py @@ -36,7 +36,7 @@ def processes_to_programs(processes): 'name': p['name'], 'cmdline': [p['name']], 'pid': '_', - 'username': p['username'], + 'username': p['username'] if 'username' in p else '_', 'nice': p['nice'], 'status': p['status'], } From 9ca7e4121fdfa1b7cf93362e5c51eb3bf79b3ea6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Jan 2023 11:05:36 +0000 Subject: [PATCH 08/35] Update nvidia/cuda Docker tag to v12 --- docker-files/ubuntu.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 31a5f186..51771eaf 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -8,7 +8,7 @@ # Ex: Python 3.10 for Ubuntu 22.04 # Note: ENV is for future running containers. ARG for building your Docker image. -ARG IMAGE_VERSION=11.8.0-base-ubuntu22.04 +ARG IMAGE_VERSION=12.0.0-base-ubuntu22.04 ARG PYTHON_VERSION=3.10 ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ FROM nvidia/cuda:${IMAGE_VERSION} as build From 1cad8df2daab76ce3fe1b747bff47be6786a99e7 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Fri, 13 Jan 2023 15:41:40 +0100 Subject: [PATCH 09/35] CSV export dependent on sort order for docker container cpu #2156 --- glances/exports/glances_csv.py | 4 ++-- glances/stats.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/glances/exports/glances_csv.py b/glances/exports/glances_csv.py index eedb6541..d60f4223 100644 --- a/glances/exports/glances_csv.py +++ b/glances/exports/glances_csv.py @@ -81,10 +81,10 @@ class Export(GlancesExport): # Loop over plugins to export for plugin in self.plugins_to_export(stats): if isinstance(all_stats[plugin], list): - for stat in all_stats[plugin]: + for stat in sorted(all_stats[plugin], key=lambda x: x['key']): # First line: header if self.first_line: - csv_header += ('{}_{}_{}'.format(plugin, self.get_item_key(stat), item) for item in stat) + csv_header += ['{}_{}_{}'.format(plugin, self.get_item_key(stat), item) for item in stat] # Others lines: stats csv_data += itervalues(stat) elif isinstance(all_stats[plugin], dict): diff --git a/glances/stats.py b/glances/stats.py index 86cbe31e..dfece498 100644 --- a/glances/stats.py +++ b/glances/stats.py @@ -118,7 +118,7 @@ class GlancesStats(object): if args is not None: # If the all key is set in the disable_plugin option then look in the enable_plugin option if getattr(args, 'disable_all', False): - logger.info('%s => %s', name, getattr(args, 'enable_' + name, False)) + logger.debug('%s => %s', name, getattr(args, 'enable_' + name, False)) setattr(args, 'disable_' + name, not getattr(args, 'enable_' + name, False)) else: setattr(args, 'disable_' + name, getattr(args, 'disable_' + name, False)) From 623b8bf1efc9c725ceebe763eee26f5360e3e5da Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Jan 2023 14:53:01 +0000 Subject: [PATCH 10/35] Update crazy-max/ghaction-docker-meta action to v4.3.0 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 082066fe..06c83b9a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,7 @@ jobs: - name: Retrieve Repository Docker metadata id: docker_meta - uses: crazy-max/ghaction-docker-meta@v4.2.0 + uses: crazy-max/ghaction-docker-meta@v4.3.0 with: images: ${{ env.DEFAULT_DOCKER_IMAGE }} labels: | From e564ba4cf65dafa9ca768e11b3cb75bc7f17b41c Mon Sep 17 00:00:00 2001 From: nicolargo Date: Fri, 13 Jan 2023 18:59:25 +0100 Subject: [PATCH 11/35] Update memory profile chart --- .../glances-memory-profiling-with-history.png | Bin 32794 -> 33567 bytes ...ances-memory-profiling-without-history.png | Bin 31862 -> 31797 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_static/glances-memory-profiling-with-history.png b/docs/_static/glances-memory-profiling-with-history.png index 8d9c8d7b9de0fe643887e7c04d6e480bc0e57ec6..698b939cca54294ab7eef97b57a8d5704569f446 100644 GIT binary patch literal 33567 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 literal 32794 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 L@+Yxl=dAfJ`A7uz diff --git a/docs/_static/glances-memory-profiling-without-history.png b/docs/_static/glances-memory-profiling-without-history.png index 795b7820d1136087b441929a1368e0b25ce9302e..a2751e9683db0d568fa815185dde86b95559afce 100644 GIT binary patch literal 31797 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 From f3f85eeb276a0ec2677fe4ba26053fde304757e5 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 14 Jan 2023 09:10:56 +0100 Subject: [PATCH 12/35] Unable to see docker related information #2180 --- docker-files/alpine.Dockerfile | 1 + docker-files/ubuntu.Dockerfile | 1 + 2 files changed, 2 insertions(+) diff --git a/docker-files/alpine.Dockerfile b/docker-files/alpine.Dockerfile index 23d301e8..c44983b7 100644 --- a/docker-files/alpine.Dockerfile +++ b/docker-files/alpine.Dockerfile @@ -89,6 +89,7 @@ RUN apk add --no-cache \ python3 \ py3-packaging \ py3-dateutil \ + py3-requests \ curl \ lm-sensors \ wireless-tools \ diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 31a5f186..85a44a1e 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -98,6 +98,7 @@ RUN apt-get update \ python3 \ python3-packaging \ python3-dateutil \ + python3-requests \ curl \ lm-sensors \ wireless-tools \ From 10fbb246ac382d7ea461b3ea38297e934ec9098b Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 14 Jan 2023 09:15:36 +0100 Subject: [PATCH 13/35] Add run-docker-ubuntu-* in Makefile --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 4908f51c..9128fb07 100644 --- a/Makefile +++ b/Makefile @@ -164,6 +164,15 @@ run-docker-alpine-full: ## Start Glances Alpine Docker full in console mode run-docker-alpine-dev: ## Start Glances Alpine Docker dev in console mode docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-dev +run-docker-ubuntu-minimal: ## Start Glances Ubuntu Docker minimal in console mode + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-minimal + +run-docker-ubuntu-full: ## Start Glances Ubuntu Docker full in console mode + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-full + +run-docker-ubuntu-dev: ## Start Glances Ubuntu Docker dev in console mode + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-dev + run-webserver: ## Start Glances in Web server mode ./venv/bin/python -m glances -C ./conf/glances.conf -w From b79edc7df6a54337830684d9b53d61716d2a8330 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 14 Jan 2023 09:59:56 +0100 Subject: [PATCH 14/35] Glances 3.3.1 release --- NEWS.rst | 56 +- conf/glances.conf | 1 + docker-compose/glances.conf | 8 +- docs/api.rst | 822 +++++++++++------------ docs/man/glances.1 | 88 +-- glances/__init__.py | 2 +- glances/outputs/static/package-lock.json | 12 +- glances/plugins/glances_network.py | 42 +- glances/processes.py | 21 +- 9 files changed, 515 insertions(+), 537 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index d876a860..314bbdf6 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -6,7 +6,61 @@ Version 3.3.1 =============== - Under development, see milestone https://github.com/nicolargo/glances/milestone/61 +Enhancements: + + * Minor change on the help screen + * Refactor some loop in the processes function + * Replace json by ujson #2201 + +Bug corrected: + + * Unable to see docker related information #2180 + * CSV export dependent on sort order for docker container cpu #2156 + * Error when process list is displayed in Programs mode #2209 + * Console formatting permanently messed up when other text printed #2211 + * API GET uptime returns formatted string, not seconds as the doc says #2158 + * Glances UI is breaking for multiline commands #2189 + +Documentation and CI: + + * Add unitary test for memory profiling + * Update memory profile chart + * Add run-docker-ubuntu-* in Makefile + * The open-web-browser option was missing dashes #2219 + * Correct regexp in glances.conf file example + * What is CW from network #2222 (related to discussion #2221) + * Change Glances repology URL + * Add example for the date format + * Correct Flake8 configuration file + * Drop UT for Python 3.5 and 3.6 (no more available in Ubuntu 22.04) + * Correct unitary test with Python 3.5 + * Update Makefile with comments + * Update Python minimal requirement for py3nvlm + * Update security policy (user can open private issue directly in Github) + * Add a simple run script. Entry point for IDE debuger + +Cyber security update: + + * Security alert on ujson < 5.4 + * Merge pull request #2243 from nicolargo/renovate/nvidia-cuda-12.x + * Merge pull request #2244 from nicolargo/renovate/crazy-max-ghaction-docker-meta-4.x + * Merge pull request #2228 from nicolargo/renovate/zeroconf-0.x + * Merge pull request #2242 from nicolargo/renovate/crazy-max-ghaction-docker-meta-4.x + * Merge pull request #2239 from mfridge/action-command-split + * Merge pull request #2165 from nicolargo/renovate/zeroconf-0.x + * Merge pull request #2199 from nicolargo/renovate/alpine-3.x + * Merge pull request #2202 from chncaption/oscs_fix_cdr0ts8au51t49so8c6g + * Bump loader-utils from 2.0.0 to 2.0.3 in /glances/outputs/static #2187 - Update Web lib + +Contributors for this version: + + * Nicolargo + * renovate[bot] + * chncaption + * fkwong + * *mfridge + +And also a big thanks to @RazCrimson (https://github.com/RazCrimson) for the support to the Glances community ! =============== Version 3.3.0.4 diff --git a/conf/glances.conf b/conf/glances.conf index e56ad73b..835b84d9 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -307,6 +307,7 @@ battery_critical=95 #core 0_fans_speed_alias=CPU Core 0 fan #or #core 0_alias=CPU Core 0 +#core 1_alias=CPU Core 1 [processcount] disable=False diff --git a/docker-compose/glances.conf b/docker-compose/glances.conf index 6f6e4180..0ee06cbd 100644 --- a/docker-compose/glances.conf +++ b/docker-compose/glances.conf @@ -10,8 +10,10 @@ refresh=2 # Does Glances should check if a newer version is available on PyPI ? check_update=false # History size (maximum number of values) -# Default is 3600 seconds (1 hour) -history_size=3600 +# Default is 1200 values (~1h with the default refresh rate) +history_size=1200 +# Set the way Glances should display the date (default is %Y-%m-%d %H:%M:%S %Z) +#strftime_format="%Y-%m-%d %H:%M:%S %Z" ############################################################################## # User interface @@ -212,7 +214,7 @@ critical=-85 disable=False # Define the list of hidden disks (comma-separated regexp) #hide=sda2,sda5,loop.* -hide=loop.*,/dev/loop* +hide=loop.*,/dev/loop.* # Define the list of disks to be show (comma-separated) #show=sda.* # Alias for sda1 diff --git a/docs/api.rst b/docs/api.rst index 590b3a1e..d60c548f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -74,7 +74,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8624663352966309}, + "timer": 0.8425271511077881}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -83,7 +83,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8622386455535889}] + "timer": 0.8423657417297363}] Get a specific field:: @@ -101,7 +101,7 @@ Get a specific item when field matchs the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8624663352966309}]} + "timer": 0.8425271511077881}]} GET core -------- @@ -131,19 +131,19 @@ Get plugin stats:: "ctx_switches": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 47.0, + "idle": 58.6, "interrupts": 0, - "iowait": 2.2, + "iowait": 0.0, "irq": 0.0, "nice": 0.0, "soft_interrupts": 0, - "softirq": 1.0, + "softirq": 0.0, "steal": 0.0, "syscalls": 0, - "system": 8.0, + "system": 6.7, "time_since_update": 1, - "total": 48.0, - "user": 41.8} + "total": 38.2, + "user": 34.7} Fields descriptions: @@ -166,7 +166,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/cpu/total - {"total": 48.0} + {"total": 38.2} GET diskio ---------- @@ -215,7 +215,7 @@ Get plugin stats:: "Id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "Image": ["portainer/portainer-ce:2.9.3"], "Status": "running", - "Uptime": "3 days", + "Uptime": "36 mins", "cpu": {"total": 0.0}, "cpu_percent": 0.0, "io": {}, @@ -242,9 +242,9 @@ Get plugin stats:: "Os": "linux"}, "Name": "Engine", "Version": "20.10.22"}, - {"Details": {"GitCommit": "78f51771157abb6c9ed224c22013cdf09962315d"}, + {"Details": {"GitCommit": "5b842e528e99d4d4c1686467debf2bd4b88ecd86"}, "Name": "containerd", - "Version": "1.6.13"}, + "Version": "1.6.15"}, {"Details": {"GitCommit": "v1.1.4-0-g5fd4c4d"}, "Name": "runc", "Version": "1.1.4"}, @@ -266,13 +266,13 @@ Get plugin stats:: # curl http://localhost:61208/api/3/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 54919016448, + "free": 50442330112, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 76.2, + "percent": 78.2, "size": 243334156288, - "used": 176027684864}, + "used": 180504371200}, {"device_name": "zsfpool", "free": 41811968, "fs_type": "zfs", @@ -291,13 +291,13 @@ Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/fs/mnt_point// {"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 54919016448, + "free": 50442330112, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 76.2, + "percent": 78.2, "size": 243334156288, - "used": 176027684864}]} + "used": 180504371200}]} GET ip ------ @@ -305,11 +305,11 @@ GET ip Get plugin stats:: # curl http://localhost:61208/api/3/ip - {"address": "192.168.1.12", + {"address": "192.168.1.14", "gateway": "192.168.1.1", "mask": "255.255.255.0", "mask_cidr": 24, - "public_address": "90.8.134.236", + "public_address": "109.210.93.150", "public_info_human": ""} Get a specific field:: @@ -323,7 +323,7 @@ GET load Get plugin stats:: # curl http://localhost:61208/api/3/load - {"cpucore": 4, "min1": 2.5703125, "min15": 2.0634765625, "min5": 2.2353515625} + {"cpucore": 4, "min1": 1.31591796875, "min15": 1.9091796875, "min5": 1.6796875} Fields descriptions: @@ -335,7 +335,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/load/min1 - {"min1": 2.5703125} + {"min1": 1.31591796875} GET mem ------- @@ -343,16 +343,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/3/mem - {"active": 3018625024, - "available": 2375323648, - "buffers": 97480704, - "cached": 2774757376, - "free": 2375323648, - "inactive": 3403993088, - "percent": 69.7, - "shared": 623783936, + {"active": 2804523008, + "available": 2706178048, + "buffers": 264335360, + "cached": 3114909696, + "free": 2706178048, + "inactive": 3516907520, + "percent": 65.5, + "shared": 591532032, "total": 7836188672, - "used": 5460865024} + "used": 5130010624} Fields descriptions: @@ -379,13 +379,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/3/memswap - {"free": 5943132160, - "percent": 26.5, - "sin": 1293230080, - "sout": 3734319104, + {"free": 2626473984, + "percent": 67.5, + "sin": 4755005440, + "sout": 11063549952, "time_since_update": 1, "total": 8082419712, - "used": 2139287552} + "used": 5455945728} Fields descriptions: @@ -409,29 +409,29 @@ Get plugin stats:: # curl http://localhost:61208/api/3/network [{"alias": None, - "cumulative_cx": 90372412, - "cumulative_rx": 45186206, - "cumulative_tx": 45186206, - "cx": 23560, + "cumulative_cx": 398215554, + "cumulative_rx": 199107777, + "cumulative_tx": 199107777, + "cx": 3314, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 11780, + "rx": 1657, "speed": 0, "time_since_update": 1, - "tx": 11780}, + "tx": 1657}, {"alias": None, - "cumulative_cx": 5545979740, - "cumulative_rx": 5412582465, - "cumulative_tx": 133397275, - "cx": 11955338, + "cumulative_cx": 39497892918, + "cumulative_rx": 38949809930, + "cumulative_tx": 548082988, + "cx": 27720, "interface_name": "wlp2s0", "is_up": True, "key": "interface_name", - "rx": 11833811, + "rx": 21708, "speed": 0, "time_since_update": 1, - "tx": 121527}] + "tx": 6012}] Fields descriptions: @@ -458,23 +458,23 @@ Get a specific field:: "br_grafana", "mpqemubr0", "tap-1e376645a40", - "veth7ad1596"]} + "veth57bdacb"]} Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/network/interface_name/lo {"lo": [{"alias": None, - "cumulative_cx": 90372412, - "cumulative_rx": 45186206, - "cumulative_tx": 45186206, - "cx": 23560, + "cumulative_cx": 398215554, + "cumulative_rx": 199107777, + "cumulative_tx": 199107777, + "cx": 3314, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 11780, + "rx": 1657, "speed": 0, "time_since_update": 1, - "tx": 11780}]} + "tx": 1657}]} GET now ------- @@ -482,7 +482,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/3/now - "2022-12-21 13:50:24 CET" + "2023-01-14 09:45:44 CET" GET percpu ---------- @@ -493,29 +493,29 @@ Get plugin stats:: [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 40.0, - "iowait": 4.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 7.0, - "total": 60.0, - "user": 48.0}, - {"cpu_number": 1, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 49.0, + "idle": 56.1, "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.0, - "total": 51.0, - "user": 46.0}] + "system": 4.7, + "total": 43.9, + "user": 39.3}, + {"cpu_number": 1, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 28.2, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 3.9, + "total": 71.8, + "user": 68.0}] Get a specific field:: @@ -534,7 +534,7 @@ Get plugin stats:: "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.011101, + "status": 0.007094, "timeout": 3}] Get a specific field:: @@ -551,7 +551,7 @@ Get a specific item when field matchs the given value:: "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.011101, + "status": 0.007094, "timeout": 3}]} GET processcount @@ -560,12 +560,12 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/3/processcount - {"pid_max": 0, "running": 1, "sleeping": 314, "thread": 1698, "total": 441} + {"pid_max": 0, "running": 2, "sleeping": 334, "thread": 1765, "total": 403} Get a specific field:: # curl http://localhost:61208/api/3/processcount/total - {"total": 441} + {"total": 403} GET processlist --------------- @@ -573,7 +573,22 @@ GET processlist Get plugin stats:: # curl http://localhost:61208/api/3/processlist - [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox", + [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox"], + "cpu_percent": 0.0, + "cpu_times": [8504.75, 2803.93, 8401.36, 1489.57, 0.0], + "gids": [1000, 1000, 1000], + "io_counters": [6360911872, 11858505728, 0, 0, 0], + "key": "pid", + "memory_info": [484036608, 22242152448, 100323328, 659456, 0, 1409527808, 0], + "memory_percent": 6.176939176178121, + "name": "firefox", + "nice": 0, + "num_threads": 187, + "pid": 4674, + "status": "S", + "time_since_update": 1, + "username": "nicolargo"}, + {"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox", "-contentproc", "-childID", "1", @@ -593,249 +608,251 @@ Get plugin stats:: "true", "tab"], "cpu_percent": 0.0, - "cpu_times": [544.28, 96.68, 0.0, 0.0, 0.0], + "cpu_times": [1878.88, 294.96, 0.0, 0.0, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [131830784, 0, 0, 0, 0], + "io_counters": [446676992, 0, 0, 0, 0], "key": "pid", - "memory_info": [465154048, 3321061376, 73093120, 659456, 0, 731664384, 0], - "memory_percent": 5.935973053610519, + "memory_info": [379330560, 3766951936, 44253184, 659456, 0, 1161146368, 0], + "memory_percent": 4.840753277871052, "name": "WebExtensions", "nice": 0, - "num_threads": 22, + "num_threads": 20, "pid": 4980, "status": "S", "time_since_update": 1, - "username": "nicolargo"}, - {"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox"], - "cpu_percent": 0.0, - "cpu_times": [4509.1, 1511.09, 3792.22, 791.2, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [1919733760, 4714143744, 0, 0, 0], - "key": "pid", - "memory_info": [456572928, 30645571584, 117829632, 659456, 0, 1229160448, 0], - "memory_percent": 5.826466757129147, - "name": "firefox", - "nice": 0, - "num_threads": 178, - "pid": 4674, - "status": "S", - "time_since_update": 1, "username": "nicolargo"}] Get a specific field:: # curl http://localhost:61208/api/3/processlist/pid - {"pid": [4980, - 4674, - 5464, + {"pid": [4674, + 4980, 5110, - 87895, - 87518, - 93773, + 527830, + 173709, 3699, + 5464, + 431554, + 495017, 5113, - 87474, - 10499, - 10094, + 173765, + 174093, + 87518, 10140, - 56113, - 50931, - 87407, - 65742, + 93773, 5000, - 87546, - 99360, - 87753, - 87995, - 87994, - 99579, - 99462, - 99838, - 51406, - 51412, - 51549, - 10551, - 87616, - 94497, + 173645, + 534445, + 511174, + 173751, + 534543, 9953, - 87853, - 94498, - 87445, - 3586, - 87570, - 100353, - 2510, - 48450, - 4426, - 67307, - 5690, - 87454, - 1653, - 4206, - 87779, - 427, - 17411, + 534732, + 535113, + 284680, + 128927, + 173679, + 535159, 4050, - 87412, - 4903, - 87413, - 5691, - 2702, - 3820, - 3512, - 5730, - 4008, - 17316, - 10649, - 1777, - 3903, - 3792, - 1616, - 4433, - 10381, - 67618, - 3902, - 10082, - 98474, - 3829, - 10318, - 3897, - 99871, - 10319, - 17315, - 64241, - 66633, - 2209, - 1, + 3586, + 4426, + 173949, + 493657, + 511164, + 2510, 3351, - 3783, - 3676, - 4005, + 173688, + 173781, + 496818, + 496817, + 408152, + 493678, + 4206, + 511549, + 427, + 173973, + 3820, + 5730, + 17316, + 174051, + 1616, + 3512, + 493683, + 1, + 5690, + 3903, + 4008, + 165775, + 3792, + 174314, + 493699, + 94498, + 2702, 1662, - 4158, 1641, - 1838, - 3910, - 3730, - 98475, - 2626, - 1636, + 87895, + 87994, + 4158, + 87995, + 174313, + 4433, + 87753, + 3897, + 5691, + 4458, + 87853, + 94497, + 4903, + 3902, + 17315, + 3829, + 173649, + 87454, 3273, + 1838, + 3676, + 3783, 3695, - 64274, + 10499, + 87474, + 3907, + 2209, + 3730, + 3486, 3915, - 10048, + 3901, + 3910, + 10649, + 533610, + 10551, + 511526, + 10082, + 87412, + 1615, + 173650, + 4005, + 3904, + 10318, + 165937, + 1663, + 1777, + 2417, + 2626, + 10319, + 3805, + 10094, + 3956, + 1837, + 17467, + 1636, 2688, 4049, - 10032, - 3907, - 3901, - 4458, - 3904, - 3898, - 3805, - 2417, - 3486, - 1837, - 1868, - 87663, + 4089, + 3521, + 87413, + 87779, + 3861, 1416, - 10033, + 102131, + 10032, 1782, 1598, - 3970, - 1663, - 3591, - 3743, - 17467, - 1615, - 3956, + 115869, 17484, - 9974, - 4170, - 3527, - 3909, - 1642, - 3861, - 3521, + 3970, 1659, - 3908, - 2159, - 3697, - 3717, - 1626, - 4036, - 3900, - 4089, - 1660, 3524, + 465, + 2159, + 3898, + 3527, + 3802, + 5024, + 3743, + 1626, + 10033, + 3908, + 4036, + 3697, + 4170, + 10048, + 1642, 3906, 1654, - 3891, - 3781, - 3802, + 3717, + 173849, + 3591, 3896, - 3994, - 3748, - 465, - 3722, - 5769, 3726, - 3905, - 3508, + 3909, + 3722, + 3900, + 3781, + 3994, + 10381, + 3748, + 87429, 3584, - 3533, + 3905, + 1868, 1612, - 1648, - 3510, - 3664, - 1652, + 3891, + 112675, 1607, + 1660, + 3533, + 3510, + 98474, + 10372, + 3508, + 1648, + 1652, 3706, - 2680, - 1999, - 1419, + 3664, 1629, + 1999, 1614, 1415, - 2681, - 10372, - 5024, + 535105, + 1419, 1666, - 3354, 4187, - 17364, - 100324, + 2680, + 173665, 1432, - 67596, + 17364, + 2681, 1430, - 87429, - 4620, 2428, - 98346, - 98353, + 3354, + 142951, 1609, - 67550, - 67574, - 3487, - 67558, - 4546, - 87415, - 67580, + 98475, 1599, - 99855, - 100352, + 535158, + 5769, 10035, + 173652, + 87415, 3895, 2483, + 511483, 3572, - 98485, - 2430, - 2465, - 2492, - 1669, - 1431, + 511504, + 191811, + 98353, 98484, + 511512, + 532452, + 98346, + 511490, + 4546, + 3487, + 2430, + 2492, + 2465, + 1431, + 1669, 2, 3, 4, @@ -962,8 +979,6 @@ Get a specific field:: 1087, 1088, 1089, - 2188, - 2190, 2491, 2527, 2539, @@ -976,136 +991,65 @@ Get a specific field:: 2599, 2606, 3780, + 4620, 10063, - 75477, - 87199, - 93508, - 93821, - 93822, - 93824, - 95614, - 96086, - 96234, - 96378, - 96637, - 96797, - 97087, - 97324, - 97895, - 98051, - 98052, - 98553, - 99561, - 99632, - 99639, - 99684, - 99738, - 99739, - 99740, - 99741, - 99742, - 99743, - 99744, - 99745, - 99746, - 99747, - 99748, - 99749, - 99750, - 99751, - 99752, - 99753, - 99754, - 99755, - 99756, - 99757, - 99758, - 99759, - 99760, - 99761, - 99762, - 99763, - 99764, - 99765, - 99766, - 99767, - 99768, - 99769, - 99770, - 99771, - 99772, - 99773, - 99774, - 99775, - 99776, - 99777, - 99778, - 99779, - 99780, - 99781, - 99782, - 99783, - 99784, - 99785, - 99786, - 99787, - 99788, - 99789, - 99790, - 99791, - 99792, - 99793, - 99794, - 99795, - 99796, - 99797, - 99798, - 99799, - 99800, - 99801, - 99802, - 99804, - 100030]} + 87445, + 282372, + 284747, + 284755, + 284756, + 284759, + 284760, + 445439, + 445440, + 445441, + 491085, + 493353, + 493435, + 493436, + 493437, + 493438, + 493440, + 493488, + 525438, + 526723, + 527334, + 529501, + 532606, + 532692, + 532694, + 532700, + 532986, + 533409, + 533601, + 533685, + 533744, + 533796, + 533986, + 534098, + 534679]} Get a specific item when field matchs the given value:: - # curl http://localhost:61208/api/3/processlist/pid/4980 - {"4980": [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox", - "-contentproc", - "-childID", - "1", - "-isForBrowser", - "-prefsLen", - "31799", - "-prefMapSize", - "234979", - "-jsInitLen", - "246704", - "-parentBuildID", - "20221128185858", - "-appDir", - "/snap/firefox/2154/usr/lib/firefox/browser", - "{8ed7e0e9-5dcf-4c35-9523-65d5178968f5}", - "4674", - "true", - "tab"], + # curl http://localhost:61208/api/3/processlist/pid/4674 + {"4674": [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox"], "cpu_percent": 0.0, - "cpu_times": [544.28, 96.68, 0.0, 0.0, 0.0], + "cpu_times": [8504.75, 2803.93, 8401.36, 1489.57, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [131830784, 0, 0, 0, 0], + "io_counters": [6360911872, 11858505728, 0, 0, 0], "key": "pid", - "memory_info": [465154048, - 3321061376, - 73093120, + "memory_info": [484036608, + 22242152448, + 100323328, 659456, 0, - 731664384, + 1409527808, 0], - "memory_percent": 5.935973053610519, - "name": "WebExtensions", + "memory_percent": 6.176939176178121, + "name": "firefox", "nice": 0, - "num_threads": 22, - "pid": 4980, + "num_threads": 187, + "pid": 4674, "status": "S", "time_since_update": 1, "username": "nicolargo"}]} @@ -1124,69 +1068,69 @@ GET quicklook Get plugin stats:: # curl http://localhost:61208/api/3/quicklook - {"cpu": 48.0, - "cpu_hz": 3000000000.0, - "cpu_hz_current": 2765088250.0, + {"cpu": 38.2, + "cpu_hz": 2025000000.0, + "cpu_hz_current": 1247640750.0, "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", - "mem": 69.7, + "mem": 65.5, "percpu": [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 40.0, - "iowait": 4.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 7.0, - "total": 60.0, - "user": 48.0}, - {"cpu_number": 1, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 49.0, + "idle": 56.1, "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.0, - "total": 51.0, - "user": 46.0}, - {"cpu_number": 2, + "system": 4.7, + "total": 43.9, + "user": 39.3}, + {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 48.0, - "iowait": 2.0, + "idle": 28.2, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 5.9, - "total": 52.0, - "user": 44.1}, - {"cpu_number": 3, + "system": 3.9, + "total": 71.8, + "user": 68.0}, + {"cpu_number": 2, "guest": 0.0, "guest_nice": 0.0, - "idle": 61.8, - "iowait": 2.0, + "idle": 82.4, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 2.9, + "softirq": 0.0, "steal": 0.0, - "system": 6.9, - "total": 38.2, - "user": 26.5}], - "swap": 26.5} + "system": 2.9, + "total": 17.6, + "user": 14.7}, + {"cpu_number": 3, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 80.4, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 4.9, + "total": 19.6, + "user": 14.7}], + "swap": 67.5} Get a specific field:: # curl http://localhost:61208/api/3/quicklook/cpu - {"cpu": 48.0} + {"cpu": 38.2} GET sensors ----------- @@ -1257,7 +1201,7 @@ GET uptime Get plugin stats:: # curl http://localhost:61208/api/3/uptime - "9 days, 3:34:59" + "32 days, 23:30:09" GET all stats ------------- @@ -1273,33 +1217,33 @@ GET stats history History of a plugin:: # curl http://localhost:61208/api/3/cpu/history - {"system": [["2022-12-21T13:50:25.001548", 8.0], - ["2022-12-21T13:50:26.107518", 8.0], - ["2022-12-21T13:50:27.259558", 8.0]], - "user": [["2022-12-21T13:50:25.001537", 41.8], - ["2022-12-21T13:50:26.107513", 41.8], - ["2022-12-21T13:50:27.259553", 44.0]]} + {"system": [["2023-01-14T09:45:45.821873", 6.7], + ["2023-01-14T09:45:46.919905", 6.7], + ["2023-01-14T09:45:48.110702", 4.8]], + "user": [["2023-01-14T09:45:45.821864", 34.7], + ["2023-01-14T09:45:46.919895", 34.7], + ["2023-01-14T09:45:48.110694", 12.4]]} Limit history to last 2 values:: # curl http://localhost:61208/api/3/cpu/history/2 - {"system": [["2022-12-21T13:50:26.107518", 8.0], - ["2022-12-21T13:50:27.259558", 8.0]], - "user": [["2022-12-21T13:50:26.107513", 41.8], - ["2022-12-21T13:50:27.259553", 44.0]]} + {"system": [["2023-01-14T09:45:46.919905", 6.7], + ["2023-01-14T09:45:48.110702", 4.8]], + "user": [["2023-01-14T09:45:46.919895", 34.7], + ["2023-01-14T09:45:48.110694", 12.4]]} History for a specific field:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2022-12-21T13:50:25.001548", 8.0], - ["2022-12-21T13:50:26.107518", 8.0], - ["2022-12-21T13:50:27.259558", 8.0]]} + {"system": [["2023-01-14T09:45:45.821873", 6.7], + ["2023-01-14T09:45:46.919905", 6.7], + ["2023-01-14T09:45:48.110702", 4.8]]} Limit history for a specific field to last 2 values:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2022-12-21T13:50:26.107518", 8.0], - ["2022-12-21T13:50:27.259558", 8.0]]} + {"system": [["2023-01-14T09:45:46.919905", 6.7], + ["2023-01-14T09:45:48.110702", 4.8]]} GET limits (used for thresholds) -------------------------------- diff --git a/docs/man/glances.1 b/docs/man/glances.1 index d433d615..4a07513f 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -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" "Dec 21, 2022" "3.3.1_beta1" "Glances" +.TH "GLANCES" "1" "Jan 14, 2023" "3.3.1" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS @@ -258,7 +258,7 @@ set the server cache time [default: 1 sec] .UNINDENT .INDENT 0.0 .TP -.B open\-web\-browser +.B \-\-open\-web\-browser try to open the Web UI in the default Web browser .UNINDENT .INDENT 0.0 @@ -732,60 +732,60 @@ format): .nf .ft C { - "version": 1, - "disable_existing_loggers": "False", - "root": { - "level": "INFO", - "handlers": ["file", "console"] + \(dqversion\(dq: 1, + \(dqdisable_existing_loggers\(dq: \(dqFalse\(dq, + \(dqroot\(dq: { + \(dqlevel\(dq: \(dqINFO\(dq, + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq] }, - "formatters": { - "standard": { - "format": "%(asctime)s \-\- %(levelname)s \-\- %(message)s" + \(dqformatters\(dq: { + \(dqstandard\(dq: { + \(dqformat\(dq: \(dq%(asctime)s \-\- %(levelname)s \-\- %(message)s\(dq }, - "short": { - "format": "%(levelname)s: %(message)s" + \(dqshort\(dq: { + \(dqformat\(dq: \(dq%(levelname)s: %(message)s\(dq }, - "free": { - "format": "%(message)s" + \(dqfree\(dq: { + \(dqformat\(dq: \(dq%(message)s\(dq } }, - "handlers": { - "file": { - "level": "DEBUG", - "class": "logging.handlers.RotatingFileHandler", - "formatter": "standard", - "filename": "/var/tmp/glances.log" + \(dqhandlers\(dq: { + \(dqfile\(dq: { + \(dqlevel\(dq: \(dqDEBUG\(dq, + \(dqclass\(dq: \(dqlogging.handlers.RotatingFileHandler\(dq, + \(dqformatter\(dq: \(dqstandard\(dq, + \(dqfilename\(dq: \(dq/var/tmp/glances.log\(dq }, - "console": { - "level": "CRITICAL", - "class": "logging.StreamHandler", - "formatter": "free" + \(dqconsole\(dq: { + \(dqlevel\(dq: \(dqCRITICAL\(dq, + \(dqclass\(dq: \(dqlogging.StreamHandler\(dq, + \(dqformatter\(dq: \(dqfree\(dq } }, - "loggers": { - "debug": { - "handlers": ["file", "console"], - "level": "DEBUG" + \(dqloggers\(dq: { + \(dqdebug\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq], + \(dqlevel\(dq: \(dqDEBUG\(dq }, - "verbose": { - "handlers": ["file", "console"], - "level": "INFO" + \(dqverbose\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq], + \(dqlevel\(dq: \(dqINFO\(dq }, - "standard": { - "handlers": ["file"], - "level": "INFO" + \(dqstandard\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq], + \(dqlevel\(dq: \(dqINFO\(dq }, - "requests": { - "handlers": ["file", "console"], - "level": "ERROR" + \(dqrequests\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq], + \(dqlevel\(dq: \(dqERROR\(dq }, - "elasticsearch": { - "handlers": ["file", "console"], - "level": "ERROR" + \(dqelasticsearch\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq], + \(dqlevel\(dq: \(dqERROR\(dq }, - "elasticsearch.trace": { - "handlers": ["file", "console"], - "level": "ERROR" + \(dqelasticsearch.trace\(dq: { + \(dqhandlers\(dq: [\(dqfile\(dq, \(dqconsole\(dq], + \(dqlevel\(dq: \(dqERROR\(dq } } } @@ -885,6 +885,6 @@ $ glances –browser .sp Nicolas Hennion aka Nicolargo <\fI\%contact@nicolargo.com\fP> .SH COPYRIGHT -2022, Nicolas Hennion +2023, Nicolas Hennion .\" Generated by docutils manpage writer. . diff --git a/glances/__init__.py b/glances/__init__.py index 4db6663f..038787d8 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -19,7 +19,7 @@ import sys # Global name # Version should start and end with a numerical char # See https://packaging.python.org/specifications/core-metadata/#version -__version__ = '3.3.1_beta1' +__version__ = '3.3.1' __author__ = 'Nicolas Hennion ' __license__ = 'LGPLv3' diff --git a/glances/outputs/static/package-lock.json b/glances/outputs/static/package-lock.json index 060bb12e..6359af4b 100644 --- a/glances/outputs/static/package-lock.json +++ b/glances/outputs/static/package-lock.json @@ -4527,9 +4527,9 @@ "peer": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -11822,9 +11822,9 @@ "peer": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsprim": { diff --git a/glances/plugins/glances_network.py b/glances/plugins/glances_network.py index 98061924..62715bd2 100644 --- a/glances/plugins/glances_network.py +++ b/glances/plugins/glances_network.py @@ -29,50 +29,26 @@ import psutil # 'key': 'interface_name'} # Fields description fields_description = { - 'interface_name': { - 'description': 'Interface name.', - 'unit': 'string' - }, - 'alias': { - 'description': 'Interface alias name (optional).', - 'unit': 'string' - }, - 'rx': { - 'description': 'The received/input rate (in bit per second).', - 'unit': 'bps' - }, - 'tx': { - 'description': 'The sent/output rate (in bit per second).', - 'unit': 'bps' - }, - 'cx': { - 'description': 'The cumulative received+sent rate (in bit per second).', - 'unit': 'bps' - }, + 'interface_name': {'description': 'Interface name.', 'unit': 'string'}, + 'alias': {'description': 'Interface alias name (optional).', 'unit': 'string'}, + 'rx': {'description': 'The received/input rate (in bit per second).', 'unit': 'bps'}, + 'tx': {'description': 'The sent/output rate (in bit per second).', 'unit': 'bps'}, + 'cx': {'description': 'The cumulative received+sent rate (in bit per second).', 'unit': 'bps'}, 'cumulative_rx': { 'description': 'The number of bytes received through the interface (cumulative).', 'unit': 'bytes', }, - 'cumulative_tx': { - 'description': 'The number of bytes sent through the interface (cumulative).', - 'unit': 'bytes' - }, + 'cumulative_tx': {'description': 'The number of bytes sent through the interface (cumulative).', 'unit': 'bytes'}, 'cumulative_cx': { 'description': 'The cumulative number of bytes reveived and sent through the interface (cumulative).', - 'unit': 'bytes' + 'unit': 'bytes', }, 'speed': { 'description': 'Maximum interface speed (in bit per second). Can return 0 on some operating-system.', 'unit': 'bps', }, - 'is_up': { - 'description': 'Is the interface up ?', - 'unit': 'bool' - }, - 'time_since_update': { - 'description': 'Number of seconds since last update.', - 'unit': 'seconds' - }, + 'is_up': {'description': 'Is the interface up ?', 'unit': 'bool'}, + 'time_since_update': {'description': 'Number of seconds since last update.', 'unit': 'seconds'}, } # SNMP OID diff --git a/glances/processes.py b/glances/processes.py index 0d41c5be..09f52aa4 100644 --- a/glances/processes.py +++ b/glances/processes.py @@ -288,17 +288,19 @@ class GlancesProcesses(object): # Build the processes stats list (it is why we need psutil>=5.3.0) # This is one of the main bottleneck of Glances (see flame graph) # Filter processes - self.processlist = list(filter(lambda p: not (BSD and p.info['name'] == 'idle') and - not (WINDOWS and p.info['name'] == 'System Idle Process') and - not (MACOS and p.info['name'] == 'kernel_task') and - not (self.no_kernel_threads and LINUX and p.info['gids'].real == 0), - psutil.process_iter(attrs=sorted_attrs, ad_value=None))) + self.processlist = list( + filter( + lambda p: not (BSD and p.info['name'] == 'idle') + and not (WINDOWS and p.info['name'] == 'System Idle Process') + and not (MACOS and p.info['name'] == 'kernel_task') + and not (self.no_kernel_threads and LINUX and p.info['gids'].real == 0), + psutil.process_iter(attrs=sorted_attrs, ad_value=None), + ) + ) # Only get the info key self.processlist = [p.info for p in self.processlist] # Sort the processes list by the current sort_key - self.processlist = sort_stats(self.processlist, - sorted_by=self.sort_key, - reverse=True) + self.processlist = sort_stats(self.processlist, sorted_by=self.sort_key, reverse=True) # Update the processcount self.update_processcount(self.processlist) @@ -409,8 +411,7 @@ class GlancesProcesses(object): self.processlist_cache[proc['pid']] = {cached: proc[cached] for cached in cached_attrs} # Apply user filter - self.processlist = list(filter(lambda p: not self._filter.is_filtered(p), - self.processlist)) + self.processlist = list(filter(lambda p: not self._filter.is_filtered(p), self.processlist)) # Compute the maximum value for keys in self._max_values_list: CPU, MEM # Useful to highlight the processes with maximum values From 44da004bddbcfb5124b01abc9fc85aa73f2141e2 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 14 Jan 2023 10:03:58 +0100 Subject: [PATCH 15/35] On the road of Glances 3.4.0 --- NEWS.rst | 6 ++++++ glances/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/NEWS.rst b/NEWS.rst index 314bbdf6..ace8748b 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -2,6 +2,12 @@ Glances changelog ============================================================================== +=============== +Version 3.4.0 +=============== + + See roadmap here: https://github.com/nicolargo/glances/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Glances+3.4.0%22 + =============== Version 3.3.1 =============== diff --git a/glances/__init__.py b/glances/__init__.py index 038787d8..e1b92a35 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -19,7 +19,7 @@ import sys # Global name # Version should start and end with a numerical char # See https://packaging.python.org/specifications/core-metadata/#version -__version__ = '3.3.1' +__version__ = '3.4.0_beta1' __author__ = 'Nicolas Hennion ' __license__ = 'LGPLv3' From f21750ca489bf64e618aa4337c19813a955f3f82 Mon Sep 17 00:00:00 2001 From: Rui Chen Date: Sat, 14 Jan 2023 15:02:19 -0500 Subject: [PATCH 16/35] setup: include ujson as required dependency also update psutil version constraint Signed-off-by: Rui Chen --- setup.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9344d0b0..a818ade1 100755 --- a/setup.py +++ b/setup.py @@ -41,7 +41,16 @@ def get_data_files(): def get_install_requires(): - requires = ['psutil>=5.3.0', 'defusedxml', 'future', 'packaging'] + requires = [ + 'psutil>=5.6.7', + 'defusedxml', + 'packaging', + 'future; python_version < "3.0"', + 'ujson<3; python_version < "3.0"', + 'ujson<4; python_version >= "3.5" and python_version < "3.6"', + 'ujson<5; python_version >= "3.6" and python_version < "3.7"', + 'ujson>=5.4.0; python_version >= "3.7"', + ] if sys.platform.startswith('win'): requires.append('bottle') requires.append('requests') From b0631690228be80ffb09957d824760528475eb22 Mon Sep 17 00:00:00 2001 From: mfridge <15315366+mfridge@users.noreply.github.com> Date: Mon, 16 Jan 2023 16:13:32 +0100 Subject: [PATCH 17/35] Remove surrounding quotes for quoted command arguments --- glances/secure.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/glances/secure.py b/glances/secure.py index 1bb93a16..b03aa276 100644 --- a/glances/secure.py +++ b/glances/secure.py @@ -49,8 +49,9 @@ def __secure_popen(cmd): p_last = None # Split by pipe '|' for sub_cmd in cmd.split('|'): - # Split by space character, but do no split spaces within quotes - sub_cmd_split = [_ for _ in list(filter(None, re.split(r'(\s+)|(".*?"+?)|(\'.*?\'+?)', sub_cmd))) if _ != ' '] + # Split by space character, but do no split spaces within quotes (remove surrounding quotes, though) + tmp_split = [_ for _ in list(filter(None, re.split(r'(\s+)|(".*?"+?)|(\'.*?\'+?)', sub_cmd))) if _ != ' '] + sub_cmd_split = [_[1:-1] if (_[0]==_[-1]=='"') or (_[0]==_[-1]=='\'') else _ for _ in tmp_split] p = Popen(sub_cmd_split, shell=False, stdin=sub_cmd_stdin, stdout=PIPE, stderr=PIPE) if p_last is not None: # Allow p_last to receive a SIGPIPE if p exits. From 66cd8a70d6c5aadc0d772cdb2237e846f329927b Mon Sep 17 00:00:00 2001 From: nicolargo Date: Tue, 17 Jan 2023 08:12:51 +0100 Subject: [PATCH 18/35] Merge from master --- NEWS.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index ace8748b..a3ca28f4 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -8,6 +8,17 @@ Version 3.4.0 See roadmap here: https://github.com/nicolargo/glances/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Glances+3.4.0%22 +=============== +Version 3.3.1.1 +=============== + +Hard patch on the master branch. + +Bug corrected: + + * "ModuleNotFoundError: No module named 'ujson'" #2246 + * Remove surrounding quotes for quoted command arguments #2247 (related to #2239) + =============== Version 3.3.1 =============== From 8ceac23aadf08c6ea2421ab2c0163b3e4f227a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ali=20Erdin=C3=A7=20K=C3=B6ro=C4=9Flu?= Date: Tue, 17 Jan 2023 09:50:43 +0200 Subject: [PATCH 19/35] Update __main__.py non-executable-script fix --- glances/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/glances/__main__.py b/glances/__main__.py index 06d73c72..0da0b639 100644 --- a/glances/__main__.py +++ b/glances/__main__.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # # Glances - An eye on your system From 4ffc13cbc7df8aa0db9b3a497db8cecf864ac0c3 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 21 Jan 2023 10:18:59 +0100 Subject: [PATCH 20/35] Improve documentation about the [ip] plugin #2251 --- docs/aoa/header.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/aoa/header.rst b/docs/aoa/header.rst index 162c2598..c38a8884 100644 --- a/docs/aoa/header.rst +++ b/docs/aoa/header.rst @@ -22,7 +22,9 @@ file under the ``[ip]`` section: **NOTE:** Setting low values for `public_refresh_interval` will result in frequent -HTTP requests to the IP detection servers. Recommended range: 120-600 seconds +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. If the Censys options are configured, the public IP address is also analysed (with the same interval) and additional information is displayed. From 67bf0c1964cc5900aed61f8af618d4b907c264fb Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 21 Jan 2023 11:37:22 +0100 Subject: [PATCH 21/35] Update README --- README.rst | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index b2d2db84..53a573d0 100644 --- a/README.rst +++ b/README.rst @@ -40,16 +40,22 @@ Glances - An eye on your system Summary ======= -**Glances** is a cross-platform monitoring tool which aims to present a -large amount of monitoring information through a curses or Web -based interface. The information dynamically adapts depending on the -size of the user interface. +**Glances** is an open-source system cross-platform monitoring tool. +It allows real-time monitoring of various aspects of your system such as +CPU, memory, disk, network usage etc. It also allows monitoring of running processes, +logged in users, temperatures, voltages, fan speeds etc. +It also supports container monitoring, it supports different container management +systems such as Docker, LXC. The information is presented in an easy to read dashboard +and can also be used for remote monitoring of systems via a web interface or command +line interface. It is easy to install and use and can be customized to show only +the information that you are interested in. .. image:: https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/glances-summary.png -It can also work in client/server mode. Remote monitoring could be done -via terminal, Web interface or API (XML-RPC and RESTful). Stats can also -be exported to files or external time/value databases. +In client/server mode, remote monitoring could be done via terminal, +Web interface or API (XML-RPC and RESTful). +Stats can also be exported to files or external time/value databases, CSV or direct +output to STDOUT. .. image:: https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/glances-responsive-webdesign.png From b67c717b3af357f72bef8f4847dca4af84576389 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 22 Jan 2023 11:14:59 +0100 Subject: [PATCH 22/35] Improve documentation regarding regexp in configuration file --- docs/aoa/diskio.rst | 6 + docs/aoa/docker.rst | 5 + docs/aoa/fs.rst | 6 + docs/aoa/network.rst | 6 + docs/api.rst | 999 ++++++++++++++++++++++--------------------- docs/man/glances.1 | 2 +- 6 files changed, 526 insertions(+), 498 deletions(-) diff --git a/docs/aoa/diskio.rst b/docs/aoa/diskio.rst index 9a1e87d7..85125481 100644 --- a/docs/aoa/diskio.rst +++ b/docs/aoa/diskio.rst @@ -37,3 +37,9 @@ or another example: [diskio] show=sda.* + +Filtering is based on regular expression. Please be sure that your regular +expression works as expected. You can use an online tool like `regex101`_ in +order to test your regular expression. + +.. _regex101: https://regex101.com/ \ No newline at end of file diff --git a/docs/aoa/docker.rst b/docs/aoa/docker.rst index cc8c485b..568978d1 100644 --- a/docs/aoa/docker.rst +++ b/docs/aoa/docker.rst @@ -47,4 +47,9 @@ under the ``[docker]`` section: You can use all the variables ({{foo}}) available in the Docker plugin. +Filtering (for hide or show) is based on regular expression. Please be sure that your regular +expression works as expected. You can use an online tool like `regex101`_ in +order to test your regular expression. + +.. _regex101: https://regex101.com/ .. _docker-py: https://github.com/docker/docker-py diff --git a/docs/aoa/fs.rst b/docs/aoa/fs.rst index 8123bf1d..4d5dc100 100644 --- a/docs/aoa/fs.rst +++ b/docs/aoa/fs.rst @@ -53,3 +53,9 @@ Example to only show /dev/sdb mount points: [fs] show=/dev/sdb.* + +Filtering is based on regular expression. Please be sure that your regular +expression works as expected. You can use an online tool like `regex101`_ in +order to test your regular expression. + +.. _regex101: https://regex101.com/ \ No newline at end of file diff --git a/docs/aoa/network.rst b/docs/aoa/network.rst index 27ad1581..a1f116ac 100644 --- a/docs/aoa/network.rst +++ b/docs/aoa/network.rst @@ -53,3 +53,9 @@ virtual docker interface (docker0, docker1, ...): wlan0_tx_warning=900000 wlan0_tx_critical=1000000 wlan0_tx_log=True + +Filtering is based on regular expression. Please be sure that your regular +expression works as expected. You can use an online tool like `regex101`_ in +order to test your regular expression. + +.. _regex101: https://regex101.com/ \ No newline at end of file diff --git a/docs/api.rst b/docs/api.rst index d60c548f..443af5f8 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -60,6 +60,25 @@ Get the plugins list:: "uptime", "wifi"] +GET alert +--------- + +Get plugin stats:: + + # curl http://localhost:61208/api/3/alert + [[1674381772.0, + -1, + "WARNING", + "CPU_TOTAL", + 78.1, + 78.1, + 78.1, + 78.1, + 1, + [], + "", + "cpu_percent"]] + GET amps -------- @@ -74,7 +93,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8425271511077881}, + "timer": 1.1751177310943604}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -83,7 +102,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8423657417297363}] + "timer": 1.1748502254486084}] Get a specific field:: @@ -101,7 +120,7 @@ Get a specific item when field matchs the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.8425271511077881}]} + "timer": 1.1751177310943604}]} GET core -------- @@ -131,19 +150,19 @@ Get plugin stats:: "ctx_switches": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 58.6, + "idle": 14.7, "interrupts": 0, - "iowait": 0.0, + "iowait": 7.4, "irq": 0.0, "nice": 0.0, "soft_interrupts": 0, - "softirq": 0.0, + "softirq": 0.9, "steal": 0.0, "syscalls": 0, - "system": 6.7, + "system": 19.4, "time_since_update": 1, - "total": 38.2, - "user": 34.7} + "total": 78.1, + "user": 57.6} Fields descriptions: @@ -166,7 +185,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/cpu/total - {"total": 38.2} + {"total": 78.1} GET diskio ---------- @@ -215,7 +234,7 @@ Get plugin stats:: "Id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "Image": ["portainer/portainer-ce:2.9.3"], "Status": "running", - "Uptime": "36 mins", + "Uptime": "23 hours", "cpu": {"total": 0.0}, "cpu_percent": 0.0, "io": {}, @@ -230,18 +249,18 @@ Get plugin stats:: "network_tx": None}], "version": {"ApiVersion": "1.41", "Arch": "amd64", - "BuildTime": "2022-12-15T22:25:58.000000000+00:00", + "BuildTime": "2023-01-19T17:34:14.000000000+00:00", "Components": [{"Details": {"ApiVersion": "1.41", "Arch": "amd64", - "BuildTime": "2022-12-15T22:25:58.000000000+00:00", + "BuildTime": "2023-01-19T17:34:14.000000000+00:00", "Experimental": "false", - "GitCommit": "42c8b31", - "GoVersion": "go1.18.9", - "KernelVersion": "5.15.0-56-generic", + "GitCommit": "6051f14", + "GoVersion": "go1.18.10", + "KernelVersion": "5.15.0-58-generic", "MinAPIVersion": "1.12", "Os": "linux"}, "Name": "Engine", - "Version": "20.10.22"}, + "Version": "20.10.23"}, {"Details": {"GitCommit": "5b842e528e99d4d4c1686467debf2bd4b88ecd86"}, "Name": "containerd", "Version": "1.6.15"}, @@ -251,13 +270,13 @@ Get plugin stats:: {"Details": {"GitCommit": "de40ad0"}, "Name": "docker-init", "Version": "0.19.0"}], - "GitCommit": "42c8b31", - "GoVersion": "go1.18.9", - "KernelVersion": "5.15.0-56-generic", + "GitCommit": "6051f14", + "GoVersion": "go1.18.10", + "KernelVersion": "5.15.0-58-generic", "MinAPIVersion": "1.12", "Os": "linux", "Platform": {"Name": "Docker Engine - Community"}, - "Version": "20.10.22"}} + "Version": "20.10.23"}} GET fs ------ @@ -266,13 +285,13 @@ Get plugin stats:: # curl http://localhost:61208/api/3/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 50442330112, + "free": 63000883200, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 78.2, + "percent": 72.7, "size": 243334156288, - "used": 180504371200}, + "used": 167945818112}, {"device_name": "zsfpool", "free": 41811968, "fs_type": "zfs", @@ -291,13 +310,13 @@ Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/fs/mnt_point// {"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 50442330112, + "free": 63000883200, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 78.2, + "percent": 72.7, "size": 243334156288, - "used": 180504371200}]} + "used": 167945818112}]} GET ip ------ @@ -305,17 +324,17 @@ GET ip Get plugin stats:: # curl http://localhost:61208/api/3/ip - {"address": "192.168.1.14", - "gateway": "192.168.1.1", + {"address": "192.168.0.32", + "gateway": "192.168.0.254", "mask": "255.255.255.0", "mask_cidr": 24, - "public_address": "109.210.93.150", + "public_address": "91.166.228.228", "public_info_human": ""} Get a specific field:: # curl http://localhost:61208/api/3/ip/gateway - {"gateway": "192.168.1.1"} + {"gateway": "192.168.0.254"} GET load -------- @@ -323,7 +342,10 @@ GET load Get plugin stats:: # curl http://localhost:61208/api/3/load - {"cpucore": 4, "min1": 1.31591796875, "min15": 1.9091796875, "min5": 1.6796875} + {"cpucore": 4, + "min1": 2.79248046875, + "min15": 0.6044921875, + "min5": 1.24951171875} Fields descriptions: @@ -335,7 +357,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/load/min1 - {"min1": 1.31591796875} + {"min1": 2.79248046875} GET mem ------- @@ -343,16 +365,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/3/mem - {"active": 2804523008, - "available": 2706178048, - "buffers": 264335360, - "cached": 3114909696, - "free": 2706178048, - "inactive": 3516907520, - "percent": 65.5, - "shared": 591532032, - "total": 7836188672, - "used": 5130010624} + {"active": 3232829440, + "available": 2574643200, + "buffers": 482086912, + "cached": 2828992512, + "free": 2574643200, + "inactive": 3375968256, + "percent": 67.1, + "shared": 610131968, + "total": 7836196864, + "used": 5261553664} Fields descriptions: @@ -371,7 +393,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/mem/total - {"total": 7836188672} + {"total": 7836196864} GET memswap ----------- @@ -379,13 +401,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/3/memswap - {"free": 2626473984, - "percent": 67.5, - "sin": 4755005440, - "sout": 11063549952, + {"free": 6393114624, + "percent": 20.9, + "sin": 1016889344, + "sout": 2570014720, "time_since_update": 1, "total": 8082419712, - "used": 5455945728} + "used": 1689305088} Fields descriptions: @@ -409,29 +431,29 @@ Get plugin stats:: # curl http://localhost:61208/api/3/network [{"alias": None, - "cumulative_cx": 398215554, - "cumulative_rx": 199107777, - "cumulative_tx": 199107777, - "cx": 3314, + "cumulative_cx": 104446528, + "cumulative_rx": 52223264, + "cumulative_tx": 52223264, + "cx": 2384, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 1657, + "rx": 1192, "speed": 0, "time_since_update": 1, - "tx": 1657}, + "tx": 1192}, {"alias": None, - "cumulative_cx": 39497892918, - "cumulative_rx": 38949809930, - "cumulative_tx": 548082988, - "cx": 27720, + "cumulative_cx": 12191054510, + "cumulative_rx": 11933885504, + "cumulative_tx": 257169006, + "cx": 29422, "interface_name": "wlp2s0", "is_up": True, "key": "interface_name", - "rx": 21708, + "rx": 22777, "speed": 0, "time_since_update": 1, - "tx": 6012}] + "tx": 6645}] Fields descriptions: @@ -452,29 +474,29 @@ Get a specific field:: # curl http://localhost:61208/api/3/network/interface_name {"interface_name": ["lo", "wlp2s0", - "docker0", - "br-119e6ee04e05", - "br-87386b77b676", "br_grafana", + "br-119e6ee04e05", + "docker0", + "br-87386b77b676", "mpqemubr0", - "tap-1e376645a40", - "veth57bdacb"]} + "vethf503072", + "tap-1e376645a40"]} Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/network/interface_name/lo {"lo": [{"alias": None, - "cumulative_cx": 398215554, - "cumulative_rx": 199107777, - "cumulative_tx": 199107777, - "cx": 3314, + "cumulative_cx": 104446528, + "cumulative_rx": 52223264, + "cumulative_tx": 52223264, + "cx": 2384, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 1657, + "rx": 1192, "speed": 0, "time_since_update": 1, - "tx": 1657}]} + "tx": 1192}]} GET now ------- @@ -482,7 +504,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/3/now - "2023-01-14 09:45:44 CET" + "2023-01-22 11:02:51 CET" GET percpu ---------- @@ -493,29 +515,29 @@ Get plugin stats:: [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 56.1, - "iowait": 0.0, + "idle": 20.3, + "iowait": 12.3, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.7, - "total": 43.9, - "user": 39.3}, + "system": 24.6, + "total": 79.7, + "user": 42.8}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 28.2, - "iowait": 0.0, + "idle": 16.4, + "iowait": 6.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 3.9, - "total": 71.8, - "user": 68.0}] + "system": 12.7, + "total": 83.6, + "user": 64.9}] Get a specific field:: @@ -529,30 +551,30 @@ Get plugin stats:: # curl http://localhost:61208/api/3/ports [{"description": "DefaultGateway", - "host": "192.168.1.1", + "host": "192.168.0.254", "indice": "port_0", "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.007094, + "status": 0.01009, "timeout": 3}] Get a specific field:: # curl http://localhost:61208/api/3/ports/host - {"host": ["192.168.1.1"]} + {"host": ["192.168.0.254"]} Get a specific item when field matchs the given value:: - # curl http://localhost:61208/api/3/ports/host/192.168.1.1 - {"192.168.1.1": [{"description": "DefaultGateway", - "host": "192.168.1.1", - "indice": "port_0", - "port": 0, - "refresh": 30, - "rtt_warning": None, - "status": 0.007094, - "timeout": 3}]} + # curl http://localhost:61208/api/3/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.01009, + "timeout": 3}]} GET processcount ---------------- @@ -560,12 +582,12 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/3/processcount - {"pid_max": 0, "running": 2, "sleeping": 334, "thread": 1765, "total": 403} + {"pid_max": 0, "running": 2, "sleeping": 311, "thread": 1523, "total": 386} Get a specific field:: # curl http://localhost:61208/api/3/processcount/total - {"total": 403} + {"total": 386} GET processlist --------------- @@ -573,51 +595,51 @@ GET processlist Get plugin stats:: # curl http://localhost:61208/api/3/processlist - [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox"], + [{"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox"], "cpu_percent": 0.0, - "cpu_times": [8504.75, 2803.93, 8401.36, 1489.57, 0.0], + "cpu_times": [2122.86, 658.23, 1239.16, 210.94, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [6360911872, 11858505728, 0, 0, 0], + "io_counters": [1674662912, 3749654528, 0, 0, 0], "key": "pid", - "memory_info": [484036608, 22242152448, 100323328, 659456, 0, 1409527808, 0], - "memory_percent": 6.176939176178121, + "memory_info": [584667136, 21991870464, 132120576, 647168, 0, 1149304832, 0], + "memory_percent": 7.461108317556428, "name": "firefox", "nice": 0, - "num_threads": 187, - "pid": 4674, + "num_threads": 146, + "pid": 5040, "status": "S", "time_since_update": 1, "username": "nicolargo"}, - {"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox", + {"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox", "-contentproc", "-childID", "1", "-isForBrowser", "-prefsLen", - "31799", + "32129", "-prefMapSize", - "234979", + "236410", "-jsInitLen", - "246704", + "246772", "-parentBuildID", - "20221128185858", + "20230104235612", "-appDir", - "/snap/firefox/2154/usr/lib/firefox/browser", - "{8ed7e0e9-5dcf-4c35-9523-65d5178968f5}", - "4674", + "/snap/firefox/2263/usr/lib/firefox/browser", + "{152fde2c-5751-4719-9edb-ff980730fbac}", + "5040", "true", "tab"], "cpu_percent": 0.0, - "cpu_times": [1878.88, 294.96, 0.0, 0.0, 0.0], + "cpu_times": [467.87, 83.56, 0.0, 0.0, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [446676992, 0, 0, 0, 0], + "io_counters": [213443584, 0, 0, 0, 0], "key": "pid", - "memory_info": [379330560, 3766951936, 44253184, 659456, 0, 1161146368, 0], - "memory_percent": 4.840753277871052, + "memory_info": [397238272, 3228049408, 70422528, 647168, 0, 639614976, 0], + "memory_percent": 5.069273767545818, "name": "WebExtensions", "nice": 0, "num_threads": 20, - "pid": 4980, + "pid": 5246, "status": "S", "time_since_update": 1, "username": "nicolargo"}] @@ -625,240 +647,217 @@ Get plugin stats:: Get a specific field:: # curl http://localhost:61208/api/3/processlist/pid - {"pid": [4674, - 4980, - 5110, - 527830, - 173709, - 3699, - 5464, - 431554, - 495017, - 5113, - 173765, - 174093, - 87518, - 10140, - 93773, - 5000, - 173645, - 534445, - 511174, - 173751, - 534543, - 9953, - 534732, - 535113, - 284680, - 128927, - 173679, - 535159, - 4050, - 3586, - 4426, - 173949, - 493657, - 511164, - 2510, - 3351, - 173688, - 173781, - 496818, - 496817, - 408152, - 493678, - 4206, - 511549, - 427, - 173973, - 3820, - 5730, - 17316, - 174051, - 1616, - 3512, - 493683, + {"pid": [5040, + 5246, + 5369, + 5752, + 10873, + 5365, + 10653, + 90446, + 4150, + 10724, + 109138, + 4519, + 422, + 109284, + 95798, + 22179, + 11307, + 36722, + 110258, + 5261, + 62850, + 10547, + 110317, + 10709, + 109762, + 110036, + 109882, + 10612, + 6074, + 96478, + 42687, + 4035, + 110285, + 2512, + 11033, + 1672, + 4473, + 5179, + 6020, + 10732, + 6022, + 4585, + 4544, + 10632, + 23231, + 23230, + 11251, + 4248, + 4413, + 11252, + 3955, + 4223, + 2721, + 4932, + 1816, + 90918, + 1635, + 14455, + 10848, + 43005, + 90973, + 4332, + 4263, + 4625, + 2239, + 1806, + 4325, + 14458, 1, - 5690, - 3903, - 4008, - 165775, - 3792, - 174314, - 493699, - 94498, - 2702, - 1662, - 1641, - 87895, - 87994, - 4158, - 87995, - 174313, - 4433, - 87753, - 3897, - 5691, - 4458, - 87853, - 94497, - 4903, - 3902, - 17315, - 3829, - 173649, - 87454, - 3273, - 1838, - 3676, - 3783, - 3695, - 10499, - 87474, - 3907, - 2209, - 3730, - 3486, - 3915, - 3901, - 3910, - 10649, - 533610, - 10551, - 511526, - 10082, - 87412, - 1615, - 173650, - 4005, - 3904, - 10318, - 165937, - 1663, - 1777, - 2417, - 2626, - 10319, - 3805, - 10094, - 3956, - 1837, - 17467, - 1636, - 2688, - 4049, - 4089, - 3521, - 87413, - 87779, - 3861, - 1416, - 102131, - 10032, - 1782, - 1598, - 115869, - 17484, - 3970, - 1659, - 3524, - 465, - 2159, - 3898, - 3527, - 3802, - 5024, - 3743, - 1626, - 10033, - 3908, - 4036, - 3697, - 4170, - 10048, - 1642, - 3906, - 1654, - 3717, - 173849, - 3591, - 3896, - 3726, - 3909, - 3722, - 3900, - 3781, - 3994, - 10381, - 3748, - 87429, - 3584, - 3905, - 1868, - 1612, - 3891, - 112675, - 1607, + 96102, + 4331, + 4182, + 102364, + 2701, + 91003, + 1681, + 4214, + 1876, + 1655, + 2640, + 2455, + 10557, + 1885, + 4561, 1660, - 3533, - 3510, - 98474, - 10372, - 3508, - 1648, - 1652, - 3706, - 3664, - 1629, - 1999, - 1614, - 1415, - 535105, - 1419, + 4445, + 1442, + 4130, + 4261, + 4339, + 4352, + 3944, + 1682, + 3934, + 4485, + 10558, + 4659, + 4328, + 4330, + 4137, + 4327, + 4334, + 4233, + 1777, + 3351, + 1873, + 59511, + 2179, + 1617, + 4050, + 17205, + 4192, + 4348, + 4166, + 4392, + 3700, + 1634, + 3966, + 17189, + 4573, + 4155, + 3968, + 3971, + 1675, + 4347, + 4329, + 1661, + 4377, + 6095, + 4229, 1666, - 4187, - 2680, - 173665, - 1432, - 17364, - 2681, - 1430, - 2428, + 5299, + 2683, + 4314, + 1673, + 1643, + 1676, + 46760, + 10911, + 4452, + 468, + 4335, + 4324, + 4524, + 2684, + 4443, + 4173, + 4337, + 4201, + 4212, + 42986, + 4178, + 1631, + 1670, + 3952, + 4045, + 3976, + 1443, + 3701, + 3953, + 1626, + 4119, + 4162, + 1646, + 2020, + 1441, + 1633, 3354, - 142951, - 1609, - 98475, - 1599, - 535158, - 5769, - 10035, - 173652, - 87415, - 3895, - 2483, - 511483, - 3572, - 511504, - 191811, - 98353, - 98484, - 511512, - 532452, - 98346, - 511490, - 4546, - 3487, - 2430, - 2492, - 2465, - 1431, - 1669, + 9703, + 49191, + 110201, + 14505, + 49179, + 10591, + 1449, + 4579, + 1685, + 1450, + 3774, + 10560, + 49194, + 2472, + 42952, + 1804, + 1803, + 42937, + 42964, + 42969, + 49182, + 3945, + 1618, + 110284, + 3707, + 4018, + 4323, + 4820, + 2480, + 104481, + 1695, + 2503, + 2475, + 2485, + 1447, + 1628, + 49185, 2, 3, 4, 5, - 7, - 9, + 6, + 8, 10, 11, 12, @@ -901,19 +900,21 @@ Get a specific field:: 100, 101, 104, - 105, - 108, + 106, + 107, + 109, 110, 112, - 113, + 117, 118, - 119, - 120, - 121, + 128, 131, - 135, - 141, - 204, + 137, + 171, + 175, + 201, + 205, + 217, 218, 219, 220, @@ -921,39 +922,33 @@ Get a specific field:: 222, 223, 224, - 225, + 248, 249, - 250, + 254, 255, - 256, - 313, - 366, - 367, + 312, + 361, + 362, + 442, 447, - 448, - 545, - 614, - 685, - 686, - 687, - 694, - 950, - 951, - 952, - 953, - 956, - 957, - 958, - 959, - 960, - 961, + 577, + 601, + 676, + 677, + 678, + 693, + 963, + 964, + 965, 966, 967, - 1021, - 1022, - 1023, - 1024, - 1025, + 968, + 969, + 970, + 971, + 972, + 973, + 974, 1026, 1027, 1028, @@ -968,88 +963,98 @@ Get a specific field:: 1037, 1038, 1039, - 1056, - 1057, - 1065, - 1066, - 1083, - 1084, - 1085, - 1086, - 1087, - 1088, - 1089, - 2491, - 2527, - 2539, - 2586, - 2587, - 2589, - 2590, - 2592, + 1040, + 1041, + 1042, + 1043, + 1044, + 1071, + 1072, + 1080, + 1081, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 2504, + 2521, + 2531, + 2597, 2598, 2599, - 2606, - 3780, - 4620, - 10063, - 87445, - 282372, - 284747, - 284755, - 284756, - 284759, - 284760, - 445439, - 445440, - 445441, - 491085, - 493353, - 493435, - 493436, - 493437, - 493438, - 493440, - 493488, - 525438, - 526723, - 527334, - 529501, - 532606, - 532692, - 532694, - 532700, - 532986, - 533409, - 533601, - 533685, - 533744, - 533796, - 533986, - 534098, - 534679]} + 2600, + 2602, + 2604, + 2609, + 2610, + 4034, + 18603, + 62912, + 62921, + 62922, + 62923, + 62924, + 62925, + 78135, + 78136, + 78138, + 90658, + 90659, + 90662, + 90663, + 90665, + 90718, + 90731, + 107066, + 107228, + 107746, + 107747, + 108008, + 108340, + 108486, + 108619, + 108834, + 108931, + 109106, + 109124, + 109329, + 110081, + 110221, + 110262, + 110263, + 110268, + 110269, + 110311, + 110375, + 110376, + 110377, + 110378, + 110379]} Get a specific item when field matchs the given value:: - # curl http://localhost:61208/api/3/processlist/pid/4674 - {"4674": [{"cmdline": ["/snap/firefox/2154/usr/lib/firefox/firefox"], + # curl http://localhost:61208/api/3/processlist/pid/5040 + {"5040": [{"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox"], "cpu_percent": 0.0, - "cpu_times": [8504.75, 2803.93, 8401.36, 1489.57, 0.0], + "cpu_times": [2122.86, 658.23, 1239.16, 210.94, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [6360911872, 11858505728, 0, 0, 0], + "io_counters": [1674662912, 3749654528, 0, 0, 0], "key": "pid", - "memory_info": [484036608, - 22242152448, - 100323328, - 659456, + "memory_info": [584667136, + 21991870464, + 132120576, + 647168, 0, - 1409527808, + 1149304832, 0], - "memory_percent": 6.176939176178121, + "memory_percent": 7.461108317556428, "name": "firefox", "nice": 0, - "num_threads": 187, - "pid": 4674, + "num_threads": 146, + "pid": 5040, "status": "S", "time_since_update": 1, "username": "nicolargo"}]} @@ -1068,69 +1073,69 @@ GET quicklook Get plugin stats:: # curl http://localhost:61208/api/3/quicklook - {"cpu": 38.2, + {"cpu": 78.1, "cpu_hz": 2025000000.0, - "cpu_hz_current": 1247640750.0, + "cpu_hz_current": 1728936749.9999998, "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", - "mem": 65.5, + "mem": 67.1, "percpu": [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 56.1, - "iowait": 0.0, + "idle": 20.3, + "iowait": 12.3, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.7, - "total": 43.9, - "user": 39.3}, + "system": 24.6, + "total": 79.7, + "user": 42.8}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 28.2, - "iowait": 0.0, + "idle": 16.4, + "iowait": 6.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 3.9, - "total": 71.8, - "user": 68.0}, + "system": 12.7, + "total": 83.6, + "user": 64.9}, {"cpu_number": 2, "guest": 0.0, "guest_nice": 0.0, - "idle": 82.4, - "iowait": 0.0, + "idle": 9.2, + "iowait": 7.7, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 0.0, + "softirq": 2.1, "steal": 0.0, - "system": 2.9, - "total": 17.6, - "user": 14.7}, + "system": 18.3, + "total": 90.8, + "user": 62.7}, {"cpu_number": 3, "guest": 0.0, "guest_nice": 0.0, - "idle": 80.4, - "iowait": 0.0, + "idle": 12.1, + "iowait": 2.9, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 0.0, + "softirq": 0.7, "steal": 0.0, - "system": 4.9, - "total": 19.6, - "user": 14.7}], - "swap": 67.5} + "system": 13.6, + "total": 87.9, + "user": 70.7}], + "swap": 20.9} Get a specific field:: # curl http://localhost:61208/api/3/quicklook/cpu - {"cpu": 38.2} + {"cpu": 78.1} GET sensors ----------- @@ -1158,12 +1163,12 @@ Get a specific field:: # curl http://localhost:61208/api/3/sensors/label {"label": ["acpitz 1", "acpitz 2", - "CPU", - "Ambient", - "SODIMM", "Package id 0", "Core 0", "Core 1", + "CPU", + "Ambient", + "SODIMM", "BAT BAT0"]} Get a specific item when field matchs the given value:: @@ -1187,7 +1192,7 @@ Get plugin stats:: "hr_name": "Ubuntu 22.04 64bit", "linux_distro": "Ubuntu 22.04", "os_name": "Linux", - "os_version": "5.15.0-56-generic", + "os_version": "5.15.0-58-generic", "platform": "64bit"} Get a specific field:: @@ -1201,7 +1206,7 @@ GET uptime Get plugin stats:: # curl http://localhost:61208/api/3/uptime - "32 days, 23:30:09" + "7 days, 17:52:03" GET all stats ------------- @@ -1217,33 +1222,33 @@ GET stats history History of a plugin:: # curl http://localhost:61208/api/3/cpu/history - {"system": [["2023-01-14T09:45:45.821873", 6.7], - ["2023-01-14T09:45:46.919905", 6.7], - ["2023-01-14T09:45:48.110702", 4.8]], - "user": [["2023-01-14T09:45:45.821864", 34.7], - ["2023-01-14T09:45:46.919895", 34.7], - ["2023-01-14T09:45:48.110694", 12.4]]} + {"system": [["2023-01-22T11:02:52.355003", 19.4], + ["2023-01-22T11:02:53.467824", 19.4], + ["2023-01-22T11:02:54.710232", 13.2]], + "user": [["2023-01-22T11:02:52.354990", 57.6], + ["2023-01-22T11:02:53.467809", 57.6], + ["2023-01-22T11:02:54.710224", 28.5]]} Limit history to last 2 values:: # curl http://localhost:61208/api/3/cpu/history/2 - {"system": [["2023-01-14T09:45:46.919905", 6.7], - ["2023-01-14T09:45:48.110702", 4.8]], - "user": [["2023-01-14T09:45:46.919895", 34.7], - ["2023-01-14T09:45:48.110694", 12.4]]} + {"system": [["2023-01-22T11:02:53.467824", 19.4], + ["2023-01-22T11:02:54.710232", 13.2]], + "user": [["2023-01-22T11:02:53.467809", 57.6], + ["2023-01-22T11:02:54.710224", 28.5]]} History for a specific field:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-01-14T09:45:45.821873", 6.7], - ["2023-01-14T09:45:46.919905", 6.7], - ["2023-01-14T09:45:48.110702", 4.8]]} + {"system": [["2023-01-22T11:02:52.355003", 19.4], + ["2023-01-22T11:02:53.467824", 19.4], + ["2023-01-22T11:02:54.710232", 13.2]]} Limit history for a specific field to last 2 values:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-01-14T09:45:46.919905", 6.7], - ["2023-01-14T09:45:48.110702", 4.8]]} + {"system": [["2023-01-22T11:02:53.467824", 19.4], + ["2023-01-22T11:02:54.710232", 13.2]]} GET limits (used for thresholds) -------------------------------- diff --git a/docs/man/glances.1 b/docs/man/glances.1 index 4a07513f..6aada202 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -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" "Jan 14, 2023" "3.3.1" "Glances" +.TH "GLANCES" "1" "Jan 22, 2023" "3.4.0_beta1" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS From 1bedd3b80eb0dff3b831a664026d4b5049c38d95 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 22 Jan 2023 12:22:16 +0100 Subject: [PATCH 23/35] It is not possible to return API data for a particular mount point (FS plugin) #1162 --- glances/outputs/glances_bottle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/glances/outputs/glances_bottle.py b/glances/outputs/glances_bottle.py index 5c475a7f..31933fac 100644 --- a/glances/outputs/glances_bottle.py +++ b/glances/outputs/glances_bottle.py @@ -160,6 +160,7 @@ class GlancesBottle(object): '/api/%s///history/' % self.API_VERSION, method="GET", callback=self._api_item_history ) self._app.route('/api/%s///' % self.API_VERSION, method="GET", callback=self._api_value) + self._app.route('/api/%s///' % self.API_VERSION, method="GET", callback=self._api_value) bindmsg = 'Glances RESTful API Server started on {}api/{}/'.format(self.bind_url, self.API_VERSION) logger.info(bindmsg) From 4ae0439f45e5210f96977ebabde8c8f3a6cb843a Mon Sep 17 00:00:00 2001 From: fr4nc0is Date: Sun, 22 Jan 2023 17:52:21 +0100 Subject: [PATCH 24/35] moved now plugin after sensors plugin --- glances/outputs/static/js/App.vue | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/glances/outputs/static/js/App.vue b/glances/outputs/static/js/App.vue index cd6dcf84..576d3813 100644 --- a/glances/outputs/static/js/App.vue +++ b/glances/outputs/static/js/App.vue @@ -123,6 +123,7 @@ v-if="!args.disable_sensors" :data="data" > +
@@ -138,13 +139,6 @@
-
-
-
- -
-
-
From 17e1787fdf5f71eea189b3453f08506cf1c19942 Mon Sep 17 00:00:00 2001 From: fr4nc0is Date: Sun, 22 Jan 2023 17:53:17 +0100 Subject: [PATCH 25/35] bump dev dependencies --- glances/outputs/static/package-lock.json | 441 +++++++++++------------ glances/outputs/static/package.json | 16 +- 2 files changed, 210 insertions(+), 247 deletions(-) diff --git a/glances/outputs/static/package-lock.json b/glances/outputs/static/package-lock.json index 6359af4b..5297c627 100644 --- a/glances/outputs/static/package-lock.json +++ b/glances/outputs/static/package-lock.json @@ -4,7 +4,6 @@ "requires": true, "packages": { "": { - "name": "static", "dependencies": { "bootstrap": "^3.4.1", "favico.js": "^0.3.10", @@ -15,20 +14,20 @@ }, "devDependencies": { "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.1", + "css-loader": "^6.7.3", "del": "^7.0.0", - "eslint": "^8.25.0", - "eslint-plugin-vue": "^9.6.0", + "eslint": "^8.32.0", + "eslint-plugin-vue": "^9.9.0", "html-webpack-plugin": "^5.5.0", "less": "^4.1.3", "less-loader": "^11.1.0", - "sass": "^1.55.0", - "sass-loader": "^13.1.0", + "sass": "^1.57.1", + "sass-loader": "^13.2.0", "style-loader": "^3.3.1", "url-loader": "^4.1.1", - "vue-loader": "^17.0.0", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", + "vue-loader": "^17.0.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1" } }, @@ -168,15 +167,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -234,14 +233,14 @@ "peer": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -866,34 +865,42 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -2047,19 +2054,19 @@ } }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.19", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "engines": { "node": ">= 12.13.0" @@ -2675,14 +2682,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2698,14 +2706,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -2730,9 +2738,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.6.0.tgz", - "integrity": "sha512-zzySkJgVbFCylnG2+9MDF7N+2Rjze2y0bF8GyUNpFOnT8mCMfqqtLDJkHBuYu9N/psW1A6DVbQhPkP92E+qakA==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz", + "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", @@ -2878,6 +2886,15 @@ "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3558,9 +3575,9 @@ "dev": true }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3584,35 +3601,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/globule": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", @@ -4186,12 +4174,12 @@ "dev": true }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/ip": { @@ -5815,9 +5803,9 @@ } }, "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "funding": [ { "type": "opencollective", @@ -6223,15 +6211,15 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/redent": { @@ -6511,9 +6499,9 @@ } }, "node_modules/sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -6548,9 +6536,9 @@ } }, "node_modules/sass-loader": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", - "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", "dev": true, "dependencies": { "klona": "^2.0.4", @@ -6565,7 +6553,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -6652,9 +6640,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6838,15 +6826,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -7728,9 +7707,9 @@ "dev": true }, "node_modules/vue-loader": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", - "integrity": "sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.1.tgz", + "integrity": "sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -7739,6 +7718,14 @@ }, "peerDependencies": { "webpack": "^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "vue": { + "optional": true + } } }, "node_modules/watchpack": { @@ -7764,9 +7751,9 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -7811,44 +7798,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^9.4.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -7858,12 +7843,12 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "engines": { - "node": ">= 10" + "node": "^12.20.0 || >=14" } }, "node_modules/webpack-dev-middleware": { @@ -8398,15 +8383,15 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -8449,14 +8434,14 @@ "peer": true }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "dependencies": { "debug": { @@ -9038,25 +9023,23 @@ } }, "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", "dev": true, "requires": {} }, @@ -9943,19 +9926,19 @@ } }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.19", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" } }, "css-select": { @@ -10413,14 +10396,15 @@ "peer": true }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -10436,14 +10420,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -10508,6 +10492,12 @@ "is-glob": "^4.0.3" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10550,9 +10540,9 @@ } }, "eslint-plugin-vue": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.6.0.tgz", - "integrity": "sha512-zzySkJgVbFCylnG2+9MDF7N+2Rjze2y0bF8GyUNpFOnT8mCMfqqtLDJkHBuYu9N/psW1A6DVbQhPkP92E+qakA==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz", + "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==", "dev": true, "requires": { "eslint-utils": "^3.0.0", @@ -11079,9 +11069,9 @@ "dev": true }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -11095,28 +11085,6 @@ } } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - } - } - }, "globule": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", @@ -11554,9 +11522,9 @@ "dev": true }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "ip": { @@ -12813,9 +12781,9 @@ } }, "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -13124,12 +13092,12 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "redent": { @@ -13337,9 +13305,9 @@ } }, "sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -13362,9 +13330,9 @@ } }, "sass-loader": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.1.0.tgz", - "integrity": "sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -13427,9 +13395,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13584,12 +13552,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -14271,9 +14233,9 @@ } }, "vue-loader": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", - "integrity": "sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.1.tgz", + "integrity": "sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -14301,9 +14263,9 @@ } }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -14333,29 +14295,30 @@ } }, "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^9.4.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true } } diff --git a/glances/outputs/static/package.json b/glances/outputs/static/package.json index 9273bd6d..92ae2cf8 100644 --- a/glances/outputs/static/package.json +++ b/glances/outputs/static/package.json @@ -10,20 +10,20 @@ }, "devDependencies": { "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.1", + "css-loader": "^6.7.3", "del": "^7.0.0", - "eslint": "^8.25.0", - "eslint-plugin-vue": "^9.6.0", + "eslint": "^8.32.0", + "eslint-plugin-vue": "^9.9.0", "html-webpack-plugin": "^5.5.0", "less": "^4.1.3", "less-loader": "^11.1.0", - "sass": "^1.55.0", - "sass-loader": "^13.1.0", + "sass": "^1.57.1", + "sass-loader": "^13.2.0", "style-loader": "^3.3.1", "url-loader": "^4.1.1", - "vue-loader": "^17.0.0", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", + "vue-loader": "^17.0.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1" }, "scripts": { From f602416cb350d3aaa8d06f30c16d48fd77770132 Mon Sep 17 00:00:00 2001 From: fr4nc0is Date: Sun, 22 Jan 2023 17:53:46 +0100 Subject: [PATCH 26/35] bump dependencies --- glances/outputs/static/package-lock.json | 404 +++++++++++++++-------- glances/outputs/static/package.json | 6 +- 2 files changed, 267 insertions(+), 143 deletions(-) diff --git a/glances/outputs/static/package-lock.json b/glances/outputs/static/package-lock.json index 5297c627..ea70c00b 100644 --- a/glances/outputs/static/package-lock.json +++ b/glances/outputs/static/package-lock.json @@ -7,10 +7,10 @@ "dependencies": { "bootstrap": "^3.4.1", "favico.js": "^0.3.10", - "hotkeys-js": "^3.10.0", + "hotkeys-js": "^3.10.1", "lodash": "^4.17.21", - "sanitize-html": "^2.7.2", - "vue": "^3.2.41" + "sanitize-html": "^2.8.1", + "vue": "^3.2.45" }, "devDependencies": { "copy-webpack-plugin": "^11.0.0", @@ -147,9 +147,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -617,36 +617,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", - "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.41", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", - "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "dependencies": { - "@vue/compiler-core": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", - "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.41", - "@vue/compiler-dom": "3.2.41", - "@vue/compiler-ssr": "3.2.41", - "@vue/reactivity-transform": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -654,69 +654,69 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", - "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "dependencies": { - "@vue/compiler-dom": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/reactivity": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", - "integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", "dependencies": { - "@vue/shared": "3.2.41" + "@vue/shared": "3.2.45" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", - "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", - "integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", "dependencies": { - "@vue/reactivity": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", - "integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", "dependencies": { - "@vue/runtime-core": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", - "integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", "dependencies": { - "@vue/compiler-ssr": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" }, "peerDependencies": { - "vue": "3.2.41" + "vue": "3.2.45" } }, "node_modules/@vue/shared": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", - "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", @@ -2441,6 +2441,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -2465,6 +2466,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, "dependencies": { "domelementtype": "^2.2.0" }, @@ -2479,6 +2481,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -2590,6 +2593,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -3744,9 +3748,9 @@ } }, "node_modules/hotkeys-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.0.tgz", - "integrity": "sha512-20xeVdOqcgTkMox0+BqFwADZP7+5dy/9CFPpAinSMh2d0s3b0Hs2V2D+lMh4Hphkf7VE9pwnOl58eP1te+REcg==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.1.tgz", + "integrity": "sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -3814,6 +3818,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -6467,18 +6472,69 @@ "dev": true }, "node_modules/sanitize-html": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", - "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz", + "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", - "htmlparser2": "^6.0.0", + "htmlparser2": "^8.0.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -6490,6 +6546,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, "node_modules/sanitize-html/node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -6946,7 +7020,8 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdx-correct": { "version": "3.1.1", @@ -7626,15 +7701,15 @@ "peer": true }, "node_modules/vue": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", - "integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", "dependencies": { - "@vue/compiler-dom": "3.2.41", - "@vue/compiler-sfc": "3.2.41", - "@vue/runtime-dom": "3.2.41", - "@vue/server-renderer": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/vue-eslint-parser": { @@ -8372,9 +8447,9 @@ } }, "@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==" + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" }, "@discoveryjs/json-ext": { "version": "0.5.5", @@ -8778,36 +8853,36 @@ } }, "@vue/compiler-core": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", - "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.41", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", - "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "requires": { - "@vue/compiler-core": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/compiler-sfc": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", - "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.41", - "@vue/compiler-dom": "3.2.41", - "@vue/compiler-ssr": "3.2.41", - "@vue/reactivity-transform": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -8815,66 +8890,66 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", - "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "requires": { - "@vue/compiler-dom": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/reactivity": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", - "integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", "requires": { - "@vue/shared": "3.2.41" + "@vue/shared": "3.2.45" } }, "@vue/reactivity-transform": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", - "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", - "integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", "requires": { - "@vue/reactivity": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/runtime-dom": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", - "integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", "requires": { - "@vue/runtime-core": "3.2.41", - "@vue/shared": "3.2.41", + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", - "integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", "requires": { - "@vue/compiler-ssr": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/shared": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", - "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -10204,6 +10279,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -10219,6 +10295,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, "requires": { "domelementtype": "^2.2.0" } @@ -10227,6 +10304,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -10324,7 +10402,8 @@ "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true }, "env-paths": { "version": "2.2.1", @@ -11197,9 +11276,9 @@ } }, "hotkeys-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.0.tgz", - "integrity": "sha512-20xeVdOqcgTkMox0+BqFwADZP7+5dy/9CFPpAinSMh2d0s3b0Hs2V2D+lMh4Hphkf7VE9pwnOl58eP1te+REcg==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.1.tgz", + "integrity": "sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==" }, "hpack.js": { "version": "2.1.6", @@ -11251,6 +11330,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -13280,23 +13360,67 @@ "dev": true }, "sanitize-html": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.2.tgz", - "integrity": "sha512-DggSTe7MviO+K4YTCwprG6W1vsG+IIX67yp/QY55yQqKCJYSWzCA1rZbaXzkjoKeL9+jqwm56wD6srYLtUNivg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz", + "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", - "htmlparser2": "^6.0.0", + "htmlparser2": "^8.0.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" }, "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -14173,15 +14297,15 @@ } }, "vue": { - "version": "3.2.41", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", - "integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", "requires": { - "@vue/compiler-dom": "3.2.41", - "@vue/compiler-sfc": "3.2.41", - "@vue/runtime-dom": "3.2.41", - "@vue/server-renderer": "3.2.41", - "@vue/shared": "3.2.41" + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" } }, "vue-eslint-parser": { diff --git a/glances/outputs/static/package.json b/glances/outputs/static/package.json index 92ae2cf8..2643075d 100644 --- a/glances/outputs/static/package.json +++ b/glances/outputs/static/package.json @@ -3,10 +3,10 @@ "dependencies": { "bootstrap": "^3.4.1", "favico.js": "^0.3.10", - "hotkeys-js": "^3.10.0", + "hotkeys-js": "^3.10.1", "lodash": "^4.17.21", - "sanitize-html": "^2.7.2", - "vue": "^3.2.41" + "sanitize-html": "^2.8.1", + "vue": "^3.2.45" }, "devDependencies": { "copy-webpack-plugin": "^11.0.0", From 30f981bd8eda0cd01ad96fce7c0444e532dcf1b5 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 30 Jan 2023 10:46:39 +0100 Subject: [PATCH 27/35] Add a new exporter to MongoDB time-serie #2203 --- README.rst | 1 + conf/glances.conf | 9 ++++++++ docker-compose/glances.conf | 9 ++++++++ docs/gw/couchdb.rst | 43 ++++++++++++++++--------------------- docs/gw/index.rst | 1 + optional-requirements.txt | 1 + setup.py | 4 ++-- 7 files changed, 41 insertions(+), 27 deletions(-) diff --git a/README.rst b/README.rst index 53a573d0..9deffbd9 100644 --- a/README.rst +++ b/README.rst @@ -117,6 +117,7 @@ Optional dependencies: - ``py-cpuinfo`` (for the Quicklook CPU info module) - ``pygal`` (for the graph export module) - ``pymdstat`` (for RAID support) [Linux-only] +- ``pymongo`` (for the MongoDB export module) [Only for Python >= 3.7] - ``pysnmp`` (for SNMP support) - ``pySMART.smartx`` (for HDD Smart support) [Linux-only] - ``pyzmq`` (for the ZeroMQ export module) diff --git a/conf/glances.conf b/conf/glances.conf index 835b84d9..cf3a8f7d 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -584,6 +584,15 @@ db=glances #user=root #password=root +[mongodb] +# Configuration for the --export mongodb option +# https://www.mongodb.com +host=localhost +port=27017 +db=glances +user=root +password=example + [kafka] # Configuration for the --export kafka option # http://kafka.apache.org/ diff --git a/docker-compose/glances.conf b/docker-compose/glances.conf index 0ee06cbd..78cb3174 100644 --- a/docker-compose/glances.conf +++ b/docker-compose/glances.conf @@ -584,6 +584,15 @@ db=glances #user=root #password=root +[mongodb] +# Configuration for the --export mongodb option +# https://www.mongodb.com +host=localhost +port=27017 +db=glances +user=root +password=example + [kafka] # Configuration for the --export kafka option # http://kafka.apache.org/ diff --git a/docs/gw/couchdb.rst b/docs/gw/couchdb.rst index 66c547ba..3e4d92bd 100644 --- a/docs/gw/couchdb.rst +++ b/docs/gw/couchdb.rst @@ -9,42 +9,35 @@ following: .. code-block:: ini - [couchdb] + [mongodb] host=localhost - port=5984 - user=root - password=root + port=27017 db=glances + user=root + password=example and run Glances with: .. code-block:: console - $ glances --export couchdb + $ glances --export mongodb -Documents are stored in native ``JSON`` format. Glances adds ``"type"`` -and ``"time"`` entries: +Documents are stored in native the configured database (glances by default) +with one collection per plugin. -- ``type``: plugin name -- ``time``: timestamp (format: "2016-09-24T16:39:08.524828Z") - -Example of Couch Document for the load stats: +Example of MongoDB Document for the load stats: .. code-block:: json { - "_id": "36cbbad81453c53ef08804cb2612d5b6", - "_rev": "1-382400899bec5615cabb99aa34df49fb", - "min15": 0.33, - "time": "2016-09-24T16:39:08.524828Z", - "min5": 0.4, - "cpucore": 4, - "load_warning": 1, - "min1": 0.5, - "history_size": 28800, - "load_critical": 5, - "type": "load", - "load_careful": 0.7 + _id: ObjectId('63d78ffee5528e543ce5af3a'), + min1: 1.46337890625, + min5: 1.09619140625, + min15: 1.07275390625, + cpucore: 4, + history_size: 1200, + load_disable: 'False', + load_careful: 0.7, + load_warning: 1, + load_critical: 5 } - -You can view the result using the CouchDB utils URL: http://127.0.0.1:5984/_utils/database.html?glances. diff --git a/docs/gw/index.rst b/docs/gw/index.rst index 8052e744..e0b635f2 100644 --- a/docs/gw/index.rst +++ b/docs/gw/index.rst @@ -18,6 +18,7 @@ to providing stats to multiple services (see list below). json kafka mqtt + mongodb opentsdb prometheus rabbitmq diff --git a/optional-requirements.txt b/optional-requirements.txt index 867acc1f..36cacfad 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -22,6 +22,7 @@ potsdb prometheus_client pygal pymdstat +pymongo; python_version >= "3.7" pysnmp pySMART.smartx python-dateutil diff --git a/setup.py b/setup.py index a818ade1..b29bafb2 100755 --- a/setup.py +++ b/setup.py @@ -65,8 +65,8 @@ def get_install_extras_require(): 'cloud': ['requests'], 'docker': ['docker>=2.0.0', 'python-dateutil', 'six'], 'export': ['bernhard', 'cassandra-driver', 'couchdb', 'elasticsearch', - 'graphitesender', 'influxdb>=1.0.0', 'kafka-python', 'pika', - 'paho-mqtt', 'potsdb', 'prometheus_client', 'pyzmq', + 'graphitesender', 'influxdb>=1.0.0', 'kafka-python', 'pymongo', + 'pika', 'paho-mqtt', 'potsdb', 'prometheus_client', 'pyzmq', 'statsd'], 'folders': ['scandir'], # python_version<"3.5" 'graph': ['pygal'], From bb455ac6edadad35a4c693e011b27b46301b86ed Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 30 Jan 2023 10:47:11 +0100 Subject: [PATCH 28/35] Add a new exporter to MongoDB time-serie #2203 --- docs/gw/mongodb.rst | 50 ++++++++++++++++++ glances/exports/glances_mongodb.py | 81 ++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 docs/gw/mongodb.rst create mode 100644 glances/exports/glances_mongodb.py diff --git a/docs/gw/mongodb.rst b/docs/gw/mongodb.rst new file mode 100644 index 00000000..b5e4dbca --- /dev/null +++ b/docs/gw/mongodb.rst @@ -0,0 +1,50 @@ +.. _couchdb: + +MongoDB +======= + +You can export statistics to a ``MongoDB`` server. +The connection should be defined in the Glances configuration file as +following: + +.. code-block:: ini + + [couchdb] + host=localhost + port=5984 + user=root + password=example + db=glances + +and run Glances with: + +.. code-block:: console + + $ glances --export couchdb + +Documents are stored in native ``JSON`` format. Glances adds ``"type"`` +and ``"time"`` entries: + +- ``type``: plugin name +- ``time``: timestamp (format: "2016-09-24T16:39:08.524828Z") + +Example of Couch Document for the load stats: + +.. code-block:: json + + { + "_id": "36cbbad81453c53ef08804cb2612d5b6", + "_rev": "1-382400899bec5615cabb99aa34df49fb", + "min15": 0.33, + "time": "2016-09-24T16:39:08.524828Z", + "min5": 0.4, + "cpucore": 4, + "load_warning": 1, + "min1": 0.5, + "history_size": 28800, + "load_critical": 5, + "type": "load", + "load_careful": 0.7 + } + +You can view the result using the CouchDB utils URL: http://127.0.0.1:5984/_utils/database.html?glances. diff --git a/glances/exports/glances_mongodb.py b/glances/exports/glances_mongodb.py new file mode 100644 index 00000000..70be8f65 --- /dev/null +++ b/glances/exports/glances_mongodb.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# SPDX-FileCopyrightText: 2023 Nicolas Hennion +# +# SPDX-License-Identifier: LGPL-3.0-only +# + +"""MongoDB interface class.""" + +import sys +from datetime import datetime + +from glances.logger import logger +from glances.exports.glances_export import GlancesExport + +import pymongo +from urllib.parse import quote_plus + + +class Export(GlancesExport): + + """This class manages the MongoDB export module.""" + + def __init__(self, config=None, args=None): + """Init the MongoDB export IF.""" + super(Export, self).__init__(config=config, args=args) + + # Mandatory configuration keys (additional to host and port) + self.db = None + + # Optional configuration keys + self.user = None + self.password = None + + # Load the Cassandra configuration file section + self.export_enable = self.load_conf('mongodb', mandatories=['host', 'port', 'db'], options=['user', 'password']) + if not self.export_enable: + sys.exit(2) + + # Init the CouchDB client + self.client = self.init() + + def init(self): + """Init the connection to the CouchDB server.""" + if not self.export_enable: + return None + + server_uri = 'mongodb://%s:%s@%s:%s' % (quote_plus(self.user), + quote_plus(self.password), + self.host, + self.port) + + try: + client = pymongo.MongoClient(server_uri) + client.admin.command('ping') + except Exception as e: + logger.critical("Cannot connect to MongoDB server %s (%s)" % (server_uri, e)) + sys.exit(2) + else: + logger.info("Connected to the MongoDB server") + + return client + + def database(self): + """Return the CouchDB database object""" + return self.client[self.db] + + def export(self, name, columns, points): + """Write the points to the MongoDB server.""" + logger.debug("Export {} stats to MongoDB".format(name)) + + # Create DB input + data = dict(zip(columns, points)) + + # Write data to the MongoDB database + try: + self.database()[name].insert_one(data) + except Exception as e: + logger.error("Cannot export {} stats to MongoDB ({})".format(name, e)) From 7d2462075cb18bad8bb5f6b559ad4edd588881a4 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 30 Jan 2023 16:51:52 +0100 Subject: [PATCH 29/35] Update documentation --- docs/api.rst | 927 ++++++++++++++++++++++++++------------------ docs/gw/mongodb.rst | 2 +- docs/man/glances.1 | 2 +- 3 files changed, 548 insertions(+), 383 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 443af5f8..e67858a9 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -66,18 +66,18 @@ GET alert Get plugin stats:: # curl http://localhost:61208/api/3/alert - [[1674381772.0, + [[1675093869.0, -1, "WARNING", - "CPU_TOTAL", - 78.1, - 78.1, - 78.1, - 78.1, + "MEM", + 82.83225325565277, + 82.83225325565277, + 82.83225325565277, + 82.83225325565277, 1, [], "", - "cpu_percent"]] + "memory_percent"]] GET amps -------- @@ -93,7 +93,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.1751177310943604}, + "timer": 0.6673910617828369}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -102,7 +102,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.1748502254486084}] + "timer": 0.667231559753418}] Get a specific field:: @@ -120,7 +120,7 @@ Get a specific item when field matchs the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 1.1751177310943604}]} + "timer": 0.6673910617828369}]} GET core -------- @@ -150,19 +150,19 @@ Get plugin stats:: "ctx_switches": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 14.7, + "idle": 67.7, "interrupts": 0, - "iowait": 7.4, + "iowait": 0.2, "irq": 0.0, "nice": 0.0, "soft_interrupts": 0, - "softirq": 0.9, + "softirq": 0.0, "steal": 0.0, "syscalls": 0, - "system": 19.4, + "system": 6.3, "time_since_update": 1, - "total": 78.1, - "user": 57.6} + "total": 31.2, + "user": 25.7} Fields descriptions: @@ -185,7 +185,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/cpu/total - {"total": 78.1} + {"total": 31.2} GET diskio ---------- @@ -230,11 +230,56 @@ GET docker Get plugin stats:: # curl http://localhost:61208/api/3/docker - {"containers": [{"Command": ["/portainer"], + {"containers": [{"Command": ["docker-entrypoint.sh", "mongod"], + "Id": "c3a1bb27858df965e1c524c6ef33c0fd26d765cae5bcd90fbe9e662b703a52aa", + "Image": ["mongo:latest"], + "Status": "running", + "Uptime": "6 hours", + "cpu": {"total": 0.0}, + "cpu_percent": 0.0, + "io": {"cumulative_ior": 0, + "cumulative_iow": 548864, + "time_since_update": 1}, + "io_r": None, + "io_w": None, + "key": "name", + "memory": {"cache": None, + "limit": 7836196864, + "max_usage": None, + "rss": None, + "usage": 121462784}, + "memory_usage": 121462784, + "name": "docker-mongo_mongo_1", + "network": {"cumulative_rx": 1546897, + "cumulative_tx": 943210, + "time_since_update": 1}, + "network_rx": None, + "network_tx": None}, + {"Command": ["tini", + "--", + "/docker-entrypoint.sh", + "mongo-express"], + "Id": "5aa8f03d6027d00244cf5ce5f4ffe616fd8a31e95ff7091ca02b8d99c00b276c", + "Image": ["mongo-express:latest"], + "Status": "running", + "Uptime": "6 hours", + "cpu": {"total": 0.0}, + "cpu_percent": 0.0, + "io": {}, + "io_r": None, + "io_w": None, + "key": "name", + "memory": {}, + "memory_usage": None, + "name": "docker-mongo_mongo-express_1", + "network": {}, + "network_rx": None, + "network_tx": None}, + {"Command": ["/portainer"], "Id": "3abd51c615968482d9ccff5afc629f267f6dda113ed68b75b432615fae3b49fb", "Image": ["portainer/portainer-ce:2.9.3"], "Status": "running", - "Uptime": "23 hours", + "Uptime": "1 weeks", "cpu": {"total": 0.0}, "cpu_percent": 0.0, "io": {}, @@ -285,13 +330,13 @@ Get plugin stats:: # curl http://localhost:61208/api/3/fs [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 63000883200, + "free": 61967261696, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 72.7, + "percent": 73.2, "size": 243334156288, - "used": 167945818112}, + "used": 168979439616}, {"device_name": "zsfpool", "free": 41811968, "fs_type": "zfs", @@ -310,13 +355,13 @@ Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/fs/mnt_point// {"/": [{"device_name": "/dev/mapper/ubuntu--gnome--vg-root", - "free": 63000883200, + "free": 61967261696, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", - "percent": 72.7, + "percent": 73.2, "size": 243334156288, - "used": 167945818112}]} + "used": 168979439616}]} GET ip ------ @@ -324,17 +369,17 @@ GET ip Get plugin stats:: # curl http://localhost:61208/api/3/ip - {"address": "192.168.0.32", - "gateway": "192.168.0.254", + {"address": "192.168.1.14", + "gateway": "192.168.1.1", "mask": "255.255.255.0", "mask_cidr": 24, - "public_address": "91.166.228.228", + "public_address": "109.210.93.150", "public_info_human": ""} Get a specific field:: # curl http://localhost:61208/api/3/ip/gateway - {"gateway": "192.168.0.254"} + {"gateway": "192.168.1.1"} GET load -------- @@ -342,10 +387,7 @@ GET load Get plugin stats:: # curl http://localhost:61208/api/3/load - {"cpucore": 4, - "min1": 2.79248046875, - "min15": 0.6044921875, - "min5": 1.24951171875} + {"cpucore": 4, "min1": 1.9677734375, "min15": 1.2421875, "min5": 1.4140625} Fields descriptions: @@ -357,7 +399,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/3/load/min1 - {"min1": 2.79248046875} + {"min1": 1.9677734375} GET mem ------- @@ -365,16 +407,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/3/mem - {"active": 3232829440, - "available": 2574643200, - "buffers": 482086912, - "cached": 2828992512, - "free": 2574643200, - "inactive": 3375968256, - "percent": 67.1, - "shared": 610131968, + {"active": 2301452288, + "available": 1345298432, + "buffers": 91602944, + "cached": 1984524288, + "free": 1345298432, + "inactive": 4274671616, + "percent": 82.8, + "shared": 603455488, "total": 7836196864, - "used": 5261553664} + "used": 6490898432} Fields descriptions: @@ -401,13 +443,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/3/memswap - {"free": 6393114624, - "percent": 20.9, - "sin": 1016889344, - "sout": 2570014720, + {"free": 5992534016, + "percent": 25.9, + "sin": 2847645696, + "sout": 5540925440, "time_since_update": 1, "total": 8082419712, - "used": 1689305088} + "used": 2089885696} Fields descriptions: @@ -431,29 +473,29 @@ Get plugin stats:: # curl http://localhost:61208/api/3/network [{"alias": None, - "cumulative_cx": 104446528, - "cumulative_rx": 52223264, - "cumulative_tx": 52223264, - "cx": 2384, + "cumulative_cx": 184715152, + "cumulative_rx": 92357576, + "cumulative_tx": 92357576, + "cx": 8458, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 1192, + "rx": 4229, "speed": 0, "time_since_update": 1, - "tx": 1192}, + "tx": 4229}, {"alias": None, - "cumulative_cx": 12191054510, - "cumulative_rx": 11933885504, - "cumulative_tx": 257169006, - "cx": 29422, + "cumulative_cx": 13554125250, + "cumulative_rx": 13227076404, + "cumulative_tx": 327048846, + "cx": 25901, "interface_name": "wlp2s0", "is_up": True, "key": "interface_name", - "rx": 22777, + "rx": 20009, "speed": 0, "time_since_update": 1, - "tx": 6645}] + "tx": 5892}] Fields descriptions: @@ -478,25 +520,28 @@ Get a specific field:: "br-119e6ee04e05", "docker0", "br-87386b77b676", - "mpqemubr0", "vethf503072", - "tap-1e376645a40"]} + "mpqemubr0", + "tap-1e376645a40", + "br-ef0a06c4e10f", + "veth9a140b2", + "veth9ed6876"]} Get a specific item when field matchs the given value:: # curl http://localhost:61208/api/3/network/interface_name/lo {"lo": [{"alias": None, - "cumulative_cx": 104446528, - "cumulative_rx": 52223264, - "cumulative_tx": 52223264, - "cx": 2384, + "cumulative_cx": 184715152, + "cumulative_rx": 92357576, + "cumulative_tx": 92357576, + "cx": 8458, "interface_name": "lo", "is_up": True, "key": "interface_name", - "rx": 1192, + "rx": 4229, "speed": 0, "time_since_update": 1, - "tx": 1192}]} + "tx": 4229}]} GET now ------- @@ -504,7 +549,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/3/now - "2023-01-22 11:02:51 CET" + "2023-01-30 16:51:08 CET" GET percpu ---------- @@ -515,29 +560,29 @@ Get plugin stats:: [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 20.3, - "iowait": 12.3, + "idle": 67.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 24.6, - "total": 79.7, - "user": 42.8}, + "system": 3.0, + "total": 33.0, + "user": 11.0}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 16.4, - "iowait": 6.0, + "idle": 41.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 12.7, - "total": 83.6, - "user": 64.9}] + "system": 0.0, + "total": 59.0, + "user": 41.0}] Get a specific field:: @@ -551,30 +596,30 @@ Get plugin stats:: # curl http://localhost:61208/api/3/ports [{"description": "DefaultGateway", - "host": "192.168.0.254", + "host": "192.168.1.1", "indice": "port_0", "port": 0, "refresh": 30, "rtt_warning": None, - "status": 0.01009, + "status": 0.006011, "timeout": 3}] Get a specific field:: # curl http://localhost:61208/api/3/ports/host - {"host": ["192.168.0.254"]} + {"host": ["192.168.1.1"]} Get a specific item when field matchs the given value:: - # curl http://localhost:61208/api/3/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.01009, - "timeout": 3}]} + # curl http://localhost:61208/api/3/ports/host/192.168.1.1 + {"192.168.1.1": [{"description": "DefaultGateway", + "host": "192.168.1.1", + "indice": "port_0", + "port": 0, + "refresh": 30, + "rtt_warning": None, + "status": 0.006011, + "timeout": 3}]} GET processcount ---------------- @@ -582,12 +627,12 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/3/processcount - {"pid_max": 0, "running": 2, "sleeping": 311, "thread": 1523, "total": 386} + {"pid_max": 0, "running": 1, "sleeping": 332, "thread": 1844, "total": 463} Get a specific field:: # curl http://localhost:61208/api/3/processcount/total - {"total": 386} + {"total": 463} GET processlist --------------- @@ -595,51 +640,66 @@ GET processlist Get plugin stats:: # curl http://localhost:61208/api/3/processlist - [{"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox"], + [{"cmdline": ["/snap/multipass/8140/usr/bin/qemu-system-x86_64", + "--enable-kvm", + "-cpu", + "host", + "-nic", + "tap,ifname=tap-1e376645a40,script=no,downscript=no,model=virtio-net-pci,mac=52:54:00:05:05:17", + "-device", + "virtio-scsi-pci,id=scsi0", + "-drive", + "file=/var/snap/multipass/common/data/multipassd/vault/instances/primary/ubuntu-22.04-server-cloudimg-amd64.img,if=none,format=qcow2,discard=unmap,id=hda", + "-device", + "scsi-hd,drive=hda,bus=scsi0.0", + "-smp", + "1", + "-m", + "1024M", + "-qmp", + "stdio", + "-chardev", + "null,id=char0", + "-serial", + "chardev:char0", + "-nographic", + "-cdrom", + "/var/snap/multipass/common/data/multipassd/vault/instances/primary/cloud-init-config.iso", + "-loadvm", + "suspend", + "-machine", + "pc-i440fx-focal"], "cpu_percent": 0.0, - "cpu_times": [2122.86, 658.23, 1239.16, 210.94, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [1674662912, 3749654528, 0, 0, 0], + "cpu_times": [15.8, 8.88, 0.0, 0.0, 0.0], + "gids": [0, 0, 0], + "io_counters": [0, 0, 0, 0, 0], "key": "pid", - "memory_info": [584667136, 21991870464, 132120576, 647168, 0, 1149304832, 0], - "memory_percent": 7.461108317556428, - "name": "firefox", + "memory_info": [508997632, 2645762048, 4816896, 5414912, 0, 1256706048, 0], + "memory_percent": 6.49546764628092, + "name": "qemu-system-x86_64", "nice": 0, - "num_threads": 146, - "pid": 5040, + "num_threads": 6, + "pid": 165054, "status": "S", "time_since_update": 1, - "username": "nicolargo"}, - {"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox", - "-contentproc", - "-childID", - "1", - "-isForBrowser", - "-prefsLen", - "32129", - "-prefMapSize", - "236410", - "-jsInitLen", - "246772", - "-parentBuildID", - "20230104235612", - "-appDir", - "/snap/firefox/2263/usr/lib/firefox/browser", - "{152fde2c-5751-4719-9edb-ff980730fbac}", - "5040", - "true", - "tab"], + "username": "root"}, + {"cmdline": ["/usr/share/code/code", + "--ms-enable-electron-run-as-node", + "/home/nicolargo/.vscode/extensions/ms-python.vscode-pylance-2023.1.40/dist/server.bundle.js", + "--cancellationReceive=file:9e8ad4331c82252be52c9e10943b0d98e4704856e6", + "--node-ipc", + "--clientProcessId=152377"], "cpu_percent": 0.0, - "cpu_times": [467.87, 83.56, 0.0, 0.0, 0.0], + "cpu_times": [292.89, 21.42, 1.52, 0.16, 0.0], "gids": [1000, 1000, 1000], - "io_counters": [213443584, 0, 0, 0, 0], + "io_counters": [103936000, 573440, 0, 0, 0], "key": "pid", - "memory_info": [397238272, 3228049408, 70422528, 647168, 0, 639614976, 0], - "memory_percent": 5.069273767545818, - "name": "WebExtensions", + "memory_info": [444641280, 49868906496, 31858688, 112656384, 0, 718778368, 0], + "memory_percent": 5.674197416385889, + "name": "code", "nice": 0, - "num_threads": 20, - "pid": 5246, + "num_threads": 13, + "pid": 152522, "status": "S", "time_since_update": 1, "username": "nicolargo"}] @@ -647,211 +707,229 @@ Get plugin stats:: Get a specific field:: # curl http://localhost:61208/api/3/processlist/pid - {"pid": [5040, + {"pid": [165054, + 152522, + 5040, 5246, - 5369, 5752, - 10873, - 5365, - 10653, - 90446, + 5369, 4150, - 10724, - 109138, - 4519, - 422, - 109284, - 95798, - 22179, - 11307, - 36722, - 110258, - 5261, - 62850, + 10653, + 173071, + 5365, + 173932, + 171502, + 166223, + 180530, + 152377, + 137271, + 176436, + 182287, + 173116, + 184024, + 177108, + 151269, + 178661, + 173149, 10547, - 110317, + 168824, + 422, + 5261, + 185474, 10709, - 109762, - 110036, - 109882, - 10612, + 186130, + 185886, + 185571, 6074, - 96478, + 10612, + 171875, + 178970, + 168735, + 178475, 42687, + 168734, + 187074, 4035, - 110285, + 62850, 2512, - 11033, - 1672, - 4473, - 5179, - 6020, + 95798, 10732, - 6022, - 4585, + 4473, 4544, - 10632, - 23231, - 23230, - 11251, - 4248, - 4413, - 11252, - 3955, - 4223, 2721, - 4932, + 4585, 1816, - 90918, - 1635, + 152506, + 10632, + 4932, + 4413, + 4248, + 1672, 14455, - 10848, - 43005, - 90973, - 4332, - 4263, - 4625, - 2239, - 1806, - 4325, + 3955, 14458, - 1, - 96102, + 6020, + 5179, + 164782, + 4325, + 4332, + 4625, + 1635, 4331, - 4182, - 102364, - 2701, - 91003, - 1681, - 4214, - 1876, - 1655, - 2640, - 2455, - 10557, - 1885, - 4561, - 1660, + 43005, + 6022, 4445, - 1442, - 4130, - 4261, - 4339, + 160043, + 186352, + 4223, 4352, - 3944, - 1682, - 3934, - 4485, - 10558, 4659, - 4328, 4330, - 4137, + 156821, + 1, + 129101, + 129097, + 2239, + 4263, + 1681, + 1660, + 4561, + 156833, + 178639, + 129087, + 178867, + 4214, + 4182, + 1682, + 1876, + 3944, + 3968, + 4339, + 10557, + 4130, + 1442, + 3934, 4327, - 4334, 4233, + 96102, + 1655, + 4137, 1777, - 3351, + 4261, + 4334, + 1634, + 17189, + 4485, + 4328, + 10558, 1873, + 3351, + 17205, + 1617, 59511, 2179, - 1617, - 4050, - 17205, - 4192, - 4348, - 4166, 4392, - 3700, - 1634, - 3966, - 17189, - 4573, - 4155, - 3968, 3971, - 1675, - 4347, - 4329, - 1661, - 4377, - 6095, - 4229, - 1666, - 5299, - 2683, - 4314, - 1673, - 1643, - 1676, - 46760, - 10911, - 4452, - 468, - 4335, - 4324, - 4524, - 2684, - 4443, - 4173, - 4337, - 4201, - 4212, - 42986, + 4166, + 3966, + 4155, + 4348, + 4573, 4178, + 4050, + 4452, + 4192, + 117714, + 4524, + 1675, + 4229, + 6095, + 1661, + 4347, + 4377, + 1673, + 5299, + 152553, + 1643, + 4329, + 42986, + 4335, + 160053, + 4324, + 4314, + 468, + 4173, + 4212, + 4337, + 4443, + 4201, + 3976, + 129099, + 1676, + 4045, + 1666, + 1885, 1631, 1670, 3952, - 4045, - 3976, 1443, - 3701, - 3953, - 1626, 4119, - 4162, - 1646, - 2020, - 1441, - 1633, - 3354, 9703, + 1626, + 129100, + 1646, + 3953, + 3700, + 2020, + 4162, + 178850, + 1441, + 3701, + 178609, + 1633, + 178617, + 178843, 49191, - 110201, - 14505, + 165074, + 186999, 49179, - 10591, - 1449, + 14505, 4579, 1685, + 1449, 1450, - 3774, + 3354, + 10591, + 2472, + 164891, + 49182, + 160052, + 1618, + 1803, + 1804, 10560, 49194, - 2472, 42952, - 1804, - 1803, + 184504, + 187073, + 42969, 42937, 42964, - 42969, - 49182, - 3945, - 1618, - 110284, - 3707, 4018, 4323, - 4820, 2480, - 104481, - 1695, + 3707, + 4820, + 3945, 2503, 2475, - 2485, + 181945, + 1695, 1447, + 2485, 1628, 49185, + 178889, 2, 3, 4, @@ -998,66 +1076,153 @@ Get a specific field:: 62923, 62924, 62925, - 78135, - 78136, - 78138, - 90658, - 90659, - 90662, - 90663, - 90665, - 90718, - 90731, - 107066, - 107228, - 107746, - 107747, - 108008, - 108340, - 108486, - 108619, - 108834, - 108931, - 109106, - 109124, - 109329, - 110081, - 110221, - 110262, - 110263, - 110268, - 110269, - 110311, - 110375, - 110376, - 110377, - 110378, - 110379]} + 156446, + 156447, + 156448, + 165059, + 165063, + 171811, + 174709, + 181685, + 182152, + 182465, + 183251, + 183453, + 184060, + 184494, + 184765, + 185058, + 185059, + 185233, + 185234, + 185575, + 185576, + 185577, + 185578, + 185753, + 185754, + 185793, + 186114, + 186175, + 186214, + 186242, + 186243, + 186244, + 186245, + 186246, + 186247, + 186248, + 186249, + 186250, + 186251, + 186252, + 186253, + 186254, + 186255, + 186256, + 186257, + 186258, + 186259, + 186260, + 186261, + 186262, + 186263, + 186264, + 186265, + 186266, + 186267, + 186268, + 186269, + 186270, + 186271, + 186272, + 186273, + 186274, + 186275, + 186276, + 186277, + 186278, + 186279, + 186280, + 186281, + 186282, + 186283, + 186284, + 186285, + 186286, + 186287, + 186288, + 186289, + 186290, + 186291, + 186292, + 186293, + 186294, + 186295, + 186296, + 186297, + 186298, + 186299, + 186300, + 186301, + 186302, + 186303, + 186304, + 186305, + 186306]} Get a specific item when field matchs the given value:: - # curl http://localhost:61208/api/3/processlist/pid/5040 - {"5040": [{"cmdline": ["/snap/firefox/2263/usr/lib/firefox/firefox"], - "cpu_percent": 0.0, - "cpu_times": [2122.86, 658.23, 1239.16, 210.94, 0.0], - "gids": [1000, 1000, 1000], - "io_counters": [1674662912, 3749654528, 0, 0, 0], - "key": "pid", - "memory_info": [584667136, - 21991870464, - 132120576, - 647168, - 0, - 1149304832, - 0], - "memory_percent": 7.461108317556428, - "name": "firefox", - "nice": 0, - "num_threads": 146, - "pid": 5040, - "status": "S", - "time_since_update": 1, - "username": "nicolargo"}]} + # curl http://localhost:61208/api/3/processlist/pid/165054 + {"165054": [{"cmdline": ["/snap/multipass/8140/usr/bin/qemu-system-x86_64", + "--enable-kvm", + "-cpu", + "host", + "-nic", + "tap,ifname=tap-1e376645a40,script=no,downscript=no,model=virtio-net-pci,mac=52:54:00:05:05:17", + "-device", + "virtio-scsi-pci,id=scsi0", + "-drive", + "file=/var/snap/multipass/common/data/multipassd/vault/instances/primary/ubuntu-22.04-server-cloudimg-amd64.img,if=none,format=qcow2,discard=unmap,id=hda", + "-device", + "scsi-hd,drive=hda,bus=scsi0.0", + "-smp", + "1", + "-m", + "1024M", + "-qmp", + "stdio", + "-chardev", + "null,id=char0", + "-serial", + "chardev:char0", + "-nographic", + "-cdrom", + "/var/snap/multipass/common/data/multipassd/vault/instances/primary/cloud-init-config.iso", + "-loadvm", + "suspend", + "-machine", + "pc-i440fx-focal"], + "cpu_percent": 0.0, + "cpu_times": [15.8, 8.88, 0.0, 0.0, 0.0], + "gids": [0, 0, 0], + "io_counters": [0, 0, 0, 0, 0], + "key": "pid", + "memory_info": [508997632, + 2645762048, + 4816896, + 5414912, + 0, + 1256706048, + 0], + "memory_percent": 6.49546764628092, + "name": "qemu-system-x86_64", + "nice": 0, + "num_threads": 6, + "pid": 165054, + "status": "S", + "time_since_update": 1, + "username": "root"}]} GET psutilversion ----------------- @@ -1073,69 +1238,69 @@ GET quicklook Get plugin stats:: # curl http://localhost:61208/api/3/quicklook - {"cpu": 78.1, + {"cpu": 31.2, "cpu_hz": 2025000000.0, - "cpu_hz_current": 1728936749.9999998, + "cpu_hz_current": 1498985500.0, "cpu_name": "Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz", - "mem": 67.1, + "mem": 82.8, "percpu": [{"cpu_number": 0, "guest": 0.0, "guest_nice": 0.0, - "idle": 20.3, - "iowait": 12.3, + "idle": 67.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 24.6, - "total": 79.7, - "user": 42.8}, + "system": 3.0, + "total": 33.0, + "user": 11.0}, {"cpu_number": 1, "guest": 0.0, "guest_nice": 0.0, - "idle": 16.4, - "iowait": 6.0, + "idle": 41.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 12.7, - "total": 83.6, - "user": 64.9}, + "system": 0.0, + "total": 59.0, + "user": 41.0}, {"cpu_number": 2, "guest": 0.0, "guest_nice": 0.0, - "idle": 9.2, - "iowait": 7.7, + "idle": 67.0, + "iowait": 0.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 2.1, + "softirq": 0.0, "steal": 0.0, - "system": 18.3, - "total": 90.8, - "user": 62.7}, + "system": 2.0, + "total": 33.0, + "user": 12.0}, {"cpu_number": 3, "guest": 0.0, "guest_nice": 0.0, - "idle": 12.1, - "iowait": 2.9, + "idle": 47.0, + "iowait": 1.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, - "softirq": 0.7, + "softirq": 0.0, "steal": 0.0, - "system": 13.6, - "total": 87.9, - "user": 70.7}], - "swap": 20.9} + "system": 6.0, + "total": 53.0, + "user": 28.0}], + "swap": 25.9} Get a specific field:: # curl http://localhost:61208/api/3/quicklook/cpu - {"cpu": 78.1} + {"cpu": 31.2} GET sensors ----------- @@ -1206,7 +1371,7 @@ GET uptime Get plugin stats:: # curl http://localhost:61208/api/3/uptime - "7 days, 17:52:03" + "15 days, 23:40:18" GET all stats ------------- @@ -1222,33 +1387,33 @@ GET stats history History of a plugin:: # curl http://localhost:61208/api/3/cpu/history - {"system": [["2023-01-22T11:02:52.355003", 19.4], - ["2023-01-22T11:02:53.467824", 19.4], - ["2023-01-22T11:02:54.710232", 13.2]], - "user": [["2023-01-22T11:02:52.354990", 57.6], - ["2023-01-22T11:02:53.467809", 57.6], - ["2023-01-22T11:02:54.710224", 28.5]]} + {"system": [["2023-01-30T16:51:09.475449", 6.3], + ["2023-01-30T16:51:10.596399", 6.3], + ["2023-01-30T16:51:11.787449", 2.1]], + "user": [["2023-01-30T16:51:09.475441", 25.7], + ["2023-01-30T16:51:10.596393", 25.7], + ["2023-01-30T16:51:11.787442", 5.0]]} Limit history to last 2 values:: # curl http://localhost:61208/api/3/cpu/history/2 - {"system": [["2023-01-22T11:02:53.467824", 19.4], - ["2023-01-22T11:02:54.710232", 13.2]], - "user": [["2023-01-22T11:02:53.467809", 57.6], - ["2023-01-22T11:02:54.710224", 28.5]]} + {"system": [["2023-01-30T16:51:10.596399", 6.3], + ["2023-01-30T16:51:11.787449", 2.1]], + "user": [["2023-01-30T16:51:10.596393", 25.7], + ["2023-01-30T16:51:11.787442", 5.0]]} History for a specific field:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-01-22T11:02:52.355003", 19.4], - ["2023-01-22T11:02:53.467824", 19.4], - ["2023-01-22T11:02:54.710232", 13.2]]} + {"system": [["2023-01-30T16:51:09.475449", 6.3], + ["2023-01-30T16:51:10.596399", 6.3], + ["2023-01-30T16:51:11.787449", 2.1]]} Limit history for a specific field to last 2 values:: # curl http://localhost:61208/api/3/cpu/system/history - {"system": [["2023-01-22T11:02:53.467824", 19.4], - ["2023-01-22T11:02:54.710232", 13.2]]} + {"system": [["2023-01-30T16:51:10.596399", 6.3], + ["2023-01-30T16:51:11.787449", 2.1]]} GET limits (used for thresholds) -------------------------------- diff --git a/docs/gw/mongodb.rst b/docs/gw/mongodb.rst index b5e4dbca..4ef71692 100644 --- a/docs/gw/mongodb.rst +++ b/docs/gw/mongodb.rst @@ -11,7 +11,7 @@ following: [couchdb] host=localhost - port=5984 + port= user=root password=example db=glances diff --git a/docs/man/glances.1 b/docs/man/glances.1 index 6aada202..505fbc59 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -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" "Jan 22, 2023" "3.4.0_beta1" "Glances" +.TH "GLANCES" "1" "Jan 30, 2023" "3.4.0_beta1" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS From e7b26b8f290f4dc4a9f7c5f95c6d6e641bd7f0c6 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 30 Jan 2023 16:58:28 +0100 Subject: [PATCH 30/35] Correct clear-text logging of sensitive information (security alert #29) --- glances/exports/glances_mongodb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glances/exports/glances_mongodb.py b/glances/exports/glances_mongodb.py index 70be8f65..25cb5b25 100644 --- a/glances/exports/glances_mongodb.py +++ b/glances/exports/glances_mongodb.py @@ -56,7 +56,7 @@ class Export(GlancesExport): client = pymongo.MongoClient(server_uri) client.admin.command('ping') except Exception as e: - logger.critical("Cannot connect to MongoDB server %s (%s)" % (server_uri, e)) + logger.critical("Cannot connect to MongoDB server %s:%s (%s)" % (self.host, self.port, e)) sys.exit(2) else: logger.info("Connected to the MongoDB server") From 0c8164a6ec74bb893a997cb573a8a7224ec726eb Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 30 Jan 2023 15:59:13 +0000 Subject: [PATCH 31/35] fix: dev-requirements.txt to reduce vulnerabilities The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-NUMPY-2321964 - https://snyk.io/vuln/SNYK-PYTHON-NUMPY-2321966 - https://snyk.io/vuln/SNYK-PYTHON-NUMPY-2321969 - https://snyk.io/vuln/SNYK-PYTHON-NUMPY-2321970 - https://snyk.io/vuln/SNYK-PYTHON-SETUPTOOLS-3180412 --- dev-requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index b78acaa3..0e7cf17e 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -8,4 +8,5 @@ autoflake codespell memory-profiler matplotlib -setuptools>=65.5.1 # not directly required, pinned by Snyk to avoid a vulnerability \ No newline at end of file +setuptools>=65.5.1 # not directly required, pinned by Snyk to avoid a vulnerability +numpy>=1.22.2 # not directly required, pinned by Snyk to avoid a vulnerability \ No newline at end of file From 03fb96cb9d14d4ec1d818c9ad580d0d9b7780b79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 19:52:36 +0000 Subject: [PATCH 32/35] chore(deps): update docker/build-push-action action to v4 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 06c83b9a..dbf905ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -136,7 +136,7 @@ jobs: password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: push: ${{ env.PUSH_BRANCH == 'true' }} tags: "${{ env.DEFAULT_DOCKER_IMAGE }}:${{ matrix.os != 'alpine' && format('{0}-', matrix.os) || '' }}${{ matrix.tag.tag }}" From 6179ac6b97b48625e97e3b9dbf4b850471e5a5b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Feb 2023 16:20:59 +0000 Subject: [PATCH 33/35] Bump http-cache-semantics from 4.1.0 to 4.1.1 in /glances/outputs/static Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/commits) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- glances/outputs/static/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/glances/outputs/static/package-lock.json b/glances/outputs/static/package-lock.json index ea70c00b..981429ad 100644 --- a/glances/outputs/static/package-lock.json +++ b/glances/outputs/static/package-lock.json @@ -3834,9 +3834,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "optional": true, "peer": true @@ -11339,9 +11339,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "optional": true, "peer": true From dbbf6ba2fa609c3b6b2e0a18429b93f66e0e7e33 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Feb 2023 21:31:43 +0000 Subject: [PATCH 34/35] chore(deps): update nvidia/cuda docker tag to v12.0.1 --- docker-files/ubuntu.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 24817387..22fc2ff2 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -8,7 +8,7 @@ # Ex: Python 3.10 for Ubuntu 22.04 # Note: ENV is for future running containers. ARG for building your Docker image. -ARG IMAGE_VERSION=12.0.0-base-ubuntu22.04 +ARG IMAGE_VERSION=12.0.1-base-ubuntu22.04 ARG PYTHON_VERSION=3.10 ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ FROM nvidia/cuda:${IMAGE_VERSION} as build From 476e9b5760b56c05aeda14b3ac49264ec3318588 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sat, 4 Feb 2023 08:45:45 +0100 Subject: [PATCH 35/35] Smartmontools missing from full docker image #2262 --- docker-files/alpine.Dockerfile | 2 ++ docker-files/ubuntu.Dockerfile | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docker-files/alpine.Dockerfile b/docker-files/alpine.Dockerfile index c44983b7..3a4b64ef 100644 --- a/docker-files/alpine.Dockerfile +++ b/docker-files/alpine.Dockerfile @@ -26,6 +26,7 @@ RUN apk add --no-cache \ curl \ lm-sensors \ wireless-tools \ + smartmontools \ iputils ############################################################################## @@ -93,6 +94,7 @@ RUN apk add --no-cache \ curl \ lm-sensors \ wireless-tools \ + smartmontools \ iputils COPY --from=buildRequirements /root/.local/bin /usr/local/bin/ diff --git a/docker-files/ubuntu.Dockerfile b/docker-files/ubuntu.Dockerfile index 22fc2ff2..22394169 100644 --- a/docker-files/ubuntu.Dockerfile +++ b/docker-files/ubuntu.Dockerfile @@ -25,6 +25,7 @@ RUN apt-get update \ curl \ lm-sensors \ wireless-tools \ + smartmontools \ net-tools \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -102,6 +103,7 @@ RUN apt-get update \ curl \ lm-sensors \ wireless-tools \ + smartmontools \ net-tools \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*