postinst sempre falha por causa do debconf

postinst sempre falha por causa do debconf

Estou tendo problemas ao usar o debconf para meu pacote. Peço o pw do mysql no arquivo package.config:

. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw
db_go

Então, no postinst, peço a senha ao debconf e a gravo em um arquivo de configuração:

. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
# write pw to config file

Isso funciona quando eu faço isso dpkg-reconfigure --force mypkg. Porém, ao usar apt-get -f install(o que tenho que fazer porque diz que meu pacote está quebrado) sempre falha:

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

Editei os scripts /var/lib/dpkg/info/mypkg.postinste o erro ocorre na linha onde eu forneço a biblioteca debconf:

. /usr/share/debconf/confmodule

Isto provavelmente ocorre porque o debconf já possui o valor da instalação original e não mostra a pergunta novamente. Mas como posso deixar de perguntar se já o tenho e por que ele falha nessa linha em vez de quando quando o faço db_get?

Pesquisei no Google e não consigo encontrar muitas informações úteis sobre isso.

Responder1

Então finalmente consegui fazer isso funcionar. O debconf sempre falharia ao receber a primeira pergunta no meu postinst se o debconf já tivesse o valor. Finalmente tive a (óbvia) ideia de verificar os arquivos postinst e de configuração de outros pacotes no meu sistema e este é o truque:

Na sua configuração

. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw || true
db_go || true

É isso. Quando solicito os valores no meu postinst, o debconf fica feliz. Obviamente você precisa ter um controle para quando não obtiver nenhum valor.

Também adicionei um db_stopao meu postinst, não sei se é necessário, mas vou adicioná-lo para completar.

meupkg.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

Espero que isso ajude alguém algum dia.

Saúde

informação relacionada