#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Este script devuelve información de CPU, memoria RAM, disco duro y el estado de ciertos servicios y procesos de ogRepository, en formato json. También comprueba si ogGit está instalado en el repositorio, y devuelve dicha información. No recibe ningún parámetro. Librerías Python requeridas: "psutil" (se puede instalar con "sudo apt install python3-psutil". o "pip install psutil") """ # -------------------------------------------------------------------------------------------- # IMPORTS # -------------------------------------------------------------------------------------------- import psutil import os import json import subprocess # -------------------------------------------------------------------------------------------- # VARIABLES # -------------------------------------------------------------------------------------------- config_file = '/opt/opengnsys/ogrepository/etc/ogAdmRepo.cfg' # -------------------------------------------------------------------------------------------- # FUNCTIONS # -------------------------------------------------------------------------------------------- def get_oggit_info(): """ Obtiene el valor asociado a la variable "oggit", desde el archivo '/opt/opengnsys/ogrepository/etc/ogAdmRepo.cfg'. Retorna el valor asociado capitalizado ("True" o "False"). """ with open(config_file, 'r') as file: for line in file: if line.startswith('oggit'): oggit_info = line.split('=')[1].strip() return oggit_info.capitalize() def get_cpu_info(): """ Obtiene y retorna información de la CPU. """ cpu_percent = psutil.cpu_percent(interval=1) return cpu_percent def get_ram_info(): """ Obtiene y retorna información de la memoria RAM. """ ram = psutil.virtual_memory() return ram.total, ram.used, ram.available, ram.percent def get_disk_info(): """ Obtiene y retorna información del disco duro. """ disk = psutil.disk_usage('/') return disk.total, disk.used, disk.free, disk.percent def get_service_status(service): """ Obtiene y retorna el estado del servicio que recibe como parámetro. En caso de error, retorna un mensaje estándar. """ try: result = subprocess.run(['systemctl', 'is-active', service], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8') service_status = result.stdout.strip() return service_status except Exception: return "status not accesible" def get_process_status(process): """ Obtiene y retorna el estado del proceso que recibe como parámetro. """ for proc in psutil.process_iter(['name']): if proc.info['name'] in process: return 'running' # Esto no debe ir asociado a un "else" (porque comprueba todos los procesos): return 'stopped' # -------------------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------------------- def main(): """ """ # Comprobamos si ogGit está instalado en el repositorio o no: oggit_installed = get_oggit_info() # Obtenemos información de la CPU: cpu_percent = get_cpu_info() # Obtenemos información de la memoria RAM: total_ram, used_ram, available_ram, percent_ram = get_ram_info() # Obtenemos información del disco duro: total_disk, used_disk, free_disk, percent_disk = get_disk_info() # Obtenemos el estado de los servicios listados, que almacenamos en un diccionario: service_list = ['ssh', 'smbd', 'rsync'] services_status = {service: get_service_status(service) for service in service_list} # Obtenemos el estado de los procesos listados, que almacenamos en un diccionario: process_list = ['udp-sender', 'uftp', 'bttrack', 'btlaunchmany.bittornado'] process_status = {process: get_process_status(process) for process in process_list} # Creamos un diccionario con toda la información obtenida: data_dict = { 'oggit': { 'installed': oggit_installed }, 'cpu': { 'used_percentage': f"{int(cpu_percent)}%" }, 'ram': { 'total': f"{round(total_ram / (1024 ** 3), 1)}GB", 'used': f"{round(used_ram / (1024 ** 3), 1)}GB", 'available': f"{round(available_ram / (1024 ** 3), 1)}GB", 'used_percentage': f"{int(percent_ram)}%" }, 'disk': { 'total': f"{round(total_disk / (1024 ** 3), 1)}GB", 'used': f"{round(used_disk / (1024 ** 3), 1)}GB", 'available': f"{round(free_disk / (1024 ** 3), 1)}GB", 'used_percentage': f"{int(percent_disk)}%" }, 'services': services_status, 'processes': process_status } # Convertimos el diccionario a JSON, y lo imprimimos: json_data = json.dumps(data_dict, indent=4) print(json_data) # -------------------------------------------------------------------------------------------- if __name__ == "__main__": main() # --------------------------------------------------------------------------------------------