From 3d87e0d250e69ff3891117f57fb6f35f2da24c2a Mon Sep 17 00:00:00 2001 From: Barret Rennie Date: Thu, 24 Jun 2021 20:01:39 -0400 Subject: [PATCH] Add management scripts --- README.md | 20 ++++ contrib/Deploy.ps1 | 105 +++++++++++++++++ contrib/README.md | 8 +- contrib/deployment/Profile.ps1 | 82 +++++++++++++ contrib/deployment/README.md | 22 ++++ .../fxrecord.toml | 0 .../fxrecord.toml | 0 .../FxRecord-Management.psm1 | 86 ++++++++++++++ contrib/deployment/scripts/README.md | 13 +++ .../scripts/fxrecorder/Disable-FxRecorder.ps1 | 40 +++++++ .../scripts/fxrecorder/Enable-FxRecorder.ps1 | 13 +++ .../scripts/fxrecorder/Install-FxRecorder.ps1 | 110 ++++++++++++++++++ .../fxrecorder/Screenshot-FxRunner.ps1 | 22 ++++ .../scripts/fxrecorder/Update-FxRecorder.ps1 | 17 +++ .../scripts/fxrunner/Disable-FxRunner.ps1 | 18 +++ .../scripts/fxrunner/Enable-FxRunner.ps1 | 19 +++ .../scripts/fxrunner/Install-FxRunner.ps1 | 81 +++++++++++++ requirements.txt | 8 ++ 18 files changed, 662 insertions(+), 2 deletions(-) create mode 100644 contrib/Deploy.ps1 create mode 100644 contrib/deployment/Profile.ps1 create mode 100644 contrib/deployment/README.md rename contrib/{ => deployment}/config/fxrecorder01.corp.tor1.mozilla.com/fxrecord.toml (100%) rename contrib/{ => deployment}/config/fxrunner01.corp.tor1.mozilla.com/fxrecord.toml (100%) create mode 100644 contrib/deployment/modules/FxRecord-Management/FxRecord-Management.psm1 create mode 100644 contrib/deployment/scripts/README.md create mode 100644 contrib/deployment/scripts/fxrecorder/Disable-FxRecorder.ps1 create mode 100644 contrib/deployment/scripts/fxrecorder/Enable-FxRecorder.ps1 create mode 100644 contrib/deployment/scripts/fxrecorder/Install-FxRecorder.ps1 create mode 100644 contrib/deployment/scripts/fxrecorder/Screenshot-FxRunner.ps1 create mode 100644 contrib/deployment/scripts/fxrecorder/Update-FxRecorder.ps1 create mode 100644 contrib/deployment/scripts/fxrunner/Disable-FxRunner.ps1 create mode 100644 contrib/deployment/scripts/fxrunner/Enable-FxRunner.ps1 create mode 100644 contrib/deployment/scripts/fxrunner/Install-FxRunner.ps1 create mode 100644 requirements.txt diff --git a/README.md b/README.md index cf15aea..48581bf 100644 --- a/README.md +++ b/README.md @@ -114,3 +114,23 @@ cargo test -p integration-tests -- --nocapture --test-threads 1 ``` to force unit tests to run sequentially. + +## Deployment + +Deployment is done with the `Deploy.ps1` script. + +Example: + +```ps1 +# Deploy fxrecorder the host-specific configuration. +.\contrib\Deploy.ps1 ` + -HostName fxrecorder01.corp.tor1.mozilla.com ` + -UserName fxrecord ` + -MachineType recorder + +# Deploy fxrunner and the host-specific configuration. +.\contrib\Deploy.ps1 ` + -HostName fxrunner01.corp.tor1.mozilla.com ` + -UserName fxrunner ` + -MachineType runner +``` diff --git a/contrib/Deploy.ps1 b/contrib/Deploy.ps1 new file mode 100644 index 0000000..bdccaff --- /dev/null +++ b/contrib/Deploy.ps1 @@ -0,0 +1,105 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Deploy to the given machine. + + .Description + Deploy the appropriate binaries and management scripts to the given machine. + + SSH is required to be enabled and set up correctly for PowerShell + sessions. See Scripts/Enable-SSH.ps1. +#> + +param( + [Parameter(Mandatory = $true)] + [string]$HostName, + + [Parameter(Mandatory = $true)] + [ValidateSet("runner", "recorder")] + [string]$MachineType, + + [Parameter(Mandatory = $true)] + [string]$UserName +) + +# Exit script on error. +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" +$PSDefaultParameterValues["*:ErrorAction"] = "Stop" + +# Ensure we are executing from the repository root. +Set-Location (Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Definition)) + +$session = New-PSSession -UserName $UserName $HostName + +try { + # Compute paths for PowerShell directories on the remote host. + $remotePaths = Invoke-Command -Session $session -ScriptBlock { + $paths = @{} + $paths.PowerShell = Join-Path $home "Documents" "PowerShell" + $paths.Scripts = Join-Path $paths.PowerShell "Scripts" + $paths.Modules = Join-Path $paths.PowerShell "Modules" + + New-Item -ItemType Directory -Path $paths.Scripts -Force > $null + + $paths + } + + Push-Location contrib\deployment + + # Copy management scripts to the machine. + Write-Host Copying Profile.ps1... + Copy-Item -Force -Path Profile.ps1 -ToSession $session -Destination $remotePaths.PowerShell + + Write-Host Copying PowerShell Modules... + Copy-Item -Recurse -Force -Path Modules -ToSession $session -Destination $remotePaths.Modules + + Write-Host Copying PowerShell scripts... + if ($MachineType -eq "runner") { + Copy-Item -Force -Path Scripts\fxrunner\*.ps1 -ToSession $session -Destination $remotePaths.Scripts + } + else { + Copy-Item -Force -Path Scripts\fxrecorder\*.ps1 -ToSession $session -Destination $remotePaths.Scripts + } + + Write-Host Copying configuration... + + $configFile = "contrib\config\${HostName}\fxrecord.toml" + if (Test-File $configFile) { + + if ($MachineType -eq "runner") { + Copy-Item -Force -Path $configFile -ToSession $session -Destination C:\fxrunner\ + } + else { + Copy-Item -Force -Path $configFile -ToSession $session -Destination C:\fxrecorder\ + } + } + else { + Write-Host No configuration found for host ${HostName}, skipping... + } + + Pop-Location + + # Build fxrecord and deploy the exectuable. + Write-Host Building fxrecord... + cargo build --release + + Write-Host Copying binaries... + + if ($MachineType -eq "runner") { + New-Item C:\fxrunner -ItemType Directory -Force > $null + Copy-Item -Force -Path target\release\fxrunner.exe -ToSession $session -Destination C:\fxrunner + } + else { + New-Item C:\fxrecorder -ItemType Directory -Force > $null + Copy-Item -Force -Path target\release\fxrecorder.exe -ToSession $session -Destination C:\fxrecorder + Copy-Item -Force -Path vendor -ToSession $session -Destination C:\fxrecorder + Copy-Item -Force -Path requirements.txt -ToSession $session -Destination C:\fxrecorder + } + +} +finally { + Remove-PSSession $session +} diff --git a/contrib/README.md b/contrib/README.md index e255028..748f65a 100644 --- a/contrib/README.md +++ b/contrib/README.md @@ -4,6 +4,10 @@ This folder contains configuration and management scripts. ## Contents -### config/ +### deployment/ -Configuration files for fxrecord deployments. +Management scripts and configuration for fxrecord deployments. + +### Deploy.ps1 + +The deployment script. diff --git a/contrib/deployment/Profile.ps1 b/contrib/deployment/Profile.ps1 new file mode 100644 index 0000000..ddd6fdd --- /dev/null +++ b/contrib/deployment/Profile.ps1 @@ -0,0 +1,82 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +$scriptDir = Join-Path (Split-Path -Parent $MyInvocation.MyCommand.Path) "Scripts" +$env:path += ";$scriptDir" + +function Get-ShortCWD() { + $pathAsString = ([string] $executionContext.SessionState.Path.CurrentLocation) + + if ($pathAsString.StartsWith($HOME)) { + if ($pathAsString.Length -eq $HOME.Length) { + return "~" + } + + $components = @("~") + $restPath = $pathAsString.Substring($HOME.Length + 1) + } + else { + $components = @($pathASString.Substring(0, 2)) + $restPath = $pathAsString.Substring(3) # Skip the prefix AND the trailing slash + } + + $components += $restPath.split("\") + + if ($components.Length -gt 2) { + foreach ($i in 1..($components.Length - 2)) { + $components[$i] = $components[$i][0] + } + } + + $components -join "\" +} + +function prompt() { + $lastCmdSuccess = $global:? + $statusCode = $global:LASTEXITCODE + + if ($null -ne $env:VIRTUAL_ENV) { + $envName = Split-Path -Leaf $env:VIRTUAL_ENV + Write-Host -NoNewline "(" + Write-Host -NoNewline -ForegroundColor red $envName + Write-Host -NoNewline ") " + } + + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $principal = [Security.Principal.WindowsPrincipal] $identity + $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator + + if ($principal.IsInRole($adminRole)) { + $sigil = "#" + $prefixColour = "red" + } + else { + $sigil = "$" + $prefixColour = "green" + } + + $hostname, $username = $identity.Name.split("\") + + Write-Host -NoNewline -ForegroundColor $prefixColour $username + Write-Host -NoNewline "@" + Write-Host -NoNewline -ForegroundColor $prefixColour $hostname + Write-Host -NoNewline " " + Write-Host -NoNewline -ForegroundColor blue (Get-ShortCWD) + Write-Host -NoNewline " " + + if (!$lastCmdSuccess) { + if ($null -eq $statusCode) { + $statusCode = "!" + } + + Write-Host -NoNewline -ForegroundColor red "[$statusCode] " + } + + + Write-Host -NoNewline $sigil + + " " +} + +Set-PSReadLineOption -EditMode Emacs -BellStyle None +Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete diff --git a/contrib/deployment/README.md b/contrib/deployment/README.md new file mode 100644 index 0000000..863a4b4 --- /dev/null +++ b/contrib/deployment/README.md @@ -0,0 +1,22 @@ +# contrib/management + +This folder contains management scripts for adminstering fxrecord deployments. + +## Contents + +### config\ + +Per-instance configuration files for fxrecord deployments. + +### modules\ + +PowerShell modules for adminstering fxrecord deployments. + +### scripts\ + +PowerShell scripts for administering fxrecord deployments. + +### Profile.ps1 + +A PowerShell profile with basic utilities. + diff --git a/contrib/config/fxrecorder01.corp.tor1.mozilla.com/fxrecord.toml b/contrib/deployment/config/fxrecorder01.corp.tor1.mozilla.com/fxrecord.toml similarity index 100% rename from contrib/config/fxrecorder01.corp.tor1.mozilla.com/fxrecord.toml rename to contrib/deployment/config/fxrecorder01.corp.tor1.mozilla.com/fxrecord.toml diff --git a/contrib/config/fxrunner01.corp.tor1.mozilla.com/fxrecord.toml b/contrib/deployment/config/fxrunner01.corp.tor1.mozilla.com/fxrecord.toml similarity index 100% rename from contrib/config/fxrunner01.corp.tor1.mozilla.com/fxrecord.toml rename to contrib/deployment/config/fxrunner01.corp.tor1.mozilla.com/fxrecord.toml diff --git a/contrib/deployment/modules/FxRecord-Management/FxRecord-Management.psm1 b/contrib/deployment/modules/FxRecord-Management/FxRecord-Management.psm1 new file mode 100644 index 0000000..c8567a3 --- /dev/null +++ b/contrib/deployment/modules/FxRecord-Management/FxRecord-Management.psm1 @@ -0,0 +1,86 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +function Get-UserSessions { + <# + .Synopsis + Return all active user sessions + .Outputs + An array of user session objects. + #> + + # Sample output of quser: + # ``` + # USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME + # >fxrecorder rdp-tcp#7 5 Active . 2021-06-11 6:06 PM + # ``` + + $output = quser 2>&1 <# Query all user sessions #> ` + + if ($global:LASTEXITCODE -eq 1) { + return @() + } + + return $output | + Select-Object -Skip 1 | <# Strip off the leading column names #> ` + Foreach-Object { $_.substring(1) } | <# Strip off the leading character (> or space) #>` + ConvertFrom-String -PropertyNames @("UserName", "SessionName", "Id", "State", "IdleTime", "LoginTime") +} + +function Read-TOML { + <# + .Synopsis + Read a TOML file into a table. Does not support nested objects. + + .Outputs + A hashtable parsed from the the TOML file. + #> + + param ( + [Parameter(Mandatory = $true)] + [string]$FileName + ) + + $toml = @{} + $section = "" + + switch -regex -file $FileName { + "^\[(.+)\]$" { + $section = $matches[1] + $toml[$section] = @{} + } + + "\s*(.+?)\s*=\s*(.+)" { + $name, $value = $matches[1..2] + + # Unquote string values + if (($value[0] -eq '"') -and ($value[-1] -eq '"')) { + $value = $value.Substring(1, $value.Length - 2) + } + + $toml[$section][$name] = $value + } + } + + $toml +} + +function Test-AdminRole { + <# + .Synopsis + Check if the user is in an administrator role. + #> + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $principal = [Security.Principal.WindowsPrincipal] $identity + $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator + + if (!$principal.IsInRole($adminRole)) { + Write-Host -ForegroundColor Red "$($MyInvocation.ScriptName): Admin required" + exit 1 + } + +} + +Export-ModuleMember Get-UserSessions +Export-ModuleMember Read-TOML +Export-ModuleMember Test-AdminRole diff --git a/contrib/deployment/scripts/README.md b/contrib/deployment/scripts/README.md new file mode 100644 index 0000000..96a797d --- /dev/null +++ b/contrib/deployment/scripts/README.md @@ -0,0 +1,13 @@ +# Scripts/ + +Management scripts for fxrecord. + +## Contents + +### fxrecorder/ + +Management scripts to be installed on a FxRecorder machine by [`Deploy.ps1`][../Deploy.Ps1]. + +### fxrunner/ + +Management scripts to be installed on a FxRunner machine by [`Deploy.ps1`][../Deploy.Ps1]. diff --git a/contrib/deployment/scripts/fxrecorder/Disable-FxRecorder.ps1 b/contrib/deployment/scripts/fxrecorder/Disable-FxRecorder.ps1 new file mode 100644 index 0000000..94295f4 --- /dev/null +++ b/contrib/deployment/scripts/fxrecorder/Disable-FxRecorder.ps1 @@ -0,0 +1,40 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Stop and disable fxrecorder. + + .Description + Stop and disable the Taskcluster generic worker service so the host can + undergo maintenance. + + Any active task users will be logged off and their processes terminated. + + Home directories are not removed. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +$WINLOGON_KEY = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" + +Set-Service -Name "Generic Worker" -StartupType Disabled -Status Stopped + +# Prevent auto-login on next restart. +Remove-Item -Force "C:\generic-worker\next-task-user.json" -ErrorAction Ignore +Remove-ItemProperty $WINLOGON_KEY -Name "DefaultUserName" -ErrorAction Ignore +Remove-ItemProperty $WINLOGON_KEY -Name "DefaultPassword" -ErrorAction Ignore + +# Log off existing task users and kill any remaining processes +foreach ($session in (Get-UserSessions | Where-Object { $_.UserName -like "task_*" })) { + logoff $session.Id +} + +# Kill any remaining task processes. +Get-Process -IncludeUserName | Where-Object { $_.Username -like "task_*" } | Stop-Process + +# Delete any task users. +$taskUsers = Get-LocalUser | Where-Object { $_.Name -like "task_*" } +Remove-LocalUser $taskUsers diff --git a/contrib/deployment/scripts/fxrecorder/Enable-FxRecorder.ps1 b/contrib/deployment/scripts/fxrecorder/Enable-FxRecorder.ps1 new file mode 100644 index 0000000..e83edec --- /dev/null +++ b/contrib/deployment/scripts/fxrecorder/Enable-FxRecorder.ps1 @@ -0,0 +1,13 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Start and enable the fxrecorder worker. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +Set-Service -Name "Generic Worker" -StartupType Automatic -Status Running diff --git a/contrib/deployment/scripts/fxrecorder/Install-FxRecorder.ps1 b/contrib/deployment/scripts/fxrecorder/Install-FxRecorder.ps1 new file mode 100644 index 0000000..d2e2249 --- /dev/null +++ b/contrib/deployment/scripts/fxrecorder/Install-FxRecorder.ps1 @@ -0,0 +1,110 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Set up this machine to be an fxrecorder host. + + .Description + This will install most dependencies. It currently does not install + ImageMagick or ffmpeg. See the installation documenation for details. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +$TASKCLUSTER_VERSION = "v44.0.0" +$NSSM_VERSION = "2.24" +$PYTHON_VERSION = "3.9.5" + +Set-ExecutionPolicy Unrestricted -Force -Scope Process + +$webClient = [System.Net.WebClient]::new() + +$webClient.DownloadFile("https://www.nssm.cc/release/nssm-${NSSM_VERSION}.zip", "C:\nssm.zip") +Expand-Archive -LiteralPath C:\nssm.zip -DestinationPath C:\ +Rename-Item C:\nssm-2.24 c:\nssm +Remove-Item c:\nssm-2.24.zip +$nssm = "C:\nssm\win64\nssm.exe" + +# Install generic-worker and its dependencies. +New-Item -ItemType Directory C:\generic-worker + +$genericWorker = "C:\generic-worker\generic-worker.exe" +$livelog = "C:\generic-worker\livelog.exe" +$taskclusterProxy = "C:\generic-worker\taskcluster-proxy.exe" + +$webClient.DownloadFile( + "https://github.com/taskcluster/taskcluster/releases/download/v${TASKCLUSTER_VERSION}/generic-worker-multiuser-windows-amd64", + $genericWorker) + +$webClient.DownloadFile( + "https://github.com/taskcluster/taskcluster/releases/download/v${TASKCLUSTER_VERSION}/livelog-windows-amd64", + $livelog) + +$webClient.DownloadFile( + "https://github.com/taskcluster/taskcluster/releases/download/v${TASKCLUSTER_VERSION}/taskcluster-proxy-windows-amd64", + $taskclusterProxy) + +$SIGNING_KEY = C:\generic-worker\generic-worker-ed25519-signing-key.key +$CONFIG_FILE = C:\generic-worker\generic-worker-config.json + +# Generate a keypair for signing artifacts. +& $genericWorker new-ed25519-keypair --file $SIGNING_KEY + +$accessToken = Read-Host "Access Token" +$clientId = Read-Host "Client ID" +$workerId = Read-Host "Worker ID" + +Set-Content -Path $CONFIG_FILE @" +{ + "accessToken": "$accessToken", + "clientId": "$clientId", + "cleanUpTaskDirs": true, + "ed25519SigningKeyLocation": "$SIGNING_KEY", + "workerId": "$workerId", + "provisionerId": "performance-hardware", + "workerType": "gecko-t-fxrecorder", + "rootURL": "https://firefox-ci-tc.services.mozilla.com", + "shutdownMachineOnIdle": false, + "shutdownMachineOnError": false, + "livelogExecutable": "$($livelog.Replace("\", "\\"))", + "taskclusterProxyExecutable": "$($taskclusterProxy.Replace("\", "\\"))", + "wstAudience": "firefoxcitc", + "wstServerURL": "https://firefoxci-websocktunnel.services.mozilla.com/" +} +"@ + +# Install the generic worker service. +& $nssm install "Generic Worker" c:\generic-worker\generic-worker.exe +& $nssm set "Generic Worker" AppParameters run --config $CONFIG_FILE +& $nssm set "Generic Worker" DisplayName "Generic Worker" +& $nssm set "Generic Worker" Description "Taskcluster worker" +& $nssm set "Generic Worker" Start SERVICE_AUTO_START +& $nssm set "Generic Worker" Type SERVICE_WIN32_OWN_PROCESS +& $nssm set "Generic Worker" AppNoConsole 1 +& $nssm set "Generic Worker" AppAffinity All +& $nssm set "Generic Worker" AppStopMethodSkip 0 +& $nssm set "Generic Worker" AppExit Default Exit +& $nssm set "Generic Worker" AppRestartDelay 0 +& $nssm set "Generic Worker" AppStdout C:\generic-worker\generic-worker-service.log +& $nssm set "Generic Worker" AppStderr c:\generic-worker\generic-worker-service.log +& $nssm set "Generic Worker" AppRotateFiles 1 +& $nssm set "Generic Worker" AppRotateSeconds 3600 +& $nssm set "Generic Worker" AppRotateBytes 0 + +# Download and install Python +$pyInstaller = "C:\python-installer.exe" +$pythonDir = "C:\python-${PYTHON_VERSION}" + +$webClient.DownloadFile("https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-amd64.exe", $pyInstaller) +& $pyInstaller /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 TargetDir=$pythonDir +Remove-Item $pyInstaller + +# Install Python dependencies. +# C:\fxrecorder\requirements.txt is deployed by Deploy.ps1 + +$env:PATH += ";${pythonDir}" +python -m pip install -U pip wheel +python -m pip install --require-hashes -r C:\fxrecorder\requirements.txt diff --git a/contrib/deployment/scripts/fxrecorder/Screenshot-FxRunner.ps1 b/contrib/deployment/scripts/fxrecorder/Screenshot-FxRunner.ps1 new file mode 100644 index 0000000..a190263 --- /dev/null +++ b/contrib/deployment/scripts/fxrecorder/Screenshot-FxRunner.ps1 @@ -0,0 +1,22 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Take a screenshot of the configured fxrunner machine. +#> + +param( + [string]$ConfigPath = "C:\fxrecorder\fxrecord.toml" +) + +Import-Module FxRecord-Management + +$config = Read-TOML $ConfigPath + +ffmpeg ` + -hide_banner ` + -f dshow ` + -i "video=$($config["fxrecorder.recording"]["device"])" ` + -vframes 1 ` + screenshot.jpg diff --git a/contrib/deployment/scripts/fxrecorder/Update-FxRecorder.ps1 b/contrib/deployment/scripts/fxrecorder/Update-FxRecorder.ps1 new file mode 100644 index 0000000..355b248 --- /dev/null +++ b/contrib/deployment/scripts/fxrecorder/Update-FxRecorder.ps1 @@ -0,0 +1,17 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Update FxRecorder after a deploy. + + .Description + This will ensure the Python dependencies are kept up-to-date. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +python -m pip install -U pip wheel +python -m pip install --require-hashes -r C:\fxrecorder\requirements.txt diff --git a/contrib/deployment/scripts/fxrunner/Disable-FxRunner.ps1 b/contrib/deployment/scripts/fxrunner/Disable-FxRunner.ps1 new file mode 100644 index 0000000..85012b1 --- /dev/null +++ b/contrib/deployment/scripts/fxrunner/Disable-FxRunner.ps1 @@ -0,0 +1,18 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Stop and disable fxrunner + + .Description + Stop and disable the fxrunner scheduled task so the machine can undero maintenance. + undergo maintenance. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +Disable-ScheduledTask -TaskPath \fxrecord\ -TaskName fxrunner +Stop-ScheduledTask -TaskPath \fxrecord\ -TaskName fxrunner diff --git a/contrib/deployment/scripts/fxrunner/Enable-FxRunner.ps1 b/contrib/deployment/scripts/fxrunner/Enable-FxRunner.ps1 new file mode 100644 index 0000000..e069126 --- /dev/null +++ b/contrib/deployment/scripts/fxrunner/Enable-FxRunner.ps1 @@ -0,0 +1,19 @@ + +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Enable and start fxrunner. + + + .Description + Enable and start the fxrunner scheduled task so the machine can undero maintenance. + undergo maintenance. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +Enable-ScheduledTask -TaskPath \fxrecord\ -TaskName fxrunner +Start-ScheduledTask -TaskPath \fxrecord\ -TaskName fxrunner diff --git a/contrib/deployment/scripts/fxrunner/Install-FxRunner.ps1 b/contrib/deployment/scripts/fxrunner/Install-FxRunner.ps1 new file mode 100644 index 0000000..3747ca8 --- /dev/null +++ b/contrib/deployment/scripts/fxrunner/Install-FxRunner.ps1 @@ -0,0 +1,81 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +<# + .Synopsis + Set up this machine to be an fxrunner host. +#> + +Import-Module FxRecord-Management + +Test-AdminRole + +$WINLOGON_KEY = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" + +$credentials = Get-Credential $env:USERNAME + +Set-ItemProperty ` + -Path $WINLOGON_KEY ` + -Name "DefaultUserName" ` + -Type String ` + -Value $credentials.UserName + +Set-ItemProperty ` + -Path $WINLOGON_KEY ` + -Name "DefaultPassword" ` + -Type String ` + -Value (ConvertFrom-SecureString -AsPlainText $credentials.Password) + +Set-ItemProperty ` + -Path $WINLOGON_KEY ` + -Name "AutoAdminLogon" ` + -Type Dword ` + -Value 1 + +New-Item -ItemType Directory -Path C:\fxrunner + +$action = New-ScheduledTaskAction ` + -Execute "C:\fxrunner\fxrunner.exe" ` + -WorkingDirectory "C:\fxrunner" + +$trigger = New-ScheduledTaskTrigger ` + -AtLogon ` + -User $env:USERNAME + +$principal = New-ScheduledTaskPrincipal $env:USERNAME + +$settings = New-ScheduledTaskSettingsSet ` + -ExecutionTimelimit (New-TimeSpan) <# Do not impose a time limit on execution (default 3d) #> + +$task = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings + +Register-ScheduledTask -TaskPath "\fxrecord\" -TaskName fxrunner -InputObject $task + +# Enable legacy IO counters +diskperf -Y + +# Disable services that impact performance or are not required. + +# Disable "SysMain" (superfetch) +Set-Service -Name SysMain -StartupType Disabled -Status Stopped + +# Disable "Synaptics Touchpad Enhanced Service" +# We ignore errors in case the reference hardware does not have this service. +Set-Service -Name SynTPEnhService -StartupDype Disabled -Status -Stopped -ErrorAction Ignore + +# Disable "Connected User Experiences and Telemetry" +Set-Service -Name DiagTrack -StartupType Disabled -Status Stopped + +# Disable "Touch Keyboard and Handwriting Panel Service" +Set-Service -Name TabletInputService -StartupType Disabled -Status Stopped + +# Disable "Windows Search" +Set-Service -Name WSearch -StartupType Disabled -Status Stopped + +# Disable "Print Spooler" +Set-Service -Name Spooler -StartupType Disabled -Status Stopped + +# Disable "Microsoft Compatability Appraiser" +Disable-ScheduledTask ` + -TaskPath "\Microsoft\Windows\Application Experience\" ` + -TaskName "Microsoft Compatibility Appraiser" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9f1afb5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +pyssim==0.4 \ + --hash=sha256:52184c85e6ed0362a508617497c70251837ab38a62531793e3ea7eeaf7a2e150 +Pillow==8.2.0 \ + --hash=sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c +scipy==1.7.0 \ + --hash=sha256:aef6e922aea6f2e6bbb539b413c85210a9ee32757535b84204ebd22723e69704 +numpy==1.21.0 \ + --hash=sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e