mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-19 03:25:55 +01:00
Compare commits
35 Commits
CrazyWolf1
...
feature/ex
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7aa04b838 | ||
|
|
f39024c930 | ||
|
|
33884f6228 | ||
|
|
c4449aa041 | ||
|
|
476b50b4e2 | ||
|
|
fac5c5ebf6 | ||
|
|
61e535d3ec | ||
|
|
6989d98214 | ||
|
|
ce5b7986ac | ||
|
|
2582c1f63b | ||
|
|
3ce3c6f613 | ||
|
|
97652792be | ||
|
|
f07f2cb04e | ||
|
|
5f73f9d5e6 | ||
|
|
0183ae0fff | ||
|
|
32d1937a74 | ||
|
|
0a7bd20b06 | ||
|
|
c9ecb1ccca | ||
|
|
d274a269b5 | ||
|
|
cbee9d64b5 | ||
|
|
ffcda217e3 | ||
|
|
438d5d6b94 | ||
|
|
104366bc64 | ||
|
|
9dab79f8ca | ||
|
|
2dddeaf966 | ||
|
|
fae06a3a58 | ||
|
|
137272c354 | ||
|
|
52a9e23401 | ||
|
|
c2333de180 | ||
|
|
ad8974894b | ||
|
|
38af4be5ba | ||
|
|
80ae1f34fa | ||
|
|
06bc6e20d5 | ||
|
|
4418e72856 | ||
|
|
896714e06f |
36
CHANGELOG.md
36
CHANGELOG.md
@@ -404,6 +404,39 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-02-17
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Databasus ([#12018](https://github.com/community-scripts/ProxmoxVE/pull/12018))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: pterodactyl-panel add symlink [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11997](https://github.com/community-scripts/ProxmoxVE/pull/11997))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: call get_lxc_ip in start() before updates [@MickLesk](https://github.com/MickLesk) ([#12015](https://github.com/community-scripts/ProxmoxVE/pull/12015))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools/pve: add data analytics / formatting / linting [@MickLesk](https://github.com/MickLesk) ([#12034](https://github.com/community-scripts/ProxmoxVE/pull/12034))
|
||||||
|
- core: smart recovery for failed installs | extend exit_codes [@MickLesk](https://github.com/MickLesk) ([#11221](https://github.com/community-scripts/ProxmoxVE/pull/11221))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: error-handler improvements | better exit_code handling | better tools.func source check [@MickLesk](https://github.com/MickLesk) ([#12019](https://github.com/community-scripts/ProxmoxVE/pull/12019))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Immich Public Proxy: centralize and fix systemd service creation [@MickLesk](https://github.com/MickLesk) ([#12025](https://github.com/community-scripts/ProxmoxVE/pull/12025))
|
||||||
|
|
||||||
## 2026-02-16
|
## 2026-02-16
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
@@ -413,6 +446,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Opencloud: Pin version to 5.1.0 [@vhsdream](https://github.com/vhsdream) ([#12004](https://github.com/community-scripts/ProxmoxVE/pull/12004))
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- Tududi: Fix sed command for DB_FILE configuration [@tremor021](https://github.com/tremor021) ([#11988](https://github.com/community-scripts/ProxmoxVE/pull/11988))
|
- Tududi: Fix sed command for DB_FILE configuration [@tremor021](https://github.com/tremor021) ([#11988](https://github.com/community-scripts/ProxmoxVE/pull/11988))
|
||||||
@@ -422,6 +457,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core/vm's: ensure script state is sent on script exit [@MickLesk](https://github.com/MickLesk) ([#11991](https://github.com/community-scripts/ProxmoxVE/pull/11991))
|
||||||
- Vaultwarden: export VW_VERSION as version number [@MickLesk](https://github.com/MickLesk) ([#11966](https://github.com/community-scripts/ProxmoxVE/pull/11966))
|
- Vaultwarden: export VW_VERSION as version number [@MickLesk](https://github.com/MickLesk) ([#11966](https://github.com/community-scripts/ProxmoxVE/pull/11966))
|
||||||
- Zabbix: Improve zabbix-agent service detection [@MickLesk](https://github.com/MickLesk) ([#11968](https://github.com/community-scripts/ProxmoxVE/pull/11968))
|
- Zabbix: Improve zabbix-agent service detection [@MickLesk](https://github.com/MickLesk) ([#11968](https://github.com/community-scripts/ProxmoxVE/pull/11968))
|
||||||
|
|
||||||
|
|||||||
78
ct/databasus.sh
Normal file
78
ct/databasus.sh
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/databasus/databasus
|
||||||
|
|
||||||
|
APP="Databasus"
|
||||||
|
var_tags="${var_tags:-backup;postgresql;database}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /opt/databasus/databasus ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "databasus" "databasus/databasus"; then
|
||||||
|
msg_info "Stopping Databasus"
|
||||||
|
$STD systemctl stop databasus
|
||||||
|
msg_ok "Stopped Databasus"
|
||||||
|
|
||||||
|
msg_info "Backing up Configuration"
|
||||||
|
cp /opt/databasus/.env /opt/databasus.env.bak
|
||||||
|
msg_ok "Backed up Configuration"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||||
|
|
||||||
|
msg_info "Updating Databasus"
|
||||||
|
cd /opt/databasus/frontend
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
cd /opt/databasus/backend
|
||||||
|
$STD go mod download
|
||||||
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
|
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||||
|
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||||
|
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||||
|
cp -r /opt/databasus/backend/migrations /opt/databasus/
|
||||||
|
chown -R postgres:postgres /opt/databasus
|
||||||
|
msg_ok "Updated Databasus"
|
||||||
|
|
||||||
|
msg_info "Restoring Configuration"
|
||||||
|
cp /opt/databasus.env.bak /opt/databasus/.env
|
||||||
|
rm -f /opt/databasus.env.bak
|
||||||
|
chown postgres:postgres /opt/databasus/.env
|
||||||
|
msg_ok "Restored Configuration"
|
||||||
|
|
||||||
|
msg_info "Starting Databasus"
|
||||||
|
$STD systemctl start databasus
|
||||||
|
msg_ok "Started Databasus"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
6
ct/headers/databasus
Normal file
6
ct/headers/databasus
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __ __
|
||||||
|
/ __ \____ _/ /_____ _/ /_ ____ ________ _______
|
||||||
|
/ / / / __ `/ __/ __ `/ __ \/ __ `/ ___/ / / / ___/
|
||||||
|
/ /_/ / /_/ / /_/ /_/ / /_/ / /_/ (__ ) /_/ (__ )
|
||||||
|
/_____/\__,_/\__/\__,_/_.___/\__,_/____/\__,_/____/
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v5.0.2"
|
RELEASE="v5.1.0"
|
||||||
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop opencloud opencloud-wopi
|
systemctl stop opencloud opencloud-wopi
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ EOF
|
|||||||
$STD php artisan migrate --seed --force --no-interaction
|
$STD php artisan migrate --seed --force --no-interaction
|
||||||
chown -R www-data:www-data /opt/pterodactyl-panel/*
|
chown -R www-data:www-data /opt/pterodactyl-panel/*
|
||||||
chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/
|
chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/
|
||||||
|
ln -s /opt/pterodactyl-panel /var/www/pterodactyl
|
||||||
rm -rf "/opt/pterodactyl-panel/panel.tar.gz"
|
rm -rf "/opt/pterodactyl-panel/panel.tar.gz"
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
msg_ok "Updated $APP to v${RELEASE}"
|
||||||
|
|||||||
44
frontend/public/json/databasus.json
Normal file
44
frontend/public/json/databasus.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "Databasus",
|
||||||
|
"slug": "databasus",
|
||||||
|
"categories": [
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-17",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://github.com/databasus/databasus",
|
||||||
|
"website": "https://github.com/databasus/databasus",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/databasus.webp",
|
||||||
|
"config_path": "/opt/databasus/.env",
|
||||||
|
"description": "Free, open source and self-hosted solution for automated PostgreSQL backups. With multiple storage options, notifications, scheduling, and a beautiful web interface for managing database backups across multiple PostgreSQL instances.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/databasus.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "admin@localhost",
|
||||||
|
"password": "See /root/databasus.creds"
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Supports PostgreSQL versions 12-18 with cloud and self-hosted instances",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Features: Scheduled backups, multiple storage providers, notifications, encryption",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-16T12:14:16Z",
|
"generated": "2026-02-17T12:14:18Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -158,9 +158,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bookstack",
|
"slug": "bookstack",
|
||||||
"repo": "BookStackApp/BookStack",
|
"repo": "BookStackApp/BookStack",
|
||||||
"version": "v25.12.3",
|
"version": "v25.12.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T15:29:25Z"
|
"date": "2026-02-17T11:44:48Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "byparr",
|
"slug": "byparr",
|
||||||
@@ -193,9 +193,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "cleanuparr",
|
"slug": "cleanuparr",
|
||||||
"repo": "Cleanuparr/Cleanuparr",
|
"repo": "Cleanuparr/Cleanuparr",
|
||||||
"version": "v2.6.2",
|
"version": "v2.6.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-15T02:15:19Z"
|
"date": "2026-02-16T22:41:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "cloudreve",
|
"slug": "cloudreve",
|
||||||
@@ -207,9 +207,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "comfyui",
|
"slug": "comfyui",
|
||||||
"repo": "comfyanonymous/ComfyUI",
|
"repo": "comfyanonymous/ComfyUI",
|
||||||
"version": "v0.13.0",
|
"version": "v0.14.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-10T20:27:38Z"
|
"date": "2026-02-17T06:29:10Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "commafeed",
|
"slug": "commafeed",
|
||||||
@@ -253,6 +253,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T15:39:05Z"
|
"date": "2026-02-11T15:39:05Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "databasus",
|
||||||
|
"repo": "databasus/databasus",
|
||||||
|
"version": "v3.12.2",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-02-14T22:28:59Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "dawarich",
|
"slug": "dawarich",
|
||||||
"repo": "Freika/dawarich",
|
"repo": "Freika/dawarich",
|
||||||
@@ -550,16 +557,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "huntarr",
|
"slug": "huntarr",
|
||||||
"repo": "plexguide/Huntarr.io",
|
"repo": "plexguide/Huntarr.io",
|
||||||
"version": "9.2.4.1",
|
"version": "9.3.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-12T22:17:47Z"
|
"date": "2026-02-17T06:34:38Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "immich-public-proxy",
|
"slug": "immich-public-proxy",
|
||||||
"repo": "alangrainger/immich-public-proxy",
|
"repo": "alangrainger/immich-public-proxy",
|
||||||
"version": "v1.15.2",
|
"version": "v1.15.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-16T08:54:59Z"
|
"date": "2026-02-16T22:54:27Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "inspircd",
|
"slug": "inspircd",
|
||||||
@@ -578,16 +585,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"repo": "invoiceninja/invoiceninja",
|
"repo": "invoiceninja/invoiceninja",
|
||||||
"version": "v5.12.60",
|
"version": "v5.12.62",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-15T00:11:31Z"
|
"date": "2026-02-17T03:23:48Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.1127",
|
"version": "v0.24.1140",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-16T08:43:41Z"
|
"date": "2026-02-17T05:54:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jellystat",
|
"slug": "jellystat",
|
||||||
@@ -704,9 +711,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "librenms",
|
"slug": "librenms",
|
||||||
"repo": "librenms/librenms",
|
"repo": "librenms/librenms",
|
||||||
"version": "26.1.1",
|
"version": "26.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-12T23:26:02Z"
|
"date": "2026-02-16T12:15:13Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "librespeed-rust",
|
"slug": "librespeed-rust",
|
||||||
@@ -739,9 +746,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "linkstack",
|
"slug": "linkstack",
|
||||||
"repo": "linkstackorg/linkstack",
|
"repo": "linkstackorg/linkstack",
|
||||||
"version": "v4.8.5",
|
"version": "v4.8.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T18:46:52Z"
|
"date": "2024-12-10T15:14:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "linkwarden",
|
"slug": "linkwarden",
|
||||||
@@ -781,9 +788,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mail-archiver",
|
"slug": "mail-archiver",
|
||||||
"repo": "s1t5/mail-archiver",
|
"repo": "s1t5/mail-archiver",
|
||||||
"version": "2602.1",
|
"version": "2602.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T06:23:11Z"
|
"date": "2026-02-17T09:46:52Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "managemydamnlife",
|
"slug": "managemydamnlife",
|
||||||
@@ -802,9 +809,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mealie",
|
"slug": "mealie",
|
||||||
"repo": "mealie-recipes/mealie",
|
"repo": "mealie-recipes/mealie",
|
||||||
"version": "v3.10.2",
|
"version": "v3.11.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-04T23:32:32Z"
|
"date": "2026-02-17T04:13:35Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "mediamanager",
|
"slug": "mediamanager",
|
||||||
@@ -956,9 +963,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "opencloud",
|
"slug": "opencloud",
|
||||||
"repo": "opencloud-eu/opencloud",
|
"repo": "opencloud-eu/opencloud",
|
||||||
"version": "v5.0.2",
|
"version": "v5.1.0",
|
||||||
"pinned": true,
|
"pinned": true,
|
||||||
"date": "2026-02-05T16:29:01Z"
|
"date": "2026-02-16T15:04:28Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "opengist",
|
"slug": "opengist",
|
||||||
@@ -1026,16 +1033,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "paperless-ngx",
|
"slug": "paperless-ngx",
|
||||||
"repo": "paperless-ngx/paperless-ngx",
|
"repo": "paperless-ngx/paperless-ngx",
|
||||||
"version": "v2.20.6",
|
"version": "v2.20.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T07:30:27Z"
|
"date": "2026-02-16T16:52:23Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "patchmon",
|
"slug": "patchmon",
|
||||||
"repo": "PatchMon/PatchMon",
|
"repo": "PatchMon/PatchMon",
|
||||||
"version": "v1.4.0",
|
"version": "v1.4.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T10:39:03Z"
|
"date": "2026-02-16T18:00:13Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "paymenter",
|
"slug": "paymenter",
|
||||||
@@ -1103,9 +1110,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pocketbase",
|
"slug": "pocketbase",
|
||||||
"repo": "pocketbase/pocketbase",
|
"repo": "pocketbase/pocketbase",
|
||||||
"version": "v0.36.3",
|
"version": "v0.36.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T18:38:58Z"
|
"date": "2026-02-17T08:02:51Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "pocketid",
|
"slug": "pocketid",
|
||||||
@@ -1362,9 +1369,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "slskd",
|
"slug": "slskd",
|
||||||
"repo": "slskd/slskd",
|
"repo": "slskd/slskd",
|
||||||
"version": "0.24.3",
|
"version": "0.24.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-15T14:40:15Z"
|
"date": "2026-02-16T16:50:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "snipeit",
|
"slug": "snipeit",
|
||||||
@@ -1411,9 +1418,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "stirling-pdf",
|
"slug": "stirling-pdf",
|
||||||
"repo": "Stirling-Tools/Stirling-PDF",
|
"repo": "Stirling-Tools/Stirling-PDF",
|
||||||
"version": "v2.4.6",
|
"version": "v2.5.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-12T00:01:19Z"
|
"date": "2026-02-16T22:58:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "streamlink-webui",
|
"slug": "streamlink-webui",
|
||||||
@@ -1481,9 +1488,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "threadfin",
|
"slug": "threadfin",
|
||||||
"repo": "threadfin/threadfin",
|
"repo": "threadfin/threadfin",
|
||||||
"version": "1.2.37",
|
"version": "delete",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-09-11T16:13:41Z"
|
"date": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tianji",
|
"slug": "tianji",
|
||||||
@@ -1544,9 +1551,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tunarr",
|
"slug": "tunarr",
|
||||||
"repo": "chrisbenincasa/tunarr",
|
"repo": "chrisbenincasa/tunarr",
|
||||||
"version": "v1.1.12",
|
"version": "v1.1.13",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-03T20:19:00Z"
|
"date": "2026-02-16T16:16:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "uhf",
|
"slug": "uhf",
|
||||||
@@ -1628,9 +1635,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "wanderer",
|
"slug": "wanderer",
|
||||||
"repo": "meilisearch/meilisearch",
|
"repo": "meilisearch/meilisearch",
|
||||||
"version": "v1.35.0",
|
"version": "v1.35.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-02T09:57:03Z"
|
"date": "2026-02-16T17:01:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "warracker",
|
"slug": "warracker",
|
||||||
|
|||||||
171
install/databasus-install.sh
Normal file
171
install/databasus-install.sh
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/databasus/databasus
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
nginx \
|
||||||
|
valkey
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
setup_go
|
||||||
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||||
|
|
||||||
|
msg_info "Building Databasus (Patience)"
|
||||||
|
cd /opt/databasus/frontend
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
cd /opt/databasus/backend
|
||||||
|
$STD go mod tidy
|
||||||
|
$STD go mod download
|
||||||
|
$STD go install github.com/swaggo/swag/cmd/swag@latest
|
||||||
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
|
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||||
|
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||||
|
mkdir -p /databasus-data/{pgdata,temp,backups,data,logs}
|
||||||
|
mkdir -p /opt/databasus/ui/build
|
||||||
|
mkdir -p /opt/databasus/migrations
|
||||||
|
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||||
|
cp -r /opt/databasus/backend/migrations/* /opt/databasus/migrations/
|
||||||
|
chown -R postgres:postgres /databasus-data
|
||||||
|
msg_ok "Built Databasus"
|
||||||
|
|
||||||
|
msg_info "Configuring Databasus"
|
||||||
|
JWT_SECRET=$(openssl rand -hex 32)
|
||||||
|
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||||
|
# Create PostgreSQL version symlinks for compatibility
|
||||||
|
for v in 12 13 14 15 16 18; do
|
||||||
|
ln -sf /usr/lib/postgresql/17 /usr/lib/postgresql/$v
|
||||||
|
done
|
||||||
|
# Install goose for migrations
|
||||||
|
$STD go install github.com/pressly/goose/v3/cmd/goose@latest
|
||||||
|
ln -sf /root/go/bin/goose /usr/local/bin/goose
|
||||||
|
cat <<EOF >/opt/databasus/.env
|
||||||
|
# Environment
|
||||||
|
ENV_MODE=production
|
||||||
|
|
||||||
|
# Server
|
||||||
|
SERVER_PORT=4005
|
||||||
|
SERVER_HOST=0.0.0.0
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DATABASE_DSN=host=localhost user=postgres password=postgres dbname=databasus port=5432 sslmode=disable
|
||||||
|
DATABASE_URL=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
|
|
||||||
|
# Migrations
|
||||||
|
GOOSE_DRIVER=postgres
|
||||||
|
GOOSE_DBSTRING=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
|
GOOSE_MIGRATION_DIR=/opt/databasus/migrations
|
||||||
|
|
||||||
|
# Valkey (Redis-compatible cache)
|
||||||
|
VALKEY_HOST=localhost
|
||||||
|
VALKEY_PORT=6379
|
||||||
|
|
||||||
|
# Security
|
||||||
|
JWT_SECRET=${JWT_SECRET}
|
||||||
|
ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||||
|
|
||||||
|
# Paths
|
||||||
|
DATA_DIR=/databasus-data/data
|
||||||
|
BACKUP_DIR=/databasus-data/backups
|
||||||
|
LOG_DIR=/databasus-data/logs
|
||||||
|
EOF
|
||||||
|
chown postgres:postgres /opt/databasus/.env
|
||||||
|
chmod 600 /opt/databasus/.env
|
||||||
|
msg_ok "Configured Databasus"
|
||||||
|
|
||||||
|
msg_info "Configuring Valkey"
|
||||||
|
cat <<EOF >/etc/valkey/valkey.conf
|
||||||
|
port 6379
|
||||||
|
bind 127.0.0.1
|
||||||
|
protected-mode yes
|
||||||
|
save ""
|
||||||
|
maxmemory 256mb
|
||||||
|
maxmemory-policy allkeys-lru
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now valkey-server
|
||||||
|
systemctl restart valkey-server
|
||||||
|
msg_ok "Configured Valkey"
|
||||||
|
|
||||||
|
msg_info "Creating Database"
|
||||||
|
# Configure PostgreSQL to allow local password auth for databasus
|
||||||
|
PG_HBA="/etc/postgresql/17/main/pg_hba.conf"
|
||||||
|
if ! grep -q "databasus" "$PG_HBA"; then
|
||||||
|
sed -i '/^local\s*all\s*all/i local databasus postgres trust' "$PG_HBA"
|
||||||
|
sed -i '/^host\s*all\s*all\s*127/i host databasus postgres 127.0.0.1/32 trust' "$PG_HBA"
|
||||||
|
systemctl reload postgresql
|
||||||
|
fi
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE databasus;" 2>/dev/null || true
|
||||||
|
$STD sudo -u postgres psql -c "ALTER USER postgres WITH SUPERUSER CREATEROLE CREATEDB;" 2>/dev/null || true
|
||||||
|
msg_ok "Created Database"
|
||||||
|
|
||||||
|
msg_info "Creating Databasus Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/databasus.service
|
||||||
|
[Unit]
|
||||||
|
Description=Databasus - Database Backup Management
|
||||||
|
After=network.target postgresql.service valkey.service
|
||||||
|
Requires=postgresql.service valkey.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/databasus
|
||||||
|
EnvironmentFile=/opt/databasus/.env
|
||||||
|
ExecStart=/opt/databasus/databasus
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
$STD systemctl daemon-reload
|
||||||
|
$STD systemctl enable -q --now databasus
|
||||||
|
msg_ok "Created Databasus Service"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
cat <<EOF >/etc/nginx/sites-available/databasus
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:4005;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
proxy_cache_bypass \$http_upgrade;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_read_timeout 86400s;
|
||||||
|
proxy_send_timeout 86400s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ln -sf /etc/nginx/sites-available/databasus /etc/nginx/sites-enabled/databasus
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD nginx -t
|
||||||
|
$STD systemctl enable -q --now nginx
|
||||||
|
$STD systemctl reload nginx
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
|
|||||||
echo "$COOLPASS" >~/.coolpass
|
echo "$COOLPASS" >~/.coolpass
|
||||||
msg_ok "Installed Collabora Online"
|
msg_ok "Installed Collabora Online"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.0.2" "/usr/bin" "opencloud-*-linux-amd64"
|
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.1.0" "/usr/bin" "opencloud-*-linux-amd64"
|
||||||
|
|
||||||
msg_info "Configuring OpenCloud"
|
msg_info "Configuring OpenCloud"
|
||||||
DATA_DIR="/var/lib/opencloud"
|
DATA_DIR="/var/lib/opencloud"
|
||||||
|
|||||||
@@ -11,9 +11,35 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
load_functions
|
load_functions
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
# Persist diagnostics setting inside container (exported from build.func)
|
||||||
|
# so addon scripts running later can find the user's choice
|
||||||
|
if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
mkdir -p /usr/local/community-scripts
|
||||||
|
echo "DIAGNOSTICS=${DIAGNOSTICS:-no}" >/usr/local/community-scripts/diagnostics
|
||||||
|
fi
|
||||||
|
|
||||||
# Get LXC IP address (must be called INSIDE container, after network is up)
|
# Get LXC IP address (must be called INSIDE container, after network is up)
|
||||||
get_lxc_ip
|
get_lxc_ip
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# post_progress_to_api()
|
||||||
|
#
|
||||||
|
# - Lightweight progress ping from inside the container
|
||||||
|
# - Updates the existing telemetry record status from "installing" to "configuring"
|
||||||
|
# - Signals that the installation is actively progressing (not stuck)
|
||||||
|
# - Fire-and-forget: never blocks or fails the script
|
||||||
|
# - Only executes if DIAGNOSTICS=yes and RANDOM_UUID is set
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
post_progress_to_api() {
|
||||||
|
command -v curl &>/dev/null || return 0
|
||||||
|
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
||||||
|
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
||||||
|
|
||||||
|
curl -fsS -m 5 -X POST "https://telemetry.community-scripts.org/telemetry" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"random_id\":\"${RANDOM_UUID}\",\"execution_id\":\"${EXECUTION_ID:-${RANDOM_UUID}}\",\"type\":\"lxc\",\"nsapp\":\"${app:-unknown}\",\"status\":\"configuring\"}" &>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
# This function enables IPv6 if it's not disabled and sets verbose mode
|
# This function enables IPv6 if it's not disabled and sets verbose mode
|
||||||
verb_ip6() {
|
verb_ip6() {
|
||||||
set_std_mode # Set STD mode based on VERBOSE
|
set_std_mode # Set STD mode based on VERBOSE
|
||||||
@@ -53,6 +79,7 @@ setting_up_container() {
|
|||||||
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 addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
||||||
@@ -85,8 +112,18 @@ network_check() {
|
|||||||
update_os() {
|
update_os() {
|
||||||
msg_info "Updating Container OS"
|
msg_info "Updating Container OS"
|
||||||
$STD apk -U upgrade
|
$STD apk -U upgrade
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
local tools_content
|
||||||
|
tools_content=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) || {
|
||||||
|
msg_error "Failed to download tools.func"
|
||||||
|
exit 6
|
||||||
|
}
|
||||||
|
source /dev/stdin <<<"$tools_content"
|
||||||
|
if ! declare -f fetch_and_deploy_gh_release >/dev/null 2>&1; then
|
||||||
|
msg_error "tools.func loaded but incomplete — missing expected functions"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
msg_ok "Updated Container OS"
|
msg_ok "Updated Container OS"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function modifies the message of the day (motd) and SSH settings
|
# This function modifies the message of the day (motd) and SSH settings
|
||||||
|
|||||||
140
misc/api.func
140
misc/api.func
@@ -117,16 +117,17 @@ detect_repo_source
|
|||||||
# - Canonical source of truth for ALL exit code mappings
|
# - Canonical source of truth for ALL exit code mappings
|
||||||
# - Used by both api.func (telemetry) and error_handler.func (error display)
|
# - Used by both api.func (telemetry) and error_handler.func (error display)
|
||||||
# - Supports:
|
# - Supports:
|
||||||
# * Generic/Shell errors (1, 2, 124, 126-130, 134, 137, 139, 141, 143)
|
# * Generic/Shell errors (1-3, 10, 124-132, 134, 137, 139, 141, 143-146)
|
||||||
# * curl/wget errors (6, 7, 22, 28, 35)
|
# * curl/wget errors (4-8, 16, 18, 22-28, 30, 32-36, 39, 44-48, 51-52, 55-57, 59, 61, 63, 75, 78-79, 92, 95)
|
||||||
# * Package manager errors (APT, DPKG: 100-102, 255)
|
# * Package manager errors (APT, DPKG: 100-102, 255)
|
||||||
|
# * BSD sysexits (64-78)
|
||||||
# * Systemd/Service errors (150-154)
|
# * Systemd/Service errors (150-154)
|
||||||
# * Python/pip/uv errors (160-162)
|
# * Python/pip/uv errors (160-162)
|
||||||
# * PostgreSQL errors (170-173)
|
# * PostgreSQL errors (170-173)
|
||||||
# * MySQL/MariaDB errors (180-183)
|
# * MySQL/MariaDB errors (180-183)
|
||||||
# * MongoDB errors (190-193)
|
# * MongoDB errors (190-193)
|
||||||
# * Proxmox custom codes (200-231)
|
# * Proxmox custom codes (200-231)
|
||||||
# * Node.js/npm errors (243, 245-249)
|
# * Node.js/npm errors (239, 243, 245-249)
|
||||||
# - Returns description string for given exit code
|
# - Returns description string for given exit code
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
explain_exit_code() {
|
explain_exit_code() {
|
||||||
@@ -135,30 +136,87 @@ explain_exit_code() {
|
|||||||
# --- Generic / Shell ---
|
# --- Generic / Shell ---
|
||||||
1) echo "General error / Operation not permitted" ;;
|
1) echo "General error / Operation not permitted" ;;
|
||||||
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
||||||
|
3) echo "General syntax or argument error" ;;
|
||||||
|
10) echo "Docker / privileged mode required (unsupported environment)" ;;
|
||||||
|
|
||||||
# --- curl / wget errors (commonly seen in downloads) ---
|
# --- curl / wget errors (commonly seen in downloads) ---
|
||||||
|
4) echo "curl: Feature not supported or protocol error" ;;
|
||||||
|
5) echo "curl: Could not resolve proxy" ;;
|
||||||
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
||||||
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
||||||
|
8) echo "curl: Server reply error (FTP/SFTP or apk untrusted key)" ;;
|
||||||
|
16) echo "curl: HTTP/2 framing layer error" ;;
|
||||||
|
18) echo "curl: Partial file (transfer not completed)" ;;
|
||||||
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
||||||
|
23) echo "curl: Write error (disk full or permissions)" ;;
|
||||||
|
24) echo "curl: Write to local file failed" ;;
|
||||||
|
25) echo "curl: Upload failed" ;;
|
||||||
|
26) echo "curl: Read error on local file (I/O)" ;;
|
||||||
|
27) echo "curl: Out of memory (memory allocation failed)" ;;
|
||||||
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
||||||
|
30) echo "curl: FTP port command failed" ;;
|
||||||
|
32) echo "curl: FTP SIZE command failed" ;;
|
||||||
|
33) echo "curl: HTTP range error" ;;
|
||||||
|
34) echo "curl: HTTP post error" ;;
|
||||||
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
||||||
|
36) echo "curl: FTP bad download resume" ;;
|
||||||
|
39) echo "curl: LDAP search failed" ;;
|
||||||
|
44) echo "curl: Internal error (bad function call order)" ;;
|
||||||
|
45) echo "curl: Interface error (failed to bind to specified interface)" ;;
|
||||||
|
46) echo "curl: Bad password entered" ;;
|
||||||
|
47) echo "curl: Too many redirects" ;;
|
||||||
|
48) echo "curl: Unknown command line option specified" ;;
|
||||||
|
51) echo "curl: SSL peer certificate or SSH host key verification failed" ;;
|
||||||
|
52) echo "curl: Empty reply from server (got nothing)" ;;
|
||||||
|
55) echo "curl: Failed sending network data" ;;
|
||||||
|
56) echo "curl: Receive error (connection reset by peer)" ;;
|
||||||
|
57) echo "curl: Unrecoverable poll/select error (system I/O failure)" ;;
|
||||||
|
59) echo "curl: Couldn't use specified SSL cipher" ;;
|
||||||
|
61) echo "curl: Bad/unrecognized transfer encoding" ;;
|
||||||
|
63) echo "curl: Maximum file size exceeded" ;;
|
||||||
|
75) echo "Temporary failure (retry later)" ;;
|
||||||
|
78) echo "curl: Remote file not found (404 on FTP/file)" ;;
|
||||||
|
79) echo "curl: SSH session error (key exchange/auth failed)" ;;
|
||||||
|
92) echo "curl: HTTP/2 stream error (protocol violation)" ;;
|
||||||
|
95) echo "curl: HTTP/3 layer error" ;;
|
||||||
|
|
||||||
# --- Package manager / APT / DPKG ---
|
# --- Package manager / APT / DPKG ---
|
||||||
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
||||||
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
||||||
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
||||||
|
|
||||||
|
# --- BSD sysexits.h (64-78) ---
|
||||||
|
64) echo "Usage error (wrong arguments)" ;;
|
||||||
|
65) echo "Data format error (bad input data)" ;;
|
||||||
|
66) echo "Input file not found (cannot open input)" ;;
|
||||||
|
67) echo "User not found (addressee unknown)" ;;
|
||||||
|
68) echo "Host not found (hostname unknown)" ;;
|
||||||
|
69) echo "Service unavailable" ;;
|
||||||
|
70) echo "Internal software error" ;;
|
||||||
|
71) echo "System error (OS-level failure)" ;;
|
||||||
|
72) echo "Critical OS file missing" ;;
|
||||||
|
73) echo "Cannot create output file" ;;
|
||||||
|
74) echo "I/O error" ;;
|
||||||
|
76) echo "Remote protocol error" ;;
|
||||||
|
77) echo "Permission denied" ;;
|
||||||
|
|
||||||
# --- Common shell/system errors ---
|
# --- Common shell/system errors ---
|
||||||
124) echo "Command timed out (timeout command)" ;;
|
124) echo "Command timed out (timeout command)" ;;
|
||||||
|
125) echo "Command failed to start (Docker daemon or execution error)" ;;
|
||||||
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" ;;
|
||||||
|
129) echo "Killed by SIGHUP (terminal closed / hangup)" ;;
|
||||||
130) echo "Aborted by user (SIGINT)" ;;
|
130) echo "Aborted by user (SIGINT)" ;;
|
||||||
|
131) echo "Killed by SIGQUIT (core dumped)" ;;
|
||||||
|
132) echo "Killed by SIGILL (illegal CPU instruction)" ;;
|
||||||
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)" ;;
|
||||||
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
||||||
143) echo "Terminated (SIGTERM)" ;;
|
143) echo "Terminated (SIGTERM)" ;;
|
||||||
|
144) echo "Killed by signal 16 (SIGUSR1 / SIGSTKFLT)" ;;
|
||||||
|
146) echo "Killed by signal 18 (SIGTSTP)" ;;
|
||||||
|
|
||||||
# --- Systemd / Service errors (150-154) ---
|
# --- Systemd / Service errors (150-154) ---
|
||||||
150) echo "Systemd: Service failed to start" ;;
|
150) echo "Systemd: Service failed to start" ;;
|
||||||
@@ -166,7 +224,6 @@ explain_exit_code() {
|
|||||||
152) echo "Permission denied (EACCES)" ;;
|
152) echo "Permission denied (EACCES)" ;;
|
||||||
153) echo "Build/compile failed (make/gcc/cmake)" ;;
|
153) echo "Build/compile failed (make/gcc/cmake)" ;;
|
||||||
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
|
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
|
||||||
|
|
||||||
# --- Python / pip / uv (160-162) ---
|
# --- Python / pip / uv (160-162) ---
|
||||||
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
||||||
161) echo "Python: Dependency resolution failed" ;;
|
161) echo "Python: Dependency resolution failed" ;;
|
||||||
@@ -217,7 +274,8 @@ explain_exit_code() {
|
|||||||
225) echo "Proxmox: No template available for OS/Version" ;;
|
225) echo "Proxmox: No template available for OS/Version" ;;
|
||||||
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
||||||
|
|
||||||
# --- Node.js / npm / pnpm / yarn (243-249) ---
|
# --- Node.js / npm / pnpm / yarn (239-249) ---
|
||||||
|
239) echo "npm/Node.js: Unexpected runtime error or dependency failure" ;;
|
||||||
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
||||||
245) echo "Node.js: Invalid command-line option" ;;
|
245) echo "Node.js: Invalid command-line option" ;;
|
||||||
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
||||||
@@ -494,6 +552,7 @@ post_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "lxc",
|
"type": "lxc",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "installing",
|
"status": "installing",
|
||||||
@@ -598,6 +657,7 @@ post_to_api_vm() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "installing",
|
"status": "installing",
|
||||||
@@ -624,6 +684,8 @@ EOF
|
|||||||
curl -fsS -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
curl -fsS -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "$JSON_PAYLOAD" &>/dev/null || true
|
-d "$JSON_PAYLOAD" &>/dev/null || true
|
||||||
|
|
||||||
|
POST_TO_API_DONE=true
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -728,6 +790,7 @@ post_update_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -770,6 +833,7 @@ EOF
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -812,6 +876,7 @@ EOF
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -848,6 +913,9 @@ categorize_error() {
|
|||||||
# Network errors (curl/wget)
|
# Network errors (curl/wget)
|
||||||
6 | 7 | 22 | 35) echo "network" ;;
|
6 | 7 | 22 | 35) echo "network" ;;
|
||||||
|
|
||||||
|
# Docker / Privileged mode required
|
||||||
|
10) echo "config" ;;
|
||||||
|
|
||||||
# Timeout errors
|
# Timeout errors
|
||||||
28 | 124 | 211) echo "timeout" ;;
|
28 | 124 | 211) echo "timeout" ;;
|
||||||
|
|
||||||
@@ -922,6 +990,63 @@ get_install_duration() {
|
|||||||
echo $((now - INSTALL_START_TIME))
|
echo $((now - INSTALL_START_TIME))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# _telemetry_report_exit()
|
||||||
|
#
|
||||||
|
# - Internal handler called by EXIT trap set in init_tool_telemetry()
|
||||||
|
# - Determines success/failure from exit code and reports via appropriate API
|
||||||
|
# - Arguments:
|
||||||
|
# * $1: exit_code from the script
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
_telemetry_report_exit() {
|
||||||
|
local ec="${1:-0}"
|
||||||
|
local status="success"
|
||||||
|
[[ "$ec" -ne 0 ]] && status="failed"
|
||||||
|
|
||||||
|
# Lazy name resolution: use explicit name, fall back to $APP, then "unknown"
|
||||||
|
local name="${TELEMETRY_TOOL_NAME:-${APP:-unknown}}"
|
||||||
|
|
||||||
|
if [[ "${TELEMETRY_TOOL_TYPE:-pve}" == "addon" ]]; then
|
||||||
|
post_addon_to_api "$name" "$status" "$ec"
|
||||||
|
else
|
||||||
|
post_tool_to_api "$name" "$status" "$ec"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# init_tool_telemetry()
|
||||||
|
#
|
||||||
|
# - One-line telemetry setup for tools/addon scripts
|
||||||
|
# - Reads DIAGNOSTICS from /usr/local/community-scripts/diagnostics
|
||||||
|
# (persisted on PVE host during first build, and inside containers by install.func)
|
||||||
|
# - Starts install timer for duration tracking
|
||||||
|
# - Sets EXIT trap to automatically report success/failure on script exit
|
||||||
|
# - Arguments:
|
||||||
|
# * $1: tool_name (optional, falls back to $APP at exit time)
|
||||||
|
# * $2: type ("pve" for PVE host scripts, "addon" for container addons)
|
||||||
|
# - Usage:
|
||||||
|
# source <(curl -fsSL .../misc/api.func) 2>/dev/null || true
|
||||||
|
# init_tool_telemetry "post-pve-install" "pve"
|
||||||
|
# init_tool_telemetry "" "addon" # uses $APP at exit time
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
init_tool_telemetry() {
|
||||||
|
local name="${1:-}"
|
||||||
|
local type="${2:-pve}"
|
||||||
|
|
||||||
|
[[ -n "$name" ]] && TELEMETRY_TOOL_NAME="$name"
|
||||||
|
TELEMETRY_TOOL_TYPE="$type"
|
||||||
|
|
||||||
|
# Read diagnostics opt-in/opt-out
|
||||||
|
if [[ -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics 2>/dev/null | awk -F'=' '{print $2}') || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
start_install_timer
|
||||||
|
|
||||||
|
# EXIT trap: automatically report telemetry when script ends
|
||||||
|
trap '_telemetry_report_exit "$?"' EXIT
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# post_tool_to_api()
|
# post_tool_to_api()
|
||||||
#
|
#
|
||||||
@@ -969,7 +1094,8 @@ post_tool_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${uuid}",
|
"random_id": "${uuid}",
|
||||||
"type": "tool",
|
"execution_id": "${EXECUTION_ID:-${uuid}}",
|
||||||
|
"type": "pve",
|
||||||
"nsapp": "${tool_name}",
|
"nsapp": "${tool_name}",
|
||||||
"status": "${status}",
|
"status": "${status}",
|
||||||
"exit_code": ${exit_code},
|
"exit_code": ${exit_code},
|
||||||
@@ -1036,6 +1162,7 @@ post_addon_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${uuid}",
|
"random_id": "${uuid}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${uuid}}",
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"nsapp": "${addon_name}",
|
"nsapp": "${addon_name}",
|
||||||
"status": "${status}",
|
"status": "${status}",
|
||||||
@@ -1127,6 +1254,7 @@ post_update_to_api_extended() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
|
|||||||
479
misc/build.func
479
misc/build.func
@@ -42,9 +42,10 @@ variables() {
|
|||||||
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
||||||
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
||||||
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
||||||
DIAGNOSTICS="yes" # sets the DIAGNOSTICS variable to "yes", used for the API call.
|
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
||||||
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
||||||
|
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
||||||
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
||||||
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
||||||
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
||||||
@@ -2787,93 +2788,85 @@ Advanced:
|
|||||||
# diagnostics_check()
|
# diagnostics_check()
|
||||||
#
|
#
|
||||||
# - Ensures diagnostics config file exists at /usr/local/community-scripts/diagnostics
|
# - Ensures diagnostics config file exists at /usr/local/community-scripts/diagnostics
|
||||||
# - Asks user whether to send anonymous diagnostic data
|
# - Asks user whether to send anonymous diagnostic data (first run only)
|
||||||
# - Saves DIAGNOSTICS=yes/no in the config file
|
# - Saves DIAGNOSTICS=yes/no in the config file
|
||||||
# - Creates file if missing with default DIAGNOSTICS=yes
|
# - Reads current diagnostics setting from existing file
|
||||||
# - Reads current diagnostics setting from file
|
|
||||||
# - Sets global DIAGNOSTICS variable for API telemetry opt-in/out
|
# - Sets global DIAGNOSTICS variable for API telemetry opt-in/out
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
diagnostics_check() {
|
diagnostics_check() {
|
||||||
if ! [ -d "/usr/local/community-scripts" ]; then
|
local config_dir="/usr/local/community-scripts"
|
||||||
mkdir -p /usr/local/community-scripts
|
local config_file="${config_dir}/diagnostics"
|
||||||
|
|
||||||
|
mkdir -p "$config_dir"
|
||||||
|
|
||||||
|
if [[ -f "$config_file" ]]; then
|
||||||
|
DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' "$config_file") || true
|
||||||
|
DIAGNOSTICS="${DIAGNOSTICS:-no}"
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [ -f "/usr/local/community-scripts/diagnostics" ]; then
|
local result
|
||||||
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS" --yesno "Send Diagnostics of LXC Installation?\n\n(This only transmits data without user data, just RAM, CPU, LXC name, ...)" 10 58); then
|
result=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
cat <<EOF >/usr/local/community-scripts/diagnostics
|
--title "TELEMETRY & DIAGNOSTICS" \
|
||||||
DIAGNOSTICS=yes
|
--ok-button "Confirm" --cancel-button "Exit" \
|
||||||
|
--radiolist "\nHelp improve Community-Scripts by sharing anonymous data.\n\nWhat we collect:\n - Container resources (CPU, RAM, disk), OS & PVE version\n - Application name, install method and status\n\nWhat we DON'T collect:\n - No IP addresses, hostnames, or personal data\n\nYou can change this anytime in the Settings menu.\nPrivacy: https://github.com/community-scripts/telemetry-service/blob/main/docs/PRIVACY.md\n\nUse SPACE to select, ENTER to confirm." 22 76 2 \
|
||||||
|
"yes" "Yes, share anonymous data" OFF \
|
||||||
|
"no" "No, opt out" OFF \
|
||||||
|
3>&1 1>&2 2>&3) || result="no"
|
||||||
|
|
||||||
#This file is used to store the diagnostics settings for the Community-Scripts API.
|
DIAGNOSTICS="${result:-no}"
|
||||||
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
|
|
||||||
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
|
cat <<EOF >"$config_file"
|
||||||
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
|
DIAGNOSTICS=${DIAGNOSTICS}
|
||||||
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will disable the diagnostics feature.
|
# Community-Scripts Telemetry Configuration
|
||||||
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
|
# https://telemetry.community-scripts.org
|
||||||
#This will enable the diagnostics feature.
|
#
|
||||||
#The following information will be sent:
|
# This file stores your telemetry preference.
|
||||||
#"disk_size"
|
# Set DIAGNOSTICS=yes to share anonymous installation data.
|
||||||
#"core_count"
|
# Set DIAGNOSTICS=no to disable telemetry.
|
||||||
#"ram_size"
|
#
|
||||||
#"os_type"
|
# You can also change this via the Settings menu during installation.
|
||||||
#"os_version"
|
#
|
||||||
#"nsapp"
|
# Data collected (when enabled):
|
||||||
#"method"
|
# disk_size, core_count, ram_size, os_type, os_version,
|
||||||
#"pve_version"
|
# nsapp, method, pve_version, status, exit_code
|
||||||
#"status"
|
#
|
||||||
#If you have any concerns, please review the source code at /misc/build.func
|
# No personal data (IPs, hostnames, passwords) is ever collected.
|
||||||
|
# Privacy: https://github.com/community-scripts/telemetry-service/blob/main/docs/PRIVACY.md
|
||||||
EOF
|
EOF
|
||||||
DIAGNOSTICS="yes"
|
|
||||||
else
|
|
||||||
cat <<EOF >/usr/local/community-scripts/diagnostics
|
|
||||||
DIAGNOSTICS=no
|
|
||||||
|
|
||||||
#This file is used to store the diagnostics settings for the Community-Scripts API.
|
|
||||||
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
|
|
||||||
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
|
|
||||||
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
|
|
||||||
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will disable the diagnostics feature.
|
|
||||||
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will enable the diagnostics feature.
|
|
||||||
#The following information will be sent:
|
|
||||||
#"disk_size"
|
|
||||||
#"core_count"
|
|
||||||
#"ram_size"
|
|
||||||
#"os_type"
|
|
||||||
#"os_version"
|
|
||||||
#"nsapp"
|
|
||||||
#"method"
|
|
||||||
#"pve_version"
|
|
||||||
#"status"
|
|
||||||
#If you have any concerns, please review the source code at /misc/build.func
|
|
||||||
EOF
|
|
||||||
DIAGNOSTICS="no"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' /usr/local/community-scripts/diagnostics)
|
|
||||||
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
diagnostics_menu() {
|
diagnostics_menu() {
|
||||||
if [ "${DIAGNOSTICS:-no}" = "yes" ]; then
|
local current="${DIAGNOSTICS:-no}"
|
||||||
|
local status_text="DISABLED"
|
||||||
|
[[ "$current" == "yes" ]] && status_text="ENABLED"
|
||||||
|
|
||||||
|
local dialog_text=(
|
||||||
|
"Telemetry is currently: ${status_text}\n\n"
|
||||||
|
"Anonymous data helps us improve scripts and track issues.\n"
|
||||||
|
"No personal data is ever collected.\n\n"
|
||||||
|
"More info: https://telemetry.community-scripts.org\n\n"
|
||||||
|
"Do you want to ${current:+change this setting}?"
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ "$current" == "yes" ]]; then
|
||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
--title "DIAGNOSTIC SETTINGS" \
|
--title "TELEMETRY SETTINGS" \
|
||||||
--yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \
|
--yesno "${dialog_text[*]}" 14 64 \
|
||||||
--yes-button "No" --no-button "Back"; then
|
--yes-button "Disable" --no-button "Keep enabled"; then
|
||||||
DIAGNOSTICS="no"
|
DIAGNOSTICS="no"
|
||||||
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
|
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
|
||||||
whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58
|
whiptail --msgbox "Telemetry disabled.\n\nNote: Existing containers keep their current setting.\nNew containers will inherit this choice." 10 58
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
--title "DIAGNOSTIC SETTINGS" \
|
--title "TELEMETRY SETTINGS" \
|
||||||
--yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \
|
--yesno "${dialog_text[*]}" 14 64 \
|
||||||
--yes-button "Yes" --no-button "Back"; then
|
--yes-button "Enable" --no-button "Keep disabled"; then
|
||||||
DIAGNOSTICS="yes"
|
DIAGNOSTICS="yes"
|
||||||
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
|
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
|
||||||
whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58
|
whiptail --msgbox "Telemetry enabled.\n\nNote: Existing containers keep their current setting.\nNew containers will inherit this choice." 10 58
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -3427,6 +3420,7 @@ start() {
|
|||||||
VERBOSE="no"
|
VERBOSE="no"
|
||||||
set_std_mode
|
set_std_mode
|
||||||
ensure_profile_loaded
|
ensure_profile_loaded
|
||||||
|
get_lxc_ip
|
||||||
update_script
|
update_script
|
||||||
update_motd_ip
|
update_motd_ip
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
@@ -3454,6 +3448,7 @@ start() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
ensure_profile_loaded
|
ensure_profile_loaded
|
||||||
|
get_lxc_ip
|
||||||
update_script
|
update_script
|
||||||
update_motd_ip
|
update_motd_ip
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
@@ -3559,6 +3554,7 @@ build_container() {
|
|||||||
# Core exports for install.func
|
# Core exports for install.func
|
||||||
export DIAGNOSTICS="$DIAGNOSTICS"
|
export DIAGNOSTICS="$DIAGNOSTICS"
|
||||||
export RANDOM_UUID="$RANDOM_UUID"
|
export RANDOM_UUID="$RANDOM_UUID"
|
||||||
|
export EXECUTION_ID="$EXECUTION_ID"
|
||||||
export SESSION_ID="$SESSION_ID"
|
export SESSION_ID="$SESSION_ID"
|
||||||
export CACHER="$APT_CACHER"
|
export CACHER="$APT_CACHER"
|
||||||
export CACHER_IP="$APT_CACHER_IP"
|
export CACHER_IP="$APT_CACHER_IP"
|
||||||
@@ -4038,6 +4034,13 @@ EOF'
|
|||||||
|
|
||||||
msg_ok "Customized LXC Container"
|
msg_ok "Customized LXC Container"
|
||||||
|
|
||||||
|
# Optional DNS override for retry scenarios (inside LXC, never on host)
|
||||||
|
if [[ "${DNS_RETRY_OVERRIDE:-false}" == "true" ]]; then
|
||||||
|
msg_info "Applying DNS retry override in LXC (8.8.8.8, 1.1.1.1)"
|
||||||
|
pct exec "$CTID" -- bash -c "printf 'nameserver 8.8.8.8\nnameserver 1.1.1.1\n' >/etc/resolv.conf" >/dev/null 2>&1 || true
|
||||||
|
msg_ok "DNS override applied in LXC"
|
||||||
|
fi
|
||||||
|
|
||||||
# Install SSH keys
|
# Install SSH keys
|
||||||
install_ssh_keys_into_ct
|
install_ssh_keys_into_ct
|
||||||
|
|
||||||
@@ -4150,20 +4153,155 @@ EOF'
|
|||||||
|
|
||||||
# Prompt user for cleanup with 60s timeout
|
# Prompt user for cleanup with 60s timeout
|
||||||
echo ""
|
echo ""
|
||||||
echo -en "${TAB}❓${TAB}${YW}Remove broken container ${CTID}? (Y/n) [auto-remove in 60s]: ${CL}"
|
|
||||||
|
# Detect error type for smart recovery options
|
||||||
|
local is_oom=false
|
||||||
|
local is_network_issue=false
|
||||||
|
local is_apt_issue=false
|
||||||
|
local is_cmd_not_found=false
|
||||||
|
local error_explanation=""
|
||||||
|
if declare -f explain_exit_code >/dev/null 2>&1; then
|
||||||
|
error_explanation="$(explain_exit_code "$install_exit_code")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OOM detection: exit codes 134 (SIGABRT/heap), 137 (SIGKILL/OOM), 243 (Node.js heap)
|
||||||
|
if [[ $install_exit_code -eq 134 || $install_exit_code -eq 137 || $install_exit_code -eq 243 ]]; then
|
||||||
|
is_oom=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# APT/DPKG detection: exit codes 100-102 (APT), 255 (DPKG with log evidence)
|
||||||
|
case "$install_exit_code" in
|
||||||
|
100 | 101 | 102) is_apt_issue=true ;;
|
||||||
|
255)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'dpkg|apt-get|apt\.conf|broken packages|unmet dependencies|E: Sub-process|E: Failed' "$combined_log"; then
|
||||||
|
is_apt_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Command not found detection
|
||||||
|
if [[ $install_exit_code -eq 127 ]]; then
|
||||||
|
is_cmd_not_found=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Network-related detection (curl/apt/git fetch failures and transient network issues)
|
||||||
|
case "$install_exit_code" in
|
||||||
|
6 | 7 | 22 | 28 | 35 | 52 | 56 | 57 | 75 | 78) is_network_issue=true ;;
|
||||||
|
100)
|
||||||
|
# APT can fail due to network (Failed to fetch)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'Failed to fetch|Could not resolve|Connection failed|Network is unreachable|Temporary failure resolving' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
128)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'RPC failed|early EOF|fetch-pack|HTTP/2 stream|Could not resolve host|Temporary failure resolving|Failed to fetch|Connection reset|Network is unreachable' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Exit 1 subclassification: analyze logs to identify actual root cause
|
||||||
|
# Many exit 1 errors are actually APT, OOM, network, or command-not-found issues
|
||||||
|
if [[ $install_exit_code -eq 1 && -f "$combined_log" ]]; then
|
||||||
|
if grep -qiE 'E: Unable to|E: Package|E: Failed to fetch|dpkg.*error|broken packages|unmet dependencies|dpkg --configure -a' "$combined_log"; then
|
||||||
|
is_apt_issue=true
|
||||||
|
fi
|
||||||
|
if grep -qiE 'Cannot allocate memory|Out of memory|oom-killer|Killed process|JavaScript heap' "$combined_log"; then
|
||||||
|
is_oom=true
|
||||||
|
fi
|
||||||
|
if grep -qiE 'Could not resolve|DNS|Connection refused|Network is unreachable|No route to host|Temporary failure resolving|Failed to fetch' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
if grep -qiE ': command not found|No such file or directory.*/s?bin/' "$combined_log"; then
|
||||||
|
is_cmd_not_found=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error explanation if available
|
||||||
|
if [[ -n "$error_explanation" ]]; then
|
||||||
|
echo -e "${TAB}${RD}Error: ${error_explanation}${CL}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show specific hints for known error types
|
||||||
|
if [[ $install_exit_code -eq 10 ]]; then
|
||||||
|
echo -e "${TAB}${INFO} This error usually means the container needs ${GN}privileged${CL} mode or Docker/nesting support."
|
||||||
|
echo -e "${TAB}${INFO} Recreate with: Advanced Install → Container Type: ${GN}Privileged${CL}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $install_exit_code -eq 125 || $install_exit_code -eq 126 ]]; then
|
||||||
|
echo -e "${TAB}${INFO} The command exists but cannot be executed. This may be a ${GN}permission${CL} issue."
|
||||||
|
echo -e "${TAB}${INFO} If using Docker, ensure the container is ${GN}privileged${CL} or has correct permissions."
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_cmd_not_found" == true ]]; then
|
||||||
|
local missing_cmd=""
|
||||||
|
if [[ -f "$combined_log" ]]; then
|
||||||
|
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" | tail -1 | sed 's/: command not found//')
|
||||||
|
fi
|
||||||
|
if [[ -n "$missing_cmd" ]]; then
|
||||||
|
echo -e "${TAB}${INFO} Missing command: ${GN}${missing_cmd}${CL}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build recovery menu based on error type
|
||||||
|
echo -e "${YW}What would you like to do?${CL}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GN}1)${CL} Remove container and exit"
|
||||||
|
echo -e " ${GN}2)${CL} Keep container for debugging"
|
||||||
|
echo -e " ${GN}3)${CL} Retry with verbose mode (full rebuild)"
|
||||||
|
|
||||||
|
local next_option=4
|
||||||
|
local APT_OPTION="" OOM_OPTION="" DNS_OPTION=""
|
||||||
|
|
||||||
|
if [[ "$is_apt_issue" == true ]]; then
|
||||||
|
if [[ "$var_os" == "alpine" ]]; then
|
||||||
|
echo -e " ${GN}${next_option})${CL} Repair APK state and re-run install (in-place)"
|
||||||
|
else
|
||||||
|
echo -e " ${GN}${next_option})${CL} Repair APT/DPKG state and re-run install (in-place)"
|
||||||
|
fi
|
||||||
|
APT_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_oom" == true ]]; then
|
||||||
|
local recovery_attempt="${RECOVERY_ATTEMPT:-0}"
|
||||||
|
if [[ $recovery_attempt -lt 2 ]]; then
|
||||||
|
local new_ram=$((RAM_SIZE * 2))
|
||||||
|
local new_cpu=$((CORE_COUNT * 2))
|
||||||
|
echo -e " ${GN}${next_option})${CL} Retry with more resources (RAM: ${RAM_SIZE}→${new_ram} MiB, CPU: ${CORE_COUNT}→${new_cpu} cores)"
|
||||||
|
OOM_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
else
|
||||||
|
echo -e " ${DGN}-)${CL} ${DGN}OOM retry exhausted (already retried ${recovery_attempt}x)${CL}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_network_issue" == true ]]; then
|
||||||
|
echo -e " ${GN}${next_option})${CL} Retry with DNS override in LXC (8.8.8.8 / 1.1.1.1)"
|
||||||
|
DNS_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
local max_option=$((next_option - 1))
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -en "${YW}Select option [1-${max_option}] (default: 1, auto-remove in 60s): ${CL}"
|
||||||
|
|
||||||
if read -t 60 -r response; then
|
if read -t 60 -r response; then
|
||||||
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
|
case "${response:-1}" in
|
||||||
|
1)
|
||||||
# Remove container
|
# Remove container
|
||||||
echo ""
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID}${CL}"
|
||||||
msg_info "Removing container ${CTID}"
|
|
||||||
pct stop "$CTID" &>/dev/null || true
|
pct stop "$CTID" &>/dev/null || true
|
||||||
pct destroy "$CTID" &>/dev/null || true
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
msg_ok "Container ${CTID} removed"
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
elif [[ "$response" =~ ^[Nn]$ ]]; then
|
;;
|
||||||
echo ""
|
2)
|
||||||
msg_warn "Container ${CTID} kept for debugging"
|
echo -e "\n${TAB}${YW}Container ${CTID} kept for debugging${CL}"
|
||||||
|
|
||||||
# Dev mode: Setup MOTD/SSH for debugging access to broken container
|
# Dev mode: Setup MOTD/SSH for debugging access to broken container
|
||||||
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
|
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
|
||||||
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
|
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
|
||||||
@@ -4175,7 +4313,162 @@ EOF'
|
|||||||
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
|
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
exit $install_exit_code
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
# Retry with verbose mode (full rebuild)
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
# Get new container ID
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
# Show rebuild summary
|
||||||
|
echo -e "${YW}Rebuilding with preserved settings:${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " RAM: ${RAM_SIZE} MiB | CPU: ${CORE_COUNT} cores | Disk: ${DISK_SIZE} GB"
|
||||||
|
echo -e " Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
# Re-run build_container
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Handle dynamic smart recovery options via named option variables
|
||||||
|
local handled=false
|
||||||
|
|
||||||
|
if [[ -n "${APT_OPTION}" && "${response}" == "${APT_OPTION}" ]]; then
|
||||||
|
# Package manager in-place repair: fix broken state and re-run install script
|
||||||
|
handled=true
|
||||||
|
if [[ "$var_os" == "alpine" ]]; then
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Repairing APK state in container ${CTID}...${CL}"
|
||||||
|
pct exec "$CTID" -- ash -c "
|
||||||
|
apk fix 2>/dev/null || true
|
||||||
|
apk cache clean 2>/dev/null || true
|
||||||
|
apk update 2>/dev/null || true
|
||||||
|
" >/dev/null 2>&1 || true
|
||||||
|
echo -e "${BFR}${CM}${GN}APK state repaired in container ${CTID}${CL}"
|
||||||
|
else
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Repairing APT/DPKG state in container ${CTID}...${CL}"
|
||||||
|
pct exec "$CTID" -- bash -c "
|
||||||
|
DEBIAN_FRONTEND=noninteractive dpkg --configure -a 2>/dev/null || true
|
||||||
|
apt-get -f install -y 2>/dev/null || true
|
||||||
|
apt-get clean 2>/dev/null
|
||||||
|
apt-get update 2>/dev/null || true
|
||||||
|
" >/dev/null 2>&1 || true
|
||||||
|
echo -e "${BFR}${CM}${GN}APT/DPKG state repaired in container ${CTID}${CL}"
|
||||||
fi
|
fi
|
||||||
|
echo ""
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
echo -e "${YW}Re-running installation in existing container ${CTID}:${CL}"
|
||||||
|
echo -e " RAM: ${RAM_SIZE} MiB | CPU: ${CORE_COUNT} cores | Disk: ${DISK_SIZE} GB"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Re-running installation script..."
|
||||||
|
|
||||||
|
# Re-run install script in existing container (don't destroy/recreate)
|
||||||
|
set +Eeuo pipefail
|
||||||
|
trap - ERR
|
||||||
|
lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${var_install}.sh)"
|
||||||
|
local apt_retry_exit=$?
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# Check for error flag from retry
|
||||||
|
local apt_retry_code=0
|
||||||
|
if [[ -n "${SESSION_ID:-}" ]]; then
|
||||||
|
local retry_error_flag="/root/.install-${SESSION_ID}.failed"
|
||||||
|
if pct exec "$CTID" -- test -f "$retry_error_flag" 2>/dev/null; then
|
||||||
|
apt_retry_code=$(pct exec "$CTID" -- cat "$retry_error_flag" 2>/dev/null || echo "1")
|
||||||
|
pct exec "$CTID" -- rm -f "$retry_error_flag" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $apt_retry_code -eq 0 && $apt_retry_exit -ne 0 ]]; then
|
||||||
|
apt_retry_code=$apt_retry_exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $apt_retry_code -eq 0 ]]; then
|
||||||
|
msg_ok "Installation completed successfully after APT repair!"
|
||||||
|
post_update_to_api "done" "0" "force"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Installation still failed after APT repair (exit code: ${apt_retry_code})"
|
||||||
|
install_exit_code=$apt_retry_code
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${OOM_OPTION}" && "${response}" == "${OOM_OPTION}" ]]; then
|
||||||
|
# Retry with doubled resources
|
||||||
|
handled=true
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild with more resources...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
local old_ram="$RAM_SIZE"
|
||||||
|
local old_cpu="$CORE_COUNT"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export RAM_SIZE=$((RAM_SIZE * 2))
|
||||||
|
export CORE_COUNT=$((CORE_COUNT * 2))
|
||||||
|
export var_ram="$RAM_SIZE"
|
||||||
|
export var_cpu="$CORE_COUNT"
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
export RECOVERY_ATTEMPT=$((${RECOVERY_ATTEMPT:-0} + 1))
|
||||||
|
|
||||||
|
echo -e "${YW}Rebuilding with increased resources (attempt ${RECOVERY_ATTEMPT}/2):${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " RAM: ${old_ram} → ${GN}${RAM_SIZE}${CL} MiB (x2)"
|
||||||
|
echo -e " CPU: ${old_cpu} → ${GN}${CORE_COUNT}${CL} cores (x2)"
|
||||||
|
echo -e " Disk: ${DISK_SIZE} GB | Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${DNS_OPTION}" && "${response}" == "${DNS_OPTION}" ]]; then
|
||||||
|
# Retry with DNS override in LXC
|
||||||
|
handled=true
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild with DNS override...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export DNS_RETRY_OVERRIDE="true"
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
echo -e "${YW}Rebuilding with DNS override in LXC:${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " DNS: ${GN}8.8.8.8, 1.1.1.1${CL} (inside LXC only)"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$handled" == false ]]; then
|
||||||
|
echo -e "\n${TAB}${YW}Invalid option. Container ${CTID} kept.${CL}"
|
||||||
|
exit $install_exit_code
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
else
|
else
|
||||||
# Timeout - auto-remove
|
# Timeout - auto-remove
|
||||||
echo ""
|
echo ""
|
||||||
@@ -5253,20 +5546,36 @@ ensure_log_on_host() {
|
|||||||
# - Exit trap handler for reporting to API telemetry
|
# - Exit trap handler for reporting to API telemetry
|
||||||
# - Captures exit code and reports to PocketBase using centralized error descriptions
|
# - Captures exit code and reports to PocketBase using centralized error descriptions
|
||||||
# - Uses explain_exit_code() from api.func for consistent error messages
|
# - Uses explain_exit_code() from api.func for consistent error messages
|
||||||
# - Posts failure status with exit code to API (error description resolved automatically)
|
# - For signal exits (>128): sends telemetry FIRST before log collection
|
||||||
# - Only executes on non-zero exit codes
|
# to prevent pct pull hangs from blocking status updates
|
||||||
|
# - For non-zero exit codes: posts "failed" status
|
||||||
|
# - For zero exit codes where post_update_to_api was never called:
|
||||||
|
# catches orphaned "installing" records (e.g., script exited cleanly
|
||||||
|
# but description() was never reached)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
api_exit_script() {
|
api_exit_script() {
|
||||||
exit_code=$?
|
local exit_code=$?
|
||||||
if [ $exit_code -ne 0 ]; then
|
if [ $exit_code -ne 0 ]; then
|
||||||
ensure_log_on_host
|
if [ $exit_code -gt 128 ]; then
|
||||||
|
# Signal exit: send telemetry IMMEDIATELY (container may be dying)
|
||||||
|
post_update_to_api "failed" "$exit_code" 2>/dev/null || true
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
|
else
|
||||||
|
# Normal error: collect logs first for better error details
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
post_update_to_api "failed" "$exit_code"
|
post_update_to_api "failed" "$exit_code"
|
||||||
fi
|
fi
|
||||||
|
elif [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
# Script exited with 0 but never sent a completion status
|
||||||
|
# exit_code=0 is never an error — report as success
|
||||||
|
post_update_to_api "done" "0"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if command -v pveversion >/dev/null 2>&1; then
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
trap 'api_exit_script' EXIT
|
trap 'api_exit_script' EXIT
|
||||||
fi
|
fi
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "$?"' ERR
|
trap 'local _ec=$?; if [[ $_ec -ne 0 ]]; then ensure_log_on_host 2>/dev/null || true; post_update_to_api "failed" "$_ec"; fi' ERR
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "130"; exit 130' SIGINT
|
trap 'post_update_to_api "failed" "129" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 129' SIGHUP
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "143"; exit 143' SIGTERM
|
trap 'post_update_to_api "failed" "130" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 130' SIGINT
|
||||||
|
trap 'post_update_to_api "failed" "143" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 143' SIGTERM
|
||||||
|
|||||||
@@ -37,24 +37,79 @@ if ! declare -f explain_exit_code &>/dev/null; then
|
|||||||
case "$code" in
|
case "$code" in
|
||||||
1) echo "General error / Operation not permitted" ;;
|
1) echo "General error / Operation not permitted" ;;
|
||||||
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
||||||
|
3) echo "General syntax or argument error" ;;
|
||||||
|
10) echo "Docker / privileged mode required (unsupported environment)" ;;
|
||||||
|
4) echo "curl: Feature not supported or protocol error" ;;
|
||||||
|
5) echo "curl: Could not resolve proxy" ;;
|
||||||
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
||||||
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
||||||
|
8) echo "curl: Server reply error (FTP/SFTP or apk untrusted key)" ;;
|
||||||
|
16) echo "curl: HTTP/2 framing layer error" ;;
|
||||||
|
18) echo "curl: Partial file (transfer not completed)" ;;
|
||||||
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
||||||
|
23) echo "curl: Write error (disk full or permissions)" ;;
|
||||||
|
24) echo "curl: Write to local file failed" ;;
|
||||||
|
25) echo "curl: Upload failed" ;;
|
||||||
|
26) echo "curl: Read error on local file (I/O)" ;;
|
||||||
|
27) echo "curl: Out of memory (memory allocation failed)" ;;
|
||||||
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
||||||
|
30) echo "curl: FTP port command failed" ;;
|
||||||
|
32) echo "curl: FTP SIZE command failed" ;;
|
||||||
|
33) echo "curl: HTTP range error" ;;
|
||||||
|
34) echo "curl: HTTP post error" ;;
|
||||||
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
||||||
|
36) echo "curl: FTP bad download resume" ;;
|
||||||
|
39) echo "curl: LDAP search failed" ;;
|
||||||
|
44) echo "curl: Internal error (bad function call order)" ;;
|
||||||
|
45) echo "curl: Interface error (failed to bind to specified interface)" ;;
|
||||||
|
46) echo "curl: Bad password entered" ;;
|
||||||
|
47) echo "curl: Too many redirects" ;;
|
||||||
|
48) echo "curl: Unknown command line option specified" ;;
|
||||||
|
51) echo "curl: SSL peer certificate or SSH host key verification failed" ;;
|
||||||
|
52) echo "curl: Empty reply from server (got nothing)" ;;
|
||||||
|
55) echo "curl: Failed sending network data" ;;
|
||||||
|
56) echo "curl: Receive error (connection reset by peer)" ;;
|
||||||
|
57) echo "curl: Unrecoverable poll/select error (system I/O failure)" ;;
|
||||||
|
59) echo "curl: Couldn't use specified SSL cipher" ;;
|
||||||
|
61) echo "curl: Bad/unrecognized transfer encoding" ;;
|
||||||
|
63) echo "curl: Maximum file size exceeded" ;;
|
||||||
|
75) echo "Temporary failure (retry later)" ;;
|
||||||
|
78) echo "curl: Remote file not found (404 on FTP/file)" ;;
|
||||||
|
79) echo "curl: SSH session error (key exchange/auth failed)" ;;
|
||||||
|
92) echo "curl: HTTP/2 stream error (protocol violation)" ;;
|
||||||
|
95) echo "curl: HTTP/3 layer error" ;;
|
||||||
|
64) echo "Usage error (wrong arguments)" ;;
|
||||||
|
65) echo "Data format error (bad input data)" ;;
|
||||||
|
66) echo "Input file not found (cannot open input)" ;;
|
||||||
|
67) echo "User not found (addressee unknown)" ;;
|
||||||
|
68) echo "Host not found (hostname unknown)" ;;
|
||||||
|
69) echo "Service unavailable" ;;
|
||||||
|
70) echo "Internal software error" ;;
|
||||||
|
71) echo "System error (OS-level failure)" ;;
|
||||||
|
72) echo "Critical OS file missing" ;;
|
||||||
|
73) echo "Cannot create output file" ;;
|
||||||
|
74) echo "I/O error" ;;
|
||||||
|
76) echo "Remote protocol error" ;;
|
||||||
|
77) echo "Permission denied" ;;
|
||||||
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
||||||
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
||||||
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
||||||
124) echo "Command timed out (timeout command)" ;;
|
124) echo "Command timed out (timeout command)" ;;
|
||||||
|
125) echo "Command failed to start (Docker daemon or execution error)" ;;
|
||||||
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 "Terminated by Ctrl+C (SIGINT)" ;;
|
129) echo "Killed by SIGHUP (terminal closed / hangup)" ;;
|
||||||
|
130) echo "Aborted by user (SIGINT)" ;;
|
||||||
|
131) echo "Killed by SIGQUIT (core dumped)" ;;
|
||||||
|
132) echo "Killed by SIGILL (illegal CPU instruction)" ;;
|
||||||
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)" ;;
|
||||||
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
||||||
143) echo "Terminated (SIGTERM)" ;;
|
143) echo "Terminated (SIGTERM)" ;;
|
||||||
|
144) echo "Killed by signal 16 (SIGUSR1 / SIGSTKFLT)" ;;
|
||||||
|
146) echo "Killed by signal 18 (SIGTSTP)" ;;
|
||||||
150) echo "Systemd: Service failed to start" ;;
|
150) echo "Systemd: Service failed to start" ;;
|
||||||
151) echo "Systemd: Service unit not found" ;;
|
151) echo "Systemd: Service unit not found" ;;
|
||||||
152) echo "Permission denied (EACCES)" ;;
|
152) echo "Permission denied (EACCES)" ;;
|
||||||
@@ -100,6 +155,7 @@ if ! declare -f explain_exit_code &>/dev/null; then
|
|||||||
224) echo "Proxmox: PBS storage is for backups only" ;;
|
224) echo "Proxmox: PBS storage is for backups only" ;;
|
||||||
225) echo "Proxmox: No template available for OS/Version" ;;
|
225) echo "Proxmox: No template available for OS/Version" ;;
|
||||||
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
||||||
|
239) echo "npm/Node.js: Unexpected runtime error or dependency failure" ;;
|
||||||
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
||||||
245) echo "Node.js: Invalid command-line option" ;;
|
245) echo "Node.js: Invalid command-line option" ;;
|
||||||
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
||||||
@@ -273,6 +329,8 @@ error_handler() {
|
|||||||
# - Cleans up lock files if lockfile variable is set
|
# - Cleans up lock files if lockfile variable is set
|
||||||
# - Exits with captured exit code
|
# - Exits with captured exit code
|
||||||
# - Always runs on script termination (success or failure)
|
# - Always runs on script termination (success or failure)
|
||||||
|
# - For signal exits (>128): sends telemetry FIRST before log collection
|
||||||
|
# to prevent pct pull hangs from blocking status updates
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_exit() {
|
on_exit() {
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
@@ -281,14 +339,24 @@ on_exit() {
|
|||||||
# post_to_api was called ("installing" sent) but post_update_to_api was never called
|
# post_to_api was called ("installing" sent) but post_update_to_api was never called
|
||||||
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
# Ensure log is accessible on host before reporting
|
if [[ $exit_code -gt 128 ]]; then
|
||||||
|
# Signal exit: send telemetry IMMEDIATELY (container may be dying, pct pull could hang)
|
||||||
|
post_update_to_api "failed" "$exit_code" 2>/dev/null || true
|
||||||
|
# Then try log collection (non-critical, best-effort)
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
ensure_log_on_host
|
ensure_log_on_host 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Normal exit: collect logs first for better error details
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if [[ $exit_code -ne 0 ]]; then
|
if [[ $exit_code -ne 0 ]]; then
|
||||||
post_update_to_api "failed" "$exit_code"
|
post_update_to_api "failed" "$exit_code"
|
||||||
else
|
else
|
||||||
post_update_to_api "failed" "1"
|
# exit_code=0 is never an error — report as success
|
||||||
|
post_update_to_api "done" "0"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -300,22 +368,26 @@ on_exit() {
|
|||||||
# on_interrupt()
|
# on_interrupt()
|
||||||
#
|
#
|
||||||
# - SIGINT (Ctrl+C) trap handler
|
# - SIGINT (Ctrl+C) trap handler
|
||||||
|
# - Reports to telemetry FIRST (time-critical: container may be dying)
|
||||||
# - Displays "Interrupted by user" message
|
# - Displays "Interrupted by user" message
|
||||||
# - Exits with code 130 (128 + SIGINT=2)
|
# - Exits with code 130 (128 + SIGINT=2)
|
||||||
|
# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_interrupt() {
|
on_interrupt() {
|
||||||
# Ensure log is accessible on host before reporting
|
# CRITICAL: Send telemetry FIRST before any cleanup or output
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
# If ensure_log_on_host hangs (e.g. pct pull on dying container),
|
||||||
ensure_log_on_host
|
# the status update would never be sent, leaving records stuck in "installing"
|
||||||
fi
|
|
||||||
# Report interruption to telemetry API (prevents stuck "installing" records)
|
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
post_update_to_api "failed" "130"
|
post_update_to_api "failed" "130" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
# Best-effort log collection (non-critical after telemetry is sent)
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if declare -f msg_error >/dev/null 2>&1; then
|
if declare -f msg_error >/dev/null 2>&1; then
|
||||||
msg_error "Interrupted by user (SIGINT)"
|
msg_error "Interrupted by user (SIGINT)" 2>/dev/null || true
|
||||||
else
|
else
|
||||||
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}"
|
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
exit 130
|
exit 130
|
||||||
}
|
}
|
||||||
@@ -324,23 +396,27 @@ on_interrupt() {
|
|||||||
# on_terminate()
|
# on_terminate()
|
||||||
#
|
#
|
||||||
# - SIGTERM trap handler
|
# - SIGTERM trap handler
|
||||||
|
# - Reports to telemetry FIRST (time-critical: process being killed)
|
||||||
# - Displays "Terminated by signal" message
|
# - Displays "Terminated by signal" message
|
||||||
# - Exits with code 143 (128 + SIGTERM=15)
|
# - Exits with code 143 (128 + SIGTERM=15)
|
||||||
# - Triggered by external process termination
|
# - Triggered by external process termination
|
||||||
|
# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_terminate() {
|
on_terminate() {
|
||||||
# Ensure log is accessible on host before reporting
|
# CRITICAL: Send telemetry FIRST before any cleanup or output
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
# Same rationale as on_interrupt: ensure status gets reported even if
|
||||||
ensure_log_on_host
|
# ensure_log_on_host hangs or terminal is already closed
|
||||||
fi
|
|
||||||
# Report termination to telemetry API (prevents stuck "installing" records)
|
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
post_update_to_api "failed" "143"
|
post_update_to_api "failed" "143" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
# Best-effort log collection (non-critical after telemetry is sent)
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if declare -f msg_error >/dev/null 2>&1; then
|
if declare -f msg_error >/dev/null 2>&1; then
|
||||||
msg_error "Terminated by signal (SIGTERM)"
|
msg_error "Terminated by signal (SIGTERM)" 2>/dev/null || true
|
||||||
else
|
else
|
||||||
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}"
|
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
exit 143
|
exit 143
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,35 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
load_functions
|
load_functions
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
# Persist diagnostics setting inside container (exported from build.func)
|
||||||
|
# so addon scripts running later can find the user's choice
|
||||||
|
if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
mkdir -p /usr/local/community-scripts
|
||||||
|
echo "DIAGNOSTICS=${DIAGNOSTICS:-no}" >/usr/local/community-scripts/diagnostics
|
||||||
|
fi
|
||||||
|
|
||||||
# Get LXC IP address (must be called INSIDE container, after network is up)
|
# Get LXC IP address (must be called INSIDE container, after network is up)
|
||||||
get_lxc_ip
|
get_lxc_ip
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# post_progress_to_api()
|
||||||
|
#
|
||||||
|
# - Lightweight progress ping from inside the container
|
||||||
|
# - Updates the existing telemetry record status from "installing" to "configuring"
|
||||||
|
# - Signals that the installation is actively progressing (not stuck)
|
||||||
|
# - Fire-and-forget: never blocks or fails the script
|
||||||
|
# - Only executes if DIAGNOSTICS=yes and RANDOM_UUID is set
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
post_progress_to_api() {
|
||||||
|
command -v curl &>/dev/null || return 0
|
||||||
|
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
||||||
|
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
||||||
|
|
||||||
|
curl -fsS -m 5 -X POST "https://telemetry.community-scripts.org/telemetry" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"random_id\":\"${RANDOM_UUID}\",\"execution_id\":\"${EXECUTION_ID:-${RANDOM_UUID}}\",\"type\":\"lxc\",\"nsapp\":\"${app:-unknown}\",\"status\":\"configuring\"}" &>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# SECTION 2: NETWORK & CONNECTIVITY
|
# SECTION 2: NETWORK & CONNECTIVITY
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -103,6 +129,7 @@ setting_up_container() {
|
|||||||
msg_ok "Set up Container OS"
|
msg_ok "Set up Container OS"
|
||||||
#msg_custom "${CM}" "${GN}" "Network Connected: ${BL}$(hostname -I)"
|
#msg_custom "${CM}" "${GN}" "Network Connected: ${BL}$(hostname -I)"
|
||||||
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -206,8 +233,18 @@ EOF
|
|||||||
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
|
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
|
||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||||
msg_ok "Updated Container OS"
|
msg_ok "Updated Container OS"
|
||||||
|
post_progress_to_api
|
||||||
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
local tools_content
|
||||||
|
tools_content=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) || {
|
||||||
|
msg_error "Failed to download tools.func"
|
||||||
|
exit 6
|
||||||
|
}
|
||||||
|
source /dev/stdin <<<"$tools_content"
|
||||||
|
if ! declare -f fetch_and_deploy_gh_release >/dev/null 2>&1; then
|
||||||
|
msg_error "tools.func loaded but incomplete — missing expected functions"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|||||||
@@ -529,9 +529,21 @@ cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
if [[ "$(dirs -p | wc -l)" -gt 1 ]]; then
|
if [[ "$(dirs -p | wc -l)" -gt 1 ]]; then
|
||||||
popd >/dev/null || true
|
popd >/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
# Report final telemetry status if post_to_api_vm was called but no update was sent
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
|
if [[ $exit_code -ne 0 ]]; then
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
else
|
||||||
|
# Exited cleanly but description()/success was never called — shouldn't happen
|
||||||
|
post_update_to_api "failed" "1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_root() {
|
check_root() {
|
||||||
|
|||||||
@@ -19,6 +19,11 @@ EOF
|
|||||||
}
|
}
|
||||||
header_info
|
header_info
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-netbird-lxc" "addon"
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn
|
read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn
|
||||||
case $yn in
|
case $yn in
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ function msg_info() { echo -e " \e[1;36m➤\e[0m $1"; }
|
|||||||
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
|
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
|
||||||
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
|
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-tailscale-lxc" "addon"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
if ! command -v pveversion &>/dev/null; then
|
if ! command -v pveversion &>/dev/null; then
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=8080
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
|
|||||||
@@ -42,6 +42,11 @@ function msg() {
|
|||||||
local TEXT="$1"
|
local TEXT="$1"
|
||||||
echo -e "$TEXT"
|
echo -e "$TEXT"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "all-templates" "addon"
|
||||||
|
|
||||||
function validate_container_id() {
|
function validate_container_id() {
|
||||||
local ctid="$1"
|
local ctid="$1"
|
||||||
# Check if ID is numeric
|
# Check if ID is numeric
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="Coder Code Server"
|
APP="Coder Code Server"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "coder-code-server" "addon"
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o errtrace
|
set -o errtrace
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="CrowdSec"
|
APP="CrowdSec"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "crowdsec" "addon"
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o errtrace
|
set -o errtrace
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ DEFAULT_PORT=8080
|
|||||||
SRC_DIR="/"
|
SRC_DIR="/"
|
||||||
TMP_BIN="/tmp/filebrowser.$$"
|
TMP_BIN="/tmp/filebrowser.$$"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-quantum" "addon"
|
||||||
|
|
||||||
# Get primary IP
|
# Get primary IP
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
||||||
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ INSTALL_PATH="/usr/local/bin/filebrowser"
|
|||||||
DB_PATH="/usr/local/community-scripts/filebrowser.db"
|
DB_PATH="/usr/local/community-scripts/filebrowser.db"
|
||||||
DEFAULT_PORT=8080
|
DEFAULT_PORT=8080
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon"
|
||||||
|
|
||||||
# Get first non-loopback IP & Detect primary network interface dynamically
|
# Get first non-loopback IP & Detect primary network interface dynamically
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
||||||
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; }
|
|||||||
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
|
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
|
||||||
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
|
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "glances" "addon"
|
||||||
|
|
||||||
get_lxc_ip() {
|
get_lxc_ip() {
|
||||||
if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
|
if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
|
||||||
hostname -I | awk '{print $1}'
|
hostname -I | awk '{print $1}'
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=3000
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
@@ -104,6 +106,10 @@ function update() {
|
|||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Built ${APP}"
|
msg_ok "Built ${APP}"
|
||||||
|
|
||||||
|
msg_info "Updating service"
|
||||||
|
create_service
|
||||||
|
msg_ok "Updated service"
|
||||||
|
|
||||||
msg_info "Starting service"
|
msg_info "Starting service"
|
||||||
systemctl start immich-proxy
|
systemctl start immich-proxy
|
||||||
msg_ok "Started service"
|
msg_ok "Started service"
|
||||||
@@ -112,6 +118,27 @@ function update() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function create_service() {
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
[Unit]
|
||||||
|
Description=Immich Public Proxy
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=${INSTALL_PATH}/app
|
||||||
|
EnvironmentFile=${CONFIG_PATH}/.env
|
||||||
|
ExecStart=/usr/bin/node ${INSTALL_PATH}/app/dist/index.js
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# INSTALL
|
# INSTALL
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -173,23 +200,7 @@ EOF
|
|||||||
msg_ok "Created configuration"
|
msg_ok "Created configuration"
|
||||||
|
|
||||||
msg_info "Creating service"
|
msg_info "Creating service"
|
||||||
cat <<EOF >"$SERVICE_PATH"
|
create_service
|
||||||
[Unit]
|
|
||||||
Description=Immich Public Proxy
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=${INSTALL_PATH}
|
|
||||||
EnvironmentFile=${CONFIG_PATH}/.env
|
|
||||||
ExecStart=/usr/bin/node ${INSTALL_PATH}/app/server.js
|
|
||||||
Restart=always
|
|
||||||
RestartSec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now immich-proxy
|
systemctl enable -q --now immich-proxy
|
||||||
msg_ok "Created and started service"
|
msg_ok "Created and started service"
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=3000
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
|
|||||||
@@ -26,6 +26,11 @@ BFR="\\r\\033[K"
|
|||||||
HOLD="-"
|
HOLD="-"
|
||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
silent() { "$@" >/dev/null 2>&1; }
|
silent() { "$@" >/dev/null 2>&1; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "netdata" "addon"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="OliveTin"
|
APP="OliveTin"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "addon"
|
||||||
|
|
||||||
set-e
|
set-e
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ APP="phpMyAdmin"
|
|||||||
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
|
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
|
||||||
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
|
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "phpmyadmin" "addon"
|
||||||
|
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
||||||
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}')
|
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}')
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -8,11 +8,13 @@
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ function msg_error() {
|
|||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pyenv" "addon"
|
||||||
|
|
||||||
if command -v pveversion >/dev/null 2>&1; then
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
msg_error "Can't Install on Proxmox "
|
msg_error "Can't Install on Proxmox "
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ msg_ok() {
|
|||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "webmin" "addon"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ HOLD=" "
|
|||||||
CM="${GN}✓${CL} "
|
CM="${GN}✓${CL} "
|
||||||
CROSS="${RD}✗${CL} "
|
CROSS="${RD}✗${CL} "
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-iptag" "pve"
|
||||||
|
|
||||||
# Stop any running spinner
|
# Stop any running spinner
|
||||||
stop_spinner() {
|
stop_spinner() {
|
||||||
if [ -n "$SPINNER_PID" ] && kill -0 "$SPINNER_PID" 2>/dev/null; then
|
if [ -n "$SPINNER_PID" ] && kill -0 "$SPINNER_PID" 2>/dev/null; then
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ CM='\xE2\x9C\x94\033'
|
|||||||
GN="\033[1;92m"
|
GN="\033[1;92m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ function header_info {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-orphaned-lvm" "pve"
|
||||||
|
|
||||||
# Function to check for orphaned LVM volumes
|
# Function to check for orphaned LVM volumes
|
||||||
function find_orphaned_lvm {
|
function find_orphaned_lvm {
|
||||||
echo -e "\n🔍 Scanning for orphaned LVM volumes...\n"
|
echo -e "\n🔍 Scanning for orphaned LVM volumes...\n"
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ EOF
|
|||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "container-restore" "pve"
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..."
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ EOF
|
|||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "core-restore" "pve"
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..."
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ RD=$(echo "\033[01;31m")
|
|||||||
CM='\xE2\x9C\x94\033'
|
CM='\xE2\x9C\x94\033'
|
||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "execute-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Execute" --yesno "This will execute a command inside selected LXC Containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Execute" --yesno "This will execute a command inside selected LXC Containers. Proceed?" 10 58
|
||||||
@@ -40,7 +45,6 @@ if [ $? -ne 0 ]; then
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
read -r -p "Enter here command for inside the containers: " custom_command
|
read -r -p "Enter here command for inside the containers: " custom_command
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
@@ -50,8 +54,7 @@ function execute_in() {
|
|||||||
container=$1
|
container=$1
|
||||||
name=$(pct exec "$container" hostname)
|
name=$(pct exec "$container" hostname)
|
||||||
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
||||||
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"
|
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"; then
|
||||||
then
|
|
||||||
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
|
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
|
||||||
else
|
else
|
||||||
pct exec "$container" -- bash -c "${custom_command}" | tee
|
pct exec "$container" -- bash -c "${custom_command}" | tee
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ function header_info {
|
|||||||
/___/ /_/ /_/
|
/___/ /_/ /_/
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "frigate-support" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
while true; do
|
while true; do
|
||||||
read -p "This will Prepare a LXC Container for Frigate. Proceed (y/n)?" yn
|
read -p "This will Prepare a LXC Container for Frigate. Proceed (y/n)?" yn
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ RD="\033[01;31m"
|
|||||||
GN="\033[1;92m"
|
GN="\033[1;92m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "fstrim" "pve"
|
||||||
|
|
||||||
LOGFILE="/var/log/fstrim.log"
|
LOGFILE="/var/log/fstrim.log"
|
||||||
touch "$LOGFILE"
|
touch "$LOGFILE"
|
||||||
chmod 600 "$LOGFILE"
|
chmod 600 "$LOGFILE"
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ function header_info {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "host-backup" "pve"
|
||||||
|
|
||||||
# Function to perform backup
|
# Function to perform backup
|
||||||
function perform_backup {
|
function perform_backup {
|
||||||
local BACKUP_PATH
|
local BACKUP_PATH
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ BFR="\\r\\033[K"
|
|||||||
HOLD="-"
|
HOLD="-"
|
||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "hw-acceleration" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ GN="\033[1;92m"
|
|||||||
RD="\033[01;31m"
|
RD="\033[01;31m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-clean" "pve"
|
||||||
|
|
||||||
# Detect current kernel
|
# Detect current kernel
|
||||||
current_kernel=$(uname -r)
|
current_kernel=$(uname -r)
|
||||||
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | grep -v "$current_kernel" | sort -V)
|
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | grep -v "$current_kernel" | sort -V)
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
current_kernel=$(uname -r)
|
current_kernel=$(uname -r)
|
||||||
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}')
|
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}')
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-pin" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ CL=$(echo "\033[m")
|
|||||||
TAB=" "
|
TAB=" "
|
||||||
CM="${TAB}✔️${TAB}${CL}"
|
CM="${TAB}✔️${TAB}${CL}"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "lxc-delete" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "microcode" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
current_microcode=$(journalctl -k | grep -i 'microcode: Current revision:' | grep -oP 'Current revision: \K0x[0-9a-f]+')
|
current_microcode=$(journalctl -k | grep -i 'microcode: Current revision:' | grep -oP 'Current revision: \K0x[0-9a-f]+')
|
||||||
[ -z "$current_microcode" ] && current_microcode="Not found."
|
[ -z "$current_microcode" ] && current_microcode="Not found."
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ cat <<"EOF"
|
|||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "monitor-all" "pve"
|
||||||
|
|
||||||
add() {
|
add() {
|
||||||
echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
|
echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
|
||||||
echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
|
echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
|
||||||
@@ -175,5 +179,8 @@ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All f
|
|||||||
case $CHOICE in
|
case $CHOICE in
|
||||||
"Add") add ;;
|
"Add") add ;;
|
||||||
"Remove") remove ;;
|
"Remove") remove ;;
|
||||||
*) echo "Exiting..."; exit 0 ;;
|
*)
|
||||||
|
echo "Exiting..."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ Enhanced version supporting both e1000e and e1000 drivers
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nic-offloading-fix" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
|
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
|
||||||
@@ -49,7 +53,10 @@ fi
|
|||||||
if ! command -v ethtool >/dev/null 2>&1; then
|
if ! command -v ethtool >/dev/null 2>&1; then
|
||||||
msg_info "Installing ethtool"
|
msg_info "Installing ethtool"
|
||||||
apt-get update &>/dev/null
|
apt-get update &>/dev/null
|
||||||
apt-get install -y ethtool &>/dev/null || { msg_error "Failed to install ethtool. Exiting."; exit 1; }
|
apt-get install -y ethtool &>/dev/null || {
|
||||||
|
msg_error "Failed to install ethtool. Exiting."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
msg_ok "ethtool installed successfully"
|
msg_ok "ethtool installed successfully"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -172,16 +179,20 @@ EOF
|
|||||||
|
|
||||||
# Configure this service
|
# Configure this service
|
||||||
{
|
{
|
||||||
echo "25"; sleep 0.2
|
echo "25"
|
||||||
|
sleep 0.2
|
||||||
# Reload systemd to recognize the new service
|
# Reload systemd to recognize the new service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
echo "50"; sleep 0.2
|
echo "50"
|
||||||
|
sleep 0.2
|
||||||
# Start the service
|
# Start the service
|
||||||
systemctl start "$SERVICE_NAME"
|
systemctl start "$SERVICE_NAME"
|
||||||
echo "75"; sleep 0.2
|
echo "75"
|
||||||
|
sleep 0.2
|
||||||
# Enable the service to start on boot
|
# Enable the service to start on boot
|
||||||
systemctl enable "$SERVICE_NAME"
|
systemctl enable "$SERVICE_NAME"
|
||||||
echo "100"; sleep 0.2
|
echo "100"
|
||||||
|
sleep 0.2
|
||||||
} | whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
|
} | whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
|
||||||
|
|
||||||
# Individual service status
|
# Individual service status
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs3-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 2 BACKUP" --menu "\nMake a backup of /etc/proxmox-backup to ensure that in the worst case, any relevant configuration can be recovered?" 14 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 2 BACKUP" --menu "\nMake a backup of /etc/proxmox-backup to ensure that in the worst case, any relevant configuration can be recovered?" 14 58 2 \
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs4-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 3 BACKUP" --menu \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 3 BACKUP" --menu \
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ CM="${GN}✓${CL}"
|
|||||||
CROSS="${RD}✗${CL}"
|
CROSS="${RD}✗${CL}"
|
||||||
|
|
||||||
msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs-microcode" "pve"
|
||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pbs-install" "pve"
|
||||||
|
|
||||||
# ---- helpers ----
|
# ---- helpers ----
|
||||||
get_pbs_codename() {
|
get_pbs_codename() {
|
||||||
awk -F'=' '/^VERSION_CODENAME=/{print $2}' /etc/os-release
|
awk -F'=' '/^VERSION_CODENAME=/{print $2}' /etc/os-release
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pmg-install" "pve"
|
||||||
|
|
||||||
if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then
|
if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then
|
||||||
msg_error "This script is only intended for Proxmox Mail Gateway"
|
msg_error "This script is only intended for Proxmox Mail Gateway"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pve-install" "pve"
|
||||||
|
|
||||||
get_pve_version() {
|
get_pve_version() {
|
||||||
local pve_ver
|
local pve_ver
|
||||||
pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ if ! command -v curl >/dev/null 2>&1; then
|
|||||||
apt-get install -y curl >/dev/null 2>&1
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func)
|
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
load_functions
|
load_functions
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "pve"
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
shopt -s inherit_errexit nullglob
|
shopt -s inherit_errexit nullglob
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve8-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,11 @@
|
|||||||
# License: MIT
|
# License: MIT
|
||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "scaling-governor" "pve"
|
||||||
|
|
||||||
header_info() {
|
header_info() {
|
||||||
clear
|
clear
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-apps" "pve"
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# CONFIGURATION VARIABLES
|
# CONFIGURATION VARIABLES
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ RD=$(echo "\033[01;31m")
|
|||||||
CM='\xE2\x9C\x94\033'
|
CM='\xE2\x9C\x94\033'
|
||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ RD=$(echo "\033[01;31m")
|
|||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-repo" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
NODE=$(hostname)
|
NODE=$(hostname)
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,8 +104,16 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
# Only send telemetry if post_to_api_vm was called (installing status was sent)
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,8 +101,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,8 +79,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,8 +101,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,8 +109,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,8 +99,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user