ogrepository/bin/getUDPcastInfo.py

100 lines
4.3 KiB
Python

#!/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()
# --------------------------------------------------------------------------------------------