mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-04 12:23:26 +01:00
Compare commits
8 Commits
CrazyWolf1
...
add-script
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63c763f411 | ||
|
|
c0ae7c3aa1 | ||
|
|
c5d132202f | ||
|
|
91434e0164 | ||
|
|
a567af9ec6 | ||
|
|
c53316d122 | ||
|
|
5f9a2184bf | ||
|
|
175a573657 |
@@ -391,15 +391,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-01-31
|
||||
|
||||
## 2026-01-30
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- languagetool ([#11370](https://github.com/community-scripts/ProxmoxVE/pull/11370))
|
||||
- Ampache ([#11369](https://github.com/community-scripts/ProxmoxVE/pull/11369))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🔧 Refactor
|
||||
@@ -415,7 +408,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [tools] Add `fetch_and_deploy_from_url()` [@tremor021](https://github.com/tremor021) ([#11376](https://github.com/community-scripts/ProxmoxVE/pull/11376))
|
||||
- core: php - improve module handling and prevent installation failures [@MickLesk](https://github.com/MickLesk) ([#11358](https://github.com/community-scripts/ProxmoxVE/pull/11358))
|
||||
|
||||
## 2026-01-29
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
___ __
|
||||
___ __
|
||||
/ | ____ ___ ____ ____ ______/ /_ ___
|
||||
/ /| | / __ `__ \/ __ \/ __ `/ ___/ __ \/ _ \
|
||||
/ ___ |/ / / / / / /_/ / /_/ / /__/ / / / __/
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
__ ______ __
|
||||
/ / ____ _____ ____ ___ ______ _____ ____/_ __/___ ____ / /
|
||||
/ / / __ `/ __ \/ __ `/ / / / __ `/ __ `/ _ \/ / / __ \/ __ \/ /
|
||||
/ /___/ /_/ / / / / /_/ / /_/ / /_/ / /_/ / __/ / / /_/ / /_/ / /
|
||||
/_____/\__,_/_/ /_/\__, /\__,_/\__,_/\__, /\___/_/ \____/\____/_/
|
||||
/____/ /____/
|
||||
@@ -1,68 +0,0 @@
|
||||
#!/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: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://languagetool.org/
|
||||
|
||||
APP="LanguageTool"
|
||||
var_tags="${var_tags:-spellcheck}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-16}"
|
||||
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 [[ ! -d /opt/LanguageTool ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://languagetool.org/download/ | grep -oP 'LanguageTool-\K[0-9]+\.[0-9]+(\.[0-9]+)?(?=\.zip)' | sort -V | tail -n1)
|
||||
if [[ "${RELEASE}" != "$(cat ~/.languagetool 2>/dev/null)" ]] || [[ ! -f ~/.languagetool ]]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop language-tool
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
cp /opt/LanguageTool/server.properties /opt/server.properties
|
||||
msg_ok "Created Backup"
|
||||
|
||||
msg_info "Updating LanguageTool"
|
||||
rm -rf /opt/LanguageTool
|
||||
download_file "https://languagetool.org/download/LanguageTool-stable.zip" /tmp/LanguageTool-stable.zip
|
||||
unzip -q /tmp/LanguageTool-stable.zip -d /opt
|
||||
mv /opt/LanguageTool-*/ /opt/LanguageTool/
|
||||
mv /opt/server.properties /opt/LanguageTool/server.properties
|
||||
rm -f /tmp/LanguageTool-stable.zip
|
||||
echo "${RELEASE}" >~/.languagetool
|
||||
msg_ok "Updated LanguageTool"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start language-tool
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfuly!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!"
|
||||
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}:8081/v2${CL}"
|
||||
@@ -29,8 +29,6 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
ensure_dependencies git
|
||||
|
||||
if check_for_gh_release "yubal" "guillevc/yubal"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop yubal
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-01-31T18:07:59Z",
|
||||
"generated": "2026-01-30T12:10:39Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -29,13 +29,6 @@
|
||||
"pinned": false,
|
||||
"date": "2025-03-20T03:06:11Z"
|
||||
},
|
||||
{
|
||||
"slug": "ampache",
|
||||
"repo": "ampache/ampache",
|
||||
"version": "7.8.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-22T04:23:45Z"
|
||||
},
|
||||
{
|
||||
"slug": "argus",
|
||||
"repo": "release-argus/Argus",
|
||||
@@ -60,9 +53,9 @@
|
||||
{
|
||||
"slug": "autobrr",
|
||||
"repo": "autobrr/autobrr",
|
||||
"version": "v1.72.1",
|
||||
"version": "v1.72.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T12:57:58Z"
|
||||
"date": "2026-01-27T20:53:54Z"
|
||||
},
|
||||
{
|
||||
"slug": "autocaliweb",
|
||||
@@ -109,9 +102,9 @@
|
||||
{
|
||||
"slug": "bentopdf",
|
||||
"repo": "alam00000/bentopdf",
|
||||
"version": "v2.0.0",
|
||||
"version": "v1.16.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T10:13:47Z"
|
||||
"date": "2026-01-26T08:27:11Z"
|
||||
},
|
||||
{
|
||||
"slug": "beszel",
|
||||
@@ -242,9 +235,9 @@
|
||||
{
|
||||
"slug": "discopanel",
|
||||
"repo": "nickheyer/discopanel",
|
||||
"version": "v1.0.31",
|
||||
"version": "v1.0.30",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T18:30:38Z"
|
||||
"date": "2026-01-30T10:14:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "dispatcharr",
|
||||
@@ -375,9 +368,9 @@
|
||||
{
|
||||
"slug": "ghostfolio",
|
||||
"repo": "ghostfolio/ghostfolio",
|
||||
"version": "2.234.0",
|
||||
"version": "2.233.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T19:00:22Z"
|
||||
"date": "2026-01-23T18:41:45Z"
|
||||
},
|
||||
{
|
||||
"slug": "gitea",
|
||||
@@ -480,16 +473,16 @@
|
||||
{
|
||||
"slug": "homarr",
|
||||
"repo": "homarr-labs/homarr",
|
||||
"version": "v1.52.0",
|
||||
"version": "v1.51.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T19:41:22Z"
|
||||
"date": "2026-01-23T19:29:49Z"
|
||||
},
|
||||
{
|
||||
"slug": "homebox",
|
||||
"repo": "sysadminsmedia/homebox",
|
||||
"version": "v0.23.0",
|
||||
"version": "v0.22.3",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T17:41:01Z"
|
||||
"date": "2025-12-26T22:31:20Z"
|
||||
},
|
||||
{
|
||||
"slug": "homepage",
|
||||
@@ -515,9 +508,9 @@
|
||||
{
|
||||
"slug": "huntarr",
|
||||
"repo": "plexguide/Huntarr.io",
|
||||
"version": "9.1.3",
|
||||
"version": "9.1.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T21:38:18Z"
|
||||
"date": "2026-01-30T09:22:10Z"
|
||||
},
|
||||
{
|
||||
"slug": "immich",
|
||||
@@ -543,16 +536,16 @@
|
||||
{
|
||||
"slug": "invoiceninja",
|
||||
"repo": "invoiceninja/invoiceninja",
|
||||
"version": "v5.12.51",
|
||||
"version": "v5.12.50",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T03:58:30Z"
|
||||
"date": "2026-01-26T05:28:47Z"
|
||||
},
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.993",
|
||||
"version": "v0.24.988",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T05:55:28Z"
|
||||
"date": "2026-01-30T05:55:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "joplin-server",
|
||||
@@ -760,9 +753,9 @@
|
||||
{
|
||||
"slug": "mediamtx",
|
||||
"repo": "bluenviron/mediamtx",
|
||||
"version": "v1.16.0",
|
||||
"version": "v1.15.6",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T15:38:51Z"
|
||||
"date": "2025-12-28T16:38:35Z"
|
||||
},
|
||||
{
|
||||
"slug": "meilisearch",
|
||||
@@ -774,9 +767,9 @@
|
||||
{
|
||||
"slug": "memos",
|
||||
"repo": "usememos/memos",
|
||||
"version": "v0.26.0",
|
||||
"version": "v0.25.3",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T15:28:09Z"
|
||||
"date": "2025-11-25T15:40:41Z"
|
||||
},
|
||||
{
|
||||
"slug": "metube",
|
||||
@@ -949,9 +942,9 @@
|
||||
{
|
||||
"slug": "paperless-ngx",
|
||||
"repo": "paperless-ngx/paperless-ngx",
|
||||
"version": "v2.20.6",
|
||||
"version": "v2.20.5",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T07:30:27Z"
|
||||
"date": "2026-01-21T00:12:33Z"
|
||||
},
|
||||
{
|
||||
"slug": "patchmon",
|
||||
@@ -1138,9 +1131,9 @@
|
||||
{
|
||||
"slug": "rclone",
|
||||
"repo": "rclone/rclone",
|
||||
"version": "v1.73.0",
|
||||
"version": "v1.72.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T22:12:03Z"
|
||||
"date": "2025-12-10T14:55:44Z"
|
||||
},
|
||||
{
|
||||
"slug": "rdtclient",
|
||||
@@ -1243,9 +1236,9 @@
|
||||
{
|
||||
"slug": "snowshare",
|
||||
"repo": "TuroYT/snowshare",
|
||||
"version": "v1.2.12",
|
||||
"version": "v1.2.11",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T13:35:56Z"
|
||||
"date": "2026-01-22T13:26:11Z"
|
||||
},
|
||||
{
|
||||
"slug": "sonarr",
|
||||
@@ -1397,9 +1390,9 @@
|
||||
{
|
||||
"slug": "trip",
|
||||
"repo": "itskovacs/TRIP",
|
||||
"version": "1.38.0",
|
||||
"version": "1.37.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T15:56:30Z"
|
||||
"date": "2026-01-28T22:19:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "tududi",
|
||||
@@ -1411,9 +1404,9 @@
|
||||
{
|
||||
"slug": "tunarr",
|
||||
"repo": "chrisbenincasa/tunarr",
|
||||
"version": "v1.1.11",
|
||||
"version": "v1.1.10",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T22:34:30Z"
|
||||
"date": "2026-01-30T02:10:02Z"
|
||||
},
|
||||
{
|
||||
"slug": "uhf",
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"name": "LanguageTool",
|
||||
"slug": "languagetool",
|
||||
"categories": [
|
||||
0
|
||||
],
|
||||
"date_created": "2026-01-30",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8081,
|
||||
"documentation": "https://dev.languagetool.org/",
|
||||
"config_path": "/opt/LanguageTool/server.properties",
|
||||
"website": "https://languagetool.org/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/languagetool.webp",
|
||||
"description": "LanguageTool is an Open Source proofreading software for English, Spanish, French, German, Portuguese, Polish, Dutch, and more than 20 other languages. It finds many errors that a simple spell checker cannot detect.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/languagetool.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 4096,
|
||||
"hdd": 16,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "API is available at `http://<LXC_IP>:8081/v2`.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://languagetool.org/
|
||||
|
||||
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 fasttext
|
||||
msg_ok "Installed dependencies"
|
||||
|
||||
JAVA_VERSION="21" setup_java
|
||||
|
||||
msg_info "Setting up LanguageTool"
|
||||
RELEASE=$(curl -fsSL https://languagetool.org/download/ | grep -oP 'LanguageTool-\K[0-9]+\.[0-9]+(\.[0-9]+)?(?=\.zip)' | sort -V | tail -n1)
|
||||
download_file "https://languagetool.org/download/LanguageTool-stable.zip" /tmp/LanguageTool-stable.zip
|
||||
unzip -q /tmp/LanguageTool-stable.zip -d /opt
|
||||
mv /opt/LanguageTool-*/ /opt/LanguageTool/
|
||||
download_file "https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin" /opt/lid.176.bin
|
||||
rm -f /tmp/LanguageTool-stable.zip
|
||||
msg_ok "Setup LanguageTool"
|
||||
|
||||
ngram_dir=""
|
||||
lang_code=""
|
||||
max_attempts=3
|
||||
attempt=0
|
||||
|
||||
while [[ $attempt -lt $max_attempts ]]; do
|
||||
read -r -p "${TAB3}Enter language code (en, de, es, fr, nl) to download ngrams or press ENTER to skip: " lang_code
|
||||
|
||||
if [[ -z "$lang_code" ]]; then
|
||||
break
|
||||
fi
|
||||
|
||||
if [[ "$lang_code" =~ [[:space:]] ]]; then
|
||||
((attempt++))
|
||||
remaining=$((max_attempts - attempt))
|
||||
if [[ $remaining -gt 0 ]]; then
|
||||
msg_error "Please enter only ONE language code. You have $remaining attempt(s) remaining."
|
||||
else
|
||||
msg_error "Maximum attempts reached. Continuing without ngrams."
|
||||
lang_code=""
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
break
|
||||
done
|
||||
|
||||
if [[ -n "$lang_code" ]]; then
|
||||
if [[ "$lang_code" =~ ^(en|de|es|fr|nl)$ ]]; then
|
||||
msg_info "Searching for $lang_code ngrams..."
|
||||
filename=$(curl -fsSL https://languagetool.org/download/ngram-data/ | grep -oP "ngrams-${lang_code}-[0-9]+\.zip" | sort -uV | tail -n1)
|
||||
|
||||
if [[ -n "$filename" ]]; then
|
||||
msg_info "Downloading $filename"
|
||||
download_file "https://languagetool.org/download/ngram-data/${filename}" "/tmp/${filename}"
|
||||
|
||||
mkdir -p /opt/ngrams
|
||||
msg_info "Extracting $lang_code ngrams to /opt/ngrams"
|
||||
unzip -q "/tmp/${filename}" -d /opt/ngrams
|
||||
rm "/tmp/${filename}"
|
||||
|
||||
ngram_dir="/opt/ngrams"
|
||||
msg_ok "Installed $lang_code ngrams"
|
||||
else
|
||||
msg_info "No ngram file found for ${lang_code}"
|
||||
fi
|
||||
else
|
||||
msg_error "Invalid language code: $lang_code"
|
||||
fi
|
||||
fi
|
||||
|
||||
cat <<EOF >/opt/LanguageTool/server.properties
|
||||
fasttextModel=/opt/lid.176.bin
|
||||
fasttextBinary=/usr/bin/fasttext
|
||||
EOF
|
||||
if [[ -n "$ngram_dir" ]]; then
|
||||
echo "languageModel=/opt/ngrams" >> /opt/LanguageTool/server.properties
|
||||
fi
|
||||
echo "${RELEASE}" >~/.languagetool
|
||||
msg_ok "Setup LanguageTool"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<'EOF' >/etc/systemd/system/language-tool.service
|
||||
[Unit]
|
||||
Description=LanguageTool Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/LanguageTool
|
||||
ExecStart=java -cp languagetool-server.jar org.languagetool.server.HTTPServer --config server.properties --public --allow-origin "*"
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now language-tool
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -19,8 +19,7 @@ $STD apt install -y \
|
||||
libssl-dev \
|
||||
libffi-dev \
|
||||
python3-dev \
|
||||
ffmpeg \
|
||||
git
|
||||
ffmpeg
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing Bun"
|
||||
|
||||
135
misc/tools.func
135
misc/tools.func
@@ -6246,138 +6246,3 @@ EOF
|
||||
|
||||
msg_ok "Docker setup completed"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Fetch and deploy from URL
|
||||
# Downloads an archive (zip, tar.gz, or .deb) from a URL and extracts/installs it
|
||||
#
|
||||
# Usage: fetch_and_deploy_from_url "url" "directory"
|
||||
# url - URL to the archive (zip, tar.gz, or .deb)
|
||||
# directory - Destination path where the archive will be extracted
|
||||
# (not used for .deb packages)
|
||||
#
|
||||
# Examples:
|
||||
# fetch_and_deploy_from_url "https://example.com/app.tar.gz" "/opt/myapp"
|
||||
# fetch_and_deploy_from_url "https://example.com/app.zip" "/opt/myapp"
|
||||
# fetch_and_deploy_from_url "https://example.com/package.deb" ""
|
||||
# ------------------------------------------------------------------------------
|
||||
function fetch_and_deploy_from_url() {
|
||||
local url="$1"
|
||||
local directory="$2"
|
||||
|
||||
if [[ -z "$url" ]]; then
|
||||
msg_error "URL parameter is required"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local filename="${url##*/}"
|
||||
|
||||
local archive_type="zip"
|
||||
if [[ "$filename" == *.tar.gz || "$filename" == *.tgz ]]; then
|
||||
archive_type="tar"
|
||||
elif [[ "$filename" == *.deb ]]; then
|
||||
archive_type="deb"
|
||||
fi
|
||||
|
||||
msg_info "Downloading from $url"
|
||||
|
||||
local tmpdir
|
||||
tmpdir=$(mktemp -d) || {
|
||||
msg_error "Failed to create temporary directory"
|
||||
return 1
|
||||
}
|
||||
|
||||
curl -fsSL -o "$tmpdir/$filename" "$url" || {
|
||||
msg_error "Download failed: $url"
|
||||
rm -rf "$tmpdir"
|
||||
return 1
|
||||
}
|
||||
|
||||
if [[ "$archive_type" == "deb" ]]; then
|
||||
msg_info "Installing .deb package"
|
||||
|
||||
chmod 644 "$tmpdir/$filename"
|
||||
$STD apt install -y "$tmpdir/$filename" || {
|
||||
$STD dpkg -i "$tmpdir/$filename" || {
|
||||
msg_error "Both apt and dpkg installation failed"
|
||||
rm -rf "$tmpdir"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
rm -rf "$tmpdir"
|
||||
msg_ok "Successfully installed .deb package"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -z "$directory" ]]; then
|
||||
msg_error "Directory parameter is required for archive extraction"
|
||||
rm -rf "$tmpdir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
msg_info "Extracting archive to $directory"
|
||||
|
||||
mkdir -p "$directory"
|
||||
|
||||
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
|
||||
rm -rf "${directory:?}/"*
|
||||
fi
|
||||
|
||||
local unpack_tmp
|
||||
unpack_tmp=$(mktemp -d)
|
||||
|
||||
if [[ "$archive_type" == "zip" ]]; then
|
||||
ensure_dependencies unzip
|
||||
unzip -q "$tmpdir/$filename" -d "$unpack_tmp" || {
|
||||
msg_error "Failed to extract ZIP archive"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
elif [[ "$archive_type" == "tar" ]]; then
|
||||
tar --no-same-owner -xf "$tmpdir/$filename" -C "$unpack_tmp" || {
|
||||
msg_error "Failed to extract TAR archive"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
local top_entries
|
||||
top_entries=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1)
|
||||
|
||||
if [[ "$(echo "$top_entries" | wc -l)" -eq 1 && -d "$top_entries" ]]; then
|
||||
local inner_dir="$top_entries"
|
||||
shopt -s dotglob nullglob
|
||||
if compgen -G "$inner_dir/*" >/dev/null; then
|
||||
cp -r "$inner_dir"/* "$directory/" || {
|
||||
msg_error "Failed to copy contents from $inner_dir to $directory"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
else
|
||||
msg_error "Inner directory is empty: $inner_dir"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
fi
|
||||
shopt -u dotglob nullglob
|
||||
else
|
||||
shopt -s dotglob nullglob
|
||||
if compgen -G "$unpack_tmp/*" >/dev/null; then
|
||||
cp -r "$unpack_tmp"/* "$directory/" || {
|
||||
msg_error "Failed to copy contents to $directory"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
else
|
||||
msg_error "Unpacked archive is empty"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
fi
|
||||
shopt -u dotglob nullglob
|
||||
fi
|
||||
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
msg_ok "Successfully deployed archive to $directory"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user