Version d'un programme AppImage

Bonjour,
je cherche via un script a connaitre la version d’un logiciel externe de type AppImage. Y-aurait-il un moyen pour le faire ?
Par exemple avec BalenaEtcher si je le lance je récupère un résultat (str) dans lequel il y a la version. J’ai essayé avec LibreOffice mais cela ne donne rien.
Une idée serait la bienvenue, …si c’est possible…

Selon AppStream metadata — AppImage documentation ça serait dans usr/share/metainfo/myapp.appdata.xml.

Il doit exister un moyen de l’extraire, mais je l’ignore.

Par exemple avec binwalk on voit bien la structure de l’image :

$ binwalk python3.9.16-cp39-cp39-manylinux_2_24_x86_64.AppImage 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
7024          0x1B70          ESP Image (ESP32): segment count: 10, flash mode: QUIO, flash speed: 40MHz, flash size: 1MB, entry address: 0xc0012, hash: none
7408          0x1CF0          ESP Image (ESP32): segment count: 11, flash mode: QUIO, flash speed: 40MHz, flash size: 1MB, entry address: 0xc0012, hash: none
140480        0x224C0         SHA256 hash constants, little endian
140952        0x22698         xz compressed data
140992        0x226C0         CRC32 polynomial table, little endian
188392        0x2DFE8         Squashfs filesystem, little endian, version 4.0, compression:gzip, size: 20332416 bytes, 3017 inodes, blocksize: 131072 bytes, created: 1970-01-01 00:00:00

Après un petit binwalk -e on trouve en effet le appdata.xml :

$ cat _python3.9.16-cp39-cp39-manylinux_2_24_x86_64.AppImage.extracted/squashfs-root/usr/share/metainfo/python3.9.16.appdata.xml
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
    <id>python3.9.16</id>
    <metadata_license>MIT</metadata_license>
    <project_license>Python-2.0</project_license>
    <name>Python 3.9</name>
    <summary>A Python 3.9 runtime</summary>
    <description>
        <p>  A relocated Python 3.9 installation running from an
             AppImage.
        </p>
    </description>
    <launchable type="desktop-id">python.desktop</launchable>
    <url type="homepage">https://python.org</url>
    <provides>
        <binary>python3.9</binary>
    </provides>
</component>

donc c’est possible, ma solution n’est pas élégante du tout, elle prouve que c’est possible.

Tu peux essayer ma manière avec ton appimage libreoffice pour voir à quoi ça ressemble.

Je parie qu’il existe des libs pour faire ça de manière un peu plus proprement.

Merci pour ta réponse, j’ai essayé mais cela ne donne rien d’intéressant avec binwalk et je n’ai pas de fichier particulier à LibreOffice dans usr/share/metainfo/myapp.appdata.xml.

Ou as-tu récupéré l’appimage ? Si tu peux me donner le lien pour télécharger exactement la même je peux essayer.

voici l’adresse: LibreOffice as AppImage | LibreOffice - Free and private office suite - Based on OpenOffice - Compatible with Microsoft
Le fichier est Fresh full
Merci d’avance

En effet, j’y vois bien des “appdata” :

$ binwalk -e LibreOffice-fresh.full-x86_64.AppImage
$ find _LibreOffice-fresh.full-x86_64.AppImage.extracted -name '*.appdata.xml' 
./libreoffice24.8-base.appdata.xml
./libreoffice24.8-calc.appdata.xml
./libreoffice24.8-draw.appdata.xml
./libreoffice24.8-impress.appdata.xml
./libreoffice24.8-writer.appdata.xml
./squashfs-root/usr/share/metainfo/libreoffice24.8-base.appdata.xml
./squashfs-root/usr/share/metainfo/libreoffice24.8-calc.appdata.xml
./squashfs-root/usr/share/metainfo/libreoffice24.8-draw.appdata.xml
./squashfs-root/usr/share/metainfo/libreoffice24.8-impress.appdata.xml
./squashfs-root/usr/share/metainfo/libreoffice24.8-writer.appdata.xml

Et … pas de version dans les fichiers appdata.xml MAIS MAIS MAIS y’a la version dans le nom du fichier, libreoffice24.8-base.appdata.xml hop, version 24.8. C’est pas élégant (je trouve), c’est pas standard (j’ai pas lu le standard AppImage en entier), mais c’est là.

Je serai toi je leur demanderai poliment de rajouter ça dans le appdata.xml pour la prochaine release :slight_smile:

oui mais ce que voulais c’est la version complète, donc en l’occrence 24.8.2.1…Je n’avais compris comment récupérer l’ appdata.xml.
Avec BalenaEtcher j’avais fait comme cela (surement pas catholique!):

#Cas BalenaEtcher (AppImage)
		fb='b.AppImage'
		result=subprocess.run('/home/bibi/Bureau/'+fb, capture_output=True, text=True)
		if "'balenaEtcher@" in result.stdout:
			i = result.stdout.find("'balenaEtcher@")
			val=result.stdout[i:i+22].replace('@',' ').replace("'",'')
			print(val)

Ohhh :

squashfs-root/startcenter.desktop:X-AppImage-Version=24.8.2.1.full

oui je viens aussi de le trouver et j’ai réussi à récupérer la version. Un grand merci pour ton aide

Ça doit s’automatiser un peu…

$ cat extract_version.py 
import io
import os
from dissect.squashfs import SquashFS

with open("LibreOffice-fresh.full-x86_64.AppImage", mode="rb") as appimage:
    while block := appimage.read(4):
        if block == b'hsqs':
            appimage.seek(-4, os.SEEK_CUR)
            fsbytes = appimage.read()
            fs = SquashFS(io.BytesIO(fsbytes))
            with fs.get("/startcenter.desktop").open() as desktop_file:
                desktop = desktop_file.read().decode("UTF-8")
                for line in desktop.splitlines():
                    if line.startswith("X-AppImage-Version"):
                        print(line)
$ python extract_version.py 
X-AppImage-Version=24.8.2.1.full

je vais regarder ton code, c’est surement plus élégant que le mien

J’ai essayé ton code qui fonctionne parfaitement, mais je n’ai pas le niveau technique pour le comprendre…
Ma version est beaucoup plus simpliste mais je suis obligé d’extraire tout puis de supprimer le-dit répertoire après avoir récupéré l’info de la version.