Script bash shell untuk OpenWRT yang memeriksa jumlah WiFi client yang terkoneksi dan melakukan restart jika jumlahnya 0.

 

Script dibawah digunakan untuk melakukan restart wifi bila tidak ada client yang terhubung. Script ini bisa dimanfaatkan saat wifi bengong atau terjadi interferensi dgn wifi lainnya sehingga tidak ada wifi client yang mampu terhubung.


#!/bin/sh

# Script untuk memeriksa jumlah WiFi client dan restart jika tidak ada yang terkoneksi
# Untuk OpenWRT

# Konfigurasi
LOG_FILE="/var/log/wifi_client_check.log"
RESTART_COOLDOWN=300  # Waktu tunggu dalam detik sebelum restart berikutnya (5 menit)
MIN_CLIENTS=0         # Jumlah minimum client yang diizinkan
MAX_RETRIES=3         # Maksimal percobaan restart berturut-turut

# File untuk menyimpan timestamp restart terakhir
LAST_RESTART_FILE="/tmp/wifi_last_restart"
RESTART_COUNT_FILE="/tmp/wifi_restart_count"

# Fungsi untuk menulis log
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# Fungsi untuk mendapatkan jumlah client WiFi yang terkoneksi
get_wifi_client_count() {
    # Mendapatkan daftar client yang terkoneksi ke semua interface WiFi
    # Menggunakan iw dev station dump
    local count=0
    
    # Cek semua interface wireless
    for iface in $(iw dev | grep "Interface" | awk '{print $2}'); do
        # Cek apakah interface adalah WiFi (bukan interface lain)
        if iw dev $iface info 2>/dev/null | grep -q "type managed\|type AP"; then
            # Hitung station yang terkoneksi ke interface ini
            local station_count=$(iw dev $iface station dump 2>/dev/null | grep -c "Station")
            count=$((count + station_count))
        fi
    done
    
    echo $count
}

# Fungsi untuk mendapatkan jumlah client dari luci (alternatif)
get_wifi_client_count_alternative() {
    # Menggunakan ubus (jika tersedia)
    if command -v ubus >/dev/null 2>&1; then
        local count=$(ubus call iwinfo info '{"device":"wlan0"}' 2>/dev/null | grep -o '"clients":[0-9]*' | cut -d':' -f2)
        if [ -n "$count" ]; then
            echo $count
            return
        fi
    fi
    
    # Menggunakan /proc/net/dev (kurang akurat)
    echo $(grep -c "wlan" /proc/net/dev 2>/dev/null || echo "0")
}

# Fungsi untuk restart WiFi
restart_wifi() {
    log_message "Tidak ada client WiFi terkoneksi. Melakukan restart WiFi..."
    
    # Cek cooldown
    if [ -f "$LAST_RESTART_FILE" ]; then
        local last_restart=$(cat "$LAST_RESTART_FILE")
        local current_time=$(date +%s)
        local time_diff=$((current_time - last_restart))
        
        if [ $time_diff -lt $RESTART_COOLDOWN ]; then
            log_message "Cooldown aktif. Tunggu $((RESTART_COOLDOWN - time_diff)) detik lagi."
            return 1
        fi
    fi
    
    # Cek jumlah restart berturut-turut
    local restart_count=0
    if [ -f "$RESTART_COUNT_FILE" ]; then
        restart_count=$(cat "$RESTART_COUNT_FILE")
    fi
    
    if [ $restart_count -ge $MAX_RETRIES ]; then
        log_message "Mencapai maksimal percobaan restart ($MAX_RETRIES). Menghentikan sementara..."
        echo 0 > "$RESTART_COUNT_FILE"
        return 1
    fi
    
    # Lakukan restart WiFi
    log_message "Melakukan restart WiFi (percobaan ke-$((restart_count + 1)))..."
    
    # Opsi restart berdasarkan versi OpenWRT
    if command -v wifi >/dev/null 2>&1; then
        wifi down 2>>$LOG_FILE
        sleep 2
        wifi up 2>>$LOG_FILE
        log_message "WiFi direstart menggunakan perintah wifi"
    elif command -v /etc/init.d/network >/dev/null 2>&1; then
        /etc/init.d/network restart 2>>$LOG_FILE
        log_message "Network direstart menggunakan init.d"
    else
        log_message "ERROR: Tidak ditemukan perintah untuk restart WiFi"
        return 1
    fi
    
    # Update timestamp restart
    date +%s > "$LAST_RESTART_FILE"
    
    # Update jumlah restart
    echo $((restart_count + 1)) > "$RESTART_COUNT_FILE"
    
    log_message "Restart WiFi berhasil dilakukan"
    return 0
}

