mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-20 08:52:59 +01:00
Compare commits
3 Commits
MickLesk-p
...
termix_add
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88310a8a1b | ||
|
|
ea2208e7f2 | ||
|
|
debc871b01 |
@@ -423,8 +423,6 @@ 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,10 +29,87 @@ 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 Service"
|
msg_info "Stopping Termix"
|
||||||
systemctl stop termix
|
systemctl stop termix
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Termix"
|
||||||
|
|
||||||
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
|
||||||
@@ -95,16 +172,16 @@ function update_script() {
|
|||||||
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 Service"
|
msg_info "Starting Termix"
|
||||||
systemctl start termix
|
systemctl start termix
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Termix"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -19,9 +19,41 @@ $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"
|
||||||
|
|
||||||
@@ -74,10 +106,36 @@ 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
|
After=network.target guacd.service
|
||||||
|
Wants=guacd.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
@@ -92,7 +150,7 @@ RestartSec=5
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now termix
|
systemctl enable -q --now guacd termix
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
135
misc/tools.func
135
misc/tools.func
@@ -2077,85 +2077,100 @@ verify_gpg_fingerprint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Fetches and deploys a GitHub tag-based source tarball.
|
# Get latest GitHub tag for a repository.
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# - Downloads the source tarball for a given tag from GitHub
|
# - Queries the GitHub API for tags (not releases)
|
||||||
# - Extracts to the target directory
|
# - Useful for repos that only create tags, not full releases
|
||||||
# - Writes the version to ~/.<app>
|
# - Supports optional prefix filter and version-only extraction
|
||||||
|
# - Returns the latest tag name (printed to stdout)
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server"
|
# MONGO_VERSION=$(get_latest_gh_tag "mongodb/mongo-tools")
|
||||||
# fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "latest" "/opt/guacamole-server"
|
# LATEST=$(get_latest_gh_tag "owner/repo" "v") # only tags starting with "v"
|
||||||
|
# LATEST=$(get_latest_gh_tag "owner/repo" "" "true") # strip leading "v"
|
||||||
#
|
#
|
||||||
# Arguments:
|
# Arguments:
|
||||||
# $1 - App name (used for version file ~/.<app>)
|
# $1 - GitHub repo (owner/repo)
|
||||||
# $2 - GitHub repo (owner/repo)
|
# $2 - Tag prefix filter (optional, e.g. "v" or "100.")
|
||||||
# $3 - Tag version (default: "latest" → auto-detect via get_latest_gh_tag)
|
# $3 - Strip prefix from result (optional, "true" to strip $2 prefix)
|
||||||
# $4 - Target directory (default: /opt/$app)
|
#
|
||||||
|
# Returns:
|
||||||
|
# 0 on success (tag printed to stdout), 1 on failure
|
||||||
#
|
#
|
||||||
# Notes:
|
# Notes:
|
||||||
# - Supports CLEAN_INSTALL=1 to wipe target before extracting
|
# - Skips tags containing "rc", "alpha", "beta", "dev", "test"
|
||||||
# - For repos that only publish tags, not GitHub Releases
|
# - Sorts by version number (sort -V) to find the latest
|
||||||
|
# - Respects GITHUB_TOKEN for rate limiting
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
fetch_and_deploy_gh_tag() {
|
get_latest_gh_tag() {
|
||||||
local app="$1"
|
local repo="$1"
|
||||||
local repo="$2"
|
local prefix="${2:-}"
|
||||||
local version="${3:-latest}"
|
local strip_prefix="${3:-false}"
|
||||||
local target="${4:-/opt/$app}"
|
|
||||||
local app_lc=""
|
|
||||||
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
|
||||||
local version_file="$HOME/.${app_lc}"
|
|
||||||
|
|
||||||
if [[ "$version" == "latest" ]]; then
|
local header_args=()
|
||||||
version=$(get_latest_gh_tag "$repo") || {
|
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||||
msg_error "Failed to determine latest tag for ${repo}"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
local current_version=""
|
local http_code=""
|
||||||
[[ -f "$version_file" ]] && current_version=$(<"$version_file")
|
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_tags.json \
|
||||||
|
-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 [[ "$current_version" == "$version" ]]; then
|
if [[ "$http_code" == "401" ]]; then
|
||||||
msg_ok "$app is already up-to-date ($version)"
|
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||||
return 0
|
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||||
fi
|
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||||
|
else
|
||||||
local tmpdir
|
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||||
tmpdir=$(mktemp -d) || return 1
|
fi
|
||||||
local tarball_url="https://github.com/${repo}/archive/refs/tags/${version}.tar.gz"
|
rm -f /tmp/gh_tags.json
|
||||||
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
|
||||||
|
|
||||||
tar --no-same-owner -xzf "$tmpdir/$filename" -C "$tmpdir" || {
|
if [[ "$http_code" == "403" ]]; then
|
||||||
msg_error "Failed to extract tarball"
|
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||||
rm -rf "$tmpdir"
|
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||||
|
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||||
|
rm -f /tmp/gh_tags.json
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
|
|
||||||
local unpack_dir
|
if [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||||
unpack_dir=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d | head -n1)
|
msg_error "GitHub API connection failed (no response)."
|
||||||
|
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
||||||
|
rm -f /tmp/gh_tags.json
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
shopt -s dotglob nullglob
|
if [[ "$http_code" != "200" ]] || [[ ! -s /tmp/gh_tags.json ]]; then
|
||||||
cp -r "$unpack_dir"/* "$target/"
|
msg_error "Unable to fetch tags for ${repo} (HTTP ${http_code})"
|
||||||
shopt -u dotglob nullglob
|
rm -f /tmp/gh_tags.json
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
rm -rf "$tmpdir"
|
local tags_json
|
||||||
echo "$version" >"$version_file"
|
tags_json=$(</tmp/gh_tags.json)
|
||||||
msg_ok "Deployed ${app} ${version} to ${target}"
|
rm -f /tmp/gh_tags.json
|
||||||
|
|
||||||
|
# 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