Comportamento estranho do apt-get com instruções pós-inst e arquivos .desktop

8

Temos vários arquivos .deb criados à mão (com fpm e jenkins) em um repositório local do Apt (reprepro). Esses .debs contêm um arquivo .desktop que será capturado pelo xdg-desktop em um script pós-inst.

Se instalarmos o arquivo deb manualmente, em um novo sistema, tudo estará bem.

Se instalarmos uma nova versão com o apt-get install, obteremos este erro

xdg-desktop-menu: file '/usr/local/share/applications/customthingy.desktop' does not exist

Se eu baixar o arquivo deb com o apt-get install -d customthingy, e execute

dpkg -i /var/cache/apt/archives/customthingy_2-r3_all.deb

Eu recebo o mesmo xdg-desktoperro , como antes. Portanto, isso exclui um problema com o apt.

Se eu listar o conteúdo da deb baixada,

tom.oconnor@charcoal-black:~$ dpkg --contents /var/cache/apt/archives/customthingy_2-r3_all.deb |grep ".desktop"
-rw-r--r-- root/root       201 2011-07-28 20:02 ./usr/local/share/applications/customthingy.desktop

Você pode ver o arquivo existe.

No entanto .. Se limparmos antes de reinstalar,

tom.oconnor@charcoal-black:~$ sudo apt-get purge customthingy
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED
  customthingy*
0 upgraded, 0 newly installed, 1 to remove and 84 not upgraded.
After this operation, 0B of additional disk space will be used.
Do you want to continue [Y/n]? y
(Reading database ... 219342 files and directories currently installed.)
Removing customthingy ...
Purging configuration files for customthingy ...

E depois

tom.oconnor@charcoal-black:~$ sudo apt-get install customthingy
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed
  customthingy
0 upgraded, 1 newly installed, 0 to remove and 84 not upgraded.
Need to get 0B/4,030B of archives.
After this operation, 0B of additional disk space will be used.
Selecting previously deselected package customthingy.
(Reading database ... 219319 files and directories currently installed.)
Unpacking customthingy (from .../customthingy_2-r3_all.deb) ...
Setting up customthingy (2-r3) ...

EDIT: Conteúdo do script Postinst

#!/bin/sh

# Add an entry to the system menu

XDG_DESKTOP_MENU="`which xdg-desktop-menu 2> /dev/null`"

if [ ! -x "$XDG_DESKTOP_MENU" ]; then
  echo "WARNING: Could not find xdg-desktop-menu" >&2
else
  "$XDG_DESKTOP_MENU" install --mode system /usr/local/share/applications/customthingy.desktop
  "$XDG_DESKTOP_MENU" forceupdate --mode system
fi

Não há erro. Então .. As perguntas são estas:

  1. Esse comportamento é esperado ou é um bug no apt / dpkg?
  2. Temos um pacote malformado com customthingy.deb que impede que uma futura reinstalação funcione?
  3. É seguro supor que o pós-inst sempre ocorra no final da instalação e podemos assumir com segurança que todos os arquivos foram extraídos antes desse momento?
  4. Estamos fazendo algo massivamente estranho?
Tom O'Connor
fonte
1
Portanto, a diferença crucial está entre instalar uma nova cópia e atualizar uma já existente. Será que dpkg -D101 -i <package>(ou mesmo dpkg -D1101) produzir quaisquer resultados diferentes em cada cenário? Pode gerar uma ordem de execução diferente.
SmallClanger
Você seria capaz de fornecer uma cópia do seu postinst?
jmtd
@jmtd veja a edição mais recente.
Tom O'Connor

Respostas:

4

Suponho que você postinstesteja ligando xdg-desktop-menupara mover o arquivo da área de trabalho /usr/share/applicationse atualizar o banco de dados da área de trabalho XDG. Isso é feito por exemplo google-chrome-stable, mas não consigo entender o porquê (continue lendo)

Se você instalar o arquivo da área de trabalho diretamente no /usr/share/applicationslugar (via dpkg - ou seja, coloque o arquivo lá por dh_installexemplo, de modo que o caminho .debseja apenas /usr/share/applications), vários pacotes automaticamente "dispararão" as atualizações: notavelmente gnome-menuse desktop-file-utils, mas talvez outros (dependendo da versão precisa do SO de destino etc.)

Pelo menos no meu caso, são suficientes para alcançar o que a execução xdg-desktop-menumanual faria (o programa aparece nos meus menus de usuário imediatamente)

Ainda estou no escuro sobre o porquê google-chrome-stablee outros (principalmente de terceiros) .debenviam o arquivo da área de trabalho para outro lugar que não seja /usr/share/applications( /optno caso do chrome) e depois o movemos manualmente.

jmtd
fonte
Eu postei isso antes da última edição (no momento da redação) que forneceu o arquivo postinst. Isso parece sugerir que adivinhei corretamente. Ainda não faço ideia por postinstque isso acontece, mas tente e veja se você pode reorganizar as coisas como descrevi para ver se isso resolve seus problemas.
jmtd
Eu modifiquei o script postinst para uso em desktop-file-instalar .. e tenho esse erro vez Error on file "/usr/local/share/applications/silhouettefx-silhouette.desktop": No such file or directoryque indica que ele ainda pode ser um problema prerm
Tom O'Connor
1
Se você colocar o arquivo da área de trabalho /usr/share/applications, não precisará do postinsttodo (ou do prermsnippet equivalente ) - tente isso.
jmtd
Oh bem, por que não?
Tom O'Connor
1
Estou feliz que você está classificado, vivas para a recompensa :-)
jmtd
2

São os scripts postrm / prerm que chamam "xdg-desktop-menu --uninstall 'que são os culpados, ou seja,

"$XDG_DESKTOP_MENU" uninstall --mode system /usr/local/share/applications/customthingy.desktop

Isso excluirá o arquivo .desktop antes que a chamada postinst do xdg-desktop-menu tente usá-lo. Muito agradável.

Falando das debs do google-chrome, elas também incluem essa estrofe na parte superior de seu script pré-termo:

action="$1"
if [ "$2" = "in-favour" ]; then
  # Treat conflict remove as an upgrade.
  action="upgrade"
fi
# Don't clean-up just for an upgrade.`
if [ "$action" = "upgrade" ] ; then
  exit 0
fi

Essa é uma abordagem pesada para resolver o problema, mas parece estar fazendo o truque por aqui (e para o poderoso Goog também).

Paulo

Paul Nendick
fonte
Urgh. Eu realmente espero que agora há uma boa razão para fazê-lo desta forma, os kludges continuo recebendo mais horrível :-)
jmtd
Você está tão certo - eu apenas tentei da maneira descrita acima e é MUITO melhor. Alguém deveria resolver as espreitadelas de cromo: D
Paul Nendick