CH-J ToolsSerververwaltung über SSH
Menü
Veröffentlichte Quellen

CH-J Tools

Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.

Quellen als ZIP herunterladen
CH-J / Server Manager 406 Dateien
core-20261024T135205Z-7c487d719de2 Hinzugefügt: · Erstellt:
loopFixture.sh Hinzugefügt: Datum nicht erfasst 7,2 KB · 101 Zeilen
Code Datei herunterladen
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 layers
3# on them. Every operation first proves that the device belongs to an image created by this helper; otherwise it
4# stops. Started by the test through PrivilegedExecutor as "sh -c SCRIPT chj OP ARGS...".
5set -u
6LC_ALL=C; export LC_ALL
7PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
8DIR=/var/tmp/chj-disks-test
9printf '\036CHJ_READY\n'
10op=${1:-}; [ $# -gt 0 ] && shift
11die() { printf '\036CHJ_ERR=%s\n' "$1"; printf '%s\n' "${2:-}" >&2; exit 3; }
12valid_id() { case $1 in ''|*[!a-z0-9]*) return 1 ;; esac; [ ${#1} -le 24 ]; }
13loop_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.
15test_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" ;; esac
19 [ -b "$1" ] || die NOT_TEST_DEVICE "$1 is not a block device"
21test_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; }
22case $op in
23 create) # ID MIB
24 valid_id "$1" || die ARGS id; case $2 in ''|*[!0-9]*) die ARGS size ;; esac
25 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 truncate
28 # 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 MIB
32 test_device "$1"; case $2 in ''|*[!0-9]*) die ARGS size ;; esac
33 truncate -s "${2}M" "$(cat "/sys/block/$(loop_of "$1")/loop/backing_file")" && losetup -c "$1" || die FAILED grow
34 printf 'size=%s\n' "$(blockdev --getsize64 "$1")" ;;
35 write) # MOUNTPOINT: random data + checksums
36 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 write
38 (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 tamper
43 partx -u "$1" 2>/dev/null; echo ok ;;
44 lvm) # PARTITION VG: PV + VG + 200 MiB LV with ext4
45 test_device "$1"; case $2 in chjtest[a-z0-9]*) ;; *) die ARGS vg ;; esac
46 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 lvm
47 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 ;; esac
50 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 open
54 mkfs.ext4 -q "/dev/mapper/$2" || die FAILED mkfs
55 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/job
63 echo "pid=$pid" ;;
64 release-lock) # ID
65 valid_id "$1" || die ARGS id; job=chjtest-$1-holder; jobs=/var/lib/chj-server-manager/disks/jobs
66 [ -r "$jobs/$job/pid" ] && kill "$(cat "$jobs/$job/pid")" 2>/dev/null
67 [ "$(cat /run/chj-disks.lock/job 2>/dev/null)" = "$job" ] && rm -rf /run/chj-disks.lock
68 rm -rf -- "${jobs:?}/$job"; echo released ;;
69 cleanup) # ID: only resources of this test run
70 valid_id "$1" || die ARGS id
71 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; done
72 for map in /dev/mapper/chjtest*; do [ -e "$map" ] || continue; case ${map##*/} in *-*) continue ;; esac; cryptsetup close "${map##*/}" 2>/dev/null; done
73 for img in "$DIR"/chjtest-"$1"*.img; do
74 [ -e "$img" ] || continue
75 # sysfs instead of "losetup -j" (not available in BusyBox).
76 for sys in /sys/block/loop*; do
77 [ "$(cat "$sys/loop/backing_file" 2>/dev/null)" = "$img" ] || continue
78 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; done
80 for p in "$dev"p*; do [ -b "$p" ] && pvremove -ff -y "$p" >/dev/null 2>&1; done
81 for map in /dev/mapper/chjtest*; do [ -e "$map" ] || continue; cryptsetup close "${map##*/}" 2>/dev/null; done
82 losetup -d "$dev" 2>/dev/null
83 done
84 rm -f -- "$img"
85 done
86 for m in /mnt/chj-disks-test-*; do [ -d "$m" ] && rmdir "$m" 2>/dev/null; done
87 [ "$(cat /run/chj-disks.lock/job 2>/dev/null)" = "chjtest-$1-holder" ] && rm -rf /run/chj-disks.lock
88 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/null
90 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=0
93 for sys in /sys/block/loop*; do
94 b=$(cat "$sys/loop/backing_file" 2>/dev/null)
95 case $b in "$DIR"/chjtest-[a-z0-9]*.img\ \(deleted\)) ;; *) continue ;; esac
96 for m in $(awk -v d="/dev/${sys##*/}" 'index($1, d)==1 && $2 ~ /^\/mnt\/chj-disks-test-/ { print $2 }' /proc/mounts); do umount "$m"; done
97 losetup -d "/dev/${sys##*/}" && n=$((n + 1))
98 done
99 echo "detached=$n loops=$(cat /sys/block/loop*/loop/backing_file 2>/dev/null | grep -c "/chjtest-")" ;;
100 *) die ARGS op ;;
101esac
SHA-25696bfe71e1796a9750139f3509fee427eb781141844a915b85a791f16d832b5e8

CH-J Proprietary Software License 1.14 · Die Quellen werden unter der CH-J Proprietary Software License 1.14 bereitgestellt. Ihre Verfügbarkeit ändert die Lizenzbedingungen nicht und gewährt keine zusätzlichen Rechte.

SHA-256 des Archivs476ed8aef0f1e96a5acdf223127b6692acdf4492eeaf5d0816b6e2a634fbbda6
Dateien