mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-04-17 07:25:05 +02:00
Compare commits
7 Commits
fix/crafty
...
improve/bu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c05f7f858 | ||
|
|
be52f8e223 | ||
|
|
2008b1b458 | ||
|
|
a02bdf083d | ||
|
|
21e215dc1b | ||
|
|
6b9930c8df | ||
|
|
c3cb983085 |
@@ -67,22 +67,22 @@ EOF
|
|||||||
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
|
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
|
||||||
setting_up_container() {
|
setting_up_container() {
|
||||||
msg_info "Setting up Container OS"
|
msg_info "Setting up Container OS"
|
||||||
|
local _ip=""
|
||||||
while [ $i -gt 0 ]; do
|
while [ $i -gt 0 ]; do
|
||||||
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
|
_ip=$(ip -4 addr show 2>/dev/null | awk '/inet [0-9]/ && !/127\.0\.0\.1/ {sub(/\/.*/, "", $2); print $2; exit}')
|
||||||
break
|
[[ -n "$_ip" ]] && break
|
||||||
fi
|
|
||||||
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
||||||
sleep $RETRY_EVERY
|
sleep $RETRY_EVERY
|
||||||
i=$((i - 1))
|
i=$((i - 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
|
if [[ -z "$_ip" ]]; then
|
||||||
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
||||||
echo -e "${NETWORK}Check Network Settings"
|
echo -e "${NETWORK}Check Network Settings"
|
||||||
exit 121
|
exit 121
|
||||||
fi
|
fi
|
||||||
msg_ok "Set up Container OS"
|
msg_ok "Set up Container OS"
|
||||||
msg_ok "Network Connected: ${BL}$(ip addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
|
msg_ok "Network Connected: ${BL}${_ip}${CL}"
|
||||||
post_progress_to_api
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ download_with_progress() {
|
|||||||
# $1 url, $2 dest
|
# $1 url, $2 dest
|
||||||
local url="$1" out="$2" cl
|
local url="$1" out="$2" cl
|
||||||
need_tool curl pv || return 1
|
need_tool curl pv || return 1
|
||||||
cl=$(curl -fsSLI "$url" 2>/dev/null | awk 'tolower($0) ~ /^content-length:/ {print $2}' | tr -d '\r')
|
cl=$(curl -fsSLI "$url" 2>/dev/null | awk 'tolower($0) ~ /^content-length:/ {gsub(/\r/,""); print $2}')
|
||||||
if [ -n "$cl" ]; then
|
if [ -n "$cl" ]; then
|
||||||
curl -fsSL "$url" | pv -s "$cl" >"$out" || {
|
curl -fsSL "$url" | pv -s "$cl" >"$out" || {
|
||||||
msg_error "Download failed: $url"
|
msg_error "Download failed: $url"
|
||||||
|
|||||||
@@ -348,10 +348,10 @@ explain_exit_code() {
|
|||||||
json_escape() {
|
json_escape() {
|
||||||
# Escape a string for safe JSON embedding using awk (handles any input size).
|
# Escape a string for safe JSON embedding using awk (handles any input size).
|
||||||
# Pipeline: strip ANSI → remove control chars → escape \ " TAB → join lines with \n
|
# Pipeline: strip ANSI → remove control chars → escape \ " TAB → join lines with \n
|
||||||
printf '%s' "$1" \
|
printf '%s' "$1" |
|
||||||
| sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' \
|
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' |
|
||||||
| tr -d '\000-\010\013\014\016-\037\177\r' \
|
tr -d '\000-\010\013\014\016-\037\177\r' |
|
||||||
| awk '
|
awk '
|
||||||
BEGIN { ORS = "" }
|
BEGIN { ORS = "" }
|
||||||
{
|
{
|
||||||
gsub(/\\/, "\\\\") # backslash → \\
|
gsub(/\\/, "\\\\") # backslash → \\
|
||||||
@@ -401,7 +401,7 @@ get_error_text() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "$logfile" && -s "$logfile" ]]; then
|
if [[ -n "$logfile" && -s "$logfile" ]]; then
|
||||||
tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//' | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'
|
tail -n 20 "$logfile" 2>/dev/null | sed -E 's/\r$//; s/\x1b\[[0-9;]*[a-zA-Z]//g'
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,7 +508,8 @@ detect_gpu() {
|
|||||||
|
|
||||||
if [[ -n "$gpu_line" ]]; then
|
if [[ -n "$gpu_line" ]]; then
|
||||||
# Extract model: everything after the colon, clean up
|
# Extract model: everything after the colon, clean up
|
||||||
GPU_MODEL=$(echo "$gpu_line" | sed 's/.*: //' | sed 's/ (rev .*)$//' | cut -c1-64)
|
GPU_MODEL=$(echo "$gpu_line" | sed -E 's/.*: //; s/ \(rev .*\)$//')
|
||||||
|
GPU_MODEL="${GPU_MODEL:0:64}"
|
||||||
|
|
||||||
# Detect vendor and passthrough type
|
# Detect vendor and passthrough type
|
||||||
if echo "$gpu_line" | grep -qi "Intel"; then
|
if echo "$gpu_line" | grep -qi "Intel"; then
|
||||||
@@ -557,7 +558,8 @@ detect_cpu() {
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Extract model name and clean it up
|
# Extract model name and clean it up
|
||||||
CPU_MODEL=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^ *//' | sed 's/(R)//g' | sed 's/(TM)//g' | sed 's/ */ /g' | cut -c1-64)
|
CPU_MODEL=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed -E 's/^ *//; s/\(R\)//g; s/\(TM\)//g; s/ +/ /g')
|
||||||
|
CPU_MODEL="${CPU_MODEL:0:64}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export CPU_VENDOR CPU_MODEL
|
export CPU_VENDOR CPU_MODEL
|
||||||
@@ -1325,11 +1327,16 @@ post_addon_to_api() {
|
|||||||
error_category=$(categorize_error "$exit_code")
|
error_category=$(categorize_error "$exit_code")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Detect OS info
|
# Detect OS info (single read)
|
||||||
local os_type="" os_version=""
|
local os_type="" os_version=""
|
||||||
if [[ -f /etc/os-release ]]; then
|
if [[ -f /etc/os-release ]]; then
|
||||||
os_type=$(grep "^ID=" /etc/os-release | cut -d= -f2 | tr -d '"')
|
while IFS='=' read -r _k _v; do
|
||||||
os_version=$(grep "^VERSION_ID=" /etc/os-release | cut -d= -f2 | tr -d '"')
|
_v="${_v//\"/}"
|
||||||
|
case "$_k" in
|
||||||
|
ID) os_type="$_v" ;;
|
||||||
|
VERSION_ID) os_version="$_v" ;;
|
||||||
|
esac
|
||||||
|
done </etc/os-release
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local JSON_PAYLOAD
|
local JSON_PAYLOAD
|
||||||
|
|||||||
865
misc/build.func
865
misc/build.func
File diff suppressed because it is too large
Load Diff
@@ -1644,7 +1644,7 @@ function get_lxc_ip() {
|
|||||||
local ip
|
local ip
|
||||||
|
|
||||||
# Try direct interface lookup for eth0 FIRST (most reliable for LXC) - IPv4
|
# Try direct interface lookup for eth0 FIRST (most reliable for LXC) - IPv4
|
||||||
ip=$(ip -4 addr show eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1)
|
ip=$(ip -4 addr show eth0 2>/dev/null | awk '/inet / {sub(/\/.*/, "", $2); print $2; exit}')
|
||||||
if [[ -n "$ip" && "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
if [[ -n "$ip" && "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
echo "$ip"
|
echo "$ip"
|
||||||
return 0
|
return 0
|
||||||
@@ -1652,11 +1652,14 @@ function get_lxc_ip() {
|
|||||||
|
|
||||||
# Fallback: Try hostname -I (returns IPv4 first if available)
|
# Fallback: Try hostname -I (returns IPv4 first if available)
|
||||||
if command -v hostname >/dev/null 2>&1; then
|
if command -v hostname >/dev/null 2>&1; then
|
||||||
ip=$(hostname -I 2>/dev/null | awk '{print $1}')
|
local -a _ips
|
||||||
if [[ -n "$ip" && "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
read -ra _ips <<<"$(hostname -I 2>/dev/null)"
|
||||||
echo "$ip"
|
for ip in "${_ips[@]}"; do
|
||||||
return 0
|
if [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
fi
|
echo "$ip"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Try routing table with IPv4 targets
|
# Try routing table with IPv4 targets
|
||||||
@@ -1674,7 +1677,7 @@ function get_lxc_ip() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
# IPv6 fallback: Try direct interface lookup for eth0
|
# IPv6 fallback: Try direct interface lookup for eth0
|
||||||
ip=$(ip -6 addr show eth0 scope global 2>/dev/null | awk '/inet6 / {print $2}' | cut -d/ -f1 | head -n1)
|
ip=$(ip -6 addr show eth0 scope global 2>/dev/null | awk '/inet6 / {sub(/\/.*/, "", $2); print $2; exit}')
|
||||||
if [[ -n "$ip" && "$ip" =~ : ]]; then
|
if [[ -n "$ip" && "$ip" =~ : ]]; then
|
||||||
echo "$ip"
|
echo "$ip"
|
||||||
return 0
|
return 0
|
||||||
@@ -1682,11 +1685,14 @@ function get_lxc_ip() {
|
|||||||
|
|
||||||
# IPv6 fallback: Try hostname -I for IPv6
|
# IPv6 fallback: Try hostname -I for IPv6
|
||||||
if command -v hostname >/dev/null 2>&1; then
|
if command -v hostname >/dev/null 2>&1; then
|
||||||
ip=$(hostname -I 2>/dev/null | tr ' ' '\n' | grep -E ':' | head -n1)
|
local -a _ips6
|
||||||
if [[ -n "$ip" && "$ip" =~ : ]]; then
|
read -ra _ips6 <<<"$(hostname -I 2>/dev/null)"
|
||||||
echo "$ip"
|
for ip in "${_ips6[@]}"; do
|
||||||
return 0
|
[[ "$ip" == *:* ]] && {
|
||||||
fi
|
echo "$ip"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# IPv6 fallback: Use routing table with IPv6 targets
|
# IPv6 fallback: Use routing table with IPv6 targets
|
||||||
|
|||||||
@@ -116,14 +116,14 @@ setting_up_container() {
|
|||||||
(chown root:root / 2>/dev/null) || true
|
(chown root:root / 2>/dev/null) || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local _host_ip=""
|
||||||
for ((i = RETRY_NUM; i > 0; i--)); do
|
for ((i = RETRY_NUM; i > 0; i--)); do
|
||||||
if [ "$(hostname -I)" != "" ]; then
|
_host_ip=$(hostname -I 2>/dev/null | awk '{print $1}')
|
||||||
break
|
[[ -n "$_host_ip" ]] && break
|
||||||
fi
|
|
||||||
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
||||||
sleep $RETRY_EVERY
|
sleep $RETRY_EVERY
|
||||||
done
|
done
|
||||||
if [ "$(hostname -I)" = "" ]; then
|
if [[ -z "$_host_ip" ]]; then
|
||||||
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
||||||
echo -e "${NETWORK}Check Network Settings"
|
echo -e "${NETWORK}Check Network Settings"
|
||||||
exit 121
|
exit 121
|
||||||
@@ -131,8 +131,7 @@ setting_up_container() {
|
|||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||||
systemctl disable -q --now systemd-networkd-wait-online.service
|
systemctl disable -q --now systemd-networkd-wait-online.service
|
||||||
msg_ok "Set up Container OS"
|
msg_ok "Set up Container OS"
|
||||||
#msg_custom "${CM}" "${GN}" "Network Connected: ${BL}$(hostname -I)"
|
msg_ok "Network Connected: ${BL}${_host_ip}"
|
||||||
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
|
||||||
post_progress_to_api
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -700,7 +700,7 @@ manage_tool_repository() {
|
|||||||
local gpg_key_url="${4:-}"
|
local gpg_key_url="${4:-}"
|
||||||
local distro_id repo_component suite
|
local distro_id repo_component suite
|
||||||
|
|
||||||
distro_id=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
distro_id=$(get_os_info id)
|
||||||
|
|
||||||
case "$tool_name" in
|
case "$tool_name" in
|
||||||
mariadb)
|
mariadb)
|
||||||
@@ -714,7 +714,7 @@ manage_tool_repository() {
|
|||||||
|
|
||||||
# Get suite for fallback handling
|
# Get suite for fallback handling
|
||||||
local distro_codename
|
local distro_codename
|
||||||
distro_codename=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
distro_codename=$(get_os_info codename)
|
||||||
suite=$(get_fallback_suite "$distro_id" "$distro_codename" "$repo_url/$distro_id")
|
suite=$(get_fallback_suite "$distro_id" "$distro_codename" "$repo_url/$distro_id")
|
||||||
|
|
||||||
# Setup new repository using deb822 format
|
# Setup new repository using deb822 format
|
||||||
@@ -745,7 +745,7 @@ manage_tool_repository() {
|
|||||||
|
|
||||||
# Setup repository
|
# Setup repository
|
||||||
local distro_codename
|
local distro_codename
|
||||||
distro_codename=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
distro_codename=$(get_os_info codename)
|
||||||
|
|
||||||
# Suite mapping with fallback for newer releases not yet supported by upstream
|
# Suite mapping with fallback for newer releases not yet supported by upstream
|
||||||
if [[ "$distro_id" == "debian" ]]; then
|
if [[ "$distro_id" == "debian" ]]; then
|
||||||
@@ -816,7 +816,7 @@ EOF
|
|||||||
|
|
||||||
# NodeSource uses deb822 format with GPG from repo
|
# NodeSource uses deb822 format with GPG from repo
|
||||||
local distro_codename
|
local distro_codename
|
||||||
distro_codename=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
distro_codename=$(get_os_info codename)
|
||||||
|
|
||||||
# Download GPG key from NodeSource with retry logic
|
# Download GPG key from NodeSource with retry logic
|
||||||
if ! download_gpg_key "$gpg_key_url" "/etc/apt/keyrings/nodesource.gpg" "dearmor"; then
|
if ! download_gpg_key "$gpg_key_url" "/etc/apt/keyrings/nodesource.gpg" "dearmor"; then
|
||||||
@@ -858,7 +858,7 @@ EOF
|
|||||||
|
|
||||||
# Setup repository
|
# Setup repository
|
||||||
local distro_codename
|
local distro_codename
|
||||||
distro_codename=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
distro_codename=$(get_os_info codename)
|
||||||
cat <<EOF >/etc/apt/sources.list.d/php.sources
|
cat <<EOF >/etc/apt/sources.list.d/php.sources
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: https://packages.sury.org/php
|
URIs: https://packages.sury.org/php
|
||||||
@@ -886,7 +886,7 @@ EOF
|
|||||||
|
|
||||||
# Setup repository
|
# Setup repository
|
||||||
local distro_codename
|
local distro_codename
|
||||||
distro_codename=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
distro_codename=$(get_os_info codename)
|
||||||
cat <<EOF >/etc/apt/sources.list.d/postgresql.sources
|
cat <<EOF >/etc/apt/sources.list.d/postgresql.sources
|
||||||
Types: deb
|
Types: deb
|
||||||
URIs: http://apt.postgresql.org/pub/repos/apt
|
URIs: http://apt.postgresql.org/pub/repos/apt
|
||||||
@@ -1323,10 +1323,16 @@ get_os_info() {
|
|||||||
|
|
||||||
# Cache OS info to avoid repeated file reads
|
# Cache OS info to avoid repeated file reads
|
||||||
if [[ -z "${_OS_ID:-}" ]]; then
|
if [[ -z "${_OS_ID:-}" ]]; then
|
||||||
export _OS_ID=$(awk -F= '/^ID=/{gsub(/"/,"",$2); print $2}' /etc/os-release)
|
local _line
|
||||||
export _OS_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{gsub(/"/,"",$2); print $2}' /etc/os-release)
|
while IFS='=' read -r _key _val; do
|
||||||
export _OS_VERSION=$(awk -F= '/^VERSION_ID=/{gsub(/"/,"",$2); print $2}' /etc/os-release)
|
_val="${_val//\"/}"
|
||||||
export _OS_VERSION_FULL=$(awk -F= '/^VERSION=/{gsub(/"/,"",$2); print $2}' /etc/os-release)
|
case "$_key" in
|
||||||
|
ID) export _OS_ID="$_val" ;;
|
||||||
|
VERSION_CODENAME) export _OS_CODENAME="$_val" ;;
|
||||||
|
VERSION_ID) export _OS_VERSION="$_val" ;;
|
||||||
|
VERSION) export _OS_VERSION_FULL="$_val" ;;
|
||||||
|
esac
|
||||||
|
done </etc/os-release
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$field" in
|
case "$field" in
|
||||||
@@ -2144,8 +2150,8 @@ fetch_and_deploy_gh_tag() {
|
|||||||
local repo="$2"
|
local repo="$2"
|
||||||
local version="${3:-latest}"
|
local version="${3:-latest}"
|
||||||
local target="${4:-/opt/$app}"
|
local target="${4:-/opt/$app}"
|
||||||
local app_lc=""
|
local app_lc="${app,,}"
|
||||||
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
app_lc="${app_lc// /}"
|
||||||
local version_file="$HOME/.${app_lc}"
|
local version_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
if [[ "$version" == "latest" ]]; then
|
if [[ "$version" == "latest" ]]; then
|
||||||
@@ -2221,8 +2227,8 @@ check_for_gh_tag() {
|
|||||||
local app="$1"
|
local app="$1"
|
||||||
local repo="$2"
|
local repo="$2"
|
||||||
local prefix="${3:-}"
|
local prefix="${3:-}"
|
||||||
local app_lc=""
|
local app_lc="${app,,}"
|
||||||
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
app_lc="${app_lc// /}"
|
||||||
local current_file="$HOME/.${app_lc}"
|
local current_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
msg_info "Checking for update: ${app}"
|
msg_info "Checking for update: ${app}"
|
||||||
@@ -2272,8 +2278,8 @@ check_for_gh_release() {
|
|||||||
local source="$2"
|
local source="$2"
|
||||||
local pinned_version_in="${3:-}" # optional
|
local pinned_version_in="${3:-}" # optional
|
||||||
local pin_reason="${4:-}" # optional reason shown to user
|
local pin_reason="${4:-}" # optional reason shown to user
|
||||||
local app_lc=""
|
local app_lc="${app,,}"
|
||||||
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
app_lc="${app_lc// /}"
|
||||||
local current_file="$HOME/.${app_lc}"
|
local current_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
msg_info "Checking for update: ${app}"
|
msg_info "Checking for update: ${app}"
|
||||||
@@ -2600,7 +2606,8 @@ create_self_signed_cert() {
|
|||||||
local APP_NAME="${1:-${APPLICATION}}"
|
local APP_NAME="${1:-${APPLICATION}}"
|
||||||
local HOSTNAME="$(hostname -f)"
|
local HOSTNAME="$(hostname -f)"
|
||||||
local IP="$(hostname -I | awk '{print $1}')"
|
local IP="$(hostname -I | awk '{print $1}')"
|
||||||
local APP_NAME_LC=$(echo "${APP_NAME,,}" | tr -d ' ')
|
local APP_NAME_LC="${APP_NAME,,}"
|
||||||
|
APP_NAME_LC="${APP_NAME_LC// /}"
|
||||||
local CERT_DIR="/etc/ssl/${APP_NAME_LC}"
|
local CERT_DIR="/etc/ssl/${APP_NAME_LC}"
|
||||||
local CERT_KEY="${CERT_DIR}/${APP_NAME_LC}.key"
|
local CERT_KEY="${CERT_DIR}/${APP_NAME_LC}.key"
|
||||||
local CERT_CRT="${CERT_DIR}/${APP_NAME_LC}.crt"
|
local CERT_CRT="${CERT_DIR}/${APP_NAME_LC}.crt"
|
||||||
@@ -2647,7 +2654,7 @@ function download_with_progress() {
|
|||||||
|
|
||||||
# Content-Length aus HTTP-Header holen
|
# Content-Length aus HTTP-Header holen
|
||||||
local content_length
|
local content_length
|
||||||
content_length=$(curl -fsSLI "$url" | awk '/Content-Length/ {print $2}' | tr -d '\r' || true)
|
content_length=$(curl -fsSLI "$url" | awk '/Content-Length/ {gsub(/\r/,""); print $2}' || true)
|
||||||
|
|
||||||
if [[ -z "$content_length" ]]; then
|
if [[ -z "$content_length" ]]; then
|
||||||
if ! curl -fL# -o "$output" "$url"; then
|
if ! curl -fL# -o "$output" "$url"; then
|
||||||
@@ -2766,7 +2773,8 @@ function fetch_and_deploy_codeberg_release() {
|
|||||||
local target="${5:-/opt/$app}"
|
local target="${5:-/opt/$app}"
|
||||||
local asset_pattern="${6:-}"
|
local asset_pattern="${6:-}"
|
||||||
|
|
||||||
local app_lc=$(echo "${app,,}" | tr -d ' ')
|
local app_lc="${app,,}"
|
||||||
|
app_lc="${app_lc// /}"
|
||||||
local version_file="$HOME/.${app_lc}"
|
local version_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
local api_timeouts=(60 120 240)
|
local api_timeouts=(60 120 240)
|
||||||
@@ -3318,7 +3326,8 @@ function fetch_and_deploy_gh_release() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local app_lc=$(echo "${app,,}" | tr -d ' ')
|
local app_lc="${app,,}"
|
||||||
|
app_lc="${app_lc// /}"
|
||||||
local version_file="$HOME/.${app_lc}"
|
local version_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
local api_timeouts=(60 120 240)
|
local api_timeouts=(60 120 240)
|
||||||
@@ -4409,7 +4418,7 @@ function setup_hwaccel() {
|
|||||||
# Parse comma-separated numbers
|
# Parse comma-separated numbers
|
||||||
IFS=',' read -ra nums <<<"$selection"
|
IFS=',' read -ra nums <<<"$selection"
|
||||||
for num in "${nums[@]}"; do
|
for num in "${nums[@]}"; do
|
||||||
num=$(echo "$num" | tr -d ' ')
|
num="${num// /}"
|
||||||
if [[ "$num" =~ ^[0-9]+$ ]] && ((num >= 1 && num <= gpu_count)); then
|
if [[ "$num" =~ ^[0-9]+$ ]] && ((num >= 1 && num <= gpu_count)); then
|
||||||
SELECTED_INDICES+=("$((num - 1))")
|
SELECTED_INDICES+=("$((num - 1))")
|
||||||
fi
|
fi
|
||||||
@@ -4451,9 +4460,9 @@ function setup_hwaccel() {
|
|||||||
# OS Detection
|
# OS Detection
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
local os_id os_codename os_version
|
local os_id os_codename os_version
|
||||||
os_id=$(grep -oP '(?<=^ID=).+' /etc/os-release 2>/dev/null | tr -d '"' || echo "debian")
|
os_id=$(get_os_info id)
|
||||||
os_codename=$(grep -oP '(?<=^VERSION_CODENAME=).+' /etc/os-release 2>/dev/null | tr -d '"' || echo "unknown")
|
os_codename=$(get_os_info codename)
|
||||||
os_version=$(grep -oP '(?<=^VERSION_ID=).+' /etc/os-release 2>/dev/null | tr -d '"' || echo "")
|
os_version=$(get_os_info version)
|
||||||
[[ -z "$os_id" ]] && os_id="debian"
|
[[ -z "$os_id" ]] && os_id="debian"
|
||||||
|
|
||||||
local in_ct="${CTTYPE:-0}"
|
local in_ct="${CTTYPE:-0}"
|
||||||
@@ -5339,8 +5348,8 @@ function setup_imagemagick() {
|
|||||||
function setup_java() {
|
function setup_java() {
|
||||||
local JAVA_VERSION="${JAVA_VERSION:-21}"
|
local JAVA_VERSION="${JAVA_VERSION:-21}"
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(get_os_info id)
|
||||||
DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
|
DISTRO_CODENAME=$(get_os_info codename)
|
||||||
local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
|
local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
|
||||||
|
|
||||||
# Prepare repository (cleanup + validation)
|
# Prepare repository (cleanup + validation)
|
||||||
@@ -5595,7 +5604,7 @@ EOF
|
|||||||
if [[ -n "$CURRENT_VERSION" ]]; then
|
if [[ -n "$CURRENT_VERSION" ]]; then
|
||||||
# Get available distro version
|
# Get available distro version
|
||||||
local DISTRO_VERSION=""
|
local DISTRO_VERSION=""
|
||||||
DISTRO_VERSION=$(apt-cache policy mariadb-server 2>/dev/null | grep -E "Candidate:" | awk '{print $2}' | grep -oP '^\d+:\K\d+\.\d+\.\d+' || echo "")
|
DISTRO_VERSION=$(apt-cache policy mariadb-server 2>/dev/null | awk '/Candidate:/ {sub(/^[0-9]+:/, "", $2); print $2}' || echo "")
|
||||||
|
|
||||||
if [[ -n "$DISTRO_VERSION" ]]; then
|
if [[ -n "$DISTRO_VERSION" ]]; then
|
||||||
# Compare versions - if current is higher, keep it
|
# Compare versions - if current is higher, keep it
|
||||||
@@ -5996,8 +6005,8 @@ function setup_mysql() {
|
|||||||
local MYSQL_VERSION="${MYSQL_VERSION:-8.0}"
|
local MYSQL_VERSION="${MYSQL_VERSION:-8.0}"
|
||||||
local USE_MYSQL_REPO="${USE_MYSQL_REPO:-true}"
|
local USE_MYSQL_REPO="${USE_MYSQL_REPO:-true}"
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(get_os_info id)
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
DISTRO_CODENAME=$(get_os_info codename)
|
||||||
|
|
||||||
# Ensure non-interactive mode for all apt operations
|
# Ensure non-interactive mode for all apt operations
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
@@ -6343,7 +6352,7 @@ function setup_nodejs() {
|
|||||||
|
|
||||||
# Check if the module is already installed
|
# Check if the module is already installed
|
||||||
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
|
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
|
||||||
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')"
|
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | awk -F@ -v mod="$MODULE_NAME" '$0 ~ mod"@" {gsub(/[[:space:]]/, "", $2); print $2}' || echo '')"
|
||||||
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
||||||
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
||||||
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
|
||||||
@@ -6414,8 +6423,8 @@ function setup_php() {
|
|||||||
local PHP_APACHE="${PHP_APACHE:-NO}"
|
local PHP_APACHE="${PHP_APACHE:-NO}"
|
||||||
local PHP_FPM="${PHP_FPM:-NO}"
|
local PHP_FPM="${PHP_FPM:-NO}"
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(get_os_info id)
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
DISTRO_CODENAME=$(get_os_info codename)
|
||||||
|
|
||||||
# Parse version for compatibility checks
|
# Parse version for compatibility checks
|
||||||
local PHP_MAJOR="${PHP_VERSION%%.*}"
|
local PHP_MAJOR="${PHP_VERSION%%.*}"
|
||||||
@@ -6462,7 +6471,7 @@ function setup_php() {
|
|||||||
local FILTERED_MODULES=""
|
local FILTERED_MODULES=""
|
||||||
IFS=',' read -ra ALL_MODULES <<<"$COMBINED_MODULES"
|
IFS=',' read -ra ALL_MODULES <<<"$COMBINED_MODULES"
|
||||||
for mod in "${ALL_MODULES[@]}"; do
|
for mod in "${ALL_MODULES[@]}"; do
|
||||||
mod=$(echo "$mod" | tr -d '[:space:]')
|
mod="${mod//[[:space:]]/}"
|
||||||
[[ -z "$mod" ]] && continue
|
[[ -z "$mod" ]] && continue
|
||||||
|
|
||||||
# Skip if it's a known built-in module
|
# Skip if it's a known built-in module
|
||||||
@@ -6479,7 +6488,7 @@ function setup_php() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Deduplicate
|
# Deduplicate
|
||||||
COMBINED_MODULES=$(echo "$FILTERED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
|
COMBINED_MODULES=$(awk -v RS=',' '!seen[$0]++{printf "%s%s", sep, $0; sep=","}' <<<"$FILTERED_MODULES")
|
||||||
|
|
||||||
# Get current PHP-CLI version
|
# Get current PHP-CLI version
|
||||||
local CURRENT_PHP=""
|
local CURRENT_PHP=""
|
||||||
@@ -6548,7 +6557,7 @@ EOF
|
|||||||
|
|
||||||
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
||||||
for mod in "${MODULES[@]}"; do
|
for mod in "${MODULES[@]}"; do
|
||||||
mod=$(echo "$mod" | tr -d '[:space:]')
|
mod="${mod//[[:space:]]/}"
|
||||||
[[ -z "$mod" ]] && continue
|
[[ -z "$mod" ]] && continue
|
||||||
|
|
||||||
local pkg_name="php${PHP_VERSION}-${mod}"
|
local pkg_name="php${PHP_VERSION}-${mod}"
|
||||||
@@ -6727,8 +6736,8 @@ setup_postgresql() {
|
|||||||
local PG_MODULES="${PG_MODULES:-}"
|
local PG_MODULES="${PG_MODULES:-}"
|
||||||
local USE_PGDG_REPO="${USE_PGDG_REPO:-true}"
|
local USE_PGDG_REPO="${USE_PGDG_REPO:-true}"
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(get_os_info id)
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
DISTRO_CODENAME=$(get_os_info codename)
|
||||||
|
|
||||||
# Ensure non-interactive mode for all apt operations
|
# Ensure non-interactive mode for all apt operations
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
@@ -7571,8 +7580,8 @@ EOF
|
|||||||
function setup_clickhouse() {
|
function setup_clickhouse() {
|
||||||
local CLICKHOUSE_VERSION="${CLICKHOUSE_VERSION:-latest}"
|
local CLICKHOUSE_VERSION="${CLICKHOUSE_VERSION:-latest}"
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(get_os_info id)
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
DISTRO_CODENAME=$(get_os_info codename)
|
||||||
|
|
||||||
# Ensure non-interactive mode for all apt operations
|
# Ensure non-interactive mode for all apt operations
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
@@ -7786,7 +7795,7 @@ function setup_rust() {
|
|||||||
|
|
||||||
# Check if already installed
|
# Check if already installed
|
||||||
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then
|
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then
|
||||||
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo '')
|
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{gsub(/[v:]/, "", $2); print $2}' || echo '')
|
||||||
|
|
||||||
if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
|
if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
|
||||||
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
|
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
|
||||||
|
|||||||
Reference in New Issue
Block a user