mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-20 00:43:00 +01:00
Compare commits
4 Commits
termix_add
...
MickLesk-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95b96d3253 | ||
|
|
c5731160bc | ||
|
|
265fc917e9 | ||
|
|
4aa83fd98e |
@@ -423,6 +423,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-03-17
|
||||||
|
|
||||||
## 2026-03-16
|
## 2026-03-16
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
87
ct/termix.sh
87
ct/termix.sh
@@ -29,87 +29,10 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_tag "guacd" "apache/guacamole-server"; then
|
|
||||||
msg_info "Stopping guacd"
|
|
||||||
systemctl stop guacd 2>/dev/null || true
|
|
||||||
msg_ok "Stopped guacd"
|
|
||||||
|
|
||||||
ensure_dependencies \
|
|
||||||
libcairo2-dev \
|
|
||||||
libjpeg62-turbo-dev \
|
|
||||||
libpng-dev \
|
|
||||||
libtool-bin \
|
|
||||||
uuid-dev \
|
|
||||||
libvncserver-dev \
|
|
||||||
freerdp3-dev \
|
|
||||||
libssh2-1-dev \
|
|
||||||
libtelnet-dev \
|
|
||||||
libwebsockets-dev \
|
|
||||||
libpulse-dev \
|
|
||||||
libvorbis-dev \
|
|
||||||
libwebp-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libpango1.0-dev \
|
|
||||||
libswscale-dev \
|
|
||||||
libavcodec-dev \
|
|
||||||
libavutil-dev \
|
|
||||||
libavformat-dev
|
|
||||||
|
|
||||||
msg_info "Updating Guacamole Server (guacd)"
|
|
||||||
fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "${CHECK_UPDATE_RELEASE}" "/opt/guacamole-server"
|
|
||||||
cd /opt/guacamole-server
|
|
||||||
export CPPFLAGS="-Wno-error=deprecated-declarations"
|
|
||||||
$STD autoreconf -fi
|
|
||||||
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
|
|
||||||
$STD make
|
|
||||||
$STD make install
|
|
||||||
$STD ldconfig
|
|
||||||
cd /opt
|
|
||||||
rm -rf /opt/guacamole-server
|
|
||||||
msg_ok "Updated Guacamole Server (guacd) to ${CHECK_UPDATE_RELEASE}"
|
|
||||||
|
|
||||||
if [[ ! -f /etc/guacamole/guacd.conf ]]; then
|
|
||||||
mkdir -p /etc/guacamole
|
|
||||||
cat <<EOF >/etc/guacamole/guacd.conf
|
|
||||||
[server]
|
|
||||||
bind_host = 127.0.0.1
|
|
||||||
bind_port = 4822
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -f /etc/systemd/system/guacd.service ]]; then
|
|
||||||
cat <<EOF >/etc/systemd/system/guacd.service
|
|
||||||
[Unit]
|
|
||||||
Description=Guacamole Proxy Daemon (guacd)
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=forking
|
|
||||||
ExecStart=/etc/init.d/guacd start
|
|
||||||
ExecStop=/etc/init.d/guacd stop
|
|
||||||
ExecReload=/etc/init.d/guacd restart
|
|
||||||
PIDFile=/var/run/guacd.pid
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep -q "guacd.service" /etc/systemd/system/termix.service 2>/dev/null; then
|
|
||||||
sed -i '/^After=network.target/s/$/ guacd.service/' /etc/systemd/system/termix.service
|
|
||||||
sed -i '/^\[Unit\]/a Wants=guacd.service' /etc/systemd/system/termix.service
|
|
||||||
fi
|
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable -q --now guacd
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
|
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
|
||||||
msg_info "Stopping Termix"
|
msg_info "Stopping Service"
|
||||||
systemctl stop termix
|
systemctl stop termix
|
||||||
msg_ok "Stopped Termix"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
msg_info "Backing up Data"
|
||||||
cp -r /opt/termix/data /opt/termix_data_backup
|
cp -r /opt/termix/data /opt/termix_data_backup
|
||||||
@@ -172,16 +95,16 @@ EOF
|
|||||||
sed -i 's|/app/html|/opt/termix/html|g' /etc/nginx/nginx.conf
|
sed -i 's|/app/html|/opt/termix/html|g' /etc/nginx/nginx.conf
|
||||||
sed -i 's|/app/nginx|/opt/termix/nginx|g' /etc/nginx/nginx.conf
|
sed -i 's|/app/nginx|/opt/termix/nginx|g' /etc/nginx/nginx.conf
|
||||||
sed -i 's|listen ${PORT};|listen 80;|g' /etc/nginx/nginx.conf
|
sed -i 's|listen ${PORT};|listen 80;|g' /etc/nginx/nginx.conf
|
||||||
|
|
||||||
nginx -t && systemctl reload nginx
|
nginx -t && systemctl reload nginx
|
||||||
msg_ok "Updated Nginx Configuration"
|
msg_ok "Updated Nginx Configuration"
|
||||||
else
|
else
|
||||||
msg_warn "Nginx configuration not updated. If Termix doesn't work, restore from backup or update manually."
|
msg_warn "Nginx configuration not updated. If Termix doesn't work, restore from backup or update manually."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Starting Termix"
|
msg_info "Starting Service"
|
||||||
systemctl start termix
|
systemctl start termix
|
||||||
msg_ok "Started Termix"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -19,41 +19,9 @@ $STD apt install -y \
|
|||||||
python3 \
|
python3 \
|
||||||
nginx \
|
nginx \
|
||||||
openssl \
|
openssl \
|
||||||
gettext-base \
|
gettext-base
|
||||||
libcairo2-dev \
|
|
||||||
libjpeg62-turbo-dev \
|
|
||||||
libpng-dev \
|
|
||||||
libtool-bin \
|
|
||||||
uuid-dev \
|
|
||||||
libvncserver-dev \
|
|
||||||
freerdp3-dev \
|
|
||||||
libssh2-1-dev \
|
|
||||||
libtelnet-dev \
|
|
||||||
libwebsockets-dev \
|
|
||||||
libpulse-dev \
|
|
||||||
libvorbis-dev \
|
|
||||||
libwebp-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libpango1.0-dev \
|
|
||||||
libswscale-dev \
|
|
||||||
libavcodec-dev \
|
|
||||||
libavutil-dev \
|
|
||||||
libavformat-dev
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Building Guacamole Server (guacd)"
|
|
||||||
fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "latest" "/opt/guacamole-server"
|
|
||||||
cd /opt/guacamole-server
|
|
||||||
export CPPFLAGS="-Wno-error=deprecated-declarations"
|
|
||||||
$STD autoreconf -fi
|
|
||||||
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
|
|
||||||
$STD make
|
|
||||||
$STD make install
|
|
||||||
$STD ldconfig
|
|
||||||
cd /opt
|
|
||||||
rm -rf /opt/guacamole-server
|
|
||||||
msg_ok "Built Guacamole Server (guacd)"
|
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
||||||
|
|
||||||
@@ -106,36 +74,10 @@ systemctl reload nginx
|
|||||||
msg_ok "Configured Nginx"
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
mkdir -p /etc/guacamole
|
|
||||||
cat <<EOF >/etc/guacamole/guacd.conf
|
|
||||||
[server]
|
|
||||||
bind_host = 127.0.0.1
|
|
||||||
bind_port = 4822
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/guacd.service
|
|
||||||
[Unit]
|
|
||||||
Description=Guacamole Proxy Daemon (guacd)
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=forking
|
|
||||||
ExecStart=/etc/init.d/guacd start
|
|
||||||
ExecStop=/etc/init.d/guacd stop
|
|
||||||
ExecReload=/etc/init.d/guacd restart
|
|
||||||
PIDFile=/var/run/guacd.pid
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/termix.service
|
cat <<EOF >/etc/systemd/system/termix.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Termix Backend
|
Description=Termix Backend
|
||||||
After=network.target guacd.service
|
After=network.target
|
||||||
Wants=guacd.service
|
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
@@ -150,7 +92,7 @@ RestartSec=5
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now guacd termix
|
systemctl enable -q --now termix
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
135
misc/tools.func
135
misc/tools.func
@@ -2077,100 +2077,85 @@ verify_gpg_fingerprint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Get latest GitHub tag for a repository.
|
# Fetches and deploys a GitHub tag-based source tarball.
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# - Queries the GitHub API for tags (not releases)
|
# - Downloads the source tarball for a given tag from GitHub
|
||||||
# - Useful for repos that only create tags, not full releases
|
# - Extracts to the target directory
|
||||||
# - Supports optional prefix filter and version-only extraction
|
# - Writes the version to ~/.<app>
|
||||||
# - Returns the latest tag name (printed to stdout)
|
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# MONGO_VERSION=$(get_latest_gh_tag "mongodb/mongo-tools")
|
# fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server"
|
||||||
# LATEST=$(get_latest_gh_tag "owner/repo" "v") # only tags starting with "v"
|
# fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "latest" "/opt/guacamole-server"
|
||||||
# LATEST=$(get_latest_gh_tag "owner/repo" "" "true") # strip leading "v"
|
|
||||||
#
|
#
|
||||||
# Arguments:
|
# Arguments:
|
||||||
# $1 - GitHub repo (owner/repo)
|
# $1 - App name (used for version file ~/.<app>)
|
||||||
# $2 - Tag prefix filter (optional, e.g. "v" or "100.")
|
# $2 - GitHub repo (owner/repo)
|
||||||
# $3 - Strip prefix from result (optional, "true" to strip $2 prefix)
|
# $3 - Tag version (default: "latest" → auto-detect via get_latest_gh_tag)
|
||||||
#
|
# $4 - Target directory (default: /opt/$app)
|
||||||
# Returns:
|
|
||||||
# 0 on success (tag printed to stdout), 1 on failure
|
|
||||||
#
|
#
|
||||||
# Notes:
|
# Notes:
|
||||||
# - Skips tags containing "rc", "alpha", "beta", "dev", "test"
|
# - Supports CLEAN_INSTALL=1 to wipe target before extracting
|
||||||
# - Sorts by version number (sort -V) to find the latest
|
# - For repos that only publish tags, not GitHub Releases
|
||||||
# - Respects GITHUB_TOKEN for rate limiting
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
get_latest_gh_tag() {
|
fetch_and_deploy_gh_tag() {
|
||||||
local repo="$1"
|
local app="$1"
|
||||||
local prefix="${2:-}"
|
local repo="$2"
|
||||||
local strip_prefix="${3:-false}"
|
local version="${3:-latest}"
|
||||||
|
local target="${4:-/opt/$app}"
|
||||||
|
local app_lc=""
|
||||||
|
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
||||||
|
local version_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
local header_args=()
|
if [[ "$version" == "latest" ]]; then
|
||||||
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
version=$(get_latest_gh_tag "$repo") || {
|
||||||
|
msg_error "Failed to determine latest tag for ${repo}"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
local http_code=""
|
local current_version=""
|
||||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_tags.json \
|
[[ -f "$version_file" ]] && current_version=$(<"$version_file")
|
||||||
-H 'Accept: application/vnd.github+json' \
|
|
||||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
|
||||||
"${header_args[@]}" \
|
|
||||||
"https://api.github.com/repos/${repo}/tags?per_page=100" 2>/dev/null) || true
|
|
||||||
|
|
||||||
if [[ "$http_code" == "401" ]]; then
|
if [[ "$current_version" == "$version" ]]; then
|
||||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
msg_ok "$app is already up-to-date ($version)"
|
||||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
return 0
|
||||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
fi
|
||||||
else
|
|
||||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
local tmpdir
|
||||||
fi
|
tmpdir=$(mktemp -d) || return 1
|
||||||
rm -f /tmp/gh_tags.json
|
local tarball_url="https://github.com/${repo}/archive/refs/tags/${version}.tar.gz"
|
||||||
|
local filename="${app_lc}-${version}.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Fetching GitHub tag: ${app} (${version})"
|
||||||
|
|
||||||
|
download_file "$tarball_url" "$tmpdir/$filename" || {
|
||||||
|
msg_error "Download failed: $tarball_url"
|
||||||
|
rm -rf "$tmpdir"
|
||||||
return 1
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
mkdir -p "$target"
|
||||||
|
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
|
||||||
|
rm -rf "${target:?}/"*
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$http_code" == "403" ]]; then
|
tar --no-same-owner -xzf "$tmpdir/$filename" -C "$tmpdir" || {
|
||||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
msg_error "Failed to extract tarball"
|
||||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
rm -rf "$tmpdir"
|
||||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
|
||||||
rm -f /tmp/gh_tags.json
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
}
|
||||||
|
|
||||||
if [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
local unpack_dir
|
||||||
msg_error "GitHub API connection failed (no response)."
|
unpack_dir=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d | head -n1)
|
||||||
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
|
||||||
rm -f /tmp/gh_tags.json
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$http_code" != "200" ]] || [[ ! -s /tmp/gh_tags.json ]]; then
|
shopt -s dotglob nullglob
|
||||||
msg_error "Unable to fetch tags for ${repo} (HTTP ${http_code})"
|
cp -r "$unpack_dir"/* "$target/"
|
||||||
rm -f /tmp/gh_tags.json
|
shopt -u dotglob nullglob
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
local tags_json
|
rm -rf "$tmpdir"
|
||||||
tags_json=$(</tmp/gh_tags.json)
|
echo "$version" >"$version_file"
|
||||||
rm -f /tmp/gh_tags.json
|
msg_ok "Deployed ${app} ${version} to ${target}"
|
||||||
|
|
||||||
# Extract tag names, filter by prefix, exclude pre-release patterns, sort by version
|
|
||||||
local latest=""
|
|
||||||
latest=$(echo "$tags_json" | grep -oP '"name":\s*"\K[^"]+' |
|
|
||||||
{ [[ -n "$prefix" ]] && grep "^${prefix}" || cat; } |
|
|
||||||
grep -viE '(rc|alpha|beta|dev|test|preview|snapshot)' |
|
|
||||||
sort -V | tail -n1)
|
|
||||||
|
|
||||||
if [[ -z "$latest" ]]; then
|
|
||||||
msg_warn "No matching tags found for ${repo}${prefix:+ (prefix: $prefix)}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$strip_prefix" == "true" && -n "$prefix" ]]; then
|
|
||||||
latest="${latest#"$prefix"}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$latest"
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user