понедельник, 28 октября 2013 г.

Чехарда с eth* в Slackware-14.0

Не раз приходилось сталкиваться с вот такой ситуацией:
например, в машине два езернета, предположим, релтек и интел.
Ставим систему.
релтек первый, интел второй. Хорошо, настраиваем при таких условиях.
Настроили, перегрузились, все работает, все хорошо.
После 3-5 перезагрузки интел становится первым, релтек - вторым. Понятное дело, ничего не работает.
Попытка подправить /etc/udev/rules.d/70-persistent-net.rules не увенчалась успехом ввиду отсутствия данного файла.


Решение простое.
udev создает временный файл  /run/udev/tmp-rules--70-persistent-net.rules

Копируем этот файл в нужное место:
cat /run/udev/tmp-rules--70-persistent-net.rules > /etc/udev/rules.d/70-persistent-net.rules

Правим интерфейсы по своему вкусу.

Все. Проблема решена.

При наличии файла /etc/udev/rules.d/70-persistent-net.rules временный файл не создается.


пятница, 3 мая 2013 г.

Глюк XFce в Slackware-14.0

В Slackware-14.0 обоих архитектур ( 32 и 64 ) вылез один неприятный глюк: ни с того, ни с сего у графики срывает башку и она теряет заголовки окон, иногда курсор становится невидимым. То есть все работает, но курсора мыши не видно (этакая угадайка получается). У окон нет заголовков, соответственно, их нельзя ни закрыть, не переместить, на размер изменить. Рабочих столов становится почему-то два (вместо четырех), и перейти в другой нельзя (точнее, у меня не получилось). Словом, работа превращается в неслабый мазохизм.

Подобное когда-то наблюдалось при неправильной настройке compiz-а.
Но тут compiz, похоже, не при чем.

Лечение обнаружилось довольно простое (хотя и несколько топорное):
Зайти в консоли в хомик юзера (или все равно откуда, лишь бы видно было) и удалить в ~/.cache/sessions/  файлы xfce4-session* .
Вроде помогает.

Предварительный анализ событий показывает, что такое происходит после запуска skype.

четверг, 21 марта 2013 г.

Зависимости SlackBuilds

Подустал я разгребать развесистые зависимости в SlackBuilds.

Да, там сделали серьезный шаг в эту сторону, не спорю, в файле имя_пакета.info появилась переменная REQUIRES, в которой перечисляются необходимые пакеты для сборки.
Но!

Ситуация выглядит таким образом:
К примеру, понадобилось мне собрать пакет perl-DateTime-Format-ISO8601/ .

Смотрим perl-DateTime-Format-ISO8601.info , тянем билд:

wget http://slackbuilds.org/slackbuilds/14.0/perl/perl-DateTime-Format-ISO8601.tar.gz

      
tar -xfz perl-DateTime-Format-ISO8601.tar.gz

Тянем исходник:

cd perl-DateTime-Format-ISO8601
. ./*.info
wget $DOWNLOAD

Проверяем зависимости:

echo $REQUIRES

Наблюдаем картину:

perl-DateTime-Format-Builder

Все. Один-единственный пакет.
Отлично!

Тянем билд:

wget http://slackbuilds.org/slackbuilds/14.0/perl/perl-DateTime-Format-Builder.tar.gz

Разворачиваем

tar -xfz perl-DateTime-Format-Builder.tar.gz

Далее по уже знакомому алгоритму:

cd perl-DateTime-Format-Builder
. ./*.info
wget $DOWNLOAD

Смотрим зависимости:


echo $REQUIRES

Видим:

perl-Class-Factory-Util perl-DateTime-Format-Strptime perl-Task-Weaken

Тааак, уже веселее, еще три пакета.

И так далее, и так далее.

Результат: чтоб собрать пакет perl-DateTime-Format-ISO8601  нужно по зависимостям поставить 31 пакет.

Впечатляет?

Хорошо, допустим, необходимость данного пакета многим не совсем понятна.
Попробуйте собрать spamassassin. ;)

Есть пакет sbotools, зависимости подтягивает по мере надобности, но он интерактивный, то есть в данном случае понадобится 33 раза ткнуть "Yes".
У него есть неинтерактивный режим, но в нем зависимости  не отслеживаются ( или отслеживаются но не устанавливаются ).
Так что с автоматизацией неважно.

Решено было эту ситуацию как-то разрулить, с целью повышения автоматизации.
Результатом стал скрипт:

===================================================
#!/bin/sh

# make_seq.sh - Build sequence packages

# Written by SlackBoost <slackboostdev@gmail.com>

SLACKBUILDROOT="/Slackware/SlackBuilds/14.0"


find_req() {

    INFO=$( find $SLACKBUILDROOT -name $1.info )
    . $INFO
    if [ "$REQUIRES" != "" ]; then
        for pkg in $REQUIRES ; do
            echo -n " $pkg"
            find_req $pkg
        done
    else
        echo
    fi
}

get_last() {

echo "$1" | while read STRING ; do
    echo "${STRING##*' '}"
done
}

rm_last() {

echo "$1" | while read STRING ; do
    if [ $( echo $STRING | wc -w ) -gt 1 ]; then
        echo "${STRING%' '*}"
    fi
done
}

PKG=$( basename $(pwd) )
if [ -f ./${PKG}.info ]; then
    . ./${PKG}.info
    if [ "$REQUIRES" = "" ]; then
        echo "$PKG" >> ../0_REQUIRES
    fi
fi

echo "Building sequence of packages for $PKG. Please wait..."
VARLIST=$( find_req $PKG )
> ./BUILD_SEQUENCE
echo "$VARLIST"
while [ $( echo $VARLIST | wc -w ) -gt 0 ]; do
    LASTPKG=$( get_last "$VARLIST" | sort -u )
    echo "$LASTPKG" >> ./BUILD_SEQUENCE
    VARLIST=$( rm_last "$VARLIST" )
done
echo $PKG >> ./BUILD_SEQUENCE

===============================================================

Запускается из билд-каталога пакета, т.е.

cd /Slackware/SlackBuilds/14.0/perl/perl-DateTime-Format-ISO8601/

make_seq.sh


После чего в каталоге появится файл BUILD_SEQUENCE, в котором перечислена последовательность сборки необходимых пакетов.

Если никаких дополнительных пакетов не требуется, в каталоге выше ( /Slackware/SlackBuilds/14.0/perl/ ) появится файл 0_REQUIRES, с именем этого пакета.

Сделано для пакетной обработки многих пакетов.

А теперь можно эти файлики скормить тому же sboinstall, или наваять что свое для автоматической сборки.