1
|
|
|
#!/usr/bin/python |
2
|
|
|
# -*- coding: utf-8 -*- |
3
|
|
|
from modules.logging import logging_decorator |
4
|
|
|
from telegram.ext import CommandHandler |
5
|
|
|
from telegram import ChatAction |
6
|
|
|
from datetime import datetime |
7
|
|
|
from uptime import uptime |
8
|
|
|
import platform |
9
|
|
|
import cpuinfo |
10
|
|
|
import psutil |
11
|
|
|
|
12
|
|
|
|
13
|
|
|
def module_init(gd): |
14
|
|
|
commands = gd.config["commands"] |
15
|
|
|
for command in commands: |
16
|
|
|
gd.dp.add_handler(CommandHandler(command, system)) |
17
|
|
|
|
18
|
|
|
|
19
|
|
|
def get_size(bytes, suffix="B"): |
20
|
|
|
factor = 1024 |
21
|
|
|
for unit in ["", "K", "M", "G", "T", "P"]: |
22
|
|
|
if bytes < factor: |
23
|
|
|
return f"{bytes:.2f}{unit}{suffix}" |
24
|
|
|
bytes /= factor |
25
|
|
|
|
26
|
|
|
|
27
|
|
|
def seconds_to_str(seconds): |
28
|
|
|
days, remainder = divmod(seconds, 86400) |
29
|
|
|
hours, remainder = divmod(remainder, 3600) |
30
|
|
|
minutes, seconds = divmod(remainder, 60) |
31
|
|
|
return "{} day(s), {:02} hours, {:02} minutes, {:02} seconds".format(days, hours, minutes, seconds) |
32
|
|
|
|
33
|
|
|
|
34
|
|
|
@logging_decorator("system") |
35
|
|
|
def system(bot, update): |
36
|
|
|
update.message.chat.send_action(ChatAction.TYPING) |
37
|
|
|
|
38
|
|
|
# System information |
39
|
|
|
uname = platform.uname() |
40
|
|
|
a = "="*10, " 💻 System Info ", "="*9 |
41
|
|
|
sys_header = "".join(a) |
42
|
|
|
sys_info = "{}\n\nSystem: {}\nNode Name: {}\nVersion: {}\n".format(sys_header, uname.system, uname.node, uname.version) |
43
|
|
|
|
44
|
|
|
# Uptime |
45
|
|
|
b = "="*14, " Uptime ", "="*13 |
46
|
|
|
upt_header = "".join(b) |
47
|
|
|
f = int(uptime()) |
48
|
|
|
pcuptime = seconds_to_str(f) |
49
|
|
|
up = "{}\n\nUptime: {}\n".format(upt_header, pcuptime) |
50
|
|
|
|
51
|
|
|
# CPU information |
52
|
|
|
c = "="*15, " CPU ", "="*15 |
53
|
|
|
cpu_header = "".join(c) |
54
|
|
|
cpumodel = cpuinfo.get_cpu_info()['brand'] |
55
|
|
|
cpufreq = psutil.cpu_freq() |
56
|
|
|
cpu_info = "{}\n\n{}\nPhysical cores: {}\nTotal cores: {}\nMax Frequency: {:.2f} Mhz\nCurrent Frequency: {:.2f} Mhz\nCPU Usage: {}%\n".format( |
57
|
|
|
cpu_header, cpumodel, psutil.cpu_count(logical=False), psutil.cpu_count(logical=True), cpufreq.max, cpufreq.current, psutil.cpu_percent(percpu=False, interval=1)) |
58
|
|
|
|
59
|
|
|
# RAM Information |
60
|
|
|
d = "="*15, " RAM ", "="*15 |
61
|
|
|
ram_header = "".join(d) |
62
|
|
|
svmem = psutil.virtual_memory() |
63
|
|
|
|
64
|
|
|
ram_info = "{}\n\nTotal: {}\nAvailable: {} ({:.2f}%)\nUsed: {} ({:.2f}%)\n".format( |
65
|
|
|
ram_header, get_size(svmem.total), get_size(svmem.available), 100-svmem.percent, get_size(svmem.used), svmem.percent) |
66
|
|
|
|
67
|
|
|
# HDD Information |
68
|
|
|
e = "="*15, " HDD ", "="*15, "\n" |
69
|
|
|
hdd_header = "".join(e) |
70
|
|
|
hdd_info = hdd_header |
71
|
|
|
partitions = psutil.disk_partitions() |
72
|
|
|
for partition in partitions: |
73
|
|
|
try: |
74
|
|
|
partition_usage = psutil.disk_usage(partition.mountpoint) |
75
|
|
|
except PermissionError: |
76
|
|
|
continue |
77
|
|
|
disk_info = "\nDevice: {}\nFile system: {}\nTotal Size: {}\nUsed: {} ({:.2f}%)\nFree: {} ({:.2f}%)\n".format( |
78
|
|
|
partition.device, partition.fstype, get_size(partition_usage.total), |
79
|
|
|
get_size(partition_usage.used), partition_usage.percent, get_size(partition_usage.free), |
80
|
|
|
100-partition_usage.percent) |
81
|
|
|
hdd_info = "{}{}".format(hdd_info, disk_info) |
82
|
|
|
|
83
|
|
|
# Combine everything |
84
|
|
|
server_status = "```\n{}\n{}\n{}\n{}\n{}\n```".format(sys_info, up, cpu_info, ram_info, hdd_info) |
85
|
|
|
update.message.reply_text(server_status, parse_mode="Markdown") |
86
|
|
|
|