LINUX.ORG.RU

Кем и когда вызывается DEBIAN/config?

 ,


1

1

В сети нашел, что этот скрипт вызывается еще до распаковки пакета. Однако в реальности вызова скрипта не происходит (остальные типа post[inst|rm] вызываются). Вопрос - вызывается ли этот скрипт автоматически все-таки и если да, то когда?

Я всегда могу его вызвать из postinst например, когда он вызван с аргументом configure, но по логике, раз про этот файл описано явно, он должен вызываться каким-то заранее определенным способом, а не вручную.

этот скрипт вызывается еще до распаковки пакета

нет. он вызывается в процессе конфигурирования пакета.

руками можно спровоцировать через dpkg-reconfigure, например

в реальности вызова скрипта не происходит

как ты пришел к этому выводу?

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Как мне продиагностировать, почему этот скрипт не вызывается?

Если я запускаю `dpkg-reconfigure mypackage`, то `config` скрипт все равно не вызывается, хотя `prerm upgrade` вызывается.

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

Если я запускаю dpkg-reconfigure mypackage, то config скрипт все равно не вызывается

тут несколько вариантов. для начала, что у тебя в скрипте?

работа с debconf, я надеюсь?

db_input high omg/wtf

здесь high это приоритет вопроса, который задается пользователю.

у dpkg-reconfigure есть настройка «не показывать вопросы с приоритетом ниже ХХХ»

еще надо уточнить, какой фронтенд ты используешь, может, noninteractive?

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

для начала, что у тебя в скрипте?

Ну вообще пытаюсь debconf использовать. Я ставил приоритет на critical не помогло, но сейчас еще раз попробую

еще надо уточнить, какой фронтенд ты используешь, может, noninteractive?

Я не знаю, если честно, какой там по умолчанию, но если указать его явно `DEBIAN_FRONTEND=readline sudo dpkg -i mypackage.deb` все равно не помогает.

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

все равно не помогает.

давай, покажи как-нибудь уже? :)

гист/пэйстбин/репо/сюда скопируй…

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

DEBIAN/config:

#!/bin/sh
 
# Exit on error
set -e

echo "123" > /tmp/123.123

# Nothing to do on non-configure/reconfigure phases
if [ "$1" != "configure" ] && [ "$1" != "reconfigure" ]; then
	exit 0
fi
 
# Source debconf library.
. /usr/share/debconf/confmodule
 
# Ask questions
db_input high packagename/question1 || true
 
# Show interface
db_go || true

exit 0
DEBIAN/templates:
Template: packagename/question1
Type: string
Default: 50
Description: Blah blah blah?
 Blah blah blah. Blah blah. Blah blah blah. Blah blah? Blah
 blah blah blah. Blah blah blah. Blah blah.
 .
 Blah blah blah. Blah blah. Blah blah blah. Blah blah. Blah blah blah.
 blah.

Пока сюда выкладывал обнаружил свою ошибку с наименование файла с шаблонами. Исправил, теперь у меня скрипт вызывается при dpgk-reconfigure, но при установке по прежнему нет.

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

во, дело движется :)

я бы еще вот это выкинул

# Nothing to do on non-configure/reconfigure phases
if [ "$1" != "configure" ] && [ "$1" != "reconfigure" ]; then
	exit 0
fi

возьмий какой-нить apt-get source nodm, например, там есть всё необходимое для списывания. :)

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

во, дело движется :)

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

я бы еще вот это выкинул

выкинул, без изменений

возьмий какой-нить apt-get source nodm

Сейчас посмотрю

yetanother ★★
() автор топика

Мне казалось что он вызывается только если у тебя чистая установка или ты явно вызвал dpkg-reconfigure. Удали пакет через apt purge и поставь с нуля.

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

Мне казалось что он вызывается только если у тебя чистая установка или ты явно вызвал dpkg-reconfigure.

При вызове dpkg-reconfigure вызывается, при установке с нуля - нет.

Удали пакет через apt purge и поставь с нуля.

Так и делаю, не помогает. Добавил `db_purge` в `postrm` чтобы все настройки `debconf` сбрасывались при `apt-get purge`, но все равно не срабатывает.

Уже второй день не знаю что делать. Включил отладку через `-D` (sudo dpkg -D10 -i mypackage.deb), но она ничего не дала.

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

Все, починил. Проблема была, что в postinst тоже нужно сорсить `/usr/share/debconf/confmodule`. Случайно наткнулся в инетах на эту фразу и все заработало. Также помогает отладка с `DEBCONF_DEBUG=developer`.

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

postinst тоже нужно сорсить

