spiff 25.02.2009 10:43
0byte — Мониторинг FTP-сервера (новый взгляд)
FTP сервер на десктопе
Возникла необходимость на обычной рабочей машине поднять ftp-сервер. Наряду с этим появился и интерес, что именно качают пользователи с моего ftp. Конечно, Вы скажите unix-way tail -f /var/log/blablablaftplog. Но я пошел другим путем...
Напоминаю что данный метод оправдывает себя только на десктопной машине (с исками и гномом в часности), для серверной машины подойдет и unix-way.
Набор софта
Все это собиралось, тестировалось, и теперь прекрасно юзается используется на Ubuntu 8.10/Gnome.
Нам понадобится:
pure-ftpd - для организации сервера FTPlibnotify - по умолчанию должна быть в любом гноме python 2.5 и вышеPyNotify - сборка libnotify для питона
Приступим
Ставим софт:
(у меня так)
sudo apt-get install pure-ftp libnotify pynotify
останавливаем фтп сервер
sudo /etc/init.d/pure-ftpd stop
открываем зупскающий скрипт
sudo vim /etc/init.d/pure-ftpd
(Нас интересует только анонимный ftp сервер)
все косим что в нем и пишем следующий код
#! /bin/sh
NAME=/etc/init.d/pure-ftpd
PATH=/sbin:/bin:/usr/sbin:/usr/bin
RUN_STRING="pure-ftpd -4 -A -B -M -e -U 022:022 -O /var/log/pure-ftpd/transfer.log"
KILL_STRING=pure-ftpd
case "$1" in
start)
echo -n "Starting anonymous FTP server ... "
eval $RUN_STRING
echo
;;
stop)
echo -n "Stopping anonymous FTP server ... "
killall $KILL_STRING
echo
;;
*)
echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
добавляем в систему пользователя ftp
sudo useradd ftp
в качестве домашнего каталога указываем ему тот, который будет открыт анонимоусам при входе на сервер.
теперь стартуем сервер
sudo /etc/init.d/pure-ftpd start
теперь у нас полноценный анонимный ftp сервер
Пишем систему мониторинга
файл notify.py (выбрасывает уведомление в правом нижнем углу с теском котрый ему передали в качестве аргументов)
например "python notify.py WeLinux" вобщем понятно.. вот код файла.
import pynotify
from sys import argv
arg_str = ""
for arg in argv<1:>:
arg_str = arg_str + " " + arg
pynotify.init("PyNotify")
n = pynotify.Notification("PyNotify", "%s" % arg_str, "gtk.STOCK_INFO")
n.set_urgency(pynotify.URGENCY_NORMAL)
n.set_timeout(5000)
# n.set_timeout(pynotify.EXPIRES_NEVER)
n.show()
теперь напишем непосредственно следилку. (файл ftp-monitor.sh)
это шел скрипт, который каждые 10 сек, проверяет не обновился ли лог, и если обновился выбрасывает notification
#!/bin/sh
#
# monitoring ftp server
#
DELAY=10
LOG=/var/log/pure-ftpd/transfer.log
row=`tail -1 $LOG`
while true
do
sleep $DELAY
new_row=`tail -1 $LOG`
if < "$row" != "$new_row" >
then
python notify.py $new_row; row=$new_row;
fi
done
осталось все запустить:
sudo ./ftp-monitor.sh > /dev/null &
и как только кто то что то качает я вижу такое сообщение:
сеть около около 200 машин, качают не так уж и часто, поэтому не задалбывают). Да и вобще в любой момент процесс можно кикнуть и все. Порой просто возникает не то необходимость (например для статистики о популярности фильмов) не то интерес (от делать нефиг) посмотреть что с тебя тянут, а лезть для это в логи лень.
Я не очень много понимаю в шелл-скриптах, но разве ваш ftp-monitor.sh не будет просто раз в десять секунд кидать только последнюю строчку в логе? О_о
Вы от части правы... Он будет кидать не просто поледнюю, а именоо последнюю и новую строчку. Да есть проблема, например если за период в 10 сек, скачают более одного файла, то мне будет выдана инфа только о последнем.
Решается очень просто ... надо сократить время до скажем 1 сек, но тогда машинке будет тяжеловато.. Есть еще вариант с более подробным анализом файла лога и сравнением его с предудыщей версией файла, но это трудоемко, машине это не надо.
Поэтому если у Вас будут версии как более эффективно организовать проверку файла логово, и на озадачивать сильно машину, я буду оч. признателен.
Решается очень просто ... надо сократить время до скажем 1 сек, но тогда машинке будет тяжеловато.. Есть еще вариант с более подробным анализом файла лога и сравнением его с предудыщей версией файла, но это трудоемко, машине это не надо.
Поэтому если у Вас будут версии как более эффективно организовать проверку файла логово, и на озадачивать сильно машину, я буду оч. признателен.
Самое первое, что приходит в голову - запоминать число строк, которое было в логе последний раз, и потом просто выдавать нужное число строк.
Посложнее - курить в сторону tail -f, не знаю, выйдет ли или нет.
Еще сложнее - организовать из этого лога сокет =) (как делается - вообще не знаю, но это почти наверняка несложно).
Посложнее - курить в сторону tail -f, не знаю, выйдет ли или нет.
Еще сложнее - организовать из этого лога сокет =) (как делается - вообще не знаю, но это почти наверняка несложно).
Нет, потому что это не работает. Если за 10 секунд у вас появилось несколько строк, то выведется последняя.
Проще считать, сколько строк появилось. имхо.
Проще считать, сколько строк появилось. имхо.
И выводить все строки, что появились? А если там нечто мелкофайловое качают 5 человек?
имхо, не нужно
если нужно посмотреть что в текущий момент качается — ftptop (для proftpd)
что качали — /var/log/proftpd/xferlog, при этом можно по нему грепать
если нужно посмотреть что в текущий момент качается — ftptop (для proftpd)
что качали — /var/log/proftpd/xferlog, при этом можно по нему грепать
Хм. Я и сам грепал логи чтобы посмотреть кто что с меня качал. Спасибо, интересное решение. :)
Правда такой путь сгодится только когда фтп стоит на клиентской машине.
Правда такой путь сгодится только когда фтп стоит на клиентской машине.
вы наверно имеете ввиду десктопную машину (с монитором, иксами и т.д) или как понимать "клиентская"?
2. Если сеть большая и качают много, эти попапы не задалбывают?