113 lines
3.0 KiB
Python
113 lines
3.0 KiB
Python
from pathlib import Path
|
|
import errno
|
|
import json
|
|
import traceback
|
|
import socket
|
|
|
|
from rich.console import Console
|
|
|
|
from stats import RouterSubscription
|
|
import time
|
|
from rich.live import Live
|
|
from rich.table import Table
|
|
import pydantic
|
|
|
|
class RouterStats(pydantic.BaseModel):
|
|
model_config = pydantic.ConfigDict(strict=True)
|
|
version: str
|
|
pid: int = pydantic.Field(ge=0)
|
|
uid: int = pydantic.Field(ge=0)
|
|
gid: int = pydantic.Field(ge=0)
|
|
cwd: str
|
|
active_sessions: int = pydantic.Field(ge=0)
|
|
http: list[str] # ['0.0.0.0:8034', '127.0.0.1:5700'],
|
|
subscriptions: list[RouterSubscription]
|
|
cheap: int = pydantic.Field(ge=0)
|
|
|
|
|
|
|
|
|
|
def run(stats_address):
|
|
if not all([stats_address.exists(), stats_address.is_socket()]):
|
|
raise Exception(f"unable to read stats from {(stats_address)}")
|
|
|
|
def unix_addr(arg):
|
|
sfamily = socket.AF_UNIX
|
|
addr = arg
|
|
return sfamily, addr, socket.gethostname()
|
|
|
|
js = ""
|
|
sfamily, addr, host = unix_addr(stats_address)
|
|
# console.info(f"{sfamily=} {str(addr)=} {host=}")
|
|
|
|
try:
|
|
s = None
|
|
s = socket.socket(sfamily, socket.SOCK_STREAM)
|
|
s.connect(str(addr))
|
|
while True:
|
|
data = s.recv(4096)
|
|
if len(data) < 1:
|
|
break
|
|
js += data.decode('utf8', 'ignore')
|
|
if s:
|
|
s.close()
|
|
except ConnectionRefusedError as e:
|
|
print('connection refused')
|
|
except FileNotFoundError as e:
|
|
print(f"socket @ {addr} not available")
|
|
except IOError as e:
|
|
if e.errno != errno.EINTR:
|
|
#uwsgi.log(f"socket @ {addr} not available")
|
|
pass
|
|
except Exception:
|
|
print(traceback.format_exc())
|
|
else:
|
|
try:
|
|
return json.loads(js)
|
|
except json.JSONDecodeError:
|
|
print(traceback.format_exc())
|
|
print(js)
|
|
|
|
if __name__ == "__main__":
|
|
stats_address = Path("run/sub2-stats.sock")
|
|
stats = run(stats_address)
|
|
print(stats)
|
|
router_stats = RouterStats(**stats)
|
|
|
|
|
|
#import ipdb; ipdb.set_trace()
|
|
table = Table()
|
|
table.add_column("Name", justify="right", style="cyan", no_wrap=True)
|
|
table.add_column("Subscription", style="magenta")
|
|
table.add_column("Worker's count", justify="right", style="green")
|
|
|
|
for sub in router_stats.subscriptions:
|
|
table.add_row("key", f"{sub.key=}", f"{len(sub.nodes)=}")
|
|
table.add_row("hash", f"{sub.hash=}")
|
|
table.add_row("hits", f"{sub.hits=}")
|
|
table.add_row("sni_enabled", f"{sub.sni_enabled=}")
|
|
#print(f"{sub.key=}")
|
|
for n in sub.nodes:
|
|
table.add_row("node's name", f"{n.name=}")
|
|
# table.add_row("node2", f"{n.name=}")
|
|
|
|
|
|
console = Console()
|
|
console.print(table)
|
|
|
|
|
|
|
|
|
|
# for field, value in router_stats.__dict__.items():
|
|
# table.add_row(field, str(value))
|
|
#
|
|
#
|
|
#
|
|
# console = Console()
|
|
# console.print(table)
|
|
#
|
|
# for i in router_stats.__dict__.items():
|
|
# print(i)
|
|
|
|
|