scripts/taste-untester.ps1 (78 lines of code) (raw):
# Copyright 2020-present Facebook
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[CmdletBinding()]
param(
[switch]$dryrun
)
# keep these as *forward* slashes
$CONFLINK = 'C:/chef/client.rb'
$PRODCONF = 'C:/chef/client-prod.rb'
$CERTLINK = 'C:/chef/client.pem'
$PRODCERT = 'C:/chef/client-prod.pem'
$STAMPFILE = 'C:/chef/test_timestamp'
$MYSELF = $0
function log($msg) {
Write-EventLog -LogName "Application" -Source "taste-tester" `
-EventID 2 -EntryType Warning -Message $msg
}
function set_server_to_prod {
if (Test-Path $STAMPFILE) {
$content = Get-Content $STAMPFILE
if ($content -ne $null) {
kill $content -Force 2>$null
}
}
rm -Force $CONFLINK
New-Item -ItemType symboliclink -Force -Value $PRODCONF $CONFLINK
if (Test-Path $STAMPFILE) {
rm -Force $STAMPFILE
}
log "Reverted to production Chef."
}
function check_server {
# this is the only way to check if something is a symlink, apparently
if (-Not ((get-item $CONFLINK).Attributes.ToString() -match "ReparsePoint")) {
Write-Verbose "$CONFLINK is not a link..."
return
}
$current_config = (Get-Item $CONFLINK).target
if ($current_config -eq $PRODCONF) {
if (Test-Path $STAMPFILE) {
rm -Force $STAMPFILE
}
return
}
$revert = $false
if (-Not (Test-Path $STAMPFILE)) {
$revert = $true
} else {
$now = [int][double]::Parse(
$(Get-Date -date (Get-Date).ToUniversalTime()-uformat %s)
)
$stamp_time = Get-Date -Date `
(Get-Item $STAMPFILE).LastWriteTime.ToUniversalTime() -UFormat %s
Write-Verbose "$now vs $stamp_time"
if ($now -gt $stamp_time) {
$revert = $true
}
}
if ($revert) {
if ($dryrun) {
echo "DRYRUN: Would return server to prod"
} else {
set_server_to_prod
}
}
}
check_server