Merge pull request #481 from kubenetworks/install-kubevpn-by-shell-script

chore: install kubevpn by shell script
This commit is contained in:
yuyicai
2025-03-17 22:30:02 +08:00
committed by GitHub

235
install.sh Executable file
View File

@@ -0,0 +1,235 @@
#!/bin/sh
# KubeVPN installation script
# This script installs KubeVPN CLI to your system
# Created for https://github.com/kubenetworks/kubevpn
# curl -fsSL https://kubevpn.dev/install.sh | sh
set -e
# Colors and formatting
YELLOW='\033[0;33m'
GREEN='\033[0;32m'
RED='\033[0;31m'
BLUE='\033[0;34m'
BOLD='\033[1m'
RESET='\033[0m'
# Installation configuration
INSTALL_DIR=${INSTALL_DIR:-"/usr/local/bin"}
GITHUB_REPO="kubenetworks/kubevpn"
GITHUB_URL="https://github.com/${GITHUB_REPO}"
VERSION_URL="https://raw.githubusercontent.com/kubenetworks/kubevpn/refs/heads/master/plugins/stable.txt"
ZIP_FILE="kubevpn.zip"
log() {
echo "${BLUE}${BOLD}==> ${RESET}$1"
}
success() {
echo "${GREEN}${BOLD}==> $1${RESET}"
}
warn() {
echo "${YELLOW}${BOLD}==> $1${RESET}"
}
error() {
echo "${RED}${BOLD}==> $1${RESET}"
}
get_system_info() {
OS=$(uname | tr '[:upper:]' '[:lower:]')
log "Detected OS: ${OS}"
case $OS in
linux | darwin) ;;
msys_nt | msys | cygwin)
error "Windows is not supported, please install KubeVPN manually using scoop. More info: ${GITHUB_URL}"
exit 1
;;
*)
error "Unsupported operating system: ${OS}"
exit 1
;;
esac
ARCH=$(uname -m)
case $ARCH in
x86_64)
ARCH="amd64"
;;
aarch64 | arm64)
ARCH="arm64"
;;
i386 | i686)
ARCH="386"
;;
*)
error "Unsupported architecture: ${ARCH}"
exit 1
;;
esac
log "Detected architecture: ${ARCH}"
}
check_requirements() {
if command -v curl >/dev/null 2>&1; then
DOWNLOADER="curl"
elif command -v wget >/dev/null 2>&1; then
DOWNLOADER="wget"
else
error "Either curl or wget is required for installation"
exit 1
fi
if ! command -v unzip >/dev/null 2>&1; then
error "unzip is required but not installed"
exit 1
fi
if [ ! -d "$INSTALL_DIR" ]; then
log "Installation directory $INSTALL_DIR does not exist, attempting to create it"
if ! mkdir -p "$INSTALL_DIR" 2>/dev/null; then
if ! command -v sudo >/dev/null 2>&1 && ! command -v su >/dev/null 2>&1; then
error "Cannot create $INSTALL_DIR and neither sudo nor su is available"
exit 1
fi
fi
fi
if [ ! -w "$INSTALL_DIR" ] && ! command -v sudo >/dev/null 2>&1 && ! command -v su >/dev/null 2>&1; then
error "No write permission to $INSTALL_DIR and neither sudo nor su is available"
exit 1
fi
}
get_latest_version() {
log "Fetching the latest release version..."
if [ "$DOWNLOADER" = "curl" ]; then
VERSION=$(curl -s "$VERSION_URL")
else
VERSION=$(wget -qO- "$VERSION_URL")
fi
if [ -z "$VERSION" ]; then
error "Could not determine the latest version"
exit 1
fi
VERSION=$(echo "$VERSION" | tr -d 'v' | tr -d '\n')
success "Latest version: ${VERSION}"
}
download_binary() {
DOWNLOAD_URL="$GITHUB_URL/releases/download/v${VERSION}/kubevpn_v${VERSION}_${OS}_${ARCH}.zip"
log "Downloading KubeVPN binary from $DOWNLOAD_URL"
if [ "$DOWNLOADER" = "curl" ]; then
curl -L -o "$ZIP_FILE" "$DOWNLOAD_URL" || {
error "Failed to download KubeVPN"
exit 1
}
else
wget -O "$ZIP_FILE" "$DOWNLOAD_URL" || {
error "Failed to download KubeVPN"
exit 1
}
fi
}
install_binary() {
log "Installing KubeVPN..."
TMP_DIR=$(mktemp -d)
BINARY="$TMP_DIR/bin/kubevpn"
unzip -o -q "$ZIP_FILE" -d "$TMP_DIR"
if [ -f "$TMP_DIR/checksums.txt" ]; then
EXPECTED_CHECKSUM=$(cat "$TMP_DIR/checksums.txt" | awk '{print $1}')
if command -v shasum >/dev/null 2>&1; then
ACTUAL_CHECKSUM=$(shasum -a 256 "$BINARY" | awk '{print $1}')
elif command -v sha256sum >/dev/null 2>&1; then
ACTUAL_CHECKSUM=$(sha256sum "$BINARY" | awk '{print $1}')
else
warn "No checksum tool available, skipping verification"
ACTUAL_CHECKSUM=$EXPECTED_CHECKSUM
fi
[ "$ACTUAL_CHECKSUM" = "$EXPECTED_CHECKSUM" ] || {
error "Checksum verification failed (Expected: $EXPECTED_CHECKSUM, Got: $ACTUAL_CHECKSUM)"
# Clean up
rm -rf "$TMP_DIR"
rm -f "$ZIP_FILE"
exit 1
}
fi
# Check if we need sudo
if [ -w "$INSTALL_DIR" ]; then
mv "$BINARY" "$INSTALL_DIR/kubevpn"
chmod +x "$INSTALL_DIR/kubevpn"
else
warn "Elevated permissions required to install to $INSTALL_DIR"
if command -v sudo >/dev/null 2>&1; then
sudo mv "$BINARY" "$INSTALL_DIR/kubevpn"
sudo chmod +x "$INSTALL_DIR/kubevpn"
else
su -c "mv \"$BINARY\" \"$INSTALL_DIR/kubevpn\" && chmod +x \"$INSTALL_DIR/kubevpn\""
fi
fi
# Clean up
rm -f "$ZIP_FILE"
rm -rf "$TMP_DIR"
}
verify_installation() {
if [ -x "$INSTALL_DIR/kubevpn" ]; then
VERSION_OUTPUT=$("$INSTALL_DIR/kubevpn" version 2>&1 || echo "unknown")
success "KubeVPN installed successfully"
log "$VERSION_OUTPUT"
log "KubeVPN has been installed to: $INSTALL_DIR/kubevpn"
# Check if the installed binary is in PATH
if command -v kubevpn >/dev/null 2>&1; then
FOUND_PATH=$(command -v kubevpn)
if [ "$FOUND_PATH" != "$INSTALL_DIR/kubevpn" ]; then
warn "Another kubevpn binary was found in your PATH at: $FOUND_PATH"
warn "Make sure $INSTALL_DIR is in your PATH to use the newly installed version"
fi
else
warn "Make sure $INSTALL_DIR is in your PATH to use kubevpn"
fi
echo ""
log "To connect to a Kubernetes cluster:"
if [ "$FOUND_PATH" != "$INSTALL_DIR/kubevpn" ]; then
echo " $INSTALL_DIR/kubevpn connect"
else
echo " kubevpn connect"
fi
echo ""
log "For more information, visit:"
echo " $GITHUB_URL"
success "Done! enjoy KubeVPN 🚀"
else
error "KubeVPN installation failed"
exit 1
fi
}
main() {
log "Starting KubeVPN installation..."
get_system_info
check_requirements
get_latest_version
download_binary
install_binary
verify_installation
}
main