Cara Memonitoring Files Pada Server Linux

install plugin pendukung


pip install requests python-telegram-bot
pip install telebot watchdog
pip3 install aiohttp

Buat file dengan nama monitoring_files.py

import os
import requests
import asyncio
import aiohttp
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# Token bot Telegram dan ID chat
BOT_TOKEN = 'Token_ID_Telegram'
CHAT_ID = 'ID_chat-telegram' # id user telegram atau group

# URL atau direktori yang akan dipantau
WATCH_DIRECTORY = '/var/www/html/'  # contoh lokasi file yang akan dipantau silahkan sesuaikan

# Direktori yang ingin dikecualikan
EXCLUDED_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 file
last_notified = {}

# Fungsi untuk mengirim pesan ke Telegram secara asinkron
async 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 file
class FileChangeHandler(FileSystemEventHandler):

    def on_created(self, event):
        if event.is_directory:
            return
        self.handle_event(event, 'created')

    def on_modified(self, event):
        if event.is_directory:
            return
        self.handle_event(event, 'modified')

    def on_deleted(self, event):
        if event.is_directory:
            return
        self.handle_event(event, 'deleted')

    def handle_event(self, event, event_type):
        file_name = event.src_path

        # Cek apakah file berada di dalam direktori yang dikecualikan
        if 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 diinginkan
        if 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 notifikasi
            current_time = time.time()

            # Jika file belum pernah diberi notifikasi atau sudah lewat dari interval yang ditentukan
            if 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 notifikasi
                last_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 file
if __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 blocking
        observer.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_watches

Tingkatkan 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=524288

Buat perubahan ini permanen: Agar perubahan ini bertahan setelah reboot, kamu bisa menambahkan pengaturan ini ke file /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Tambahkan baris berikut ke dalam file tersebut:

fs.inotify.max_user_watches=524288

Setelah 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.

 

Related Articles