#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import subprocess

def calcular_ifindex(slot, puerto):
    # Frmula exacta para Huawei MA5600/MA5800
    return 4194304000 + (int(slot) * 8192) + (int(puerto) * 256)

def main():
    # Validar que se reciban todos los argumentos desde PHP
    if len(sys.argv) < 7:
        print("Error: Argumentos insuficientes.")
        print("Uso: python3 snmp_control.py <IP> <Comunidad> <Accion> <Slot> <Puerto> <ONT_ID>")
        sys.exit(1)

    # --- LECTURA ESTRICTA DE ARGUMENTOS ---
    ip_olt    = sys.argv[1]
    comunidad = sys.argv[2]
    accion    = sys.argv[3]
    slot      = sys.argv[4]
    puerto    = sys.argv[5]
    ont_id    = sys.argv[6]

    ifindex = calcular_ifindex(slot, puerto)
    oid_control_base = "1.3.6.1.4.1.2011.6.128.1.1.2.46.1"

    # Mapeo de la accin a la rama MIB y el valor correspondiente
    if accion == 'deactivate':    # Suspender / Corte (Admin Down)
        rama = "1"
        valor = "2"
    elif accion == 'activate':    # Reconectar (Admin Up)
        rama = "1"
        valor = "1"
    elif accion == 'reboot':      # Reiniciar fsicamente
        rama = "2"
        valor = "1"
    elif accion == 'reregister':  # Re-registrar ONT
        rama = "3"
        valor = "1"
    else:
        print(f"Error: Accin '{accion}' no reconocida por el motor SNMP.")
        sys.exit(1)

    # Construccin del OID final
    oid_final = f"{oid_control_base}.{rama}.{ifindex}.{ont_id}"
    
    # Comando nativo del sistema usando RUTA ABSOLUTA para evitar fallos de www-data
    comando = ["/usr/bin/snmpset", "-v2c", "-c", comunidad, ip_olt, oid_final, "i", str(valor)]
    
    try:
        # Ejecutamos el comando. Capturamos stderr para debug, ignoramos stdout si es exitoso
        resultado = subprocess.run(comando, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, text=True)
        
        if resultado.returncode == 0:
            # Salida limpia, PHP lo interpretar como xito
            sys.exit(0)
        else:
            # Hubo un error a nivel de red o permisos
            print(f"Error SNMP: {resultado.stderr.strip()}")
            sys.exit(1)
            
    except Exception as e:
        print(f"Error de sistema al ejecutar snmpset: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
