Added overall traffic stats. Restoring on reboot.

This commit is contained in:
root
2022-06-17 03:58:25 +03:00
parent 49e480a2ab
commit 5f5fa158f8
2 changed files with 41 additions and 1 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@ __pycache__/
clients/ clients/
server.key server.key
server.pub server.pub
stats.bin
*.conf *.conf
*.conf_old *.conf_old
!wpm_example.conf !wpm_example.conf

41
bot.py
View File

@ -6,6 +6,9 @@ import logging
import os import os
import sys import sys
import configparser import configparser
import threading
import pickle
from time import sleep
from hurry.filesize import size from hurry.filesize import size
from subprocess import call from subprocess import call
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
@ -39,6 +42,36 @@ def _help(update, context):
parse_mode='HTML', parse_mode='HTML',
disable_web_page_preview=True) disable_web_page_preview=True)
def save_stats():
while True:
stat = wg_json(config)
peer_names = dict()
peers = dict()
for peer in wg_list_peers():
peer_names[peer['ip']] = peer['name']
for _if in stat.items():
for peer in _if[1]['peers']:
peers[peer['allowed_ips'][0]] = {
"name": peer_names[peer['allowed_ips'][0]],
"rx": int(peer["transfer_rx"]),
"tx": int(peer["transfer_tx"]),
}
try:
read_stats = pickle.load(open("stats.bin", "rb"))
except FileNotFoundError:
read_stats = None
if read_stats:
for peer in peers:
if read_stats[peer]["rx"] >= peers[peer]["rx"]:
peers[peer]["rx"] += read_stats[peer]["rx"]
peers[peer]["tx"] += read_stats[peer]["tx"]
pickle.dump(peers, open("stats.bin", "wb"))
sleep(60)
save_stat_thread = threading.Thread(target=save_stats)
save_stat_thread.start()
def auth(handler): def auth(handler):
def wrapper(update, context): def wrapper(update, context):
if update.message.chat.username not in admin: if update.message.chat.username not in admin:
@ -97,6 +130,7 @@ def del_peer(update, context):
@auth @auth
def status(update, context): def status(update, context):
stat = wg_json(config) stat = wg_json(config)
overall_stats = pickle.load(open("stats.bin", "rb"))
peer_names = dict() peer_names = dict()
for peer in wg_list_peers(): for peer in wg_list_peers():
peer_names[peer['ip']] = peer['name'] peer_names[peer['ip']] = peer['name']
@ -113,7 +147,12 @@ def status(update, context):
peers_sorted = sorted(peers.items(), key=lambda x: x[1]['total'], reverse=True) peers_sorted = sorted(peers.items(), key=lambda x: x[1]['total'], reverse=True)
peers_sorted = list(filter(lambda x: (x[1]['total'] != 0), peers_sorted)) peers_sorted = list(filter(lambda x: (x[1]['total'] != 0), peers_sorted))
for peer in peers_sorted: for peer in peers_sorted:
t_msg = f" * <b>{peer[1]['name']}\n {peer[0]}</b>\n <b>Total</b> {size(peer[1]['total'])}<b> RX</b>: {size(peer[1]['rx'])} <b>TX</b>: {size(peer[1]['tx'])}" t_msg = (
f" 🔹 <b>{peer[1]['name']}\n {peer[0]}</b>\n "
f"<b>Overall stats</b> {size(overall_stats[peer[0]]['rx'] + overall_stats[peer[0]]['tx'])} "
f"RX/TX: {size(overall_stats[peer[0]]['rx'])}/{size(overall_stats[peer[0]]['tx'])}\n "
f"<b>Since last run</b> {size(peer[1]['total'])} RX/TX: {size(peer[1]['rx'])}"
f"/{size(peer[1]['tx'])}")
if len(t_msg + "\n".join(msg)) >= tg_max_len: if len(t_msg + "\n".join(msg)) >= tg_max_len:
msg = "\n".join(msg) msg = "\n".join(msg)
update.message.reply_text(f"{msg}", parse_mode='HTML',) update.message.reply_text(f"{msg}", parse_mode='HTML',)