install plugin pendukung
pip install requests python-telegram-botpip install telebot watchdogpip3 install aiohttp
Buat file dengan nama monitoring_files.py
import osimport requestsimport asyncioimport aiohttpimport timefrom watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandler
# Token bot Telegram dan ID chatBOT_TOKEN = 'Token_ID_Telegram'CHAT_ID = 'ID_chat-telegram' # id user telegram atau group
# URL atau direktori yang akan dipantauWATCH_DIRECTORY = '/var/www/html/' # contoh lokasi file yang akan dipantau silahkan sesuaikan
# Direktori yang ingin dikecualikanEXCLUDED_DIRECTORIES = set(['/var/www/html/xxx/admin/tmp/', '/var/www/html/xxx/tmp/']) # contoh lokasi silahkan sesuaikan
# Waktu minimum antara pengiriman notifikasi (dalam detik)NOTIFY_INTERVAL = 2 # 2 detik
# Menyimpan timestamp terakhir notifikasi untuk setiap filelast_notified = {}
# Fungsi untuk mengirim pesan ke Telegram secara asinkronasync def send_telegram_message(message):url = f'https://api.telegram.org/bot{BOT_TOKEN}/sendMessage'payload = {'chat_id': CHAT_ID,'text': message,'parse_mode': 'Markdown' # Menambahkan mode Markdown}
async with aiohttp.ClientSession() as session:async with session.post(url, data=payload) as response:return await response.text()
# Event handler untuk memantau perubahan fileclass FileChangeHandler(FileSystemEventHandler):
def on_created(self, event):if event.is_directory:returnself.handle_event(event, 'created')
def on_modified(self, event):if event.is_directory:returnself.handle_event(event, 'modified')
def on_deleted(self, event):if event.is_directory:returnself.handle_event(event, 'deleted')
def handle_event(self, event, event_type):file_name = event.src_path
# Cek apakah file berada di dalam direktori yang dikecualikanif any(file_name.startswith(excluded) for excluded in EXCLUDED_DIRECTORIES):return # Lewati event ini jika file berada di direktori yang dikecualikan
# Filter file dengan ekstensi yang diinginkanif file_name.endswith(('.rar', '.7zip', '.gz', '.tar.gz', '.tar', '.zip', '.gif', '.exe', '.htaccess', '.png', '.bat', '.sh', '.jpeg', '.jpg', '.pdf', '.php', '.html', '.env', '.txt', '.cgi', '.py', '.asp', '.aspx')):# Periksa timestamp terakhir notifikasicurrent_time = time.time()
# Jika file belum pernah diberi notifikasi atau sudah lewat dari interval yang ditentukanif file_name not in last_notified or current_time - last_notified[file_name] > NOTIFY_INTERVAL:message = f"*File {event_type}:*\n {file_name} \n *mohon segera diperiksa jika merasa tidak melakukan akses*"asyncio.run(self.send_notification(message))
# Update timestamp terakhir notifikasilast_notified[file_name] = current_time
async def send_notification(self, message):"""Fungsi untuk mengirim pesan menggunakan send_telegram_message"""await send_telegram_message(message)
# Memulai pemantauan fileif __name__ == "__main__":event_handler = FileChangeHandler()observer = Observer()observer.schedule(event_handler, WATCH_DIRECTORY, recursive=True)observer.start()
try:# Gunakan observer.join() untuk menunggu event handler tanpa blockingobserver.join()except KeyboardInterrupt:observer.stop()observer.join()
save file tersebut dengan nama monitoring_files.py
kemudian ketik perintah
chmod +x monitoring_files.py
jalankan file tersebut
python3 monitoring_files.py
jika mengalami kendala tidak bisa maximum file yang bisa di pantau
(OSError: [Errno 28] inotify watch limit reached) menunjukkan bahwa kamu telah mencapai batas maksimum jumlah file atau direktori yang dapat dipantau oleh inotify, yang digunakan oleh watchdog untuk memantau perubahan pada sistem file.
Solusi:
Kamu bisa mengatasi masalah ini dengan cara berikut:
1. Meningkatkan Batas inotify Watcher:
Kamu dapat meningkatkan jumlah maksimum watcher yang diizinkan oleh sistem dengan mengubah nilai parameter fs.inotify.max_user_watches.
Untuk melakukannya, ikuti langkah-langkah berikut:
Periksa nilai batas saat ini: Jalankan perintah berikut untuk memeriksa batas saat ini:
cat /proc/sys/fs/inotify/max_user_watchesTingkatkan batas inotify: Ubah nilai ini untuk meningkatkan jumlah file dan direktori yang dapat dipantau oleh inotify. Misalnya, untuk mengatur batas menjadi 524288:
sudo sysctl fs.inotify.max_user_watches=524288Buat perubahan ini permanen: Agar perubahan ini bertahan setelah reboot, kamu bisa menambahkan pengaturan ini ke file /etc/sysctl.conf:
sudo nano /etc/sysctl.confTambahkan baris berikut ke dalam file tersebut:
fs.inotify.max_user_watches=524288Setelah itu, jalankan perintah berikut untuk menerapkan perubahan:
sudo sysctl -p
2. Mengurangi Jumlah Direktori yang Dipantau:
Jika kamu memantau banyak file atau direktori, coba untuk memantau direktori yang lebih spesifik atau mengurangi jumlah direktori yang dipantau secara rekursif.
3. Menggunakan Alternatif untuk watchdog:
Jika kamu terus menghadapi masalah dengan inotify, kamu bisa mencoba alternatif lain seperti menggunakan Polling dengan watchdog. Polling akan lebih lambat, tetapi tidak terikat oleh batas inotify. Untuk mengaktifkan polling, ubah kode di bagian ini:
observer = Observer()observer.schedule(event_handler, WATCH_DIRECTORY, recursive=True)observer.start()Menjadi:
observer = Observer(timeout=1)observer.schedule(event_handler, WATCH_DIRECTORY, recursive=True)observer.start()Setelah meningkatkan batas atau menggunakan salah satu solusi di atas, coba jalankan skrip lagi dan lihat apakah masalahnya teratasi.