Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите
/usr/local/sbin/update-system-check
Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).
/usr/local/bin/parse.pl
Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.
Ну, и для обновления системы я использую следующий скрипт:
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите
/usr/local/sbin/update-system-check
#!/bin/bash LOG_FILE=/var/log/updates PID_FILE=/var/run/updates.pid LANG=ru_RU.UTF-8 STRING_FILE_EXIST="Процесс уже запущен. Выход" STRING_FILE_ALONE="Процесс был некорректно завершён. Перезапуск обновления" STRING_GOOD="Обновление" #для того, чтобы работал notify-send USER="shtsh" #Создаём лог-файл, если его нету [ -e $LOG_FILE ] || touch $LOG_FILE && chmod 640 $LOG_FILE && chown root.log $LOG_FILE #Пишем в PID-файл, качаем файлы и удаляем PID-файл check_update(){ ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | awk {'print $2'} > $PID_FILE eix-sync > /dev/null eix-remote fetch > /dev/null emerge -qupDN @world >> $LOG_FILE TMP=`grep ebuild $LOG_FILE` if [ "x$TMP" != x"" ] then # Тут извращаемся и пользователю $USER выводим при помощи notify-send, что обновилось. Так как используется DBUS, то нужно поизвращаться. # Так как я использую KDE, то грепаем процессы по kdeinit для получения параметров DBUS PID=$(pgrep -u $USER kdeinit) DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' ) sudo -u $USER DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS bash -c "notify-send $STRING_GOOD \"`/usr/local/bin/parse.pl html`\"" fi rm -f $PID_FILE } if [ -e $PID_FILE ] # PID-файл есть, проверяем на корректность завершения операции. then process_count=`ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | wc -l` if (( $process_count > 2 )) then # Всё хорошо, другой процесс работает echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST >> $LOG_FILE exit 1 else # Это единственный процесс, обновляем echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE > $LOG_FILE check_update fi else #Файла нету, просто обновляемся echo `date +"%D %A %H:%M"` $STRING_GOOD > $LOG_FILE check_update fi
Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).
/usr/local/bin/parse.pl
#!/usr/bin/perl -w use strict; # проверяем аргументы, которые должны быть равны plain или html # По-умолчанию выводим как plain text my $output_type="plain"; if (defined(@ARGV)) { if (("$ARGV[0]" ne "html") and ("$ARGV[0]" ne "plain")) { print "\nUSAGE:\n $0 plain \t for plain text output\n $0 html\t for HTML output\n\n"; die; } $output_type=$ARGV[0]; } open(LOG_FILE,'<','/var/log/updates'); # Выводим список обновлений while(<LOG_FILE>) { /ebuild/; if ("$output_type" eq "html") { print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/; } else { print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/; } }Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.
Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.
Ну, и для обновления системы я использую следующий скрипт:
#!/bin/bash LOG_FILE=/var/log/updates emerge -auDN @world && [ -e $LOG_FILE ] && echo "" > $LOG_FILE revdep-rebuild > /dev/nullНу, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * * root /usr/local/sbin/update-system-checkКаждые 3 часа будут проверяться обновления.
P.S. Парсер лох. Сейчас буду пытаться исправить.
Комментариев нет:
Отправить комментарий