У меня возникли некоторые проблемы с использованием debconf для моего пакета. Я запрашиваю mysql pw в файле package.config:
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw
db_go
Затем в postinst я запрашиваю пароль у debconf и записываю его в файл конфигурации:
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
# write pw to config file
Это работает, когда я делаю dpkg-reconfigure --force mypkg
. Однако при использовании apt-get -f install
(что мне приходится делать, потому что он говорит, что мой pkg сломан) это всегда приводит к сбою:
Setting up mypkg (1.5.4-3) ...
debconf (developer): frontend started
debconf (developer): frontend running, package name is mypkg
debconf (developer): starting /var/lib/dpkg/info/mypkg.config configure
debconf (developer): <-- INPUT low mypkg/mysql_root_pw
debconf (developer): --> 30 question skipped
dpkg: error processing mypkg (--configure):
subprocess installed post-installation script returned error exit status 30
Errors were encountered while processing:
mypkg
Я отредактировал скрипты, /var/lib/dpkg/info/mypkg.postinst
и ошибка возникла в строке, где я подключаю библиотеку debconf:
. /usr/share/debconf/confmodule
Вероятно, это потому, что debconf уже имеет значение из исходной установки и не показывает вопрос снова. Но как я могу пропустить его, если у меня уже есть это значение, и почему он терпит неудачу на этой строке, а не когда я это делаю db_get
?
Я поискал в Google и не нашел никакой полезной информации по этому вопросу.
решение1
Итак, я наконец-то заставил это работать. debconf всегда терпел неудачу при получении первого вопроса в моем postinst, если debconf уже имел значение. У меня наконец-то появилась (очевидная) идея проверить файлы postinst и config других пакетов в моей системе, и вот трюк:
В вашей конфигурации
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw || true
db_go || true
Вот и все. Когда я запрашиваю значения в моем postinst debconf счастлив. Очевидно, вам нужно иметь обработку, когда вы не получаете никаких значений.
Также я добавил db_stop
к своему посту «inst», не знаю, нужно ли это, но я добавлю это для полноты картины.
mypkg.postinst
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
mysql_root_pw=$RET
db_get mypkg/some_other_value
some_other_value=$RET
db_stop
# do something with the $mysql_root_pw and $some_other_value vars
Надеюсь, это когда-нибудь поможет кому-нибудь ещё.
Ваше здоровье