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 0Cara 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 otomatisasiEdit 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:
Pengecekan multiple interface - Mendukung semua interface WiFi
Cooldown - Mencegah restart terlalu sering
Max retries - Batasan percobaan restart
Logging - Mencatat semua aktivitas
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