chg: Improve monitoring

pull/254/head
Raphaël Vinot 2021-09-01 12:45:36 +02:00
parent 72d85c62e3
commit 25d5beaaaf
3 changed files with 66 additions and 25 deletions

39
poetry.lock generated
View File

@ -176,6 +176,17 @@ category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "commonmark"
version = "0.9.1"
description = "Python parser for the CommonMark Markdown spec"
category = "main"
optional = false
python-versions = "*"
[package.extras]
test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"]
[[package]] [[package]]
name = "constantly" name = "constantly"
version = "15.1.0" version = "15.1.0"
@ -787,7 +798,7 @@ python-versions = "*"
name = "pygments" name = "pygments"
version = "2.10.0" version = "2.10.0"
description = "Pygments is a syntax highlighting package written in Python." description = "Pygments is a syntax highlighting package written in Python."
category = "dev" category = "main"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
@ -949,6 +960,22 @@ urllib3 = ">=1.21.1,<1.27"
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
[[package]]
name = "rich"
version = "10.9.0"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
category = "main"
optional = false
python-versions = ">=3.6,<4.0"
[package.dependencies]
colorama = ">=0.4.0,<0.5.0"
commonmark = ">=0.9.0,<0.10.0"
pygments = ">=2.6.0,<3.0.0"
[package.extras]
jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
[[package]] [[package]]
name = "scrapy" name = "scrapy"
version = "2.5.0" version = "2.5.0"
@ -1273,7 +1300,7 @@ misp = ["python-magic", "pydeep"]
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.8" python-versions = "^3.8"
content-hash = "7c93a6b1c98b1b595c4b1e653c0e72401bafd96c4d611a41fdcc3a414393bd9f" content-hash = "45847baf6fb2e8963b6cea41ad681434dff4fb0948fd48864778f4865a14bd50"
[metadata.files] [metadata.files]
aiohttp = [ aiohttp = [
@ -1440,6 +1467,10 @@ click = [
colorama = [ colorama = [
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
] ]
commonmark = [
{file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"},
{file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"},
]
constantly = [ constantly = [
{file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"},
{file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"},
@ -2002,6 +2033,10 @@ requests = [
{file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
{file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
] ]
rich = [
{file = "rich-10.9.0-py3-none-any.whl", hash = "sha256:2c84d9b3459c16bf413fe0f9644c7ae1791971e0bb944dfae56e7c7634b187ab"},
{file = "rich-10.9.0.tar.gz", hash = "sha256:ba285f1c519519490034284e6a9d2e6e3f16dc7690f2de3d9140737d81304d22"},
]
scrapy = [ scrapy = [
{file = "Scrapy-2.5.0-py2.py3-none-any.whl", hash = "sha256:5f590fdc84b496e5a4bb5ef99836b0aa688a07cfcb4bc3bb7290f66486f27424"}, {file = "Scrapy-2.5.0-py2.py3-none-any.whl", hash = "sha256:5f590fdc84b496e5a4bb5ef99836b0aa688a07cfcb4bc3bb7290f66486f27424"},
{file = "Scrapy-2.5.0.tar.gz", hash = "sha256:0a68ed41f7173679f160c4cef2db05288548c21e7164170552adae8b13cefaab"}, {file = "Scrapy-2.5.0.tar.gz", hash = "sha256:0a68ed41f7173679f160c4cef2db05288548c21e7164170552adae8b13cefaab"},

View File

@ -62,6 +62,7 @@ lief = "^0.11.4"
Flask-Login = "^0.5.0" Flask-Login = "^0.5.0"
flask-restx = "^0.5.0" flask-restx = "^0.5.0"
hiredis = "^2.0.0" hiredis = "^2.0.0"
rich = "^10.9.0"
[tool.poetry.extras] [tool.poetry.extras]
misp = ['python-magic', 'pydeep'] misp = ['python-magic', 'pydeep']

View File

@ -1,8 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
import logging
import os import os
import sys import sys
@ -10,17 +8,21 @@ from typing import List, Tuple
from redis import Redis from redis import Redis
from redis.exceptions import ConnectionError from redis.exceptions import ConnectionError
from rich.console import Console
from rich.padding import Padding
from lookyloo.helpers import get_config, get_socket_path, splash_status from lookyloo.helpers import get_socket_path, splash_status
from lookyloo.abstractmanager import AbstractManager from lookyloo.abstractmanager import AbstractManager
# NOTE: run with watch:
# watch --color tools/monitoring.py
console = Console(color_system="256")
class Monitoring(): class Monitoring():
def __init__(self) -> None: def __init__(self) -> None:
self.logger = logging.getLogger(f'{self.__class__.__name__}')
self.logger.setLevel(get_config('generic', 'loglevel'))
self.redis_cache: Redis = Redis(unix_socket_path=get_socket_path('cache'), decode_responses=True) self.redis_cache: Redis = Redis(unix_socket_path=get_socket_path('cache'), decode_responses=True)
self.redis_indexing: Redis = Redis(unix_socket_path=get_socket_path('indexing'), decode_responses=True) self.redis_indexing: Redis = Redis(unix_socket_path=get_socket_path('indexing'), decode_responses=True)
@ -30,27 +32,27 @@ class Monitoring():
socket_path_index = get_socket_path('indexing') socket_path_index = get_socket_path('indexing')
backend_up = True backend_up = True
if not os.path.exists(socket_path_cache): if not os.path.exists(socket_path_cache):
print(f'Socket path for the cache redis DB does not exists ({socket_path_cache}).') console.print(f'Socket path for the [blue]cache[/blue] redis DB [red]does not exists[/red] ({socket_path_cache}).')
backend_up = False backend_up = False
if not os.path.exists(socket_path_index): if not os.path.exists(socket_path_index):
print(f'Socket path for the indexing redis DB does not exists ({socket_path_index}).') console.print(f'Socket path for the [blue]indexing[/blue] redis DB [red]does not exists[/red] ({socket_path_index}).')
backend_up = False backend_up = False
if backend_up: if backend_up:
try: try:
cache_reachable = True if self.redis_cache.ping() else False cache_reachable = True if self.redis_cache.ping() else False
if not cache_reachable: if not cache_reachable:
print('Unable to ping the redis cache db.') console.print('Unable to ping the redis cache db.')
backend_up = False backend_up = False
except ConnectionError: except ConnectionError:
print('Unable to connect to the redis cache db.') console.print('Unable to connect to the redis cache db.')
backend_up = False backend_up = False
try: try:
indexing_reachable = True if self.redis_indexing.ping() else False indexing_reachable = True if self.redis_indexing.ping() else False
if not indexing_reachable: if not indexing_reachable:
print('Unable to ping the redis indexing db.') console.print('Unable to ping the redis indexing db.')
backend_up = False backend_up = False
except ConnectionError: except ConnectionError:
print('Unable to connect to the redis indexing db.') console.print('Unable to connect to the redis indexing db.')
backend_up = False backend_up = False
return backend_up return backend_up
@ -77,28 +79,31 @@ if __name__ == '__main__':
status, message = splash_status() status, message = splash_status()
if status: if status:
print(message) console.print(f'[green]{message}[/green]')
else: else:
print('Splash is down: ', message) console.print('Splash is [bold red]down[/bold red]: ', message)
m = Monitoring() m = Monitoring()
backend_up = m.backend_status backend_up = m.backend_status
if not backend_up: if not backend_up:
print('Backend not up, breaking.') console.print('[bold red]Backend not up, breaking.[/bold red]')
sys.exit() sys.exit()
print('Services currently running:') console.print('Services currently running:')
running = AbstractManager.is_running() running = AbstractManager.is_running()
for service, number in running: for service, number in running:
print(service, f'({int(number)} service(s))') s = Padding(f'{service} ({int(number)} service(s))', (0, 2))
console.print(s)
print('Current queues:') console.print('Current queues:')
for q, priority in m.queues: for q, priority in m.queues:
print(q, f'Priority: {int(priority)}') s = Padding(f'{q} Priority: {int(priority)}', (0, 2))
console.print(s)
# ------------------ # ------------------
print('Captures details:') console.print('Captures details:')
captures = m.ongoing_captures captures = m.ongoing_captures
print('Queue length', len(captures)) console.print(f'Queue length: [yellow]{len(captures)}[/yellow]')
for uuid, rank, d in captures: for uuid, rank, d in captures:
print(uuid, f'Rank: {int(rank)}') a = Padding(f'{uuid} Rank: {int(rank)}', (0, 2))
print(json.dumps(d, indent=2)) console.print(a)
console.print(d)