From e112361b43e8c93705cb5297d6b9c9e151983b3c Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Mon, 1 Sep 2025 13:53:54 +0200 Subject: [PATCH] Update share-common.func --- scripts/global/share-common.func | 161 ++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 3 deletions(-) diff --git a/scripts/global/share-common.func b/scripts/global/share-common.func index 75fcf0d..a595df9 100644 --- a/scripts/global/share-common.func +++ b/scripts/global/share-common.func @@ -41,7 +41,7 @@ pmx_share_map_set() { -pmx_choose_or_create_group() { +pmx_choose_or_create_group_() { local default_group="${1:-$PROXMENUX_DEFAULT_SHARE_GROUP}" local choice group_name @@ -95,7 +95,7 @@ pmx_choose_or_create_group() { -pmx_ensure_host_group() { +pmx_ensure_host_group_() { local group_name="$1" local suggested_gid="$2" @@ -138,6 +138,161 @@ pmx_ensure_host_group() { + + + + + + +pmx_choose_or_create_group() { + local default_group="${1:-$PROXMENUX_DEFAULT_SHARE_GROUP}" + local choice group_name groups menu_args gid_min + + # Detect GID_MIN (fallback 1000) + gid_min="$(awk '/^\s*GID_MIN\s+[0-9]+/ {print $2}' /etc/login.defs 2>/dev/null | tail -n1)" + [[ -z "$gid_min" ]] && gid_min=1000 + + choice=$(whiptail --title "$(translate "Shared Group")" \ + --menu "$(translate "Choose a group policy for this shared directory:")" 18 78 6 \ + "1" "$(translate "Use default group:") $default_group $(translate "(recommended)")" \ + "2" "$(translate "Create a new group for isolation")" \ + "3" "$(translate "Select an existing group")" \ + 3>&1 1>&2 2>&3) || { echo ""; return 1; } + + case "$choice" in + 1) + # Ensure exists; auto GID >= 101000 if creation is needed + pmx_ensure_host_group "$default_group" >/dev/null || { echo ""; return 1; } + echo "$default_group" + ;; + + 2) + group_name=$(whiptail --inputbox "$(translate "Enter new group name:")" 10 70 "sharedfiles-project" \ + --title "$(translate "New Group")" 3>&1 1>&2 2>&3) || { echo ""; return 1; } + + if [[ -z "$group_name" ]]; then + msg_error "$(translate "Group name cannot be empty.")" + echo ""; return 1 + fi + # POSIX-ish validation: start with letter/_ ; then letters/digits/_/- + if ! [[ "$group_name" =~ ^[a-zA-Z_][a-zA-Z0-9_-]*$ ]]; then + msg_error "$(translate "Invalid group name. Use letters, digits, underscore or hyphen, and start with a letter or underscore.")" + echo ""; return 1 + fi + + pmx_ensure_host_group "$group_name" >/dev/null || { echo ""; return 1; } + echo "$group_name" + ;; + + 3) + # Build list of real user groups (>= GID_MIN), exclude nogroup and pve* + groups=$(getent group | awk -F: -v MIN="$gid_min" ' + $3 >= MIN && $1 != "nogroup" && $1 !~ /^pve/ {print $0} + ' | sort -t: -k1,1) + + if [[ -z "$groups" ]]; then + whiptail --title "$(translate "Groups")" --msgbox "$(translate "No user groups found.")" 8 60 + echo ""; return 1 + fi + + menu_args=() + while IFS=: read -r gname _ gid members; do + menu_args+=("$gname" "GID=$gid") + done <<< "$groups" + + group_name=$(whiptail --title "$(translate "Existing Groups")" \ + --menu "$(translate "Select an existing group:")" 20 70 12 \ + "${menu_args[@]}" 3>&1 1>&2 2>&3) || { echo ""; return 1; } + + # Ensure (no-op if exists) + pmx_ensure_host_group "$group_name" >/dev/null || { echo ""; return 1; } + echo "$group_name" + ;; + + *) + echo ""; return 1 + ;; + esac +} + + + + + + + + + +pmx_ensure_host_group() { + local group_name="$1" + local suggested_gid="${2:-}" + local base_gid=101000 + local new_gid + + # Helper: return 0 if GID is in use, 1 otherwise + local _gid_in_use() { + local gid="$1" + # getent group prints "name:x:GID:members"; check numeric field 3 + getent group | awk -F: -v G="$gid" '$3==G {found=1} END{exit !found}' + } + + # If the group already exists, return its GID + if getent group "$group_name" >/dev/null 2>&1; then + getent group "$group_name" | cut -d: -f3 + return 0 + fi + + # Create with suggested GID (if provided) + if [[ -n "$suggested_gid" ]]; then + if _gid_in_use "$suggested_gid"; then + msg_error "$(translate "GID already in use:") $suggested_gid" + echo "" + return 1 + fi + if groupadd -g "$suggested_gid" "$group_name" >/dev/null 2>&1; then + msg_ok "$(translate "Group created:") $group_name" + else + msg_error "$(translate "Failed to create group:") $group_name" + echo "" + return 1 + fi + else + # Auto-pick first free GID >= 101000 + new_gid="$base_gid" + while _gid_in_use "$new_gid"; do + new_gid=$((new_gid+1)) + done + + if groupadd -g "$new_gid" "$group_name" >/dev/null 2>&1; then + msg_ok "$(translate "Group created:") $group_name" + else + msg_error "$(translate "Failed to create group:") $group_name" + echo "" + return 1 + fi + fi + + # Resolve and return the GID + local gid + gid="$(getent group "$group_name" | cut -d: -f3)" + if [[ -z "$gid" ]]; then + msg_error "$(translate "Failed to resolve group GID for") $group_name" + echo "" + return 1 + fi + + echo "$gid" + return 0 +} + + + + + + + + + pmx_prepare_host_shared_dir() { local dir="$1" group_name="$2" @@ -437,4 +592,4 @@ select_lxc_container() { echo "$ctid" return 0 -} \ No newline at end of file +}