Linux.org.ua
Технічні питання => Розробка => Гілку створено: unknown від 2011-06-05 12:51:42
-
З програмуванням я не маю спільного і далекий від того. Але виникла одна задумка і дуже б хотілося щоб вона стала реальністю, не тільки мені, а й іншим буде потрібна ця річ, хто зацікавиться. Здається, воно доволі просте, але потрібні знання в цьому плані.
Є така річ, як нотифікації, наприклад, на Ubuntu - це чорна виринаюча "смужка" з різними інформаційними системними повідомленнями, такими як "З’єднання встановлено/розірвано" і т.п.
І є така річ, як syslog, чиї повідомлення можна читати в системному журналі чи у /var/log/. працює воно в реальному часі і саме суть цього питання. Потрібно "об’єднати" syslog (dmesg) із виринаючими повідомленнями, тобто фільтрувати потрібні повідомлення і переводити їх на нотифікації. Якби знав, сам би зробив і запропонував вам (лінуксоїдам) для користування.
Є пакунок libnotify-bin, якраз за допомогою нього можна керувати виринаючими повідомленнями (приклад роботи libnotify-bin прикріплю як зображення). Ага, ще не уточнив, що саме я б хотів виводити на нотифікації. Це б мало бути (в системному журналі) через ufw.log чи через dmesg (воно там також виводиться, та і в syslog також, головне знати як реалізувати). Там повідомлення для прикладу такі:
kernel: [ 929.995186] [UFW BLOCK] IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=3.18.23.154 DST=34.145.88.231 LEN=424 TOS=0x00 PREC=0x00 TTL=128 ID=21723 PROTO=UDP SPT=1900 DPT=52005 LEN=404
За задумом повідомлення, відфільтроване і "перетворене" мало б виглядати так:
Увага, вузол 3.18.23.154 блоковано
Тоді таку інтерактивність можна було б назвати більш людянішою (убунтівською).
Прошу не проходити повз і відгукнутися і тих, хто не користується убунтою чи не любить її взагалі, а знає вирішення :)
Ось просто команда, введена вручну. От тільки мені невідомо, як би воно мало взаємодіяти з syslog:
notify-send --icon="info" "УВАГА, вузол 3.18.23.154 блоковано"
-
http://www.johnandcailin.com/blog/john/how-setup-real-time-email-notification-critical-syslog-events
тут немає відповіді на ваше питання??
-
http://www.johnandcailin.com/blog/john/how-setup-real-time-email-notification-critical-syslog-events
тут немає відповіді на ваше питання??
Якби я англ. знав... Наскільки зрозумів, там про відсилання логів поштою?
-
sudo tail -f /var/log/messages | fgrep '[UFW BLOCK]' | xargs -l1 -I MSG notify-send --icon="info" MSG
-
#!/bin/sh
# The file to follow.
FILE="file"
# The function reads a message from stdin and displays a notification.
notify() {
while read MSG; do
notify-send --urgency=normal --expire-time=3000 --icon=info "$MSG"
done
}
# The pipe follows the specified file, filters the lines and displays lines that
# passed a filter.
tail --follow --lines=1 "$FILE" | gawk '
$1 ~ /foo/ {
print "[foo] Другий стовпчик: "$2
fflush()
}
$2 ~ /bar/ {
print "[bar] Третій стовпчик: "$3
fflush()
}
$1 ~ /^kernel:$/ && $4 ~ /^\[UFW$/ {
printf "Увага, вузол %s заблоковано!\n", substr($9, 5)
fflush()
}
' | notify
Цікаві для вас частини коду:
- змінна FILE, яка вказує файл який слід відстежувати;
- блоки що починаються з "$", в яких вказуються фільтри для рядків та повідомлення, які виводяться, якщо рядок відповідає фільтру;
Наприклад:
$1 ~ /foo/ {
print "[foo] Другий стовпчик: "$2
fflush()
}
Якщо перше слово у рядку містить "foo", то виводиться повідомлення "[foo] Другий стовпчик: " + друге слово цього рядка.
$2 ~ /bar/ {
print "[bar] Третій стовпчик: "$3
fflush()
}
Якщо друге слово у рядку містить "bar", то виводиться повідомлення "[bar] Третій стовпчик: " + третє слово цього рядка.
$1 ~ /^kernel:$/ && $4 ~ /^\[UFW$/ {
printf "Увага, вузол %s заблоковано!\n", substr($9, 5)
fflush()
}
Це фільтр для рядка, який ви навели у першому пості. Якщо перше слово рядка _точно_ відповідає "kernel:" і одночасно четверте слово рядка точно відповідає "[UFW", то виводиться повідомлення "Увага, вузол ### заблоковано!" Тут "###" відповідає підрядку дев’ятого слова, який починається з п’ятого знака і йде до кінця цього слова. Тобто зі слова "SRC=3.18.23.154" буде вирізано "SRC=" і відображатися буде лише IP адреса.
Якщо для виводу повідомлень використовується printf, то повідомлення _повинно_ закінчуватися знаками "\n", як це зроблено у останньому прикладі.
Якщо рядок відповідає декільком фільтрам, то буде виведена відповідна кількість повідомлень одночасно.
Як протестувати:
1. Звантажте прикріплений скрипт.
2. Зробіть скрипт виконуваним.
3. Створіть у директорії де лежить скрипт файл з назвою "file"
4. Запустіть скрипт.
5. Відкрийте файл "file" у текстовому редакторі та додавайте рядки в кінець файлу. Після додавання рядка тисніть Еnter та зберігайте файл. Після збереження файлу буде виведено повідомлення, якщо доданий рядок відповідає одному з фільтрів.
-
Якщо ubuntu як і деб’ян, використовує rsyslog, то додаєте /etc/rsyslog.d/notifier.conf:
$ModLoad omprog
$actionomprogbinary /usr/local/bin/notifier.sh
*.* :omprog:
І, відповідно, у /usr/local/bin/notifier.sh щось типу:
#/bin/sh
while read line; do
# перевіряєте, чи $line відповідає потрібному шаблону
if [ ..... ]; then
# виокремлюєте з рядка потрібну вам інформацію та формуєте на її основі $message
......
notify-send --icon="info" "$message"
fi
done
P.S. Якщо повідомлення, що нас цікавлять, мають якісь особливості, можна їх фільтрувати тим же rsyslog’ом. Або застосувати template, щоб мати менше мороки з розбором усередині скрипта.
P.P.S. Проте я не знаю, як працює notify-send – в даному випадку воно запускається від root.
-
sudo tail -f /var/log/messages | fgrep '[UFW BLOCK]' | xargs -l1 -I MSG notify-send --icon="info" MSG
не йде
-
чомусь не працює (
може я не так робив.
створив тестовий файл, запустив скрипт, вставив у тестовий файл повний рядок "Jun 11 20:20:02 john-desktop kernel: [ 4523.244123] [UFW BLOCK].........................", зберіг - нема реакції.
Пробував змінити в скрипті адресу FILE="var/log/syslog", чекав, також нічого. Що може бути не так.
Трохи рився в неті, знайшов рядок (вкладу знімок екрану):
tail -n0 -f /var/log/syslog | while read line; do notify-send "System Message" "$line"; done
запускаю його, працює. Інтерактивно, але дає усе, без фільтрації і "перетворення". Як варіант, то дуже хороша альтернатива, але хотілося б так, як було задумано в цій темі, було б ідеально. Може взяти за основу цей рядок, додати що потрібно, щоб вийшло бажане? Тобто, якось задіяти його у вашому скрипті.
Ще дещо піддивився, декілька прикладів простеньких:
Цей рядок (команда) дасть вивід одноразово, останнього повідомлення з сислогу:
notify-send test "`tail /var/log/syslog`"
і ще кілька прикладів, які я розумію дуже поверхнево, може згодяться у вирішенні цього питання:
Example of use
So, for what should you use this nifty command utility? You could use it, as I did, to write a script that notifies when email arrives to your Gmail or Google Apps account. Here follows some more examples.
Give progress report from an exhaustive script.
#!/usr/bin/env bash
notify-send "Start task 1."
...
notify-send "End task 1. Start task 2."
...
notify-send "End task 2. Start task 3."
...
notify-send "End task 3. All tasks finished."
Notify yourself when a long lasting command has finished.
make && notify-send "Successfully compiled the kernel" || \
notify-send "Error while compiling the kernel"
Use it as a timer.
(sleep 45m; notify-send -t 0 "Laundry done!") &
Don't forget to go to bed.
echo 'notify-send "Go to bed!"' | at midnight
Follow what's going on on your machine.
(tail -n0 -f /var/log/syslog | while read line; do notify-send "System Message" "$line"; done) &
Make a Bash function to play with:
send() { notify-send "$*" "$(eval "$*" 2>/dev/null)"; }
send ls /
send df -hTx tmpfs
send cat /proc/loadavg
echo 'scale=5; 365 / 12 / 7' | send bc
-
також нічого. Що може бути не так.[/color][/size]
Трохи рився в неті, знайшов рядок (вкладу знімок екрану):
tail -n0 -f /var/log/syslog | while read line; do notify-send "System Message" "$line"; done
запускаю його, працює. Інтерактивно, але дає усе, без фільтрації і "перетворення".
Ну так вставте grep між цими командами для фільтрації:
tail -n0 -f /var/log/syslog | fgrep '[UFW BLOCK]' | while read line; do notify-send "System Message" "$line"; done
-
з іншого боку можна обійтися без фільтрації, давати не syslog чи messages, а відразу на ufw.log
tail -n0 -f /var/log/ufw.log | while read line; do notify-send "System Message" "$line"; done
Але як же бути з тим перетворенням "foo....bar...", як це коректно оформити..
-
Ну так вставте grep між цими командами для фільтрації:
фільтарція вже не потрібна (не звернув увагу, що є ufw.log)
-
echo "foo 123.456.789.012" | while read; do case "$REPLY" in *foo*) IP=`echo "$REPLY" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' `; notify-send "UFW" "bar $IP" ;; esac; done
-
echo "foo 123.456.789.012" | while read; do case "$REPLY" in *foo*) IP=`echo "$REPLY" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' `; notify-send "UFW" "bar $IP" ;; esac; done
Виходить "одноразовий запуск", вихід і вивід одного повідомлення, неправильного :)
-
Ви протестували скрипт на своєму ПК? Ті приклади, що я навів, працюють? Для редагування файлу візьміть nano, vim або emacs. З gedit, наприклад, у мене були проблеми, tail не реагував на зміни, які я робив у цьому редакторі. Не знаю, як там інші редактори себе поводять.
вставив у тестовий файл повний рядок "Jun 11 20:20:02 john-desktop kernel: [ 4523.244123] [UFW BLOCK].........................", зберіг - нема реакції.
для рядка
Jun 11 20:20:02 john-desktop kernel: [ 4523.244123] [UFW BLOCK].........................
у скрипті немає відповідного фільтру. Як приклад ви навели
kernel: [ 929.995186] [UFW BLOCK] IN=eth0
а це інший формат повідомлення і саме для нього я і написав фільтр.
Мабуть можна обійтися і простішим фільтром. Якщо припустити, що всі рядки, які містять "[UFW BLOCK]" мають однаковий формат типу:
Jun 11 20:20:02 john-desktop kernel: [ 4523.244123] [UFW BLOCK] IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=3.18.23.154 DST=34.145.88.231 LEN=424 TOS=0x00 PREC=0x00 TTL=128 ID=21723 PROTO=UDP SPT=1900 DPT=52005 LEN=404
то можна обійтися таким простим фільтром:
$0 ~ /\[UFW BLOCK\]/ {
printf "Увага, вузол %s заблоковано!\n", substr($13, 5)
fflush()
}
Цей фільтр просто перевіряє, чи є десь у рядку підрядок "[UFW BLOCK]" і тоді робить відповідне перетворення. Додайте цей фільтр до інших і спробуйте ще раз.
Пробував змінити в скрипті адресу FILE="var/log/syslog", чекав, також нічого. Що може бути не так.[/color][/size]
По перше, шлях до системного syslog: "/var/log/syslog" (слеш на початку!). По друге, повідомлення будуть виводитися тільки, якщо в системний лог буде додано строку для якої у скрипті існує відповідний фільтр.
Трохи рився в неті, знайшов рядок (вкладу знімок екрану):
tail -n0 -f /var/log/syslog | while read line; do notify-send "System Message" "$line"; done
запускаю його, працює. Інтерактивно, але дає усе, без фільтрації і "перетворення". Як варіант, то дуже хороша альтернатива,
Якщо ви уважно подивитесь на мій скрипт і на наведений вами рядок, то помітете, що це майже 100% той самий код. Тільки у скрипті цикл while реалізовано в окремій функції і ще додано фільтрацію з перетворенням.
-
Трохи доробив скрипт, додав фільтр з попереднього повідомлення. Вам залишилось звантажити, налаштувати змінну FILE і запустити скрипт.
-
Прошу вибачення, що не відповідав (їздив відпочити на тиждень).
Тепер за порядком:
Тестував скрипт (ваш перший), а як же. Не працював. Я вносив зміни за допомогою gedit.
З рядком сислогу і невідповідності його фільтру ви вже розібрались - нема вже що обговорювати.
Додам, щодо фільтру. Вище я писав що можна не відшукувати рядок у /var/log/syslog, а прямо з /var/log/ufw.log, там логи тільки мережного екрану.
Щодо слешу. З ним у мене тільки тут описка вийшла, а там було все правильно, мені відомо, як пишеться правильно шлях.
-
Трохи доробив скрипт, додав фільтр з попереднього повідомлення. Вам залишилось звантажити, налаштувати змінну FILE і запустити скрипт.
Тепер відповідаю на це повідомлення - працює скрипт! :)
Усім дякую за приділену увагу і докладені зусилля до цієї теми, а особливо вам, бо вийшло так як я хотів.
Можна відсилати в канонікал (Canonical) пропозицію включити в убунту таку зручність ;) ідея була моя, робота ваша, плоди - народні (GPL) ;)
-
Тепер відповідаю на це повідомлення - працює скрипт! :)
Усім дякую за приділену увагу і докладені зусилля до цієї теми, а особливо вам, бо вийшло так як я хотів.
Було цікаво. Може і самому згодиться колись.
Можна відсилати в канонікал (Canonical)
Краще в Debian. ;)
-
Тепер відповідаю на це повідомлення - працює скрипт! :)
Усім дякую за приділену увагу і докладені зусилля до цієї теми, а особливо вам, бо вийшло так як я хотів.
Було цікаво. Може і самому згодиться колись.
Можна відсилати в канонікал (Canonical)
Краще в Debian. ;)
байдуже, хай і в debian, тільки б комусь згодилось. Здається, в debian нема Gufw. Чи є? Бо ця тема конкретно під випадок з Gufw.
-
Здається, в debian нема Gufw. Чи є? Бо ця тема конкретно під випадок з Gufw.
ufw i gufw в Debian є.
-
ufw i gufw в Debian є.
Це добре. Згодиться, коли надумаю втікати з убунти. :)
-
ufw i gufw в Debian є.
До речі ufw/gufw не потрібні. Щоб мати захист за допомогою iptables в іншому дистрибутиві, не встановлюючи якусь надбудову типу gufw і не бавлячись з правилами, робив так: знаходячись в убунту імпортував правила в файл:
iptables-save > файл
Потім вже знаходячись в іншому дистрибутиві (Sabayon) імпортував їх з файлу:
iptables-restore < файл
Логування працювало, сислог робило аналогічні записи в журнал (від імені UFW), тому скрипт мав би працювати і таким способом.
Треба тільки врахувати, чи увімкнені в ядрі відповідні функції Netfilter. Бо один раз я компілював собі ядро індивідуально й забув там глянути і при імпорті правил видавало одну помилку, бо не підтримувало якусь функцію. Мусів перекомпільовувати.
P.S. Тема вже підходить в розділ "поради і рецепти", але тільки своїм фіналом (результатом), а не вся, тому сенсу її переносити нема, а створити сенс є у тому розділі. Тому спробую коротко там описати. Часто людині потрібне вирішення якогось питання, а в цьому розділі (програмування) таке шукати не будуть, або буде мало людей. Знаю по собі, коли щось шукаю для себе, а тема дуже велика, то є незручно щось віднайти, ще й тоді, коли відповідь на питання тільки формується - йде обговорення і пропозиція варіантів вирішення, а потім розв’язка. Краще готове відразу у відповідній темі.
-
от забув ще одне, для "вдосконалення" цього скрипта. Як присобачити сюди звук? Знаю що можна.
По цьому два питання:
1. Програвання з файлу.
2. Програвання з pc speaker, якийсь beep тривалістю 2-3 сек. Ще знаю що можна якось регулювати/задавати висоту тону цього сигналу. (Наприклад, мені сподобалась висота тону в Suse при натисканні ctrl+alt+backspase).
Якщо не важко.
-
иии.. на рахунок pc speaker, то мені потрібно було встановити пакунок beep. Команда, для прикладу, може бути такою:
beep -f 1000 -l 500 -r 3
видасть три короткі сигнали. Лишилось всунути цю команду в скрипт і коректно прив'язати до того всього. От би дізнатись, на якій частоті видає звук Suse (те що вище писав).
А ще можуть бути цікавими всякі midi-звуки (короткі), на старих приставках (іграх) були гарні мелодії, в таких як Супер Маріо. Лише де їх узяти.
-
http://www.google.com/search?q=8bit+music
Програвати можна і mplayer'ом.
-
Програвати можна і mplayer'ом.
Можна чим завгодно, наприклад, play з пакунку sox. Що кому подобається.
-
Здається, в debian нема Gufw. Чи є? Бо ця тема конкретно під випадок з Gufw.
ufw i gufw в Debian є.
Ось всунув у скрипт один рядок і тепер також програє звук (видає сигнал з pc speaker програмою beep). Працює, але не знаю чи коректно я то зробив, бо не програміст.
В рядок 11-й додав, вийшло так
.......--icon=info "$MSG" && beep -f 4001 -l 500 .....
Прикріплюю цілий файл.
-
Працює, але не знаю чи коректно я то зробив
Ідеально! ;)
-
Працює, але не знаю чи коректно я то зробив
Ідеально! ;)
значить можна буде аналогічно і з програванням файлу - play /шлях/file.ogg