mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-13 16:53:27 +01:00
Compare commits
1 Commits
github-act
...
fix_pangol
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98bdab6d3c |
26
CHANGELOG.md
26
CHANGELOG.md
@@ -407,34 +407,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- OpenWebUI: pin numba constraint [@MickLesk](https://github.com/MickLesk) ([#11874](https://github.com/community-scripts/ProxmoxVE/pull/11874))
|
|
||||||
- Planka: add migrate step to update function [@ZimmermannLeon](https://github.com/ZimmermannLeon) ([#11877](https://github.com/community-scripts/ProxmoxVE/pull/11877))
|
|
||||||
- Pangolin: switch sqlite-specific back to generic [@MickLesk](https://github.com/MickLesk) ([#11868](https://github.com/community-scripts/ProxmoxVE/pull/11868))
|
|
||||||
- [Hotfix] Jotty: Copy contents of config backup into /opt/jotty/config [@vhsdream](https://github.com/vhsdream) ([#11864](https://github.com/community-scripts/ProxmoxVE/pull/11864))
|
- [Hotfix] Jotty: Copy contents of config backup into /opt/jotty/config [@vhsdream](https://github.com/vhsdream) ([#11864](https://github.com/community-scripts/ProxmoxVE/pull/11864))
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- chore(donetick): add config entry for v0.1.73 [@tomfrenzel](https://github.com/tomfrenzel) ([#11872](https://github.com/community-scripts/ProxmoxVE/pull/11872))
|
|
||||||
- Refactor: Radicale [@vhsdream](https://github.com/vhsdream) ([#11850](https://github.com/community-scripts/ProxmoxVE/pull/11850))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: retry reporting with fallback payloads [@MickLesk](https://github.com/MickLesk) ([#11885](https://github.com/community-scripts/ProxmoxVE/pull/11885))
|
|
||||||
|
|
||||||
### 📡 API
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- error-handler: Implement json_escape and enhance error handling [@MickLesk](https://github.com/MickLesk) ([#11875](https://github.com/community-scripts/ProxmoxVE/pull/11875))
|
|
||||||
|
|
||||||
### 🌐 Website
|
|
||||||
|
|
||||||
- #### 📝 Script Information
|
|
||||||
|
|
||||||
- SQLServer-2025: add PVE9/Kernel 6.x incompatibility warning [@MickLesk](https://github.com/MickLesk) ([#11829](https://github.com/community-scripts/ProxmoxVE/pull/11829))
|
|
||||||
|
|
||||||
## 2026-02-12
|
## 2026-02-12
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
@@ -42,8 +42,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Restoring Configurations"
|
msg_info "Restoring Configurations"
|
||||||
mv /opt/selfhosted.yaml /opt/donetick/config
|
mv /opt/selfhosted.yaml /opt/donetick/config
|
||||||
grep -q 'http://localhost"$' /opt/donetick/config/selfhosted.yaml || sed -i '/https:\/\/localhost"$/a\ - "http://localhost"' /opt/donetick/config/selfhosted.yaml
|
sed -i '/capacitor:\/\/localhost/d' /opt/donetick/config/selfhosted.yaml
|
||||||
grep -q 'capacitor://localhost' /opt/donetick/config/selfhosted.yaml || sed -i '/http:\/\/localhost"$/a\ - "capacitor://localhost"' /opt/donetick/config/selfhosted.yaml
|
|
||||||
mv /opt/donetick.db /opt/donetick
|
mv /opt/donetick.db /opt/donetick
|
||||||
msg_ok "Restored Configurations"
|
msg_ok "Restored Configurations"
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Installing uv-based Open-WebUI"
|
msg_info "Installing uv-based Open-WebUI"
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
$STD uv tool install --python 3.12 --constraint <(echo "numba>=0.60") open-webui[all]
|
$STD uv tool install --python 3.12 open-webui[all]
|
||||||
msg_ok "Installed uv-based Open-WebUI"
|
msg_ok "Installed uv-based Open-WebUI"
|
||||||
|
|
||||||
msg_info "Restoring data"
|
msg_info "Restoring data"
|
||||||
@@ -126,7 +126,7 @@ EOF
|
|||||||
|
|
||||||
msg_info "Updating Open WebUI via uv"
|
msg_info "Updating Open WebUI via uv"
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
$STD uv tool install --force --python 3.12 --constraint <(echo "numba>=0.60") open-webui[all]
|
$STD uv tool upgrade --python 3.12 open-webui[all]
|
||||||
systemctl restart open-webui
|
systemctl restart open-webui
|
||||||
msg_ok "Updated Open WebUI"
|
msg_ok "Updated Open WebUI"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
|
|||||||
@@ -61,12 +61,6 @@ function update_script() {
|
|||||||
rm -rf "$BK"
|
rm -rf "$BK"
|
||||||
msg_ok "Restored data"
|
msg_ok "Restored data"
|
||||||
|
|
||||||
msg_ok "Migrate Database"
|
|
||||||
cd /opt/planka
|
|
||||||
$STD npm run db:upgrade
|
|
||||||
$STD npm run db:migrate
|
|
||||||
msg_ok "Migrated Database"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start planka
|
systemctl start planka
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
@@ -28,55 +28,16 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "Radicale" "Kozea/Radicale"; then
|
msg_info "Updating ${APP}"
|
||||||
msg_info "Stopping service"
|
$STD python3 -m venv /opt/radicale
|
||||||
systemctl stop radicale
|
source /opt/radicale/bin/activate
|
||||||
msg_ok "Stopped service"
|
$STD python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
msg_info "Backing up users file"
|
msg_info "Starting Service"
|
||||||
cp /opt/radicale/users /opt/radicale_users_backup
|
systemctl enable -q --now radicale
|
||||||
msg_ok "Backed up users file"
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
PYTHON_VERSION="3.13" setup_uv
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Radicale" "Kozea/Radicale" "tarball" "latest" "/opt/radicale"
|
|
||||||
|
|
||||||
msg_info "Restoring users file"
|
|
||||||
rm -f /opt/radicale/users
|
|
||||||
mv /opt/radicale_users_backup /opt/radicale/users
|
|
||||||
msg_ok "Restored users file"
|
|
||||||
|
|
||||||
if grep -q 'start.sh' /etc/systemd/system/radicale.service; then
|
|
||||||
sed -i -e '/^Description/i[Unit]' \
|
|
||||||
-e '\|^ExecStart|iWorkingDirectory=/opt/radicale' \
|
|
||||||
-e 's|^ExecStart=.*|ExecStart=/usr/local/bin/uv run -m radicale --config /etc/radicale/config|' /etc/systemd/system/radicale.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
fi
|
|
||||||
if [[ ! -f /etc/radicale/config ]]; then
|
|
||||||
msg_info "Migrating to config file (/etc/radicale/config)"
|
|
||||||
mkdir -p /etc/radicale
|
|
||||||
cat <<EOF >/etc/radicale/config
|
|
||||||
[server]
|
|
||||||
hosts = 0.0.0.0:5232
|
|
||||||
|
|
||||||
[auth]
|
|
||||||
type = htpasswd
|
|
||||||
htpasswd_filename = /opt/radicale/users
|
|
||||||
htpasswd_encryption = sha512
|
|
||||||
|
|
||||||
[storage]
|
|
||||||
type = multifilesystem
|
|
||||||
filesystem_folder = /var/lib/radicale/collections
|
|
||||||
|
|
||||||
[web]
|
|
||||||
type = internal
|
|
||||||
EOF
|
|
||||||
msg_ok "Migrated to config (/etc/radicale/config)"
|
|
||||||
fi
|
|
||||||
msg_info "Starting service"
|
|
||||||
systemctl start radicale
|
|
||||||
msg_ok "Started service"
|
|
||||||
msg_ok "Updated Successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-13T12:11:36Z",
|
"generated": "2026-02-13T06:23:00Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -193,9 +193,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "cleanuparr",
|
"slug": "cleanuparr",
|
||||||
"repo": "Cleanuparr/Cleanuparr",
|
"repo": "Cleanuparr/Cleanuparr",
|
||||||
"version": "v2.6.1",
|
"version": "v2.6.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T10:00:19Z"
|
"date": "2026-02-13T00:14:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "cloudreve",
|
"slug": "cloudreve",
|
||||||
@@ -1026,9 +1026,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "patchmon",
|
"slug": "patchmon",
|
||||||
"repo": "PatchMon/PatchMon",
|
"repo": "PatchMon/PatchMon",
|
||||||
"version": "v1.4.0",
|
"version": "v1.3.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T10:39:03Z"
|
"date": "2025-12-25T11:08:14Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "paymenter",
|
"slug": "paymenter",
|
||||||
@@ -1219,13 +1219,6 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-11-16T22:39:01Z"
|
"date": "2025-11-16T22:39:01Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"slug": "radicale",
|
|
||||||
"repo": "Kozea/Radicale",
|
|
||||||
"version": "v3.6.0",
|
|
||||||
"pinned": false,
|
|
||||||
"date": "2026-01-10T06:56:46Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"slug": "rclone",
|
"slug": "rclone",
|
||||||
"repo": "rclone/rclone",
|
"repo": "rclone/rclone",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"documentation": "https://radicale.org/master.html#documentation-1",
|
"documentation": "https://radicale.org/master.html#documentation-1",
|
||||||
"website": "https://radicale.org/",
|
"website": "https://radicale.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/radicale.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/radicale.webp",
|
||||||
"config_path": "/etc/radicale/config",
|
"config_path": "/etc/radicale/config or ~/.config/radicale/config",
|
||||||
"description": "Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts)",
|
"description": "Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts)",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,10 +32,6 @@
|
|||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
|
||||||
"text": "SQL Server (2025) SQLPAL is incompatible with Proxmox VE 9 (Kernel 6.12+) in LXC containers. Use a VM instead or the SQL-Server 2022 LXC.",
|
|
||||||
"type": "warning"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.",
|
"text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ setup_hwaccel
|
|||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
|
||||||
msg_info "Installing Open WebUI"
|
msg_info "Installing Open WebUI"
|
||||||
$STD uv tool install --python 3.12 --constraint <(echo "numba>=0.60") open-webui[all]
|
$STD uv tool install --python 3.12 open-webui[all]
|
||||||
msg_ok "Installed Open WebUI"
|
msg_ok "Installed Open WebUI"
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt
|
read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt
|
||||||
|
|||||||
@@ -14,51 +14,42 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y apache2-utils
|
$STD apt install -y \
|
||||||
|
apache2-utils \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
PYTHON_VERSION="3.13" setup_uv
|
|
||||||
fetch_and_deploy_gh_release "Radicale" "Kozea/Radicale" "tarball" "latest" "/opt/radicale"
|
|
||||||
|
|
||||||
msg_info "Setting up Radicale"
|
msg_info "Setting up Radicale"
|
||||||
cd /opt/radicale
|
python3 -m venv /opt/radicale
|
||||||
|
source /opt/radicale/bin/activate
|
||||||
|
$STD python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz
|
||||||
RNDPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
RNDPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
$STD htpasswd -c -b -5 /opt/radicale/users admin "$RNDPASS"
|
$STD htpasswd -c -b -5 /opt/radicale/users admin $RNDPASS
|
||||||
{
|
{
|
||||||
echo "Radicale Credentials"
|
echo "Radicale Credentials"
|
||||||
echo "Admin User: admin"
|
echo "Admin User: admin"
|
||||||
echo "Admin Password: $RNDPASS"
|
echo "Admin Password: $RNDPASS"
|
||||||
} >>~/radicale.creds
|
} >>~/radicale.creds
|
||||||
|
msg_ok "Done setting up Radicale"
|
||||||
|
|
||||||
mkdir -p /etc/radicale
|
msg_info "Setup Service"
|
||||||
cat <<EOF >/etc/radicale/config
|
|
||||||
[server]
|
|
||||||
hosts = 0.0.0.0:5232
|
|
||||||
|
|
||||||
[auth]
|
cat <<EOF >/opt/radicale/start.sh
|
||||||
type = htpasswd
|
#!/usr/bin/env bash
|
||||||
htpasswd_filename = /opt/radicale/users
|
source /opt/radicale/bin/activate
|
||||||
htpasswd_encryption = sha512
|
python3 -m radicale --storage-filesystem-folder=/var/lib/radicale/collections --hosts 0.0.0.0:5232 --auth-type htpasswd --auth-htpasswd-filename /opt/radicale/users --auth-htpasswd-encryption sha512
|
||||||
|
|
||||||
[storage]
|
|
||||||
type = multifilesystem
|
|
||||||
filesystem_folder = /var/lib/radicale/collections
|
|
||||||
|
|
||||||
[web]
|
|
||||||
type = internal
|
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Set up Radicale"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
chmod +x /opt/radicale/start.sh
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/radicale.service
|
cat <<EOF >/etc/systemd/system/radicale.service
|
||||||
[Unit]
|
|
||||||
Description=A simple CalDAV (calendar) and CardDAV (contact) server
|
Description=A simple CalDAV (calendar) and CardDAV (contact) server
|
||||||
After=network.target
|
After=network.target
|
||||||
Requires=network.target
|
Requires=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/opt/radicale
|
ExecStart=/opt/radicale/start.sh
|
||||||
ExecStart=/usr/local/bin/uv run -m radicale --config /etc/radicale/config
|
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
# User=radicale
|
# User=radicale
|
||||||
# Deny other users access to the calendar data
|
# Deny other users access to the calendar data
|
||||||
|
|||||||
@@ -15,18 +15,16 @@ update_os
|
|||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y apt-transport-https
|
$STD apt install -y apt-transport-https
|
||||||
curl -fsSL "https://dl.ui.com/unifi/unifi-repo.gpg" -o "/usr/share/keyrings/unifi-repo.gpg"
|
|
||||||
cat <<EOF | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.sources >/dev/null
|
|
||||||
Types: deb
|
|
||||||
URIs: https://www.ui.com/downloads/unifi/debian
|
|
||||||
Suites: stable
|
|
||||||
Components: ubiquiti
|
|
||||||
Architectures: amd64
|
|
||||||
Signed-By: /usr/share/keyrings/unifi-repo.gpg
|
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_deb822_repo \
|
||||||
|
"unifi" \
|
||||||
|
"https://dl.ui.com/unifi/unifi-repo.gpg" \
|
||||||
|
"https://www.ui.com/downloads/unifi/debian" \
|
||||||
|
"stable" \
|
||||||
|
"ubiquiti" \
|
||||||
|
"amd64"
|
||||||
|
|
||||||
JAVA_VERSION="21" setup_java
|
JAVA_VERSION="21" setup_java
|
||||||
|
|
||||||
if lscpu | grep -q 'avx'; then
|
if lscpu | grep -q 'avx'; then
|
||||||
|
|||||||
161
misc/api.func
161
misc/api.func
@@ -153,7 +153,7 @@ explain_exit_code() {
|
|||||||
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
||||||
127) echo "Command not found" ;;
|
127) echo "Command not found" ;;
|
||||||
128) echo "Invalid argument to exit" ;;
|
128) echo "Invalid argument to exit" ;;
|
||||||
130) echo "Aborted by user (SIGINT)" ;;
|
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
|
||||||
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
||||||
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
||||||
139) echo "Segmentation fault (core dumped)" ;;
|
139) echo "Segmentation fault (core dumped)" ;;
|
||||||
@@ -233,43 +233,6 @@ explain_exit_code() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# json_escape()
|
|
||||||
#
|
|
||||||
# - Escapes a string for safe JSON embedding
|
|
||||||
# - Handles backslashes, quotes, newlines, tabs, and carriage returns
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
json_escape() {
|
|
||||||
local s="$1"
|
|
||||||
s=${s//\\/\\\\}
|
|
||||||
s=${s//"/\\"}
|
|
||||||
s=${s//$'\n'/\\n}
|
|
||||||
s=${s//$'\r'/}
|
|
||||||
s=${s//$'\t'/\\t}
|
|
||||||
echo "$s"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# get_error_text()
|
|
||||||
#
|
|
||||||
# - Returns last 20 lines of the active log (INSTALL_LOG or BUILD_LOG)
|
|
||||||
# - Falls back to empty string if no log is available
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
get_error_text() {
|
|
||||||
local logfile=""
|
|
||||||
if declare -f get_active_logfile >/dev/null 2>&1; then
|
|
||||||
logfile=$(get_active_logfile)
|
|
||||||
elif [[ -n "${INSTALL_LOG:-}" ]]; then
|
|
||||||
logfile="$INSTALL_LOG"
|
|
||||||
elif [[ -n "${BUILD_LOG:-}" ]]; then
|
|
||||||
logfile="$BUILD_LOG"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$logfile" && -s "$logfile" ]]; then
|
|
||||||
tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//'
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# SECTION 2: TELEMETRY FUNCTIONS
|
# SECTION 2: TELEMETRY FUNCTIONS
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -592,12 +555,9 @@ post_update_to_api() {
|
|||||||
# Silent fail - telemetry should never break scripts
|
# Silent fail - telemetry should never break scripts
|
||||||
command -v curl &>/dev/null || return 0
|
command -v curl &>/dev/null || return 0
|
||||||
|
|
||||||
# Support "force" mode (3rd arg) to bypass duplicate check for retries after cleanup
|
# Prevent duplicate submissions
|
||||||
local force="${3:-}"
|
|
||||||
POST_UPDATE_DONE=${POST_UPDATE_DONE:-false}
|
POST_UPDATE_DONE=${POST_UPDATE_DONE:-false}
|
||||||
if [[ "$POST_UPDATE_DONE" == "true" && "$force" != "force" ]]; then
|
[[ "$POST_UPDATE_DONE" == "true" ]] && return 0
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
||||||
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
||||||
@@ -635,21 +595,13 @@ post_update_to_api() {
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# For failed/unknown status, resolve exit code and error description
|
# For failed/unknown status, resolve exit code and error description
|
||||||
local short_error=""
|
|
||||||
if [[ "$pb_status" == "failed" ]] || [[ "$pb_status" == "unknown" ]]; then
|
if [[ "$pb_status" == "failed" ]] || [[ "$pb_status" == "unknown" ]]; then
|
||||||
if [[ "$raw_exit_code" =~ ^[0-9]+$ ]]; then
|
if [[ "$raw_exit_code" =~ ^[0-9]+$ ]]; then
|
||||||
exit_code="$raw_exit_code"
|
exit_code="$raw_exit_code"
|
||||||
else
|
else
|
||||||
exit_code=1
|
exit_code=1
|
||||||
fi
|
fi
|
||||||
local error_text=""
|
error=$(explain_exit_code "$exit_code")
|
||||||
error_text=$(get_error_text)
|
|
||||||
if [[ -n "$error_text" ]]; then
|
|
||||||
error=$(json_escape "$error_text")
|
|
||||||
else
|
|
||||||
error=$(json_escape "$(explain_exit_code "$exit_code")")
|
|
||||||
fi
|
|
||||||
short_error=$(json_escape "$(explain_exit_code "$exit_code")")
|
|
||||||
error_category=$(categorize_error "$exit_code")
|
error_category=$(categorize_error "$exit_code")
|
||||||
[[ -z "$error" ]] && error="Unknown error"
|
[[ -z "$error" ]] && error="Unknown error"
|
||||||
fi
|
fi
|
||||||
@@ -666,9 +618,8 @@ post_update_to_api() {
|
|||||||
pve_version=$(pveversion 2>/dev/null | awk -F'[/ ]' '{print $2}') || true
|
pve_version=$(pveversion 2>/dev/null | awk -F'[/ ]' '{print $2}') || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local http_code=""
|
# Full payload including all fields - allows record creation if initial call failed
|
||||||
|
# The Go service will find the record by random_id and PATCH, or create if not found
|
||||||
# ── Attempt 1: Full payload with complete error text ──
|
|
||||||
local JSON_PAYLOAD
|
local JSON_PAYLOAD
|
||||||
JSON_PAYLOAD=$(
|
JSON_PAYLOAD=$(
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
@@ -700,80 +651,11 @@ post_update_to_api() {
|
|||||||
EOF
|
EOF
|
||||||
)
|
)
|
||||||
|
|
||||||
http_code=$(curl -sS -w "%{http_code}" -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
# Fire-and-forget: never block, never fail
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d "$JSON_PAYLOAD" -o /dev/null 2>/dev/null) || http_code="000"
|
|
||||||
|
|
||||||
if [[ "$http_code" =~ ^2[0-9]{2}$ ]]; then
|
|
||||||
POST_UPDATE_DONE=true
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Attempt 2: Short error text (no full log) ──
|
|
||||||
sleep 1
|
|
||||||
local RETRY_PAYLOAD
|
|
||||||
RETRY_PAYLOAD=$(
|
|
||||||
cat <<EOF
|
|
||||||
{
|
|
||||||
"random_id": "${RANDOM_UUID}",
|
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
|
||||||
"status": "${pb_status}",
|
|
||||||
"ct_type": ${CT_TYPE:-1},
|
|
||||||
"disk_size": ${DISK_SIZE:-0},
|
|
||||||
"core_count": ${CORE_COUNT:-0},
|
|
||||||
"ram_size": ${RAM_SIZE:-0},
|
|
||||||
"os_type": "${var_os:-}",
|
|
||||||
"os_version": "${var_version:-}",
|
|
||||||
"pve_version": "${pve_version}",
|
|
||||||
"method": "${METHOD:-default}",
|
|
||||||
"exit_code": ${exit_code},
|
|
||||||
"error": "${short_error}",
|
|
||||||
"error_category": "${error_category}",
|
|
||||||
"install_duration": ${duration},
|
|
||||||
"cpu_vendor": "${cpu_vendor}",
|
|
||||||
"cpu_model": "${cpu_model}",
|
|
||||||
"gpu_vendor": "${gpu_vendor}",
|
|
||||||
"gpu_model": "${gpu_model}",
|
|
||||||
"gpu_passthrough": "${gpu_passthrough}",
|
|
||||||
"ram_speed": "${ram_speed}",
|
|
||||||
"repo_source": "${REPO_SOURCE}"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
http_code=$(curl -sS -w "%{http_code}" -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d "$RETRY_PAYLOAD" -o /dev/null 2>/dev/null) || http_code="000"
|
|
||||||
|
|
||||||
if [[ "$http_code" =~ ^2[0-9]{2}$ ]]; then
|
|
||||||
POST_UPDATE_DONE=true
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Attempt 3: Minimal payload (bare minimum to set status) ──
|
|
||||||
sleep 2
|
|
||||||
local MINIMAL_PAYLOAD
|
|
||||||
MINIMAL_PAYLOAD=$(
|
|
||||||
cat <<EOF
|
|
||||||
{
|
|
||||||
"random_id": "${RANDOM_UUID}",
|
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
|
||||||
"status": "${pb_status}",
|
|
||||||
"exit_code": ${exit_code},
|
|
||||||
"error": "${short_error}",
|
|
||||||
"error_category": "${error_category}",
|
|
||||||
"install_duration": ${duration}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
curl -sS -w "%{http_code}" -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
curl -sS -w "%{http_code}" -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "$MINIMAL_PAYLOAD" -o /dev/null 2>/dev/null || true
|
-d "$JSON_PAYLOAD" -o /dev/null 2>&1 || true
|
||||||
|
|
||||||
# Tried 3 times - mark as done regardless to prevent infinite loops
|
|
||||||
POST_UPDATE_DONE=true
|
POST_UPDATE_DONE=true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -809,9 +691,6 @@ categorize_error() {
|
|||||||
# Configuration errors
|
# Configuration errors
|
||||||
203 | 204 | 205 | 206 | 207 | 208) echo "config" ;;
|
203 | 204 | 205 | 206 | 207 | 208) echo "config" ;;
|
||||||
|
|
||||||
# Aborted by user
|
|
||||||
130) echo "aborted" ;;
|
|
||||||
|
|
||||||
# Resource errors (OOM, etc)
|
# Resource errors (OOM, etc)
|
||||||
137 | 134) echo "resource" ;;
|
137 | 134) echo "resource" ;;
|
||||||
|
|
||||||
@@ -876,13 +755,7 @@ post_tool_to_api() {
|
|||||||
|
|
||||||
if [[ "$status" == "failed" ]]; then
|
if [[ "$status" == "failed" ]]; then
|
||||||
[[ ! "$exit_code" =~ ^[0-9]+$ ]] && exit_code=1
|
[[ ! "$exit_code" =~ ^[0-9]+$ ]] && exit_code=1
|
||||||
local error_text=""
|
error=$(explain_exit_code "$exit_code")
|
||||||
error_text=$(get_error_text)
|
|
||||||
if [[ -n "$error_text" ]]; then
|
|
||||||
error=$(json_escape "$error_text")
|
|
||||||
else
|
|
||||||
error=$(json_escape "$(explain_exit_code "$exit_code")")
|
|
||||||
fi
|
|
||||||
error_category=$(categorize_error "$exit_code")
|
error_category=$(categorize_error "$exit_code")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -943,13 +816,7 @@ post_addon_to_api() {
|
|||||||
|
|
||||||
if [[ "$status" == "failed" ]]; then
|
if [[ "$status" == "failed" ]]; then
|
||||||
[[ ! "$exit_code" =~ ^[0-9]+$ ]] && exit_code=1
|
[[ ! "$exit_code" =~ ^[0-9]+$ ]] && exit_code=1
|
||||||
local error_text=""
|
error=$(explain_exit_code "$exit_code")
|
||||||
error_text=$(get_error_text)
|
|
||||||
if [[ -n "$error_text" ]]; then
|
|
||||||
error=$(json_escape "$error_text")
|
|
||||||
else
|
|
||||||
error=$(json_escape "$(explain_exit_code "$exit_code")")
|
|
||||||
fi
|
|
||||||
error_category=$(categorize_error "$exit_code")
|
error_category=$(categorize_error "$exit_code")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1042,13 +909,7 @@ post_update_to_api_extended() {
|
|||||||
else
|
else
|
||||||
exit_code=1
|
exit_code=1
|
||||||
fi
|
fi
|
||||||
local error_text=""
|
error=$(explain_exit_code "$exit_code")
|
||||||
error_text=$(get_error_text)
|
|
||||||
if [[ -n "$error_text" ]]; then
|
|
||||||
error=$(json_escape "$error_text")
|
|
||||||
else
|
|
||||||
error=$(json_escape "$(explain_exit_code "$exit_code")")
|
|
||||||
fi
|
|
||||||
error_category=$(categorize_error "$exit_code")
|
error_category=$(categorize_error "$exit_code")
|
||||||
[[ -z "$error" ]] && error="Unknown error"
|
[[ -z "$error" ]] && error="Unknown error"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4046,10 +4046,12 @@ EOF'
|
|||||||
if [[ $install_exit_code -ne 0 ]]; then
|
if [[ $install_exit_code -ne 0 ]]; then
|
||||||
msg_error "Installation failed in container ${CTID} (exit code: ${install_exit_code})"
|
msg_error "Installation failed in container ${CTID} (exit code: ${install_exit_code})"
|
||||||
|
|
||||||
# Copy install log from container BEFORE API call so get_error_text() can read it
|
# Report failure to telemetry API
|
||||||
|
post_update_to_api "failed" "$install_exit_code"
|
||||||
|
|
||||||
|
# Copy both logs from container before potential deletion
|
||||||
local build_log_copied=false
|
local build_log_copied=false
|
||||||
local install_log_copied=false
|
local install_log_copied=false
|
||||||
local host_install_log="/tmp/install-lxc-${CTID}-${SESSION_ID}.log"
|
|
||||||
|
|
||||||
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
||||||
# Copy BUILD_LOG (creation log) if it exists
|
# Copy BUILD_LOG (creation log) if it exists
|
||||||
@@ -4057,22 +4059,15 @@ EOF'
|
|||||||
cp "${BUILD_LOG}" "/tmp/create-lxc-${CTID}-${SESSION_ID}.log" 2>/dev/null && build_log_copied=true
|
cp "${BUILD_LOG}" "/tmp/create-lxc-${CTID}-${SESSION_ID}.log" 2>/dev/null && build_log_copied=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy INSTALL_LOG from container to host
|
# Copy INSTALL_LOG from container
|
||||||
if pct pull "$CTID" "/root/.install-${SESSION_ID}.log" "$host_install_log" 2>/dev/null; then
|
if pct pull "$CTID" "/root/.install-${SESSION_ID}.log" "/tmp/install-lxc-${CTID}-${SESSION_ID}.log" 2>/dev/null; then
|
||||||
install_log_copied=true
|
install_log_copied=true
|
||||||
# Point INSTALL_LOG to host copy so get_error_text() finds it
|
|
||||||
INSTALL_LOG="$host_install_log"
|
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
# Report failure to telemetry API (now with log available on host)
|
# Show available logs
|
||||||
post_update_to_api "failed" "$install_exit_code"
|
|
||||||
|
|
||||||
# Show available logs
|
|
||||||
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
|
||||||
echo ""
|
echo ""
|
||||||
[[ "$build_log_copied" == true ]] && echo -e "${GN}✔${CL} Container creation log: ${BL}/tmp/create-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
[[ "$build_log_copied" == true ]] && echo -e "${GN}✔${CL} Container creation log: ${BL}/tmp/create-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||||
[[ "$install_log_copied" == true ]] && echo -e "${GN}✔${CL} Installation log: ${BL}${host_install_log}${CL}"
|
[[ "$install_log_copied" == true ]] && echo -e "${GN}✔${CL} Installation log: ${BL}/tmp/install-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Dev mode: Keep container or open breakpoint shell
|
# Dev mode: Keep container or open breakpoint shell
|
||||||
@@ -4130,10 +4125,6 @@ EOF'
|
|||||||
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Force one final status update attempt after cleanup
|
|
||||||
# This ensures status is updated even if the first attempt failed (e.g., HTTP 400)
|
|
||||||
post_update_to_api "failed" "$install_exit_code" "force"
|
|
||||||
|
|
||||||
exit $install_exit_code
|
exit $install_exit_code
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,12 +222,6 @@ error_handler() {
|
|||||||
pct destroy "$CTID" &>/dev/null || true
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
echo -e "${GN}✔${CL} Container ${CTID} removed"
|
echo -e "${GN}✔${CL} Container ${CTID} removed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Force one final status update attempt after cleanup
|
|
||||||
# This ensures status is updated even if the first attempt failed (e.g., HTTP 400)
|
|
||||||
if declare -f post_update_to_api &>/dev/null; then
|
|
||||||
post_update_to_api "failed" "$exit_code" "force"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user