install.txt 5.34 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
################################################################################
#
# Site.js v12.6.0 Installer for Windows 10 (PowerShell)
#
# To use:
#
# iex(iwr -UseBasicParsing https://sitejs.org/windows).Content
#
# Copyright (c) 2019 Aral Balkan.
# Released under the AGPL version 3.0 or later license.
# Made with <3 by Small Technology Foundation (https://small-tech.org)
# Like this? Fund us! (https://small-tech.org/fund-us)
#
################################################################################

# This is where the binary will be installed to.
$installationDirectory =  'C:\Program Files\site.js'

# The address to download the installation script from.
$installationScriptUrl = 'https://sitejs.org/windows'

# Installation script local file name.
$installationScriptFileName = 'install-site.js.ps1'

# The address to download the tar-gzipped archive of the Site.js binary from.
$archiveUrl = 'https://sitejs.org/releases/windows/12.6.0.tar.gz'

# Emoji encodings (because Powershell is from the Stone Age and cannot handle
# emoji literals in strings)

$satelliteBytes = 240, 159, 147, 161
$packageBytes = 240, 159, 147, 166
$tadaBytes = 240, 159, 142, 137
$satelliteEmoji = [System.Text.Encoding]::UTF8.GetString($satelliteBytes)
$packageEmoji = [System.Text.Encoding]::UTF8.GetString($packageBytes)
$tadaEmoji = [System.Text.Encoding]::UTF8.GetString($tadaBytes)
$ellipsis = [char]0x2026

# Adds to the specified environment path without creating duplicates.
# Courtesy of https://gist.github.com/mkropat/c1226e0cc2ca941b23a9
# Via https://stackoverflow.com/questions/714877/setting-windows-powershell-environment-variables
function Add-EnvPath {
  param(
    [Parameter(Mandatory=$true)]
    [string] $Path,

    [ValidateSet('Machine', 'User', 'Session')]
    [string] $Container = 'Session'
  )

  if ($Container -ne 'Session') {
    $containerMapping = @{
      Machine = [EnvironmentVariableTarget]::Machine
      User = [EnvironmentVariableTarget]::User
    }
    $containerType = $containerMapping[$Container]

    $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
    if ($persistedPaths -notcontains $Path) {
      $persistedPaths = $persistedPaths + $Path | Where-Object { $_ }
      [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
    }
  }

  $envPaths = $env:Path -split ';'
  if ($envPaths -notcontains $Path) {
    $envPaths = $envPaths + $Path | Where-Object { $_ }
    $env:Path = $envPaths -join ';'
  }
}

# Switch to the temp folder. This is where we will always be working from
# so as not to pollute any persistent directories.
Push-Location "~\AppData\Local\Temp\"

# Check if we're running with elevated privileges, if not, start a new
# PowerShell windows with elevated privileges and continue there.
if (!([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  #
  # Installer is running with regular privileges.
  #

  #
  # Installer is running with regular privileges. Start a new PowerShell session with elevated privileges.
  #
  Write-Output ''
  Write-Output " $satelliteEmoji Downloading Site.js v12.6.0$ellipsis"

  # We need to start a new PowerShell session with elevated privileges but if we're running in memory
  # only after being downloaded by the installation command, we don't have a copy of ourselves to run.
  # So download the latest version of this script and save it there so that we can run it with elevated privileges.
  Invoke-WebRequest $installationScriptUrl -OutFile $installationScriptFileName

  # Run the downloaded version of ourself with elevated privileges.
  $currentPath = (Get-Item -Path ".\").FullName
  Start-Process -Verb RunAs powershell.exe -Wait -ArgumentList "$currentPath/$installationScriptFileName"

  # We're back from the privileged window. Update this window's path immediately so that
  # the person can use the site command right away from the current session.
  $env:Path += ";$installationDirectory"

  # Recreate the output from the other window for consistency with other platforms.
  Write-Output " $packageEmoji Installing$ellipsis"
  Write-Output " $tadaEmoji Done! "
  Write-Output ''
} else {
  #
  # Installer is running with elevated privileges.
  #
  Write-Output "`n`n`n`n`n`n"
  Write-Output ' Installing Site.js using administrator privileges...'
  Write-Output ''
  Write-Output ' * Downloading Site.js v12.6.0...'

  # Download the latest Site.js archive.
  Invoke-WebRequest -Uri $archiveUrl -OutFile '12.6.0.tar.gz'

  Write-Output ''
  Write-Output ' * Extracting binary...'

  # Gunzip and untar the binary.
  tar -xf 12.6.0.tar.gz

  Write-Output ''
  Write-Output ' * Installing binary...'

  # Ensure that the folder we want to copy the binary to exists.
  New-Item -Force -ItemType directory -Path $installationDirectory | Out-Null
  Copy-Item -Force -Path ./site.exe -Destination $installationDirectory | Out-Null

  Write-Output ''
  Write-Output ' * Adding to system path...'

  # Persist the installation directory to the system path
  # (if it doesn't already exist).
  Add-EnvPath -Container Machine -Path $installationDirectory

  Write-Output ''
  Write-Output ' * Done!'
  Write-Output ''

  # Give people a chance to read the output.
  Start-Sleep -Seconds 1
}

# Revert to whatever directory the person was in originally.
Pop-Location