|
#!/bin/bash |
|
# shellcheck disable=SC2015,SC2162 |
|
|
|
fail() { |
|
echo "FAIL FAIL FAIL" "$@" |
|
exit 99 |
|
} |
|
untestable() { |
|
echo "untestable" "$@" |
|
exit 125 |
|
} |
|
|
|
catpkg() { |
|
cat <<"EOF" |
|
package: |
|
name: PACKAGE_NAME |
|
version: "1.0.0" |
|
epoch: 0 |
|
description: Test some perms. |
|
copyright: |
|
- license: GPL-2.0-or-later |
|
dependencies: |
|
runtime: |
|
- wolfi-baselayout |
|
|
|
environment: |
|
contents: |
|
packages: |
|
- busybox |
|
- wolfi-base |
|
|
|
pipeline: |
|
- runs: | |
|
p=${{targets.destdir}}/usr/share/testownership/flist.txt |
|
mkdir -p ${p%/*} |
|
cat > "$p" <<"ENDLIST" |
|
d 0:101 var/spool/mydir/dir1 |
|
d 0:102 var/spool/mydir/dir2 |
|
d 101:0 var/spool/mydir/dir3 |
|
d 101:102 var/spool/mydir/dir4 |
|
f 0:101 usr/bin/file1 |
|
f 0:102 usr/bin/file2 |
|
f 101:0 usr/bin/file3 |
|
f 101:102 usr/bin/file4 |
|
ENDLIST |
|
|
|
- runs: | |
|
set +x |
|
|
|
vr() { echo "$" "$@"; "$@"; } |
|
d=${{targets.destdir}} |
|
vr cd "$d" |
|
|
|
while read ftype uidgid path; do |
|
dir=${path%/*} |
|
[ -d "$dir" ] || vr mkdir -p "$dir" |
|
case "${ftype}" in |
|
d) vr mkdir "$path";; |
|
f) vr touch "$path";; |
|
*) echo "unknown ftype $ftype on $path"; exit 1;; |
|
esac |
|
vr chown "$uidgid" "$path" |
|
done < usr/share/testownership/flist.txt |
|
|
|
test: |
|
environment: |
|
contents: |
|
packages: |
|
- busybox |
|
pipeline: |
|
- runs: | |
|
set +x |
|
fails=0 |
|
passes=0 |
|
vr() { echo "$" "$@"; "$@"; } |
|
vr cd / |
|
while read ftype uidgid path; do |
|
found=$(stat -c "%u:%g" "$path") |
|
if [ "$found" = "$uidgid" ]; then |
|
echo "PASS: $found $path" |
|
passes=$((passes+1)) |
|
continue |
|
fi |
|
echo "FAIL: $path - expected ownership $uidgid found $found" |
|
fails=$((fails+1)) |
|
done < usr/share/testownership/flist.txt |
|
|
|
[ $fails -eq 0 ] || { echo "FAIL: found $fails/$((passes+fails)) failures"; exit 1; } |
|
echo "PASS: $((passess))/$((passes)) pass" |
|
EOF |
|
} |
|
|
|
write_keys() { |
|
cat > "$1".pub <<"EOF" |
|
-----BEGIN PUBLIC KEY----- |
|
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApTm9NTGCr7qbaeOk/4cC |
|
/ANdVLjXydQL4OmT6Zq9ztPkI2SIeVtB4Dmzm1u26BdU99Vda1EjzAYlFUjMc3dU |
|
2KNYl6Gm+KJlByQk/mBmZ05eFcHqCzqJ9Cp2MTFJ1zEzaaPz45/cUAXusWU61xK3 |
|
pB82yl+cMwRO9AmjvJ1FMIUJO2uCt1R49eY1MpqdzkAgPbZi+71xKS9uhu5BSlfa |
|
5zGkv6Sl9G070jEBLj+aBDHsqHBhOsIIg2cytZmoDyTvcwLN1nUP/dVYqDykYswG |
|
x5syA/QbjekuoKEljnm7NDJgcQZlFrj+I2oRETHZDO6MWVQa8I+ABp+ILYLlRXAm |
|
mt/C+1FKgEMnU95QOqVqDQvM03djbGafR+/7uTBruOwzdCKGQQHB0KLvyZPKmjrx |
|
sYxRGFZib1TmXYe7dUNMg22moaHyzrEUpbRP3XazgP9ZEuTlbiDf3VjoRaZ9DjJu |
|
3t3YUqz6gSpa5Mf1ZFtI1ro4EyniH1YguyC6XS48uH7rdH3wMlhEwZXNg54OwgUu |
|
a9POo/it5soNh5sxsbsjEYMWVblIuO8114LahMGDPR1D82j5IogkmqE06yR2vg+X |
|
qRwbYAAYVoP8lMYrwBngHScFgNqMPF45fcQmInGGjhaC3wcZXG1XQl3T+eGiTq7g |
|
PAbCbn7zVppQ3776BEaUpscCAwEAAQ== |
|
-----END PUBLIC KEY----- |
|
EOF |
|
|
|
cat > "$1" <<"EOF" |
|
-----BEGIN RSA PRIVATE KEY----- |
|
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 |
|
-----END RSA PRIVATE KEY----- |
|
EOF |
|
} |
|
|
|
runner=${RUNNER:-bubblewrap} |
|
priv=${PRIV:-unpriv} |
|
escalate="" |
|
if [ "$priv" = "priv" ]; then |
|
escalate=sudo |
|
fi |
|
|
|
if [ "$runner" = "qemu" ] && [ ! -f "$QEMU_KERNEL_IMAGE" ]; then |
|
fail "runner qemu requireds QEMU_KERNEL_IMAGE. found '$QEMU_KERNEL_IMAGE'" |
|
fi |
|
|
|
melange="${MELANGE}" |
|
buildd="$PWD/build.out" |
|
pkgname="testownership" |
|
|
|
if [ -z "$melange" ]; then |
|
make melange || untestable "make melange failed" |
|
melange="$PWD/melange" |
|
else |
|
command -v "$melange" || fail "'$melange' is not executable" |
|
fi |
|
|
|
env=( |
|
env "QEMU_KERNEL_IMAGE=$QEMU_KERNEL_IMAGE" |
|
) |
|
|
|
common=( |
|
--debug |
|
"--runner=$runner" |
|
--repository-append="$PWD/packages" |
|
--keyring-append=local-melange.rsa.pub |
|
--arch=x86_64 |
|
--env-file=build-x86_64.env |
|
--keyring-append=https://packages.wolfi.dev/os/wolfi-signing.rsa.pub |
|
--repository-append=https://packages.wolfi.dev/os |
|
--source-dir="./$pkgname/" |
|
) |
|
|
|
buildcmd=( |
|
${escalate:+"${escalate}"} |
|
"${env[@]}" |
|
"$melange" build "$pkgname.yaml" |
|
"${common[@]}" |
|
--license='Apache-2.0' |
|
--signing-key=local-melange.rsa |
|
--namespace=wolfi |
|
--git-repo-url='https://github.com/wolfi-dev/os' |
|
--cache-dir=./melange-cache |
|
--pipeline-dir=./pipelines/ |
|
) |
|
|
|
testcmd=( |
|
${escalate:+"${escalate}"} |
|
"${env[@]}" |
|
"$melange" test "$pkgname.yaml" |
|
"${common[@]}" |
|
) |
|
|
|
sudo rm -Rf "$buildd" || fail "rm $buildd failed" |
|
|
|
mkdir "$buildd" && |
|
cd "$buildd" || fail "cd buildd failed" |
|
export TMPDIR="$PWD" |
|
|
|
catpkg > "$pkgname.yaml" || fail "write file failed" |
|
sed -i -e "s,PACKAGE_NAME,$pkgname," "$pkgname.yaml" || fail "sed failed" |
|
|
|
cat >build-x86_64.env <<"EOF" |
|
export GOFLAGS="" |
|
export GOTOOLCHAIN=local |
|
export PYTHONHASHSEED=0 |
|
EOF |
|
|
|
write_keys local-melange.rsa || fail "write kesy failed" |
|
|
|
mkdir -p "$pkgname" || fail "mkdir $pkgname failed" |
|
|
|
export SOURCE_DATE_EPOCH=1749656955 |
|
echo "${buildcmd[@]}" |
|
"${buildcmd[@]}" || untestable "build failed" |
|
|
|
apk=$(echo packages/x86_64/$pkgname*.apk) |
|
[ -f "$apk" ] || untestable "didnt build an apk" |
|
echo "melange test with:" "( cd build.out && " "${testcmd[@]}" ")" |
|
|
|
expected="101:102" |
|
f1="usr/bin/file4" |
|
tar --numeric-owner -tvf "$apk" > apk.tvf 2>tvf.err && |
|
tar --numeric-owner -tvf "$apk" "$f1" > apk.file.tvf 2>tvf.err || |
|
{ cat tvf.err ; fail "tar tvf failed"; } |
|
|
|
read perms owner _size _ymd _mmdd _path < apk.file.tvf || fail "read perms failed" |
|
|
|
[ "$owner" = "0/0" ] && { echo "ERROR: owner of $f1 is $owner expected $expected"; exit 1; } |
|
echo "PASS: owner of $f1 is $owner ($perms)" |
|
exit 0 |