mirror of
https://github.com/trailbaseio/trailbase.git
synced 2026-01-04 08:39:42 -06:00
650 lines
14 KiB
PowerShell
650 lines
14 KiB
PowerShell
# Install script for: https://github.com/trailbaseio/trailbase generated by
|
|
# https://instl.sh
|
|
#
|
|
# To use this install script, run the following command:
|
|
#
|
|
# Linux:
|
|
# curl -sSL instl.sh/trailbaseio/trailbase/linux | bash
|
|
#
|
|
# macOS:
|
|
# curl -sSL instl.sh/trailbaseio/trailbase/macos | bash
|
|
#
|
|
# Windows:
|
|
# iwr instl.sh/trailbaseio/trailbase/windows | iex
|
|
|
|
# Import libraries
|
|
# --- Sourced from file: ./lib/colors.ps1 ---
|
|
|
|
# Foreground Colors
|
|
|
|
function fRed
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkRed
|
|
}
|
|
|
|
function fRedLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Red
|
|
}
|
|
|
|
function fGreen
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkGreen
|
|
}
|
|
|
|
function fGreenLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Green
|
|
}
|
|
|
|
function fYellow
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkYellow
|
|
}
|
|
|
|
function fYellowLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Yellow
|
|
}
|
|
|
|
function fBlue
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkBlue
|
|
}
|
|
|
|
function fBlueLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Blue
|
|
}
|
|
|
|
function fMagenta
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkMagenta
|
|
}
|
|
|
|
function fMagentaLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Magenta
|
|
}
|
|
|
|
function fCyan
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkCyan
|
|
}
|
|
|
|
function fCyanLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Cyan
|
|
}
|
|
|
|
function fWhite
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor White
|
|
}
|
|
|
|
function fBlack
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Black
|
|
}
|
|
|
|
function fGray
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor DarkGray
|
|
}
|
|
|
|
function fGrayLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -ForegroundColor Gray
|
|
}
|
|
|
|
# Background Colors
|
|
|
|
function bRed
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkRed
|
|
}
|
|
|
|
function bRedLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Red
|
|
}
|
|
|
|
function bGreen
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkGreen
|
|
}
|
|
|
|
function bGreenLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Green
|
|
}
|
|
|
|
function bYellow
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkYellow
|
|
}
|
|
|
|
function bYellowLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Yellow
|
|
}
|
|
|
|
function bBlue
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkBlue
|
|
}
|
|
|
|
function bBlueLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Blue
|
|
}
|
|
|
|
function bMagenta
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkMagenta
|
|
}
|
|
|
|
function bMagentaLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Magenta
|
|
}
|
|
|
|
function bCyan
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkCyan
|
|
}
|
|
|
|
function bCyanLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Cyan
|
|
}
|
|
|
|
function bWhite
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor White
|
|
}
|
|
|
|
function bBlack
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Black
|
|
}
|
|
|
|
function bGray
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor DarkGray
|
|
}
|
|
|
|
function bGrayLight
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
Write-Host $Msg -NoNewline -BackgroundColor Gray
|
|
}
|
|
|
|
# Special Colors
|
|
|
|
function resetColor
|
|
{
|
|
Write-Host -NoNewline -Reset
|
|
}
|
|
|
|
# Theme
|
|
|
|
function primaryColor
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fCyan $Msg
|
|
}
|
|
|
|
function secondaryColor
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fMagentaLight $Msg
|
|
}
|
|
|
|
function info
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fBlueLight " i "
|
|
fBlue $Msg
|
|
echo ""
|
|
}
|
|
|
|
function warning
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fYellowLight " ! "
|
|
fYellow $Msg
|
|
echo ""
|
|
}
|
|
|
|
function error
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fRedLight " X "
|
|
fRed $Msg
|
|
echo ""
|
|
exit 1
|
|
}
|
|
|
|
function success
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
fGreenLight " + "
|
|
fGreen $Msg
|
|
echo ""
|
|
}
|
|
|
|
function verbose
|
|
{
|
|
param (
|
|
$Msg
|
|
)
|
|
if ($verbose)
|
|
{
|
|
fGrayLight " > "
|
|
fGray $Msg
|
|
echo ""
|
|
}
|
|
}
|
|
|
|
|
|
# --- End of ./lib/colors.ps1 ---
|
|
|
|
|
|
|
|
# Setup variables
|
|
$verboseString = "false"
|
|
$verbose = $false
|
|
if ($verboseString -eq "true")
|
|
{
|
|
$verbose = $true
|
|
}
|
|
|
|
verbose "Setting up variables"
|
|
$owner = "trailbaseio"
|
|
$repo = "trailbase"
|
|
|
|
$tmpDir = "$env:TEMP\instl-cache"
|
|
verbose "Temporary directory: $tmpDir"
|
|
# Remove previous cache, if it exists
|
|
if (test-path $tmpDir)
|
|
{
|
|
rm -r -fo $tmpDir
|
|
}
|
|
New-Item -Path $tmpDir -ItemType Directory > $null
|
|
|
|
$installLocation = "$HOME\instl\$repo"
|
|
verbose "Install location: $installLocation"
|
|
# Remove previous installation, if it exists
|
|
if (test-path $installLocation)
|
|
{
|
|
Remove-Item -r -fo $installLocation
|
|
}
|
|
New-Item -Path $installLocation -ItemType Directory > $null
|
|
|
|
# Print "INSTL" header
|
|
# --- Sourced from file: ../shared/intro.ps1 ---
|
|
|
|
fBlueLight 'Instl is an installer for GitHub Projects'
|
|
echo ""
|
|
fBlue ' > https://instl.sh'
|
|
echo ""
|
|
|
|
# --- End of ../shared/intro.ps1 ---
|
|
|
|
|
|
|
|
# Installation
|
|
$headers = @{
|
|
'user-agent' = 'instl'
|
|
}
|
|
|
|
# Check for GH_TOKEN in environment variables
|
|
if ($env:GH_TOKEN) {
|
|
verbose "Using authentication with GH_TOKEN"
|
|
$Headers['Authorization'] = "Bearer $($env:GH_TOKEN)"
|
|
}
|
|
# Check for GITHUB_TOKEN in environment variables
|
|
elseif ($env:GITHUB_TOKEN) {
|
|
verbose "Using authentication with GITHUB_TOKEN"
|
|
$Headers['Authorization'] = "Bearer $($env:GITHUB_TOKEN)"
|
|
}
|
|
# No authentication tokens found
|
|
else {
|
|
verbose "No authentication"
|
|
}
|
|
|
|
# GitHub public API
|
|
$latestReleaseURL = "https://api.github.com/repos/$owner/$repo/releases/latest"
|
|
$latestRelease = Invoke-WebRequest -Method Get -Uri $latestReleaseURL -Headers $Headers | ConvertFrom-Json
|
|
$tagName = $latestRelease.tag_name
|
|
info "Found latest release of $repo (version: $tagName)"
|
|
|
|
# Get list of assets
|
|
verbose "Getting list of assets"
|
|
$assetsRaw = $latestRelease.assets
|
|
# Map to array
|
|
$assets = $assetsRaw | ForEach-Object { $_.browser_download_url }
|
|
$assetCount = $assets.Count
|
|
info "Found $assetCount assets in '$tagName' - searching for one that fits your system..."
|
|
|
|
# Get host architecture
|
|
$arch = $env:PROCESSOR_ARCHITECTURE
|
|
# arch to lowercase
|
|
$arch = $arch.ToLower()
|
|
verbose "Host architecture: $arch"
|
|
|
|
# Set aliases for architecture
|
|
$amd64 = @("amd64", "x86_64", "x86-64", "x64")
|
|
$amd32 = @("386", "i386", "i686", "x86")
|
|
$windows = @("windows", "win")
|
|
|
|
$currentArchAliases = @()
|
|
if ($arch -eq "amd64")
|
|
{
|
|
$currentArchAliases = $amd64
|
|
}
|
|
elseif ($arch -eq "x86")
|
|
{
|
|
$currentArchAliases = $amd32
|
|
}
|
|
else
|
|
{
|
|
error "Unsupported architecture: $arch"
|
|
}
|
|
verbose "Current architecture aliases: $currentArchAliases"
|
|
|
|
# Create hastable of assets and a score
|
|
$assetMap = @{ }
|
|
# Loop through assets
|
|
foreach ($asset in $assets)
|
|
{
|
|
if ( $asset.ToLower().Contains("darwin"))
|
|
{
|
|
continue
|
|
}
|
|
if ( $asset.ToLower().EndsWith(".sbom"))
|
|
{
|
|
continue
|
|
}
|
|
$assetMap[$asset] = 0
|
|
# Loop through windows aliases
|
|
$windows | %{
|
|
$windowsAlias = $_
|
|
# If asset contains architecture alias, increase score
|
|
if ( $asset.ToLower().Contains($windowsAlias))
|
|
{
|
|
verbose "Asset $asset contains windows alias $windowsAlias"
|
|
$assetMap[$asset] = $assetMap[$asset] + 1
|
|
}
|
|
}
|
|
|
|
# Loop through architecture aliases
|
|
$currentArchAliases | %{
|
|
$archAlias = $_
|
|
# If asset contains architecture alias, increase score
|
|
if ( $asset.ToLower().Contains($archAlias))
|
|
{
|
|
verbose "Asset $asset contains architecture alias $archAlias"
|
|
$assetMap[$asset] = $assetMap[$asset] + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
# Get highest score
|
|
$highestScore = 0
|
|
$highestScoreAsset = ""
|
|
foreach ($Key in $assetMap.Keys)
|
|
{
|
|
$asset = $Key
|
|
$score = $assetMap[$Key]
|
|
verbose "Asset: $asset, score: $score"
|
|
if ($score -gt $highestScore)
|
|
{
|
|
$highestScore = $score
|
|
$highestScoreAsset = $asset
|
|
}
|
|
}
|
|
|
|
# Check if no asset is found
|
|
if ($highestScore -eq 0)
|
|
{
|
|
error "Could not find any assets that fit your system"
|
|
}
|
|
|
|
$assetURL = $highestScoreAsset
|
|
$assetName = $assetURL.Split('/')[-1]
|
|
info "Found asset with highest match score: $assetName"
|
|
|
|
# Downoad asset
|
|
info "Downloading asset..."
|
|
$assetPath = "$tmpDir\$assetName"
|
|
Invoke-WebRequest -Uri $assetURL -OutFile $assetPath -Headers $Headers
|
|
verbose "Asset downloaded to $assetPath"
|
|
|
|
info "Installing $repo"
|
|
# Extract asset if it is a zip file
|
|
if ( $assetName.EndsWith(".zip"))
|
|
{
|
|
verbose "Extracting asset..."
|
|
Expand-Archive -Path $assetPath -Destination $installLocation\
|
|
verbose "Asset extracted to $installLocation"
|
|
}
|
|
elseif ( $assetName.EndsWith(".tar.gz"))
|
|
{
|
|
verbose "Extracting asset..."
|
|
tar -xzf $assetPath -C $installLocation
|
|
verbose "Asset extracted to $installLocation"
|
|
}
|
|
elseif ( $assetName.EndsWith(".tar"))
|
|
{
|
|
verbose "Extracting asset..."
|
|
tar -xf $assetPath -C $installLocation
|
|
verbose "Asset extracted to $installLocation"
|
|
}
|
|
else
|
|
{
|
|
error "Asset is not a zip, tar or tar.gz file"
|
|
}
|
|
|
|
# If it was unpacked to a single directory, move the files to the root of the tmpDir
|
|
# Also check that there are not other non directory files in the tmpDir
|
|
verbose "Checking if asset was unpacked to a single directory"
|
|
$files = Get-ChildItem -Path $installLocation
|
|
if ($files.Count -eq 1 -and $files[0].PSIsContainer)
|
|
{
|
|
verbose "Moving files to root of tmpDir"
|
|
$subDir = $files[0]
|
|
$subDirPath = $subDir.FullName
|
|
$subDirFiles = Get-ChildItem -Path $subDirPath
|
|
foreach ($file in $subDirFiles)
|
|
{
|
|
$filePath = $file.FullName
|
|
$fileName = $file.Name
|
|
verbose "Moving $fileName to root of tmpDir"
|
|
Move-Item -Path $filePath -Destination $installLocation
|
|
}
|
|
}
|
|
else
|
|
{
|
|
verbose "Asset was not unpacked to a single directory"
|
|
}
|
|
|
|
# Find binary file in install path
|
|
$binaryFile = (Get-ChildItem -Path $installLocation -Filter "*.exe")[0]
|
|
$binaryFile = $installLocation + "\" + $binaryFile.Name
|
|
$binaryName = $binaryFile.Split('\')[-1]
|
|
$command = $binaryName.Split('.')[0]
|
|
verbose "Binary file: $binaryFile"
|
|
|
|
# Change PATH to include install location
|
|
verbose "Changing PATH to include install location"
|
|
$oldPath = (Get-ItemProperty -Path 'Registry::HKEY_CURRENT_USER\Environment' -Name PATH).path
|
|
# if oldPath does not contain install location, add it
|
|
if (!$oldPath.Contains($installLocation))
|
|
{
|
|
verbose "PATH does not contain install location, adding it"
|
|
$newPath = $oldPath + ";" + $installLocation
|
|
Set-ItemProperty -Path 'Registry::HKEY_CURRENT_USER\Environment' -Name PATH -Value $newPath
|
|
}
|
|
|
|
info "Running clean up..."
|
|
if (test-path $tmpDir)
|
|
{
|
|
verbose "Removing temporary directory"
|
|
rm -r -fo $tmpDir
|
|
}
|
|
|
|
# Test if binary exists
|
|
if (test-path $binaryFile)
|
|
{
|
|
verbose "Binary file exists"
|
|
}
|
|
else
|
|
{
|
|
error "Binary file does not exist"
|
|
}
|
|
|
|
Write-Host ""
|
|
success "You can now run '$command' in your terminal!"
|
|
info "You might have to restart your terminal session for the changes to take effect"
|
|
|
|
|
|
##################################################################################
|
|
# MIT License #
|
|
# #
|
|
# Copyright (c) 2022 Marvin Wendt (Instl | https://instl.sh) #
|
|
# #
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy #
|
|
# of this software and associated documentation files (the "Software"), to deal #
|
|
# in the Software without restriction, including without limitation the rights #
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #
|
|
# copies of the Software, and to permit persons to whom the Software is #
|
|
# furnished to do so, subject to the following conditions: #
|
|
# #
|
|
# The above copyright notice and this permission notice shall be included in all #
|
|
# copies or substantial portions of the Software. #
|
|
# #
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE #
|
|
# SOFTWARE. #
|
|
##################################################################################
|
|
|
|
# --------------------------------- Metadata ----------------------------------- #
|
|
|
|
# Script generated for https://github.com/trailbaseio/trailbase
|
|
# Script generated at 2025-08-06 13:53:57.89808815 +0000 UTC m=+12582025.680520342
|
|
# Script generated for version "latest"
|
|
# Script generated with instl version "dev"
|