Unverified Commit a0328e1e authored by Kroese's avatar Kroese Committed by GitHub
Browse files

fix: Inherit owner from parent folder (#1092)

parent b7f5214a
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -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
+23 −7
Original line number Diff line number Diff line
@@ -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,9 +112,8 @@ 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
fi

  rm -rf "$TMP" && mkdir -p "$TMP"
fi

# Check free diskspace
ROOT_SPACE=536870912
@@ -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,7 +261,11 @@ 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
+15 −5
Original line number Diff line number Diff line
@@ -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
+4 −3
Original line number Diff line number Diff line
@@ -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
+34 −3
Original line number Diff line number Diff line
@@ -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//&/\&amp;}
@@ -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/}"