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)