Highlighter

пятница, 27 января 2012 г.

Выводим список обновлений в gentoo при логине

Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.

Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите

/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 &amp;&amp; [ -e $LOG_FILE ] &amp;&amp; echo "" &gt; $LOG_FILE
revdep-rebuild &gt; /dev/null

Ну, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * *     root    /usr/local/sbin/update-system-check
Каждые 3 часа будут проверяться обновления.

P.S. Парсер лох. Сейчас буду пытаться исправить.

Комментариев нет:

Отправить комментарий