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

8

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

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

Se instalarmos uma nova versão com o apt-get install, obtemos 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 erro xdg-desktop de antes. Então isso elimina um problema com o apt.

Se eu listar o conteúdo do deb baixado,

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 o customthingy.deb que está impedindo o funcionamento futuro da reinstalação?
  3. É seguro assumir que post-inst sempre ocorrerá no final da instalação, e podemos seguramente assumir que todos os arquivos foram extraídos antes deste momento?
  4. Estamos fazendo algo muito esquisito?
por Tom O'Connor 04.01.2012 / 12:15

2 respostas

4

Suponho que seu postinst esteja chamando xdg-desktop-menu para mover o arquivo da área de trabalho para /usr/share/applications e atualizar o banco de dados XDG da área de trabalho. Isto é feito por, e. google-chrome-stable , mas não consigo entender por que (continue lendo)

Se você instalar o arquivo da área de trabalho diretamente no /usr/share/applications (via dpkg - isto é, colocar o arquivo por meio de dh_install , por exemplo, de modo que o caminho no .deb seja apenas /usr/share/applications ), O número de pacotes irá automaticamente "disparar" atualizações: nomeadamente gnome-menus e desktop-file-utils , mas talvez outras (dependendo da versão do sistema operacional alvo, etc.)

Pelo menos no meu caso, eles são suficientes para alcançar o que executar xdg-desktop-menu manualmente (o programa aparece nos meus menus de usuário imediatamente)

Ainda não entendi porque google-chrome-stable e outros (predominantemente de terceiros) .deb s enviam o arquivo da área de trabalho para algum lugar outro do que /usr/share/applications ( /opt in caso do cromo) e, em seguida, movê-lo com a mão.

    
por 06.01.2012 / 15:20
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 logo antes da invocação do xdg-desktop-menu para usá-lo. Muito bom.

Falando dos debs do google-chrome, eles também incluem esta estrofe no topo do seu script de prerm:

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

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

Paul

    
por 06.01.2012 / 16:25