Vydané zdroje
Stáhnout zdroje ZIP
CH-J Tools
Procházejte adresáře a soubory konkrétního vydání aplikace.
CH-J / Server Manager
406 souborů
core-20261024T135205Z-7c487d719de2
Přidáno: · Sestaveno:
1
# Test-only helper for app/test/disksVmIntegration.test.js (never shipped as an app operation).2
# Creates and removes dedicated loop-backed disk images under /var/tmp/chj-disks-test and prepares LVM/LUKS layers3
# on them. Every operation first proves that the device belongs to an image created by this helper; otherwise it4
# stops. Started by the test through PrivilegedExecutor as "sh -c SCRIPT chj OP ARGS...".5
set -u6
LC_ALL=C; export LC_ALL7
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH8
DIR=/var/tmp/chj-disks-test9
printf '\036CHJ_READY\n'10
op=${1:-}; [ $# -gt 0 ] && shift11
die() { printf '\036CHJ_ERR=%s\n' "$1"; printf '%s\n' "${2:-}" >&2; exit 3; }12
valid_id() { case $1 in ''|*[!a-z0-9]*) return 1 ;; esac; [ ${#1} -le 24 ]; }13
loop_of() { case $1 in /dev/loop[0-9]*) printf '%s\n' "$1" | sed 's#^/dev/\(loop[0-9]*\).*#\1#' ;; *) return 1 ;; esac; }14
# The device (loop disk or one of its partitions) must be backed by $DIR/chjtest-<id>.img.15
test_device() {16
d=$(loop_of "$1") || die NOT_TEST_DEVICE "$1 is not a loop device"17
b=$(cat "/sys/block/$d/loop/backing_file" 2>/dev/null)18
case $b in "$DIR"/chjtest-[a-z0-9]*.img) ;; *) die NOT_TEST_DEVICE "$1 is not backed by a CH-J test image" ;; esac19
[ -b "$1" ] || die NOT_TEST_DEVICE "$1 is not a block device"20
}21
test_mount() { case $1 in /mnt/chj-disks-test-[a-z0-9]*) ;; *) die NOT_TEST_MOUNT "$1 is not a test mount point" ;; esac; case $1 in *..*|*[!A-Za-z0-9/_-]*) die NOT_TEST_MOUNT bad ;; esac; }22
case $op in23
create) # ID MIB24
valid_id "$1" || die ARGS id; case $2 in ''|*[!0-9]*) die ARGS size ;; esac25
mkdir -p "$DIR" && chmod 700 "$DIR"26
img=$DIR/chjtest-$1.img; [ -e "$img" ] && die EXISTS "$img exists"27
truncate -s "${2}M" "$img" || die FAILED truncate28
# util-linux has --show; BusyBox losetup (Alpine) needs the free device first.29
dev=$(losetup -f --show -P "$img" 2>/dev/null) || { dev=$(losetup -f) && losetup -P "$dev" "$img"; } || { rm -f "$img"; die FAILED losetup; }30
printf 'dev=%s\nimg=%s\n' "$dev" "$img" ;;31
grow) # DEV MIB32
test_device "$1"; case $2 in ''|*[!0-9]*) die ARGS size ;; esac33
truncate -s "${2}M" "$(cat "/sys/block/$(loop_of "$1")/loop/backing_file")" && losetup -c "$1" || die FAILED grow34
printf 'size=%s\n' "$(blockdev --getsize64 "$1")" ;;35
write) # MOUNTPOINT: random data + checksums36
test_mount "$1"37
dd if=/dev/urandom of="$1/data.bin" bs=1024 count=16384 2>/dev/null && cp /etc/os-release "$1/os-release" && sync || die FAILED write38
(cd "$1" && sha256sum data.bin os-release) ;;39
sums) test_mount "$1"; (cd "$1" && sha256sum data.bin os-release) ;;40
tamper) # DEV: change the partition table behind a reviewed plan (adds a 1 MiB partition at the end)41
test_device "$1"42
printf ',1M\n' | sfdisk --append --no-reread "$1" >/dev/null 2>&1 || die FAILED tamper43
partx -u "$1" 2>/dev/null; echo ok ;;44
lvm) # PARTITION VG: PV + VG + 200 MiB LV with ext445
test_device "$1"; case $2 in chjtest[a-z0-9]*) ;; *) die ARGS vg ;; esac46
pvcreate -ff -y "$1" >/dev/null && vgcreate "$2" "$1" >/dev/null && lvcreate -y -L 200M -n data "$2" >/dev/null && mkfs.ext4 -q "/dev/$2/data" || die FAILED lvm47
echo "lv=/dev/$2/data" ;;48
luks) # PARTITION NAME keyring|dm-crypt: LUKS2 with a throw-away random key file (never printed, deleted after open)49
test_device "$1"; case $2 in chjtest[a-z0-9]*) ;; *) die ARGS name ;; esac50
key=/run/$2.key; umask 077; head -c 64 /dev/urandom > "$key"51
cryptsetup luksFormat --batch-mode --type luks2 --pbkdf pbkdf2 --pbkdf-force-iterations 1000 --key-file "$key" "$1" >/dev/null 2>&1 || { rm -f "$key"; die FAILED luksFormat; }52
if [ "$3" = dm-crypt ]; then cryptsetup open --disable-keyring --key-file "$key" "$1" "$2"; else cryptsetup open --key-file "$key" "$1" "$2"; fi; rc=$?53
rm -f "$key"; [ $rc = 0 ] || die FAILED open54
mkfs.ext4 -q "/dev/mapper/$2" || die FAILED mkfs55
printf 'map=/dev/mapper/%s\nkeylocation=%s\n' "$2" "$(cryptsetup status "$2" | awk -F': *' '/key location/ { print $2 }')" ;;56
hold-lock) # ID: simulate a live disk job holding the server-wide lock (a sleeping process with a runner command line)57
valid_id "$1" || die ARGS id; [ -e /run/chj-disks.lock ] && die BUSY "lock already held"58
jobs=/var/lib/chj-server-manager/disks/jobs; job=chjtest-$1-holder; mkdir -p "$jobs/$job"59
# Two commands keep bash from exec-ing sleep, so the process keeps the runner-like command line.60
setsid sh -c 'sleep 120; :' job-run "$job" </dev/null >/dev/null 2>&1 & pid=$!61
printf '%s\n' "$pid" > "$jobs/$job/pid"; echo running > "$jobs/$job/state"; echo 1 > "$jobs/$job/total"62
mkdir /run/chj-disks.lock && printf '%s\n' "$job" > /run/chj-disks.lock/job63
echo "pid=$pid" ;;64
release-lock) # ID65
valid_id "$1" || die ARGS id; job=chjtest-$1-holder; jobs=/var/lib/chj-server-manager/disks/jobs66
[ -r "$jobs/$job/pid" ] && kill "$(cat "$jobs/$job/pid")" 2>/dev/null67
[ "$(cat /run/chj-disks.lock/job 2>/dev/null)" = "$job" ] && rm -rf /run/chj-disks.lock68
rm -rf -- "${jobs:?}/$job"; echo released ;;69
cleanup) # ID: only resources of this test run70
valid_id "$1" || die ARGS id71
for m in $(awk '$2 ~ /^\/mnt\/chj-disks-test-/ { print $2 }' /proc/mounts | sort -r); do umount "$m" 2>/dev/null; rmdir "$m" 2>/dev/null; done72
for map in /dev/mapper/chjtest*; do [ -e "$map" ] || continue; case ${map##*/} in *-*) continue ;; esac; cryptsetup close "${map##*/}" 2>/dev/null; done73
for img in "$DIR"/chjtest-"$1"*.img; do74
[ -e "$img" ] || continue75
# sysfs instead of "losetup -j" (not available in BusyBox).76
for sys in /sys/block/loop*; do77
[ "$(cat "$sys/loop/backing_file" 2>/dev/null)" = "$img" ] || continue78
dev=/dev/${sys##*/}79
for vg in $(pvs --noheadings -o vg_name "$dev"p* 2>/dev/null | tr -d ' ' | sort -u); do case $vg in chjtest*) vgremove -ff -y "$vg" >/dev/null 2>&1 ;; esac; done80
for p in "$dev"p*; do [ -b "$p" ] && pvremove -ff -y "$p" >/dev/null 2>&1; done81
for map in /dev/mapper/chjtest*; do [ -e "$map" ] || continue; cryptsetup close "${map##*/}" 2>/dev/null; done82
losetup -d "$dev" 2>/dev/null83
done84
rm -f -- "$img"85
done86
for m in /mnt/chj-disks-test-*; do [ -d "$m" ] && rmdir "$m" 2>/dev/null; done87
[ "$(cat /run/chj-disks.lock/job 2>/dev/null)" = "chjtest-$1-holder" ] && rm -rf /run/chj-disks.lock88
j=/var/lib/chj-server-manager/disks/jobs/chjtest-$1-holder; [ -r "$j/pid" ] && kill "$(cat "$j/pid")" 2>/dev/null; rm -rf -- "$j"89
rmdir "$DIR" 2>/dev/null90
echo "left=$(ls "$DIR" 2>/dev/null | wc -l) loops=$(cat /sys/block/loop*/loop/backing_file 2>/dev/null | grep -c "/chjtest-")" ;;91
cleanup-stale) # detach loops still bound to deleted CH-J test images of earlier runs (nothing else)92
n=093
for sys in /sys/block/loop*; do94
b=$(cat "$sys/loop/backing_file" 2>/dev/null)95
case $b in "$DIR"/chjtest-[a-z0-9]*.img\ \(deleted\)) ;; *) continue ;; esac96
for m in $(awk -v d="/dev/${sys##*/}" 'index($1, d)==1 && $2 ~ /^\/mnt\/chj-disks-test-/ { print $2 }' /proc/mounts); do umount "$m"; done97
losetup -d "/dev/${sys##*/}" && n=$((n + 1))98
done99
echo "detached=$n loops=$(cat /sys/block/loop*/loop/backing_file 2>/dev/null | grep -c "/chjtest-")" ;;100
*) die ARGS op ;;101
esacSHA-256
96bfe71e1796a9750139f3509fee427eb781141844a915b85a791f16d832b5e8CH-J Proprietary Software License 1.14 · Zdroje jsou zveřejněny pod CH-J Proprietary Software License 1.14. Jejich dostupnost nemění licenční podmínky ani neposkytuje další oprávnění.
SHA-256 archivu
476ed8aef0f1e96a5acdf223127b6692acdf4492eeaf5d0816b6e2a634fbbda6