You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.3 KiB
86 lines
3.3 KiB
#!/bin/bash
|
|
|
|
[ -f testing.sh ] && . testing.sh
|
|
|
|
#testing "name" "command" "result" "infile" "stdin"
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "$SHOWSKIP: chattr (not root)"
|
|
return 2>/dev/null
|
|
exit
|
|
fi
|
|
|
|
function clean()
|
|
{
|
|
# We don't know whether the fs will have extents (e, typically true on the
|
|
# desktop) or be encrypted (E, typically true on Android), or have data
|
|
# inlined in the inode (N), or use indexed directories, so strip those out.
|
|
# We also don't want to rely on chattr(1) to set a known version number or
|
|
# project number, so blank out any numbers.
|
|
sed -E -e 's/, (Encrypted|Extents|Indexed_directory|Inline_Data)//g;' \
|
|
-e 's/[EeIN]-/--/g; s/[0-9]+/_/g'
|
|
}
|
|
|
|
mkdir testattr
|
|
IN="cd testattr"
|
|
OUT="cd .."
|
|
_t="abcdefghijklmnopqrstuvwxyz"
|
|
|
|
_empty="--------------------"
|
|
|
|
# Check +i (immutable) works by trying to write to and remove the file.
|
|
_i="----i---------------"
|
|
testing "immutable" "$IN && echo "$_t" > testFile &&
|
|
chattr +i testFile && lsattr testFile | clean &&
|
|
date > testFile 2>/dev/null; rm testFile; chattr -i testFile;
|
|
cat testFile; rm -rf testFile; $OUT " "$_i testFile\n$_t\n" "" ""
|
|
|
|
# Check +a (append-only) works by failing to write and succeeding in appending.
|
|
_a="-----a--------------"
|
|
testing "append-only" "$IN && echo "$_t" > testFile &&
|
|
chattr +a testFile &&
|
|
echo $_t >> testFile &&
|
|
date > testFile || lsattr testFile | clean &&
|
|
chattr -a testFile; cat testFile; rm -rf testFile; $OUT" \
|
|
"$_a testFile\n$_t\n$_t\n" "" ""
|
|
|
|
# For the rest, just toggle the bits back and forth (where supported).
|
|
# Note that some file system/kernel combinations do return success but
|
|
# silently ignore your request: +T on 4.19 f2fs, or +F on 5.2 ext4,
|
|
# for example, so we're deliberately a bit selective here.
|
|
# f2fs in 5.6+ kernels supports compression, but you can only enable
|
|
# compression on a file while it's still empty, so we skip +c too.
|
|
for attr in "A" "d" "e" "j" "P" "S" "s" "t" "u"; do
|
|
echo "$_t" > testFile && chattr +$attr testFile 2>/dev/null || SKIPNEXT=1
|
|
# Check that $attr is in the lsattr output, then that - turns it back off.
|
|
testing "toggle $attr" "lsattr testFile | awk '{print \$1}' > attrs;
|
|
grep -q $attr attrs || cat attrs; cat testFile && chattr -$attr testFile &&
|
|
lsattr testFile | clean; rm -rf testFile" "$_t\n$_empty testFile\n" "" ""
|
|
done
|
|
|
|
_aA="-----a-A------------"
|
|
testing "multiple bits" "$IN && touch testFile &&
|
|
chattr +Aa testFile && lsattr testFile | clean &&
|
|
chattr -Aa testFile && lsattr testFile | clean;
|
|
rm -rf testFile; $OUT" "$_aA testFile\n$_empty testFile\n" "" ""
|
|
|
|
testing "multiple files" "$IN && touch fileA && touch fileB &&
|
|
chattr +Aa fileA fileB && lsattr fileA fileB | clean &&
|
|
chattr -Aa fileA fileB && lsattr fileA fileB | clean;
|
|
rm -rf testFile*; $OUT" \
|
|
"$_aA fileA\n$_aA fileB\n$_empty fileA\n$_empty fileB\n" "" ""
|
|
|
|
touch testFile; chattr -v 1234 testFile 2>/dev/null || SKIPNEXT=1
|
|
testing "-v version" "lsattr -v testFile | awk '{print \$1}' &&
|
|
chattr -v 4567 testFile && lsattr -v testFile | awk '{print \$1}';
|
|
rm -rf testFile" "1234\n4567\n" "" ""
|
|
|
|
mkdir -p a/b/c && touch a/b/c/fA a/b/c/fB
|
|
testing "-R" "chattr -R +a a && lsattr a/b/c/fA a/b/c/fB | clean &&
|
|
chattr -R -a a && rm -rf a" \
|
|
"$_a a/b/c/fA\n$_a a/b/c/fB\n" "" ""
|
|
rm -rf a
|
|
|
|
# Clean up
|
|
rm -rf testattr
|