Автор Гілка: Допоможіть реалізувати  (Прочитано 10609 раз)

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
З програмуванням я не маю спільного і далекий від того. Але виникла одна задумка і дуже б хотілося щоб вона стала реальністю, не тільки мені, а й іншим буде потрібна ця річ, хто зацікавиться. Здається, воно доволі просте, але потрібні знання в цьому плані.
Є така річ, як  нотифікації, наприклад, на 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 блоковано"
cat /dev/ass > /dev/head

Відсутній peinguin

  • Літератор
  • ******
  • дописів: 1419
  • Карма: +0/-0
Re: Допоможіть реалізувати
« Відповідей #1 : 2011-06-05 14:29:04 »
http://www.johnandcailin.com/blog/john/how-setup-real-time-email-notification-critical-syslog-events
тут немає відповіді на ваше питання??

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #2 : 2011-06-05 14:39:20 »
http://www.johnandcailin.com/blog/john/how-setup-real-time-email-notification-critical-syslog-events
тут немає відповіді на ваше питання??
Якби я англ. знав... Наскільки зрозумів, там про відсилання логів поштою?
cat /dev/ass > /dev/head

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Допоможіть реалізувати
« Відповідей #3 : 2011-06-05 14:54:58 »
sudo tail -f /var/log/messages | fgrep '[UFW BLOCK]' | xargs -l1 -I MSG notify-send --icon="info" MSG
[Fedora Linux]

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: Допоможіть реалізувати
« Відповідей #4 : 2011-06-05 15:41:36 »
#!/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 та зберігайте файл.  Після збереження файлу буде виведено повідомлення, якщо доданий рядок відповідає одному з фільтрів.
« Змінено: 2011-06-05 15:43:45 від nickat »
Best regards,
nickat

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Допоможіть реалізувати
« Відповідей #5 : 2011-06-05 15:46:33 »
Якщо 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.
« Змінено: 2011-06-05 15:57:41 від ISBear »

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #6 : 2011-06-11 19:48:39 »
sudo tail -f /var/log/messages | fgrep '[UFW BLOCK]' | xargs -l1 -I MSG notify-send --icon="info" MSG
не йде
cat /dev/ass > /dev/head

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #7 : 2011-06-11 20:43:47 »
чомусь не працює (
може я не так робив.
створив тестовий файл, запустив скрипт, вставив у тестовий файл повний рядок "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

cat /dev/ass > /dev/head

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Допоможіть реалізувати
« Відповідей #8 : 2011-06-11 20:49:20 »
також нічого. Що може бути не так.[/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
[Fedora Linux]

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #9 : 2011-06-11 21:03:36 »
з іншого боку можна обійтися без фільтрації, давати не syslog чи messages, а відразу на ufw.log
tail -n0 -f /var/log/ufw.log | while read line; do notify-send "System Message" "$line"; done Але як же бути з тим перетворенням "foo....bar...", як це коректно оформити..
cat /dev/ass > /dev/head

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #10 : 2011-06-11 21:06:51 »

Ну так вставте grep між цими командами для фільтрації:
фільтарція вже не потрібна (не звернув увагу, що є ufw.log)
cat /dev/ass > /dev/head

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Допоможіть реалізувати
« Відповідей #11 : 2011-06-11 21:14:56 »
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
[Fedora Linux]

Відсутній unknown

  • Графоман
  • ****
  • дописів: 256
  • Карма: +0/-0
  • Tux файний хлопака
Re: Допоможіть реалізувати
« Відповідей #12 : 2011-06-11 22:01:48 »
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

Виходить "одноразовий запуск", вихід і вивід одного повідомлення, неправильного :)
« Змінено: 2011-06-11 22:02:40 від Vendetta »
cat /dev/ass > /dev/head

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: Допоможіть реалізувати
« Відповідей #13 : 2011-06-13 17:15:00 »
Ви протестували скрипт на своєму ПК?  Ті приклади, що я навів, працюють?  Для редагування файлу візьміть 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 реалізовано в окремій функції і ще додано фільтрацію з перетворенням.
« Змінено: 2011-06-13 17:23:45 від nickat »
Best regards,
nickat

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: Допоможіть реалізувати
« Відповідей #14 : 2011-06-16 23:17:54 »
Трохи доробив скрипт, додав фільтр з попереднього повідомлення.  Вам залишилось звантажити, налаштувати змінну FILE і запустити скрипт.
Best regards,
nickat