fix: add docker CLI and host passwd mount
This commit is contained in:
@@ -592,63 +592,59 @@ def get_all_stats():
|
|||||||
# ────────────────────────────────────────────────────────────────
|
# ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def get_system_info():
|
def get_system_info():
|
||||||
"""
|
if RUNNING_ON_MAIN_SERVER:
|
||||||
Collect all system metrics in a SINGLE SSH call instead of 8 separate ones.
|
# Read directly from /proc (works in container with host /proc)
|
||||||
Emits a pipe-delimited line: cpu|mem|mem_pct|disk|disk_pct|load|uptime|docker_v|hostname
|
try:
|
||||||
"""
|
# CPU
|
||||||
batch_cmd = (
|
with open('/proc/stat') as f:
|
||||||
"printf '%s|%s|%s|%s|%s|%s|%s|%s|%s\\n' "
|
cpu = f.readline().split()
|
||||||
"\"$(top -bn1 | grep 'Cpu(s)' | awk '{print $2+$4}')\" "
|
idle = int(cpu[4])
|
||||||
"\"$(free -m | awk 'NR==2{printf \"%s/%sMB\", $3, $2}')\" "
|
total = sum(int(x) for x in cpu[1:])
|
||||||
"\"$(free | awk 'NR==2{printf \"%.0f\", $3/$2*100}')\" "
|
cpu_pct = round(100 * (1 - idle/total), 1) if total else 0
|
||||||
"\"$(df -h / | awk 'NR==2{printf \"%s/%s\", $3, $2}')\" "
|
|
||||||
"\"$(df / | awk 'NR==2{print $5}' | tr -d '%')\" "
|
|
||||||
"\"$(cat /proc/loadavg | awk '{print $1, $2, $3}')\" "
|
|
||||||
"\"$(uptime -p)\" "
|
|
||||||
"\"$(docker --version 2>/dev/null | cut -d' ' -f3 | tr -d ',')\" "
|
|
||||||
"\"$(hostname -f 2>/dev/null || hostname)\""
|
|
||||||
)
|
|
||||||
|
|
||||||
stdout, stderr = _ssh_main(batch_cmd, timeout=20)
|
# Memory
|
||||||
|
mem = {}
|
||||||
|
with open('/proc/meminfo') as f:
|
||||||
|
for line in f:
|
||||||
|
k, v = line.split(':')
|
||||||
|
mem[k.strip()] = int(v.strip().split()[0])
|
||||||
|
mem_total_mb = mem['MemTotal'] // 1024
|
||||||
|
mem_used_mb = (mem['MemTotal'] - mem['MemAvailable']) // 1024
|
||||||
|
mem_pct = round(100 * mem_used_mb / mem_total_mb) if mem_total_mb else 0
|
||||||
|
|
||||||
# Parse the pipe-delimited result
|
# Disk
|
||||||
if stdout and '|' in stdout:
|
import shutil
|
||||||
# Use the last line in case there's extra output
|
disk = shutil.disk_usage('/')
|
||||||
for line in reversed(stdout.splitlines()):
|
disk_used_gb = round(disk.used / 1024**3, 1)
|
||||||
line = line.strip()
|
disk_total_gb = round(disk.total / 1024**3, 1)
|
||||||
if '|' in line:
|
disk_pct = round(100 * disk.used / disk.total)
|
||||||
parts = line.split('|')
|
|
||||||
if len(parts) >= 9:
|
|
||||||
return {
|
|
||||||
'cpu_pct': parts[0] or '0',
|
|
||||||
'memory': parts[1] or 'N/A',
|
|
||||||
'mem_pct': parts[2] or '0',
|
|
||||||
'disk': parts[3] or 'N/A',
|
|
||||||
'disk_pct': parts[4] or '0',
|
|
||||||
'load': parts[5] or 'N/A',
|
|
||||||
'uptime': parts[6] or 'N/A',
|
|
||||||
'docker_v': parts[7] or 'N/A',
|
|
||||||
'hostname': parts[8] or 'main server',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fallback: individual calls if batch failed
|
# Load
|
||||||
cpu_out, _ = _ssh_main("top -bn1 | grep 'Cpu(s)' | awk '{print $2+$4}'")
|
with open('/proc/loadavg') as f:
|
||||||
mem_out, _ = _ssh_main("free -m | awk 'NR==2{printf \"%s/%sMB\", $3, $2}'")
|
load = f.read().split()[:3]
|
||||||
mem_pct, _ = _ssh_main("free | awk 'NR==2{printf \"%.0f\", $3/$2*100}'")
|
|
||||||
disk_out, _ = _ssh_main("df -h / | awk 'NR==2{printf \"%s/%s\", $3, $2}'")
|
# Uptime
|
||||||
disk_pct, _ = _ssh_main("df / | awk 'NR==2{print $5}' | tr -d '%'")
|
with open('/proc/uptime') as f:
|
||||||
load_out, _ = _ssh_main("cat /proc/loadavg | awk '{print $1, $2, $3}'")
|
secs = int(float(f.read().split()[0]))
|
||||||
uptime, _ = _ssh_main("uptime -p")
|
days = secs // 86400
|
||||||
docker_v, _ = _ssh_main("docker --version | cut -d' ' -f3 | tr -d ','")
|
hrs = (secs % 86400) // 3600
|
||||||
hostname, _ = _run("hostname -f 2>/dev/null || hostname")
|
mins = (secs % 3600) // 60
|
||||||
return {
|
uptime = f"up {days}d {hrs}h {mins}m" if days else f"up {hrs}h {mins}m"
|
||||||
'cpu_pct': cpu_out or '0',
|
|
||||||
'memory': mem_out or 'N/A',
|
# Docker version
|
||||||
'mem_pct': mem_pct or '0',
|
docker_v, _ = _run("docker --version 2>/dev/null | cut -d' ' -f3 | tr -d ','")
|
||||||
'disk': disk_out or 'N/A',
|
hostname, _ = _run("cat /proc/sys/kernel/hostname 2>/dev/null || hostname")
|
||||||
'disk_pct': disk_pct or '0',
|
|
||||||
'load': load_out or 'N/A',
|
return {
|
||||||
'uptime': uptime or 'N/A',
|
'cpu_pct': str(cpu_pct),
|
||||||
'docker_v': docker_v or 'N/A',
|
'memory': f"{mem_used_mb}/{mem_total_mb}MB",
|
||||||
'hostname': hostname or 'main server',
|
'mem_pct': str(mem_pct),
|
||||||
}
|
'disk': f"{disk_used_gb}G/{disk_total_gb}G",
|
||||||
|
'disk_pct': str(disk_pct),
|
||||||
|
'load': ' '.join(load),
|
||||||
|
'uptime': uptime,
|
||||||
|
'docker_v': docker_v or 'N/A',
|
||||||
|
'hostname': hostname.strip() or 'main server',
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
pass # fall through to SSH method
|
||||||
Reference in New Issue
Block a user