ну, «это очевидно» %)) если ты в postinst тоже работаешь с debconf. Все вызовы db_ - это всего лишь шеловские функции

отладка с DEBCONF_DEBUG=developer

до этого никак руки не доходили, так как обычно всё удавалось починить методом пристального вглядывания ;)

кстати, в какой-то версии у тебя было db_go || true - ты так никогда не узнаешь, что оно сломалось. я бы убрал || true отсюда. в db_input еще как-то можно понять, но тут - лишнее оно, имхо.

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

Так в том то и дело, что я в postinst с debconf не работаю, а включать все равно надо.

db_go || true убрал, оно там действительно лишнее, просто в отчаянных попытках решить проблему начинаешь эксперементировать)

А с `DEBCONF_DEBUG=developer` я просто увидел, что скрипт config стал вызываться. Там у меня еще ошибка была - переименовал поле в шаблоне, а в скрипте не исправил. И в результате скрипт уже стал вызываться, но молча завершал работу без диалога.

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

я в postinst с debconf не работаю

но в чем тогда смысл? даже db_get не делаешь в postinst?? (в общем-то, только за этим и нужно сорсить confmodule в postinst)

зачем тебе тогда debconf?

отдельно хочу процитировать авторов дебконфа: «дебконф - это не субд для долгосрочного хранения значений»

то есть, после установки пакета на базу дебконф лучше не надеяться, а во время postinst перенести значения из бд дебконф себе в конфиг, например.

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

но в чем тогда смысл? даже db_get не делаешь в postinst??

Aaaa... Вот в чем косяк то был. Я в postinst не трогаю debconf, но вызываю скрипт, который его использует. И в этом скрипте я, конечно, засорсил `/usr/share/debconf/confmodule`, но его сорсить надо было именно в postinst. Вот я и мучался, блин.

Я просто опакечиваю приложение, которое раньше устанавливалось из install.run, ну и чтобы не мудрить из postinst вызываю скрипт, который в install.run раньше был.

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

Еще одна проблема вылезла. Когда выполняется `postrm purge`:

#!/bin/sh

echo "postrm" $@

# set -e
# set -x

if [ "$1" == purge ] && [ -e /usr/share/debconf/confmodule ]; then
	. /usr/share/debconf/confmodule
	db_stop
	db_purge
fi

exit 0
Если не вызывать db_stop, то скрипт выполняется полностью, но dpkg пишет следующее
Do you want to continue? [Y/n] 
(Reading database ... 322279 files and directories currently installed.)
Removing mypackage (2.3.5rc3-30-gafe5d161) ...
prerm remove
postrm remove
(Reading database ... 322075 files and directories currently installed.)
Purging configuration files for mypackage (2.3.5rc3-30-gafe5d161) ...
postrm purge
debconf (developer): frontend started
debconf (developer): frontend running, package name is mypackage
debconf (developer): starting /var/lib/dpkg/info/mypackage.postrm purge
debconf (developer): <-- postrm purge
debconf (developer): <-- PURGE 
debconf (developer): --> 0
debconf (developer): <-- STOP
dpkg: error processing package mypackage (--purge):
 subprocess installed post-removal script returned error exit status 128
Errors were encountered while processing:
 mypackage
E: Sub-process /usr/bin/dpkg returned an error code (1)
Насколько это правильное решение или же это грязный хак?

UPDATE: db_stop вообще предотвращает выполнение db_purge и база данных не очищается. Так что это бесполезный хак

yetanother ★★
() автор топика
Последнее исправление: yetanother (всего исправлений: 2)
Ответ на: комментарий от yetanother

Проблема оказалась что в postrm была отладочная команда:

#!/bin/sh

echo "postrm" $@ # <= Причина ненулевого возврата

set -e

if [ "\$1" == purge ] && [ -e /usr/share/debconf/confmodule ]; then
	. /usr/share/debconf/confmodule
	db_purge
fi

После ее удаления скрипт отрабатывает как ожидается

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

хехе, я тебе nodm для подглядывания не зря посоветовал :)

там про db_stop тоже есть )

по поводу удаления строк из debconf при удалении пакета - ну, не знаю.. спорно…

потом заново ставить будешь - снова вопросы. а так бы оно те значения взяло. разве плохо?

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

хехе, я тебе nodm для подглядывания не зря посоветовал :)

там про db_stop тоже есть )

да я не нашел nodm в своем дистре, посмотрел в другие пакеты, наверно это бы мне сэкономило время. Но зато разобрался, теперь db_stop не использую.

по поводу удаления строк из debconf при удалении пакета - ну, не знаю.. спорно…

я не при удалении чищу debconf, а при purge только

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