Merge pull request #89122 from prusnak/appimage-exec-fix-space

appimage: replace radare2+jq with readelf+awk+sha256sum

Changed files
+86 -73
pkgs
build-support
+49 -53
pkgs/build-support/appimage/appimage-exec.sh
···
PATH="@path@:$PATH"
apprun_opt=true
-
#DEBUG=0
-
# src : AppImage
# dest : let's unpack() create the directory
unpack() {
-
local src=$1
-
local out=$2
-
local appimageSignature=""
-
local appimageType=0
+
local src="$1"
+
local out="$2"
# https://github.com/AppImage/libappimage/blob/ca8d4b53bed5cbc0f3d0398e30806e0d3adeaaab/src/libappimage/utils/MagicBytesChecker.cpp#L45-L63
-
eval "$(r2 -nn -Nqc "p8j 3 @ 8" "$src"|
-
jq -r '{appimageSignature: (.[:-1]|implode), appimageType: .[-1]}|
-
@sh "appimageSignature=\(.appimageSignature) appimageType=\(.appimageType)"')"
+
local appimageSignature=$(readelf -h "$src" | awk 'NR==2{print $10$11;}')
+
local appimageType=$(readelf -h "$src" | awk 'NR==2{print $12;}')
# check AppImage signature
-
if [[ "$appimageSignature" != "AI" ]]; then
-
echo "Not an appimage."
+
if [ "$appimageSignature" != "4149" ]; then
+
echo "Not an AppImage file"
exit
fi
case "$appimageType" in
-
1 ) echo "Uncompress $(basename "$src") of type $appimageType."
-
mkdir "$out"
-
pv "$src" | bsdtar -x -C "$out" -f -
-
;;
-
2)
-
# This method avoid issues with non executable appimages,
-
# non-native packer, packer patching and squashfs-root destination prefix.
+
"01")
+
echo "Uncompress $(basename "$src") of type $appimageType"
+
mkdir "$out"
+
pv "$src" | bsdtar -x -C "$out" -f -
+
;;
-
# multiarch offset one-liner using same method as AppImage
-
# see https://gist.github.com/probonopd/a490ba3401b5ef7b881d5e603fa20c93
-
offset=$(r2 -nn -Nqc "pfj.elf_header @ 0" "$src"|\
-
jq 'map({(.name): .value}) | add | .shoff + (.shnum * .shentsize)')
+
"02")
+
# This method avoid issues with non executable appimages,
+
# non-native packer, packer patching and squashfs-root destination prefix.
-
echo "Uncompress $(basename "$src") of type $appimageType @ offset $offset."
-
unsquashfs -q -d "$out" -o "$offset" "$src"
-
chmod go-w "$out"
-
;;
+
# multiarch offset one-liner using same method as AppImage
+
# see https://gist.github.com/probonopd/a490ba3401b5ef7b881d5e603fa20c93
+
offset=$(readelf -h "$src" | awk 'NR==13{e_shoff=$5} NR==18{e_shentsize=$5} NR==19{e_shnum=$5} END{print e_shoff+e_shentsize*e_shnum}')
+
echo "Uncompress $(basename "$src") of type $appimageType @ offset $offset"
+
unsquashfs -q -d "$out" -o "$offset" "$src"
+
chmod go-w "$out"
+
;;
-
# 3) get ready, https://github.com/TheAssassin/type3-runtime
-
*) echo Unsupported AppImage Type: "$appimageType"
-
exit
-
;;
+
# "03")
+
# get ready, https://github.com/TheAssassin/type3-runtime
+
+
*)
+
echo Unsupported AppImage Type: "$appimageType"
+
exit
+
;;
esac
echo "$(basename "$src") is now installed in $out"
}
apprun() {
-
eval "$(rahash2 "$APPIMAGE" -j | jq -r '.[] | @sh "SHA256=\(.hash)"')"
-
echo sha256 = \""$SHA256"\"\;
+
SHA256=$(sha256sum "$APPIMAGE" | awk '{print $1}')
export APPDIR="${XDG_CACHE_HOME:-$HOME/.cache}/appimage-run/$SHA256"
#compatibility
···
}
while getopts "x:w:dh" option; do
-
case "${option}" in
-
d) set -x
-
;;
-
x) # eXtract
-
unpack_opt=true
-
APPDIR=${OPTARG}
-
;;
-
w) # WrapAppImage
-
export APPDIR=${OPTARG}
-
wrap_opt=true
-
;;
-
h) usage
-
;;
-
*)
-
usage
-
;;
-
esac
+
case "${option}" in
+
d) set -x
+
;;
+
x) # eXtract
+
unpack_opt=true
+
APPDIR=${OPTARG}
+
;;
+
w) # WrapAppImage
+
export APPDIR=${OPTARG}
+
wrap_opt=true
+
;;
+
h) usage
+
;;
+
*) usage
+
;;
+
esac
done
-
shift $((OPTIND-1))
+
shift "$((OPTIND-1))"
-
if [[ $wrap_opt = true ]] && [[ -d "$APPDIR" ]]; then
+
if [ -n "$wrap_opt" ] && [ -d "$APPDIR" ]; then
wrap "$@"
exit
else
···
shift
fi
-
if [[ $unpack_opt = true ]] && [[ -f "$APPIMAGE" ]]; then
+
if [ -n "$unpack_opt" ] && [ -f "$APPIMAGE" ]; then
unpack "$APPIMAGE" "$APPDIR"
exit
fi
-
if [[ $apprun_opt = true ]] && [[ -f "$APPIMAGE" ]]; then
+
if [ -n "$apprun_opt" ] && [ -f "$APPIMAGE" ]; then
apprun
wrap "$@"
exit
+37 -20
pkgs/build-support/appimage/default.nix
···
-
{ stdenv, buildFHSUserEnv, writeScript, pkgs
-
, bash, radare2, jq, squashfsTools, ripgrep
-
, coreutils, libarchive, file, runtimeShell, pv
-
, lib, runCommand }:
+
{ stdenv
+
, bash
+
, binutils-unwrapped
+
, coreutils
+
, gawk
+
, libarchive
+
, pv
+
, squashfsTools
+
, buildFHSUserEnv
+
, pkgs
+
}:
rec {
appimage-exec = pkgs.substituteAll {
src = ./appimage-exec.sh;
isExecutable = true;
dir = "bin";
-
path = with pkgs; lib.makeBinPath [ pv ripgrep file radare2 libarchive jq squashfsTools coreutils bash ];
+
path = with pkgs; stdenv.lib.makeBinPath [
+
bash
+
binutils-unwrapped
+
coreutils
+
gawk
+
libarchive
+
pv
+
squashfsTools
+
];
};
-
extract = { name, src }: runCommand "${name}-extracted" {
-
buildInputs = [ appimage-exec ];
-
} ''
-
appimage-exec.sh -x $out ${src}
-
'';
+
extract = { name, src }: pkgs.runCommand "${name}-extracted" {
+
buildInputs = [ appimage-exec ];
+
} ''
+
appimage-exec.sh -x $out ${src}
+
'';
# for compatibility, deprecated
extractType1 = extract;
extractType2 = extract;
wrapType1 = wrapType2;
-
wrapAppImage = args@{ name, src, extraPkgs, ... }: buildFHSUserEnv (defaultFhsEnvArgs // {
-
inherit name;
+
wrapAppImage = args@{ name, src, extraPkgs, ... }: buildFHSUserEnv
+
(defaultFhsEnvArgs // {
+
inherit name;
-
targetPkgs = pkgs: [ appimage-exec ]
-
++ defaultFhsEnvArgs.targetPkgs pkgs ++ extraPkgs pkgs;
+
targetPkgs = pkgs: [ appimage-exec ]
+
++ defaultFhsEnvArgs.targetPkgs pkgs ++ extraPkgs pkgs;
-
runScript = "appimage-exec.sh -w ${src}";
-
} // (removeAttrs args (builtins.attrNames (builtins.functionArgs wrapAppImage))));
+
runScript = "appimage-exec.sh -w ${src}";
+
} // (removeAttrs args (builtins.attrNames (builtins.functionArgs wrapAppImage))));
-
wrapType2 = args@{ name, src, extraPkgs ? pkgs: [], ... }: wrapAppImage (args // {
-
inherit name extraPkgs;
-
src = extract { inherit name src; };
-
});
+
wrapType2 = args@{ name, src, extraPkgs ? pkgs: [ ], ... }: wrapAppImage
+
(args // {
+
inherit name extraPkgs;
+
src = extract { inherit name src; };
+
});
defaultFhsEnvArgs = {
name = "appimage-env";