import logging from dataclasses import dataclass from typing import Optional from typing_extensions import override import psutil import requests from urllib3.exceptions import NameResolutionError from core.services.SystemService import SystemService log = logging.getLogger(__name__) @dataclass class PsutilSystemService(SystemService): @override def getMaxRamMbAvailable(self) -> float: return psutil.virtual_memory().total / 10**6 @override def getIp(self) -> str: return requests.get('https://checkip.amazonaws.com').text.strip() @override def getCpuUtilization(self) -> float: return psutil.cpu_percent(interval=None) @override def getRamMbAvailable(self) -> float: return psutil.virtual_memory().available / 10**6 @override def getCpuAvailable(self) -> int: count = 0 for utilization in psutil.cpu_percent(percpu=True): if utilization < 25: count += 1 return count @override def getProcessCpu(self, pid: int = None) -> Optional[float]: proc = psutil.Process(pid=pid) return proc.cpu_percent(interval=None) @override def getProcessRam(self, pid: int = None) -> Optional[float]: proc = psutil.Process(pid=pid) return proc.memory_info().rss / 10**6 @override def killProcess(self, pid: int = None): proc = psutil.Process(pid=pid) proc.kill() @override def terminateProcess(self, pid: int = None): proc = psutil.Process(pid=pid) proc.terminate()