From a0328e1e9c66c77f367caa81587b173e64355bdc Mon Sep 17 00:00:00 2001 From: Kroese Date: Wed, 22 Oct 2025 02:38:57 +0200 Subject: [PATCH] fix: Inherit owner from parent folder (#1092) --- src/disk.sh | 24 +++++++++++++++++++----- src/install.sh | 30 +++++++++++++++++++++++------- src/network.sh | 20 +++++++++++++++----- src/reset.sh | 7 ++++--- src/utils.sh | 37 ++++++++++++++++++++++++++++++++++--- 5 files changed, 95 insertions(+), 23 deletions(-) diff --git a/src/disk.sh b/src/disk.sh index eae044e..c66b243 100644 --- a/src/disk.sh +++ b/src/disk.sh @@ -17,6 +17,14 @@ SYSTEM="$STORAGE/$BASE.system.img" [ ! -s "$BOOT" ] && error "Virtual DSM boot-image does not exist ($BOOT)" && exit 81 [ ! -s "$SYSTEM" ] && error "Virtual DSM system-image does not exist ($SYSTEM)" && exit 82 +if ! setOwner "$BOOT"; then + error "Failed to set the owner for \"$BOOT\" !" +fi + +if ! setOwner "$SYSTEM"; then + error "Failed to set the owner for \"$SYSTEM\" !" +fi + fmt2ext() { local DISK_FMT="$1" @@ -338,23 +346,23 @@ checkFS () { DIR=$(dirname "$DISK_FILE") [ ! -d "$DIR" ] && return 0 - if [[ "${FS,,}" == "overlay"* ]]; then - info "Warning: the filesystem of $DIR is OverlayFS, this usually means it was binded to an invalid path!" + if [[ "${FS,,}" == "overlay"* && "$PODMAN" != [Yy1]* ]]; then + warn "the filesystem of $DIR is OverlayFS, this usually means it was binded to an invalid path!" fi if [[ "${FS,,}" == "fuse"* ]]; then - info "Warning: the filesystem of $DIR is FUSE, this extra layer will negatively affect performance!" + warn "the filesystem of $DIR is FUSE, this extra layer will negatively affect performance!" fi if ! supportsDirect "$FS"; then - info "Warning: the filesystem of $DIR is $FS, which does not support O_DIRECT mode, adjusting settings..." + warn "the filesystem of $DIR is $FS, which does not support O_DIRECT mode, adjusting settings..." fi if isCow "$FS"; then if [ -f "$DISK_FILE" ]; then FA=$(lsattr "$DISK_FILE") if [[ "$FA" != *"C"* ]]; then - info "Warning: COW (copy on write) is not disabled for $DISK_DESC image file $DISK_FILE, this is recommended on ${FS^^} filesystems!" + warn "COW (copy on write) is not disabled for $DISK_DESC image file $DISK_FILE, this is recommended on ${FS^^} filesystems!" fi fi fi @@ -543,6 +551,12 @@ addDisk () { fi + if [ -f "$DISK_FILE" ]; then + if ! setOwner "$DISK_FILE"; then + error "Failed to set the owner for \"$DISK_FILE\" !" + fi + fi + DISK_OPTS+=$(createDevice "$DISK_FILE" "$DISK_TYPE" "$DISK_INDEX" "$DISK_ADDRESS" "$DISK_FMT" "$DISK_IO" "$DISK_CACHE" "" "") return 0 diff --git a/src/install.sh b/src/install.sh index f7ec7f4..9190fd5 100644 --- a/src/install.sh +++ b/src/install.sh @@ -82,16 +82,16 @@ rm -f "$STORAGE/$BASE.system.img" # Check filesystem FS=$(stat -f -c %T "$STORAGE") -if [[ "${FS,,}" == "overlay"* ]]; then - info "Warning: the filesystem of $STORAGE is OverlayFS, this usually means it was binded to an invalid path!" +if [[ "${FS,,}" == "overlay"* && "$PODMAN" != [Yy1]* ]]; then + warn "the filesystem of $STORAGE is OverlayFS, this usually means it was binded to an invalid path!" fi if [[ "${FS,,}" == "fuse"* ]]; then - info "Warning: the filesystem of $STORAGE is FUSE, this extra layer will negatively affect performance!" + warn "the filesystem of $STORAGE is FUSE, this extra layer will negatively affect performance!" fi if [[ "${FS,,}" == "ecryptfs" || "${FS,,}" == "tmpfs" ]]; then - info "Warning: the filesystem of $STORAGE is $FS, which does not support O_DIRECT mode, adjusting settings..." + warn "the filesystem of $STORAGE is $FS, which does not support O_DIRECT mode, adjusting settings..." fi if [[ "${FS,,}" == "fat"* || "${FS,,}" == "vfat"* || "${FS,,}" == "msdos"* ]]; then @@ -100,6 +100,10 @@ fi if [[ "${FS,,}" != "exfat"* && "${FS,,}" != "ntfs"* && "${FS,,}" != "unknown"* ]]; then TMP="$STORAGE/tmp" + rm -rf "$TMP" + if ! makeDir "$TMP"; then + error "Failed to create directory \"$TMP\" !" && exit 93 + fi else TMP="/tmp/dsm" TMP_SPACE=2147483648 @@ -108,10 +112,9 @@ else if (( TMP_SPACE > SPACE )); then error "Not enough free space inside the container, have $SPACE_MB available but need at least 2 GB." && exit 93 fi + rm -rf "$TMP" && mkdir -p "$TMP" fi -rm -rf "$TMP" && mkdir -p "$TMP" - # Check free diskspace ROOT_SPACE=536870912 SPACE=$(df --output=avail -B 1 / | tail -n 1) @@ -224,6 +227,8 @@ if ! touch "$SYSTEM"; then error "Could not create file $SYSTEM for the system disk." && exit 98 fi +! setOwner "$SYSTEM" && error "Failed to set the owner for \"$SYSTEM\" !" + if [[ "${FS,,}" == "btrfs" ]]; then { chattr +C "$SYSTEM"; } || : FA=$(lsattr "$SYSTEM") @@ -256,8 +261,12 @@ PART="$TMP/partition.fdisk" sfdisk -q "$SYSTEM" < "$PART" MOUNT="$TMP/system" -rm -rf "$MOUNT" && mkdir -p "$MOUNT" +rm -rf "$MOUNT" +if ! makeDir "$MOUNT"; then + error "Failed to create directory \"$MOUNT\" !" && exit 93 +fi + MSG="Extracting system partition..." info "Install: $MSG" && html "$MSG" @@ -291,6 +300,7 @@ fakeroot -- bash -c "set -Eeu;\ rm -rf "$MOUNT" echo "$BASE" > "$STORAGE/dsm.ver" +! setOwner "$STORAGE/dsm.ver" && error "Failed to set the owner for \"$STORAGE/dsm.ver\" !" if [[ "$URL" == "file://$STORAGE/$BASE.pat" ]]; then rm -f "$PAT" @@ -298,7 +308,13 @@ else mv -f "$PAT" "$STORAGE/$BASE.pat" fi +if [ -f "$STORAGE/$BASE.pat" ]; then + ! setOwner "$STORAGE/$BASE.pat" && error "Failed to set the owner for \"$STORAGE/$BASE.pat\" !" +fi + mv -f "$BOOT" "$STORAGE/$BASE.boot.img" +! setOwner "$STORAGE/$BASE.boot.img" && error "Failed to set the owner for \"$STORAGE/$BASE.boot.img\" !" + rm -rf "$TMP" return 0 diff --git a/src/network.sh b/src/network.sh index 8a45ad1..78f639f 100644 --- a/src/network.sh +++ b/src/network.sh @@ -218,11 +218,14 @@ getUserPorts() { for hostport in ${exclude//,/ }; do - local val="${hostport///tcp}" + local port="${hostport///tcp}" + port="${port///udp}" - if [[ "$num" == "${val///udp}" ]]; then + if [[ "$num" == "$port" ]]; then num="" - warn "Could not assign port ${val///udp} to \"USER_PORTS\" because it is already in \"HOST_PORTS\"!" + if [[ "$port" != "$WEB_PORT" ]]; then + warn "Could not assign port $port to \"USER_PORTS\" because it is already in \"HOST_PORTS\"!" + fi fi done @@ -343,6 +346,12 @@ configurePasst() { PASST_OPTS+=" -H $VM_NET_HOST" PASST_OPTS+=" -M $GATEWAY_MAC" + + local uid gid + uid=$(id -u) + gid=$(id -g) + PASST_OPTS+=" --runas $uid:$gid" + PASST_OPTS+=" -P /var/run/passt.pid" PASST_OPTS+=" -l $log" PASST_OPTS+=" -q" @@ -697,7 +706,7 @@ getInfo() { [ -z "$MTU" ] && MTU="0" if [[ "${ADAPTER,,}" != "virtio-net-pci" ]]; then - if [[ "$MTU" != "0" && "$MTU" != "1500" ]]; then + if [[ "$MTU" != "0" ]] && [ "$MTU" -lt "1500" ]; then warn "MTU size is $MTU, but cannot be set for $ADAPTER adapters!" && MTU="0" fi fi @@ -710,6 +719,7 @@ getInfo() { # Generate MAC address based on Docker container ID in hostname VM_NET_MAC=$(echo "$HOST" | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:11:32:\3:\4:\5/') echo "${VM_NET_MAC^^}" > "$file" + ! setOwner "$file" && error "Failed to set the owner for \"$file\" !" fi fi @@ -828,7 +838,7 @@ else "passt" | "slirp" ) if [ -z "$USER_PORTS" ]; then - info "Notice: because user-mode networking is active, if you need to expose ports, add them to the \"USER_PORTS\" variable." + info "Notice: because user-mode networking is active, when you need to forward custom ports to DSM, add them to the \"USER_PORTS\" variable." fi ;; esac diff --git a/src/reset.sh b/src/reset.sh index b5e7679..f569a99 100644 --- a/src/reset.sh +++ b/src/reset.sh @@ -78,8 +78,7 @@ fi # Check folder -if [[ "${COMMIT:-}" == [Yy1]* ]]; then - STORAGE="/local" +if [[ "${STORAGE,,}" != "/storage" ]]; then mkdir -p "$STORAGE" fi @@ -88,7 +87,9 @@ if [ ! -d "$STORAGE" ]; then fi if [ ! -w "$STORAGE" ]; then - error "Storage folder ($STORAGE) is not writeable!" && exit 13 + msg="Storage folder ($STORAGE) is not writeable!" + msg+=" If SELinux is active, you need to add the \":Z\" flag to the bind mount." + error "$msg" && exit 13 fi # Check filesystem diff --git a/src/utils.sh b/src/utils.sh index 9fa4929..062c502 100644 --- a/src/utils.sh +++ b/src/utils.sh @@ -67,6 +67,37 @@ fKill() { return 0 } +setOwner() { + local file="$1" + local dir uid gid + + [ ! -f "$file" ] && return 1 + + dir=$(dirname -- "$file") + uid=$(stat -c '%u' "$dir") + gid=$(stat -c '%g' "$dir") + + ! chown "$uid:$gid" "$file" && return 1 + + return 0 +} + +makeDir() { + local path="$1" + local dir uid gid + + [ -d "$path" ] && return 0 + ! mkdir -p "$path" && return 1 + + dir=$(dirname -- "$path") + uid=$(stat -c '%u' "$dir") + gid=$(stat -c '%g' "$dir") + + ! chown "$uid:$gid" "$path" && return 1 + + return 0 +} + escape () { local s s=${1//&/\&} @@ -123,11 +154,11 @@ cpu() { fi cpu="${cpu// CPU/}" - cpu="${cpu// [0-9] Core}" - cpu="${cpu// [0-9][0-9] Core}" cpu="${cpu// [0-9][0-9][0-9] Core}" - cpu="${cpu//[0-9]th Gen }" + cpu="${cpu// [0-9][0-9] Core}" + cpu="${cpu// [0-9] Core}" cpu="${cpu//[0-9][0-9]th Gen }" + cpu="${cpu//[0-9]th Gen }" cpu="${cpu// Processor/}" cpu="${cpu// Quad core/}" cpu="${cpu// Dual core/}"