mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-08-03 19:43:05 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5dacb7bdfc | |||
| 9debedc386 | |||
| 64448c0ded |
@@ -518,6 +518,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-08-03
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix restore env in split pro [@johanngrobe](https://github.com/johanngrobe) ([#16228](https://github.com/community-scripts/ProxmoxVE/pull/16228))
|
||||
|
||||
## 2026-08-02
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
RELEASE=$(get_latest_github_release "actualbudget/actual")
|
||||
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
||||
if check_for_gh_release "actualbudget" "actualbudget/actual"; then
|
||||
|
||||
@@ -43,8 +43,6 @@ function update_script() {
|
||||
fi
|
||||
msg_ok "New version available: ${LATEST}"
|
||||
|
||||
NODE_VERSION="26" setup_nodejs
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop omniroute
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
+3
-5
@@ -35,18 +35,16 @@ function update_script() {
|
||||
systemctl stop split-pro
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Data"
|
||||
cp /opt/split-pro/.env /opt/split-pro.env
|
||||
msg_ok "Backed up Data"
|
||||
create_backup /opt/split-pro/.env
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "split-pro" "oss-apps/split-pro" "tarball"
|
||||
|
||||
restore_backup
|
||||
|
||||
msg_info "Building Application"
|
||||
cd /opt/split-pro
|
||||
$STD pnpm install --frozen-lockfile
|
||||
$STD pnpm build
|
||||
cp /opt/split-pro.env /opt/split-pro/.env
|
||||
rm -f /opt/split-pro.env
|
||||
ln -sf /opt/split-pro_data/uploads /opt/split-pro/uploads
|
||||
$STD pnpm exec prisma migrate deploy
|
||||
msg_ok "Built Application"
|
||||
|
||||
@@ -34,8 +34,6 @@ function update_script() {
|
||||
systemctl stop watcharr
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
create_backup /opt/watcharr/server/data
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
||||
restore_backup
|
||||
|
||||
@@ -19,7 +19,7 @@ $STD apt install -y \
|
||||
g++
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
create_self_signed_cert
|
||||
|
||||
msg_info "Installing Actual Budget"
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
NODE_VERSION="26" setup_nodejs
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Installing OmniRoute"
|
||||
$STD npm install -g omniroute@latest
|
||||
|
||||
@@ -18,7 +18,7 @@ $STD apt install -y gcc
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
setup_go
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
||||
|
||||
msg_info "Setup Watcharr"
|
||||
|
||||
@@ -126,7 +126,7 @@ network_check() {
|
||||
fi
|
||||
|
||||
if [[ $ipv4_connected == false ]]; then
|
||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt
|
||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt </dev/tty
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
||||
else
|
||||
|
||||
+2
-1
@@ -3917,7 +3917,7 @@ run_addon_updates() {
|
||||
name="${a##*/update_}"
|
||||
printf 'Do you also want to update addon "%s"? (y/N) [60s]: ' "$name"
|
||||
ans=""
|
||||
if read -r -t 60 ans; then :; else echo; fi
|
||||
if read -r -t 60 ans </dev/tty; then :; else echo; fi
|
||||
case "${ans,,}" in
|
||||
y | yes)
|
||||
bash "$a" || msg_warn "Addon update for $name failed (rc=$?)"
|
||||
@@ -5729,6 +5729,7 @@ EOF
|
||||
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
||||
# timing out - don't guess and destroy the container on a read we
|
||||
# couldn't actually capture; keep it since that's the reversible choice.
|
||||
while read -r -t 0.1 -n 1 _ </dev/tty 2>/dev/null; do :; done
|
||||
echo ""
|
||||
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
||||
msg_error "Remove it manually if not needed: pct destroy ${CTID}"
|
||||
|
||||
+7
-7
@@ -754,7 +754,7 @@ msg_info() {
|
||||
# Pause mode: Wait for Enter after each step
|
||||
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
||||
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
||||
read -r
|
||||
read -r </dev/tty
|
||||
fi
|
||||
return
|
||||
fi
|
||||
@@ -769,7 +769,7 @@ msg_info() {
|
||||
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
||||
stop_spinner
|
||||
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
||||
read -r
|
||||
read -r </dev/tty
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1217,7 +1217,7 @@ prompt_confirm() {
|
||||
# Interactive prompt with timeout
|
||||
echo -en "${YW}${message} ${hint} (auto-${default} in ${timeout}s): ${CL}"
|
||||
|
||||
if read -t "$timeout" -r response; then
|
||||
if read -t "$timeout" -r response </dev/tty; then
|
||||
# User provided input
|
||||
response="${response,,}" # lowercase
|
||||
case "$response" in
|
||||
@@ -1310,7 +1310,7 @@ prompt_input() {
|
||||
# Interactive prompt with timeout
|
||||
echo -en "${YW}${message}${hint} (auto-default in ${timeout}s): ${CL}" >&2
|
||||
|
||||
if read -t "$timeout" -r response; then
|
||||
if read -t "$timeout" -r response </dev/tty; then
|
||||
# User provided input (or pressed Enter for empty)
|
||||
if [[ -n "$response" ]]; then
|
||||
echo "$response"
|
||||
@@ -1412,7 +1412,7 @@ prompt_input_required() {
|
||||
|
||||
echo -en "${YW}${message} (required, timeout ${timeout}s): ${CL}" >&2
|
||||
|
||||
if read -t "$timeout" -r response; then
|
||||
if read -t "$timeout" -r response </dev/tty; then
|
||||
if [[ -z "$response" ]]; then
|
||||
echo -e "${YW}This field is required. Please enter a value. (attempt ${attempts}/3)${CL}" >&2
|
||||
fi
|
||||
@@ -1507,7 +1507,7 @@ prompt_select() {
|
||||
echo -en "${YW}Select [1-${num_options}] (auto-select ${default} in ${timeout}s): ${CL}" >&2
|
||||
|
||||
local response
|
||||
if read -t "$timeout" -r response; then
|
||||
if read -t "$timeout" -r response </dev/tty; then
|
||||
if [[ -z "$response" ]]; then
|
||||
# Empty response, use default
|
||||
echo "${options[$((default - 1))]}"
|
||||
@@ -1590,7 +1590,7 @@ prompt_password() {
|
||||
# Interactive prompt with timeout (silent input)
|
||||
echo -en "${YW}${message}${hint} (timeout ${timeout}s): ${CL}" >&2
|
||||
|
||||
if read -t "$timeout" -rs response; then
|
||||
if read -t "$timeout" -rs response </dev/tty; then
|
||||
echo "" >&2 # Newline after hidden input
|
||||
if [[ -n "$response" ]]; then
|
||||
# Validate minimum length
|
||||
|
||||
@@ -499,7 +499,7 @@ error_handler() {
|
||||
|
||||
local response=""
|
||||
local read_rc
|
||||
read -t 60 -r response
|
||||
read -t 60 -r response </dev/tty
|
||||
read_rc=$?
|
||||
if [[ $read_rc -eq 0 ]]; then
|
||||
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
|
||||
@@ -543,6 +543,7 @@ error_handler() {
|
||||
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
||||
# timing out - don't guess and destroy the container on a read we
|
||||
# couldn't actually capture; keep it since that's the reversible choice.
|
||||
while read -r -t 0.1 -n 1 _ </dev/tty 2>/dev/null; do :; done
|
||||
echo ""
|
||||
if declare -f msg_error >/dev/null 2>&1; then
|
||||
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
||||
|
||||
+1
-1
@@ -201,7 +201,7 @@ network_check() {
|
||||
|
||||
# If both IPv4 and IPv6 checks fail, prompt the user
|
||||
if [[ $ipv4_connected == false && $ipv6_connected == false ]]; then
|
||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt
|
||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt </dev/tty
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
||||
else
|
||||
|
||||
+8
-8
@@ -1466,7 +1466,7 @@ prompt_for_github_token() {
|
||||
fi
|
||||
|
||||
local reply
|
||||
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply
|
||||
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply </dev/tty
|
||||
reply="${reply:-n}"
|
||||
|
||||
if [[ ! "${reply,,}" =~ ^(y|yes)$ ]]; then
|
||||
@@ -1475,7 +1475,7 @@ prompt_for_github_token() {
|
||||
|
||||
local token
|
||||
while true; do
|
||||
read -rp "${TAB}Enter your GitHub PAT: " token
|
||||
read -rp "${TAB}Enter your GitHub PAT: " token </dev/tty
|
||||
# Trim leading/trailing whitespace
|
||||
token="$(echo "$token" | xargs)"
|
||||
if [[ -z "$token" ]]; then
|
||||
@@ -3973,7 +3973,7 @@ _gh_scan_older_releases() {
|
||||
local use_fallback="y"
|
||||
if [[ -t 0 ]]; then
|
||||
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback || use_fallback="y"
|
||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback </dev/tty || use_fallback="y"
|
||||
use_fallback="${use_fallback:-y}"
|
||||
fi
|
||||
|
||||
@@ -4796,7 +4796,7 @@ EOF
|
||||
for entry in "${compose_updates[@]}"; do
|
||||
IFS='|' read -r name image compose_workdir compose_service <<<"$entry"
|
||||
reply=""
|
||||
if read -r -t 60 -p "${TAB3}Update ${name} (${image}) via Compose? <y/N> (auto-no in 60s): " reply; then
|
||||
if read -r -t 60 -p "${TAB3}Update ${name} (${image}) via Compose? <y/N> (auto-no in 60s): " reply </dev/tty; then
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
@@ -4814,7 +4814,7 @@ EOF
|
||||
for entry in "${standalone_updates[@]}"; do
|
||||
IFS='|' read -r name image <<<"$entry"
|
||||
reply=""
|
||||
if read -r -t 60 -p "${TAB3}Pull new image for ${name} (${image})? <y/N> (auto-no in 60s): " reply; then
|
||||
if read -r -t 60 -p "${TAB3}Pull new image for ${name} (${image})? <y/N> (auto-no in 60s): " reply </dev/tty; then
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
@@ -5409,7 +5409,7 @@ setup_hwaccel() {
|
||||
# Read with 60 second timeout
|
||||
local selection=""
|
||||
echo -n "Select GPU(s) to configure (1-${gpu_count}, A=all) [timeout 60s, default=all]: "
|
||||
if read -r -t 60 selection; then
|
||||
if read -r -t 60 selection </dev/tty; then
|
||||
selection="${selection^^}" # uppercase
|
||||
else
|
||||
echo ""
|
||||
@@ -5457,7 +5457,7 @@ setup_hwaccel() {
|
||||
echo ""
|
||||
msg_custom "🎮" "${GN}" "NVIDIA GPU passthrough detected"
|
||||
local nvidia_reply=""
|
||||
read -r -t 60 -p "${TAB3}⚙️ Install NVIDIA driver libraries in the container? [Y/n] (auto-yes in 60s): " nvidia_reply || nvidia_reply=""
|
||||
read -r -t 60 -p "${TAB3}⚙️ Install NVIDIA driver libraries in the container? [Y/n] (auto-yes in 60s): " nvidia_reply </dev/tty || nvidia_reply=""
|
||||
case "${nvidia_reply,,}" in
|
||||
n | no) install_nvidia_drivers="no" ;;
|
||||
*) install_nvidia_drivers="yes" ;;
|
||||
@@ -9755,7 +9755,7 @@ _gl_scan_older_releases() {
|
||||
local use_fallback="y"
|
||||
if [[ -t 0 ]]; then
|
||||
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback || use_fallback="y"
|
||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback </dev/tty || use_fallback="y"
|
||||
use_fallback="${use_fallback:-y}"
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user