feat: upgrade command

This commit is contained in:
CyberL1 2025-02-16 09:44:31 +01:00
parent f33ccec5c4
commit 14ff2efa3d
6 changed files with 183 additions and 0 deletions

60
cmd/version.go Normal file
View File

@ -0,0 +1,60 @@
package cmd
import (
"fmt"
"holesail-proxy/utils"
"os"
"os/exec"
"runtime"
"github.com/spf13/cobra"
)
var versionCmd = &cobra.Command{
Use: "version",
Short: "Displays your CLI version",
Run: version,
}
var upgradeCmd = &cobra.Command{
Use: "upgrade",
Short: "Upgrades your CLI version",
Run: upgrade,
}
func init() {
rootCmd.AddCommand(versionCmd)
versionCmd.AddCommand(upgradeCmd)
}
func version(cmd *cobra.Command, args []string) {
latestRelease, _ := utils.GetLatestCliVersion()
if utils.Version < latestRelease.TagName {
fmt.Println("A new update is avaliable")
fmt.Println("Run 'holesail-proxy version upgrade' to upgrade")
}
fmt.Println("Your CLI Version:", utils.Version)
fmt.Println("Latest CLI version:", latestRelease.TagName)
}
func upgrade(cmd *cobra.Command, args []string) {
var command string
var cmdArgs []string
switch runtime.GOOS {
case "linux", "darwin":
command = "sh"
cmdArgs = []string{"-c", "curl -fsSL https://raw.githubusercontent.com/CyberL1/holesail-proxy/main/scripts/get.sh | sh"}
case "windows":
command = "powershell"
cmdArgs = []string{"irm https://raw.githubusercontent.com/CyberL1/holesail-proxy/main/scripts/get.ps1 | iex"}
}
execCmd := exec.Command(command, cmdArgs...)
execCmd.Stderr = os.Stderr
execCmd.Stdin = os.Stdin
execCmd.Stdout = os.Stdout
execCmd.Run()
}

36
scripts/get.ps1 Normal file
View File

@ -0,0 +1,36 @@
#!/usr/bin/env pwsh
$ErrorActionPreference = 'Stop'
$BinPath = "${Home}\.holesail-proxy\bin"
$Zip = "$RuntimerPath\holesail-proxy.zip"
$Exe = "$RuntimerPath\holesail-proxy.exe"
$OldExe = "$env:Temp\holesail-proxy-old.exe"
$Target = "windows-amd64"
$DownloadUrl = "https://github.com/CyberL1/holesail-proxy/releases/latest/download/holesal-proxy-${Target}.zip"
if (!(Test-Path $BinPath)) {
New-Item $BinPath -ItemType Directory | Out-Null
}
curl.exe -Lo $Zip $DownloadUrl
if (Test-Path $Exe) {
Move-Item -Path $Exe -Destination $OldExe -Force
}
Expand-Archive -LiteralPath $Zip -DestinationPath $BinPath -Force
Remove-Item $Zip
$User = [System.EnvironmentVariableTarget]::User
$Path = [System.Environment]::GetEnvironmentVariable('Path', $User)
if (!(";${Path};".ToLower() -like "*;${BinPath};*".ToLower())) {
[System.Environment]::SetEnvironmentVariable('Path', "${Path};${BinPath}", $User)
$Env:Path += ";${BinPath}"
}
Write-Output "Holesail proxy was installed to $Exe"
Write-Output "Run 'holesail-proxy up' to get started"

45
scripts/get.sh Normal file
View File

@ -0,0 +1,45 @@
#!/bin/sh
set -e
if ! command -v unzip > /dev/null; then
echo "Error: Unzip is required to install Holesail proxy"
exit 1
fi
dir="$HOME/.holesail-proxy/bin"
zip="$dir/holesail-proxy.zip"
exe="$dir/holesail-proxy"
if [ "$OS" = "Windows_NT" ]; then
target="windows"
else
case $(uname -sm) in
"Darwin x86_64") target="darwin-amd64" ;;
"Darwin arm64") target="dawin-arm64" ;;
"Linux aarch64") target="linux-arm64" ;;
*) target="linux-amd64"
esac
fi
download_url="https://github.com/CyberL1/holesail-proxy/releases/latest/download/holesail-proxy-${target}.zip"
if [ ! -d $dir ]; then
mkdir -p $dir
fi
curl --fail --location --progress-bar --output $zip $download_url
unzip -d $dir -o $zip
chmod +x $exe
rm $zip
echo "Holesail proxy was installed to $runtimer_exe"
if command -v holesail-proxy > /dev/null; then
echo "Run 'holesail-proxy --help' to get started"
else
case $SHELL in
/bin/zsh) shell_profile=".zshrc" ;;
*) shell_profile=".bashrc" ;;
esac
echo "export PATH=\"$dir:\$PATH\"" >> $HOME/$shell_profile
fi

6
utils/constants.go Normal file
View File

@ -0,0 +1,6 @@
package utils
var (
Version string
GithubReleaseUrl = "https://api.github.com/repos/CyberL1/holesail-proxy/releases/latest"
)

12
utils/types.go Normal file
View File

@ -0,0 +1,12 @@
package utils
type GithubRelease struct {
TagName string `json:"tag_name"`
Prerelease bool
}
type GithubFile struct {
Name string `json:"name"`
Path string `json:"path"`
DownloadUrl string `json:"download_url"`
}

24
utils/version.go Normal file
View File

@ -0,0 +1,24 @@
package utils
import (
"encoding/json"
"io"
"net/http"
)
func GetLatestCliVersion() (*GithubRelease, error) {
resp, err := http.Get(GithubReleaseUrl)
if err != nil {
return nil, err
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
release := &GithubRelease{}
err = json.Unmarshal(body, release)
if err != nil {
return nil, err
}
return release, nil
}