216 lines
9.1 KiB
PowerShell
216 lines
9.1 KiB
PowerShell
[CmdletBinding()]
|
|
param
|
|
(
|
|
[Parameter(Mandatory = $false)]
|
|
[object] $WebhookData
|
|
)
|
|
|
|
function Get-ITDVMwareSharePointSnapshotRequestList {
|
|
[CmdletBinding()]
|
|
Param
|
|
(
|
|
[PSCredential]
|
|
$Credential
|
|
)
|
|
|
|
begin {
|
|
$InvokeWebRequestParams = @{ }
|
|
If ($Credential) { $InvokeWebRequestParams += @{Credential = $Credential } }
|
|
Else { $InvokeWebRequestParams += @{UseDefaultCredentials = $true } }
|
|
|
|
$URL = "https://testshare.nd.gov/itd/Computer-Systems/Distributed-Systems/VMWare/_api/lists/getbytitle('VMware-Snapshots')/items" + '?$top=10000' + '&$select=ID,Title,DateTime,Duration,Author/Name,Author/Title,Author/EMail,Status,NotifyEmail&$expand=Author/Id'
|
|
$InvokeWebRequestParams += @{
|
|
Uri = $URL
|
|
Method = "Get"
|
|
Headers = @{ "Accept" = "application/json;odata=verbose" }
|
|
}
|
|
|
|
$List = (Invoke-WebRequest @InvokeWebRequestParams) -creplace '"Id":', '"Idx":' | ConvertFrom-Json
|
|
}
|
|
|
|
process {
|
|
|
|
}
|
|
|
|
end {
|
|
$List.d.results
|
|
}
|
|
}
|
|
|
|
If ($WebhookData) {
|
|
If ($WebhookData.RequestHeader.ITD -eq 'HAKpueFYU4L3NMXTKqtHssnNGBrew3gVRLEq2Yi7yzWW8fpKNCPB5gUcnHfr9sdhXC53y7gWf5BDtxXkr3mZA3NV7DszpR3kjiLgi3FpRPgUWus9ZxCWy63znqPGh3AJ2bn43uP7GjzfLcgqYLQRkir') {
|
|
Write-Verbose "Header has required data"
|
|
}
|
|
Else {
|
|
Write-Error "Header missing required data"
|
|
exit;
|
|
}
|
|
|
|
$InputParams = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
|
|
$vCenterCredential = Get-AutomationPSCredential -Name 'VMware Auto'
|
|
$SharePointCredential = Get-AutomationPSCredential -Name 'SharePoint IaaS ReadWrite'
|
|
|
|
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -ParticipateInCeip $false -Confirm:$false
|
|
|
|
$UrlContextInfo = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/contextinfo"
|
|
$InvokeWebRequestParams = @{
|
|
Uri = $UrlContextInfo;
|
|
Method = "Post";
|
|
UseBasicParsing = $true;
|
|
Credential = $SharePointCredential;
|
|
}
|
|
$RequestDigest = Invoke-RestMethod @InvokeWebRequestParams
|
|
$RequestDigest = $RequestDigest.GetContextWebInformation.FormDigestValue
|
|
|
|
$UrlList = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')"
|
|
$InvokeWebRequestParams = @{
|
|
Uri = $UrlList;
|
|
UseBasicParsing = $true;
|
|
Credential = $SharePointCredential;
|
|
}
|
|
$List2 = Invoke-RestMethod @InvokeWebRequestParams
|
|
$ListItemEntityTypeFullName = $list.entry.content.properties.ListItemEntityTypeFullName
|
|
|
|
$UrlListItem = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items" + '?$top=10000' + '&$select=ID,Title,DateTime,Duration,Author/Name,Author/Title,Author/EMail,NotifyEmail&$expand=Author/Id'
|
|
$InvokeWebRequestParams = @{
|
|
Uri = $UrlListItem;
|
|
Method = "Get";
|
|
UseBasicParsing = $true;
|
|
Headers = @{ "Accept" = "application/json;odata=verbose" };
|
|
Credential = $SharePointCredential
|
|
}
|
|
$ListItems = ((Invoke-WebRequest @InvokeWebRequestParams) -creplace '"Id":', '"Idx":' | ConvertFrom-Json).d.results
|
|
|
|
$header = @{
|
|
"accept" = "application/json;odata=verbose"
|
|
"X-RequestDigest" = $RequestDigest
|
|
"IF-MATCH" = '*'
|
|
"X-HTTP-Method" = "MERGE"
|
|
}
|
|
|
|
$SPListItem = $ListItems | Where-object Id -eq $InputParams.Id
|
|
If ($SPListItem.Title -ne $InputParams.HostName) {
|
|
Write-Error ("Web request JSON does not match SharePoint Record for SPListItem.Hostname " + $SPListItem.HostName + " and InputParams.Hostname " + $InputParams.Hostname)
|
|
Exit
|
|
}
|
|
|
|
$VMName = $InputParams.HostName
|
|
$SnapTime = ([DateTime]$SPListItem.DateTime).AddMinutes($Duration * 3)
|
|
|
|
$NotifyEmail = $SPListItem.Author.Email
|
|
If ($SPListItem.NotifyEmail) { $NotifyEmail = $NotifyEmail + ',' + $SPListItem.NotifyEmail }
|
|
|
|
$tryCount = 0
|
|
# while ($tryCount -lt 5) {
|
|
try {
|
|
$tryCount++
|
|
Write-Warning ("SharePoint: " + $SnapTime)
|
|
If ($SnapTime -lt (Get-Date)) {
|
|
$SnapTime = (Get-Date).AddSeconds(30)
|
|
}
|
|
Write-Warning ("PowerShell: " + $SnapTime)
|
|
|
|
$SnapName = "AutoSnap_" + $SPListItem.ID
|
|
$SnapExpireDateTime = $SnapTime.AddMinutes($SPListItem.Duration * 3)
|
|
$SnapDeleteDateTime = $SnapExpireDateTime.AddMinutes(30)
|
|
|
|
$SnapDescription = "AutoSnap_" + $InputParams.ID + "`r" + "AutoExpire_$SnapExpireDateTime" + "`r" + "AutoDelete_$SnapDeleteDateTime"
|
|
$snapMemory = $false
|
|
$snapQuiesce = $false
|
|
|
|
Connect-VIServer -Server itdvmvc1.nd.gov, itdvmvc2.nd.gov -Credential $vCenterCredential
|
|
|
|
$VM = Get-VM -Name $VMName | where-object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
|
If (@($VM).count -eq 2) { $VM = Get-VM -Name $VMName -Server ($global:DefaultVIServers | Sort-Object Name | Select-Object -First 1).Name }
|
|
|
|
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
|
|
|
$si = Get-View ServiceInstance -Server $VIServer
|
|
$scheduledTaskManager = Get-View $si.Content.ScheduledTaskManager -Server $VIServer
|
|
|
|
$spec = New-Object VMware.Vim.ScheduledTaskSpec
|
|
$spec.Name = $SnapName, $VMname -join '_'
|
|
$spec.Description = "$SnapDescription"
|
|
$spec.Enabled = $true
|
|
$spec.Notification = $NotifyEmail
|
|
|
|
$spec.Scheduler = New-Object VMware.Vim.OnceTaskScheduler
|
|
$spec.Scheduler.runat = $SnapTime
|
|
|
|
$spec.Action = New-Object VMware.Vim.MethodAction
|
|
$spec.Action.Name = "CreateSnapshot_Task"
|
|
|
|
@($SnapName, $SnapDescription, $SnapMemory, $SnapQuiesce) | ForEach-Object {
|
|
$arg = New-Object VMware.Vim.MethodActionArgument
|
|
$arg.Value = $_
|
|
$spec.Action.Argument += $arg
|
|
}
|
|
|
|
# prep for update SharePoint record status
|
|
$RecordToModify = $ListItems | Where-Object Id -eq $InputParams.Id
|
|
If (@($RecordToModify).count -gt 1) { Write-Error "More than one result, stopping"; Exit }
|
|
$IDtoModify = $RecordToModify.ID
|
|
|
|
$UrlItem = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items($IDtoModify)"
|
|
$InvokeWebRequestParams = @{
|
|
Uri = $UrlItem;
|
|
Method = "Get";
|
|
Headers = @{ "Accept" = "application/json;odata=verbose" }
|
|
UseBasicParsing = $true;
|
|
Credential = $SharePointCredential
|
|
}
|
|
If ($Credential) { $InvokeWebRequestParams += @{Credential = $SharePointCredential } }
|
|
Else { $InvokeWebRequestParams += @{UseDefaultCredentials = $true } }
|
|
|
|
# Create vCenter scheduled task
|
|
$scheduledTaskManager.CreateObjectScheduledTask($vm.ExtensionData.MoRef, $spec)
|
|
Start-Sleep -Seconds 3
|
|
}
|
|
catch [System.Management.Automation.MethodInvocationException] {
|
|
If ($tryCount -lt 4) {
|
|
If ($Error[1].Exception -like "*You have attempted to schedule the scheduler at a time*in the past*") {
|
|
Write-Warning ((Get-Date))# + ": Attempted schedule in past @ $SnapTime, trying again")
|
|
}
|
|
write-warning $trycount
|
|
}
|
|
Else {
|
|
write-error "vCenter Snapshot Scheduled Task Creation failed"
|
|
write-error $error[1]
|
|
Send-MailMessage -From "vmware@nd.gov" -To "zmeier@nd.gov" -Subject "VMware-Snapshot Schedule Failed - $SnapName" -Body "$SnapName`n$SnapDescription" -SmtpServer apprelay1.nd.gov
|
|
$Status = "Errored"
|
|
exit
|
|
}
|
|
}
|
|
catch {
|
|
write-error "vCenter Snapshot Scheduled Task Creation failed default message"
|
|
write-error $error[1]
|
|
Send-MailMessage -From "vmware@nd.gov" -To "zmeier@nd.gov" -Subject "VMware-Snapshot Schedule Failed Default Message - $SnapName" -Body "$SnapName`n$SnapDescription" -SmtpServer apprelay1.nd.gov
|
|
$Status = "Errored"
|
|
exit
|
|
}
|
|
#}
|
|
|
|
# update SharePoint record status
|
|
If ($Status -ne "Errored") { $Status = "Scheduled" }
|
|
[PSCustomObject]$SetRecord = @{
|
|
"__metadata" = @{type = $ListItemEntityTypeFullName };
|
|
Status = $Status;
|
|
}
|
|
$body = $SetRecord | ConvertTo-Json
|
|
$InvokeWebRequestParams = @{
|
|
|
|
Uri = $UrlItem;
|
|
Method = "Post";
|
|
Body = $body;
|
|
ContentType = "application/json;odata=verbose";
|
|
Headers = $header;
|
|
UseBasicParsing = $true;
|
|
Credential = $SharePointCredential
|
|
}
|
|
Invoke-RestMethod @InvokeWebRequestParams
|
|
|
|
Disconnect-VIServer -Server * -Confirm:$false
|
|
}
|
|
Else {
|
|
Write-Error "Runbook must be started from webhook"
|
|
} |