postinst sempre falha por causa do debconf

1

Estou tendo problemas para usar o debconf no meu pacote. Eu peço o pw mysql no arquivo package.config:

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

Então, no postinst, peço ao debconf a senha e escrevo para 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 dpkg-reconfigure --force mypkg . No entanto, quando usando apt-get -f install (o que tenho que fazer porque diz que meu pacote está quebrado) ele 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

Eu editei os scripts em /var/lib/dpkg/info/mypkg.postinst e o erro ocorreu na linha onde eu criei a biblioteca debconf:

. /usr/share/debconf/confmodule

Isto é provavelmente porque o debconf já tem o valor da instalação original e não mostra a questão novamente. Mas como posso pular perguntando se eu já o tenho e por que ele falha nessa linha em vez de quando eu faço db_get ?

Eu pesquiso no google e não consigo encontrar muita informação útil sobre isso.

    
por Christof 07.04.2015 / 11:42

1 resposta

1

Então eu finalmente consegui isso funcionar. O debconf sempre falharia ao obter a primeira pergunta no meu postinst se o debconf já tivesse o valor. Eu finalmente tive a idéia (óbvia) de verificar os arquivos postinst e config 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 peço os valores no meu postconf debconf é feliz. Obviamente, você precisa ter um tratamento para quando não obtiver nenhum valor.

Também adicionei um db_stop ao meu postinst, não sei se é necessário, mas vou adicioná-lo para fins de conclusão.

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

Espero que isso ajude alguém mais algum dia.

Felicidades

    
por Christof 14.04.2015 / 18:55