# AuraOffice 0.6.1 for Windows x64 # # irm https://www.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://www.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.6.1'; File = 'AuraBase_0.6.1_r14_x64-setup.exe'; Size = '4.2 MB'; Sha256 = '3b1b119a5da8a7e2748b8c228b624929a7f0a912aa47a8930a0f20e26202a495'; Url = 'https://www.auraoffice.org/releases/AuraBase_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'cite'; Name = 'Cite'; Version = '0.6.1'; File = 'AuraCite_0.6.1_r14_x64-setup.exe'; Size = '5.1 MB'; Sha256 = 'f8dc4fadeb5a70c0706e3618491a4f69fdba6d131ac9f13f222c389ade0eb679'; Url = 'https://www.auraoffice.org/releases/AuraCite_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'deck'; Name = 'Deck'; Version = '0.6.8'; File = 'AuraDeck_0.6.8_r14_x64-setup.exe'; Size = '5.4 MB'; Sha256 = 'd61c6fdf72ca86dba245274079f2e30a50316f2494c36ebffafbc683d57590b1'; Url = 'https://www.auraoffice.org/releases/AuraDeck_0.6.8_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'folio'; Name = 'Folio'; Version = '0.6.1'; File = 'AuraFolio_0.6.1_r14_x64-setup.exe'; Size = '6.5 MB'; Sha256 = 'ac0caba6af9e21b004a27c738608d6283108f1c9b1514b4b628d5c080938bf51'; Url = 'https://www.auraoffice.org/releases/AuraFolio_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'hub'; Name = 'AuraOffice Hub'; Version = '0.6.1'; File = 'AuraOffice Hub_0.6.1_r14_x64-setup.exe'; Size = '3.3 MB'; Sha256 = '125facf967f3cb0d6995f4641dfedd6b43b490245cfd46aaa9f9d3e607637381'; Url = 'https://www.auraoffice.org/releases/AuraOffice Hub_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'mail'; Name = 'Mail'; Version = '0.6.1'; File = 'AuraMail_0.6.1_r14_x64-setup.exe'; Size = '5.2 MB'; Sha256 = 'be81f26dee8c69e246ad1dab4758fe10026170066dc121d92546dc66901d4be2'; Url = 'https://www.auraoffice.org/releases/AuraMail_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'md'; Name = 'MD'; Version = '0.6.1'; File = 'AuraMD_0.6.1_r14_x64-setup.exe'; Size = '3.8 MB'; Sha256 = '1a88b4187e70096acf38546317618e14a9e7e91edb780bbf648e4cc4e2690dd5'; Url = 'https://www.auraoffice.org/releases/AuraMD_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'page'; Name = 'Page'; Version = '0.6.1'; File = 'AuraPage_0.6.1_r14_x64-setup.exe'; Size = '7.1 MB'; Sha256 = 'b23d159ed0094f34f00d2375af62ede7b8b29c95c6d59861dbffe0c1a4cd3403'; Url = 'https://www.auraoffice.org/releases/AuraPage_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'sheet'; Name = 'Sheet'; Version = '0.6.1'; File = 'AuraSheet_0.6.1_r14_x64-setup.exe'; Size = '4.3 MB'; Sha256 = 'c411c865a03a94740e0b5cfe15280caa343a4fddb8a398ed2b9e07700f055bbf'; Url = 'https://www.auraoffice.org/releases/AuraSheet_0.6.1_r14_x64-setup.exe'; Args = '/S'; Default = $true } [pscustomobject]@{ App = 'track'; Name = 'Track'; Version = '0.6.0'; File = 'AuraTrack_0.6.0_r14_x64-setup.exe'; Size = '3.7 MB'; Sha256 = '8332cd723b444f2dafa8b54f4e099a58f9fb021fa3dfde8e085c51b93f45ea94'; Url = 'https://www.auraoffice.org/releases/AuraTrack_0.6.0_r14_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://www.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://www.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