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