LINUX.ORG.RU

Менеджер программ для установки из исходников


0

0

Вчера написал. Если надо кому :^)
Смысл в том, чтобы контролировать программы, установленные из исходников.
Для установки программы нужно сделать fake-install, т.е.
./configure --prefix=/usr && make && make DESTDIR=/tmp/prgman install
Затем делаем prgman add < PROGRAM >
Менеджер сохранит список файлов, установленных программой, затем перенесёт её в prefix.
При удалении, prgman del < PROGRAM >, менеджер сперва удалит файлы из списка, затем пустые директории.

BTW, вот он сам ;-)

#!/bin/bash

if   [ "$1" = "" ]; then
    echo 'usage : prgman [ add , del , info ] [ PROGRAM ]'
elif [ "$1" = "add" ]; then
    if   [ "$2" = "" ]; then
	echo "syntax error"
	exit
    elif ls /var/log/prgman/$2 1> /dev/null 2>&1; then
	echo "already installed"
	exit
    else
	for TYPE in b c p f l s ; do
	    find /tmp/prgman -type $TYPE >> /tmp/prgman.tmp
	done
	sort /tmp/prgman.tmp | sed s/'^\/tmp\/prgman'//g | sed s/^/'f  '/g > /var/log/prgman/$2
	rm -f /tmp/prgman.tmp
	find /tmp/prgman -type d | sort | sed s/'^\/tmp\/prgman'//g | sed s/^/'d  '/g >> /var/log/prgman/$2
	cp -R /tmp/prgman/* /
	rm -r /tmp/prgman/*
    fi
elif [ "$1" = "del" ]; then
    if   [ "$2" = "" ]; then
	echo "syntax error"
	exit
    elif ! ls /var/log/prgman/$2 1> /dev/null 2>&1; then
	echo "not installed"
	exit
    else
	cat /var/log/prgman/$2 | sed -n /^f/p | sed s/^'f  '//g | xargs rm
	tac /var/log/prgman/$2 | sed -n /^d/p | sed s/^'d  '//g | xargs rmdir
	rm /var/log/prgman/$2
    fi
elif [ "$1" = "info" ]; then
    if   [ "$2" = "" ]; then
	ls /var/log/prgman
    elif ! ls /var/log/prgman/$2 1> /dev/null 2>&1; then
	echo "not installed"
	exit
    else
	cat /var/log/prgman/$2
    fi
fi 

printman
() автор топика

По-моему, что-то подобное уже есть. Сам ничем таким не пользовался.

KtaK ★★
()
Ответ на: комментарий от printman

я тоже самодельным менеджером пользуюсь. Там несколько крошечных скриптов. Домой прийду, запостю.

dilmah ★★★★★
()

А чем не угодил checkinstall/installwatch + installpkg/removepkg?

BTW, устанавливаемая софтина не всегда имеет DESTDIR (GNU Emacs не имеет, например), а из тех, что имеют, бывает makefiles криво написаны, т.е. не все идет в DESTDIR.

А что делать, если софтина имеет доку в texinfo, и хочет прописать ее /usr/info/dir? Она делает ${DESTDIR}${prefix}/info/dir, который должен быть корректно слит с /usr/info/dir. Как ты это собираешься обрабатывать?

nobody ★★
()
Ответ на: комментарий от dilmah

Каким? make prefix=/tmp/usr/local install ? Поставится. Замечание было про DESTDIR.

А как насчет info? Его надо ставить через install-info. Если тупо скопировать ${prefix}/info/* в систему, то предыдущее содержимое dir будет потеряно.

nobody ★★
()
Ответ на: комментарий от nobody

> Каким? make prefix=/tmp/usr/local install ? Поставится

Своим. Да, я имел в виду что всегда есть способ сформировать пакет во временной директории. Чем больше кривизна софта, тем этот способен может быть сложнее.

> А как насчет info? Его надо ставить через install-info

Да, я всегда стираю dir из временной директории (если он есть, я предпочитаю софт с манами). Перед установкой пакета я проверяю коллизии, поэтому если я забуду стереть, это не пройдет незамеченным.

Отдельно, у меня есть скриптик, который генерирует /usr/local/info/dir, просто все файлы там берет и делает install-info.

dilmah ★★★★★
()
Ответ на: комментарий от nobody

>А что делать, если софтина имеет доку в texinfo, и хочет прописать ее /usr/info/dir? Она делает ${DESTDIR}${prefix}/info/dir, который должен быть корректно слит с /usr/info/dir. Как ты это собираешься обрабатывать?

Никак. Потому что всё корректно ставится, подтверждено сборкой gcc :-)
Вообще то DESTDIR означает что-то наподобие смены корня (сорри за каламбур :-), т.е. вместо /usr установка происходит в $DESTDIR/usr. По идее, установка происходит относительно директории $prefix, а файлы копируются в $DESTDIR/$prefix.

Способ установки через DESTDIR, ИМХО, самый грамотный способ менеджмента. Timestamp, LD_PRELOAD работают на честном слове, а установка, например, в раздельные директории общей массы программ -- чистой воды извращение, которое, причём, становится нереальным при большом количестве софта.
Именно fake-install применяется в таких системах, как Gentoo portage, apt, pkg-tools и др.
Да, не все программы поддерживают такой способ установки, но такого стандарта придерживается абсолютное большинство софта, ну а те программы, которые этого не поддерживают, приходится ковырять руками. ИМХО, тотальный контроль того стоит :-)

printman
() автор топика
Ответ на: комментарий от nobody

>BTW, устанавливаемая софтина не всегда имеет DESTDIR (GNU Emacs не имеет, например)

Приведи мне список софта, что не поддерживает DESTDIR, а я тебе в ответ приведу список софта, который его поддерживает. Абсолютное большинство софта поддерживает.

>а из тех, что имеют, бывает makefiles криво написаны, т.е. не все идет в DESTDIR.

То же самое, с нетерпинием жду список программ с примерами кривых makefiles. Если ты нашёл ошибку такого рода в софте, который используют сотни людей, поделись plz своими исследованиями ;-)

printman
() автор топика
Ответ на: комментарий от printman

> Никак. Потому что всё корректно ставится, подтверждено сборкой gcc :-)

Ну ты, конечно, можешь утверждать что хочешь, но я ведь тоже не слепой. Что делает строка

cp -R /tmp/prgman/* /

Она копирует _с_перезаписью_существующего_. Т.е., если у тебя есть файл /usr/info/dir, и ты при установке gcc копируешь /tmp/prgman/usr/info/dir в /, то существующий файл dir перезаписывается, таким образом к докам из установленных ранее binutils доступа через dir нет. К gcc -- да, есть. До установки следующего гнутого пакета.

> Вообще то DESTDIR означает что-то наподобие смены корня (сорри за каламбур :-), т.е. вместо /usr установка происходит в $DESTDIR/usr. По идее, установка происходит относительно директории $prefix, а файлы копируются в $DESTDIR/$prefix.

Да неужели? Кто бы мог подумать!

> Способ установки через DESTDIR, ИМХО, самый грамотный способ менеджмента.

Ага, только при этом "тотальный контроль" не гарантируется.

> Timestamp, LD_PRELOAD работают на честном слове...

Но работают, в отличие от предлагаемого способа. Поставь своим способом djbdns. У Ди Джея Бернштейна список устанавливаемых файлов зашит в сишном файле. Инсталл выполняется компиляцией и запуском этого файла. Полученная таким образом программа напрямую, минуя твой "тотальный контроль", пишет файлы в ФС. А вот "работающий на честном слове" LD_PRELOAD (используемый в installwatch) дает тот самый "тотальный контроль".

Потому и вопрос: а нафига, собственно, изобретать велосипед, да еще с квадратными колесами?

> Приведи мне список софта, что не поддерживает DESTDIR ...

> То же самое, с нетерпинием жду список программ с примерами кривых makefiles...

Блин, да я че, помню что ли? Помню, что сталкивался с таким безобразием, когда собирал себе LFS 3 года назад. Редкость, да, не спорю. Но бывает. А раз бывает, значит способ, основанный на LD_PRELOAD, "рулит нипадецки".

Не, ну можно, в принципе, обойтись. Ставить софт из-под регулярного юзера, у которого нет прав на запись в системные каталоги. Но как тогда быть c чем-то типа такого:

chgrp tty ${bindir}/foo

chmod 2755 ${bindir}/foo

Оно не сработает из-под регулярного юзера, и make install вылетит с ошибкой. Кстати, твой скрипт тоже такие вещи игнорирует. Рекомендую юзать вместо "cp -R" следующее:

cd /tmp/prgman ; tar cf - * | (cd / && tar xpf -)

При этом сохранятся владелец и группа копируемых файлов.

ЗЫ: я не против DESTDIR, я сам так собирал LFS. Но тогда checkinstall'а не было (во всяком случае, я про него не знал). А теперь он есть в любом дистре. Почему бы не заюзать?

nobody ★★
()
Ответ на: комментарий от nobody

Я конечно не силен в линухе, но попробую тоже кое что предложить. После первой установки программы из исходников я посмотрел сколько файлов и куда она копирует и понял что мне это не запомнить. Сразу стал думать чего делать ... просмотрел make-файл и успокоился : там был uninstall . Но не во всех make-файлах есть uninstall'ы следовательно что то делать надо... Предлагаю самое простое и глупое решение :) создать де нить /home/user/my_install_prog и туда кидать Makefile причем таким образом : cp Makefile /home/user/my_install_prog/Makefile.name_prog после того как обновляешь прогу желательно создавать еще и Makefile.name_prog.ver впринципе свалка будет нефиговая, но кто мешает ее зжать lzma или тем же bz2 и при установке нового софта ( не думаю что такая процедура происходи сильно часто ) распаковывать, добавлять и запоковывать заново. Как идейка?

anonymous
()
Ответ на: комментарий от anonymous

Во-первых make uninstall не всегда удаляет все установленные файлы и совсем не удаляет директории.
Во-вторых, в некоторых, особо рулезных прогах, правило для uninstall в makefile вовсе отсутствует :-)

printman
() автор топика
Ответ на: комментарий от printman

Ага но кто тебе мешает по имеющуемуся майк файлу удалить все что он тебе накопировал ? Смысл то в этом : make -n install или как там правильно ... а потом сидишь смотришь и ручками удаляешь. Но тогда 100% что ты ничего не пропустишь. И будешь уверен в том что делаешь.

anonymous
()
Ответ на: комментарий от nobody

>Она копирует _с_перезаписью_существующего_.

Да. Это минус. Поэтому я сделал cp -i. Думаю добавить к prgman флаги -f и -v, второй будет включать для всех команд verbose, а первый соответственно все перенаправлять в /dev/null.

>LD_PRELOAD (используемый в installwatch) дает тот самый "тотальный контроль".

Цитата из BLFS book.

"LD_PRELOAD based

In this approach, a library is preloaded before installation. During installation, this library tracks the packages that are being installed by attaching itself to various executables such as cp, install, mv and tracking the system calls that modify the filesystem. For this approach to work, all the executables need to be dymanically linked without the suid or sgid bit. Preloading the library may cause some unwanted side-effects during installation; hence do perform some tests to ensure that the package manager does not break anything and logs all the appropriate files."

Короче говоря, рекомендуется удостоверится, что все копируемые файлы попадают в лог :-) Как же это можно проследить. Правильно, сделав fake-install ;-)

Вообще, я ничего не имею против того, чтоб ты использовал LD_PRELOAD.

>Поставь своим способом djbdns

Как я сказал, в подобных случаях нужно ковырять руками.

>Ага, только при этом "тотальный контроль" не гарантируется. >Потому и вопрос: а нафига, собственно, изобретать велосипед, да еще с квадратными колесами? >LD_PRELOAD "рулит нипадецки".

Все твои заявления -- пустой треп до тех пор, т.к. помимо лозунгов нужны еще и аргументы.

>Не, ну можно, в принципе, обойтись. Ставить софт из-под регулярного >юзера, у которого нет прав на запись в системные каталоги. Но как >тогда быть c чем-то типа такого: > >chgrp tty ${bindir}/foo > >chmod 2755 ${bindir}/foo > >Оно не сработает из-под регулярного юзера, и make install вылетит с >ошибкой. Кстати, твой скрипт тоже такие вещи игнорирует. Рекомендую >юзать вместо "cp -R" следующее: > >cd /tmp/prgman ; tar cf - * | (cd / && tar xpf -) > >При этом сохранятся владелец и группа копируемых файлов.

Нафига, если всё нормально работает ? cp -R сохраняет атрибуты файлов.

printman
() автор топика
Ответ на: комментарий от anonymous

Тоже мысль ;-)

В чем преимущество fake-install -- в том, что всегда можно найти метод установить программу во временный каталог, даже если она не поддреживает make DESTDIR=... install.

printman
() автор топика
Ответ на: комментарий от printman

>>Поставь своим способом djbdns
>Как я сказал, в подобных случаях нужно ковырять руками.
Не нужно. Есть checkinstall.

>Вообще, я ничего не имею против того, чтоб ты использовал
 LD_PRELOAD.
Дык, я тоже не возражаю, чтобы ты руками ковырялся. Я только
понять хочу: зачем? Для чего я это понять хочу: а вдруг в этом
есть какой-то смысл, а я его упускаю.

>>Ага, только при этом "тотальный контроль" не гарантируется.
>>Потому и вопрос: а нафига, собственно, изобретать велосипед,
  да еще с квадратными колесами?
>>LD_PRELOAD "рулит нипадецки".
>Все твои заявления -- пустой треп до тех пор, т.к. помимо
 лозунгов нужны еще и аргументы.
Я говорю, что LD_PRELOAD решает проблему полного контроля за
процессом инсталла. Ты заявляешь, что могут быть "unwanted
side-effects during installation". Так вот, список эффектов --
в студию. А до тех пор именно _твое_ заявление и есть пустой треп
и лозунги.

>Нафига, если всё нормально работает ? cp -R сохраняет атрибуты
 файлов.
А давай не будем отрицать очевидное?
Речь шла про owner.group. Сделаем простой эксперимент.

an$ cd /tmp
tmp$ >orig
tmp$ su
tmp# cp -R orig copy
tmp# ls -l | grep '^-'
-rw-r--r--    1 root     root            0 Июл 27 19:37 copy
-rw-r--r--    1 an       users           0 Июл 27 19:37 orig
tmp#

Разница заметна?
На тот случай, если не заметна, поясняю: при копировании владелец
и группа не сохраняются. Именно для этого и был предложен вариант
с использованием tar. Потому что tar -- единственная программа,
сохраняющая _все_ атрибуты файлов в UNIX (про mc не говорим).

nobody ★★
()
Ответ на: комментарий от nobody

>А до тех пор именно _твое_ заявление и есть пустой треп и лозунги.

Это не мое заявление, а цитата из BLFS Book, ты только что увековечил имена разработчиков BLFS "трепачами" :-)

>Для чего я это понять хочу: а вдруг в этом есть какой-то смысл, а я его упускаю.

Снова опираясь на вышеприведённую цитату, напрашивается вывод, что LD_PRELOAD есть не самый удачный выбор для таких вещей как установка. Поэтому он не используется ни в Gentoo, ни в софте подобном makepkg из pkg-tools. Преимущество установки во временную директорию -- абсолютная уверенность того, что все файлы логгированы.

>А давай не будем отрицать очевидное?

Ну дык правильно, если файл скопирован кем-то, то этот кто-то становится его владельцем. Только какое отношение это имеет к делу ?

printman
() автор топика

Программа приведена в более респектабельный вид ;-)


#!/bin/bash

# Main functions

add_prg ()
{
    if ls /var/log/prgman/$1 1> /dev/null 2>&1; then
        echo "already installed"
        exit
    fi  
    if [ -n "$FAKE" ]; then
	touch /var/log/prgman/$1
	exit
    fi
    for TYPE in b c p f l s ; do
        find /tmp/prgman -type $TYPE >> /tmp/prgman.tmp
    done
    sort /tmp/prgman.tmp | sed s/'^\/tmp\/prgman'//g | sed s/^/'f  '/g > /var/log/prgman/$1
    rm /tmp/prgman.tmp
    find /tmp/prgman -type d | sort | sed s/'^\/tmp\/prgman'//g | sed /^$/d | sed s/^/'d  '/g >> /var/log/prgman/$1
    cp -R $I $V /tmp/prgman/* /
    rm -r /tmp/prgman/*
}

del_prg ()
{
    if ! ls /var/log/prgman/$1 1> /dev/null 2>&1; then
        echo "not installed"
        exit
    fi
    if [ -n "$FAKE" ]; then
	rm /var/log/prgman/$1
	exit
    fi 
    cat /var/log/prgman/$1 | sed -n /^f/p | sed s/^'f  '//g | xargs rm $V
    tac /var/log/prgman/$1 | sed -n /^d/p | sed s/^'d  '//g | xargs rmdir $V
    rm /var/log/prgman/$1
}

info_prg ()
{
    if [ "$1" = "none" ]; then
        /bin/ls -1 /var/log/prgman
    elif ! ls /var/log/prgman/$1 1> /dev/null 2>&1; then
        echo "not installed"
    else
        cat /var/log/prgman/$1
    fi
}

show_help ()
{
    echo "Usage : prgman [ options ] [ action ]"
    echo "  Actions : [ add , del , info ] [ PROGRAM ]"
    echo "  Options : -v   do cp -v, rm -v, rmdir -v"
    echo "            -f   install whith cp, istead of cp -i"
    echo "            -n   don't install/remove anything, but operate whith database"
}

# Read options

if [ $# = 0 ]; then
    show_help
    exit
fi

V=
I="-i"

while [ -n "$1" ]; do
    if [ "$1" = "-h" -o "$1" = "--help" ]; then
        show_help
        exit
    elif [ "$1" = "add" ]; then
        if [ -z "$2" ]; then
            echo "syntax error"
            exit
        fi
        ADDPRG=$2
        shift 2
    elif [ "$1" = "del" ]; then
        if [ -z "$2" ]; then
            echo "syntax error"
            exit
        fi
        DELPRG=$2
        shift 2
    elif [ "$1" = "info" ]; then
	if [ -z "$2" ]; then
            INFOPRG="none"
	    shift
	else
	    INFOPRG=$2
            shift 2
	fi
    elif [ "$1" = "-v" ]; then
        V=-v
        shift
    elif [ "$1" = "-f" ]; then
        I=
        shift
    elif [ "$1" = "-n" ]; then
	FAKE=1
	shift
    else
        echo "syntax error"
        exit
    fi
done

# Do main functions

if [ -n "$ADDPRG" ]; then
    add_prg $ADDPRG
    exit
elif [ -n "$DELPRG" ]; then
    del_prg $DELPRG
    exit
elif [ -n "$INFOPRG" ]; then
    info_prg $INFOPRG
    exit
fi 

printman
() автор топика
Ответ на: комментарий от printman

> Преимущество установки во временную директорию -- абсолютная уверенность того, что все файлы логгированы.

плюс дополнительная возможность подрихтовать сформированный пакет

dilmah ★★★★★
()
Ответ на: комментарий от printman

> Это не мое заявление, а цитата из BLFS Book, ты только что увековечил имена разработчиков BLFS "трепачами" :-)

Я общаюсь с _тобой_, а не с разработчиками BLFS. Если бы вместо тебя здесь был разработчик BLFS, и он бы утверждал, что LD_PRELOAD имеет грабли, и при этом на мою просьбу представить список граблей, он бы отделался общими словами, я бы и его трепачом назвал. Впрочем, он бы наверняка не отказался привести требуемый список.

Однако здесь нет автора зацитированного тобой текста, а есть ты. И именно _ты_ отказался. Поэтому и был назван трепачом. Итак, я продолжаю ждать список "unwanted side-effects during installation", связанных с использованием LD_PRELOAD. Зачем мне это? А затем, чтобы я мог на своей машине все это проверить. Из твоей цитаты мне не понятно, куда искать. Там только общие слова, без какой-либо конкретики, напрямую касающейся именно инсталла.

> Снова опираясь на вышеприведённую цитату, напрашивается вывод, что LD_PRELOAD есть не самый удачный выбор для таких вещей как установка.

Ага, вот и выяснилась причина нежелания юзать checkinstall/installwatch. Причина звучит так: "Некто сказал, что может случиться нечто". (что именно -- неизвестно). Ок.

> Преимущество установки во временную директорию -- абсолютная уверенность того, что все файлы логгированы.

Завидую тебе. Я тоже очень хотел бы иметь абсолютную уверенность хоть в чем-то.

> Ну дык правильно, если файл скопирован кем-то, то этот кто-то становится его владельцем. Только какое отношение это имеет к делу ?

Хорошая штука -- забывчивость. Я вот тоже забыл про cpio. Итак:

Это делает make install (bindir = /tmp/prgman/usr/bin):
cp ./src/foo ${bindir}
chgrp tty ${bindir}/foo
chmod 2755 ${bindir}/foo

Получается:
-rwxr-sr-x 1 root tty [skip] /tmp/prgman/usr/bin/foo

А это делаешь ты:
cp -R /tmp/prgman/* /

Получается:
-rwxr-sr-x 1 root root [skip] /usr/bin/foo

Вопрос: как после этого foo из-под регулярного юзера сможет читать и писать /dev/ttyS1, если права доступа к этому файлу выглядят так:
crw-rw---- 1 root tty [skip] /dev/ttyS1

Для решения этой задачи тебе было предложено использовать tar. Вот твои ответы:

> Нафига, если всё нормально работает ? cp -R сохраняет атрибуты файлов. (c) printman (*) (27.07.2004 11:40:13)

> Ну дык правильно, если файл скопирован кем-то, то этот кто-то становится его владельцем. (c) printman (*) (28.07.2004 1:13:40)

Ты все-таки определись, сохраняет ли cp -R владельца.группу, или нет. А то два приведенных мной поста слегка противоречат друг другу, не находишь? (или инфа об owner.group уже не входит в понятие "атрибуты файла"?)

nobody ★★
()
Ответ на: комментарий от nobody

Сорри, но мне до задницы какие там эффекты возникают. В этом вопросе я готов положиться на опыт людей, посвятивших этому свою жизнь. Если требуются подробности, пошурши гуглем или свяжись с авторами BLFS.

>Некто сказал, что может случиться нечто

Ты абсолютно прав. Только этот "некто" -- LFS Community, насчитывающая свыше 10 тыс. юзеров, которые большую часть своего времени проводят за разработкой и отладкой ОС. И если среди такого компетентного сообщества ходит мнение о том, что LD_PRELOAD может вызывать какие-либо осложнения, то глупо думать, что заявления такого рода беспочвенны.

В первом посте про cp под аттрибутами имелись ввиду права, во втором аттрибуты :-) Сорри за неточность.

printman
() автор топика
Ответ на: комментарий от nobody

Я что-то никак не могу проникнуться, зачем устанавливать программу из под юзера, а prgman запускать из под рута. Или я не правильно понял ?

printman
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.