VYOS: scheduler untuk cek host dan add delete static route table di vyos menggunakan python

 sori judulnya susah banget, kalau di mikrotik namanya scheduler, berhubung ini di vyos dan menggunakan bahasa python saya namakan vythonjob hahaha :v

import os
import subprocess
import time

NEXT_HOP = "10.10.10.2"
ROUTE_TABLE = "100"
CHECK_COUNT = 3
PING_INTERVAL = 1
CHECK_INTERVAL = 10  # Interval pengecekan dalam detik


def set_env_var(key, value):
    """Set environment variable."""
    os.environ[key] = value


def get_env_var(key, default=None):
    """Get environment variable with a default value."""
    return os.environ.get(key, default)


def is_host_up(host):
    """Periksa apakah host dapat dijangkau dengan ping."""
    try:
        subprocess.run(
            ["ping", "-c", str(CHECK_COUNT), "-i", str(PING_INTERVAL), host],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            check=True,
        )
        return True
    except subprocess.CalledProcessError:
        return False


def is_route_exist():
    """Periksa apakah route sudah ada di tabel routing menggunakan vtysh."""
    try:
        # Jalankan perintah vtysh untuk melihat tabel routing
        command = f"vtysh -c 'show ip route table {ROUTE_TABLE}'"
        result = subprocess.run(
            command,
            shell=True,  # Perlu shell=True untuk menjalankan perintah CLI
            stdout=subprocess.PIPE,
            text=True,
            check=True,
        )
        # Periksa apakah NEXT_HOP ada dalam output
        return NEXT_HOP in result.stdout
    except subprocess.CalledProcessError as e:
        print(f"Error saat memeriksa route dengan vtysh: {e}")
        return False


def add_route():
    """Tambahkan static route ke VyOS."""
    try:
        commands = f"""
        source /opt/vyatta/etc/functions/script-template
        configure
        set protocols static table {ROUTE_TABLE} route 0.0.0.0/0 next-hop {NEXT_HOP}
        commit
        exit
        """
        subprocess.run(["vbash", "-c", commands], check=True, text=True)
        print(f"Static route ke next-hop {NEXT_HOP} telah ditambahkan.")
    except subprocess.CalledProcessError as e:
        print(f"Error saat menambahkan static route: {e}")


def remove_route():
    """Hapus static route dari VyOS."""
    try:
        commands = f"""
        source /opt/vyatta/etc/functions/script-template
        configure
        delete protocols static table {ROUTE_TABLE} route 0.0.0.0/0
        commit
        exit
        """
        subprocess.run(["vbash", "-c", commands], check=True, text=True)
        print(f"Static route ke next-hop {NEXT_HOP} telah dihapus.")
    except subprocess.CalledProcessError as e:
        print(f"Error saat menghapus static route: {e}")


def main():
    """Fungsi utama untuk memeriksa dan memperbarui status."""
    last_host_status = get_env_var("LAST_HOST_STATUS", "None")

    current_host_status = is_host_up(NEXT_HOP)
    current_route_status = is_route_exist()

    if str(current_host_status) != last_host_status:
        print(f"Host status berubah: {last_host_status} -> {current_host_status}")
        if current_host_status:
            if not current_route_status:
                print("Menambahkan route karena host up.")
                add_route()
        else:
            if current_route_status:
                print("Menghapus route karena host down.")
                remove_route()
    else:
        print("Tidak ada perubahan status host.")

    # Simpan status saat ini di environment
    set_env_var("LAST_HOST_STATUS", str(current_host_status))


if __name__ == "__main__":
    while True:
        main()
        print(f"Menunggu {CHECK_INTERVAL} detik sebelum pengecekan berikutnya...")
        time.sleep(CHECK_INTERVAL)