70 lines
4.0 KiB
PowerShell
70 lines
4.0 KiB
PowerShell
#requires -Version 5.1
|
|
<#
|
|
.SYNOPSIS
|
|
Fragt nach und richtet optional die taeglichen Scoop-Auto-Updates ein.
|
|
.DESCRIPTION
|
|
Eigenstaendig ausfuehrbar, ohne Bucket-Migration. Bei y wird auto-update.ps1
|
|
heruntergeladen und eine Aufgabe fuer taeglich 03:00 Uhr erstellt.
|
|
Die Aufgabe startet das Updateskript verborgen und holt verpasste Termine nach,
|
|
sobald die Benutzersitzung und eine Netzwerkverbindung verfuegbar sind.
|
|
Bei n wird nichts eingerichtet; bestehende Aufgaben bleiben unveraendert.
|
|
.EXAMPLE
|
|
.\scripts\setup-auto-update.ps1
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[string] $ScoopRoot = $(if ($env:SCOOP) { $env:SCOOP } else { Join-Path $env:USERPROFILE 'scoop' })
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
$ScoopRoot = [IO.Path]::GetFullPath($ScoopRoot)
|
|
$repository = 'https://gitea.medelexis.ch/public/scoop'
|
|
|
|
do {
|
|
$autoUpdateAnswer = (Read-Host 'Scoop Auto-Update einschalten? [y/n]').Trim().ToLowerInvariant()
|
|
} while ($autoUpdateAnswer -notin @('y', 'n'))
|
|
|
|
if ($autoUpdateAnswer -eq 'y') {
|
|
$scoopCommand = Join-Path $ScoopRoot 'shims\scoop.ps1'
|
|
if (-not (Test-Path -LiteralPath $scoopCommand -PathType Leaf)) {
|
|
throw "Scoop wurde nicht gefunden: $scoopCommand"
|
|
}
|
|
$autoUpdateDirectory = Join-Path $ScoopRoot 'scripts\medelexis'
|
|
New-Item -ItemType Directory -Path $autoUpdateDirectory -Force | Out-Null
|
|
$autoUpdateScript = Join-Path $autoUpdateDirectory 'auto-update.ps1'
|
|
$downloadPath = Join-Path $autoUpdateDirectory ('auto-update-{0}.download' -f [guid]::NewGuid())
|
|
try {
|
|
$autoUpdateUrl = "$repository/raw/branch/master/scripts/auto-update.ps1"
|
|
Invoke-WebRequest -Uri $autoUpdateUrl -OutFile $downloadPath -UseBasicParsing
|
|
$parseTokens = $null
|
|
$parseErrors = $null
|
|
$downloadedScript = [Management.Automation.Language.Parser]::ParseFile($downloadPath, [ref] $parseTokens, [ref] $parseErrors)
|
|
if ($parseErrors.Count -gt 0 -or -not $downloadedScript.ParamBlock -or
|
|
'ScoopRoot' -notin @($downloadedScript.ParamBlock.Parameters.Name.VariablePath.UserPath)) {
|
|
throw 'Das heruntergeladene Auto-Update-Skript ist kein gueltiges Updateskript.'
|
|
}
|
|
Move-Item -LiteralPath $downloadPath -Destination $autoUpdateScript -Force
|
|
# Nur die Aufgabe einrichten; das Updateskript wird durch die Aufgabe gestartet.
|
|
$userId = [Security.Principal.WindowsIdentity]::GetCurrent().Name
|
|
$userSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
|
$taskName = "Medelexis-Scoop-AutoUpdate-$userSid"
|
|
$powershell = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
|
|
$arguments = '-NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "{0}" -ScoopRoot "{1}"' -f $autoUpdateScript, $ScoopRoot
|
|
$action = New-ScheduledTaskAction -Execute $powershell -Argument $arguments
|
|
$trigger = New-ScheduledTaskTrigger -Daily -At '03:00'
|
|
$principal = New-ScheduledTaskPrincipal -UserId $userId -LogonType Interactive -RunLevel Limited
|
|
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -RunOnlyIfNetworkAvailable `
|
|
-AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNew `
|
|
-ExecutionTimeLimit (New-TimeSpan -Hours 4)
|
|
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger `
|
|
-Principal $principal -Settings $settings -Force `
|
|
-Description 'Scoop taeglich um 03:00 aktualisieren; verpasste Termine nachholen; elexis* auf hold setzen.' | Out-Null
|
|
Write-Host "Scoop Auto-Update eingeschaltet: $taskName (taeglich 03:00, verpasste Termine nachholen)."
|
|
Write-Host "Ausfuehrung verborgen unter $userId, sobald der Benutzer angemeldet ist; kein Aufwecken des PCs."
|
|
} finally {
|
|
if (Test-Path -LiteralPath $downloadPath) { Remove-Item -LiteralPath $downloadPath }
|
|
}
|
|
} else {
|
|
Write-Host 'Auto-Update nicht eingerichtet. Eine eventuell bestehende Aufgabe bleibt unveraendert.'
|
|
}
|