# AuraOffice 0.4.4 for Windows x64 # # irm https://auraoffice.org/install.ps1 | iex # # One application instead of the whole suite: the longer form of the line takes # names on the end, as in # # & ([scriptblock]::Create((irm https://auraoffice.org/install.ps1))) page # # List, which has a release line of its own, is installed the same way with # its name: list. A line with no names installs the suite. # # Track has its own release line too. Add track to the longer form above to install it. # # What this does, so that nobody has to run it to find out: it downloads the # installer of each application to a temporary folder, checks every one against # the checksum below before it runs any of them, and then runs each installer # silently. The installers put the applications in your own AppData folder, so # nothing asks for administrator rights. It prints what it installed. # # The checksums are not protection against this server: they came from this # server. They are protection against a download that arrived damaged or # truncated, which is the failure that actually happens and is otherwise silent. # # Reading it before running it is the right instinct and this file is written to # be read: no second stage, and nothing fetched but the installers named below. # It sticks to what Windows PowerShell 5.1 understands, which every Windows 10 # and 11 has. There is no `exit` in it: run through `iex`, an exit would close # the PowerShell window it was typed into. function Install-AuraOffice { param([string[]] $Names) $ErrorActionPreference = 'Stop' # Windows PowerShell draws a progress bar for every chunk it downloads, and # that makes a 4 MB installer take a minute instead of a second. $ProgressPreference = 'SilentlyContinue' # TLS. A current .NET leaves the choice to Windows (SystemDefault, which is 0), # and that is left alone: adding TLS 1.2 to it would replace the system's # choice with TLS 1.2 alone. An older one offers only TLS 1.0 and 1.1, which # the server refuses, so TLS 1.2 is added there. $tls = [Net.ServicePointManager]::SecurityProtocol if ([int]$tls -ne 0 -and -not ($tls -band [Net.SecurityProtocolType]::Tls12)) { [Net.ServicePointManager]::SecurityProtocol = $tls -bor [Net.SecurityProtocolType]::Tls12 } # Args is how each installer runs without a window: /S for the suite's NSIS # installers, and for each Inno Setup one /VERYSILENT with # /CURRENTUSER, which keeps it in your own AppData. Default says whether a # line with no names installs it. $builds = @( [pscustomobject]@{ App = 'base'; Name = 'Base'; Version = '0.4.4'; File = 'AuraBase_0.4.4_r12_x64-setup.exe'; Size = '4.1 MB'; Sha256 = '7915e38efc9899a8d0ce69db3f2e7971985d95cc78bb7529e4ffc9a92e085bbd'; Url = 'https://auraoffice.org/releases/AuraBase_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'cite'; Name = 'Cite'; Version = '0.4.4'; File = 'AuraCite_0.4.4_r12_x64-setup.exe'; Size = '4.9 MB'; Sha256 = '0d6272398b59c0d8b190f2b82097f94be45d7a8585fe5f4c813efd4090ce9bcc'; Url = 'https://auraoffice.org/releases/AuraCite_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'deck'; Name = 'Deck'; Version = '0.6.6'; File = 'AuraDeck_0.6.6_r12_x64-setup.exe'; Size = '4.9 MB'; Sha256 = '6f57bdecc60fdac7a40ecd2cbc6fd61fc899ee9f3db0dca42a342b40e6a8d384'; Url = 'https://auraoffice.org/releases/AuraDeck_0.6.6_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'hub'; Name = 'AuraOffice Hub'; Version = '0.4.4'; File = 'AuraOffice Hub_0.4.4_r12_x64-setup.exe'; Size = '3.2 MB'; Sha256 = '0ca34926536825554bfec0b65f315a56b807c6e0267dc15bad1c9401ee0d0971'; Url = 'https://auraoffice.org/releases/AuraOffice Hub_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'md'; Name = 'MD'; Version = '0.4.4'; File = 'AuraMD_0.4.4_r12_x64-setup.exe'; Size = '3.7 MB'; Sha256 = '7f83d52a0d48b879a68bd04b5b42aa25c735ac7f1fe52f3bc3e7e57278581961'; Url = 'https://auraoffice.org/releases/AuraMD_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'page'; Name = 'Page'; Version = '0.4.4'; File = 'AuraPage_0.4.4_r12_x64-setup.exe'; Size = '6.7 MB'; Sha256 = '86da2875234d2844b16b1a293b80bf6b1740f7081f6e18e1f02acb1614d9c3af'; Url = 'https://auraoffice.org/releases/AuraPage_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'sheet'; Name = 'Sheet'; Version = '0.4.4'; File = 'AuraSheet_0.4.4_r12_x64-setup.exe'; Size = '3.9 MB'; Sha256 = 'a4559247bcafe45d618ee74390f453fe4bd9b154e1df9a5719b912e43d709910'; Url = 'https://auraoffice.org/releases/AuraSheet_0.4.4_r12_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'list'; Name = 'List'; Version = '1.1.6'; File = 'auralist-1.1.6-windows-x64-setup.exe'; Size = '11.3 MB'; Sha256 = '99f2f8cbf597412cc2273f38e95837f73e3457ceb87abda9e0648fb73241de1e'; Url = 'https://auraoffice.org/releases/auralist-1.1.6-windows-x64-setup.exe'; Args = '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CURRENTUSER'; Default = $false } [pscustomobject]@{ App = 'track'; Name = 'Track'; Version = '0.4.4'; File = 'auratrack-0.4.4-windows-x64-setup.exe'; Size = '2.8 MB'; Sha256 = '9eae45bb191bbdf8ceac09da2aaac6604ec92e38bb7db077314a0d228605db8d'; Url = 'https://auraoffice.org/releases/auratrack-0.4.4-windows-x64-setup.exe'; Args = '/S'; Default = $false } ) if (-not [Environment]::Is64BitOperatingSystem) { Write-Host 'install: these builds are for 64-bit Windows, and this Windows is 32-bit.' -ForegroundColor Red return } # The names install.sh takes, and the product names too: List is list # and Track is track. $Names = @($Names | Where-Object { $_ } | ForEach-Object { ([string]$_).ToLower() -replace '^aura', '' }) $known = @($builds | Where-Object { $_.App } | ForEach-Object { $_.App }) if ($Names.Count -gt 0) { $unknown = @($Names | Where-Object { $known -notcontains $_ }) if ($unknown.Count -gt 0) { if (@($builds | Where-Object { -not $_.App }).Count -gt 0) { Write-Host 'install: this build is one installer carrying the whole suite, so it cannot install one application on its own. Run the line with no name after it.' -ForegroundColor Red } else { Write-Host ('install: not in this build: ' + ($unknown -join ', ') + '. The names it takes: ' + ($known -join ', ') + '.') -ForegroundColor Red } return } $chosen = @($builds | Where-Object { $Names -contains $_.App }) } else { $chosen = @($builds | Where-Object { $_.Default }) if ($chosen.Count -eq 0) { Write-Host ('install: this server has no Windows build of the suite. Put the name of what to install after the line: ' + ($known -join ', ') + '.') -ForegroundColor Red return } } $tmp = Join-Path ([IO.Path]::GetTempPath()) ('auraoffice-' + [guid]::NewGuid().ToString('N')) New-Item -ItemType Directory -Path $tmp | Out-Null try { # Every installer is downloaded and checked before any of them runs, so a # bad download leaves nothing half installed. foreach ($b in $chosen) { $path = Join-Path $tmp $b.File Write-Host ('{0} {1}, {2}' -f $b.Name, $b.Version, $b.Size) Write-Host (' from ' + $b.Url) try { Invoke-WebRequest -Uri $b.Url -OutFile $path -UseBasicParsing } catch { Write-Host ('install: the download failed: ' + $_.Exception.Message) -ForegroundColor Red return } $got = (Get-FileHash -Path $path -Algorithm SHA256).Hash.ToLower() if ($got -ne $b.Sha256) { Write-Host ('install: ' + $b.File + ' does not match its checksum, so nothing is being installed.') -ForegroundColor Red Write-Host (' expected ' + $b.Sha256) Write-Host (' got ' + $got) Write-Host ' Try again; if it happens twice, say so instead of working around it.' return } Write-Host ' checksum matches' } Write-Host '' foreach ($b in $chosen) { Write-Host ('Installing {0} {1}' -f $b.Name, $b.Version) # Silent, and for the current user, so nothing asks for anything. $run = Start-Process -FilePath (Join-Path $tmp $b.File) -ArgumentList $b.Args -Wait -PassThru if ($run.ExitCode -ne 0) { Write-Host ('install: the {0} installer stopped with code {1}.' -f $b.Name, $run.ExitCode) -ForegroundColor Red return } } } finally { Remove-Item -LiteralPath $tmp -Recurse -Force -ErrorAction SilentlyContinue } # What Windows now lists, which is the installer's own record and not this # script's hope. Inno Setup lists an application as " version ", # with the name as its installer spells it; -eq and -like ignore case. Write-Host '' Write-Host 'Installed:' $listed = @(Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue) foreach ($b in $chosen) { $entry = $listed | Where-Object { $_.DisplayName -eq $b.Name -or $_.DisplayName -like ($b.Name + ' version *') } | Select-Object -First 1 if ($entry) { # The installer writes the folder with quotes round it. $where = ([string]$entry.InstallLocation).Trim('"') if (-not $where -and $entry.UninstallString) { $where = Split-Path -Parent (([string]$entry.UninstallString).Trim('"')) } Write-Host (' {0} {1}, in {2}' -f $b.Name, $entry.DisplayVersion, $where) } else { Write-Host (' {0}: the installer finished, and Windows does not list it as installed for you.' -f $b.Name) -ForegroundColor Yellow } } Write-Host '' Write-Host 'Open them from the Start menu.' } Install-AuraOffice @args