Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите
/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. Парсер лох. Сейчас буду пытаться исправить.
Комментариев нет:
Отправить комментарий