#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Este script busca procesos activos de "udp-sender", y si encuentra alguno devuelve el pid y la imagen asociada de cada uno de ellos, en una estructura JSON. Si no encuentra ninguno, o si se produce un error, imprime un mensaje informativo. No recibe ningún parámetro. En la práctica, permite comprobar las transminisones UDPcast activas, porque cuando finalizan también finaliza el proceso asociado. """ # -------------------------------------------------------------------------------------------- # IMPORTS # -------------------------------------------------------------------------------------------- import subprocess import json import sys # -------------------------------------------------------------------------------------------- # VARIABLES # -------------------------------------------------------------------------------------------- repo_path = '/opt/opengnsys/ogrepository/images/' # No borrar la barra final # -------------------------------------------------------------------------------------------- # FUNCTIONS # -------------------------------------------------------------------------------------------- def get_udpsender_processes(): """ Busca procesos de "udp-sender", y si los encuentra retorna el pid, el ID, y la imagen asociada de cada uno de ellos, en un diccionario. Si no encuentra ningun proceso, o si se produce un error, retorna un mensaje. """ try: # Obtenemos todos los procesos, y almacenamos la salida y los errores: result = subprocess.Popen(['ps', '-aux'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8') out, error = result.communicate() # Almacenamos en una lista los procesos que contengan "udp-sender": process_list = [line for line in out.split('\n') if 'udp-sender' in line] # Si hemos encontrado procesos de udp-sender creamos un diccionario para almacenarlos: if process_list != []: result_dict = {} # Iteramos los procesos y extraemos el pid, el nombre de la imagen (con subdirectorio de OU, si es el caso), y la ruta de la imagen de cada uno: for process in process_list: pid = process.split()[1] image_name = process.split(repo_path)[1] image_path = process.split('--file ')[1] # Obtenemos el ID de la imagen actual: with open(f"{image_path}.full.sum", 'r') as file: image_id = file.read().strip('\n') # Creamos una clave en el diccionario de resultados, correspondiente a la imagen actual: result_dict[pid] = {'image_id':image_id, 'image_name':image_name} # Retornamos el diccionario de resultados: return result_dict # Si no hemos encontrado procesos de udp-sender retrornamos un mensaje: else: return "udp-sender process not found" # Si se ha producido una excepción, retornamos un mensaje: except Exception: return "Unexpected error" # -------------------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------------------- def main(): """ """ # Obtenemos información sobre los procesos de udp-sender: results = get_udpsender_processes() # Si no hay procesos activos, o si se ha producido un error, imprimimos un mensaje explicativo, y salimos del script: if results == "udp-sender process not found": print("No UDPcast active transmissions") sys.exit(1) elif results == "Unexpected error": print("Unexpected error checking UDPcast transmissions") sys.exit(2) # Si hay procesos activos, convertimos el diccionario de resultados a JSON, e imprimimos este: else: json_data = json.dumps(results, indent=4) print(json_data) # -------------------------------------------------------------------------------------------- if __name__ == "__main__": main() # --------------------------------------------------------------------------------------------