# Fungsi utama
main() {
    log_message "=== Memeriksa koneksi WiFi ==="
    
    # Dapatkan jumlah client
    local client_count=$(get_wifi_client_count)
    log_message "Jumlah client WiFi terkoneksi: $client_count"
    
    # Jika tidak ada client, lakukan restart
    if [ "$client_count" -eq 0 ]; then
        log_message "Tidak ada client WiFi terkoneksi!"
        restart_wifi
        
        # Tunggu sebentar dan cek lagi setelah restart
        if [ $? -eq 0 ]; then
            sleep 10
            local new_count=$(get_wifi_client_count)
            log_message "Setelah restart, jumlah client: $new_count"
            
            if [ "$new_count" -eq 0 ]; then
                log_message "Masih tidak ada client setelah restart"
            else
                log_message "Ada $new_count client setelah restart"
                # Reset counter restart jika berhasil ada client
                if [ -f "$RESTART_COUNT_FILE" ]; then
                    echo 0 > "$RESTART_COUNT_FILE"
                fi
            fi
        fi
    else
        log_message "Ada $client_count client terkoneksi. Tidak perlu restart."
        # Reset counter restart
        if [ -f "$RESTART_COUNT_FILE" ]; then
            echo 0 > "$RESTART_COUNT_FILE"
        fi
    fi
    
    log_message "=== Selesai ==="
}

# Jalankan fungsi utama
main

exit 0


Cara Penggunaan:

1. Simpan script

Simpan script di /usr/bin/check_wifi_clients.sh


chmod +x /usr/bin/check_wifi_clients.sh


2. Jalankan secara manual

/usr/bin/check_wifi_clients.sh



3. Tambahkan ke cron untuk otomatisasi

Edit crontab:

crontab -e



Tambahkan baris berikut untuk menjalankan setiap 1 jam:


0 */1 * * * /usr/bin/check_wifi_clients.sh





4. Alternatif - Menggunakan procd (OpenWRT service)

Buat file init script di /etc/init.d/check_wifi:


#!/bin/sh /etc/rc.common

START=99
STOP=10
USE_PROCD=1

start_service() {
    procd_open_instance
    procd_set_param command /usr/bin/check_wifi_clients.sh
    procd_set_param respawn
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

stop_service() {
    # Stop semua instance
    procd_kill
}


Aktifkan service:

chmod +x /etc/init.d/check_wifi
/etc/init.d/check_wifi enable
/etc/init.d/check_wifi start


Fitur Script:

  1. Pengecekan multiple interface - Mendukung semua interface WiFi

  2. Cooldown - Mencegah restart terlalu sering

  3. Max retries - Batasan percobaan restart

  4. Logging - Mencatat semua aktivitas

  5. Fungsi alternatif - Menggunakan berbagai metode untuk mendapatkan jumlah client

Monitoring:

Lihat log:


tail -f /var/log/wifi_client_check.log




Script ini sudah dioptimalkan untuk OpenWRT dan menggunakan command-command yang tersedia di lingkungan OpenWRT.


Comments

Popular posts from this blog

Persyaratan Domain .id Indonesia

Setting email account di blackberry