Comportamiento extraño de apt-get con instrucciones post-inst y archivos .desktop

8

Tenemos varios archivos .deb hechos a mano (con fpm y jenkins) en un repositorio local de Apt (reprepro). Estos .debs contienen un archivo .desktop que será recogido por xdg-desktop en un script posterior al inst.

Si instalamos el archivo deb a mano, en un nuevo sistema, todo está bien.

Si instalamos una nueva versión con apt-get install, obtenemos este error

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

Si descargo el archivo deb con apt-get install -d customthingy y ejecuto

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

Me sale el mismo xdg-desktoperror que antes. Entonces eso descarta un problema con apt.

Si enumero el contenido de la descarga descargada,

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

Puedes ver que el archivo existe.

Sin embargo .. Si purgamos 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 ...

Y entonces

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

EDITAR: Contenido del 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

No hay error Entonces ... Las preguntas son estas:

  1. ¿Es este comportamiento esperado o un error en apt / dpkg?
  2. ¿Tenemos un paquete con formato incorrecto con customthingy.deb que impide que una futura ejecución de reinstalación funcione?
  3. ¿Es seguro asumir que el post-inst siempre sucederá al final de la instalación, y podemos suponer con seguridad que todos los archivos se habrán extraído antes de este momento?
  4. ¿Estamos haciendo algo enormemente extraño?
Tom O'Connor
fuente
1
Entonces, la diferencia crucial es entre instalar una nueva copia y actualizar una existente. ¿ Produce dpkg -D101 -i <package>(o incluso dpkg -D1101) resultados diferentes en cada escenario? Podría arrojar un orden diferente de ejecución.
SmallClanger
¿Podría proporcionar una copia de su postinst?
jmtd
@jmtd ver última edición.
Tom O'Connor

Respuestas:

4

Supongo que postinstestá llamando xdg-desktop-menupara mover el archivo de escritorio /usr/share/applicationsy actualizar la base de datos de escritorio XDG. Esto se hace, por ejemplo google-chrome-stable, pero no puedo entender por qué ( sigue leyendo)

Si instala el archivo de escritorio directamente en su /usr/share/applicationslugar (a través de dpkg, es decir, coloque el archivo allí a través de, dh_installpor ejemplo, tal que la ruta en el .debes justo /usr/share/applications), una serie de paquetes automáticamente 'activarán' las actualizaciones: notablemente gnome-menusy desktop-file-utils, pero tal vez otros (dependiendo de la versión precisa del sistema operativo de destino, etc.)

Al menos en mi caso, estos son suficientes para lograr lo que xdg-desktop-menuharía correr a mano (el programa aparece en mis menús de usuario de inmediato)

Todavía estoy en la oscuridad sobre por qué google-chrome-stabley otros (predominantemente de terceros) .debenvían el archivo de escritorio a otro lugar que no sea /usr/share/applications( /opten el caso de Chrome) y luego lo mueven a mano.

jmtd
fuente
Publiqué esto antes de la última edición (al momento de escribir) que proporcionó el postinst. Eso parece sugerir que he adivinado correctamente. Todavía no postinsttengo idea de por qué es así, pero intente ver si puede reorganizar las cosas como he descrito, para ver si resuelve sus problemas.
jmtd
He modificado el script postinst para uso desktop-file-instalar .. y tengo este error en su lugar Error on file "/usr/local/share/applications/silhouettefx-silhouette.desktop": No such file or directorylo que indica que aún podría ser un problema prerm
Tom O'Connor
1
Si coloca el archivo de escritorio /usr/share/applications, no necesita postinstnada (o el prermfragmento equivalente ), intente eso.
jmtd
Oh bueno, porque no.
Tom O'Connor
1
Me alegro de que estés ordenado, aplausos por la recompensa :-)
jmtd
2

Son los scripts postrm / prerm que llaman "xdg-desktop-menu --uninstall 'los culpables, es decir

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

Eso eliminará el archivo .desktop justo antes de que la invocación posterior a xdg-desktop-menu intente usarlo. Muy agradable.

Hablando de las debs de google-chrome, también incluyen esta estrofa en la parte superior de su script 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

Este es un enfoque duro para solucionar el problema, pero parece estar haciendo el truco aquí (y también para el poderoso Goog).

Pablo

Paul Nendick
fuente
Urgh Realmente espero que haya una buena razón para hacerlo de esta manera, los kludges se vuelven cada vez más horribles :-)
jmtd
Tienes toda la razón: acabo de intentar la forma descrita anteriormente y es mucho mejor. Alguien debería resolver los píos de cromo: D
Paul Nendick