\", \"\" | set-content $coAppFilePath\n\nWrite-Host \"Signing CO application [$coAppName] ...\"\n& $mageExe -Sign \"$coAppFilePath\" -cf $certFilePath -pwd $certPassword\n\n\nWrite-Host \"Copying binaries from \"$binariesFolderPath\nWrite-Host \"to destination \"$packageDestinationPath\n\n### Remove any existing files from the package destination folder\nRemove-Item $packageDestinationPath -Recurse -ErrorAction SilentlyContinue\n\n### Ensure target directory exists in order not to fail the copy\nNew-Item $packageDestinationPath -ItemType directory > $null\n\n### Copy binaries to destination folder\nCopy-Item $binariesFolderPath\"/*\" $packageDestinationPath -recurse -Force > $null\nCopy-Item $coAppFilePath $destinationPath -Force > $null\n\nWrite-Host \"Building clickonce application script completed.\"\n","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"ClickOnce","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clickonce-from-deployed-package.json","Website":"/step-templates/1b7909be-4870-4f81-8957-8357b9342c0f","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"c2d2cb47-b737-49a9-9063-41e84db53097","Name":"ClickOnce - Sign file","Description":"Sign file with given code sign certificate using mage.exe.","Version":2,"ExportedAt":"2016-04-05T14:42:48.861+00:00","ActionType":"Octopus.Script","Author":"Kemyke","Parameters":[{"Name":"SignFileFilter","Label":"Filter to find file to sign","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SignCert","Label":"Path to the certification file","HelpText":"Path to the certification pfx file","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SignCertPass","Label":"Password of the certification file","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AdvencedMageParameters","Label":"Addition parameters for mage.exe","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"PackagePath","Label":"Path to the root directory of ClickOnce package","HelpText":"Path to the root drectory of ClickOnce package. This is where you can find the setup.exe, and *.application files and the \"Application Files\" folder","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MagePath","Label":"Path to mage.exe","HelpText":"Path to mage.exe which is used to update manifest and .application files and sign them.","DefaultValue":"c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.6.1 Tools\\","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"$find = Get-ChildItem \"$PackagePath\\$SignFileFilter\"\n$PathToFile = $find.FullName\n\n$splittedParams = $AdvencedMageParameters.Split(\" \")\n& \"$MagePath\\mage.exe\" -Sign \"$PathToFile\" -CertFile $SignCert -Password $SignCertPass $splittedParams"},"Category":"ClickOnce","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clickonce-sign-file.json","Website":"/step-templates/c2d2cb47-b737-49a9-9063-41e84db53097","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"0185c15c-3bde-446b-a5cf-10f475dc0008","Name":"ClickOnce - Update .application file","Description":"Update .application file after updating the manifest file.","Version":3,"ExportedAt":"2016-04-05T14:43:35.076+00:00","ActionType":"Octopus.Script","Author":"Kemyke","Parameters":[{"Name":"PackagePath","Label":"Path to the root directory of ClickOnce package","HelpText":"Path to the root drectory of ClickOnce package. This is where you can find the setup.exe, and *.application files and the \"Application Files\" folder","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AppName","Label":"Name of the ClickOnce application","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AdvencedMageParameters","Label":"Addition parameters for mage.exe","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MagePath","Label":"Path to mage.exe","HelpText":"Path to mage.exe which is used to update manifest and .application files and sign them.","DefaultValue":"c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.6.1 Tools\\","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"$xml = [xml](Get-Content \"$PackagePath\\$AppName.application\")\n$manifestpath = $xml.assembly.dependency.dependentAssembly.codebase\n\n$splittedParams = $AdvencedMageParameters.Split(\" \")\ncd \"$PackagePath\"\n& \"$MagePath\\mage.exe\" -Update \".\\$AppName.application\" -AppManifest \".\\$manifestpath\" $splittedParams\n\n"},"Category":"ClickOnce","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clickonce-update-application-file.json","Website":"/step-templates/0185c15c-3bde-446b-a5cf-10f475dc0008","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"f52ace18-b8ee-4235-9c6f-231f2ec477a6","Name":"ClickOnce - Update manifest file","Description":"Update manifest file after changing the configuration files of the ClickOnce application.","Version":3,"ExportedAt":"2016-04-05T14:46:10.321+00:00","ActionType":"Octopus.Script","Author":"Kemyke","Parameters":[{"Name":"PackagePath","Label":"Path to the root directory of ClickOnce package","HelpText":"Path to the root drectory of ClickOnce package. This is where you can find the setup.exe, and *.application files and the \"Application Files\" folder","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AppName","Label":"Name of the ClickOnce application","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AdvencedMageParameters","Label":"Addition parameters for mage.exe","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MagePath","Label":"Path to mage.exe","HelpText":"Path to mage.exe which is used to update manifest and .application files and sign them.","DefaultValue":"c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.6.1 Tools\\","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"$xml = [xml](Get-Content \"$PackagePath\\$AppName.application\")\n$manifestpath = $xml.assembly.dependency.dependentAssembly.codebase\n$ApplicationWithVersion = $manifestpath.Split('\\\\')[1]\n\n$splittedParams = $AdvencedMageParameters.Split(\" \")\n& \"$MagePath\\mage.exe\" -Update \"$PackagePath\\$manifestpath\" -FromDirectory \"$PackagePath\\Application Files\\$ApplicationWithVersion\" $splittedParams"},"Category":"ClickOnce","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clickonce-update-manifest-file.json","Website":"/step-templates/f52ace18-b8ee-4235-9c6f-231f2ec477a6","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"a9e5843e-d382-44fd-84dd-d999dab54993","Name":"ClickOnceRe-Sign","Description":"This Template will help to re-sign the .application and manifest files. Finally add .deploy extenstion to the files","Version":6,"ExportedAt":"2015-10-20T20:26:27.693+00:00","ActionType":"Octopus.Script","Author":"mani0070","Parameters":[{"Name":"signcertpath","Label":"Signing Certificate Path","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"signCertPass","Label":"Signing Certificate Password","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"baseDeployPath","Label":"Deployment Path","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AppName","Label":"Application Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$xml = [xml](Get-Content \"$baseDeployPath\\$AppName.application\")\n$manifestpath = $xml.assembly.dependency.dependentAssembly.codebase\n$ApplicationWithVersion = $manifestpath.Split('\\\\')[1]\n\n#Manifest Resign\n& \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.0A\\bin\\NETFX 4.0 Tools\\mage.exe\" -Update \"$baseDeployPath\\$manifestpath\" -FromDirectory \"$baseDeployPath\\Application Files\\$ApplicationWithVersion\"\n& \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.0A\\bin\\NETFX 4.0 Tools\\mage.exe\" -Sign \"$baseDeployPath\\$manifestpath\" -CertFile $signcertpath -Password $signCertPass\n\n#Application Resign\n& \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\mage.exe\" -Update \"$baseDeployPath\\$AppName.application\" -AppManifest \"$baseDeployPath\\$manifestpath\"\n& \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\mage.exe\" -Sign \"$baseDeployPath\\$AppName.application\" -CertFile $signcertpath -Password $signCertPass\n\n#Rename files back to the .deploy extension, skipping the files that shouldn't be renamed\nGet-ChildItem -Path \"$baseDeployPath\\Application Files\\*\" -Recurse | Where-Object {!$_.PSIsContainer -and $_.Name -notlike \"*.manifest\" -and $_.Name -notlike \"*.vsto\"} | Rename-Item -NewName {$_.Name + \".deploy\"} "},"Category":"ClickOnce","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clickonce-re-sign.json","Website":"/step-templates/a9e5843e-d382-44fd-84dd-d999dab54993","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"cf8634b6-313f-4435-bae6-88520c58d81d","Name":"Com Component - Register and Unregister using Regsvr32.exe","Description":"Uses regsvr32.exe to register com components","Version":2,"ExportedAt":"2015-06-30T18:55:08.050+00:00","ActionType":"Octopus.Script","Author":"jbennett","Parameters":[{"Name":"DllFilePaths","Label":"DllFilePaths","HelpText":"List of dlls to be registered separated by a ; and can appear on separate lines","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Name":"Uninstall","Label":"Un-register","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n [string]$DllFilePaths,\n [string]$Uninstall\n)\n\n$ErrorActionPreference = \"Stop\" \n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\n& {\n param(\n [string]$DllFilePaths,\n [string]$Uninstall\n ) \n\n $isUninstall = $($Uninstall.ToLower() -eq 'true')\n\n Write-Host \"COM Component - Register\"\n Write-Host \"DllFilePaths: $DllFilePaths\"\n\n $DllFilePaths.split(\";\") | ForEach {\n $dllFilePath = $_.Trim();\n Write-Host $dllFilePath\n \n if($dllFilePath.Length -lt 1){\n break;\n }\n \n Write-Host \"Attempting to register $dllFilePath\"\n\n if(!(Test-Path \"$dllFilePath\"))\n {\n Write-Host \"FILE NOT FOUND $dllFilePath.\" -ForegroundColor Yellow;\n return;\n }\n\n Write-Host \"Attempting to register $dllFilePath\"\n \n $pinfo = New-Object System.Diagnostics.ProcessStartInfo\n\n $cmd = \"$env:windir\\System32\\regsvr32.exe\"\n\n Write-Host \"Registering with: $env:windir\\System32\\regsvr32.exe\"\n\n $pinfo.FileName = \"$cmd\"\n\n $pinfo.RedirectStandardError = $true\n $pinfo.RedirectStandardOutput = $true\n $pinfo.UseShellExecute = $false\n \n if($isUninstall){\n $args = \"/u\"\n }\n $args = \"$args /s `\"$dllFilePath`\"\"\n\n $pinfo.Arguments = $args\n \n $p = New-Object System.Diagnostics.Process\n\n $p.StartInfo = $pinfo\n\n Write-Host \"Command:\"\n Write-Host \"$cmd $args\"\n\n if ($p.Start())\n {\n Write-Host $p.StandardOutput.ReadToEnd().ToString()\n\n if($p.ExitCode -ne 0)\n {\n \n Write-Host \"FAILED $($p.ExitCode) - Register\" -ForegroundColor Red \n Write-Host $p.StandardError.ReadToEnd() -ForegroundColor Red\n \n throw $p.StandardError.ReadToEnd()\n }\n \n Write-Host \"SUCCESS- Register\" -ForegroundColor Green \n }\n\n \n }\n\n } `\n (Get-Param 'DllFilePaths' -Required) `\n (Get-Param 'Uninstall' -Required)","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/com-component-register-unregister.json","Website":"/step-templates/cf8634b6-313f-4435-bae6-88520c58d81d","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////Da3qSsLvhtb0wur6O7zuWcfxldv2aMzyK7ftpOD3s+X48Pr+0fD7d9HzHLLr4fX8xD/OcwAAAaNJREFUeNrs3cFygjAUQFECWott1f//2sJoW6kIKEzNs+euXOmcmSSGDa8oJEmSJEmSJGmsj1W1K9cpsGD1Vr2WdToVEPC+2lYvZfpVrEW0qZpF1F+MRdRugzoNlvkiarfBPk0pT8GhWUSX2yASpDlLr2+DEJBmEY1ug6whx7N0n2b30G1QlmmxHsRYp6X76yvF9vg5RYQczq8UVURI35UiFmTgShED0p6lI1eKzCHTrxS5Qk6PZ9PLDtJ9PIsJmXWlyAky6/dAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQMJCyjltF/iO3gpJUpD8s4OAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8T8itwwKyhbTdMr4ha8hXUwZqhICcOgyNOIkE+V5wo4MSgr1u/fp7poO+AL8K/gL8yw0UeyRB34m9iQ/pVD8L5JYTO3NI58R+AsiEEzsW5OfE3sUe/zRwYkeGnG2g2CPS7rhjF4GKP0ZwyoldxK37kFqEL/7wU0mSJEmSJOmJ+xRgAHxZTCXGdZkfAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"c79b5e6b-88ac-47d5-8678-99e8ab2a1cd9","Name":"Configuration - Encrypt App or Web Config Section","Description":"Encrypts a configuration section for the specified executable.","Version":17,"ExportedAt":"2017-09-19T22:33:58.801Z","ActionType":"Octopus.Script","Author":"KevinKelchen","Parameters":[{"Id":"9ab1281d-cf2e-4248-a583-b08e9609c96d","Name":"ExecutablePath","Label":"Executable path","HelpText":"For Web:\nThe virtual path to the web site.\n\nFor Windows:\nThe path to the executable that has a corresponding `[Executable].exe.config` file.\n \nYou can get the InstallationDirectoryPath like so `#{Octopus.Action[StepName].Output.Package.InstallationDirectoryPath}`","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"0cb4f8ec-5415-47e3-87f1-3e086cc1caa1","Name":"SectionToEncrypt","Label":"Section to encrypt","HelpText":"The name of the section(s) in the config to encrypt e.g. appSettings, connectionStrings etc.\n\nSeparate multiple sections with comma ','.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"a30203d3-53d1-450d-bbcd-92a6eb31e906","Name":"Provider","Label":"Provider Name","HelpText":"The provider to use for encryption","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9116d4b3-b033-416f-844c-2a351d3bbc09","Name":"ApplicationType","Label":"Application Type","HelpText":"The application type would be web or windows.\nWeb will be used to encrypt web.config file.\nAnd Windows type application will encrypt file with \"exe.config\" or \"dll.config\" extension.","DefaultValue":"Web","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Web|Web Application\nWindows|Windows Service/Console App/Class Library (Dll)"}},{"Id":"90a1578e-efa2-44e4-84c0-34b037882cc5","Name":"WebSiteName","Label":"Web Site Name","HelpText":"Enter the web site name installed in IIS.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$ErrorActionPreference = \"Stop\" \nfunction Get-Parameter($Name, $Default, [switch]$Required) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n Write-Verbose \"Get-Parameter for '$($Name)' [value='$($result)' default='$($Default)']\"\n\n return $result\n}\n\nfunction HandleError($message) {\n\tif (!$whatIf) {\n\t\tthrow $message\n\t} else {\n\t\tWrite-Host $message -Foreground Yellow\n\t}\n}\n\nfunction Invoke-EncryptAppConfigFile() {\n\n if (!(Test-Path $appPath)) {\n HandleError \"The directory $appPath must exist\"\n }\n\n $configurationAssembly = \"System.Configuration, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n [void] [Reflection.Assembly]::Load($configurationAssembly)\n $configuration = [System.Configuration.ConfigurationManager]::OpenExeConfiguration($appPath)\n\n Invoke-ProtectSections $configuration\n}\n\nfunction Invoke-EncryptWebConfigFile() {\n Import-module WebAdministration\n\n\t$IISPath = \"IIS:\\Sites\\$($webSiteName)$($appPath)\\\"\n\n if (Test-Path $IISPath) { \n Write-Verbose \"$webSiteName web site exists.\"\n\n $configurationAssembly = \"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n [void] [Reflection.Assembly]::Load($configurationAssembly)\n $configuration = [System.Web.Configuration.WebConfigurationManager]::OpenWebConfiguration($appPath, $webSiteName)\n\n Invoke-ProtectSections $configuration\n }\n else {\n HandleError \"$webSiteName web site doesn't exists. Please check if the web site is installed.\"\n } \n}\n\nfunction Invoke-ProtectSections($configuration) {\n\n $saveConfigFile = $false\n\n foreach ($sectionName in $sections) {\n $sectionName = $sectionName.Trim() # compatible with Powershell 2.0 \n $section = $configuration.GetSection($sectionName)\n \n if ($section) {\n if (-not $section.SectionInformation.IsProtected)\n {\n Write-Verbose \"Encrypting $($section.SectionInformation.SectionName) section.\"\n $section.SectionInformation.ProtectSection($provider);\n $section.SectionInformation.ForceSave = [System.Boolean]::True;\n $saveConfigFile = $true\n }\n else {\n Write-Host \"Section $($section.SectionInformation.SectionName) is already protected.\"\n }\n }\n else {\n Write-Warning \"Section $($sectionName) doesn't exists in the configuratoin file.\"\n }\n\n } \n\n if ($saveConfigFile) { \n $configuration.Save([System.Configuration.ConfigurationSaveMode]::Modified);\n Write-Host \"Encryption completed successfully.\"\n }\n else {\n Write-Host \"No section(s) in the configuration were encrypted.\"\n }\n}\n\n$appType = Get-Parameter \"ApplicationType\" -Required\nif ($appType -eq \"Web\") {\n $appPath = Get-Parameter \"ExecutablePath\" \"/\"\n $webSiteName = Get-Parameter \"WebSiteName\"\n}\nelse {\n $appPath = Get-Parameter \"ExecutablePath\" -Required\n}\n$sectionName = Get-Parameter \"SectionToEncrypt\" -Required\n$sections = $sectionName.Split(',') # adding .Trim() doesn't work on Powershell 2.0 or below\n$provider = Get-Parameter \"Provider\" \"DataProtectionConfigurationProvider\"\n\nWrite-Host \"Configuration - Encrypt config file\"\nWrite-Host \"Application Type: $appType\"\nWrite-Host \"Application Path: $appPath\"\nif ($appType -eq \"Web\") { Write-Host \"Web Site Name: $webSiteName\" }\nWrite-Host \"Section to Encrypt: $sectionName\"\nWrite-Host \"Provider: $provider\"\n\nif ($appType -eq \"Web\") {\n Invoke-EncryptWebConfigFile\n}\nelse {\n Invoke-EncryptAppConfigFile \n}","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Encrypt","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/configuration-encrypt-app-or-web-config-section.json","Website":"/step-templates/c79b5e6b-88ac-47d5-8678-99e8ab2a1cd9","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"d80a7d9a-8c7b-4aa6-934e-0929bce606fe","Name":"Configuration - Encrypt App.config Section","Description":"Encrypts configuration sections for the specified executable.","Version":2,"ExportedAt":"2016-12-13T07:19:21.741Z","ActionType":"Octopus.Script","Author":"kp-tseng","Parameters":[{"Name":"ExecutablePath","Label":"Executable path","HelpText":"The path to the executable that has a corresponding `[Executable].exe.config` file. \n\nYou can get the InstallationDirectoryPath like so `#{Octopus.Action[StepName].Output.Package.InstallationDirectoryPath}`","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SectionsToEncrypt","Label":"Sections to encrypt","HelpText":"The name of the section in the App config to encrypt e.g. `appSettings`, `connectionStrings` etc. For multiple sections, separate with a comma (,)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Provider","Label":"Provider Name","HelpText":"The provider to use for encryption","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$ErrorActionPreference = \"Stop\" \nfunction Get-Parameter($Name, $Default, [switch]$Required) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\nfunction HandleError($message) {\n\tif (!$whatIf) {\n\t\tthrow $message\n\t} else {\n\t\tWrite-Host $message -Foreground Yellow\n\t}\n}\n\n$appPath = Get-Parameter \"ExecutablePath\" -Required\n$sectionsToEncrypt = (Get-Parameter \"SectionsToEncrypt\" -Required) -split ',' | where {$_} | %{$_.Trim()}\n$provider = Get-Parameter \"Provider\" \"DataProtectionConfigurationProvider\"\n\nWrite-Host \"Configuration - Encrypt .config\"\nWrite-Host \"ExecutablePath: $appPath\"\nWrite-Host \"SectionToEncrypt: $sectionName\"\nWrite-Host \"Provider: $provider\"\n\nif (!(Test-Path $appPath)) {\n HandleError \"The directory $appPath must exist\"\n}\n\n$configurationAssembly = \"System.Configuration, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n[void] [Reflection.Assembly]::Load($configurationAssembly)\n \n$configuration = [System.Configuration.ConfigurationManager]::OpenExeConfiguration($appPath)\n\nforeach ($sectionToEncrypt in $sectionsToEncrypt){\n\t$section = $configuration.GetSection($sectionToEncrypt)\n \n if (-not $section.SectionInformation.IsProtected)\n {\n $section.SectionInformation.ProtectSection($provider);\n $section.SectionInformation.ForceSave = [System.Boolean]::True;\n }\n}\n\n$configuration.Save([System.Configuration.ConfigurationSaveMode]::Modified);","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Encrypt","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/configuration-encrypt-app-config-section.json","Website":"/step-templates/d80a7d9a-8c7b-4aa6-934e-0929bce606fe","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"193628c4-2251-41e9-a782-225e632ef871","Name":"Configuration - Encrypt Section","Description":"Encrypts several configuration sections for the specified file in a given directory.","Version":4,"ExportedAt":"2016-12-27T03:36:42.383Z","ActionType":"Octopus.Script","Author":"cjuroz","Parameters":[{"Id":"0cae0018-f915-47c5-a8d6-cdef437346df","Name":"WebsiteDirectory","Label":"Website directory","HelpText":"The path to the website physical directory that contains a `Web.Config` file. \n\nYou can get the InstallationDirectoryPath like so `#{Octopus.Action[StepName].Output.Package.InstallationDirectoryPath}`","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"3d7e5485-106e-415e-83b7-cf12c59e776b","Name":"SectionsToEncrypt","Label":"Section to encrypt","HelpText":"The name of the section in the web config to encrypt e.g. `appSettings`, `connectionStrings` etc.\nFor multiple sections, separate with a comma (,)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"12a46b72-3835-4086-b8d6-bd5ad3f99f10","Name":"Provider","Label":"Provider Name","HelpText":"The provider to use for encryption","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"998aa949-74b6-4da6-a838-5637e7a5a322","Name":"ConfigFile","Label":"Configuration File","HelpText":"The configuration file to encrypt.","DefaultValue":"web.config","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"67415967-4722-449c-8d81-28eff7bf9876","Name":"OtherFiles","Label":"Other Files","HelpText":"A list of other files in the `#{WebsiteDirectory}` folder that should be included when encrypting the specified `#{SectionToEncrypt}`. For example, `connectionStrings.config`. Values should be separated by a comma.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$ErrorActionPreference = \"Stop\" \nfunction Get-Parameter($Name, $Default, [switch]$Required) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\nfunction HandleError($message) {\n\tif (!$whatIf) {\n\t\tthrow $message\n\t} else {\n\t\tWrite-Host $message -Foreground Yellow\n\t}\n}\n\n$websiteDirectory = Get-Parameter \"WebsiteDirectory\" -Required\n$sectionsToEncrypt = (Get-Parameter \"SectionsToEncrypt\" -Required) -split ',' | where {$_} | %{$_.Trim()}\n$provider = Get-Parameter \"Provider\" \"\"\n$configFile = Get-Parameter \"ConfigFile\" \"web.config\"\n$otherFiles = (Get-Parameter \"OtherFiles\" \"\") -split ',' | where {$_} | %{$_.Trim()}\n\nWrite-Host \"Configuration - Encrypt .config\"\nWrite-Host \"WebsiteDirectory: $websiteDirectory\"\nWrite-Host \"SectionsToEncrypt: $sectionsToEncrypt\"\nWrite-Host \"Provider: $provider\"\nWrite-Host \"ConfigFile: $configFile\"\n\n\nif (!(Test-Path $websiteDirectory)) {\n\tHandleError \"The directory $websiteDirectory must exist\"\n}\n\n$configFilePath = Join-Path $websiteDirectory $configFile\nWrite-Host \"configFilePath: $configFilePath\"\nif (!(Test-Path $configFilePath)) {\n\tHandleError \"Specified file $configFile or a Web.Config file must exist in the directory $websiteDirectory\"\n}\n\n$frameworkPath = [System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory();\n$regiis = \"$frameworkPath\\aspnet_regiis.exe\"\n\nif (!(Test-Path $regiis)) {\n\tHandleError \"The tool aspnet_regiis does not exist in the directory $frameworkPath\"\n}\n\n# Create a temp directory to work out of and copy our config file to web.config\n$tempPath = Join-Path $websiteDirectory $([guid]::NewGuid()).ToString()\nif (!$whatIf) {\n\tNew-Item $tempPath -ItemType \"directory\"\n} else {\n\tWrite-Host \"WhatIf: New-Item $tempPath -ItemType \"\"directory\"\"\" -Foreground Yellow\n}\n\n$tempFile = Join-Path $tempPath \"web.config\"\nif (!$whatIf) {\n New-Item -ItemType File -Path $tempFile -Force\n\tCopy-Item $configFilePath $tempFile -Force\n} else {\n\tWrite-Host \"WhatIf: Copy-Item $configFilePath $tempFile\" -Foreground Yellow\n}\n\nForeach($fileName in $otherFiles){\n if (!$whatIf) {\n New-Item -ItemType File -Path (Join-Path $tempPath $fileName) -Force\n\t Copy-Item (Join-Path $websiteDirectory $fileName) (Join-Path $tempPath $fileName) -Force\n } else {\n\t Write-Host \"WhatIf: Copy-Item $configFilePath $tempFile\" -Foreground Yellow\n }\n}\n\nForeach($sectionToEncrypt in $sectionsToEncrypt){\n\t# Determine arguments\n\tif ($provider) {\n\t\t$args = \"-pef\", $sectionToEncrypt, $tempPath, \"-prov\", $provider\n\t} else {\n\t\t$args = \"-pef\", $sectionToEncrypt, $tempPath\n\t}\n\n\t# Encrypt Web.Config file in directory\n\tif (!$whatIf) {\n\t\t& $regiis $args\n\t\tif ($LASTEXITCODE) {\n\t\t HandleError \"There was an error trying to encrypt section: $sectionToEncrypt\"\n\t\t}\n\t} else {\n\t\tWrite-Host \"WhatIf: $regiis $args\" -Foreground Yellow\n\t}\n}\n\n# Copy the web.config back to original file and delete the temp dir\nif (!$whatIf) {\n\tCopy-Item $tempFile $configFilePath -Force\n\n Foreach($fileName in $otherFiles){\n if (!$whatIf) {\n \t Copy-Item (Join-Path $tempPath $fileName) (Join-Path $websiteDirectory $fileName) -Force\n } else {\n \t Write-Host \"WhatIf: Copy-Item $configFilePath $tempFile\" -Foreground Yellow\n }\n }\n\n Remove-Item $tempPath -Recurse\n} else {\n\tWrite-Host \"WhatIf: Copy-Item $tempFile $configFilePath -Force\" -Foreground Yellow\n\tWrite-Host \"WhatIf: Remove-Item $tempPath -Recurse\" -Foreground Yellow\n}\n","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Encrypt","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/configuration-encrypt-web-config-section.json","Website":"/step-templates/193628c4-2251-41e9-a782-225e632ef871","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"044392b0-5ee7-4f8d-b961-016f07ec6d50","Name":"Configure SPM Client","Description":"This Step Template will Configure the SPM Client for Solr and Zookeeper","Version":11,"ExportedAt":"2017-01-08T11:09:57.757Z","ActionType":"Octopus.Script","Author":"mani0070","Parameters":[{"Id":"90e816e7-9a09-49da-87ac-cb498a7a4a64","Name":"appguid","Label":"SemaText Application GUID","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"f1baea32-7272-40f4-a2d0-95ead1427a0a","Name":"applicationtype","Label":"Application Type","HelpText":"Value can be solr or zk","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1e3f73eb-153d-4aa6-9b8a-53b5d1737b84","Name":"applicationmode","Label":"Application Mode","HelpText":"standalone","DefaultValue":"standalone","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"90b9eeae-83c0-47ad-84b2-60a78ee5049a","Name":"jmxhostaddress","Label":"JMX Host Address","HelpText":"JMX Host Address","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"2e7941e8-5d32-4619-b4d3-0e67a9b4dda0","Name":"jmxhostport","Label":"JMX Host Port","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"Bash","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"APP_GUID=\"#{appguid}\"\nAPP_TYPE=\"#{applicationtype}\"\nAPP_MODE=\"#{applicationmode}\"\nJMXADDR=\"#{jmxhostaddress}\"\nJMXPORT=\"#{jmxhostport}\"\n\necho sudo bash /opt/spm/bin/spm-client-setup-conf.sh ${APP_GUID} ${APP_TYPE} ${APP_MODE} jmxhost:${JMXADDR} jmxport:${JMXPORT}\nsudo bash /opt/spm/bin/spm-client-setup-conf.sh ${APP_GUID} ${APP_TYPE} ${APP_MODE} jmxhost:${JMXADDR} jmxport:${JMXPORT}\nsudo service spm-monitor restart","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Linux","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/configure-spm-client.json","Website":"/step-templates/044392b0-5ee7-4f8d-b961-016f07ec6d50","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"fa570d27-1405-4030-87b2-c0abf12bb833","Name":"Consolidate Release Notes","Description":"Consolidates all Release Notes between the last successful release in the current Environment and this one by merging or concatenating them.","Version":9,"ExportedAt":"2017-03-01T14:24:14.581Z","ActionType":"Octopus.Script","Author":"damovisa","Parameters":[{"Id":"fa5cfdb4-b006-4f92-90ee-affc1791fc79","Name":"Consolidate_ApiKey","Type":"String","Label":"Api Key","HelpText":"The API Key to use for authentication","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}},{"Id":"2fe221e5-1f47-4cf9-bde7-ed3b77028bf4","Name":"Consolidate_Dedupe","Type":"String","Label":"Remove Duplicates","HelpText":"Whether to remove **duplicate** lines when constructing release notes","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox","Octopus.SelectOptions":"Yes|Yes\nNo|No"},"Links":{}},{"Id":"301aa2a8-f06b-4904-9636-99189074f224","Name":"Consolidate_RemoveWhitespace","Type":"String","Label":"Remove Blank Lines","HelpText":"Whether to remove **blank** lines when constructing release notes","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox","Octopus.SelectOptions":"Yes|Yes\nNo|No"},"Links":{}},{"Id":"517d4aac-e6ae-451c-b18f-be31c6c153b8","Name":"Consolidate_Order","Type":"String","Label":"Concatenation Order","HelpText":"The order in which to append release notes","DefaultValue":"Newest","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Newest|Newest to Oldest\nOldest|Oldest to Newest"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"true","Octopus.Action.Script.ScriptBody":"$baseUri = $OctopusParameters['Octopus.Web.BaseUrl']\n$reqheaders = @{\"X-Octopus-ApiKey\" = $Consolidate_ApiKey }\n$putReqHeaders = @{\"X-HTTP-Method-Override\" = \"PUT\"; \"X-Octopus-ApiKey\" = $Consolidate_ApiKey }\n\n$remWhiteSpace = [bool]::Parse($Consolidate_RemoveWhitespace)\n$deDupe = [bool]::Parse($Consolidate_Dedupe)\n$reverse = ($Consolidate_Order -eq \"Oldest\")\n\n# Get details we'll need\n$projectId = $OctopusParameters['Octopus.Project.Id']\n$thisReleaseNumber = $OctopusParameters['Octopus.Release.Number']\n$lastSuccessfulReleaseId = $OctopusParameters['Octopus.Release.CurrentForEnvironment.Id']\n$lastSuccessfulReleaseNumber = $OctopusParameters['Octopus.Release.CurrentForEnvironment.Number']\n\n# Get all previous releases to this environment\n$releaseUri = \"$baseUri/api/projects/$projectId/releases\"\ntry {\n $allReleases = Invoke-WebRequest $releaseUri -Headers $reqheaders -UseBasicParsing | ConvertFrom-Json\n} catch {\n if ($_.Exception.Response.StatusCode.Value__ -ne 404) {\n $result = $_.Exception.Response.GetResponseStream()\n $reader = New-Object System.Io.StreamReader($result);\n $responseBody = $reader.ReadToEnd();\n throw \"Error occurred: $responseBody\"\n }\n}\n\n# Find and aggregate release notes\n$aggregateNotes = @()\n\nWrite-Host \"Finding all release notes between the last successful release: $lastSuccessfulReleaseNumber and this release: $thisReleaseNumber\"\nforeach ($rel in $allReleases.Items) {\n if ($rel.Id -ne $lastSuccessfulReleaseId) {\n Write-Host \"Found release notes for $($rel.Version)\"\n $theseNotes = @()\n #split into lines\n $lines = $rel.ReleaseNotes -split \"`n\"\n foreach ($line in $lines) {\n if (-not $remWhitespace -or -not [string]::IsNullOrWhiteSpace($line)) {\n if (-not $deDupe -or -not $aggregateNotes.Contains($line)) {\n $theseNotes = $theseNotes + $line\n }\n }\n }\n if ($reverse) {\n $aggregateNotes = $theseNotes + $aggregateNotes\n } else {\n $aggregateNotes = $aggregateNotes + $theseNotes\n }\n } else {\n break\n }\n}\n$aggregateNotesText = $aggregateNotes -join \"`n`n\"\n\n# Get the current release\n$releaseUri = \"$baseUri/api/projects/$projectId/releases/$thisReleaseNumber\"\ntry {\n $currentRelease = Invoke-WebRequest $releaseUri -Headers $reqheaders -UseBasicParsing | ConvertFrom-Json\n} catch {\n if ($_.Exception.Response.StatusCode.Value__ -ne 404) {\n $result = $_.Exception.Response.GetResponseStream()\n $reader = New-Object System.Io.StreamReader($result);\n $responseBody = $reader.ReadToEnd();\n throw \"Error occurred: $responseBody\"\n }\n}\n\n# Update the release notes for the current release\n$currentRelease.ReleaseNotes = $aggregateNotesText\nWrite-Host \"Updating release notes for $thisReleaseNumber`:`n`n\"\nWrite-Host $aggregateNotesText\ntry {\n $releaseUri = \"$baseUri/api/releases/$($currentRelease.Id)\"\n $currentReleaseBody = $currentRelease | ConvertTo-Json\n $result = Invoke-WebRequest $releaseUri -Method Post -Headers $putReqHeaders -Body $currentReleaseBody -UseBasicParsing | ConvertFrom-Json\n} catch {\n $result = $_.Exception.Response.GetResponseStream()\n $reader = New-Object System.Io.StreamReader($result);\n $responseBody = $reader.ReadToEnd();\n Write-Host $responseBody\n throw \"Error occurred: $responseBody\"\n}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Octopus","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/octopus-consolidate-releasenotes.json","Website":"/step-templates/fa570d27-1405-4030-87b2-c0abf12bb833","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRFT6Tl////L5Pg8vj9Y67omsvwPJrisdfzfbzs5fL7y+T32Ov5isLucLXqvt31CJPHWwAABMJJREFUeNrs3deW4jAMAFDF3U75/89dlp0ZhiU4blJEjvQ8hYubLJsA00UCBCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIhD8kJm+t+QprfdKfB9HbYpx6CWfspj8HMi+gMgHL/AmQA8W3JTKH+ALFvzCeL0RbpyoCPE9IJeNOSQwh5Z3qd6yRGWQ2qi2cZQWxqj1WzQYSjeoJmJlAklOd4VlArOqPhQEkqBERToeMcfRJBkC0Uep8CfBpjz4JsHJ0zF3dkEWNje0kiB/sUC6eApndaIiCMyAa1PiwJ0AWhRGJHJJQHG2dC7h1rNbO1QOxSA7lNCkkKrQIpJCAB1GREILYIC1NAiwbpKFJgGWDNExcwGstfExcZBCHC6nOglshHtmhViLIig1RNBCN7qjtW8C0Z1UvJcC1Z9XmwMBzzvobmgAyEzgq91dtEEsBsQSQQAFZCSBAATEEEApHZbrVBIkkEIUPSVeB+KtALA0kXQUSrwKZBCIQBnk8Y4i5CsReBeKvkqLM+BCSDWJlrZFvGk9SRTHshkgjZCGAaArIxm3H3grhVzFlW2msfl1ca79UJ1bofYvsDHHlNdTZnlh5MghuPd5NdBDUNZHyCkfktIh03XzALGRPlBDPac7qgWjHZzWcmF5zmmkhidMQ6boKiDXcDTUEaylZqCGJ0Vjvu/fLJtHqhSANEvqb2OYqkOUqEHuVMbJcZdZCGiPhKhC4yjqiIjEE7XThMp8fAWII3mY3kUIQD+AMKQTzPiBhgQ63HlT/KSvgtoi0dq5mCPah1UIE0eh3sT0NhOByvKeAkFzi8PgQomumFhsyOxpIzZN4gLOj5plVwNpR0b2AuePWKBEHQu24pSsJA+LVCeHHQxZ1SiyDIdqok8IOhSSnTottHEQTdyt4ettAj4KkzA4dMikk2Dht2S5ptm1vswnPDxn0YyDZ5oDM3iToo2T5voWaYe+Q+vdjH80QyAzZhCgcDtLMI1Tmtz9w++XHgziHQHJJu/OZ3bs9Xn8gQ72NcP3dKqEfkp10F51xhoIi2I91R+LurXV/5q7pH+wx061CzO16oSQleMyr8fXvwMA0Pro8432DPD/ySx8XrHfSuDAM8n6UhnjQabaiXf5Bq/lREHvEeNtn1rJ08+C/uXkQZHeguxAPC3UvtcJYUogLzZX5hhZZvS6onG5lxXtzWGaygwb79vT/IXhdlNibwlKYOR6T8xjI7W8n+xV7T+GH4tMzWwR+lZhRkJYSsC0thpmCYqyngOz3rN2FLBZ2wZflBCggUHF0Vnp88JKienzIXLSEZCZqU7IKr/gQW9yx3pzV7Y9kvWZWTRRIqDmTtRUnU7b2lLcTYmoqHqnmiO1poER0SPkAeZMAZxaJx0Y3TCdAclsIqDz03ALcyxfTCZBsthoGXWmigGyVhWPLFJJfuuKQWycoEFdXbH4dJJoJxNR1eD/kshz6yn48cF8yW8sFoitflB1w6Q8n+/15Za7oA17/pYNmYgP5fmWm8L1NOHPWgK8kuFew1/JXtOA0yJCv7ah7X8ObUuT5kObU30+fDZm8+zqP+HTIpK0xQ796b5Kv2hSIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIpBf8UeAAQAEjtYmlDTcCgAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"7ae25451-366d-49cc-a49d-eba03d147db0","Name":"Create Azure Resources - RG","Description":"The New-AzureRmResourceGroup cmdlet creates an Azure resource group","Version":27,"ExportedAt":"2018-01-05T13:57:27.868Z","ActionType":"Octopus.AzurePowerShell","Author":"IanMoroney","Parameters":[{"Id":"a5398248-3866-4e86-bfcd-6f6091199839","Name":"ResourceGroupName","Label":"ResourceGroupName","HelpText":"Required: Specifies a name for the resource group. This parameter is required. The resource name must be unique in the subscription.You can use -Name or its alias, -ResourceGroupName.If a resource group with that name already exists, the command prompts you for confirmation before replacing the existing resource group. To suppress the confirmation prompt, use the Force parameter.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"ddbea94f-8053-4da7-aaea-c71e31be38a5","Name":"Location","Label":"Location","HelpText":"Required: Specifies the location of the resource group. This parameter is required. Enter an Azure data center location, such as \"West US\" or \"Southeast Asia\".You can place a resource group in any location. The resource group does not have to be in the same location your Azure subscription or the same location as its resources. Resource groups can contain resources from different locations. To determine which location support each resource type, use the Get-AzureRmResourceProvider with the ProviderNamespace parameter cmdlet.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"c2ce713e-e157-4f4a-b28d-c7aa6186ede4","Name":"Tag","Label":"Tag","HelpText":"Optional: Applies the specified tags to the new resource group. Enter new tags or predefined tags that you created by using the New-AzureRmTag cmdlet.A \"tag\" is a name-value pair that you can apply to resources and resource groups. Use tags to categorize your resources, such as by department or cost center, or to track notes or comments about the resources. After you assign tags to resources, you can use the Tag parameters of Find-AzureRmResource and Find-AzureRmResourceGroup to search for resources and groups by tag name or name and value.Every tag must have a name and an optional value. To specify a new tag, FY2015=$null Department=\"IT\" one in each line. To get your predefined tags, use the Get-AzureRmTag cmdlet.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"18d18732-972c-446a-a6da-912866332c02","Name":"AzureAccount","Label":"AzureAccount","HelpText":"Enter the SPN used to connect to Azure","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Azure.AccountId":"#{AzureAccount}","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"param([string]$ResourceGroupName,\n [string]$Location )\n \n\n\n$ErrorActionPreference = \"Stop\" \n \n###############################################\n##Step1: Helper Functions\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\n###############################################\nfunction New-ResourceGroup { \nparam([string]$ResourceGroupName, \n[string]$Location)\n \n Write-Output '###############################################'\n Write-Output '##Step1: Create Resource Group '\n $AzureResourceGroup = Get-AzureRmResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue\n if ( $null -eq $AzureResourceGroup)\n {\n Write-Output \"Resource Group $ResourceGroupName does not exist, creating one ...\"\n $AzureResourceGroup =New-AzureRmResourceGroup -Name $ResourceGroupName -Location $Location\n } \n else{\n Write-Output \"Resource Group $ResourceGroupName already exists ...\"\n }\n\n Write-Output '###############################################'\n Write-Output '##Step2: Validate Resource Group '\n\n if ($null -eq $AzureResourceGroup ){\n Throw \"Failed to create resource group $AzureResourceGroupName\"\n }\n}\n\n& {\n param(\n [string]$ResourceGroupName,\n [string]$Location\n ) \n\n Write-Output \"Variables:\"\n Write-Output \"ResourceGroupName: $ResourceGroupName\"\n Write-Output \"Location: $Location\"\n \n $resourceGroupParams = @{\n ResourceGroupName=$ResourceGroupName\n Location=$Location\n }\n \n ###############################################\n New-ResourceGroup @resourceGroupParams\n Write-Output \"Resource Group verified/created\"\n ###############################################\n\n } `\n (Get-Param 'ResourceGroupName' -Required) `\n (Get-Param 'Location' -Required) \n ","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Package.FeedId":null,"Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.PackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-create-new-resourcegroup.json","Website":"/step-templates/7ae25451-366d-49cc-a49d-eba03d147db0","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////AHjXf7vrv931QJrh7/f8EIDaIIncMJHfYKvmz+b3n8zw3+76j8Ttr9XycLPpUKLkkKvYFAAABGZJREFUeNrsnNmCqjoQRc1MEiD8/9cer7Yt2KBJZQC8ez07sKlKTQlcLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzoUSnt8YxXlFuGHSbIaxvj+fip4btkLn1blkWLaF5v03yLhLOYlVuGYfMOMZzNGxCOzhjTJqFkXnjq3Dr1yyvPI3hGl3Ih3zzHHNKudRstRhX5O58vIcShY67Gq6EPIESlzUWvazaGAOGbvU7ArDu/g8M4o8opDZWvbvPzlL/MMBE8jT9T9W7PbAJlHPTBFRf9yVTEcs63msXz2UHLSgf650G/d5t+wjbxxB2UCMqGrk8/LFSD7uJMeNt5bcJCyQZyAe5Fo9KYfWS2flQrr4b4tpuzaeWjYs49rt9LHf9uZD7+VbyVi9EBNrjYjuq2sxQOrl+p+HuBVu45qvqfq691ttYFQ5KyKbyJgaIY/NGxrlWZwlwGvmvu1oY3PuAv0niTq6tZ78jk//9uc1r1r4lQki7y7sp2Tu4V1y2iLoqFTqi1lIGcpFiebrZNZ1dOkF0cCIlO8jQ47nCkam9Lilz9GhDF1I6XGLzfnhwDIIZVfI7+8SSgfHsijqXENOGJF5QorG4EcW0OrScqX/dDrXpr70Ut/BII+1OfECPuYz/NWxYmgrCsUskxPvyhgmrw+WGZ6lGTuOlIyCYWTFyWjpM5KIZRUIOwjRNYRQ6tZF9BXtk8hWAHPtLNJ727Fq0JSkC1FDRRF0Jalj0d5qVh2KEpM2TuSsCYTCT6ZkdmFYI9LrYp5QayWbo6NXlZwcRD/61pth5Fq5EX423QQxNjhqWvvklkljOLkYjrmphXPZOJOk6Pg7HKMsrtQKcowzZoK3rx1ZUelGMdQA/HaKkjAt2RgqpZeYqbNbH7Hp2ct4nqfSPOfe0ftiSTZJydOV6rG5bQbyLK+nRuCC0343PzDgiOXyQA5c14BTZi98uR/5KJ1SnatLdoO50WWBQZPTq0VgsklU3h932actuo17ayrHrb/3ykiegd3KbqF2wbV6RrlsJ07yLcpsWFTul9RyK6ZScr+tk7oNrFj0o7HQUlj4EiEvJ6rPLKSmlMZCrksl1OnLaRkxc+/HB1naMhNtT/6yM2bDs6azCRHrM3aVPN7aW8irD/10B8njpAMcsl8okXcdKrl4sPsLmQVy/Sj90ucPRc/d/Bxxj+dXSpCayen32D+hLi16MsIV8gfCXrYp6ySsiJKRUF0XXiLpVbFU+fNv4r7mOwhFsX4ZdwpSi1DYs2jb6ebZ9788cblTzMrYhu7sf/17IFdtuviJ2ioHA6pMHkoH4CLUeMBU7iGkxuM/YgcdderF9ibRdc7O982F1HpYhjfWUe+x5a6pjop9iNLfoePvlsdZdTSMwfxSmTY20Q0eHnUNzga1edeNmmqbg18aMVR1L9vwSXHF9TfIWBxpKLs2hj3eQeBC0USvp2HHF3eIkRdhFOd6ER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/I/4J8AAo/80BciBec4AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"c9a3122f-6723-4753-8461-f9fb3e73a513","Name":"Create Azure Resources - WA","Description":"The New-AzureRmAppServicePlan cmdlet creates a new app service plan.\nThe New-AzureRmWebApp cmdlet creates a new web app.","Version":1,"ExportedAt":"2018-01-08T10:36:38.951Z","ActionType":"Octopus.AzurePowerShell","Author":"IanMoroney","Parameters":[{"Id":"f6595af0-9cb5-4281-8fce-69f046c53e96","Name":"ResourceGroupName","Label":"ResourceGroupName","HelpText":"Enter the name of the resource group you are deploying this Web App into","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"f8d7d8c4-e862-436d-bea3-aa3f9a6caec3","Name":"Location","Label":"DeploymentLocation","HelpText":"Enter the location (Region) where the service plan is located","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"ef49ded7-ec59-482b-83bd-e890d36103b9","Name":"AppServicePlanName","Label":"AppServicePlanName","HelpText":"Enter the name of the app service plan","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"554a3a1c-9235-45e9-b198-d77cd8dae52d","Name":"AppServicePlanTier","Label":"AppServicePlanTier","HelpText":"Enter the tier of the app service plan","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"eee220dc-1af4-44ce-9bfc-950e87e9587d","Name":"WebAppName","Label":"WebAppName","HelpText":"Enter the name of your web app","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1f60c02e-77d1-4f2f-9874-87da815fc157","Name":"AppServiceUse32BitWorkerProcess","Label":"AppServiceUse32BitWorkerProcess","HelpText":"Sets the app pool for 32-bit processes or 64-bit processes.\nUse 1 for 32-bit\nUse 0 for 64-bit","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"7dda30f1-94e4-4a2a-beb6-c8663924bdee","Name":"AzureAccount","Label":"AzureAccount","HelpText":"Enter the SPN used to connect to Azure","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Azure.AccountId":"#{AzureAccount}","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"###############################################\n##Step 1: Get Variables\n$ResourceGroupName = $OctopusParameters[\"ResourceGroupName\"] \n$DeploymentLocation = $OctopusParameters[\"Location\"] \n$AppServicePlanName = $OctopusParameters[\"AppServicePlanName\"] \n$AppServicePlanTier = $OctopusParameters[\"AppServicePlanTier\"]\n$WebAppName = $OctopusParameters[\"WebAppName\"]\n$TimeStamp = Get-Date -Format ddMMyyyy_hhmmss\n$PublishProfilePath = Join-Path -Path $ENV:Temp -ChildPath \"publishprofile$TimeStamp.xml\"\n$AppServiceUse32BitWorkerProcess= $OctopusParameters[\"AppServiceUse32BitWorkerProcess\"] \n###############################################\n\n###############################################\n##Step 2: Check and Create Service Plan\ntry{\n $ServicePlan= Get-AzureRmAppServicePlan -ResourceGroupName $ResourceGroupName -Name $AppServicePlanName -ErrorAction SilentlyContinue \n if ($null -eq $ServicePlan)\n {\n Write-Output \"Creating Service Plan\"\n $ServicePlan=New-AzureRmAppServicePlan -Name $AppServicePlanName -Location $Location -ResourceGroupName $ResourceGroupName -Tier $AppServicePlanTier\n }\n else{\n Write-Output \"Service Plan already set up\"\n }\n $WebApp = Get-AzureRmWebApp -ResourceGroupName $ResourceGroupName -Name $WebAppName -ErrorAction SilentlyContinue\n if($null -eq $WebApp)\n {\n Write-Output \"Creating WebApp\"\n $webApp = New-AzureRmWebApp -Name $WebAppName -AppServicePlan $AppServicePlanName -ResourceGroupName $ResourceGroupName -Location $DeploymentLocation\n }\n else {\n Write-Output \"WebApp already created\"\n }\n \n Write-Output \"setting app to use $AppServiceUse32BitWorkerProcess\" \n Set-AzureRmWebApp -ResourceGroupName $ResourceGroupName -Name $WebAppName -Use32BitWorkerProcess ([bool]$AppServiceUse32BitWorkerProcess)\n $null = Get-AzureRmWebAppPublishingProfile -OutputFile $PublishProfilePath -ResourceGroupName $ResourceGroupName -Name $WebAppName -Format WebDeploy -Verbose\n \n Write-output \"profile: $(get-content $PublishProfilePath)\"\n if (!(Test-Path -Path $PublishProfilePath)){\n throw [System.IO.FileNotFoundException] \"$PublishProfilePath not found.\"\n }\n\n get-childitem $psscriptroot\n}\ncatch{\n Write-Output \"Cannot add serviceplan/webapp : $AzureAppServicePlanName / $AzureWebAppName\"\n Write-Output $_\n\n}\n","Octopus.Action.Package.FeedId":null,"Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.PackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-create-new-webapp.json","Website":"/step-templates/c9a3122f-6723-4753-8461-f9fb3e73a513","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////AHjXf7vrv931QJrh7/f8EIDaIIncMJHfYKvmz+b3n8zw3+76j8Ttr9XycLPpUKLkkKvYFAAABGZJREFUeNrsnNmCqjoQRc1MEiD8/9cer7Yt2KBJZQC8ez07sKlKTQlcLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzoUSnt8YxXlFuGHSbIaxvj+fip4btkLn1blkWLaF5v03yLhLOYlVuGYfMOMZzNGxCOzhjTJqFkXnjq3Dr1yyvPI3hGl3Ih3zzHHNKudRstRhX5O58vIcShY67Gq6EPIESlzUWvazaGAOGbvU7ArDu/g8M4o8opDZWvbvPzlL/MMBE8jT9T9W7PbAJlHPTBFRf9yVTEcs63msXz2UHLSgf650G/d5t+wjbxxB2UCMqGrk8/LFSD7uJMeNt5bcJCyQZyAe5Fo9KYfWS2flQrr4b4tpuzaeWjYs49rt9LHf9uZD7+VbyVi9EBNrjYjuq2sxQOrl+p+HuBVu45qvqfq691ttYFQ5KyKbyJgaIY/NGxrlWZwlwGvmvu1oY3PuAv0niTq6tZ78jk//9uc1r1r4lQki7y7sp2Tu4V1y2iLoqFTqi1lIGcpFiebrZNZ1dOkF0cCIlO8jQ47nCkam9Lilz9GhDF1I6XGLzfnhwDIIZVfI7+8SSgfHsijqXENOGJF5QorG4EcW0OrScqX/dDrXpr70Ut/BII+1OfECPuYz/NWxYmgrCsUskxPvyhgmrw+WGZ6lGTuOlIyCYWTFyWjpM5KIZRUIOwjRNYRQ6tZF9BXtk8hWAHPtLNJ727Fq0JSkC1FDRRF0Jalj0d5qVh2KEpM2TuSsCYTCT6ZkdmFYI9LrYp5QayWbo6NXlZwcRD/61pth5Fq5EX423QQxNjhqWvvklkljOLkYjrmphXPZOJOk6Pg7HKMsrtQKcowzZoK3rx1ZUelGMdQA/HaKkjAt2RgqpZeYqbNbH7Hp2ct4nqfSPOfe0ftiSTZJydOV6rG5bQbyLK+nRuCC0343PzDgiOXyQA5c14BTZi98uR/5KJ1SnatLdoO50WWBQZPTq0VgsklU3h932actuo17ayrHrb/3ykiegd3KbqF2wbV6RrlsJ07yLcpsWFTul9RyK6ZScr+tk7oNrFj0o7HQUlj4EiEvJ6rPLKSmlMZCrksl1OnLaRkxc+/HB1naMhNtT/6yM2bDs6azCRHrM3aVPN7aW8irD/10B8njpAMcsl8okXcdKrl4sPsLmQVy/Sj90ucPRc/d/Bxxj+dXSpCayen32D+hLi16MsIV8gfCXrYp6ySsiJKRUF0XXiLpVbFU+fNv4r7mOwhFsX4ZdwpSi1DYs2jb6ebZ9788cblTzMrYhu7sf/17IFdtuviJ2ioHA6pMHkoH4CLUeMBU7iGkxuM/YgcdderF9ibRdc7O982F1HpYhjfWUe+x5a6pjop9iNLfoePvlsdZdTSMwfxSmTY20Q0eHnUNzga1edeNmmqbg18aMVR1L9vwSXHF9TfIWBxpKLs2hj3eQeBC0USvp2HHF3eIkRdhFOd6ER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/I/4J8AAo/80BciBec4AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"10f6021e-27bd-47c5-9f10-4a1599182d8a","Name":"Create Azure Staging Deployment Slot","Description":"This template will create an azure deployment slot. This step template should be placed before the \"Deploy an Azure App\" Octopus Deploy template and be used with its sister step \"Switch Azure RM Deployment Slot\"\n\nThis should be used for green-blue deployments, as referenced in this document: https://octopus.com/docs/deploying-applications/deploying-to-azure/deploying-a-package-to-an-azure-web-app/using-deployment-slots-with-azure-web-apps\n\nNB: This step will promote your web app service plan to standard if it is currently using free, shared or basic tier","Version":2,"ExportedAt":"2018-02-27T11:24:00.844Z","ActionType":"Octopus.AzurePowerShell","Author":"MarkDordoy","Parameters":[{"Id":"37e14646-c52f-497a-a17b-2f17e9b1a629","Name":"ResourceGroupName","Label":"ResourceGroupName","HelpText":"Enter the name of the resource group you are deploying this Web App into","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"46bf87cd-342d-4095-bd2f-78d6a495faf5","Name":"AppServicePlanName","Label":"AppServicePlanName","HelpText":"Enter the name of the app service plan","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"54b04906-e716-4b1d-93c9-965f3a412c28","Name":"AppName","Label":"AppName","HelpText":"Enter the name of your web/api/etc app","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"15176529-6bc9-4e0f-82ab-b2e004959d9e","Name":"AzureAccount","Label":"AzureAccount","HelpText":"Enter the SPN used to connect to Azure","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"30da9c4b-1fb4-425e-a5f4-2338d24ca23b","Name":"SlotName","Label":"SlotName","HelpText":"Enter the name you wish to call your deployment slot","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Azure.AccountId":"#{AzureAccount}","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"###############################################\n# Create Azure RM Staging Deployment Slot\n###############################################\n##Step1: Get Variables\n$ResourceGroupName = $OctopusParameters[\"ResourceGroupName\"] \n$AppName = $OctopusParameters[\"AppName\"] \n$stagingSlotName = $OctopusParameters[\"SlotName\"]\n$AppServicePlanName = $OctopusParameters[\"AppServicePlanName\"] \n###############################################\n###############################################\nFunction Add-DeploymentSlotFunctionaility\n{\n [cmdletbinding()]\n param\n ( \n [string]$ResourceGroupName,\n [string]$AppName,\n [string]$AppServicePlanName\n )\n try \n {\n write-output \"Will make sure the service plan can support deployment slots\"\n $servicePlan = Get-AzureRmAppServicePlan -ResourceGroupName $ResourceGroupName -Name $AppServicePlanName\n \n if(($servicePlan.Sku.Tier.ToLower() -eq \"free\" ) -or ($servicePlan.Sku.Tier.ToLower() -eq \"shared\" ) -or ($servicePlan.Sku.Tier.ToLower() -eq \"basic\" ))\n {\n Write-Warning \"Service plan does not currently support deployment slots, will now scale to standard tier\"\n $planUpdate = Set-AzureRmAppServicePlan -ResourceGroupName $ResourceGroupName -Name $AppServicePlanName -Tier \"Standard\"\n Write-Output \"Plan updated\"\n $planUpdate | Out-String | Write-Verbose\n write-output \"Plan Tier now set to:\"\n $planUpdate.Sku | Out-String | Write-Output\n }\n else \n {\n Write-Output \"Service plan already supports deployment slots\" \n } \n }\n catch \n {\n throw \"Error adding Deployment Slot functionailty. $_\" \n }\n}\n\nFunction Invoke-RequiredVariablesCheck\n{\n if([string]::IsNullOrEmpty($ResourceGroupName))\n {\n Write-Error \"ResourceGroupName variable is not set\"\n }\n\n if([string]::IsNullOrEmpty($AppName))\n {\n write-error \"AppName variable is not set\"\n }\n\n if([string]::IsNullOrEmpty($stagingSlotName))\n {\n write-error \"stagingSlotName variable is not set\"\n }\n\n if([string]::IsNullOrEmpty($AppServicePlanName))\n {\n write-error \"AppServicePlanName variable is not set\"\n }\n Write-Verbose \"Variables in use are:\"\n write-verbose \"ResourceGroupName:$ResourceGroupName\"\n write-verbose \"AppName:$AppName\"\n write-verbose \"stagingSlotName:$stagingSlotName\"\n write-verbose \"AppServicePlanName:$AppServicePlanName\"\n}\n\n$ErrorActionPreference = \"Stop\"\n\ntry \n{\n Invoke-RequiredVariablesCheck\n Add-DeploymentSlotFunctionaility -ResourceGroupName $ResourceGroupName -AppName $AppName -AppServicePlanName $AppServicePlanName\n Write-output \"Preparing Deployment Staging slot\"\n $deploymentSlot = Get-AzureRmWebAppSlot -ResourceGroupName $ResourceGroupName -Name $AppName -Slot $stagingSlotName -ErrorAction SilentlyContinue\n if($deploymentSlot.Id -eq $null)\n {\n Write-output \"No current deployment slot created, will create one now\"\n New-AzureRmWebAppSlot -ResourceGroupName $ResourceGroupName -Name $AppName -Slot $stagingSlotName\n }\n else \n { \n Write-Verbose \"Current slot exists, will remove to speed up deployment\"\n Remove-AzureRmWebAppSlot -ResourceGroupName $ResourceGroupName -Name $AppName -Slot $stagingSlotName -Force\n Write-Verbose \"Slot removed\"\n New-AzureRmWebAppSlot -ResourceGroupName $ResourceGroupName -Name $AppName -Slot $stagingSlotName \n }\n Write-Output \"Deployment slot $stagingSlotName created\"\n}\ncatch \n{\n Write-Error \"Error in Create Azure RM Staging Deployment Slot step. $_\" \n}","Octopus.Action.Package.FeedId":null,"Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.PackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-create-staging-deployment-slot.json","Website":"/step-templates/10f6021e-27bd-47c5-9f10-4a1599182d8a","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////AHjXf7vrv931QJrh7/f8EIDaIIncMJHfYKvmz+b3n8zw3+76j8Ttr9XycLPpUKLkkKvYFAAABGZJREFUeNrsnNmCqjoQRc1MEiD8/9cer7Yt2KBJZQC8ez07sKlKTQlcLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzoUSnt8YxXlFuGHSbIaxvj+fip4btkLn1blkWLaF5v03yLhLOYlVuGYfMOMZzNGxCOzhjTJqFkXnjq3Dr1yyvPI3hGl3Ih3zzHHNKudRstRhX5O58vIcShY67Gq6EPIESlzUWvazaGAOGbvU7ArDu/g8M4o8opDZWvbvPzlL/MMBE8jT9T9W7PbAJlHPTBFRf9yVTEcs63msXz2UHLSgf650G/d5t+wjbxxB2UCMqGrk8/LFSD7uJMeNt5bcJCyQZyAe5Fo9KYfWS2flQrr4b4tpuzaeWjYs49rt9LHf9uZD7+VbyVi9EBNrjYjuq2sxQOrl+p+HuBVu45qvqfq691ttYFQ5KyKbyJgaIY/NGxrlWZwlwGvmvu1oY3PuAv0niTq6tZ78jk//9uc1r1r4lQki7y7sp2Tu4V1y2iLoqFTqi1lIGcpFiebrZNZ1dOkF0cCIlO8jQ47nCkam9Lilz9GhDF1I6XGLzfnhwDIIZVfI7+8SSgfHsijqXENOGJF5QorG4EcW0OrScqX/dDrXpr70Ut/BII+1OfECPuYz/NWxYmgrCsUskxPvyhgmrw+WGZ6lGTuOlIyCYWTFyWjpM5KIZRUIOwjRNYRQ6tZF9BXtk8hWAHPtLNJ727Fq0JSkC1FDRRF0Jalj0d5qVh2KEpM2TuSsCYTCT6ZkdmFYI9LrYp5QayWbo6NXlZwcRD/61pth5Fq5EX423QQxNjhqWvvklkljOLkYjrmphXPZOJOk6Pg7HKMsrtQKcowzZoK3rx1ZUelGMdQA/HaKkjAt2RgqpZeYqbNbH7Hp2ct4nqfSPOfe0ftiSTZJydOV6rG5bQbyLK+nRuCC0343PzDgiOXyQA5c14BTZi98uR/5KJ1SnatLdoO50WWBQZPTq0VgsklU3h932actuo17ayrHrb/3ykiegd3KbqF2wbV6RrlsJ07yLcpsWFTul9RyK6ZScr+tk7oNrFj0o7HQUlj4EiEvJ6rPLKSmlMZCrksl1OnLaRkxc+/HB1naMhNtT/6yM2bDs6azCRHrM3aVPN7aW8irD/10B8njpAMcsl8okXcdKrl4sPsLmQVy/Sj90ucPRc/d/Bxxj+dXSpCayen32D+hLi16MsIV8gfCXrYp6ySsiJKRUF0XXiLpVbFU+fNv4r7mOwhFsX4ZdwpSi1DYs2jb6ebZ9788cblTzMrYhu7sf/17IFdtuviJ2ioHA6pMHkoH4CLUeMBU7iGkxuM/YgcdderF9ibRdc7O982F1HpYhjfWUe+x5a6pjop9iNLfoePvlsdZdTSMwfxSmTY20Q0eHnUNzga1edeNmmqbg18aMVR1L9vwSXHF9TfIWBxpKLs2hj3eQeBC0USvp2HHF3eIkRdhFOd6ER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/I/4J8AAo/80BciBec4AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"2f763d9e-81e1-4ce2-a897-3fe2c72ab9f0","Name":"Create Azure Website Staging Slot. Requires Azure PowerShell to be installed on Tentacle machine","Description":"Creates a staging slot for Azure Website. \n\nProvides Azure publish url as variable:\n\n #{Octopus.Action[Create Staging Slot Step Name].Output.AzurePublishUrl}\n\nAnd Username/Password for publishing:\n\n #{Octopus.Action[Create Staging Slot Step Name].Output.AzureUsername}\n #{Octopus.Action[Create Staging Slot Step Name].Output.AzurePassword}","Version":5,"ExportedAt":"2015-03-25T08:51:15.660+00:00","ActionType":"Octopus.Script","Author":"trailmax","Parameters":[{"Name":"AzureWebSite","Label":"Azure Web Site Name","HelpText":"Name of the web-site in Azure","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Check if Windows Azure Powershell is avaiable \ntry{ \n Import-Module Azure -ErrorAction Stop\n}catch{\n throw \"Windows Azure Powershell not found! Please make sure to install them from http://www.windowsazure.com/en-us/downloads/#cmd-line-tools\" \n}\n\n\n$stagingWebsite = Get-AzureWebsite -Name $AzureWebSite -Slot staging -ErrorAction SilentlyContinue\n\n\nif($stagingWebsite -eq $null)\n{\n Write-Host \"Creating staging slot\"\n $stagingWebsite = New-AzureWebsite -Name $AzureWebSite -Slot staging -Location $Location\n}\n\n\nSet-OctopusVariable -name \"AzurePassword\" -value $stagingWebsite.PublishingPassword\nSet-OctopusVariable -name \"AzureUsername\" -value $stagingWebsite.PublishingUsername\n\n$urlString = ($stagingWebsite.SiteProperties.Properties | ?{ $_.Name -eq \"RepositoryURI\" }).Value.ToString()\n$url = [System.Uri]$urlString\n\n\nSet-OctopusVariable -Name \"AzurePublishUrl\" -value $url.Host","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/create-azure-website-staging-slot.json","Website":"/step-templates/2f763d9e-81e1-4ce2-a897-3fe2c72ab9f0","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////AHjXf7vrv931QJrh7/f8EIDaIIncMJHfYKvmz+b3n8zw3+76j8Ttr9XycLPpUKLkkKvYFAAABGZJREFUeNrsnNmCqjoQRc1MEiD8/9cer7Yt2KBJZQC8ez07sKlKTQlcLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzoUSnt8YxXlFuGHSbIaxvj+fip4btkLn1blkWLaF5v03yLhLOYlVuGYfMOMZzNGxCOzhjTJqFkXnjq3Dr1yyvPI3hGl3Ih3zzHHNKudRstRhX5O58vIcShY67Gq6EPIESlzUWvazaGAOGbvU7ArDu/g8M4o8opDZWvbvPzlL/MMBE8jT9T9W7PbAJlHPTBFRf9yVTEcs63msXz2UHLSgf650G/d5t+wjbxxB2UCMqGrk8/LFSD7uJMeNt5bcJCyQZyAe5Fo9KYfWS2flQrr4b4tpuzaeWjYs49rt9LHf9uZD7+VbyVi9EBNrjYjuq2sxQOrl+p+HuBVu45qvqfq691ttYFQ5KyKbyJgaIY/NGxrlWZwlwGvmvu1oY3PuAv0niTq6tZ78jk//9uc1r1r4lQki7y7sp2Tu4V1y2iLoqFTqi1lIGcpFiebrZNZ1dOkF0cCIlO8jQ47nCkam9Lilz9GhDF1I6XGLzfnhwDIIZVfI7+8SSgfHsijqXENOGJF5QorG4EcW0OrScqX/dDrXpr70Ut/BII+1OfECPuYz/NWxYmgrCsUskxPvyhgmrw+WGZ6lGTuOlIyCYWTFyWjpM5KIZRUIOwjRNYRQ6tZF9BXtk8hWAHPtLNJ727Fq0JSkC1FDRRF0Jalj0d5qVh2KEpM2TuSsCYTCT6ZkdmFYI9LrYp5QayWbo6NXlZwcRD/61pth5Fq5EX423QQxNjhqWvvklkljOLkYjrmphXPZOJOk6Pg7HKMsrtQKcowzZoK3rx1ZUelGMdQA/HaKkjAt2RgqpZeYqbNbH7Hp2ct4nqfSPOfe0ftiSTZJydOV6rG5bQbyLK+nRuCC0343PzDgiOXyQA5c14BTZi98uR/5KJ1SnatLdoO50WWBQZPTq0VgsklU3h932actuo17ayrHrb/3ykiegd3KbqF2wbV6RrlsJ07yLcpsWFTul9RyK6ZScr+tk7oNrFj0o7HQUlj4EiEvJ6rPLKSmlMZCrksl1OnLaRkxc+/HB1naMhNtT/6yM2bDs6azCRHrM3aVPN7aW8irD/10B8njpAMcsl8okXcdKrl4sPsLmQVy/Sj90ucPRc/d/Bxxj+dXSpCayen32D+hLi16MsIV8gfCXrYp6ySsiJKRUF0XXiLpVbFU+fNv4r7mOwhFsX4ZdwpSi1DYs2jb6ebZ9788cblTzMrYhu7sf/17IFdtuviJ2ioHA6pMHkoH4CLUeMBU7iGkxuM/YgcdderF9ibRdc7O982F1HpYhjfWUe+x5a6pjop9iNLfoePvlsdZdTSMwfxSmTY20Q0eHnUNzga1edeNmmqbg18aMVR1L9vwSXHF9TfIWBxpKLs2hj3eQeBC0USvp2HHF3eIkRdhFOd6ER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/I/4J8AAo/80BciBec4AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"26c779af-4cce-447e-98bb-4741c25e0b3c","Name":"Create Scheduled Tasks From XML","Description":"This will create a schedule task based on exported xml. See https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx for instructions on how to export scheduled tasks as xml.","Version":27,"ExportedAt":"2015-04-29T14:15:45.938+00:00","ActionType":"Octopus.Script","Author":"josh3ennett","Parameters":[{"Name":"xmlFileName","Label":"Xml File List","HelpText":"A list of XML files, separated by ';', containing the scheduled tasks to create.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Name":"username","Label":"User Name","HelpText":"The User that the task will run as","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"password","Label":"Password","HelpText":"The password of the user the task will run as","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n [string]$xmlFileName,\n [string]$userName,\n [string]$password\n)\n\n$ErrorActionPreference = \"Stop\" \n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\nFunction Create-ScheduledTask($xmlFileName, $taskName, $username, $password){\n\t$Command = \"schtasks.exe /create /tn $($taskName) /RU $($username) /RP $($password) /XML $($xmlFileName)\"\n\n\tWrite-Host $Command\n\tInvoke-Expression $Command\n }\n\nFunction Delete-ScheduledTask($TaskName) { \n\t$Command = \"schtasks.exe /delete /tn `\"$TaskName`\" /F\" \n\tInvoke-Expression $Command \n}\n\nFunction Stop-ScheduledTask($TaskName) { \n\t$Command = \"schtasks.exe /end /tn `\"$TaskName`\"\" \n\tInvoke-Expression $Command \n}\n\nFunction Start-ScheduledTask($TaskName) { \n\t$Command = \"schtasks.exe /run /tn `\"$TaskName`\"\" \n\tInvoke-Expression $Command \n}\n\nFunction ScheduledTask-Exists($taskName) {\n $schedule = new-object -com Schedule.Service \n $schedule.connect() \n $tasks = $schedule.getfolder(\"\\\").gettasks(0)\n\n foreach ($task in ($tasks | select Name)) {\n\t #echo \"TASK: $($task.name)\"\n\t if($task.Name -eq $taskName) {\n\t\t #write-output \"$task already exists\"\n\t\t return $true\n\t }\n }\n\n return $false\n}\n\nFunction GetTaskNameFromXmlPath($xmlFile){\n return (Split-Path -Path $xmlFile -Leaf -Resolve).Split(\".\")[0]\n}\n\n& {\n param(\n [string]$xmlFileName,\n [string]$userName,\n [string]$password\n ) \n\n Write-Host \"Create Schedule Task From XML\"\n Write-Host \"xmlFileName: $xmlFileName\"\n Write-Host \"userName: $userName\"\n Write-Host \"password: \"\n\n $xmlFileName.Split(\";\") | foreach{\n $xmlFile = $_.Trim()\n $taskName = GetTaskNameFromXmlPath($xmlFile)\n\n\n if((ScheduledTask-Exists($taskName))){\n\t Write-Output \"$taskName already exists, Tearing down...\"\n\t Write-Output \"Stopping $taskName...\"\n\t Stop-ScheduledTask($taskName)\n\t Write-Output \"Successfully Stopped $taskName\"\n\t Write-Output \"Deleting $taskName...\"\n\t Delete-ScheduledTask($taskName)\n\t Write-Output \"Successfully Deleted $taskName\"\n }\n\n Write-Output \"Create a Scheduled Task from $xmlFile called $taskName. Run as $username\" \n Create-ScheduledTask \"$($xmlFile)\" $taskName $username $password\n }\n\n}`\n(Get-Param 'xmlFileName' -Required)`\n(Get-Param 'userName' -Required)`\n(Get-Param 'password' -Required)","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"XML","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/scheduled-task-create-from-xml.json","Website":"/step-templates/26c779af-4cce-447e-98bb-4741c25e0b3c","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"40af3b8d-83b0-499e-99ed-e4b1093a7633","Name":"Datadog - Create Event","Description":"Datadog is cloud monitoring service which allows you to push arbitrary events into via an api. This task allows you to create an event to correlate with other data.","Version":1,"ExportedAt":"2014-07-08T02:19:06.141+00:00","ActionType":"Octopus.Script","Author":"bigbam505","Parameters":[{"Name":"ApiKey","Label":"Datadog Api Key","HelpText":"The api key used to authenticate with Datadog.","DefaultValue":null},{"Name":"EventTitle","Label":"Title","HelpText":"The title for the event to publish.","DefaultValue":null},{"Name":"EventBody","Label":"Body","HelpText":"The text to provide more information about the event.","DefaultValue":null},{"Name":"AlertType","Label":"Alert Type","HelpText":"The alert type out of the following options: \"error\", \"warning\", \"info\" or \"success\".","DefaultValue":"info"},{"Name":"Priority","Label":"Priority","HelpText":"The priority out of the following: \"normal\" or \"low\".","DefaultValue":"normal"},{"Name":"Tags","Label":"Tags","HelpText":"A comma separated list of tags to identify the event.","DefaultValue":null},{"Name":"DatadogEndpoint","Label":"Datadog Endpoint","HelpText":"The endpoint for datadog, for most (if not all) instances this should just be \"https://app.datadoghq.com\"","DefaultValue":"https://app.datadoghq.com"}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Lets handle our own errors here\n$ErrorActionPreference = \"continue\"\n\n$apiKey = $OctopusParameters['ApiKey']\n$title = $OctopusParameters['EventTitle']\n$body = $OctopusParameters['EventBody']\n$alertType = $OctopusParameters['AlertType']\n$priority = $OctopusParameters['Priority']\n$tags = $OctopusParameters['Tags']\n$endpoint = $OctopusParameters['DatadogEndpoint']\n$eventsApiEndpoint = \"/api/v1/events\"\n\n# Write out some debug information\nWrite-Host \"Event Title: $title\"\nWrite-Host \"Event Body: $body\"\nWrite-Host \"Alert Type: $alertType\"\nWrite-Host \"Priority: $priority\"\nWrite-Host \"Tags: $tags\"\nWrite-Host \"Datadog Endpoint: $endpoint$eventsApiEndpoint\"\n\n# Create the url from basic information\n$url = \"$endpoint$eventsApiEndpoint`?api_key=$apiKey\"\n$tagString = [system.String]::Join(\"`\",`\"\", $tags.Split(\",\"))\n\n$json = @\"\n{\n \"title\": \"$title\",\n \"text\": \"$body\",\n \"priority\": \"$priority\",\n \"tags\": [\"$tagString\"],\n \"alert_type\": \"$alertType\"\n }\n\"@\n\n# Make the response and handle exceptions **Requires PS 3.0 + \ntry {\n $response = Invoke-WebRequest -Uri $url -Method POST -Body ($json | ConvertFrom-Json | ConvertTo-Json) -ContentType \"Application/json\"\n}catch{\n Write-Error \"Error: $_\"\n EXIT 0\n}\n\n# Some Error handling here\nif($response.StatusCode -ne 202){\n Write-Error \"There was an error listing response content below to debug\"\n $response.RawContent\n}else{\n Write-Host \"Sent Successfully\"\n}\n\n# We usually don't want to fail a deployment because of this\nEXIT 0","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Datadog","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/datadog-create-event.json","Website":"/step-templates/40af3b8d-83b0-499e-99ed-e4b1093a7633","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"4db094ce-9c74-499d-8129-ce973cdaa9d4","Name":"Datadog - Schedule Downtime","Description":"Datadog is cloud monitoring service which allows you to push arbitrary events into via an api. This task allows you to schedule a downtime event to prevent error alerts during a deployment.","Version":3,"ExportedAt":"2016-03-01T23:11:19.809Z","ActionType":"Octopus.Script","Author":"ryankelley","Parameters":[{"Name":"ApiKey","Label":"Datadog Api Key","HelpText":"The api key used to authenticate with Datadog","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AppKey","Label":"Datadog Application Key","HelpText":"The Application key used to authenticate with Datadog","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DatadogEndpoint","Label":"Datadog Endpoint","HelpText":"The endpoint for datadog, for most (if not all) instances this should just be \"https://app.datadoghq.com\"","DefaultValue":"https://app.datadoghq.com","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Environment","Label":"Environment","HelpText":"Environment tag in Datadog to schedule the downtime for","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Duration","Label":"Downtime Duration (seconds)","HelpText":"How long should the downtime be scheduled for, in seconds default is 10 minutes","DefaultValue":"600","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"# Lets handle our own errors here\n$ErrorActionPreference = \"continue\"\n\n$apiKey = $OctopusParameters['ApiKey']\n$appKey = $OctopusParameters['AppKey']\n$endpoint = $OctopusParameters['DatadogEndpoint']\n$downtimeApiEndpoint = \"/api/v1/downtime\"\n$scope = $OctopusParameters['Environment']\n$durstring = $OctopusParameters['Duration']\n\n[int]$duration = [convert]::ToInt32($durstring,10)\n\n# Write out some debug information\nWrite-Host \"Scheduling Downtime for: $scope\"\nWrite-Host \"Datadog Endpoint: $endpoint$downtimeApiEndpoint\"\n\n# Create the url from basic information\n$url = \"$endpoint$downtimeApiEndpoint`?api_key=$apiKey&application_key=$appKey\"\n\nWrite-Host $url\n\n$start=[Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat \"%s\"))\n$end = $start + $duration\n$json = @\"\n{\n \"scope\": \"env:$scope\",\n \"start\": \"$start\",\n \"end\": \"$end\"\n }\n\"@\n\n# Make the response and handle exceptions **Requires PS 3.0 + \ntry {\n $response = Invoke-WebRequest -Uri $url -Method POST -Body ($json | ConvertFrom-Json | ConvertTo-Json) -ContentType \"Application/json\"\n}catch{\n Write-Error \"Error: $_\"\n EXIT 0\n}\n\n# Some Error handling here\nif($response.StatusCode -ne 200){\n Write-Error \"There was an error listing response content below to debug\"\n $response.RawContent\n}else{\n Write-Host \"Sent Successfully\"\n}\n\n# We usually don't want to fail a deployment because of this\nEXIT 0"},"Category":"Datadog","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/datadog-schedule-downtime.json","Website":"/step-templates/4db094ce-9c74-499d-8129-ce973cdaa9d4","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"bf005449-60c2-4746-8e07-8ba857f93605","Name":"Deploy ISPAC SSIS project from a package","Description":"This step template will deploy SSIS ISPAC projects to SQL Server Integration Services Catalogs","Version":11,"ExportedAt":"2016-10-17T19:59:22.607+00:00","ActionType":"Octopus.Script","Author":"Raechen79","Parameters":[{"Name":"ServerName","Label":"Database server name (\\instance)","HelpText":"Name of the SQL Server you are deploying to.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"EnableCLR","Label":"Enable SQL CLR","HelpText":"This will reconfigure SQL Server to enable the SQL CLR. It is highly recommended that this be previously authorized by your Database Administrator.","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"CatalogName","Label":"Catalog name","HelpText":"Name of the catalog to create in Integration Services Catalogs on SQL Server. When using the GUI, this value gets hardcoded to SSISDB and cannot be changed. It is recommended that you do not change the default value.","DefaultValue":"SSISDB","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"CatalogPwd","Label":"Catalog password","HelpText":"Password to the Integration Services Catalog.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"FolderName","Label":"Folder name","HelpText":"Name of the folder to use within the Integration Services Catalog","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ProjectName","Label":"Project name","HelpText":"Name of the project within the folder of the Integration Services catalog","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"UseEnvironment","Label":"Use environment","HelpText":"This will make a project reference to the defined environment.","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"EnvironmentName","Label":"Environment name","HelpText":"Name of the environment to reference the project to. If the environment doesn't exist, it will create it.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ReferenceProjectParametersToEnvironmentVairables","Label":"Reference project parameters to environment variables","HelpText":"Checking this box will make Project Parameters reference Environment Variables. If the Environment Variable doesn't exist, it will create it. This expects that an Octopus variable of the same name exists.","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"ReferencePackageParametersToEnvironmentVairables","Label":"Reference package parameters to environment variables","HelpText":"Checking this box will make Package Parameters reference Environment Variables. If the Environment Variable doesn't exist, it will create it. This expects than an Octopus variable of the same name exists.","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"NugetPackageStepName","Label":"NuGet package step","HelpText":"The step that uploaded the NuGet package to the server.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"#region Functions\n\n#region Get-Catalog\nFunction Get-Catalog\n{\n # define parameters\n Param ($CatalogName)\n # NOTE: using $integrationServices variable defined in main\n \n # define working varaibles\n $Catalog = $null\n # check to see if there are any catalogs\n if($integrationServices.Catalogs.Count -gt 0 -and $integrationServices.Catalogs[$CatalogName])\n {\n \t# get reference to catalog\n \t$Catalog = $integrationServices.Catalogs[$CatalogName]\n }\n else\n {\n \tif((Get-CLREnabled) -eq 0)\n \t{\n \t\tif(-not $EnableCLR)\n \t\t{\n \t\t\t# throw error\n \t\t\tthrow \"SQL CLR is not enabled.\"\n \t\t}\n \t\telse\n \t\t{\n \t\t\t# display sql clr isn't enabled\n \t\t\tWrite-Warning \"SQL CLR is not enabled on $($sqlConnection.DataSource). This feature must be enabled for SSIS catalogs.\"\n \n \t\t\t# enablign SQLCLR\n \t\t\tWrite-Host \"Enabling SQL CLR ...\"\n \t\t\tEnable-SQLCLR\n \t\t\tWrite-Host \"SQL CLR enabled\"\n \t\t}\n \t}\n \n \t# Provision a new SSIS Catalog\n \tWrite-Host \"Creating SSIS Catalog ...\"\n \n \t$Catalog = New-Object \"$ISNamespace.Catalog\" ($integrationServices, $CatalogName, $CatalogPwd)\n \t$Catalog.Create()\n \n \n }\n \n # return the catalog\n return $Catalog\n}\n#endregion\n\n#region Get-CLREnabled\nFunction Get-CLREnabled\n{\n # define parameters\n # Not using any parameters, but am using $sqlConnection defined in main\n \n # define working variables\n $Query = \"SELECT * FROM sys.configurations WHERE name = 'clr enabled'\"\n \n # execute script\n $CLREnabled = Invoke-Sqlcmd -ServerInstance $sqlConnection.DataSource -Database \"master\" -Query $Query | Select value\n \n # return value\n return $CLREnabled.Value\n}\n#endregion\n\n#region Enable-SQLCLR\nFunction Enable-SQLCLR\n{\n $QueryArray = \"sp_configure 'show advanced options', 1\", \"RECONFIGURE\", \"sp_configure 'clr enabled', 1\", \"RECONFIGURE \"\n # execute script\n \n foreach($Query in $QueryArray)\n {\n \tInvoke-Sqlcmd -ServerInstance $sqlConnection.DataSource -Database \"master\" -Query $Query\n }\n \n # check that it's enabled\n if((Get-CLREnabled) -ne 1)\n {\n \t# throw error\n \tthrow \"Failed to enable SQL CLR\"\n }\n}\n#endregion\n\n#region Get-Folder\nFunction Get-Folder\n{\n # parameters\n Param($FolderName, $Catalog)\n \n $Folder = $null\n # try to get reference to folder\n \n if(!($Catalog.Folders -eq $null))\n {\n \t$Folder = $Catalog.Folders[$FolderName]\n }\n \n # check to see if $Folder has a value\n if($Folder -eq $null)\n {\n \t# display\n \tWrite-Host \"Folder $FolderName doesn't exist, creating folder...\"\n \n \t# create the folder\n \t$Folder = New-Object \"$ISNamespace.CatalogFolder\" ($Catalog, $FolderName, $FolderName) \n \t$Folder.Create() \n }\n \n # return the folde reference\n return $Folder\n}\n#endregion\n\n#region Get-Environment\nFunction Get-Environment\n{\n # define parameters\n Param($Folder, $EnvironmentName)\n \n $Environment = $null\n # get reference to Environment\n if(!($Folder.Environments -eq $null) -and $Folder.Environments.Count -gt 0)\n {\n \t$Environment = $Folder.Environments[$EnvironmentName]\n }\n \n # check to see if it's a null reference\n if($Environment -eq $null)\n {\n \t# display\n \tWrite-Host \"Environment $EnvironmentName doesn't exist, creating environment...\"\n \n \t# create environment\n \t$Environment = New-Object \"$ISNamespace.EnvironmentInfo\" ($Folder, $EnvironmentName, $EnvironmentName)\n \t$Environment.Create() \n }\n \n # return the environment\n return $Environment\n}\n#endregion\n\n#region Set-EnvironmentReference\nFunction Set-EnvironmentReference\n{\n # define parameters\n Param($Project, $Environment, $Folder)\n \n # get reference\n $Reference = $null\n \n if(!($Project.References -eq $null))\n {\n \t$Reference = $Project.References[$Environment.Name, $Folder.Name]\n \n }\n \n # check to see if it's a null reference\n if($Reference -eq $null)\n {\n \t# display\n \tWrite-Host \"Project does not reference environment $($Environment.Name), creating reference...\"\n \n \t# create reference\n \t$Project.References.Add($Environment.Name, $Folder.Name)\n \t$Project.Alter() \n }\n}\n#endregion\n\n#region Set-ProjectParametersToEnvironmentVariablesReference\nFunction Set-ProjectParametersToEnvironmentVariablesReference\n{\n # define parameters\n Param($Project, $Environment)\n \n if($Project.Parameters -eq $null)\n {\n Write-Host \"No project parameters exist\"\n return\n }\n\n # loop through project parameters\n foreach($Parameter in $Project.Parameters)\n {\n $Variable = $null\n if(!($Environment.Variables -eq $null))\n {\n \t # get reference to variable\n \t $Variable = $Environment.Variables[$Parameter.Name]\n }\n \n \t# check to see if variable exists\n \tif($Variable -eq $null)\n \t{\n \t\t# add the environment variable\n \t\tAdd-EnvironmentVariable -Environment $Environment -Parameter $Parameter\n \n \t\t# get reference to the newly created variable\n \t\t$Variable = $Environment.Variables[$Parameter.Name]\n \t}\n \n \t# set the environment variable value\n \tSet-EnvironmentVariableValue -Variable $Variable -Parameter $Parameter\n }\n \n # alter the environment\n $Environment.Alter()\n $Project.Alter()\n\n}\n#endregion\n\nFunction Set-PackageVariablesToEnvironmentVariablesReference\n{\n # define parameters\n Param($Project, $Environment)\n \n # loop through packages in project\n foreach($Package in $Project.Packages)\n {\n \t# loop through parameters of package\n \tforeach($Parameter in $Package.Parameters)\n \t{\n \t\t# get reference to variable\n \t\t$Variable = $Environment.Variables[$Parameter.Name]\n \n \t\t# check to see if the parameter exists\n \t\tif(!$Variable)\n \t\t{\n \t\t\t# add the environment variable\n \t\t\tAdd-EnvironmentVariable -Environment $Environment -Parameter $Parameter\n \n \t\t\t# get reference to the newly created variable\n \t\t\t$Variable = $Environment.Variables[$Parameter.Name]\n \t\t}\n \n \t\t# set the environment variable value\n \t\tSet-EnvironmentVariableValue -Variable $Variable -Parameter $Parameter\n \t}\n \n \t# alter the package\n \t$Package.Alter()\n }\n \n # alter the environment\n $Environment.Alter()\n}\n\n#region Add-EnvironmentVariable\nFunction Add-EnvironmentVariable\n{\n # define parameters\n Param($Environment, $Parameter)\n \n # display \n Write-Host \"Adding environment variable $($Parameter.Name)\"\n \n # check to see if design default value is emtpy or null\n if([string]::IsNullOrEmpty($Parameter.DesignDefaultValue))\n {\n \t# give it something\n \t$DefaultValue = \"\" # sensitive variables will not return anything so when trying to use the property of $Parameter.DesignDefaultValue, the Alter method will fail.\n }\n else\n {\n \t# take the design\n \t$DefaultValue = $Parameter.DesignDefaultValue\n }\n \n # add variable with an initial value\n $Environment.Variables.Add($Parameter.Name, $Parameter.DataType, $DefaultValue, $Parameter.Sensitive, $Parameter.Description)\n}\n#endregion\n\n#region Set-EnvironmentVariableValue\nFunction Set-EnvironmentVariableValue\n{\n # define parameters\n Param($Variable, $Parameter)\n \n # check to make sure variable value is available\n if($OctopusParameters -and $OctopusParameters.ContainsKey($Parameter.Name))\n {\n \t# set the variable value\n \t$Variable.Value = $OctopusParameters[\"$($Parameter.Name)\"]\n }\n else\n {\n \t# warning\n \tWrite-Warning \"OctopusParameters collection is null or $($Parameter.Name) not found in collection\"\n }\n \n # Set reference\n $Parameter.Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Referenced, \"$($Variable.Name)\")\n}\n#endregion\n\n\n#endregion\n\n#region Dependent assemblies\n\n# Load the IntegrationServices Assembly\n[Reflection.Assembly]::LoadWithPartialName(\"Microsoft.SqlServer.Management.IntegrationServices\") | Out-Null # Out-Null supresses a message that would normally be displayed saying it loaded out of GAC\n\n# Store the IntegrationServices Assembly namespace to avoid typing it every time\n$ISNamespace = \"Microsoft.SqlServer.Management.IntegrationServices\"\n\n# add snapins-- applies to sql server 2008 r2, newer version of SQL do not require this.\nAdd-PSSnapin SqlServerCmdletSnapin100 -ErrorAction SilentlyContinue\nAdd-PSSnapin SqlServerProviderSnapin100 -ErrorAction SilentlyContinue\n\n#endregion\n\n#region Main\ntry\n{\n\t# ensure all boolean variables are true booleans\n $EnableCLR = [System.Convert]::ToBoolean(\"$EnableCLR\")\n $UseEnvironment = [System.Convert]::ToBoolean(\"$UseEnvironment\")\n $ReferenceProjectParametersToEnvironmentVairables = [System.Convert]::ToBoolean(\"$ReferenceProjectParametersToEnvironmentVairables\")\n Write-Host \"Value is $ReferencePackageParametersToEnvironmentVairables\"\n $ReferencePackageParametersToEnvironmentVairables = [System.Convert]::ToBoolean(\"$ReferencePackageParametersToEnvironmentVairables\")\n\n\n\n \n # Get file path where Octopus deployed it\n $DeployedPath = $OctopusParameters[\"Octopus.Action[$NugetPackageStepName].Output.Package.InstallationDirectoryPath\"]\n\n \n # display the path where it's referencing\n Write-Host \"Package deployed to $DeployedPath\"\n\n\t# Get all .ispac files from the deployed path\n\t$IsPacFiles = Get-ChildItem -Recurse -Path $DeployedPath | Where {$_.Extension.ToLower() -eq \".ispac\"}\n\n\t# display number of files\n\tWrite-Host \"$($IsPacFiles.Count) .ispac file(s) found.\"\n\n\tWrite-Host \"Connecting to server ...\"\n\n\t# Create a connection to the server\n $sqlConnectionString = \"Data Source=$ServerName;Initial Catalog=master;Integrated Security=SSPI;\"\n $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString\n\n\t# create integration services object\n\t$integrationServices = New-Object \"$ISNamespace.IntegrationServices\" $sqlConnection\n\n\t# get reference to the catalog\n\tWrite-Host \"Getting reference to catalog $CataLogName\"\n\t$Catalog = Get-Catalog -CatalogName $CataLogName\n\n\t# get folder reference\n\t$Folder = Get-Folder -FolderName $FolderName -Catalog $Catalog\n\n\t# loop through ispac files\n\tforeach($IsPacFile in $IsPacFiles)\n\t{\n\t\t# read project file\n\t\t$ProjectFile = [System.IO.File]::ReadAllBytes($IsPacFile.FullName)\n\n\t\t# deploy project\n\t\tWrite-Host \"Deploying project $($IsPacFile.Name)...\"\n\t\t$Folder.DeployProject($ProjectName, $ProjectFile) | Out-Null\n\n\t\t# get reference to deployed project\n\t\t$Project = $Folder.Projects[$ProjectName]\n\n\t\t# check to see if they want to use environments\n\t\tif($UseEnvironment)\n\t\t{\n\t\t\t# get environment reference\n\t\t\t$Environment = Get-Environment -Folder $Folder -EnvironmentName $EnvironmentName\n\n\t\t\t# set environment reference\n\t\t\tSet-EnvironmentReference -Project $Project -Environment $Environment -Folder $Folder\n\n\t\t\t# check to see if the user wants to convert project parameters to environment variables\n\t\t\tif($ReferenceProjectParametersToEnvironmentVairables)\n\t\t\t{\n\t\t\t\t# set environment variables\n\t\t\t\tWrite-Host \"Referencing Project Parameters to Environment Variables...\"\n\t\t\t\tSet-ProjectParametersToEnvironmentVariablesReference -Project $Project -Environment $Environment \n\t\t\t}\n\n\t\t\t# check to see if the user wants to convert the package parameters to environment variables\n\t\t\tif($ReferencePackageParametersToEnvironmentVairables)\n\t\t\t{\n\t\t\t\t# set package variables\n\t\t\t\tWrite-Host \"Referencing Package Parameters to Environment Variables...\"\n\t\t\t\tSet-PackageVariablesToEnvironmentVariablesReference -Project $Project -Environment $Environment\n\t\t\t}\n\t\t}\n\t}\n}\n\nfinally\n{\n\t# check to make sure sqlconnection isn't null\n\tif($sqlConnection)\n\t{\n\t\t# check state of sqlconnection\n\t\tif($sqlConnection.State -eq [System.Data.ConnectionState]::Open)\n\t\t{\n\t\t\t# close the connection\n\t\t\t$sqlConnection.Close()\n\t\t}\n\n\t\t# cleanup\n\t\t$sqlConnection.Dispose()\n\t}\n}\n#endregion\n","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"SQL Server","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/ssis-deploy-ispac-from-package.json","Website":"/step-templates/bf005449-60c2-4746-8e07-8ba857f93605","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD9QTFRFlZ+r3DAr6p+dy8/V4G9t////5efp9M7NrLS+wCYm8/T1vcPK1tnd10xK+fn6/PLyUU5O+eXk3+Hk7O3u7/DxS2XoPwAADb9JREFUeNrsnYl6nbgOgMEYDHghGN7/Wa8k70B6s3AOZD5o2umcSaf+0S4bUbX/kat6QB6QB+QBeUAekAfkAXlAHpAH5AF5QB6QB+QBeUAekAckXMv4XwBZVCPVnwcZlZSNXRrzp0HGTkqplrY1zfKHQboGMZwoGvVXQUbVy152QaPUu3XrJJCl6Xsp1/SBfbdunQJiZd/3zVqqmfprIEb1iLHRpLF5s279FsQ0iCH3etQ03R8CQYyq74/MwTbN3wGxQFGRRJTaJiVL815z/wXIIiviQEunq2lsNyZhvdfcfw6iCMPavl9H20jkgV8gP1F2NRRJmvEvgIA4gAS0B8xkpexEYWB3F0ijAyOxfwAkcsBvHQk53QWW71HwGm8PIhJHazIS98HYdUqBar1TJD8EYQOABGNe+w0J0dj3iuSHIOMw6PRHOyDpdhggE2XvDmLYAChsDh4MSPI1g92DWkGaosbbey0kARbOyFCaTCYgDemioQWp3D+O9EO4NGNCRpIFMKQzjlG9TyS/iOwoE64jjeaVwICOzjeoGfgue38QshPRMV57lhpVjbNemZTMK7X+gaQRSRgQzaz2JDX9CjRiDvWV+gMgRniSltWMMV0TSo1fcIEjEAKUa7k/CDiomkjaeeAU8JEmoRAOuoLp/hWidTJp9RBiipkF07our9fj/Lpmn51MeM2TnAx5gnp/cRZj6P2aD6BdWoBu1QUeiESwWoCu8a10OBfzHUFaATIxoFssfjIxUKbZiJobkg/ibFSNny2aM/pa4Lt0y4eoWwJkQP9S11NQNoOmw18Ic0qDDsIIg59TiC517aTDa5a7OBDPLDjRBMemmbgTCIhjEINbNVpHLXzozzxAhI4mg9ETv7i4DwhYiHa6JfA2T9F6dPltaDwgBQifwgG5ZOAMlpNAZlrShEpW8ykG/mgkCaMmX40LXwX3uUBR21wLgoYxoMOtc22agpJlGBM5AYF5pcFUwOkXXr8Ty2n7IxrWgze4sIo6WrvD4LNx6pc8QDtzHVA0uwGIcJ6otO4IQhahfZLCtqYjYiUwsOlqEMMp8S31w4MIHrUKv1PvnZlhsUJjF4NAWHQ5PCRUIoGA5XutEpMJsquPFjvzX6GcB2I0Ybg45wWDpi/Iz7K07QPiOfZQEwtls7gShCL6kGe6U4tBg8Bmk7syfSjRpF0glOVCEDT3Mp0KQZyV+cxeswKEjur1baGcuc8O66bQsM10C0Wa6jy4oG2E7gXkXeAxdOdhmLkMBPxWSLJyFj5vBKJLURAGJ58m0NKNcuLh01UgLLvXU87CWSEQVlDUSOHu/gQp2xgaTSAidRFISICjl83UiyVYl3/NIdHiKQZy73pNEIq4BqTNzZht2w8sCISjXWjnqYtcEZtLwTBM9c2Qci5I+ouDYs2sQMGPZxH+Y5kGiFIE6nskp4LwEPcmTpaBd99MqZTiLHPK2wwRDAQq5sxVjeS+enMBSGhAzMRhQsTIUOK1Lz9w2cWHZqy+YSevkMiknWvSMRfZoGg2mX1ecBA6yHupCyRCEqDkasaqMYsYc/LGRwWUmdHd7j4dG/x4ukIiE3HQ382KVDF546NAN9XHSmQsWo65wkbmuFSdxcdCtQ7yKP2ZgzLdx9dc19kSEbFqF0mzdsYuDgydf/I/RW8m324jPGUgPPgsoTPz0Af5MNn0p5ZgZpDJ9F6QfI2ztxQf/TT3DS+2J8Hm8b/sYAJxmXeCzJukikdnpcUUG5BeKKzQnfpf0UJUX4gmpyaNdVoQJlWzYSGGG9I5Fz0mXtoJGEh9sPc70ZZErBrN+0AMyyTCkkEwr1BJe1hOwnfysEiQyl5dMWneqlp8iGGCstyI4YLIVKT4gwfDJmvMTHDrIUP44FWz4JbEe93vnIUJXlSHyUDi92rnps1c+/LcgBiG7OIghqu6KHHXYxZlMsLLfpAzlAGTfjB0ICzlgLq0jqO5rGbnIAudtU+KqpAfKiI25XghCM3cuYlvn34+D2Qil5rqKDZlWRY/BA97CkM4aWRb89Pz2+eBsIHMedab1smks62fogs0+JMSDmL+3RH080B8a9qDCJMVvXrehgiu6yiP+pRN0epEgQi3SeUkkgeXXUOuDmdWBn7Wbuh5Gz2U67JtgsvqomUdtw4RQnNx3hMNJ269QS2iXRN7DrmUmXXGIYr+48knBqoTLUR4xztTXzRU73OgSPvSmov27OscELCEQWBgQM1hrjqc2tR+EPx1ojgVZMJTc+hzQzXl2sCc0pVMFkDRLa85iHbWyQe0Xoau1rkrg0AMk5VU5pJCmeXOILR9CMGCJ7cL5TuDJCVReDe7Aoi5K8hUUwKYc4A0MoXCLRy/+vHOIKBYPnXnbVk7BY1KS78zCKPNJShmY/9pjo0ToJjW/PErtJHxniCCjjtAxMBds9LXcrYCIZjFau4PAqURxwg+bDvvuJ/WdeiiEGW8PYge9GSEL7yjMNxOlLGd87XjGi3jriC4k4tHY8H5Gn94GUtc56QiCBn5eGcQMHRB9epEe2yDE0boe4y2i0f8jUcBkPV2IHg2nmHDkwk+uAqD573Q1dps0WAqYPTLi0L7r0CAAXs4NR3vxy8mi+fDAKRQI0AZ7wgyD7j8AQ/O0bMjrDFL8cjeYu0m+KEDux2IyLo4qFM0Q6R4GKnbgbQ3BDE6UdRsXpxWdblIrN00p0fiuBfIpCMGbtIafHwS8UAkYaHG2uLpRHBcKzqvW4GM6Skxhs62a6R7fh0fPgyZripARnK8NwOJ8gh9UXz00K0fn5p2v1uUXXZp771AhN6cc8PZLt4ejFJ+3INV8fm3cQkl7nqngOj9le7jJ8ARAwgqF0HFhxDHDq775Vp0SgGb/308XEEjg5KLbUgmo1Kdx8hSlRuBOHlU2bPfBp8GzSIGPn1o246e3BvBB9usKLwPCHPHqPAx42C1thAIkTQKn80fF6tsNtHiTiB0imelAQlBIluBOJmAVPBRXWXL6QM3ATGYslPhKpNEmq1AnJ04kI2vvQnIxAftXWofQRYUyGZxOJMDOXZjd+4BYnU6mZdApOw3AulwcAWR2O2ib9EOEoNOSSCqFi1f4ViXbL2Lokki3ka2MrkDiKryg5IIgqePRpxRozYUjmQxi9o+Pb1e3/tVVTG1yaJuGZz2IHt/nGoEN9zQbBe1di53NOCEi3p3vbwbX8oD7n1PkzfwH5RljX7iDs7fMDQ5yHrrtrmpLFeDyKraqDbpFk6pkRKsO04NckYBJW8a5bZCpWh9s7HrXpMzfhVEVdX2RtLENhpJJSWNcUKMkBqqppgTBmKBPGVEVeu68UIQ4NjPLwtjtUg08KOx2dCK3eQ2SOQtSAMkciHIUlX9/tMmkRQUXiB7JwtlbpbPXwBiqqra3cZVxUlnSaPCHwCLPzo/jYp1JUi/U6yuwZltNH6uPxh8YuXRHKcRdMsCSHsViK0KjzUqWSWMvt8bj5EHY3LR3MfWdt1yGUiVCQRFUdGXBNWqjklU6KhkOmUpD4Yqq1uvAmkAZHVdBZrXBhQ0CXcBDmcm2y4c+uHCnGxIVJZNlfVWkIpcVgf330HY0e19UIqyODMpyUGzlkwYWb4FkfFFtv7/QSwtP0CYTFCUxq877VpzgWASmWXAdtN7fCdIUKcyUEBo6StSKU9i8s6Q7Lyboiw4a9JhfL8KpE/j/3Lr7WMzyJHEiqTzAjEuoy+cs/Nc14CYqjoK62AxMnnbPqTAVC+iQHBQOUbFctnYUjFXSYQU6yD36vNAntTL0sCzhvL57d03arfP8GaJVJu/fu03xUnn1KtznSGXCO/vPVYmS3uljWx1q/eRJQ/mfr6sT+ibIy+LFZZpr/VayyZE7lPCzk2XpQmznwxffulova/FkUIk3VFxAiWIT+jlZwOL15eOcftSZK+KpR94MaNkVmF9MggQQ7y5EERVpXKBoZfeyNhYmXjVOjYRTFXaC0G8SIKb2lbvnYzlFU2PX7y977TotZr1FZDFk7ipnoWhLzJUJqBO1BmiXpYfxVyuGzdNzKUglMgHmWQRfWloSDmkYW6BaZwppryeJenYi8eBfqn50ESZNMFARuUyYhnbV2qbBVuXpjQuczdF+nhVO6j3JIszENO4MCkzmx59C3VbpvuWtrUvHr/+9QZdcMPGyUJu2gtyN4U5erV1wZHlLx7H/NWWaRNAKK3fh2572IaIFkNiMXcACb4LKI5KCih8q+PH7QxVV0v36pHlX99WMLLaBfmi8D2I5ytOlZYY6ZtXv2rhOztWNghlp1gdvpxgr1ApnR9f/qaFb+0hRqFsh6tjMNmJIo+J9uWvI/nm9vQaUfIb3JQG0imXz2fRsHn5C2K+e2DArH1QsNhvGKuUR462OWhsr/Llbyf4yaEaGR2Yu83gsVaftLgMUtqN4b/hFR4/O69lk1iUsVTTG+VFofbbz+YN73776VFAH99dG1Iu7l09Uh1bdCdf/wqlXxyXHRML5sD/GBD/jpfx/fJsvOttu589vnXv2KhAIBgYQQNfNg//hBdyQcio+vCjxxpks1gLApmqj+rjox0/5G1BgteVfbaPhTjR6Okwl/kAFtl/9PcGyWqpPutEYFW1dM5CAARkcneJlDwLlVP+dVDhMNdHW8mP45TzriBZ7k+Xi4W9kbMS0v5JkDdeD8gD8oA8IA/IA/KAPCAPyAPygDwgD8gD8oA8IA/IA/IXr/8JMAAhf0RDrOWy2QAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"1409c3dd-e87d-49f1-9b4f-382af800b75d","Name":"Deploy SSAS from Package","Description":"Deploys SSAS packages using Microsoft.AnalysisServices.Deployment.exe.","Version":11,"ExportedAt":"2016-12-23T17:18:25.357Z","ActionType":"Octopus.Script","Author":"twerthi","Parameters":[{"Id":"435fbf52-470d-442f-88d3-0b708dfc3657","Name":"SsasPackageStepName","Label":"","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"},"Links":{}},{"Id":"a0713297-cdeb-47cd-ac43-4bf9603c8052","Name":"SsasServer","Label":"Server","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"7bf5ec64-3383-40ae-935e-e78c236cdf21","Name":"SsasDatabase","Label":"Database","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"d7d4fcbc-d0d4-4a3b-b477-28d23fbe1f9b","Name":"SrcServer","Label":"Data Source - Server","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"45b60a3f-9339-4c69-bc14-df94b47be9e7","Name":"SrcDatabase","Label":"Data Source - Database","HelpText":null,"DefaultValue":"Warehouse","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$ErrorActionPreference = 'Stop'\n$regKeyFormat = 'HKLM:\\Software\\Wow6432Node\\Microsoft\\Microsoft SQL Server\\{0}0\\Tools\\ClientSetup\\'\n$vsVersions = @( '12' )\n\nfunction Validate-Argument($name, $value) {\n if (!$value) {\n throw ('Missing required value for parameter ''{0}''.' -f $name)\n }\n return $value\n}\n\n# Returns the Microsoft.AnalysisServices.Deployment.exe path\nfunction Load-SsasDeploy {\n # display\n Write-Output \"Beginning search of registry starting in HKLM:\\Software\\Wow6432Node\\Microsoft\\Microsoft SQL Server\\ ...\"\n \n # define base registry key\n $regKeyFormat = 'HKLM:\\Software\\Wow6432Node\\Microsoft\\Microsoft SQL Server\\'\n\n # get all of the SQL registry keys\n $SQLRegistryKeys = Get-ChildItem -Path $regKeyFormat | Where-Object {$TestVar = 0; [int]::TryParse($_.Name.Substring($_.Name.LastIndexOf(\"\\\") + 1), [ref] $TestVar) -eq $true} | Sort-Object {[int]$_.Name.Substring($_.Name.LastIndexOf(\"\\\") + 1)} -Descending\n\n # display number of items found\n Write-Output \"Found $($SQLRegistryKeys.Length) item(s) ...\"\n\n # make sure something was returned\n if($SQLRegistryKeys -ne $null)\n {\n # display\n Write-Output \"Searching keys for ClientSetup folder ...\"\n \n # retrieve paths to the tools\\binn path\n $SQLToolsPath = $SQLRegistryKeys | ForEach-Object {Get-ChildItem \"HKLM:\\$_\" -Recurse | Where-Object {$_.Name -like \"*ClientSetup\" }} | Where-Object {$_.Property -eq \"Path\"} | ForEach-Object {Get-ItemProperty -Path \"HKLM:\\$_\" -Name Path} | Select Path\n\n # make sure paths were found\n if($SQLToolsPath -ne $null)\n {\n # display\n Write-Output \"Found $($SQLToolsPath.Length) item(s), searching in descending order ...\"\n \n # loop through returned paths looking for Microsoft.AnalysisServices.Deployment.exe\n ForEach($Path in $SQLToolsPath)\n {\n # check to see if .exe exists\n if(($ReturnPath = Get-ChildItem -Path $Path.Path -Recurse | Where-Object {$_.Name -eq \"Microsoft.AnalysisServices.Deployment.exe\"}) -ne $null)\n {\n # display\n Write-Output \"Found $($ReturnPath.FullName) ...\"\n\n # return\n return $ReturnPath.FullName\n }\n }\n\n # display error\n Write-Error \"Unable to find Microsoft.AnalysisServices.Deployment.exe! `r`nSearched $SQLToolsPath.\"\n }\n else\n {\n # display error\n Write-Error \"No ClientSetup registry keys found!\"\n }\n }\n else\n {\n # display error\n Write-Error \"No SQL installations found!\"\n }\n}\n\n# Update Deploy xml (.deploymenttargets)\nfunction Update-Deploy {\n\t[xml]$deployContent = Get-Content $file\n\t$deployContent.DeploymentTarget.Database = $ssasDatabase \n\t$deployContent.DeploymentTarget.Server = $ssasServer\n\t$deployContent.DeploymentTarget.ConnectionString = 'DataSource=' + $ssasServer + ';Timeout=0'\n\t$deployContent.Save($file)\n}\n# Update Config xml (.configsettings)\nfunction Update-Config {\n\t[xml]$configContent = Get-Content $file\n $configContent.ConfigurationSettings.Database.DataSources.DataSource.ConnectionString = 'Provider=SQLNCLI11.1;Data Source=' + $dbServer + ';Integrated Security=SSPI;Initial Catalog=' + $dbDatabase\n\t$configContent.Save($file)\n}\n# Update Config xml (.deploymentoptions)\nfunction Update-Option {\n\t[xml]$optionContent = Get-Content $file\n $optionContent.DeploymentOptions.ProcessingOption = 'DoNotProcess'\n\t$optionContent.Save($file)\n}\n\n# Get arguments\n$ssasPackageStepName = Validate-Argument 'SSAS Package Step Name' $OctopusParameters['SsasPackageStepName']\n$ssasServer = Validate-Argument 'SSAS server name' $OctopusParameters['SsasServer']\n$ssasDatabase = Validate-Argument 'SSAS database name' $OctopusParameters['SsasDatabase']\n$dbServer = Validate-Argument 'SSAS source server' $OctopusParameters['SrcServer']\n$dbDatabase = Validate-Argument 'SSAS source database' $OctopusParameters['SrcDatabase']\n\n# Set .NET CurrentDirectory to package installation path\n$installDirPathFormat = 'Octopus.Action[{0}].Output.Package.InstallationDirectoryPath' -f $ssasPackageStepName\n$installDirPath = $OctopusParameters[$installDirPathFormat]\n\n#$ssasServer = 'server2\\md_dev'\n#$ssasDatabase = 'BusinessIntelligence'\n#$dbServer = 'server1\\dev'\n#$dbDatabase = 'Warehouse'\n#$installDirPath = 'c:\\packages\\v1'\n\nWrite-Verbose ('Setting CurrentDirectory to ''{0}''' -f $installDirPath)\n[System.Environment]::CurrentDirectory = $installDirPath\n\n$exe = Load-SsasDeploy\n\n$files = Get-ChildItem –Path $installDirPath\\* -Include *.deploymenttargets\nforeach ($file in $files) {\n $name = [IO.Path]::GetFileNameWithoutExtension($file)\n\n Write-Host 'Updating' $file\n Update-Deploy\n $file = $installDirPath + '\\' + $name + '.configsettings'\n Write-Host 'Updating' $file\n Update-Config\n $file = $installDirPath + '\\' + $name + '.deploymentoptions'\n Write-Host 'Updating' $file\n Update-Option\n\n $arg = '\"' + $installDirPath + '\\' + $name + '.asdatabase\" /s:\"' + $installDirPath + '\\Log.txt\"'\n Write-Host $exe $arg\n $execute = [scriptblock]::create('& ' + $exe + ' ' + $arg)\n Invoke-Command -ScriptBlock $execute\n}\n","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"SQL Server","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/ssas-deploy-from-package.json","Website":"/step-templates/1409c3dd-e87d-49f1-9b4f-382af800b75d","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"4e3a1163-e157-4675-a60c-4dc569d14348","Name":"Deploy SSRS Reports from a package","Description":"Uploads SSRS reports to an SSRS server from a NuGet package.","Version":49,"ExportedAt":"2018-01-10T23:41:35.335Z","ActionType":"Octopus.Script","Author":"twerthi","Parameters":[{"Id":"92daa94e-73f3-466e-a8db-35149646df2b","Name":"NugetPackageStepName","Label":"SSRS package step","HelpText":"Select the step in this project which downloads the SSRS package.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"},"Links":{}},{"Id":"0bb2f003-fda9-4571-86aa-3bad13775874","Name":"ReportServiceUrl","Label":"Url of SSRS Server service","HelpText":"The complete Url to the SSRS server.\nExample: http://198.239.216.46/ReportServer_LOCALDEV/reportservice2010.asmx?wsdl","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"feca8cfe-fe9e-4e8f-ac7e-b370b5ef3ef6","Name":"ReportExecutionUrl","Label":"Report Execution Url","HelpText":"The complete Url to the Report Execution service.\nExample: http://198.239.216.46/ReportServer_LOCALDEV/ReportExecution2005.asmx?wsdl","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1924b3a6-d5bf-4713-8bc7-6b77422a7944","Name":"ReportFolder","Label":"Report folder","HelpText":"Relative Url to the folder in which the reports will be deployed.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"28cc63a0-5a3e-4d22-8406-574bdb332fe1","Name":"ReportDatasourceFolder","Label":"Report data source folder","HelpText":"Relative Url where the data sources for the reports are located, starting with '/'","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"b1cdc16e-c2db-41eb-9ae8-8df02b05f03d","Name":"OverwriteDataSources","Label":"Overwrite datasource(s)","HelpText":"Tick if the existing report data source file needs to e replaced.","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}},{"Id":"b0e69f02-1f99-431a-852e-b0084ed23fd4","Name":"BackupLocation","Label":"Backup Location","HelpText":"Directory path to take a backup of existing reports (.rdl) and data source (.rds) files.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"a736f0b8-aa27-45ae-b6a0-43a76e44d85a","Name":"ReportDataSetFolder","Label":"DataSet folder","HelpText":"Relative Url where Shared Data Sets are stored","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"c88b150a-9f70-4700-9981-ed1514dc5a2b","Name":"ReportPartsFolder","Label":"Report Parts Folder","HelpText":"Relative folder where Report Parts are uploaded to.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"47575f66-9b1b-4cbb-a062-30d811e6159d","Name":"ServiceUserDomain","Label":"Service Domain","HelpText":"(Optional - leave blank to use Tentacle identity) Name of the domain for the user account to execute as","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"98b43d45-5a5a-456a-aac7-1f4cc6fe8e55","Name":"ServiceUserName","Label":"Service Username","HelpText":"(Optional - leave blank to use Tentacle identity) Username of the user account to execute as","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"fd48bde1-3874-45ea-ab99-b40c13b91d5a","Name":"ServicePassword","Label":"Service Password","HelpText":"(Optional - leave blank to use Tentacle identity) Password of the user account to execute as","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}},{"Id":"1310ffde-1f98-4ebf-bf6a-605bb83ea54e","Name":"ClearReportFolder","Label":"Clear the Report Folder","HelpText":"Optional - This will delete all items in the Report Folder before adding items.","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$DeployedPath = $OctopusParameters[\"Octopus.Action[$NugetPackageStepName].Output.Package.InstallationDirectoryPath\"]\n$ReleaseNumber = $OctopusParameters[\"Octopus.Release.Number\"]\n\n\n#region Upload-Item\nFunction Upload-Item\n{\n # parameters\n param ([string] $Item, [string]$ItemType, [string] $ItemFolder)\n\n Write-Host \"Loading data from $Item\"\n $ItemData = [System.IO.File]::ReadAllBytes($Item)\n\n # Create local variables\n $Warnings = $null\n $ItemName = $Item.SubString($Item.LastIndexOf(\"\\\") + 1)\n $ItemName = $ItemName.SubString(0, $ItemName.IndexOf(\".\"))\n \n\t# upload item\n if ($IsReportService2005) {\n if($ItemType -eq \"Report\")\n {\n\t [void]$ReportServerProxy.CreateReport($ItemName, $ItemFolder, $true, $ItemData, $null)\n }\n else\n {\n # error\n Write-Error \"$ItemType is not supported in ReportService2005\"\n }\n\t}\n\telseif ($IsReportService2010) {\n\t\t[void]$ReportServerProxy.CreateCatalogItem($ItemType, $ItemName, $ItemFolder, $true, $ItemData, $null, [ref] $Warnings);\n\t}\n\telse { Write-Warning 'Report Service Unknown in Upload-Item method. Use ReportService2005 or ReportService2010.' }\n}\n#endregion\n\n#region Get-ItemDataSourceNames()\nFunction Get-ItemDataSourceNames\n{\n # Parameters\n Param ($ItemFile, $DataSourceName)\n\n # declare working variables\n $DataSourceNames = @()\n \n # load the xml\n [xml]$Xml = Get-Content $ItemFile\n\n # retrieve the datasource nodes\n $DataSourceReferenceNodes = $Xml.GetElementsByTagName(\"DataSource\")\n\n # loop through returned results\n foreach($Node in $DataSourceReferenceNodes)\n {\n # check to see if we're looking for a specific one\n if($DataSourceName -ne $null)\n {\n # check to see if it's the current node\n if($DataSourceName -eq $Node.Name)\n {\n # add\n $DataSourceNames += $Node.DataSourceReference\n }\n }\n else\n {\n # store the name\n $DataSourceNames += $Node.DataSourceReference\n }\n }\n\n # return the results\n return ,$DataSourceNames # Apparently using the , in front of the variable is how you return explicit arrays in PowerShell ... could you be more obsure?\n}\n#endregion\n\n#region Get-ItemDataSources()\nFunction Get-ItemDataSources\n{\n # Parameters\n Param ($ItemFile)\n\n # declare working variables\n $DataSourceNames = @()\n \n # load the xml\n [xml]$Xml = Get-Content $ItemFile\n\n # retrieve the datasource nodes\n $DataSourceReferenceNodes = $Xml.GetElementsByTagName(\"DataSource\")\n\n # loop through returned results\n foreach($Node in $DataSourceReferenceNodes)\n {\n # store the name\n $DataSourceNames += $Node.Name\n }\n\n # return the results\n return ,$DataSourceNames # Apparently using the , in front of the variable is how you return explicit arrays in PowerShell ... could you be more obsure?\n}\n#endregion\n\n#region Get-ItemDataSourceReferenceNames\nFunction Get-ItemDataSourceReferenceNames\n{\n # Parameters\n Param ($ItemFile)\n\n # declare working variables\n $DataSourceNames = @()\n \n # load the xml\n [xml]$Xml = Get-Content $ItemFile\n\n # retrieve the datasource nodes\n $DataSourceReferenceNodes = $Xml.GetElementsByTagName(\"DataSourceReference\")\n\n # loop through returned results\n foreach($Node in $DataSourceReferenceNodes)\n {\n # get the data\n $DataSourceNames += $Node.InnerText\n }\n\n # return the results\n return ,$DataSourceNames # Apparently using the , in front of the variable is how you return explicit arrays in PowerShell ... could you be more obsure?\n}\n#endregion\n\n#region Get-DataSetSharedReferenceName\nFunction Get-DataSetSharedReferenceName\n{\n # parameters\n param($ReportFile, $DataSetName)\n\n # load the xml\n [xml]$ReportXml = Get-Content $ReportFile\n\n # Get the DataSet nodes\n $DataSetNode = $ReportXml.GetElementsByTagName(\"DataSet\") | Where-Object {$_.Name -eq $DataSetName}\n\n # return the name\n $DataSetNode.SharedDataSet.SharedDataSetReference\n}\n#endregion\n\n#region Item-Exists()\nFunction Item-Exists($ItemFolderPath, $ItemName)\n{\n # declare search condition\n $SearchCondition = New-Object \"$ReportServerProxyNamespace.SearchCondition\";\n\n # fill in properties\n $SearchCondition.Condition = Get-SpecificEnumValue -EnumNamespace \"$ReportServerProxyNamespace.ConditionEnum\" -EnumName \"Equals\"\n $SearchCondition.ConditionSpecified = $true\n $SearchCondition.Name = \"Name\"\n\n\tif ($IsReportService2005) {\n\t\t$SearchCondition.Value = $ItemName\n\t\t# search\n\t $items = $ReportServerProxy.FindItems($ItemFolderPath, (Get-SpecificEnumValue -EnumNamespace \"$ReportServerProxyNamespace.BooleanOperatorEnum\" -EnumName \"And\"), $SearchCondition)\n\t}\n\telseif ($IsReportService2010) {\n\t\t$SearchCondition.Values = @($ItemName)\n\t\t# search\n\t $items = $ReportServerProxy.FindItems($ItemFolderPath, (Get-SpecificEnumValue -EnumNamespace \"$ReportServerProxyNamespace.BooleanOperatorEnum\" -EnumName \"And\"), $null, $SearchCondition)\n\t}\n\telse { Write-Warning 'Report Service Unknown in Item-Exists method. Use ReportService2005 or ReportService2010.' } \n\n # check to see if anything was returned\n if($items.Length -gt 0)\n {\n # loop through returned items\n foreach($item in $items)\n {\n # check the path\n if($item.Path -eq \"$ItemFolderPath/$ItemName\")\n {\n # return true\n return $true\n }\n else\n {\n # warn\n Write-Warning \"Unexpected path for $($item.Name); path is $($item.Path) exepected $ItemFolderPath/$ItemName\"\n }\n }\n\n # items were found, but the path doesn't match\n \n return $false\n }\n else\n {\n return $false\n }\n}\n#endregion\n\n#region Set-ItemDataSources()\nFunction Set-ItemDataSources\n{\n # parameters\n Param($ItemFile, $ItemFolder)\n\n # declare local variables\n $ItemName = $ItemFile.SubString($ItemFile.LastIndexOf(\"\\\") + 1)\n $ItemName = $ItemName.SubString(0, $ItemName.IndexOf(\".\"))\n $AllDataSourcesFound = $true\n \n # get the datasources\n $DataSources = $ReportServerProxy.GetItemDataSources([string]::Format(\"{0}/{1}\", $ItemFolder, $ItemName))\n\n #loop through retrieved datasources\n foreach($DataSource in $DataSources)\n {\n # check to see if it's a dataset\n if([System.IO.Path]::GetExtension($ItemFile).ToLower() -eq \".rsd\")\n {\n # datasets can have one and only one datasource\n # The method GetItemDataSources does not return the name of the datasource for datasets like it does for reports\n # instead, it alaways returns DataSetDataSource. This made the call to Get-ItemDataSourceNames necessary,\n # otherwise it would not link correctly\n $DataSourceName = (Get-ItemDataSourceReferenceNames -ItemFile $ItemFile)[0]\n }\n else\n {\n # get the anme from teh source itself\n $DataSourceName = (Get-ItemDataSourceNames -ItemFile $ItemFile -DataSourceName $DataSource.Name)[0]\n } \n \n # Check to see if datasourcename contains the folder -- this can happen if the report was created by Report Builder\n if($DataSourceName.ToLower().Contains($ReportDatasourceFolder.ToLower()))\n {\n # Remove teh path from the item name\n $DataSourceName = $DataSourceName.ToLower().Replace(\"$($ReportDatasourceFolder.ToLower())/\",\"\")\n }\n\n # check to make sure the datasource exists in the location specified\n if((Item-Exists -ItemFolderPath $ReportDatasourceFolder -ItemName $DataSourceName) -eq $true)\n {\n # create datasource reference variable\n $DataSourceReference = New-Object \"$ReportServerProxyNamespace.DataSourceReference\";\n\n # assign\n $DataSourceReference.Reference = \"$ReportDatasourceFolder/\" + $DataSourceName\n $DataSource.Item = $DataSourceReference \n }\n else\n {\n # display warning\n Write-Warning \"Unable to find datasource $($DataSourceName) in $ReportDataSourceFolder\"\n\n # update to false\n $AllDataSourcesFound = $false\n } \n }\n\n # check to see if found all datasources\n if($AllDataSourcesFound -eq $true)\n {\n Write-Host \"Linking datasources to $ItemFolder/$ItemName\"\n \n # save the references\n $ReportServerProxy.SetItemDataSources(\"$ItemFolder/$ItemName\", $DataSources)\n }\n}\n#endregion\n\n#region Set-ReportDataSets()\nFunction Set-ReportDataSets\n{\n # parameters\n param($ReportFile)\n\n # declare local variables\n $ReportName = $ReportFile.SubString($ReportFile.LastIndexOf(\"\\\") + 1)\n $ReportName = $ReportName.SubString(0, $ReportName.IndexOf(\".\"))\n $AllDataSetsFound = $true\n\n # get the datasources\n $DataSets = $ReportServerProxy.GetItemReferences([string]::Format(\"{0}/{1}\", $ReportFolder, $ReportName), \"DataSet\")\n\n # loop through returned values\n foreach($DataSet in $DataSets)\n {\n # get the name of the shared data set reference\n $SharedDataSetReferenceName = Get-DataSetSharedReferenceName -ReportFile $ReportFile -DataSetName $DataSet.Name\n\n # Check to see if the SharedDataSetReferenceName contains the folder path -- this can happen if the report was built using Report Builder\n if($SharedDataSetReferenceName.ToLower().Contains($ReportDataSetFolder.ToLower()))\n {\n # Remove the folder path from the name, it will cause issues when trying to set\n $SharedDataSetReferenceName = $SharedDataSetReferenceName.ToLower().Replace(\"$($ReportDataSetFolder.ToLower())/\", \"\")\n }\n \n # check to make sure the datasource exists in the location specified\n if((Item-Exists -ItemFolderPath $ReportDataSetFolder -ItemName $SharedDataSetReferenceName) -eq $true)\n {\n # create datasource reference variable\n $DataSetReference = New-Object \"$ReportServerProxyNamespace.ItemReference\";\n\n # assign\n $DataSetReference.Reference = \"$ReportDataSetFolder/\" + $SharedDataSetReferenceName\n $DataSetReference.Name = $DataSet.Name\n\n # log\n Write-Host \"Linking Shared Data Set $($DataSet.Name) to $ReportName\"\n \n # update reference\n $ReportServerProxy.SetItemReferences(\"$ReportFolder/$ReportName\", @($DataSetReference))\n }\n else\n {\n # get the datasource name to include in warning message -- I know there must be a way to use the property in a string literal, but I wasn't able to figure it out while trying\n # to solve a reported bug so I took the easy way.\n $DataSetName = $DataSet.Name\n \n # display warning\n Write-Warning \"Unable to find dataset $DataSetName in $ReportDataSetFolder\"\n\n # update to false\n $AllDataSetsFound = $false\n } \n }\n\n # check to see if all datsets were found\n if($AllDataSetsFound -eq $False)\n {\n Write-Warning \"Not all datasets found\"\n\n # save the references\n #$ReportServerProxy.SetItemReferences(\"$ReportFolder/$ReportName\", @($DataSets))\n }\n}\n\n#endregion\n\n#region Get-ObjectNamespace()\nFunction Get-ObjectNamespace($Object)\n{\n # return the value\n ($Object).GetType().ToString().SubString(0, ($Object).GetType().ToString().LastIndexOf(\".\"))\n}\n#endregion\n\n#region Get-SpecificEnumValue()\nFunction Get-SpecificEnumValue($EnumNamespace, $EnumName)\n{\n # get the enum values\n $EnumValues = [Enum]::GetValues($EnumNamespace)\n\n # Loop through to find the specific value\n foreach($EnumValue in $EnumValues)\n {\n # check current\n if($EnumValue -eq $EnumName)\n {\n # return it\n return $EnumValue\n }\n }\n\n # nothing was found\n return $null\n}\n#endregion\n\n#region Update-ReportParamters()\nFunction Update-ReportParameters($ReportFile)\n{\n # declare local variables\n $ReportParameters = @();\n \n # necessary so that when attempting to use the report execution service, it doesn't puke on you when it can't find the data source\n $ReportData = (Remove-SharedReferences -ReportFile $ReportFile)\n\n # get just the report name\n $ReportName = $ReportFile.SubString($ReportFile.LastIndexOf(\"\\\") + 1)\n $ReportName = $ReportName.SubString(0, $ReportName.IndexOf(\".\"))\n \n # create warnings object\n $ReportExecutionWarnings = $null\n\n # set the report full path\n $ReportPath = \"$ReportFolder/$ReportName\" \n\n # load the report definition\n $ExecutionInfo = $ReportExecutionProxy.LoadReportDefinition($ReportData, [ref] $ReportExecutionWarnings);\n\n # loop through the report execution parameters\n foreach($Parameter in $ExecutionInfo.Parameters)\n {\n # create new item parameter object\n $ItemParameter = New-Object \"$ReportServerProxyNamespace.ItemParameter\";\n\n # fill in the properties except valid values, that one needs special processing\n Copy-ObjectProperties -SourceObject $Parameter -TargetObject $ItemParameter;\n\n # fill in the valid values\n $ItemParameter.ValidValues = Convert-ValidValues -SourceValidValues $Parameter.ValidValues;\n\n # exclude if it's query based\n if($Parameter.DefaultValuesQueryBased -ne $true)\n {\n # add to list\n $ReportParameters += $ItemParameter;\n }\n }\n\n # force the parameters to update\n Write-Host \"Updating report parameters for $ReportFolder/$ReportName\"\n\tif ($IsReportService2005) {\n\t\t$ReportServerProxy.SetReportParameters(\"$ReportFolder/$ReportName\", $ReportParameters);\n\t}\n\telseif ($IsReportService2010) {\n\t\t$ReportServerProxy.SetItemParameters(\"$ReportFolder/$ReportName\", $ReportParameters);\n\t}\n\telse { Write-Warning 'Report Service Unknown in Update-ReportParameters method. Use ReportService2005 or ReportService2010.' }\n}\n#endregion\n\n#region Remove-ShareReferences()\nFunction Remove-SharedReferences($ReportFile)\n{\n ######################################################################################################\n #You'll notice that I've used the keyword of [void] in front of some of these method calls, this is so\n #that the operation isn't captured as output of the function\n ######################################################################################################\n\n # read xml\n [xml]$ReportXml = Get-Content $ReportFile;\n \n # create new memory stream object\n $MemoryStream = New-Object System.IO.MemoryStream\n\n try\n {\n\n # declare array of nodes to remove\n $NodesToRemove = @();\n\n # get datasource names\n $DataSourceNames = Get-ItemDataSources -ItemFile $ReportFile\n\n # check to see if report has datasourcenames\n if($DataSourceNames.Count -eq 0)\n {\n # Get reference to reportnode\n $ReportNode = $ReportXml.FirstChild.NextSibling # Kind of a funky way of getting it, but the SelectSingleNode(\"//Report\") wasn't working due to Namespaces in the node\n\n # create new DataSources node\n $DataSourcesNode = $ReportXml.CreateNode($ReportNode.NodeType, \"DataSources\", $null)\n\n # create new datasource node\n $DataSourceNode = $ReportXml.CreateNode($ReportNode.NodeType, \"DataSource\", $null)\n\n # create new datasourcereference node\n $DataSourceReferenceNode = $ReportXml.CreateNode($ReportNode.NodeType, \"DataSourceReference\", $null)\n\n # create new attribute\n $DataSourceNameAttribute = $ReportXml.CreateAttribute(\"Name\")\n $DataSourceNameAttribute.Value = \"DataSource1\"\n $dataSourceReferenceNode.InnerText = \"DataSource1\"\n\n # add attribute to datasource node\n [void]$DataSourceNode.Attributes.Append($DataSourceNameAttribute)\n [void]$DataSourceNode.AppendChild($DataSourceReferenceNode)\n\n # add nodes\n [void]$ReportNode.AppendChild($DataSourcesNode)\n [void]$DataSourcesNode.AppendChild($DataSourceNode)\n\n # add fake datasource name to array\n $DataSourceNames += \"DataSource1\"\n }\n\n # get all datasource nodes\n $DatasourceNodes = $ReportXml.GetElementsByTagName(\"DataSourceReference\");\n\n # loop through returned nodes\n foreach($DataSourceNode in $DatasourceNodes)\n {\n # create a new connection properties node\n $ConnectionProperties = $ReportXml.CreateNode($DataSourceNode.NodeType, \"ConnectionProperties\", $null);\n\n # create a new dataprovider node\n $DataProvider = $ReportXml.CreateNode($DataSourceNode.NodeType, \"DataProvider\", $null);\n $DataProvider.InnerText = \"SQL\";\n\n # create new connection string node\n $ConnectString = $ReportXml.CreateNode($DataSourceNode.NodeType, \"ConnectString\", $null);\n $ConnectString.InnerText = \"Data Source=Server Name Here;Initial Catalog=database name here\";\n\n # add new node to parent node\n [void] $DataSourceNode.ParentNode.AppendChild($ConnectionProperties);\n\n # append childeren\n [void] $ConnectionProperties.AppendChild($DataProvider);\n [void] $ConnectionProperties.AppendChild($ConnectString);\n\n # Add to remove list \n $NodesToRemove += $DataSourceNode;\n }\n\n # get all shareddataset nodes\n $SharedDataSetNodes = $ReportXml.GetElementsByTagName(\"SharedDataSet\")\n\n #loop through the returned nodes\n foreach($SharedDataSetNode in $SharedDataSetNodes)\n {\n # create holder nodes so it won't error\n $QueryNode = $ReportXml.CreateNode($SharedDataSetNode.NodeType, \"Query\", $null);\n $DataSourceNameNode = $ReportXml.CreateNode($QueryNode.NodeType, \"DataSourceName\", $null);\n $CommandTextNode = $ReportXml.CreateNode($QueryNode.NodeType, \"CommandText\", $null);\n\n # add valid datasource name, just get the first in the list\n $DataSourceNameNode.InnerText = $DataSourceNames[0]\n \n # add node to parent\n [void] $SharedDataSetNode.ParentNode.Appendchild($QueryNode)\n \n # add datasourcename and commandtext to query node\n [void]$QueryNode.AppendChild($DataSourceNameNode)\n [void]$QueryNode.AppendChild($CommandTextNode)\n\n # add node to removelist\n $NodesToRemove += $SharedDataSetNode\n }\n\n\n # loop through nodes to remove\n foreach($Node in $NodesToRemove)\n {\n # remove from parent\n [void] $Node.ParentNode.RemoveChild($Node);\n }\n \n $ReportXml.InnerXml = $ReportXml.InnerXml.Replace(\"xmlns=`\"`\"\", \"\")\n\n # save altered xml to memory stream\n $ReportXml.Save($MemoryStream);\n\n # return the altered xml as byte array\n return $MemoryStream.ToArray();\n }\n finally\n {\n # close and dispose\n $MemoryStream.Close();\n $MemoryStream.Dispose();\n }\n}\n#endregion\n\n\n#region Copy-ObjectProperties()\nFunction Copy-ObjectProperties($SourceObject, $TargetObject)\n{\n # Get source object property array\n $SourcePropertyCollection = $SourceObject.GetType().GetProperties();\n\n # get the destination\n $TargetPropertyCollection = $TargetObject.GetType().GetProperties();\n\n # loop through source property collection\n for($i = 0; $i -lt $SourcePropertyCollection.Length; $i++)\n {\n # get the target property\n $TargetProperty = $TargetPropertyCollection | Where {$_.Name -eq $SourcePropertyCollection[$i].Name}\n \n # check to see if it's null\n if($TargetProperty -ne $null)\n {\n # check to see if it's the valid values property\n if($TargetProperty.Name -ne \"ValidValues\")\n {\n # set the value\n $TargetProperty.SetValue($TargetObject, $SourcePropertyCollection[$i].GetValue($SourceObject));\n }\n }\n }\n}\n#endregion\n\n#region ConvertValidValues()\nFunction Convert-ValidValues($SourceValidValues)\n{\n # declare local values\n $TargetValidValues = @();\n \n # loop through source values\n foreach($SourceValidValue in $SourceValidValues)\n {\n # create target valid value object\n $TargetValidValue = New-Object \"$ReportServerProxyNamespace.ValidValue\";\n\n # copy properties\n Copy-ObjectProperties -SourceObject $SourceValidValue -TargetObject $TargetValidValue\n\n # add to list\n $TargetValidValues += $TargetValidValue\n }\n\n # return the values\n return ,$TargetValidValues\n}\n#endregion\n\n#region Backup-ExistingItem()\nFunction Backup-ExistingItem\n{\n # parameters\n Param($ItemFile, $ItemFolder)\n\n # declare local variables\n $ItemName = $ItemFile.SubString($ItemFile.LastIndexOf(\"\\\") + 1)\n $ItemName = $ItemName.SubString(0, $ItemName.IndexOf(\".\"))\n\n # check to see if the item exists\n if((Item-Exists -ItemFolderPath $ItemFolder -ItemName $ItemName) -eq $true)\n {\n # get file extension\n $FileExtension = [System.IO.Path]::GetExtension($ItemFile)\n \n # check backuplocation\n if($BackupLocation.EndsWith(\"\\\") -ne $true)\n {\n # append ending slash\n $BackupLocation = $BackupLocation + \"\\\"\n }\n\t\t\n\t\t# add the release number to the backup location\n\t\t$BackupLocation = $BackupLocation + $ReleaseNumber + \"\\\"\n\n # ensure the backup location actually exists\n if((Test-Path $BackupLocation) -ne $true)\n {\n # create it\n New-Item -ItemType Directory -Path $BackupLocation\n }\n\n # download the item\n $Item = $ReportServerProxy.GetItemDefinition(\"$ItemFolder/$ItemName\")\n\n # form the backup path\n $BackupPath = \"{0}{1}{2}\" -f $BackupLocation, $ItemName, $FileExtension;\n\n # write to disk\n [System.IO.File]::WriteAllBytes(\"$BackupPath\", $Item);\n\n # write to screen\n Write-Host \"Backed up $ItemFolder/$ItemName to $BackupPath\";\n }\n}\n#endregion\n\n#region Normalize-SSRSFolder()\nfunction Normalize-SSRSFolder ([string]$Folder) {\n if (-not $Folder.StartsWith('/')) {\n $Folder = '/' + $Folder\n }\n \n return $Folder\n}\n#endregion\n\n#region New-SSRSFolder()\nfunction New-SSRSFolder ([string] $Name) {\n Write-Verbose \"New-SSRSFolder -Name $Name\"\n \n $Name = Normalize-SSRSFolder -Folder $Name\n \n if ($ReportServerProxy.GetItemType($Name) -ne 'Folder') {\n $Parts = $Name -split '/'\n $Leaf = $Parts[-1]\n $Parent = $Parts[0..($Parts.Length-2)] -join '/'\n \n if ($Parent) {\n New-SSRSFolder -Name $Parent\n } else {\n $Parent = '/'\n }\n \n $ReportServerProxy.CreateFolder($Leaf, $Parent, $null)\n }\n}\n#endregion\n\n#region Clear-SSRSFolder()\nfunction Clear-SSRSFolder ([string] $Name) {\n Write-Verbose \"Clear-SSRSFolder -Name $Name\"\n \n $Name = Normalize-SSRSFolder -Folder $Name\n \n if ($ReportServerProxy.GetItemType($Name) -eq 'Folder' -and $ClearReportFolder) {\n Write-Host (\"Clearing the {0} folder\" -f $Name)\n $ReportServerProxy.ListChildren($Name, $false) | ForEach-Object {\n Write-Verbose \"Deleting item: $($_.Path)\"\n $ReportServerProxy.DeleteItem($_.Path)\n }\n }\n}\n#endregion\n\n#region New-SSRSDataSource()\nfunction New-SSRSDataSource ([string]$RdsPath, [string]$Folder, [bool]$OverwriteDataSources) {\n Write-Verbose \"New-SSRSDataSource -RdsPath $RdsPath -Folder $Folder\"\n\n $Folder = Normalize-SSRSFolder -Folder $Folder\n \n [xml]$Rds = Get-Content -Path $RdsPath\n $dsName = $Rds.RptDataSource.Name\n $ConnProps = $Rds.RptDataSource.ConnectionProperties\n \n\t$type = $ReportServerProxy.GetType().Namespace #Get proxy type\n\t$DSDdatatype = ($type + '.DataSourceDefinition')\n\t \n\t$Definition = new-object ($DSDdatatype)\n\tif($Definition -eq $null){\n\t Write-Error Failed to create data source definition object\n\t}\n\t\n\t$dsConnectionString = $($OctopusParameters[\"$($dsName).ConnectionString\"])\n\t\n\t# replace the connection string variable that is configured in the octopus project\n\tif ($dsConnectionString) {\n\t $Definition.ConnectString = $dsConnectionString\n\t} else {\n\t $Definition.ConnectString = $ConnProps.ConnectString\n\t}\n\t\n $Definition.Extension = $ConnProps.Extension \n\n\tif ([Convert]::ToBoolean($ConnProps.IntegratedSecurity)) {\n\t\t$Definition.CredentialRetrieval = 'Integrated'\n\t}\n\telse {\n\t\t$Definition.CredentialRetrieval = 'Store'\n\t\t\n\t\t$dsUsername = $($OctopusParameters[\"$($dsName).Username\"])\n\t\tWrite-Host \"$($dsName).Username = '$dsUsername'\"\n\t\t\n\t\t$dsPassword = $($OctopusParameters[\"$($dsName).Password\"])\n\t\tWrite-Host \"$($dsName).Password = '$dsPassword'\"\n\t\t\n\t\t$Definition.UserName = $dsUsername;\n $Definition.Password = $dsPassword;\n\t}\n\n $DataSource = New-Object -TypeName PSObject -Property @{\n Name = $Rds.RptDataSource.Name\n Path = $Folder + '/' + $Rds.RptDataSource.Name\n }\n \n if ($OverwriteDataSources -or $ReportServerProxy.GetItemType($DataSource.Path) -eq 'Unknown') {\n Write-Host \"Overwriting datasource $($DataSource.Name)\"\n $ReportServerProxy.CreateDataSource($DataSource.Name, $Folder, $OverwriteDataSources, $Definition, $null)\n }\n \n return $DataSource \n}\n#endregion\n\n#region Main\n\ntry\n{\n # declare array for reports\n $ReportFiles = @()\n\t$ReportDataSourceFiles = @()\n $ReportDataSetFiles = @()\n $ReportPartFiles = @()\n\t\n\t$IsReportService2005 = $false\n\t$IsReportService2010 = $false\n\t\n\tif ($ReportServiceUrl.ToLower().Contains('reportservice2005.asmx')) {\n\t\t$IsReportService2005 = $true\n\t\tWrite-Host \"2005 Report Service found.\"\n\t}\n\telseif ($ReportServiceUrl.ToLower().Contains('reportservice2010.asmx')) {\n\t\t$IsReportService2010 = $true\n\t\tWrite-Host \"2010 Report Service found.\"\n\t}\n\t\n\tWrite-Host \"Deploy Path: $DeployedPath\"\n\t\n # get all report files for deployment\n Write-Host \"Getting all .rdl files\"\n Get-ChildItem $DeployedPath -Recurse -Filter \"*.rdl\" | ForEach-Object { If(($ReportFiles -contains $_.FullName) -eq $false) {$ReportFiles += $_.FullName}}\n Write-Host \"# of rdl files found: $($ReportFiles.Count)\"\n\n # get all report datasource files for deployment\n Write-Host \"Getting all .rds files\"\n Get-ChildItem $DeployedPath -Recurse -Filter \"*.rds\" | ForEach-Object { If(($ReportDataSourceFiles -contains $_.FullName) -eq $false) {$ReportDataSourceFiles += $_.FullName}}\n Write-Host \"# of rds files found: $($ReportDataSourceFiles.Count)\"\n\n # get all report datset files for deployment\n Write-Host \"Getting all .rsd files\"\n Get-ChildItem $DeployedPath -Recurse -Filter \"*.rsd\" | ForEach-Object { If(($ReportDataSetFiles -contains $_.FullName) -eq $false) {$ReportDataSetFiles += $_.FullName}}\n Write-Host \"# of rsd files found: $($ReportDataSetFiles.Count)\"\n\n # get all report part files for deployment\n Write-Host \"Getting all .rsc files\"\n Get-ChildItem $DeployedPath -Recurse -Filter \"*.rsc\" | ForEach-Object { If(($ReportPartFiles -contains $_.FullName) -eq $false) {$ReportPartFiles += $_.FullName}}\n Write-Host \"# of rsc files found: $($ReportPartFiles.Count)\"\n\n # set the report proxies\n Write-Host \"Creating SSRS Web Service proxies\"\n\n # check to see if credentials were supplied for the services\n if(([string]::IsNullOrEmpty($ServiceUserDomain) -ne $true) -and ([string]::IsNullOrEmpty($ServiceUserName) -ne $true) -and ([string]::IsNullOrEmpty($ServicePassword) -ne $true))\n {\n # secure the password\n $secpasswd = ConvertTo-SecureString \"$ServicePassword\" -AsPlainText -Force\n\n # create credential object\n $ServiceCredential = New-Object System.Management.Automation.PSCredential (\"$ServiceUserDomain\\$ServiceUserName\", $secpasswd)\n\n # create proxies\n $ReportServerProxy = New-WebServiceProxy -Uri $ReportServiceUrl -Credential $ServiceCredential\n $ReportExecutionProxy = New-WebServiceProxy -Uri $ReportExecutionUrl -Credential $ServiceCredential\n }\n else\n {\n # create proxies using current identity\n $ReportServerProxy = New-WebServiceProxy -Uri $ReportServiceUrl -UseDefaultCredential \n $ReportExecutionProxy = New-WebServiceProxy -Uri $ReportExecutionUrl -UseDefaultCredential \n }\n\n\n\n\t#Create folder information for DataSource and Report\n\tNew-SSRSFolder -Name $ReportFolder\n\tNew-SSRSFolder -Name $ReportDatasourceFolder\n New-SSRSFolder -Name $ReportDataSetFolder\n New-SSRSFolder -Name $ReportPartsFolder\n \n #Clear destination folder if specified\n if($ClearReportFolder) {\n Clear-SSRSFolder -Name $ReportFolder\n }\n\t \n\t#Create DataSource\n foreach($RDSFile in $ReportDataSourceFiles) {\n Write-Host \"New-SSRSDataSource $RdsFile\"\n \n\t\t$DataSource = New-SSRSDataSource -RdsPath $RdsFile -Folder $ReportDatasourceFolder -Overwrite ([System.Convert]::ToBoolean(\"$OverwriteDataSources\"))\n\t}\n\n # get the service proxy namespaces - this is necessary because of a bug documented here http://stackoverflow.com/questions/7921040/error-calling-reportingservice2005-finditems-specifically-concerning-the-bool and http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.html\n $ReportServerProxyNamespace = Get-ObjectNamespace -Object $ReportServerProxy\n $ReportExecutionProxyNamespace = Get-ObjectNamespace -Object $ReportExecutionProxy\n\n # Create dat sets\n foreach($DataSet in $ReportDataSetFiles)\n {\n # check to see if we need to back up\n if($BackupLocation -ne $null -and $BackupLocation -ne \"\")\n {\n # backup the item\n Backup-ExistingItem -ItemFile $DataSet -ItemFolder $ReportDataSetFolder\n }\n\n # upload the dataset\n Upload-Item -Item $DataSet -ItemType \"DataSet\" -ItemFolder $ReportDataSetFolder\n\n # update the dataset datasource\n Set-ItemDataSources -ItemFile $DataSet -ItemFolder $ReportDataSetFolder\n }\n\n # get the proxy auto generated name spaces\n\n # loop through array\n foreach($ReportFile in $ReportFiles)\n {\n # check to see if we need to back up\n if($BackupLocation -ne $null -and $BackupLocation -ne \"\")\n {\n # backup the item\n Backup-ExistingItem -ItemFile $ReportFile -ItemFolder $ReportFolder\n }\n \n # upload report\n Upload-Item -Item $ReportFile -ItemType \"Report\" -ItemFolder $ReportFolder\n\n # extract datasources\n #Write-Host \"Extracting datasource names for $ReportFile\"\n #$ReportDataSourceNames = Get-ReportDataSourceNames $ReportFile\n\n # set the datasources\n Set-ItemDataSources -ItemFile $ReportFile -ItemFolder $ReportFolder\n\n # set the datasets\n Set-ReportDataSets -ReportFile $ReportFile\n\n # update the report parameters\n Update-ReportParameters -ReportFile $ReportFile\n }\n \n # loop through rsc files\n foreach($ReportPartFile in $ReportPartFiles)\n {\n # check to see if we need to back up\n if($BackupLocation -ne $null -and $BackupLocation -ne \"\")\n {\n # backup the item\n Backup-ExistingItem -ItemFile $ReportPartFile -ItemFolder $ReportPartsFolder\n }\n\n\t\t# upload item\n Upload-Item -Item $ReportPartFile -ItemType \"Component\" -ItemFolder $ReportPartsFolder\n }\n \n}\nfinally\n{\n # check to see if the proxies are null\n if($ReportServerProxy -ne $null)\n {\n # dispose\n $ReportServerProxy.Dispose();\n }\n\n if($ReportExecutionProxy -ne $null)\n {\n # dispose\n $ReportExecutionProxy.Dispose();\n }\n}\n\n#endregion\n","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"SQL Server","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/ssrs-deploy-from-package.json","Website":"/step-templates/4e3a1163-e157-4675-a60c-4dc569d14348","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"cb1b825e-d945-43e4-a572-d945654ca9cc","Name":"Determine Rolling Deploy Window Size","Description":"Determine Window Size for Rolling Deploy.","Version":1,"ExportedAt":"2017-07-27T17:01:46.652Z","ActionType":"Octopus.Script","Author":"tbrasch","Parameters":[{"Id":"561333cc-14ea-44be-aca2-ccb06e0c582f","Name":"DRDWSPerformRollingDeploy","Label":"Perform Rolling Deploy?","HelpText":"If checkbox is unchecked, all servers will be deployed to. \nNOTE: This can be set to use a variable or expression.","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}},{"Id":"ecf32591-130c-41cb-b8f5-405e3b1c5d28","Name":"DRDWSServerPercentageToDeploy","Label":"Server percentage to deploy","HelpText":"Percentage of servers to perform rolling deploy on at a time. Enter as whole number. \nExample for 25%: 25","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"bed9618f-6ede-4c6b-a4b1-a6f0d0a685d4","Name":"DRDWSServerRole","Label":"Server Role for Rolling Deploy","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"#region Verify variables\n\n#No need to verify PerformRollingDeploy as this is a checkbox and will always have a boolean value. Report value back for logging.\nTry\n{\n $performRollingDeploy = [System.Convert]::ToBoolean($OctopusParameters['DRDWSPerformRollingDeploy'])\n Write-Host ('Perform Rolling Deploy: ' + $performRollingDeploy)\n}\nCatch\n{\n Throw \"Cannot convert Perform Rolling Deploy: '\" + $OctopusParameters['DRDWSPerformRollingDeploy'] + \"' to boolean value. Try having the expression or variable evaluate to 'True' or 'False'.\"\n}\n\n#Verify ServerPercentageToDeploy can be converted to integer.\nIf ([string]::IsNullOrEmpty($OctopusParameters['DRDWSServerPercentageToDeploy']))\n{\n Throw 'Server percentage to deploy cannot be null.'\n}\n\n[int]$serverPercentageToDeploy = 0\n[bool]$result = [int]::TryParse($OctopusParameters['DRDWSServerPercentageToDeploy'], [ref]$serverPercentageToDeploy)\n\nIf ($result)\n{\n Write-Host ('Server percentage to deploy: ' + $serverPercentageToDeploy + '%')\n $serverPercentToDisconnect = $serverPercentageToDeploy / 100\n $serverPercentToRoundUp = $serverPercentToDisconnect + 0.01\n}\nElse\n{\n Throw \"Cannot convert Server percentage to deploy: '\" + $OctopusParameters['DRDWSServerPercentageToDeploy'] + \"' to integer.\"\n}\n\n#Verify ServerRole is not null.\nIf ([string]::IsNullOrEmpty($OctopusParameters['DRDWSServerRole']))\n{\n Throw 'Server Role for Rolling Deploy cannot be null.'\n}\n$role = $OctopusParameters['DRDWSServerRole']\nWrite-Host ('Server Role for Rolling Deploy: ' + $role)\n\n#endregion\n\n\n#region Process\n\n$serverCountToDeployTo = 9999\n\nIf ($performRollingDeploy)\n{\n $servers = $OctopusParameters['Octopus.Environment.MachinesInRole[' + $role + ']']\n $totalMachines = ($servers.Split(',')).Count\n $serverCountToDeployTo = [math]::Round(($totalMachines * $serverPercentToDisconnect) + $serverPercentToRoundUp)\n\n Write-Host ('Total machines: ' + $totalMachines)\n\n If ($serverCountToDeployTo -eq 0)\n {\n $serverCountToDeployTo++\n }\n}\n\nWrite-Host ('Window Size: ' + $serverCountToDeployTo)\n\n#To use this value, set Window size value to: #{Octopus.Action[Determine Rolling Deploy Window Size].Output.WindowSize}\nSet-OctopusVariable -name \"WindowSize\" -value $serverCountToDeployTo\n\n#endregion\n","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Octopus","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/determine-rolling-deploy-window-size.json","Website":"/step-templates/cb1b825e-d945-43e4-a572-d945654ca9cc","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRFT6Tl////L5Pg8vj9Y67omsvwPJrisdfzfbzs5fL7y+T32Ov5isLucLXqvt31CJPHWwAABMJJREFUeNrs3deW4jAMAFDF3U75/89dlp0ZhiU4blJEjvQ8hYubLJsA00UCBCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIhD8kJm+t+QprfdKfB9HbYpx6CWfspj8HMi+gMgHL/AmQA8W3JTKH+ALFvzCeL0RbpyoCPE9IJeNOSQwh5Z3qd6yRGWQ2qi2cZQWxqj1WzQYSjeoJmJlAklOd4VlArOqPhQEkqBERToeMcfRJBkC0Uep8CfBpjz4JsHJ0zF3dkEWNje0kiB/sUC6eApndaIiCMyAa1PiwJ0AWhRGJHJJQHG2dC7h1rNbO1QOxSA7lNCkkKrQIpJCAB1GREILYIC1NAiwbpKFJgGWDNExcwGstfExcZBCHC6nOglshHtmhViLIig1RNBCN7qjtW8C0Z1UvJcC1Z9XmwMBzzvobmgAyEzgq91dtEEsBsQSQQAFZCSBAATEEEApHZbrVBIkkEIUPSVeB+KtALA0kXQUSrwKZBCIQBnk8Y4i5CsReBeKvkqLM+BCSDWJlrZFvGk9SRTHshkgjZCGAaArIxm3H3grhVzFlW2msfl1ca79UJ1bofYvsDHHlNdTZnlh5MghuPd5NdBDUNZHyCkfktIh03XzALGRPlBDPac7qgWjHZzWcmF5zmmkhidMQ6boKiDXcDTUEaylZqCGJ0Vjvu/fLJtHqhSANEvqb2OYqkOUqEHuVMbJcZdZCGiPhKhC4yjqiIjEE7XThMp8fAWII3mY3kUIQD+AMKQTzPiBhgQ63HlT/KSvgtoi0dq5mCPah1UIE0eh3sT0NhOByvKeAkFzi8PgQomumFhsyOxpIzZN4gLOj5plVwNpR0b2AuePWKBEHQu24pSsJA+LVCeHHQxZ1SiyDIdqok8IOhSSnTottHEQTdyt4ettAj4KkzA4dMikk2Dht2S5ptm1vswnPDxn0YyDZ5oDM3iToo2T5voWaYe+Q+vdjH80QyAzZhCgcDtLMI1Tmtz9w++XHgziHQHJJu/OZ3bs9Xn8gQ72NcP3dKqEfkp10F51xhoIi2I91R+LurXV/5q7pH+wx061CzO16oSQleMyr8fXvwMA0Pro8432DPD/ySx8XrHfSuDAM8n6UhnjQabaiXf5Bq/lREHvEeNtn1rJ08+C/uXkQZHeguxAPC3UvtcJYUogLzZX5hhZZvS6onG5lxXtzWGaygwb79vT/IXhdlNibwlKYOR6T8xjI7W8n+xV7T+GH4tMzWwR+lZhRkJYSsC0thpmCYqyngOz3rN2FLBZ2wZflBCggUHF0Vnp88JKienzIXLSEZCZqU7IKr/gQW9yx3pzV7Y9kvWZWTRRIqDmTtRUnU7b2lLcTYmoqHqnmiO1poER0SPkAeZMAZxaJx0Y3TCdAclsIqDz03ALcyxfTCZBsthoGXWmigGyVhWPLFJJfuuKQWycoEFdXbH4dJJoJxNR1eD/kshz6yn48cF8yW8sFoitflB1w6Q8n+/15Za7oA17/pYNmYgP5fmWm8L1NOHPWgK8kuFew1/JXtOA0yJCv7ah7X8ObUuT5kObU30+fDZm8+zqP+HTIpK0xQ796b5Kv2hSIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIpBf8UeAAQAEjtYmlDTcCgAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"3ff1e0ae-0336-41e3-905a-a1f10f4bb1cf","Name":"Docker - Create and Push Image","Description":"Creates and pushes an Docker Image.\n\n- Requires the Docker infrastructure.","Version":1,"ExportedAt":"2017-02-03T10:49:13.997Z","ActionType":"Octopus.Script","Author":"joaoasrosa","Parameters":[{"Name":"DockerUsername","Label":"Docker Username","HelpText":"The username used to login to DockerHub","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DockerPassword","Label":"Docker Password","HelpText":"The password used to login to DockerHub","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"ApplicationLocation","Label":"Application Location","HelpText":"The application location, used to build the Docker image","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DockerFile","Label":"Dockerfile","HelpText":"The Dockerfile definition. If the Dockerfile is part of the package leave it blank","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Name":"ImageName","Label":"Image Name","HelpText":"The image name in DockerHub","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ImageTag","Label":"Image Tag","HelpText":"The image tag. Leave it blank for 'latest'","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Get the parameters.\n$appLocation = $OctopusParameters['ApplicationLocation']\n$dockerFile = $OctopusParameters['DockerFile']\n$imageName = $OctopusParameters['ImageName']\n$tag = $OctopusParameters['ImageTag']\n$dockerUsername = $OctopusParameters['DockerUsername']\n$dockerPassword = $OctopusParameters['DockerPassword']\n\n# Check the parameters.\nif (-NOT $dockerUsername) { throw \"You must enter a value for 'Username'.\" }\nif (-NOT $dockerPassword) { throw \"You must enter a value for 'Password'.\" }\nif (-NOT $imageName) { throw \"You must enter a value for 'Image Name'.\" }\nif (-NOT $appLocation) { throw \"You must enter a value for 'Application Location'.\" }\n\n# If the Dockerfile parameter is not empty, save it to the file.\nif ($dockerFile) \n{\n Write-Output 'Saving the Dockerfile'\n $path = Join-Path $appLocation 'Dockerfile'\n Set-Content -Path $path -Value $dockerFile -Force\n}\n\n# If the tag parameter is empty, set it as latest.\nif (-NOT $tag) \n{\n $tag = 'latest'\n}\n\n# Prepare the final image name with the tag.\n$imageName += ':' + $tag\n\n# Create the docker image\nWrite-Output 'Building the Docker Image'\ndocker build -t $imageName $appLocation\n\n# Upload to DockerHub\nWrite-Output 'Pushing the Docker Image to DockerHub'\ndocker login -u $dockerUsername -p $dockerPassword\ndocker push $imageName","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Docker","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/docker-create-and-push-image.json","Website":"/step-templates/3ff1e0ae-0336-41e3-905a-a1f10f4bb1cf","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH4QEaCgkyB4qT0wAAIABJREFUeNrtnXecHMWZv5/qnrCzeVcrrQIKKCCQAAkJA2NyMhgz9oEHxwOHw+aHs893PhzvnO4czjbgjNM5Yh9jwB58TmAR1SBAIJRzWIWVtFptntTd9fuja6TVaGZ3Znd2tSvV8/mIYXu6e6qr61v1VtVbb4FGo9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0WgGR+gsOHGEI9Fh578Vj0mdk1ogJ6M4XgPcCaSGcZsQcJcVj63XOToy+HQWnDDmAv9Qhvt8HdAC0QI5eUmfNg/M4l+FSPbhb90BQhsAWiAnO9Ll8M0fQPoCSF8AYaeRPj/CzuT9xLEJtO6k6edfQJr69Y00hs6CsdATNGi+98P4D+xi8r0fIrB3K833fpjAni00f+ujBPZuo/k7HyO4bTWTfvLvWhhaIKegRuw0SAl2BqRE2BmElAhHHXcyCOkinIzOLC0QjUYLRKPRAtFotEA0Gi0QjUYLRKPRaIFoNFog4wvpAlJ99vvb9Zx1heuC5Oj3Gi2Q0aAcLudDpLefOui87h04dU10XvcO7IZmOq+7jUzjZDqvuxW7YRKd1/4jmebpdF0eBVeLZLTQ3m6eSE7cmgop6bzhXbjBSm/GXIhBP/1te6h+8kEwTIDLrXjsyTGYpyHgZuDX43nNinbq8XABAykRsrR3KQ3h1TOuMolKar9NEIL6+H0IWdpvStM/1vP050BU/btJC2Tc9wEkqdpGOqbN9WrqIhvghpaNBHs6SCy8CDcY6n9Dz4KVLog8n0hCG55HJHs5OP9VOD5/0S1IoK+bxl0bkGPU3T0cif6bEgbAP4Qj0W3AhVY8dlALZLzamlLSPfE0dp97KVWHWknW1BPo68EOVGA4NsJ1cAJB/IlekrWNVLXvp3PyLII9hwl2ttF1eRSztwO7fhK+Ay1kps4huHMdyTmLqNiyiuS8xVRsWkly/lIqNq0kMf98Ars340/0su3CG5iwYy2HZi5gws51tM88k8ZdG2ifPp/Glk20z5hPQ8smOqfOpmb/LlI1DUzYsXZMevWGI9EbgC8jJW4whJHsBcM8HXglHImeb8Vje3QnfRy3IrWtO5n+8jIaWzYyda3FxO2rad68kinrn2Pi9rVMX/UEdfu2M/OFv1J9aO8x14bWWJiH91P14mOYPZ1UP/17RDpJzVMPI+wMtU8+CLZNzVMPIezMEYtMCJj31IOEeg4z76kHqexsY96TD1HV2cbcpx8i1NnG3KcfprptH7Of+9NYbjkE8FkAGQzR9p5v0vuq12Vb5MnAlnAkeroWyHjWiBC4hgnCQBoGUqh/RvafiRQGrulDCiOnb2B6/RHD9IY/TNM7rj4xfcccP6YTZPq83zZ9SPp9Gj7I/i0Ebp5rxxBLgQsBei6OIhD0hW+i87XvzY68VQBWOBINaIFoTkW+BSD9QZLzzic7r5Oeu5TuS28B1wFoBlaPF5FogWjKZV5NBi4Sjk3izIuQoepjzM/kkuvovuwt2QVfZwBf1ALRnEpcBoBj07f0eoRj59iQDslFV5GcvTjbJ/nXcCT6ai0QzanCUgC7fhKyZkLBofKu6+/ITnAC/DYcidZogWhOdvNK4MX5wmmaPvA8UiDI4dd/MOtTdhrliQ2mBaIZ80wBcOqaGNCjwHWxp55BpvnIaO/dWiCakx0BNAI41Q2DeyKYJn1LrvPmgqAxHIneogUyXt60lBiuA66LcF0v1I50EK7j/e06COl6s+s5rufCdbzC4TpeJao6qkc6rLYNkuM7sKDuJ71PJIaTUZ82qE/ve2esZp03bFWMj5iUpM68CKeyJtva3DWWlX+y2MGzss18iXQDq4TrGgfnLmLrq19PRc9hMhVVmKkkrs/vicR1cXw+fOkUmVA1gd5OEvUTOfOx+2nYsY7WD92DkBKnqhZfV7vnctK2h0zzDPz7d5JpnkWgdQfpKbPwt+4gM2U2k+77BP6Du3nu1k9R2b6fnqapVLftpWfCFKoP7fM+21vpaZxMVXsrffWTCHUdQkjJot9/F9dzNXkfsHIIlV0aWGXFY3YZ8t4AWoCpPZfcQmLRVYNfZPoIrYhTs/whpGG2AQuteOzAWCtXJ5Mv1gfVvyG1pNIwaNi9iXMfuU/Vcnmqj+yxft8FezqRPj9Nv/ka0vQhkEgEQkqkKPwJ4Dt8ACkE5/7hB0jDOP7+BT4NO9N/Rv1eSnYjBqAVWAy0lyn/UwCy2LUqjk16zlLk8ocAavFcUQ7kCK8WaFDi7zkRzo4nk0BMwI/MmiWltKOeK4eZTFDZ01V8uypB+v0gDPwH95TgBez9hOPzgxCE+vt0FXWx4cXrlS7CsX2lGAJZd5kyv3sJdAKYye5+ah7komAIt6IKI50MANeGI9HX4c2nLAUm5mmpABLAKuAJ9W+VFY/t1QIpkkT9JNZe/w6kMBDSzfnMrcUlCIOqQ3s5+48/om/BRXTc8O6jfYmsizlCvfNj3c6lMGh86DtUbF/DqjfcSbKmMU+L4eZNC8A5//djKjrbOHDHV3Gragu7xud8BnZvpjF2Nx3T57PxiltUXynn2bJp7V9QhcGkLS8za8WfjvMjKwOtAEZnW798G0Qgpg8ZCEE6CfC1/m22kFLdQx5TkUlECCEuAi4CPg70hiPR5cDbrXisTXfSB60hBZmKKqattchUVDF13bNkgpVMWf8crulj0paXMO0UTTvWEOztoq51B3Yw5L0Qnx/f4f1UvvQ4gdYdhNY9S2DXBiq2vkzF+hUEWzZSuepJfIf2Uf38XzB7O5E+HyDJVFTRsHeLd+/ta0DA5A3P4/iDTNmwAjsQOiYtdjDkmVVI3Ko6apf9FpFJUbvstxipPmof/y1GspfaJx5ApBLUPhnD7Omg2vojTlUtSIlrmkjDZPKmF3ENg+ZNKxGuTeOu9QRSvdTv20bl4QPUHNxD7cHdVHQfwg4Ey57nasXgNgBf+56StmUQQiBcF8POiEyohq7mWRyccx47z7uOzZe8ifXXvIv11/4TG668jW0X3cS+hZdyeNp8krVNCNcRwnWqgdcAB8OR6HdVX1S3IIPRuGs9O5dcReOuDbQsvoKGlk20nnUB9Xu20N08k9rWnaSr6qk6tI9kdf1RO63jABXbVpP0+Qjs3oI9YTIi0YuRSuA0TMK/ZwtuZTXBTStJzTjraKUnBFVte0jUNFLXup2O0+bRsHsj+xZcSEPLRvacfQmNLRtoWXw5jS0baVl0eb9qShBas5zepdcQWvMMfYsuI7R6OYlzLiW0ejl951xKxRqL5NzFhDY9T2LBhceMftXv2cL+uYup37OZjunzqFVrRqrb9pKsnYCZTngjb3bjSI7LrALw79+JdGxEkSIRdppDs86mZdG1JKsbkaapWrdCZpoA6WK4Dv5kD9NXPcrkjc/i+ALg7dj17nAk+l4rHvu5bkGGNF4nSrhAlPidKPA5lISKnD+LuGeeU+TojVN66+INk9DLjxW1IZD0BVh188fZeM0/0dcwGdfn72f6ycLdHdVnTFU1sOWyt/HCLZ/E9R0ZXg4Cf9ImlmZMYcVjG4A90uen+sU/DTqaJYTgUDpNwvBBJlXSAMcxYrHTVHQd6j8w82/lHO3SAtGUkw8AiHSC4PZXBjyxK53icCoxTKtAYDg2c559MCuw3Xh7NupOumZM8giwBSmpfO73BSOvZFyXA4ne4e+xKCXn/Pl7BHo6skc+bcVjjhaIZqyaWXa2Bg/s20bV47/KzrkcwXZdWnq7GFagLOH1Aec+8wCVh/ZmhfYjKx77WbmfSQtEU26RfB94TvoDVK1+nNCqZUdaCgns7evBlcOLI2dkUiyO383EbSuz934Kz+Wm7OiwP5qyEY5EpwHvBeYDCDtDcMNykouuACnZ19dD2h2iBaRGt5q2r2TmC38i2NeZHfH6M3CTFY9ltEA0Y1UYE4DvAW/MWiXCydC99AYSF78RXJfWRC99dmbI4qjft5nZy39HsNfrbyhx/Bi4o9z9jlNCICk1+ZeqrgMgXVWHFIJ0ZQ2uYZIJVeP4/NjHREMEGQjh1DTgBitxqutwQ9UIw0T6ArihatyaBtxABU7tBKT/2MAcdrASafpIh6qRhkG6qhaEIFVVhxSQqqoDvL+P6aBKidPQjDR96tOP0zAJ6fNj1zcjfX6c+klIfxC7rumYIVEpDFKVtSAM0pW13rNVVOOafjIVlTj+oDd1IF0cXwDDzpRDEE14/lKXANcD54Pn7i+FIDnvfPqWvhZ78mwMJ83BRIKeTProDUz/8e4oQv1HGGCnqOg8SPXhfdQc2EHD7g2EOvbjZq+DLcDHrXjsoZEuRyeTu/vdwIf7Giax6vV3ltThq27by+IH76V30aW0v+H9RW+1LE0fE37z34S2vMSLb/oXkjUNJdWKix/+NqHD+9n/wXtw+0cBGYTA7s00/eJLtJ++kA3X3npk3Ukxv9m86QXmPPN7pDD24bmYHx4gT/3AJGA2cA5wMXAt0JRbdoTrkJi7lJ7L34qsrD1y/FAywWHP10pVyX5mP/M7KnraSVXW4qhKxpdKEEh0E+o8QKCvq1CSEsCHrXjsh6NVrsQYLezn4a1xKBlpmGRCVSVlgXBs/IkepD+IrKwu3nlcgOjrRthpMqEa5VtV/O/6E90I18Wtrj9iYxeFk8Ho68I1/dgVVZSSYCOTxpcexvyD9BaN4dg4NU2kTzuDzGlnkZqzGLe26ch+74YQtCcTtOXMdfhTfVz468+qgHgSodIulXeCFCJ3+LcFWAb8EXjYisfSo1kWx6qJNWvIincdAr1dQ7hQIOw0oqt9SPWMP9Ez9FGZo+P4Jf2m4dgEejtHpw5VH+mJM0nPOpfU/Atx6ycdYyaJTOqYluNQ7kSgEExZ9xSu6c+uiXFzpJ0ENgMvAo8DjwzUwp3KAjkdwHAybLzytuzKuay5TsgfoL6iknG76cQ4QvqDEAjiVNbhVDciDBNcB+Haed1DDCHyiwNvoVdjy7qsOJ6y4rHL1GpEOVb3EBmrApnmtQYubbOXQE6fIOMPUF1ZPezxdE2JLZ2TOe5d5FJIHAhBqPMgVe37shXeVwGseGxMb5c1VicKG7xOsAk+vy6Z4wAhoD2VzC8OAF+QucsfyM6sd+BN7o39SmGMpqsewDX8eZtxqVuOMcfBRIL2AZwP61rWUt22O2te3WfFY51aIDmEI9Hm4tMlcQqsfnPGuEBGdXs0IfqH8jwh7E/00tF/KDc3iVIyde1TWdMqyRDC/JRQdsZ1C/KDIgMWSxD40qm8X9qDbYV8wgQkEJkU1daDo/Z7Zlcbge2rhu8ZO5SKANjX10N3ZuCRV3+ym/q9G7N//kepHXI1U//4qSCQBuDpcCT6+UHOO+x10jN5X7xdYDGO9AXwt26n9tH/GeVaVSADFfgObKfx/s9TueIRqp+4H2+iZGQKrvT5CW5aQcP9X6Duj98l9PJj3pZsYnReqeO6tCT6qNxgMXX900dnx49TR5D5j/8quzlqCvhFieKI4A37nhmOREd9UGnUfjAciZ6NF4lCAJ8JR6LvBV4LrMnjaNYOIBwH8rpGSDLSxcwufXUdjHSCqmd/TWjV35E+P3WJbrpee4c3TDmS0nBtRKKH6j8/QMXGZ5G+AAiD0OonCG5fRefrP4TdMLl8BVdKjEyC6j//kopNzx/Zp7D6qd8SWvME3Vfdij1pltrVamTE6SBp6e1i4rpnmP3cw0jDZOLWlWy+7G0kqhuOcXFv2L6KmgM7ssd+WkyInnAkauLFyvoB0D8s6XfxnCFHseobHXG8C2/3oXxT3K8Aj+HNkj6pzr8T+K5pp7Fu/RJOoPKovS0MEAbTAgFqD+4ksGsd/j2b8LduAzt9tOVwHWSwktTsxaTOuID0rLORZgBcG+G62ejixWWRIZDCBBVTytdxAP/ezQRa1uHbvxPfwZ2eWZfbakmJcG0yU+eRmnMeyTMuwGmYotLgZLclG7B/IQ0TTD8i1Udwy4tUbF5BYNd6b5lqgd9z6pvJTJpJZtp80tPOwG6e6eWbCp+KdIs3Q1WeS9MEw4fcswl33TM07FhNZcf+I3NUQv1274RpdE+cyeFp8+meOIMzl/2c6rbdAPuteGzyIOVkPhBRFecVBSycHwLvK0dEyBMmEBUOPwScrR7o3BIu3wi0ARcLx2Z7+CbSoTp8qV4CfZ2EutqobmuhomO/2kfQHNyMcR0EgvT0M0nPWEhmymyc+mak4VMFIE8IRRWXyUglMA+34mtrwb9vK/49GzGSvd7vlmLGeUHesOsmkZp3PpkZC7CbpiENf04apCroLkZ3O4HdGwhsfYnAno1D+03XQQoDe/IcMlPnYk+agd04Dae6/qgJmPv82XhUUmL2duLbv4NAy3qC219GJPuUKScGaVm9GMauceTcJ4AH1LtNq/LRhLdtwhI8P69iSQLvB34DpEdSLKLMwjgXz7vzSrywlpOH2QcUhp3BkA5H/HRQrs6iuOh9x9xN9q89vX6D9AW8QpcteNL1BGVnEJkUwskc9Q9Srdewck1Kr+WQ7tE0+IPKhgcc2/vtdALh2J5/l1CVgBhGTkp55NmFdL0Ii/4g+IKqlTJVdsqjacgk+6XBAMMoush4m5+OuIGSwfPZW463LmRZudeFiDIJYy7wJqBG1Q7DVXQK+ApIuuqn0lk/7XgxCAMjqCcRR3zwwXWR6Qylhv9tOrCVUN8RH7Ov4gUJHynFGEC2MCyz4rHHxlUfZIii2wzMPTRpDpsWXHO8zSwERn0NJ5HH/phDptLIZPJ4l8JB+iwViQ4Wr3gguz3Ej6147PbxmgdjecHU08DcikSnF80815XclZBKI/x6UWT5lQEymUSm0kO69twXHsqKowf43HjOirEctOFRgGCyB8O189ZUbiJ5QibITmocB7enBzc5tGUXs7cux3SOTPC+w4rHWrRARoZ1QDqQ6iGQ7iswOuUibVsX6jKaVE5XL9JxS7dchUF1TxtTWlZnzd5fW/HYg+M9T8ayQLYC3VIYTNm7Boz8ppTXgdQMC1fidveqFnlot6hIdLLw5TiuNxqYZOibGWmBFIMVj3UBL0lh0LxnfcEXJ9OZE+J7JVU3aLz7Fct0BqerGzmMvQ+FdJm78XFvb0ePS6x4rF0LZOT5gvcWXSbs31zgDUvcRGpU+yKOI5lRFeD66XXMq63AyTjj660LAY7rtRp9w4yPa/o5Y8Myajv2ZY/8mxWPvXiyNK5jvocbjkQPABM7Gk9j/dnXFUyyUVOFMM1RybBPLJ7CzZP8dPX0MrV5Ik8cTPIRaxcJxx37b1xKZCqtKpXhC21ayypmbn0uOyn4pBWPXX4yWZ/jIfToVwDqOvZhDhCVTyaSI99ySMmnl0zjVZkD/MvHP8l/fO4L7O/s5tIpNXz6vCk49hgWiACZTuN09+AmyyAOw0fTwW3M2LYiK47ngWtOtu7ZeBDIH4CEYaeZvnNl4c56xh7auH0J1PpNrpnZxPe+/yN6e3vJpNJs37adtevWc/O0Knz+MZqdjovbpcwpV5ZFbXWHW5i/5q/ZAx3ALSMV/lMLZODO+mbgMWmYTN21imCis2Bz7yaSyMzIDfv6DIHfNGg/dAghBI7r8p17vsW37/4WiVSKhsAYm7R0JW5vH053j+qEl8GiFgZVve2ctfrP2RGrPmCJFY/t5CRkvER3vw1ACsHM7SsGLhN9icHdyIdIT8ZlX3eCK6++EsdxkFLiui4zZkynUwQ42JMaO8JIJnE6u8tbYQhBdfcBFr3wgOeu7/ndvcGKx7ZzkmKOh0Tu3rQuOX3+ggnAhZW9HRyYugBngD3wZDqD8PsRhih3ueO5A918+Q2X4g8ESKZShC8Oc9s7b+N9K/bSmnRO7MS+lLh9SdxkEmynvEMwhklN937OfvmR/kcvya7hOVkZN34a4Uh0BrBWSFmdqGrgpVe9aeBFT4bArK5SLtolljPl3i6kJJDoJtjbgRCCzgnTka7LlEo/n79gBlOrKzicSPONVXtY2daLcaLU4bq4qfTI9cGEQcOhnSx45Y8qZChp4C2jETxaC6Q0kbwL+ImQkpZZS2iZuXRQk8CoDA3o0Hhk3YIQSGHgyySpbdtN/f7t1O/fiplJ4ksn8KVTPPOmz3gLkLzKGr8hyLgqquxo56QQkLFxkilwnJGbLDV9TNu5khnbnkdNi2aAC6147CVOAcadp184En0EeJ1rmGxeeA224cc1TG8BkHocafQPVSoxKysQppH1MPVW6zkZfI5NRXc7wb4OQt2HCHUfoqK7HdcwcBA4CEx/gFRlLR3Nc9ix6Or+u6meMDNK2o43VGvbI6hMgZAuM3a+yLSdK7P7cbQDr7fisWc4RRiPApkC7AJ8KlKGJw5xdO9yeVyABO+87PlI2c9DWOBKF9f1OtyO4+APVXLu4sUsveB8zpp/Blf8dQdGRcXR60f9LQmk4yATKc85cxTSYbo2C1fFqepqy4pwO3CxFY/t4xRiXPqKhyPRq/ACPWAYBhOamkin07hS4riu57KdU4gM08QwTExDUFFRQSAQwO/3EQgGaZo4iUmTm5k2dQoz58xh6uRm7EwG27bx4fK1Va3ct/Eg5mjbUcpb2U2lVad7FH5fGFR3H+DMtX/Fn+rNFpHlwGuseKyXU4xxu5giHIl+ELjXdVyuee11XH3da0gmk0gpvdCkOQIRhreO3UDg85nU1dYQqqjAML3gQdlwpvnCmh5M2rzx0S10pkfY50r5SMlUGjeTORI4YtQwA8zcupwpLa8cMUfxlst++mScBCwqS8ZrwndvWrdi+vwFc4Uhzt20fgP+QID5Z52Fz+cjEAgc98/v9+P3+/H5fRimSTqTIZ3OHKkhhBAFa4tav0lb0ualtr7yj1S5rmc+pTK4fQlkIulN6o2mMAyTyt7DnLXm/5i4b1O2pToMvMuKx+7evWmdyymKOZ4TP33+goeBWaZpLt66eTNtbYdYcv5SnCJct4UQSClJZzIk02kSqRSO4yIMgc8wEf2EIIErptTw0M4OujPu0Jrd7FCXKz23mGTam/lPZzyX/awoRtuMEwanb13OnI1PEkj1ZnfJelaNVL3AKc64X6+qNmD5I3C94zics2QJb3rbW6gIBnCH4HeUNbH8Ph8+n4lpmp5gDMH27jRv+fs2nOOyUPYbC/DMItkv1I603aOrH7MtwwmdUfRCCNV17OX0Lcup7G7LRj7sBr5qxWNfRHNyCESJxAS+D9wupaSmrp73ffTD1NfVltcSEYL71h3kV+sPgjnQBOQYXkklDIKpHuav+xtV3W39TTkLb7/x/VoWJ5lA+gnlXtRST38wyC1vfzvnnHs2soy+WVV+g7us3fy9pWsc5Z4Aw6Cy5xCT965jyu7VuEeC77ED+KIVj/1Yy+EkF4gSSRQvxCVCCOYtXMi733M70rXL1u+1XckHntrFxvbE2M9B1WLM2fQktR17lZPhkUT/M/DtU3WE6pQUiBLJ2XhxWxc6tk1lbS03Rd/IoiXnIQB3mC2KUOL7yNO7eOlA79jLRcNEODZ1nXtp3ruepgNblEuNAV6sqv8FPlNMpHUtkJMUFUD7y8DHs61JXUMD73zv7UyePHnYIgGwpeST1m6eb+0BYwxkpfDcaabvWsnkltWYx+9E+03gU1Y8ltBF/xQXSD+hXIq3bDcspSSTybD0ggu48NVh5s0/A6CoYeGCfRKfwb2rD/DLjW0nRBAIg2DiMLWd+5lwcDsT2raBJLuYCbx9x38HfNOKxw7oIq8Fkk8kPuB1wIOoRWLCMKiuquLGm29iyflLsW17yJuDCmBzR4o7n9yB7cqRf2VCIKTD5L3rmbJ3DYFET/+Z7yyrgduBl3QfQwukFLH8K/BOYAFAKpWitq6O85YuZd6Z85kxayaNjY3YjoOrVg0WZfYLb8XhPav289ddncPP3SPbLQiEkyHU10Fl72Gquw9S17GX2o59uIahWoojP/Q88FfgF1Y8tlEXby2Q4bQol+Bt7jP3aJkUCCFobGriVRddyKIl59HQ0HDEv6sYsUhgV3eajz69i8PJTAkTgtn9P7zza7paqT+8m4b23VR2e+abyL9ArF2ZkN8Heq14zNHFWguknGJZCrwZuBpvpyOklNi2jes41NbX0zxtGs3Nk2icOJG62jqq62qpDFVSUVVFRTCAvyJEwO/zNqkwBIbwAjz875bDPLDlENvaezHtFIZ0MVwbXzqJ6dr40wn8Ge9fMNVLRV8nFYlOKpLd3my8GnnK2YhmLfAynoft31RQC40WyIgLxcDbQ/F24E5gXqEsy5bXo/5aR3d/EjmtiZt1OzlyRJ0nj/17AA4BvwdiwDK8FX1uqVspa7RAyi2YeuAC1aqcqUyxWcC0Mv9UB9AK7AV2AzuBLXh7Na6z4rFu/Ta0QMaDYPrnVROwEJgNnIa3F2MNUJ/TLKTwIp0fBLqA/f2EsB3PpfyIt6NuFTQajUaj0Wg0Go1Go9FoCjDeIiveAdyENwz6KSse6zzVX2A4Eg0Bd+CNrP3uVIl4qAVyfEH4Z+Dr/Q6tBC461R3xwpHodrz5mSy3WfHYL3TRLg/GOErrm3L+XgIETnFxvCZHHACf1sX61BSIT7+u4wjmOWbqbDk1BaLRaIFoNFogGo0WiEajBaLRnNSckJGhcCR6DnAGnnu4wFsEtA94eTQib4Qj0UpgKTADCOG5m3fjuaC/MBpu5+FI9GK8dfGT+h3uBNYDT1jxmD2Cv10BzLHisbXDvM+rgYvwhpprgV689SwvWvHYY6NYniarsiTLvRZfjNIDBJUg/h144yCnHwS+BPzUise6+t3jBVWo+1Nd7KYu4Ui0CoioNJw5yOkvAZ8D/l6uBUvhSNSPt0rxc0C0iEv+BHwCb9FUpsA9I8Afcg5vteKxuQOkYyleHF6/OhS14rHflfAcTcBHgLuvZ1EoAAAL8klEQVQYfEj5QZXfm614LFXG8lQP3AC8H3h1ztcSWGTFY6vHhYkVjkRvUC/klSLEATARuBtoCUeiPw5HooEypOGrwDbg/iLEAXAe8DCwMRyJfqkMv78IeBxvPXm0yMtei7f2/HEVKbIc7+JdeFsb+Psd/kY4Eq0p4tpQOBL9qWplP0Vx8y0344UfeiYcid5YhvRXhyPRX6h3+as84shW+veogOZj18RSPkLfBt49xFvUqmv/IRyJLmEI8dLVfobLgPlDTMMU4JPhSPTNwOVWPLZnCGn4IHDvMLLy1cAjHD9jXmo6XgP8KE+lGBysHKhW5wm8NftDYSkQD0eivwRuH0prEo5Er1Dvshia1HMOO8KLMULiaAJWDEMc/WlUdvkZJabhRmDTMMTRnznAK0qopaQhNkxxZJmpTLShvo/3KJMt3/tei7ccuNC1dwEvDEMc/flHYIXqA5VqASwr4ZLVQFn6cL4REEctXkiaeQOc1qU6xSnVMpjqBTQWaLpD6l+xaTgfiA9wiosXT6pPDRBka9Jq1dnLR0PW3LHisV1FpOFvwDUDnHIIb036NpUPzarFqsdb334MQ3XKVP2U+wp83QbcWCiWlnIQ/a8Bbp9Qz7AX2KPe0VyVVw0FrjkX2BCORBdY8VhfEem/D3jPAKfYeAG5HfX/f7fisbeP5VGsRwcQxxa8YNIrgdb+TW04Ep2gzIiPAm8fhkDPAZ4epOP4Fbx9MQ5mR6xUDT0Zzwnya3meQaiC+7fBWqVwJPrpAcTRiuee/lzuZjUqMMTpyna/C5igvvrAEPPi/crMLZSOpYUCWYcj0es41ns6l/9S/YCtVjyWzLn2NDW69bUCpuFM4DvAuwZJ/4cGEce9Kg2tQBroKkZ0J2wUKxyJfg74bIGvf2rFY+8u8j7X4oXorx/k1ONGscKR6BPAZXnO7QXeYsVjjxSZhnvUKEm+Fu0+Kx67o8B184ENBW77sBWP3VRCfk4aaNh7oFEsZWIWakU7gIUDbX8QjkRbVauWyxrgKiseO1jkM3wZbx+SfCbiNYWGg9XAxssFbrsWuHY09mw3yiiOIGp3pzzcUaw4lDnxN7w5gr0lpuGtBcThqtrykRLS8GE1kpTPtLlV1ZK5v2/gBXnLx92liEOlYShzQo5aWFZIHAfwhkEHEsdPC4jjN8CSYsWhnuEu9U7y1ew/zNe3UgM8vypwyx+odzni4ih3J/1DBezO+6147L5Sb6YyYKbqKxRLod85fygTSEqo7ynQJ8q37uICvFhZuTxnxWMfZXSYPYBZ1QGcN1AfKhyJzgTemuerZ6147K2ldn6V2XgVUJnn69p8/S016rUwn/luxWP/r5xzKqMpkC/kObbdisfeNtQbqtnkNxaoxXNfxFUFRlq+PpxlqFY89jPgP/O1innmaG4qYErcwejhK9C37FC1/2Ct8vXkX2dyh8qPUofb/4A38ZuPF614LF8F+Jk8x5LAjYwyZRGIGjXKl6n/PNx7W/HY48rmHIyL8vSpHLxJx+HyDTXqlEuu2XhLnnP+14rHVnFi6VKt6PYizr01z7G/WfHYKyWWicZwJLpmgEK91YrHrivw3Wvy5fVothzlbkEuKFBjPVmm+99VxDn55igesuKx3WUQ6SE895NcXpfz9+l5zvmXEyiMrI/ZUise21rkNRfnOfbxEsUxQ1VqCwuc8iiet0Kh0bNc2tQ1jFeB5PP92VGg+RxKAf1LEafNzHPsO2XMq3yd3mlZl4ZwJJrPhWVniX2octMLXGLFY1uKLNiLCpg260sQx5XquScXOOUeKx67dgAft3wVXQvefMu4FUhtnmPPlDmtg5kHjXmOPVXG31+Z51gFRwNHNBYYMToRUVck3iTeBSWaRvnmd1op0s1HzVsMVNO/xYrHPjLIbSblObZnJL2bR6uTnku5h+E6Sn2WMu+21FPgNweaS0rgDTGPNgK43orH1pd4XT5vhUyR4vhP4J4CZaoXuMGKx35bxK3qClQ0jGeB5CskDWVO62D3G+mCWF+gppYD5EGIE7co7Zul+jzhrUcpuYyEI9FleK75hSq2c6x47E/DeBZnvAuks0hbcjjMypNpcqAWpoBNPVTydSpTHJ0XyDcYMJETF65oCZ4HbaiEa/KtoZhcqJUMR6JN4Uj0aeCKAvfbgDdjv51xSrkEkq8TeLaaXR82BdYSHMipWfK9hNvLmFdvyHOsK+tEaMVjOwuIuuoEvt9r8NZiFPUeCox0VZFnNCociZ4BrCP/qBd4LvpLi5h3OSUEYhUwScrVinyxQKe9v0BezHPOHWVacDUZzwt1sIGI5XnO+ewJfsfnAY+U0JL8Mc+xb+Tkx6tVfk8scI/fWvFYpNyOg+NWIGqmOnfpq58yhMEMR6KXAflW1L2YM7LxTJ5+iB94Xxke8bMF+kD35/z98zznfEA5MJ5IrgGeKrKyyBfX9/JwJPpa9T5ux1ubUV3g+o+R31XllG5BIP9k0g3hSPTOYYgjpApdPo/an+WI9Em8CaVcvjycAqo8ZvM9w7Y8Q6h/xxu5yuXnam/20aDQkOxS4IEizK1Hyb+A6mvKjf+H5I+JnMJzSv3GybTXYjkF8nPyD+3eG45Ebx5CwfTjrUrMNwH4lBWP5TOp8vl9BYHnw5HogiGkYQ7w6wJf35GnJd2s0pzLBQXMr5FgB4U9YV8PLBtIrMpr4HN5vlpIfn+7LJcOxSn1lBGIFY/14I2D5+IDfheORP9DhdsptmA+WsC0SnN8pPdsGh5TtXguNcALpQhVBZvYVMCUWEXhRVmFnDNfFY5E14Yj0QuK/P1gOBJdGo5EZ5f4KlwrHvtH4KeFbq3ehznAu/wGxfm/ZfuCM6147Pk8z1AdjkQvDEeiV45iCzpmWxCseOwrwHMFvv53YHc4En33AIXCF45Ev4UXAeWyAqd92YrHWgdIRiGTLgTEwpHoS+FI9LyBxKmGLh8ZIH9uzF1F1y8P9uKFxcnHAtUX+IvyVyqUhk+r1vgZvLXwQ+nL/VOuGZrTkvxtkMgf72HwuaVNePG1duWaxuFI9Cd4Q99PqsrukfEokLLHxVL9ho3A9AFOS6lM24Q3U9sILAJeNcjtf13MemPVUgwW62mPagValN0+BbiQgdfSu3gzwn8pwjxcRuEh0CxtqjI4qPJkLvlD2WDFY6JA/2jAuFjhSPR7wP8boEP+Tisecws8x8eA/x7kGfbhDff2qNb2NAovSb7CiseeGCTvfsLxS3F/aMVj7x33LYh6kQnVjA80+xnE84T9qOrc316EOH4JvKPINDwIDJah04A343nb/itexI15g1xzYzGOk1Y8lrHisUvIP/zdnya8xURvBm4rJI6syTXE93En8L0CX9+q8rXQtV+n8CrRLFOAq/Hmia5m4PX6S09pE6tfxu7Bm4FdUYbbpYBPWPHYraU4rFnx2A9Vf6CjDGnYhDfpVbS7hFpJdw1eALrhcqDAWghRzDErHnsfOXMZ/bhSRSoslI/fBt7J8P2hUuQfBj8hls4JFYjK2DYrHrsQbynuUHkemGHFY18eYhrux1uC+vdhpOHzwFlWPLayxN+WaqLsjeSfhS+FQouO8rnSdxVIz8eA7xYY9HAHeZafqXz8/hDTvwWYb8VjbUWcuz/PscMnSiCjFZt3Cl7ommvxZqQHMhd2KtPkp1Y89tcypuESZXaFyb9+JYuj+gWPAd+x4rEdZfr9gKosblSmRvUApx/Gix7yKPDfA81IhyPRR5Vpg+rPXaPmhAqd/ymO9Uz4ohWPfaaE5zhNvcur8WbpzQH6V8uB/7HisYdKLCsbOLqEohtYUI6Fb2O+6VJDfT7VgT8Hz1XBwJtc24635iIFZEZiskmZPT68GfZz8CIm1qlOegfe0OYW9fv2COWBqQrVVOB81akNqtZgq8qDBGAX466v7neGKlDr+wf8HuCamaoP+NRQgzz3e5cL+z1HAtiFtw5nn3oGdwj3rsULNC6APxTzTBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUaj0Wg0Go1GozmR/H/EMtjIU9XFggAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"f444ca63-a73c-4878-955e-96b508f9e883","Name":"Download file","Description":"Downloads a file from the internet to the local machine.","Version":3,"ExportedAt":"2017-03-07T05:12:43.174Z","ActionType":"Octopus.Script","Author":"ahmedig","Parameters":[{"Id":"3e6a8f44-5791-4571-8e90-025f6776c6d0","Name":"FileUrl","Type":"String","Label":"File Url","HelpText":"Url of the file you want to download","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1b67fd5f-f626-40f4-80bb-f10fe681abf3","Name":"FilePath","Type":"String","Label":"File Destination Path","HelpText":"Destination path of the file on disk","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"Write-Verbose \"Downloading file $FileUrl, to the destination $FilePath\" -Verbose\n$client = new-object System.Net.WebClient\n$client.DownloadFile($FileUrl, $FilePath)\nWrite-Verbose \"File downloadded\" -Verbose\n","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"HTTP","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-download.json","Website":"/step-templates/f444ca63-a73c-4878-955e-96b508f9e883","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB1dJREFUeNrsnc8uO18Yh1ERoRKJ+CYkLNljzwVwAXoBdQHs6V7t6wLaC+AC2GPPykJIxM6fECm/T3qS8zumM9PTabUz+jyr0Z7OTOc8877vnDlTw9/f30MA3WYYsQCxALEAsTgKgFiAWIBYAIgFiAWIBYBYgFiAWACIBYgFiAWAWIBYgFgAiAWIBYgFgFiAWIBYAIgFiAWIBYBYgFiAWACIBYgFiNXM19fX+/s7x25AGB8fHxkZafdTowm2JBfr9TpHfEBIltNGOHDwGyAWIBYgFiAWAGIBYgFiASAWIBYgFgBiAWIBYgEgFiAWIBYAYgFiAWIBIBYgFiAWAGIBYgFiASAWIBYgFkByRnu/ybe3N457hhgeHs7n8+kV6+vr6+npSVZNT0/ncjk6LCt8fHwkECvJD6/V6/V2o46suru7m52d/ffvH12VLWSIglZKxXp8fFSgmpmZoZ8GRKxeFO+fn58Kp1jFVWH3xVK44lgjFgBiAWIBYgEgFiAWIBYAYgFiAWIBIBYgFiAWAGJBahjNyo5eXl7a5aWlpampKTpPHBwc3N/fa2GrQWibarV6dnamhfn5ebVHrB/s7OzY5Uqlsrq62vk6n5+fb25uWq5KvbKxsZHCY6L9Pz09NcuFQiGqmdroaxqxSIW/js5jneJuIAwNk2qjlun8CiYOGaJOD3PyxLcZ6IjV3axaLpft4Y7qD7Ux8WBubi7l5UFMbeDK18u4O4gRS5k03iqhBjbLpBYrTYwxPvIhFvxQ/+XlpaVYPvIhFoQYk8/nFY06kQ+xIESsmJLcRz7EgvBrPZ882Mvrwb9wVXhycqJjp0P88PBgLt90Xm40aC5ULxtowTQ2XFxcuFfsWoOp2c2oo0Htj4+PzbIa2HFIbd2uqlgsmv6u1Wpa59XVlXl9ZWVleXlZH2kZMLRF93JhtUHLktxzoKH343BZFUtH9uDgwFXEGCDOz8/L5bLeDRxNfcT6YblqYOVQJzW3ccWSKK5Y7mf1p7Zraxp3/bJtfX1duxRzXeZuxe5My1AkX6OGPX3kIxUGA9XOzk7AKhf17t7enpr1cpdKpVLAKhfpXigUWg5z+J9X/gVWjHxErB+4KWOugZEp0G2KH25OVDPFm8C1kv24WVZj08Zdm1v5Kq+F7pKsssubm5vqb61K3a/etSeAFhS0KpVKh+NJNvUP+Y1g9T5cZbvGUmfv7u66R01ligKVFUJyKJDYm2j2Nq2yjE1hesWURxaTj9Qr9u6kNtScH0ORmrLZWqhe18rtCL5xQqvSbnfyxQN1YSfyIVaIVc2nvgK+XpQrNiDJj5i7s91Fga1arQZ2SX+aCQXWLdVb29vbzbnJfCPX0ZY5TnVbJ/JRY4VweHgYmlD0ojt7JKYO6zqKTFE5TiHK/VE89/6du+erDjFVkQ23PgVWjHyIFURFTMxxdyN/t4plnwga080B3Tu5C+l5U9lHPsQK6cUUuh7foFu625JcuTLq7OrXjIbMixV1aZbmXQpEjvh5YD4Ry+d6MEY+xCKIDrmXvbZq9Cmw+jjxFbG6g8/QVOfy+UwZ9ZQPsSAkx62srPhMGUWsgaDzS1Qrlk+BFSMfYmUGdzbE74UrO/C7trbWiXyI9XeiUeAyMEGSsjnOzA7qRD7Eygyhg+lRDZJV8W3NaIiRD7EyJtbz83PUu3rLncPTcjQ1NNX6PB7Y3xkNgy5WuzkiZpaV26ZcLke9G5gAGPUsvGcmjSqePOVDrF5QrVZ9njH0mTN4enoa+ssIetG9OVgsFkMv1qTOmkNgoo7P44E+8vWMQXwS2p1ooEBSKBT0ihaKDczrgc4rlUom6ugaPmZulgRS725vb5s7PNfX17VazZ1hIS30bic1XAqfTUWsyFRo8pQ7ZLDUwA1mpk1UeDNqDjUm6hwdHYW2UUEdNdunZchM87OppML/pdnf3w+tUQIprPk/i6qDQ4t0NY6f+aR3lXaT3RJu99nUvhdYWYpYZip6aJ4KYOetx6DyWc3U03beUrNDZkZypVJxB4e0ZsWk5h3QK8qVMkAfCUQ1KaVs27KzA7vtziBt99nUNIjVi/+wqsb6SL/mb/we7tx59ye77AN9cqUrg0k+02C0RRNKu7VRS7L/sDqINdZvYyYZd3GFPmtL2+RHBkgBsQCxALEAEAsQCwYZhhuSs7W1Ze8OpfaXlfsFA6TQgmQDpKRCoMYCxALEAkAsQCxALIBsilWv1znWiNVlxsfHYx7mBMRKuo2RkcnJydvbWw734NCLWzqGx8dHbWtxcXFsbIzjniGS3dLpnVji9fVVOfH9/R23MsTExMTCwkKqxYKMipXL5RhugEEabgDEAkAsQCxALADEAsQCxAJALEAsQCwAxALEAsQCQCxALEAsAMQCxALEAkAsQCxALADEAsSCv0qSR+wBEAsQCxALALEAsQCxABALEAsQCwCxALEAsQAQCxALEAsAsQCxALEAEAsQCxALALEAsQCxABALEAsQCwCxALEAsQAQCxALMsV/AgwA3l1/9Yi7khIAAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"1cdf63ce-50c8-45a8-cce2-f6ca2d6d617b","Name":"DSC Windows Service","Description":"Starts/stops one or more services asynchronously, and then waits for them to align to the specified state","Version":15,"ExportedAt":"2017-06-20T14:35:09.389Z","ActionType":"Octopus.Script","Author":"dunedinsoftware","Parameters":[{"Name":"Services","Label":"Services to align","HelpText":"A comma delimited list of services or wildcards (eg. \"Sky\") to align","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ServicesToIgnore","Label":"Services to ignore","HelpText":"A comma delimited list of services or wildcards (eg. \"Sky\") to ignore","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DesiredState","Label":"Desired state","HelpText":"The desired state of the service/s. Specify either \"Started\" or \"Stopped\"","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Running|Started\nStopped|Stopped"}},{"Name":"TimeoutSeconds","Label":"Timeout in seconds","HelpText":"The number of seconds to wait for the service/s to align before timing out and throwing an exception","DefaultValue":"300","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"\n $ServicesToManage = $OctopusParameters['Services']\n $ServicesToIgnore = $OctopusParameters['ServicesToIgnore']\n $TimeoutSeconds = $OctopusParameters['TimeoutSeconds']\n $DesiredState = $OctopusParameters['DesiredState']\n\n # Gather information about the list of services\n $services_status = @{}\n\n # For each \"service to manage\" or wildcard specified ...\n $ServicesToManage -split \",\" |% `\n {\n $service = $_\n \n # ... retrieve all the services that match that name or wildcard ...\n $service_states = Get-Service |? { $_.Name -match $service }\n \n # ... and add them into an array; we use a key/value array so that services only get added to the array once, even if they are\n # matched by multiple wildcard specifications\n $service_states |% { $services_status[$_.Name] = $_.Status }\n }\n \n # For each \"service to ignore\" or wildcard specified ...\n $ServicesToIgnore -split \",\" |% `\n {\n $service = $_\n \n # Copy the keys within services_status, since we will need to change services_status as we enumerate them\n $keys = @()\n $services_status.Keys |% { $keys += $_ }\n \n $keys |% `\n {\n $key = $_\n \n if ($key -match $service -and $service -match \"[a-z]+\")\n {\n $services_status.Remove($_)\n }\n }\n }\n\n Write-Host \"Matched the following set of services, along with their current status:\"\n $services_status\n\n # Now act as required to bring the services to the desired configuration state\n [DateTime]$startTime = [DateTime]::Now\n \n # State to pass to sc\n $state_type = if ($DesiredState -match \"Stopped\") { \"stop\" } else { \"start\" }\n\n\t$unaligned_services = ($services_status.Keys |? { $services_status[$_] -notmatch $DesiredState })\n\t# Attempt to align the remaining services\n\t$unaligned_services |% `\n\t{ \n\t\tWrite-Host \"Attempting to $state_type service: $_\"\n\t\tStart-Process -FilePath \"cmd\" -ArgumentList \"/c sc.exe $state_type `\"$_`\"\"\n\t}\t\n \n while ($startTime.AddSeconds($TimeoutSeconds) -gt [DateTime]::Now)\n {\n\t\t# Attempt to align the remaining services\n\t\t$unaligned_services |% `\n\t\t{ \n\t\t\tWrite-Host \"Attempting to $state_type service: $_\"\n\t\t\t$services_status[$_] = Get-Service $_ | Select-Object -Property \"Status\"\n\t\t}\t\n\t\t$unaligned_services = ($services_status.Keys |? { $services_status[$_] -notmatch $DesiredState })\n\t\tWrite-Host \"$([DateTime]::Now): $($unaligned_services.Count) services of $($services_status.Count) not yet at status: $DesiredState\"\n\t\t\n if ($unaligned_services.Count -eq 0)\n {\n Write-Host \"All services now at desired state; exiting\"\n exit 0\n }\n\n \n # Pause for a second\n [System.Threading.Thread]::Sleep(1000)\n }\n\n throw \"Error: not all services reached the desired state within the specified timeframe: $unaligned_services\"\n\n\n"},"Category":"Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/dsc-windows-service.json","Website":"/step-templates/1cdf63ce-50c8-45a8-cce2-f6ca2d6d617b","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////Da3qSsLvhtb0wur6O7zuWcfxldv2aMzyK7ftpOD3s+X48Pr+0fD7d9HzHLLr4fX8xD/OcwAAAaNJREFUeNrs3cFygjAUQFECWott1f//2sJoW6kIKEzNs+euXOmcmSSGDa8oJEmSJEmSJGmsj1W1K9cpsGD1Vr2WdToVEPC+2lYvZfpVrEW0qZpF1F+MRdRugzoNlvkiarfBPk0pT8GhWUSX2yASpDlLr2+DEJBmEY1ug6whx7N0n2b30G1QlmmxHsRYp6X76yvF9vg5RYQczq8UVURI35UiFmTgShED0p6lI1eKzCHTrxS5Qk6PZ9PLDtJ9PIsJmXWlyAky6/dAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQMJCyjltF/iO3gpJUpD8s4OAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8T8itwwKyhbTdMr4ha8hXUwZqhICcOgyNOIkE+V5wo4MSgr1u/fp7poO+AL8K/gL8yw0UeyRB34m9iQ/pVD8L5JYTO3NI58R+AsiEEzsW5OfE3sUe/zRwYkeGnG2g2CPS7rhjF4GKP0ZwyoldxK37kFqEL/7wU0mSJEmSJOmJ+xRgAHxZTCXGdZkfAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"5e359c05-89a0-4a13-98a4-d54b0415bb45","Name":"Dyn - Create an A Record","Description":"Creates an A record in the specified zone with the specified details. \n\nNOTE: The API User MUST have the follow permissions:\n\t- UserLogin\n\t- UserChangepw\n\t- RecordAdd\n\t- RecordUpdate\n - RecordGet\n\t- ZoneGet\n\t- ZoneAddNode\n\t- ZonePublish\n\t- ZoneChangeset\n","Version":1,"ExportedAt":"2015-11-27T06:25:11.275+00:00","ActionType":"Octopus.Script","Author":"timhunt303","Parameters":[{"Name":"dynCustomerName","Label":"Dyn Customer Name","HelpText":"The Dyn customer name, usually the company name","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"dynUserName","Label":"Dyn User Name","HelpText":"User Name of the user that will perform this step\n\nNOTE: The API User MUST have the follow permissions:\n\t- UserLogin\n\t- UserChangepw\n\t- RecordAdd\n\t- RecordUpdate\n - RecordGet\n\t- ZoneGet\n\t- ZoneAddNode\n\t- ZonePublish\n\t- ZoneChangeset","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"dynPassword","Label":"Password","HelpText":"Password of the user to access Dyn","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"dynZone","Label":"Dyn Zone","HelpText":"The name of the Zone, where you want the A record to be created\n\nFor example: myzone.com","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"dynFQDN","Label":"Fully Qualified Domain Name","HelpText":"The name of the A record that is being created in Fully Qualified Domain Name format\n\nFor example: newrecord.myzone.com","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"dynCorrectTTL","Label":"Time to Live","HelpText":"Limits the lifespan or lifetime of data in a computer network","DefaultValue":"0","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"dynCorrectIPAddress","Label":"IPv4 Address","HelpText":"The IPv4 address of the new A record","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"#--------------------------------------------------------------------\n#Log In Variables\n\n$dynLogInURI = \"https://api.dynect.net/REST/Session/\"\n\n$dynCustomerName = $OctopusParameters[\"dynCustomerName\"] \n\n$dynUserName = $OctopusParameters[\"dynUserName\"] \n\n$dynPassword = $OctopusParameters[\"dynPassword\"] \n\n#--------------------------------------------------------------------\n#Get A Record Variables\n\n$dynARecordURI = \"https://api.dynect.net/REST/ARecord\"\n\n$dynZone = $OctopusParameters[\"dynZone\"]\n\n$dynFQDN = $OctopusParameters[\"dynFQDN\"] \n\n#--------------------------------------------------------------------\n#A Record information to check\n\n$createNewARecord = $FALSE\n\n$UpdateARecord = $FALSE\n\n$dynCorrectTTL = $OctopusParameters[\"dynCorrectTTL\"]\n\n$dynCorrectIPAddress = $OctopusParameters[\"dynCorrectIPAddress\"] \n\n\n#--------------------------------------------------------------------\n#Publish Zone Variables\n\n$dynPublishURI = \"https://api.dynect.net/REST/Zone\"\n\n$publishZone = $FALSE\n\n\n\n\nWrite-Output \"`n-------------------------`n\"\n\n#--------------------------------------------------------------------\n#Log In and Retrieve Token for this session\n\nWrite-Output \"Logging into Dyn and retrieving session Authentication Token.\"\n\n$dynCredentials = @{}\n\n$dynCredentials.Add(\"customer_name\", $dynCustomerName)\n$dynCredentials.Add(\"user_name\", $dynUserName)\n$dynCredentials.Add(\"password\", $dynPassword)\n\n$dynCredentialsJSON = ConvertTo-Json -InputObject $dynCredentials\n\n$dynLoginResults = Invoke-RestMethod -Uri $dynLogInURI -Body $dynCredentialsJSON -ContentType 'application/json' -Method Post\n\nif($dynLoginResults.status -ne \"success\")\n{\n Write-Error \"Invalid Log In Details. Please try again.\" -ErrorId E4\n}\nelse\n{\n Write-Output \"`nLog in was successful.\"\n}\n\n\n\n$dynSessionToken = @{}\n\n$dynSessionToken.Add(\"Auth-Token\", $dynLoginResults.data.token)\n\n\nWrite-Output \"`n-------------------------`n\"\n\n#--------------------------------------------------------------------\n#Get A Record \n\nWrite-Output \"Retrieving specified A record information.`n\"\n\n#get and search all records to get the correct record ID (not a unique id) for existing A Records\n#this is done to check if a A Record does not exist already. This is the only way to do it without getting an error.\n$dynAllRecordsURI = \"https://api.dynect.net/REST/AllRecord/$dynZone\"\n\n \n$dynAllRecordResults = Invoke-RestMethod -Uri $dynAllRecordsURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\nfor($i = 0; $i -lt $dynAllRecordResults.data.Length; $i++)\n{\n \n $a = $dynAllRecordResults.data.Get($i)\n\n $result = $a.contains($dynFQDN)\n\n if($result -eq $TRUE)\n {\n $dynARecordString = $dynAllRecordResults.data.Get($i)\n\n $dynARecordExists = $TRUE\n\n $i = $dynAllRecordResults.data.Length\n }\n else\n {\n $dynARecordExists = $FALSE\n }\n}\n\n\n\n#checks to see if there is more than one A record with the same name.\nif($dynARecordExists -eq $TRUE)\n{\n $dynARecordURI = \"$dynARecordURI/$dynZone/$dynFQDN\" \n \n $dynARecordResults = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\n if($dynARecordResults.data.Length -gt 1)\n {\n Write-Error \"`nThere is more than one A record with the Fully Qualified Domain Name (FQDN) of $dynFQDN. `nThis script does not handle more than one A record witht the same FQDN\" -ErrorId E1\n }\n\n if($dynARecordResults.status -ne \"success\")\n {\n Write-Error \"Error occurred while trying to retrieve the A Record. Please check the host name and the Fully Qualified Domain Name are correct.\" -ErrorId E1\n }\n}\n\n\n\n#Checks if the an A record was returned or needs to be created\nif(($dynARecordResults.data.Length -eq 0) -or ($dynARecordExists -eq $FALSE))\n{\n $createNewARecord = $TRUE\n\n Write-Warning \"$dynFQDN does not exists. Creating $dynFQDN now.\"\n}\nelse\n{\n #get information for the specified record\n $dynARecordString = $dynARecordResults.data\n\n $dynARecordURI = \"https://api.dynect.net$dynARecordString/\"\n\n $dynARecord = Invoke-RestMethod -Uri $dynARecordURI -Headers $dynSessionToken -ContentType 'application/json' -Method Get \n\n $dynARecord = $dynARecord.data\n\n Write-Output \"`n$dynFQDN has successfully been retrieved.\"\n \n Write-Output \"`n-------------------------`n\"\n\n}\n\n#--------------------------------------------------------------------\n#create new A record\n\nif($createNewARecord -eq $TRUE)\n{\n $dynCreateURI = \"https://api.dynect.net/REST/ARecord/$dynZone/$dynFQDN\" \n\n $rData = @{}\n\n $rData.Add(\"address\", $dynCorrectIPAddress)\n\n $dynCreateARecord = @{}\n\n $dynCreateARecord.Add(\"ttl\", $dynCorrectTTL)\n $dynCreateARecord.Add(\"rdata\", $rData)\n\n $dynCreateARecordJSON = ConvertTo-Json -InputObject $dynCreateARecord\n\n $dynCreateResult = Invoke-RestMethod -Uri $dynCreateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynCreateARecordJSON -Method Post\n\n if($dynCreateResult.status -ne \"success\")\n {\n Write-Error \"An error occurred while creating the new A Record. Please check the details that have been entered are correct and try again.\" -ErrorId E4\n\n }\n else\n {\n Write-Output \"$dynFQDN has successfully been added to the $dynZone zone in Dyn.\"\n\n $publishZone = $TRUE\n }\n\n Write-Output \"`n-------------------------`n\"\n\n\n}\n\n\n\n#--------------------------------------------------------------------\n#checking specified A Record to see if it is correct if it exists\nif($createNewARecord -eq $FALSE)\n{\n Write-Output \"Checking to see if $dynFQDN is current and contains the correct information.\"\n\n if($dynARecord.rdata.address -ne $dynCorrectIPAddress)\n {\n $UpdateARecord = $TRUE\n\n Write-Warning \"`n$dynFQDN is out of date. Updating now\"\n\n }\n\n if($UpdateARecord -eq $FALSE)\n {\n Write-Output \"`n$dynFQDN is up-to-date\"\n }\n\n Write-Output \"`n-------------------------`n\"\n}\n#--------------------------------------------------------------------\n#Update A record\n\nif($UpdateARecord -eq $TRUE)\n{\n Write-Output \"Updating $dynFQDN so that is matches the current information saved in the system.\"\n\n $dynUpdateURI = $dynARecordURI\n\n $rData = @{}\n\n $rData.Add(\"address\", $dynCorrectIPAddress)\n\n $dynUpdatedARecord = @{}\n\n \n $dynUpdatedARecord.Add(\"ttl\", $dynCorrectTTL)\n $dynUpdatedARecord.Add(\"rdata\", $rData)\n\n $dynUpdatedARecord = ConvertTo-Json -InputObject $dynUpdatedARecord\n\n $dynUpdateResult = Invoke-RestMethod -Uri $dynUpdateURI -ContentType 'application/json' -Headers $dynSessionToken -Body $dynUpdatedARecord -Method Put\n \n if($dynUpdateResult.status -ne \"success\")\n {\n Write-Error \"An error occured while trying to update the $dynFQDN record\"\n }\n else\n {\n Write-Output \"`nUpdate was successful. Just needs to be published to make it offical.\"\n \n $publishZone = $TRUE\n\n }\n\n\n Write-Output \"`n-------------------------`n\"\n\n}\n\n#--------------------------------------------------------------------\n#publish update or creation of A Record\n\nif($publishZone -eq $TRUE)\n{\n\n Write-Output \"Publishing changes made to $dynZone\"\n\n $publish = @{}\n $publish.Add(\"publish\", 'true')\n\n $publish = ConvertTo-Json -InputObject $publish\n\n $dynPublishURI = \"$dynPublishURI/$dynZone/\"\n\n $dynPublishResults = Invoke-RestMethod -Uri $dynPublishURI -ContentType 'application/json' -Headers $dynSessionToken -Body $publish -Method Put\n\n if($dynPublishResults.status -ne \"success\")\n {\n Write-Error \"An error occurred during the publication of the $dynZone zone.\" -ErrorId E4\n }\n else\n {\n Write-Output \"`n$dynZone has successfully been published.\"\n }\n\n Write-Output \"`n-------------------------`n\"\n\n}\n\n\n\n\n#--------------------------------------------------------------------\n#Log Out of session\n\nWrite-Output \"Logging out and deleting this session's authentication token\"\n\n$dynLogOutResults = Invoke-RestMethod -Uri $dynLogInURI -ContentType 'application/json' -Headers $dynSessionToken -Method Delete\n\nWhile(($dynLogOutResults.status -ne \"success\") -and ($tries -lt 10))\n{\n Write-Output \"`nWaiting to log out of Dyn\"\n $tries++\n Start-Sleep -Seconds 1\n}\n\nif($dynLogOutResults.status -eq \"success\")\n{\n $dynSessionToken.Clear()\n Write-Output $dynSessionToken\n Write-Output \"`nThis session has been ended successfully and the authentication token has been deleted.\"\n \n}\nelse\n{\n Write-Error \"`nAn error occurred while logging out.\" -ErrorId E4\n}\n\n"},"Category":"Dyn","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/dyn-create-an-A-record.json","Website":"/step-templates/5e359c05-89a0-4a13-98a4-d54b0415bb45","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"8CA59AC6-11A5-4624-A019-E93C1BA5F03C","Name":"elmah.io - Register Deployment","Description":"Step template for notifying elmah.io about deployments on Octopus.","Version":4,"ExportedAt":"2017-02-08T11:36:00.000+00:00","ActionType":"Octopus.Script","Author":"thomasardal","Parameters":[{"Id":"0a3fe2a0-5c89-4e56-b1c3-b31bf4978ca4","Name":"ApiKey","Label":"API Key","HelpText":"Required: Input your elmah.io API key located on the organization settings page.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"63e08bca-37d8-45ca-bd41-912efa1dfb86","Name":"LogId","Label":"Log ID","HelpText":"Optional: As default, new deployments are shown on all logs on the organization. If you want the deployment to show up on a single log only, input the ID of the log here.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"$version = $OctopusReleaseNumber\n$url = 'https://api.elmah.io/v3/deployments?api_key=' + $OctopusParameters['ApiKey']\n$body = @{\n version = $version\n description = $OctopusReleaseNotes\n userName = $OctopusParameters['Octopus.Deployment.CreatedBy.Username']\n userEmail = $OctopusParameters['Octopus.Deployment.CreatedBy.EmailAddress']\n logId = $OctopusParameters['LogId']\n}\nTry {\n Invoke-RestMethod -Method Post -Uri $url -Body $body\n}\nCatch {\n Write-Error $_.Exception.Message -ErrorAction Continue\n}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"ELMAH","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/elmahio-notify-deployment.json","Website":"/step-templates/8CA59AC6-11A5-4624-A019-E93C1BA5F03C","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABhQTFRF////B6mdqOHd1PDuNrmvfNHLV8S9Gq+k3DhZ2AAABP5JREFUeNrsXNl2qzAMrLX5///4kqUNBDCWLIOTq3noS3JKBm0jWfDzEwgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBD4NuAEuP3BD+bALEQ53ZGJhOHz2CD8MlgiC3wUDaG0C+JPsQsUWDzd7BPMAjkdY3wqIKkOWYZ2sFoadyo8cIwnFUY1SlV0LBPYkJHCSY8R3UuSCfwN9hiRiZnHYEwkpa9gwil9BRNo45HyIFkYcyORRPj5AfKs8V/CI6UBnAs9eKSM32GQpXMBsMjZHT748PgzCfK8v5TzyJATkYdJUPJFstLLIBNwssZ1VYb8iMhuPTqhAWuvhbM7ny9sJbnyJ+acxy79FZ5F/Bj9guRxS/9xl77oykFGZXLkWauE05Dk+ELP2kickIcUMYZLv8++MiDQ1SYBi6JFWn2pLol3NAmb7iCsY5gvNgnbUr8sdEk9EbpGwUNNB8OqVgCvSFolj6a3e1yblC8hIjUuCTrl2StIkAx3by5VSNljyjBEkGWmHp/1sl5BdyOSNSFyI7H5u+oFGF1BZNef3rkqRMu1FkFg2jziUUZ6TwV8GCOI2yRmwxGNHu5FpOgUePMn2mm0jE1/nynEgWalTRKrOZWqQelREFcn0Rm2Y6FAQju9yD3kYt7qoZDz3poD7+1rKVyrQ2HnvThcTwpTpuLcUy4Mka2KLn/JNr/nJ3QaVdIp5WNeN/LLnxxHfO6T050rz4aBU6gUgsIaJHSCXz3rw+xLuCl72T6sfBSgkxRvaUXmrhipdZ5PfsclUl6RwWJ3u901qiZdXsclh6NFLpYLKDe+whXzYRcqYE4uvK/6+EkCa5NY+2geyaxRHzmZtt2OZsvAckYmrjwNwf17sN0A66/BPSpInZSQSpVRKVmkW8Y6ul1Qd/3qqtLApLq5pn1zFpW47lCLuxtkp1xQuTeammLl0Ql0jpBykHC7KVqZcKPVC0FiPJAz1hNqvMLDooWPTjog1WwzFYIkQ+NNap5GqMxf0Ovc2O829yjSfAHY/8i6pWrRKirr50IlQb9ot0QJ1hO59bk/OpViJqI3SW1Zz4VHwfalvH2NQLrEenmC9Rsk6GgR/fQRPMy8GyQNKyroX9e58p+AKxF2J7K806hKwA0PCYi/RV6zxknJikrKN+xxUS/Xep556qQ825frtKs2NcYnno1zdCqlYbcOO0oti0oxlxLoTCSjTqWYqfS2yLZvFftdm38pLWLofVAn5a1UtBWRXBLjVr8r85cOMHW2iCXVQ5VK4eXoG6mzRdgnxa+m8vDUaWh1Yi0R8JEP71L+78DxJYqpa0FUnsfs3i1YqhSeHwCjxSL6tt0QJHQwlX9fn7iHCjdb3d23NhuU2cBxvc0yiRzyKFfOvkXFfhd8HpczjLbYln5x+W6a57Eoi8+zQJZFG21efO2Q0nyPw/GpLOvhApgMkn9HRHADc/bkYVz8zzaDvAZe2ZWF/dxKJbTBKjZ7T7GVtYTM1ae/QVSKDk8wSMOjMdU/TM4wSMtpOw8UIW0bXKrtBxnUseqZPC6CXXk0r6Fxtfvy0Dzqft90HZRRA13pXT0D3WuRDildCr/V2b5uc5h3Pbf94TqjeO/Ic77GHP5PkeAFVHq9fg/kTC5d3+iKwOdESz7jFTw40bm97qcTpi75g197HAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIPDf4p8AAwCtzTlV0SvdJgAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"2b7e3987-0da0-4a5d-bb60-c190b433d888","Name":"Event Tracing - Register an ETW manifest","Description":"Registers an ETW manifest","Version":1,"ExportedAt":"2017-03-16T13:02:50.0927973Z","ActionType":"Octopus.Script","Author":"HumanPrinter","Parameters":[{"Name":"ManifestFile","Label":"Manifest file","HelpText":"Full path to the manifest file that must be registered.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ResourceFile","Label":"Resource file","HelpText":"The full path to the assembly that must be used as resource file.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MessageFile","Label":"Message file","HelpText":"The full path to the assembly that must be used as message file.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"if(-not (Test-Path $env:SystemRoot\\System32\\wevtutil.exe))\n{\n throw \"wevtutil.exe could not be found\"\n}\n\nif(-not (Test-Path $ManifestFile))\n{\n throw \"Manifest $manifest could not be found\"\n}\n\nif(-not (Test-Path $ResourceFile))\n{\n throw \"Resource file $ResourceFile could not be found\"\n}\n\nif(-not (Test-Path $MessageFile))\n{\n throw \"Message file $MessageFile could not be found\"\n}\n\n& \"$env:SystemRoot\\System32\\wevtutil.exe\" im $ManifestFile /rf:$ResourceFile /mf:$MessageFile"},"Category":"Event Tracing for Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/event-tracing-register-manifest.json","Website":"/step-templates/2b7e3987-0da0-4a5d-bb60-c190b433d888","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"59be43c9-e5eb-499f-9237-f388bcd7940d","Name":"Event Tracing - Unregister an ETW manifest","Description":"Unregisters an ETW manifest","Version":1,"ExportedAt":"2017-03-16T11:12:52.2250765Z","ActionType":"Octopus.Script","Author":"HumanPrinter","Parameters":[{"Name":"ManifestFile","Label":"Manifest file","HelpText":"Full path to the manifest file that must be unregistered.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"if(-not (Test-Path $env:SystemRoot\\System32\\wevtutil.exe))\n{\n throw \"wevtutil.exe could not be found\"\n}\n\nif(-not (Test-Path $ManifestFile))\n{\n Write-Host \"Skipping manifest $ManifestFile because it does not exist\" \n Exit 0\n}\n\n& \"$env:SystemRoot\\System32\\wevtutil.exe\" um $ManifestFile"},"Category":"Event Tracing for Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/event-tracing-unregister-manifest.json","Website":"/step-templates/59be43c9-e5eb-499f-9237-f388bcd7940d","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"551a6f13-9e4c-4d45-8387-f424d5ca02a4","Name":"Execute AWS Powershell Script","Description":"This combines two previous library templates of [checking for Chocolatey being installed](http://library.octopusdeploy.com/#!/step-templates/actiontemplate-chocolatey-ensure-installed), and [installing something via Chocolatey](http://library.octopusdeploy.com/#!/step-templates/actiontemplate-chocolatey-install-package), in this case awstools.powershell, and then adds on a third piece of running a custom Powershell script using AWS Powershell tools","Version":6,"ExportedAt":"2015-05-01T18:13:07.633+00:00","ActionType":"Octopus.Script","Author":"hulahomer","Parameters":[{"Name":"SecretKey","Label":"SecretKey","HelpText":"Enter your AWS Secret Key here. This will be used to authenticate the session with AWS","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AccessKey","Label":"AccessKey","HelpText":"Enter your AWS Access Key here. This will be used to authenticate the session with AWS","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Region","Label":"Region","HelpText":"Enter the region for where you will be executing your powershell scripts against. If you are unsure of the region you are in, check the list found [here](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"AWSScript","Label":"AWSScript","HelpText":"This is the Powershell Script that contains commands using the AWSPowershell module that you want to execute","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"Write-Output \"Ensuring the Chocolatey package manager is installed...\"\n\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\n$chocolateyExe = \"$chocolateyBin\\cinst.exe\"\n$chocInstalled = Test-Path $chocolateyExe\n\nif (-not $chocInstalled) {\n Write-Output \"Chocolatey not found, installing...\"\n\n $installPs1 = ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))\n Invoke-Expression $installPs1\n\n Write-Output \"Chocolatey installation complete.\"\n} else {\n Write-Output \"Chocolatey was found at $chocolateyBin and won't be reinstalled.\"\n}\n\n$ChocolateyPackageId = 'awstools.powershell'\n\nif (-not $ChocolateyPackageId) {\n throw \"Please specify the ID of an application package to install.\"\n}\n\nif (-not $ChocolateyPackageVersion) {\n Write-Output \"Installing package $ChocolateyPackageId from the Chocolatey package repository...\"\n & $chocolateyExe $ChocolateyPackageId\n} else {\n Write-Output \"Installing package $ChocolateyPackageId version $ChocolateyPackageVersion from the Chocolatey package repository...\"\n & $chocolateyExe $ChocolateyPackageId -Version $ChocolateyPackageVersion\n}\n\nImport-Module \"C:\\Program Files (x86)\\AWS Tools\\PowerShell\\AWSPowerShell\\AWSPowerShell.psd1\"\n\nSet-AWSCredentials -AccessKey $AccessKey -SecretKey $SecretKey -StoreAs AWSKeyProfile\n\nInitialize-AWSDefaults -ProfileName AWSKeyProfile -Region $Region\n\n\nInvoke-Expression $AWSScript","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"AWS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/aws-execute-powershell.json","Website":"/step-templates/551a6f13-9e4c-4d45-8387-f424d5ca02a4","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////9o0R/eLD/Nu0/erS95Qg+bhr95sv/vHh+r96/vjw+bFc/NSl+KI++82W+saI+KpNeDqM1wAAA41JREFUeNrsnG2XazAURiuo0Cr//9feliIvR3DvXJFZe3+a6XpW5+xWEpyY2w0AAAAAAAAAAAAAAAAAAADgf1J0bda/9N70q83a3enzUHWVjbR1sW0xp6sd6fPI72VmUt3zA+kymD6N5vnIBMrHsxHTjsUXOX0e+iVaTNU5Q0A/Q+k+4oAp+ixMbw6A4rGVVjGHR92ulNXWuTAlBNJN/FFyr5yy3qN9rawmF9IxR4hqX4U1WMplmGtruVBDuiuswbKkzaGhX+cfXsqbZlXXv0dsYR13nw9fLenGXD7f6U5Ony4yTpzyZLNMUcpMr0xNzfwdRRMR1/LP2cqMctNqKx1LZFydm2U022ueEtLL6HbHfmSRYRn4HDXaXyzU4XRkkZWK/+JlRBBBBBFEEEEEEUQQQQQRRBBB5B9uYJc7SyuLw+nI7R2ptKWJcywd18Utza0rnM4iN66M6qzS5E93Lf1zLaviUL/ISs/Nt6W00DEyuRgiP2Yxvrd15z/Y26ncG76jy1Ta5jEy/L0p/VMWy33woVm8UYN1Y9fqKrzfZ5iedtaV34+kNxHak2Wg2SSkY7djx/bQWkNP6nkE0lH3Lyx7D1aak1Z1erWJ+U130Vz0Sude7mZqv995nW7mZxJd27Sg5XQppuMdWY3xl1XXOge8MasWjZfund0KbvrkE9fK7OPNne+2U9YEWX3nemtSbvLv6LJ7gZ9X45yBl9ZxrZ9d3vjT8rz62tOsny7jXkpYPX9jQmvF8yF55TdaslGviZy1vAmfoTobsZztGNEv7qZZSr/6HRc/0yzlb3HiKhURRBBBBBFEEEEEEUQQQQQRRBD5XSLav38tllbVzeH02Ww/UWA+6XgsHdXFKc2vK5Quoz/duVRnlrb26crpizzXOVU3l2Zb5Pfe+d1OX8ViqW7qH9gt51K44bukr2XxrW54vMaoy7mxa/cgvPRVKcQG7uOCD58HLQLt3r17Iy6AqjYeDG7TUenWW+p9Ot/IOF/lwuHV1nk6o8M469PWXhtr+0BeX/x7Ue40W3xacfb2gXFxUZcX8TYB3Kyfp+GThsjKti2zgZuMiLshxW3gpiQyrn/DXhR/i1NqIte5pkUEEUQQQQQRRBBBBBFEEEEEEUR+g4jQUZBEqjqFO9mOiyeShoXvYoukZOG4GCLpWZgu83/vTNRidhlE0rYAAAAAAAAAAAAAAAAAAACAZPkjwAAMDi+bsnPP/wAAAABJRU5ErkJggg==","$Meta":{"Type":"ActionTemplate"}},{"Id":"f3cf7831-d47c-4b5f-8f76-6bc649d59dd9","Name":"Explicitly Add IIS WindowsAuthentication Providers","Description":"Clears the WindowsAuthentication Providers, and explicitly adds the ones provided.","Version":1,"ExportedAt":"2016-05-27T01:18:58.041+00:00","ActionType":"Octopus.Script","Author":"KShanafelt","Parameters":[{"Name":"add-windows-authentication-providers.is-enabled","Label":"Add Windows Authentication Providers","HelpText":"If enabled, This step will clear the Windows Authentication Providers, and then add the ones listed in the\n Windows Authentication Providers\nfield.","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"add-windows-authentication-providers.website-name","Label":"Web Site name","HelpText":"The display name of the IIS web site to add Windows Authentication providers to.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"add-windows-authentication-providers.providers","Label":"Windows Authentication Providers","HelpText":"A comma- or newline-separated list of Windows Authentication Providers to add.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"## --------------------------------------------------------------------------------------\n## Configuration\n## --------------------------------------------------------------------------------------\n\n$isEnabled = $OctopusParameters[\"add-windows-authentication-providers.is-enabled\"]\nif (!$isEnabled -or ![boolean]::Parse($isEnabled))\n{\n exit 0\n}\n\ntry {\n Add-PSSnapin WebAdministration\n} catch {\n try {\n Import-Module WebAdministration\n } catch {\n\t\tWrite-Warning \"We failed to load the WebAdministration module. This usually resolved by doing one of the following:\"\n\t\tWrite-Warning \"1. Install .NET Framework 3.5.1\"\n\t\tWrite-Warning \"2. Upgrade to PowerShell 3.0 (or greater)\"\n throw ($error | Select-Object -First 1)\n }\n}\n\n$webSiteName = $OctopusParameters[\"add-windows-authentication-providers.website-name\"]\n$providersString = $OctopusParameters[\"add-windows-authentication-providers.providers\"]\n$providers = ($providersString.Split(\"`r`n,\") | % {$_.Trim() } | ? {$_})\n\n## --------------------------------------------------------------------------------------\n## Helpers\n## --------------------------------------------------------------------------------------\n$maxFailures = 5\n$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\nfunction Execute-WithRetry([ScriptBlock] $command) {\n $attemptCount = 0\n $operationIncomplete = $true\n\n while ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n $attemptCount = ($attemptCount + 1)\n\n if ($attemptCount -ge 2) {\n Write-Output \"Waiting for $sleepBetweenFailures seconds before retrying...\"\n Start-Sleep -s $sleepBetweenFailures\n Write-Output \"Retrying...\"\n }\n\n try {\n & $command\n\n $operationIncomplete = $false\n } catch [System.Exception] {\n if ($attemptCount -lt ($maxFailures)) {\n Write-Output (\"Attempt $attemptCount of $maxFailures failed: \" + $_.Exception.Message)\n }\n else {\n throw \"Failed to execute command\"\n }\n }\n }\n}\n\n## --------------------------------------------------------------------------------------\n## Run\n## --------------------------------------------------------------------------------------\nExecute-WithRetry { \n Write-Host \"Clearing Windows Authentication Providers for $webSiteName\"\n Remove-WebConfigurationProperty -PSPath IIS:\\ -Location \"$webSiteName\" -filter system.webServer/security/authentication/windowsAuthentication/providers -name \".\"\n}\n\n$providersPrintedString = $providers -join \", \"\nWrite-Host \"Providers to add: $providersPrintedString\"\nforeach ($provider in $providers) {\n Write-Host \"Windows Authentication Provider $provider\"\n Execute-WithRetry { \n Add-WebConfiguration -Filter system.webServer/security/authentication/windowsAuthentication/providers -PSPath IIS:\\ -Location \"$webSiteName\" -Value \"$provider\"\n }\n}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"IIS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/iis-website-add-windows-auth-providers.json","Website":"/step-templates/f3cf7831-d47c-4b5f-8f76-6bc649d59dd9","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"b3d76f46-e074-47ff-b800-3020c3f47866","Name":"F5 - Enable or Disable Multiple Pools","Description":"F5 - Enable, Disable, or Force Offline multiple pools with optional wait for connections to drop","Version":2,"ExportedAt":"2017-06-02T14:54:52.840Z","ActionType":"Octopus.Script","Author":"tbrasch","Parameters":[{"Id":"83c45726-806c-4d06-8ae3-22b13b89d5a7","Name":"RunCondition","Label":"Run Condition","HelpText":"Boolean value or expression that determines if this step should run.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"fb610f88-0d64-40cf-a74d-0bb8405755c8","Name":"WaitForConnections","Label":"Wait for connections to drop to 0?","HelpText":"If checked, the deployment won't continue until current connections on the node = 0","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}},{"Id":"af92387f-ba2d-4b44-a8f1-7ebccf01032a","Name":"MaxWaitTime","Label":"Maximum wait time in seconds","HelpText":"Maximum wait time (in seconds) before killing connections and moving on.","DefaultValue":"300","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"d8c955b3-6c75-49cf-9396-25dc0fffb611","Name":"LtmStatus","Label":"LTM Status","HelpText":"State member will be put into (Enabled, Disabled, Offline) \n\n- **Disabled** continues to process persistent and active connections. It can accept new connections only if the connections belong to an existing persistence session. \n\n- **Offline** allows existing connections to time out, but no new connections are allowed.","DefaultValue":"Disabled","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Enabled|Enable\nDisabled|Disable\nOffline|Forced Offline"},"Links":{}},{"Id":"57b114a3-fa6a-40d6-9c42-38ba80127fca","Name":"LtmInfo","Label":"List of LTM info","HelpText":"Enter list of all Pools, IPs, and Ports. Each set delimited by carriage returns, each value delimited by pipe (|). Here is an example:\n\nPool\\_192.168.103.226\\_443|192.168.103.174|443 \nPool\\_192.168.103.226\\_80|192.168.103.174|80","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"3fdbf9bc-9ee8-4610-9c34-24f1975cf8c7","Name":"HostName","Label":"LTM Host name","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"61480ba0-f715-46ef-b5ad-1c6b6f580273","Name":"ConnectionCount","Label":"Kill connections when less than or equal to","HelpText":"The default is to wait until there are no connections left on the node. If you don't want to wait for zero connections before deploying, you can put a value here and when that number of connections is reached the deployment will happen killing the rest of the connected sessions.","DefaultValue":"0","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"d0f276b6-ce27-4006-b3c2-00c669bfc42d","Name":"Username","Label":"LTM username","HelpText":"Credential used to access F5 Soap API","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"921b6a08-0ffe-4945-91c3-8520a3052ce9","Name":"Password","Label":"LTM password","HelpText":"Credential used to access F5 Soap API","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"#region Verify variables\n\n#Verify RunCondition can be converted to boolean.\n$runCondition = $false\nIf ([string]::IsNullOrEmpty($OctopusParameters['RunCondition'])){\n Throw \"Run Condition cannot be null.\"\n}\nElse{\n Try{\n $runCondition = [System.Convert]::ToBoolean($OctopusParameters['RunCondition'])\n Write-Host (\"Run Condition: '\" + $OctopusParameters['RunCondition'] + \"' converts to boolean: \" + $runCondition + \".\")\n\n #If run condition evaluates to false, just return/stop processing.\n If (!$runCondition){\n Write-Host \"Skipping step.\"\n return\n }\n }\n Catch{\n Throw \"Cannot convert Run Condition: '\" + $OctopusParameters['RunCondition'] + \"' to boolean value.\"\n }\n}\n\n#No need to verify WaitForConnections as this is a checkbox and will always have a boolean value. Report value back for logging.\nWrite-Host (\"Wait for connections to drop to 0: \" + $OctopusParameters['WaitForConnections'])\n\n#Verify MaxWaitTime can be converted to integer.\nIf ([string]::IsNullOrEmpty($OctopusParameters['MaxWaitTime'])){\n Throw \"Maximum wait time in seconds cannot be null.\"\n}\n\n[int]$maxWaitTime = 0\n[bool]$result = [int]::TryParse($OctopusParameters['MaxWaitTime'], [ref]$maxWaitTime )\n\nIf ($result){\n Write-Host (\"Maximum wait time in seconds: \" + $maxWaitTime)\n}\nElse{\n Throw \"Cannot convert Maximum wait time in seconds: '\" + $OctopusParameters['MaxWaitTime'] + \"' to integer.\"\n}\n\n#No need to verify LtmStatus as this is a drop down box and will always have a value. Report back for logging.\nWrite-Host (\"LTM Status: \" + $OctopusParameters['LtmStatus'])\n\n<#\nVerify List of LTM info.\nLTM Info should contain a list of all Pools, IPs, and Ports. Each set should be delmited by carriage returns, each valude delimited by pipe (|).\nHere is an example:\nPool_192.168.103.226_443|192.168.103.174|443 \nPool_192.168.103.226_80|192.168.103.174|80\n#>\nIf ([string]::IsNullOrEmpty($OctopusParameters['LtmInfo'])){\n Throw \"List of LTM info cannot be null.\"\n}\n#Write out LTM info. If the project is using variables (and it most likely is), it may be difficult to debug without seeing what it evaluated to.\nWrite-Host (\"List of LTM info: \" + [Environment]::NewLine + $OctopusParameters['LtmInfo'])\n$f5Pools = ($OctopusParameters['LtmInfo']).Split([Environment]::NewLine)\nForeach ($f5Pool in $f5Pools){\n #Validate 3 values are passed in per line.\n $poolInfo = $f5Pool.Split(\"|\")\n If ($poolInfo.Count -ne 3){\n Throw (\"Invalid pool info. Expecting 'PoolName|IpAddress|Port': '\" + $f5Pool + \"'.\")\n }\n \n #Validate that each value is not null.\n Foreach ($f5Parm in $poolInfo){\n If ([string]::IsNullOrEmpty($f5Parm)){\n Throw (\"Invalid pool info. Expecting 'PoolName|IpAddress|Port': '\" + $f5Pool + \"'. None can be empty.\")\n }\n }\n \n #Validate IP Address (second value).\n If ( !($poolInfo[1] -as [ipaddress]) ){\n Throw (\"Invalid IP Address: '\" + $poolInfo[1] + \"'.\")\n }\n\n #Validate Port (third value).\n [int]$port = 0\n [bool]$result = [int]::TryParse($poolInfo[2], [ref]$port )\n \n If ( !($result) ){\n Throw (\"Invalid port (expecting integer): '\" + $poolInfo[2] + \"'.\")\n }\n}\n\n#Verify HostName is not null.\nIf ([string]::IsNullOrEmpty($OctopusParameters['HostName'])){\n Throw \"LTM Host name cannot be null.\"\n}\nWrite-Host (\"LTM Host: \" + $OctopusParameters['HostName'])\n\n#Verify Username is not null.\nIf ([string]::IsNullOrEmpty($OctopusParameters['Username'])){\n Throw \"LTM username cannot be null.\"\n}\nWrite-Host (\"Username: \" + $OctopusParameters['Username'])\n\n#Verify Password is not null.\nIf ([string]::IsNullOrEmpty($OctopusParameters['Password'])){\n Throw \"LTM password cannot be null.\"\n}\n\n#Verify ConnectionCount can be converted to integer.\nIf ([string]::IsNullOrEmpty($OctopusParameters['ConnectionCount'])){\n Throw \"Kill connections when less than or equal to cannot be null.\"\n}\n\n[int]$killConnectionWhenLE = 0\n[bool]$result = [int]::TryParse($OctopusParameters['ConnectionCount'], [ref]$killConnectionWhenLE )\n\nIf ($result){\n Write-Host (\"Kill connections when less than or equal to: \" + $killConnectionWhenLE)\n}\nElse{\n Throw \"Cannot convert Kill connections when less than or equal to: '\" + $OctopusParameters['ConnectionCount'] + \"' to integer.\"\n}\n\n#endregion\n\n#region Functions\n\nFunction Set-F5PoolState{\n param(\n $f5Pools,\n [switch]$forceOffline\n )\n \n Foreach ($f5Pool in $f5Pools){\n $poolInfo = $f5Pool.Split(\"|\")\n \n $poolName = $poolInfo[0]\n $ipAddress = $poolInfo[1]\n $port = $poolInfo[2]\n \n $member = ($ipAddress + \":\" + $port)\n \n $state = $OctopusParameters['LtmStatus']\n If ($forceOffline){\n $state = \"Offline\"\n }\n \n Write-Host \"Setting '$ipAddress' to '$state' in '$poolName' pool.\"\n Set-F5.LTMPoolMemberState -Pool $poolName -Member $member -state $state\n }\n}\n\nFunction Wait-ConnectionCount(){\n param(\n $f5Pools,\n [int]$maxWaitTime,\n [int]$connectionCount\n )\n \n #Start stop watch now.\n $elapsed = [System.Diagnostics.Stopwatch]::StartNew()\n \n Foreach ($f5Pool in $f5Pools){\n $poolInfo = $f5Pool.Split(\"|\")\n \n $poolName = $poolInfo[0]\n $ipAddress = $poolInfo[1]\n $port = $poolInfo[2]\n \n $MemberDef = New-Object -TypeName iControl.CommonIPPortDefinition\n $MemberDef.address = $ipAddress\n $MemberDef.port = $port\n $MemberDefAofA = New-Object -TypeName \"iControl.CommonIPPortDefinition[][]\" 1,1\n $MemberDefAofA[0][0] = $MemberDef\n $cur_connections = 100\n \n Write-Host (\"Pool name: \" + $poolName)\n Write-Host (\"IP Address: \" + $ipAddress)\n Write-Host (\"Port: \" + $port)\n\n While ($cur_connections -gt $connectionCount -and $elapsed.ElapsedMilliseconds -lt ($maxWaitTime * 1000)){\n $MemberStatisticsA = (Get-F5.iControl).LocalLBPoolMember.get_statistics( (, $poolName), $MemberDefAofA)\n $MemberStatisticEntry = $MemberStatisticsA[0].statistics[0]\n $Statistics = $MemberStatisticEntry.statistics\n \n Foreach ($Statistic in $Statistics){\n $type = $Statistic.type;\n $value = $Statistic.value;\n If ( $type -eq \"STATISTIC_SERVER_SIDE_CURRENT_CONNECTIONS\" ){\n #Just use the low value. Odds are there aren't over 2^32 current connections. If your site is this big, you'll have to convert this to a 64 bit number.\n $cur_connections = $value.low; \n Write-Host \"Current Connections: $cur_connections\"\n }\n }\n \n If ($cur_connections -gt $connectionCount -and $elapsed.ElapsedMilliseconds -lt ($maxWaitTime * 1000)){\n Start-Sleep -Seconds 5\n }\n }\n }\n}\n\n#endregion\n\n#region Process\n\n#Load the F5 powershell iControl snapin\nAdd-PSSnapin iControlSnapin\nInitialize-F5.iControl -HostName $OctopusParameters['HostName'] -Username $OctopusParameters['Username'] -Password $OctopusParameters['Password']\n\nSet-F5PoolState -f5Pools $f5Pools\n\nIf (($OctopusParameters['LtmStatus'] -ne \"Enabled\") -and ($OctopusParameters['WaitForConnections'] -eq \"True\"))\n{\n Write-Host \"Waiting for connections to drain before deploying. This could take a while...\"\n Wait-ConnectionCount -f5Pools $f5Pools -maxWaitTime $maxWaitTime -connectionCount $killConnectionWhenLE\n \n #We have now waited the desired amount, go ahead and force offline and move on with deployment.\n Set-F5PoolState -f5Pools $f5Pools -forceOffline\n}\n\n\n#endregion\n\n","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"F5","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/f5-enable-disable-multiple-pools.json","Website":"/step-templates/b3d76f46-e074-47ff-b800-3020c3f47866","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"6775501d-cafb-493e-ba67-ec95c9500562","Name":"F5 - Enable, Disable, or Force Offline Member with optional wait for connections to drop","Description":"F5 - Enable, Disable, or Force Offline Member with optional wait for connections to drop","Version":35,"ExportedAt":"2016-09-21T17:50:00.631+00:00","ActionType":"Octopus.Script","Author":"spuder","Parameters":[{"Id":"c27ab1f7-5303-48fe-a8e5-80aa638a054f","Name":"WaitForConnections","Label":"Wait on Connections?","HelpText":"If checked, the deployment won't continue until current connections on the node = 0","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"becfb740-d954-4250-9818-4c561f210ec5","Name":"MaxWaitTime","Label":"Max. Wait Time (seconds)","HelpText":"Defaults to 5 minutes","DefaultValue":"300","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9a0e97c0-d972-4707-b477-c1903090f508","Name":"EnableOrDisable","Label":"LTM Status","HelpText":"State member will be put into (Enabled, Disabled, Offline) \n\n- **Disabled** continues to process persistent and active connections. It can accept new connections only if the connections belong to an existing persistence session. \n\n- **Offline** allows existing connections to time out, but no new connections are allowed.","DefaultValue":"Disabled","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Enabled|Enable\nDisabled|Disable\nOffline|Forced Offline"}},{"Id":"7e1b8bc0-b950-4394-9e92-3a00ce3fce3a","Name":"PoolName","Label":"LTM Pool name","HelpText":"Name of F5 pool","DefaultValue":"pl_DummyDeployWeb","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"adf16144-16be-437a-ac81-199ca1de1e0e","Name":"MemberIP","Label":"LTM Member IP","HelpText":"IP Address of F5 pool member. Default will auto discover the ip address of Tentacle.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"a37006fa-b34e-4f17-b16a-e7e82981b002","Name":"MemberPort","Label":"LTM Member port","HelpText":"","DefaultValue":"80","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"df633633-bf98-45d3-86cf-335b97902dca","Name":"HostName","Label":"LTM Host name","HelpText":null,"DefaultValue":"192.168.45.204","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"3d43e5a4-4527-4b7c-bf88-319818f0d498","Name":"Username","Label":"LTM username","HelpText":"Credential used to access F5 Soap API","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"a3349f60-5cdf-4ab4-9213-a74843149643","Name":"Password","Label":"LTM password","HelpText":"Credential used to access F5 Soap API","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"0ea7a048-0aa3-4387-a4cc-11e6cd8df6cb","Name":"ConnectionCount","Label":"Kill connections when <=","HelpText":"The default is to wait until there are no connections left on the node. If you don't want to wait for zero connections before deploying, you can put a value here and when that number of connections is reached the deployment will happen killing the rest of the connected sessions.","DefaultValue":"0","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"#Load the F5 powershell iControl snapin\n#http://help.octopusdeploy.com/discussions/problems/20121-the-windows-powershell-snap-in-webadministration-is-not-installed-on-this-computer\nAdd-PSSnapin iControlSnapin;\n\nfunction WaitFor-ConnectionCount() \n{ \n param(\n $pool_name, \n $member,\n [int]$MaxWaitTime = 300, #defaults to 5 minutes\n $ConnectionCount = 0\n )\n $vals = $member.Split( (, ':'));\n $member_addr = $vals[0];\n $member_port = $vals[1];\n\n Write-Host \"Waiting for current connections to drop to \"$OctopusParameters['ConnectionCount']\n\n $MemberDef = New-Object -TypeName iControl.CommonIPPortDefinition;\n $MemberDef.address = $member_addr;\n $MemberDef.port = $member_port;\n $MemberDefAofA = New-Object -TypeName \"iControl.CommonIPPortDefinition[][]\" 1,1\n $MemberDefAofA[0][0] = $MemberDef;\n $cur_connections = 100;\n $elapsed = [System.Diagnostics.Stopwatch]::StartNew();\n\n while ( $cur_connections -gt $ConnectionCount -and $elapsed.ElapsedMilliseconds -lt ($MaxWaitTime * 1000))\n {\n $MemberStatisticsA = (Get-F5.iControl).LocalLBPoolMember.get_statistics( (, $pool_name), $MemberDefAofA);\n $MemberStatisticEntry = $MemberStatisticsA[0].statistics[0];\n $Statistics = $MemberStatisticEntry.statistics;\n foreach ($Statistic in $Statistics)\n {\n $type = $Statistic.type;\n $value = $Statistic.value;\n if ( $type -eq \"STATISTIC_SERVER_SIDE_CURRENT_CONNECTIONS\" )\n {\n # just use the low value. Odds are there aren't over 2^32 current connections.\n # If your site is this big, you'll have to convert this to a 64 bit number.\n $cur_connections = $value.low; \n Write-Host \"Current Connections: $cur_connections\"\n }\n }\n Start-Sleep -s 5\n }\n}\n\n$Pool = $OctopusParameters['PoolName'].trim();\n\nIf ([string]::IsNullOrWhiteSpace($OctopusParameters['MemberIP'])) {\n Write-Host \"No IP Adress was provided on the 'LTM Member IP`, using [System.Net.Dns]::GetHostAddresses to resolve it\"\n $ip = $([System.Net.Dns]::GetHostAddresses(\"$($OctopusParameters['Octopus.Machine.Hostname'])\") | Where {$_.AddressFamily -ne 'InterNetworkV6'}).IpAddressToString\n if ($ip -is [array]) {\n Write-Host \"Found multiple ipv4 addresses, using first address $($ip[0])\"\n $ip = $ip[0]\n }\n} Else {\n $ip = $OctopusParameters['MemberIP']\n}\n\n$Member = $ip+\":\"+$OctopusParameters['MemberPort']\nWrite-Host \"Member is $Member\"\n\n# Gets the hostname of the current machine being deployed.\n$curhost = hostname\n\nWrite-host \"Currently deploying to $curhost\"\n\nIf (($OctopusParameters['EnableOrDisable'] -ne \"Enabled\") -and ($OctopusParameters['WaitForConnections'] -eq \"True\"))\n{\n Initialize-F5.iControl -HostName $OctopusParameters['HostName'] -Username $OctopusParameters['Username'] -Password $OctopusParameters['Password']\n Write-Host \"Setting $curhost to $($OctopusParameters['EnableOrDisable']) in $Pool pool\";\n Set-F5.LTMPoolMemberState -Pool $Pool -Member $Member -state $OctopusParameters['EnableOrDisable'];\n Write-Host \"Waiting for connections to drain before deploying. This could take a while....\"\n WaitFor-ConnectionCount -pool_name $Pool -member $Member -MaxWaitTime $OctopusParameters['MaxWaitTime'] -ConnectionCount $OctopusParameters['ConnectionCount']\n if ($OctopusParameters['EnableOrDisable'] -eq \"Disabled\") \n {\n Write-Host \"Setting $curhost to Offline in $Pool pool\";\n # We've now waited the desired amount, go ahead and force offline and move on with deployment\n Set-F5.LTMPoolMemberState -Pool $Pool -Member $Member -state Offline;\n }\n}\nElse\n{\n Initialize-F5.iControl -HostName $OctopusParameters['HostName'] -Username $OctopusParameters['Username'] -Password $OctopusParameters['Password']\n Write-host \"Setting $curhost to $($OctopusParameters['EnableOrDisable']) in $Pool pool.\"\n Set-F5.LTMPoolMemberState -Pool $Pool -Member $Member -state $OctopusParameters['EnableOrDisable'];\n}\n","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"F5","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/f5-enable-disable-member.json","Website":"/step-templates/6775501d-cafb-493e-ba67-ec95c9500562","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"45d3003a-9443-42a0-aa71-38398eb4f9d6","Name":"F5 API Enable, Disable and Force Offline pool member","Description":"Enable, Disable and to Force Offline F5 pool member via API.\nThis step not require iControl snap-in installed.","Version":2,"ExportedAt":"2016-12-16T14:01:28.267Z","ActionType":"Octopus.Script","Author":"fedelemattia","Parameters":[{"Id":"c011969a-80e9-47d1-8bd3-d3da6a41ec34","Name":"node","Label":"Node Member Pool","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"313cf4d5-1006-4e54-9f4a-e4f719ca7988","Name":"pool","Label":"Pool Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"9619ce36-f913-4fa9-91be-9ac650e0d168","Name":"f5user","Label":"F5 Username","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"6374f90c-ca46-4c13-94df-bb374c9b33f9","Name":"f5pass","Label":"F5 password","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}},{"Id":"e6402134-71af-4b31-b6a4-f2112edb7e25","Name":"f5ipv4","Label":"F5 Server","HelpText":"comma separated (without spaces).","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1f402f2b-5907-44ec-87f0-d74bb1901dbd","Name":"numconn","Label":"Connections limit","HelpText":null,"DefaultValue":"10","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"6b419071-5710-4c47-a1e5-da8434ba190a","Name":"timeout","Label":"Timeout limit","HelpText":null,"DefaultValue":"60","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"e85c607e-3511-4ae9-8f90-272964fd080f","Name":"action","Label":"Action member node","HelpText":"Change the status of member pool:\n- Enabled;\n- Disabled;\n- Forced Offline.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Enable|Member Enabled in GUI\nDisable|Member Disabled in GUI\nOffline|Member Forced Offline in GUI"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"#octopus variables\n$node = \"#{node}\"\n$pool = \"#{pool}\"\n$f5pass = \"#{f5pass}\"\n$f5user = \"#{f5user}\"\n$f5ipv4 = \"#{f5ipv4}\"\n$numconn = \"#{numconn}\"\n$timeout = \"#{timeout}\"\n$action= \"#{action}\"\n$f5_ip=$f5ipv4.split(',')\n\n#whitout ssl certificate\nif (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)\n{\n$certCallback=@\"\n using System;\n using System.Net;\n using System.Net.Security;\n using System.Security.Cryptography.X509Certificates;\n public class ServerCertificateValidationCallback\n {\n public static void Ignore()\n {\n if(ServicePointManager.ServerCertificateValidationCallback ==null)\n {\n ServicePointManager.ServerCertificateValidationCallback += \n delegate\n (\n Object obj, \n X509Certificate certificate, \n X509Chain chain, \n SslPolicyErrors errors\n )\n {\n return true;\n };\n }\n }\n }\n\"@\n Add-Type $certCallback\n }\n[ServerCertificateValidationCallback]::Ignore();\n\n#F5 Credentials\n$username= $f5user\n$password= $f5pass | ConvertTo-SecureString -AsPlainText -Force\n$cred= New-Object System.Management.Automation.PSCredential $username, $password\nWrite-Output \"Cred: $cred\"\n\n#retrieve Active F5 server\nfunction Get-StatusF5{\n param(\n $ipserver,\n $credential\n )\n $result=Invoke-WebRequest -Uri \"https://$ipserver/mgmt/tm/cm/failover-status\" -Credential $credential -ErrorAction Ignore -UseBasicParsing\n $items=$result.Content | ConvertFrom-Json\n $status=$items.entries.'https://localhost/mgmt/tm/cm/failover-status/0'.nestedStats.entries.status\n return $status\n}\n\nforeach($ipv4 in $f5_ip){\n $state=Get-StatusF5 -ipserver $ipv4 -credential $cred\n if (($state.description) -like \"ACTIVE\"){\n $master=$ipv4\n Write-Output \"F5 master ACTIVE: $master\"\n }\n else{\n Write-Output \"$ipv4 is not master active\"\n }\n}\nif (!$master){\n Write-Error \"ATTENTION - F5 servers are incorrect\"\n}\n\n#retrieve informations\n$result=Invoke-WebRequest -Uri \"https://$master/mgmt/tm/ltm/pool/$pool/members\" -Credential $cred -UseBasicParsing\n$items=$result.Content | ConvertFrom-Json\n$items.items\n$name=($items.items | where{$_.name -like \"*$node*\"}).name\nWrite-Host \"Nome del nodo: $name\"\n\n#action based on $action\nif($action -like \"Enable\"){\n $state ='{\"state\": \"user-up\", \"session\": \"user-enabled\"}' ###ENABLED\n Write-Output \"Action: Enable $name\"\n Invoke-WebRequest -Uri \"https://$master/mgmt/tm/ltm/pool/$pool/members/~Common~$name\" -Credential $cred -ContentType application/json -Method PUT -Body $state -Verbose -UseBasicParsing\n}\nelse{\n if($action -like \"Disable\"){\n $state ='{\"state\": \"user-up\", \"session\": \"user-disabled\"}' ###Disabled\n Write-Output \"Action: Enable $name\"\n Invoke-WebRequest -Uri \"https://$master/mgmt/tm/ltm/pool/$pool/members/~Common~$name\" -Credential $cred -ContentType application/json -Method PUT -Body $state -Verbose -UseBasicParsing\n }\n else{\n if($action -like \"Offline\"){\n $state ='{\"state\": \"user-down\", \"session\": \"user-disabled\"}' ###FORCEDOFFLINE\n Invoke-WebRequest -Uri \"https://$master/mgmt/tm/ltm/pool/$pool/members/~Common~$name\" -Credential $cred -ContentType application/json -Method PUT -Body $state -Verbose -UseBasicParsing\n $current_conn=$numconn + 00\n\n [int]$time = 0\n Write-Output \"Connections accepted: $numconn\"\n while($current_conn -gt $numconn){\n if($second -ne $timeout){\n $url=\"https://$master/mgmt/tm/ltm/pool/$pool/members/~Common~$name\" + '/stats?$select=serverside.curConns'\n Start-Sleep 1\n [int]$second = $time++\n $result= Invoke-WebRequest -Uri $url -Credential $cred -UseBasicParsing\n $item=$result.Content | ConvertFrom-Json\n $current_conn=($item.entries.'serverside.curConns').value\n Write-Host \"Second: $second - Connections: $current_conn\"\n }\n else{\n Write-Output \"Timeout - $current_conn connections stopped\"\n $current_conn= 0\n }\n }\n }\n else{\n Write-Error \"ACTION IS NOT ACCEPTED\"\n }\n}\n}\nStart-sleep 10\nWrite-Host \"Go to next step\"\n","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"F5","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/F5-API-enable-disable-member.json","Website":"/step-templates/45d3003a-9443-42a0-aa71-38398eb4f9d6","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMkAAADICAIAAADN+FL3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAHYFJREFUeNrsnQd4FNUWx3fKzvaa3RQCBELv0hFpIkgTyBMEEQsoCFhAqoBPFGmCCiioCIJPBBR5iuBDpAgIiIhgA5QOISEJKZvsZvtOeXcInWyyszszu7Pc/7fffgvZMnPnN+eec++55yIMw8igoAQQCpsACrIFBdmCgoJsQUG2oCBbUFCQLSjIFhRkCwoKsgUF2YKCbEFBQbagIFtQkC0oKMgWFGQLCrIFBQXZgoJsQUG2oKAgW1CQLSjIFhQUZAsqRoTf7Q3AMEwgwDjddImDtpdShTa62M54fYzLQ+ZeZigavEGGIAiG4WmpiIJAlAosyYIadKjJiOo0iFaN4DjECLJ1RTQDAPIfPx3445j7h/2Bv8/KSDKS70OUSmXHVop7WxJN6skb1kF1WkjV1Za5K+pBMAyVX+T96VfP1j2eHw5ECFMlDarTqvvcr+7XHaCGGvSQrbhFKnDmgvu73c4Vn9MOZxQ6hRpV9c89qezSFktOhGzFhSjK/9cJ57pNrm+2yXz+mGhlo14/aqg640G8ShLw3iBbEoQqN9/x8RfOTzYI2utF1Nx6rWHSKO2AXohOA9mShsjzWbYpc3y//CmRVke0j2cAyFCTAbIVu/L//nfx5Hn+U2ck2PaIuvf9xjcmYlYzZCvGqDr0R+HkudT5LKlfA/UjfYwvj8YSLZCt6Cvw9+nC5/9Nnr0YT1dC1bOL+c2XUbMRshWlUQWPt2jcTM/3e+LTQ0FR07yXtY/2jY9YUkpseQ8cLnhmiszlie/wCq+fnrh6MZZshWyJZa4mzPJs2SW7S4TIjDPG6Z4eLGkDJgG2fD8dLhg+mfF6ZXeZ8LRU6+dL8KopkC0BRJK28TNdm3bK7lohiGneFO1jGZAtPkXlF+Y/PJq8eEl210vVo1PC+7MRQg7Z4qMfPPhbwZBxDEVCsK72j9WSk7auRvU6KUW9MXhMpZ/+N3/Q8xCsW7yDrLzczoMCp89DuxV2QMgUjp/p+Xqb4KetVmJJVmAG2BdWswzHyYs5bA6q308XO6i8ghid7UYQ87uvaTJ6QLa4elhUwYgp3h8OCHFJ8NppRGM2L5RoVE9eLx21mJDg4T0TIAN/n3au/9a19htZ7PkMhqlj9M89CdkK2WCRVEGfEb5/TvB2Yiqlol1z4p6GxD2NiOaNMGM4KaDevYeKxr5G20pi7bLpxz1tmDgSshVaVzhyqmf7Xh7OR6lQdm2v7t9d1fU+REHw4OjkXC567t/+347F2pUzLZimfbQfZKvirpAuGDPd+/2PEVop1YOd1P26Ke5rhapVfNtU0r5gWelHa2Ux1j2a335FM+ghyFYQ0UzBsAnePQfD/gKseqpu2EDQxKhe2AU2nh37i8bPZELIu1f17Kzq1oF2exiXmy51sQvUnC7aXkoX2689O8AdFfe+V1TZYpiiF2a4vw1z2B2454bxI1W9uyAYJtJAQOalwjGvBI6drPhtid+sULRoXNF50zS7HLLARhUV04XF1OUCMjcfPFO5BVRePngGYQ0H6/XWNM3gfpCtW+RYvNK+8OMwPohazPqxw7RDMxC52EPVjNdXNP6NCmbNsepVUvb9F4lgjpkJBKicy2RWLnkpj8rKDZy7SF7IJjOzmVJXsCg4eccaed10yNa1Lmbbj8B/50xVgkn/4jDNo31Dd6oCZy74j58C3ROC44heh6elymulRTJ/wlC0c+UXJXOWljs8YZj0rH7scAFMPEPl5pPnLgbOZrKonc8C5wXIKzsGNMGYsudL1KCDbMnIrJycjgMRmttPq/p2M82aiIWcmUkV2myT5nh33TFgRsgVrZqqenRS9+kadiZxbudB5J3p1AiScvAbPEWk1YjApSNPnw+cAo9ztMNpmjUppuYco8AW4/NfatWHsTs5mSvz/KkgEuQQfRYU5Q8YDW7xCr8XVfXorHt2COsecenF/EdPXu47XHbHvUE0a5D07SoZVJlDLP5PAneYE1hEi8aW5W9iiQmcepCisa9XAhZ749OerbvBAzChGzFE9VDXUMICMju34KkJsvKMrrJre4jUjTtX5N9zrd3k3bmfQz/Yq4v18yWcwALyHTji++kwBzv05z9FL8643PNJELQyFcZoTIAEsS1daCv3r8r7IVtR6hOpvIKcdhnAWoRmr+TGac9rhw9CUM4xV9FLM91ffx/eQWIpiZrH+muH9L8TaICdbdxM9+YdQSPEvRsQFJY0E99uMUzB8EkhgoWoVdbVi3TPDA4DrDK7Ff4NkJvveGdFzr0ZJbOX0CWOm/8EYsNgYAFpBvSOEbDowqK7y99ybdwWOH4qpLcqCMt/3la2axFmy3q9bJJMhAqQpcvXOdds1Ax6CESUmMXk2vCd8+MvKviEul+3GDEYnj2/KNs1x6KdaC9Sn0iXOnOa9WJCS4oyzZ8KuqTwBzhy83Pb9he5HeWN6iRvXR0jbJXMe9+746fkH9ZGd5mQSDa8aNT0EMHSjXkiwul9xukSvx01j8TQnHHg9IXAmfPOT/4b//6WZ9te7/5fQ4oKe3Y2TB0T4d1Gi88Wjqn/FUO5oOTZTPBcPHMRlV8Y12yBoP2l10I6FIvZ9OZUJGIzzjjdIjeisn0rLGaqHTEBkszKLQuebONnxTNbjlXrGVdIy1ZNr7+E8VFpg3aJzZaq7wMxZLQuZF1P9vfuO0TlXI5PtphAwDF/WUi+cJN6qr78xFmMyAUjQIfYo3MMOVunblkLZH9reXyOQbg3bgvRhdc//xTCU1BDl4rqbynatUCDJOOD6Nh35BiqViIqJaJWgWcUPGtUgqYGBf4+ffM/XV9vNUx/DrMmxBdbFF386sJQ3ohVTVb16MTXz4ocJ6oe7Bj01tqyu3jK3PJaHUf1WvZh0KNG3ZVnPWrQIQbwWoclmNh/WkyYyYjotVxvOf+f/9zaHIxt0mzrp4viii33zv2MJ6TuSfNoPx5zR2lxfXll53bB/uTd/XMQn4ikbSUhLR8i5JjFjJqNWIIRtSaA11gieFhRqxlLsmBVklCl4laQGP+xE3ccxkGqqBggGy9sMTL71LkhvlfT/0E+f1lEXx6vU0Nes1qweM27/1CkP+Bnc1DBIxDk78DU4SmJeLUqWLWUK6gpaZv9zreVLl5lnDUxTtjyHf6TLLKH5MU3roenpfL402KOb2kG9g5qtH48yAjv+TH20gB4nDhb8dtKP/va8PIYRKuOhzjRNn1BqH1KpzY8N7dovjyCaP7VM6hLsGlH7ASPMpp2fvpVPIxBUHkF5MlzIb6ZaFyP52YUq09UtG4WrHIk4w94dh2QxZJKlnwicv0BQdhyreYwk4WnV+fZbonFluqhoEOmvoO/MaXOmGJL5vb4j56QOFsM41i5ngNbfKeCiBQnoqi69/3B/ujZtlcWe3IsWyNttsiLOYzHF6rHotOgfO9sI874FnATg2VaM4GA+7vdMciWZ8secGwSZsu9lUOzYhYz7zlG4sSJ6gG9gkaI+36li4pjkC0ZQ982ai8xttiaVaH/vFHPd+sxYswnKgjVA/cF+6P/9+PseaGxWL7bLWJnzfP4FrvNcyaH6re8b8TFzgQIHw2pOrdDtUG7csPEkeDBUBRb6yG/kLpcyAbOmZfIzGzgMJAXL4mfBXRdznWbjFNGS5It7yFuu8yxfSLfLrbx1bFsP4ui7ANB2NUcGCrDMHZaCTzj2NXX+LV/4hi7nzn4H/bN6JXPsh8HsV7Ja4uCdIg9K3clMYydlkmyyJrcMUZTbCfPZgbOXGDX4J/JDJw4S2XnitQr2kroYgdq0kuPLdcXm7ixlZrEM1oqpW7kEF6+Ktj1RrRq1QMdIvlmzGTAWjVVtGp647fyCnx/HPf98od3988AOEEvuffAYXWfrlJji2E8O38q52KoVewdnJKIJVtBbIVZE1DwnGzFwT8luJGz8t6WvJddAK2h7tkFPGQzxgXOZ3n3HPTuPuD96YgQJX3d3+6UHltUYbHsjhDXuv595b0tZHEkZee2An47gsjTq4OH7ulBoOt0b97h+uLbUNfehWi3duxjXVLhlwDxGSf6j5RTFBSvlhJPYIFLouzWQZyfAl2n7qmByVs/Td71uX7Ss1j1Kvz0LgFSnOrAfLLl2bVfDG9dLLEV5+8Q0bIJXiVJ5COR165hGDs8Zc+X5vdex+vWjPwLfaJM/vDK1vZ9d7QKjtyavCYJeX8+kj/4hZKZi8uJEEXxVMq3mDimyeiRvH1Nwvuz8CBJY6H2MD//JiW2GLIcS1vBIFAMimEY775D+YOeKxj8gu/nI+V2iKpeXaLcJ6Ooum+35B1r9eOeZsdWwrt59v4qJbbowuJyw3WpgOX7/XjBkBcLho7zHfw92HuI5o3E7xDLJ4yQGyaOTNq8Ut6gdhgfZ3MJhR9h5i1OJC/llUOu6PtmMRRFZd84EqasbA54Bi1JU8CNBQ8QzLIvPN6yB1VU7N68s9LqyzK2Uk2vmLofiCb1k7Z84lz1pf3t5YzXx6WV2NNH+C7ELxhbpzPLYSv4WlbG56fdHt6XI1P5RbkdBwrTVLi6bzdZjAnBcd2zjxGtmhYOm3hbRadKGqqoBJcKW4Ez5SSa0vlFJfM/pItK2HLqLhdT6mJr+ZdV9He5FR1aJ657j+cT4lKZnZOUHVrxPrPOlxQtGidu+rjwqYnsouoQ2yknT+jhIf7YKm98L3DyLHgEveeECCFJodhS9e4qi2HJa1ZL/HpZweMvhZhFA+yWZHx5/1nOs2CoWimEvyWMZSDU0Y4QKxVmMSeuf18R2ixI4PhpybDFFHLOhkMUQtgtQfbUVLZrHms7A5R/OQ066+qF8iaVL2+h7HaJsMUwTBgXVYBC+4wwfaKyU1uZRATu2IQlb1QaA1I5+RJhiw5nVy2EIPg/IZoWopkUHdvIpCN5enXTm5XsZ1POph6xyVZ4RVPZvDz+2eJ/SBBLTZbXS5dJSpqMB9XB13yzl8zjlQZbYQ7yYvxn6wtRGlj9rx4IgsikJtMbEypa++knJcJWmAZBALslAFuah3vKJChUqzG/9Upw3yGu2RKk0j/f/hZeN11eu4ZMmlK0bqro0Lr8C4+gUmErrC5DCnargsXTkpD2qQFBrjwmDbbCdEeEsFv8ooXIYqq4dxhSPXAfnla1nDNTKaTBVpjrPIVI8+DV5yaaN5ZHloUXdSE4rh1WzuQ9KnzRcr7YQsPJ7WcEGIviNaCTeod49Sz6d7+zi5A3rC0Rttg0QO4ppjQT41dF1Sse2MIsZkXrZrdfeJ1GMmyhVu6lWgXpE3mzWyBCjJtFSsout89Z4VWShf5R3nJslC2auc5xm0ZghJif4a9LJE+dy67fFfglmMWEWsxsae6y6sjJiXhqElYlGTUbpDKmquzYxn7rJhIYrzVmhWVLns7d5xUiH4bXi824PRR4lJeuLbuyXhxPS5XXrSmvXwuvXUNepyZeo2ps7vsqb1gXUSlvnufBq0uHLbxBLc5XToBpBzEvLSAv8M8Z8JBdK5uL6DREs4ZE0/pEswaKVk2jshtFkGgRw2unBY6eFDNO5I+tGlU5f0aIGnbCDwlWRFupy7f/V9+1Df3w9OqK9i2V7Vsq7m0h/tYBt5uumtVvYUv4dDT+2EqycLdbArCFxVCXRJ67CB6uNRvZKg+N6io7tFJ2aE20boaqlOIfzM1bDCMmAyLHJcMWotGAw2VXaHFgy8+/8ccwWQyKYQLHToJH6bK1wO9Rdm2vebSvslNbMUMBzHqjeIJKlJIW/N3liIxo1Yxbgwfi3G6Vf9Yer2fLrsInxud1HuRYtpa2O8T5XVSvvRE2tm0uKbbA3dCd293AablmyCcU62zd6DEvZNvnLs1p3a9k7lIRCLt5VRUINSTGlqINR7vl5j/1UQQ3gmcz5vWBjjKn/cP2d1fRbiGrAN/kLeA8lVsSjy15nZrRZwuXGFvXA0zHOytyOwx0rtnICJPyfz2zDUtLRUQJJvhkCxwxpzQ6RojbVC5Jtq5e/UJb8fQF+QNGk5nZ/OPruxo56Z54WCQPj9+v0zzWn0NTeqDdKkf+I0fzeg/jfdcWuvjqQmpha2oKxxan4w5xV1iOgyqSZ6usiyx8dqrjo7U8fieVV3jl5kPxWmmSZEteq4ZMEeqqQ9rh5D0VApHHA1tX+GLsc5baF6/kMSxl4632LUQz7XxH7CiiyQg5CdgfuO4E8OlvSXC9VzA5Fn7s5LKHTQUKnD7POlvDBop28PyPBrFZjqE7AXzv68SOdAtQCiCKKp7xju/345E6Wx5v2V44RIvGEmaLaN6IwzkLsP8vEl9syQKkbfwbEY4zsxWsaBrRa8VMzeCfLVSjDr1ONQPZCsVVOnexlMt2p3fKd+QoeDa89LSYhy3IDInp1bGh2i0B5joEKWFCEFhKNLeHcXzwGW0vDfvj3h9/YXduH9hH8mwpO7QJsSYgbeO/ChSi4JktRcc2Kfs2pPy8UdG+ZfRGJZxh7yVLlzh8B39TdGojck1NYWZ2MVQ/dngob6RKBGCL11KX2icHWFcvxFMSERQ1z5+GRCP16prtORjeBz079slISrRtEwVmC1ySoRmhjAVwKi0svt3SjX7cOGvi9ZwwPC3VMHlUtNjyhxstur/diZmMRON6ccIWajJoQtjAki4WwG7xZFp0o4capz13W/qe9ulBROtmUWGLys2nuO/xRGbnevceMr/7mvjDfgJmOxn/PbbS8xFiQyxe+kTtUwMM056/8/hBz2iaMzlaGYhhzGG71v8PMxhEm0MUiS3UbFT17FzJvShAJerIS/SqH+ljnDkhWMIxUb+WbuRjUWGLnSXjFAFQlGvDFtNb06IyVyHs/WeYMLKSxioq5p+tyOyWOuNB84JpFa9FM0wYIdqM763txW361f3VVsbhVHW7Lyp3grBsyeulE/dUNExPFRTxz1YEW4mo+nQ1L5xR6YIOgG/C0jfE376P0yACcM5KFixjSwdGKc9b8F+1fDC7QrtVwlA032yF78sbJo4MscIv0aiu4eUxol4rDOVU0rdk5rsyt0/Vq3O0AlvB2cKqJmuG9AsOF03zPcSFqsK3W5zWwGmHPUK0bCLapZLXq4WGbJI9uw64N36f8O6MKC5OEeOHTa+9VEHKHnW5MHbslmc7h2xPBEPNb00XLYs69FiPKnHYpswl6tZSdu8oi57EYAs4QObZE4M2RC7PGzREMr7lWvsNJ9Mlr11DO6S/OJcq9B32Sma9RxfYLJ8skEVVIhlMzZD+yiCTcbyHiqgl/MoLVF6B66utnD6iHz8CtQq+37uqR6cQB9ZLl69zb9hifHUsVq3KXcGWDEESVsxH5OVkv9BON78/hVeNqCBb6YefcVrFhSUYzZVtcBLpRTLoTLMnh3Twq78qmb1EXrO67pnBoQ5rFNtdX2y2TZ9f/Poi4KXxuNmWeI4eqtOYXn2xPPeZ55X7WLI1ko+T57O8e37mZlS6d1Q/ImD6imney1gIpVxcX24pefUd8CJh2ewQB0udy9cWjpiCN6htnP6i4YVhjNd36b4B/hNnJMYW2zM+OeDOKo+8p8RgiZYIgyPnqg2cL/+sifKGdYRoNN3zT6ofeqDyY163yTZ5joxhNIMfkjcI6UhA4EJ7fIlffaRo1hDVqoEvoe59f5V9G2zjZtL5RRJjC1zyxM0rrw85omaj9pnBmsF9ee5+5TiWGlExT+/eX/x/neB2ZmqV9bNFoSfchjrMMXyQobLcGIZh7ItWFk99E7wiGtcNtYOmKNAV6sexmaiur75z/+8HNj+MohGCSPpmhe31RTw4JyL7d1iCybr2ParQJq9VHa9TU6AiQYp7GrqzciL5Bsf7n1o+msft1KwJieveKxg6LnDyHB8thRomjdI990TFTUS7PbZJczz/+6Fs8CVxw7IQdxvxHzulHX7VJ3Nv2Gr9Ykng6Anf4b8Ube8BgTaq1zAkGeFqsygMrClaN1X36iKvmy5c9anIN7PwbNtLch8cAd1x4sYV6oj3lsKqpljXLdE//2TFTeQ/euJyv2fKwAIOVuLXyxFNqIOrVF4+lnLVMaVdbv/xU861G+X1rxYWJZo2jDy1TjIVhbg51906mN97PaIMd5p2b9wWToNq1QmLX7N+tljeIJzNAYDN0I9/JnnnWmWF206DSNbx4WeX+48gT52/5u9PITg5fARxfe0QiN/xRAty08ph2mZHIpjeiGe22Lgho0fK/q8sq97SPNovPMjYga5wl30rO7dN2ro64cM57M7koSV7odYE3aihyT+uN4wfUfHcDjBX+QPH2Od9ILu2gbKqXzftYxnceo8m9b3X6rIihBy1mg2vT3As/c9Vj3PbHlQTKVuIEJtZxpwYhiqwkecvkpmXyKwcKq8A/JO2ldAOJ7D8rPEPMqBl+eRt1QORJqiAXwE0gE6HvJBNFxWzOVhlwy4EAYwclmwF7gHRsrG8Xq2KE3vAlfId/K304/Xenftvhp5oUjdx06owNtEtHPOKefYkNMHk//t0mc0LnM2Up1d3b/mBdd5CCE5jnS1gmcVPVrlZ9sUrHQs/Lr/faNog6duV0S8CAKj69S/7W8t8v/xxeyxWq3rytjXhLclkfP68nk+Y50+/XpQP+O+l760KnM1KWPpG5Gcd/cocZGZ24ajp8oZ1wK2D10oD9w1es1qMrF/1//WPZ8c+1YOdogaVP+Dessv5nw3lLsTAUpOSt64Ou60QBZG8fW3ph58VjZqu6NKWzikgz503znlZP+FZfgaDYqFP9B05mj9g9I2OCcfxGlXl6dWw6ql41RTwGk9jX/A+ylqp3brqmrRrrhnSDxCGatSitUngfJZ703bXuk2gBy/fP9NpqvyyGdHycUhsd+tna2nw2sKx4m/5Dv+V/8gYWQV5ggiCGvXsdjqJFtRsRC0mPDkRTTCiei1qNKBmA5ZgQvQ6hPtOjpWydY14jGhYV96oDtG8EWtia9dA1Sp+G4EqtvsOHAEutu/g7+TZzIoc/8SElO8+Bc+x7OXGkC8fOHoyL2NkRJtlAP4MOoAgajGjJj2q17Hk6TSIDjxrQXiPqJUACESpRJQEolAgCrlMoXCu+rJ02ZpwRqGqpcjr12b386mVBl7jVZKBY86pABjtcgOG/MdO+X8/Bjwq8tzFkPyYtNTk7WuiuApXknEilXM554EhMpdHJlGhKLtXWYKJNagAaP0VoEFHU+YXUxTjCwCeaLuDBnFrdh5daOPsIDeonbx5pUDuQTyzJbuS8pHb4wk6iJNxl0vVo5Nl2VxZbO79ceeNFnMHZDKk7FyLVU2GJN0m7fBHLMvflApYstgdOyXJknkflK74HCJVFjgnLJyhzuguraOO6XF5/5Gj+Y++wH9NVGlxVaNq4sYVWIJRes5nLB8c0bJJ6pEt8vQady1Y6n7dU3avlyJYMmnMJ1KU7ZUFrnWb7y6sUNQ8b4pGrEVEdytbZQ7YhezCF2YE/vrnbuBK83Bv48yXRNiaFbJ1Q65vttvGz5RRdLxSxWYFrlksT68eB+civRwbusRRPGWu+/sf4w0rBDVMflY/5nEJjTLEG1tXu8jzWYXDJwTOZcfHZdAMfsj4yosi17qFbAUXwwDrVTx5Lu0ole4FIOrXNH8wl9PegJAt8Qjz//m348M1HtBLSuhccEz39CDt8EF4atzOQMRPTjNVWORYtNL5+ebrWeQx2uJatWHyaO1j/SUx3wzZusmK+QPefYdKZi4u29ItlloaUXW+Vz9xBNGknoQ2bIdslefsX7zk+W63femnDMf6s7xLXquGbsxQVZ+uYqatQrZEGbMotvsP/+navMu980eZyyvOj6IJRs3gvqpuHYiGdRC+01MhWzHJmb00cOyke8c+99Y9bIoYj+eOonj9dE1GT1WnNuxakphPCoVsCemZBUi6xEGeyQz8cyZwPtN/5GjgQjYTSjEwFEVMOqJuLTZ3vkl9ee2aeLUUVK+9S7woyFbYlo1mKEpG0eyGtCDevN44CIIQcrZ3wzB2lWkcbVsM2YKSnqAZh4JsQUG2oKAgW1CQLSjIFhQUZAsKsgUF2YKCgmxBQbagIFtQUJAtKMgWFGQLCgqyBQXZgoJsQUFBtqAgW1CQLSgoyBYUZAsKsgUFBdmCgmxBQbagoMLT/wUYANXydK6gFDnzAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"f4566d84-85bb-42df-9f3c-0b146a57e90f","Name":"F5 GTM - Enable or Disable","Description":"Enables or disables pools in the F5 GTM\n","Version":12,"ExportedAt":"2014-07-29T14:51:04.864+00:00","ActionType":"Octopus.Script","Author":"leeenglestone","Parameters":[{"Name":"EnableOrDisable","Label":"GTM status","HelpText":null,"DefaultValue":"STATE_ENABLED","DisplaySettings":{"Octopus.SelectOptions":"STATE_ENABLED|Enable\nSTATE_DISABLED|Disable","Octopus.ControlType":"Select"}},{"Name":"PoolName","Label":"GTM Pool name","HelpText":null,"DefaultValue":"pl_DummyDeployWeb","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MemberIP","Label":"GTM member IP","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MemberPort","Label":"GTM member port","HelpText":null,"DefaultValue":"80","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HostName","Label":"GTM host name","HelpText":null,"DefaultValue":"192.168.45.204","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Username","Label":"GTM username","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Password","Label":"GTM password","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"Add-PSSnapIn iControlSnapIn. F5 iControlSnapIn can be downloaded from here https://devcentral.f5.com/articles/icontrol-cmdlets \n\nInitialize-F5.iControl -HostName $OctopusParameters['HostName'] -Username $OctopusParameters['Username'] -Password $OctopusParameters['Password']\n\n$Pool = $OctopusParameters['PoolName'];\n\n$PoolA = (, $Pool);\n$MemberEnabledState = New-Object -TypeName iControl.GlobalLBPoolMemberMemberEnabledState;\n$MemberEnabledState.member = New-Object iControl.CommonIPPortDefinition;\n$MemberEnabledState.member.address = $OctopusParameters['MemberIP'];\n$MemberEnabledState.member.port = $OctopusParameters['MemberPort'];\n$MemberEnabledState.state = $OctopusParameters['EnableOrDisable'];\n[iControl.GlobalLBPoolMemberMemberEnabledState[]]$MemberEnabledStateA = [iControl.GlobalLBPoolMemberMemberEnabledState[]](, $MemberEnabledState);\n[iControl.GlobalLBPoolMemberMemberEnabledState[][]]$MemberEnabledStateAofA = [iControl.GlobalLBPoolMemberMemberEnabledState[][]](, $MemberEnabledStateA);\n\n(Get-F5.iControl).GlobalLBPoolMember.set_enabled_state($PoolA, $MemberEnabledStateAofA);","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"F5","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/f5-gtm-enable-or-disable.json","Website":"/step-templates/f4566d84-85bb-42df-9f3c-0b146a57e90f","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"0acca3d2-7afa-4c51-963e-6f204b009f85","Name":"File System - Backup Directory","Description":"Uses Robocopy to backup directories and files from a source to a destination.","Version":3,"ExportedAt":"2016-08-25T15:50:24.584+00:00","ActionType":"Octopus.Script","Author":"Dalmirog","Parameters":[{"Name":"BackupSource","Label":"Source","HelpText":"The source directory where files and folders will be copied from","DefaultValue":null,"DisplaySettings":{}},{"Name":"BackupDestination","Label":"Destination folder","HelpText":"The Destination where the files will be copied to.","DefaultValue":null,"DisplaySettings":{}},{"Name":"Options","Label":"Robocopy options","HelpText":"Robocopy accepts a few command line options (e.g. /S /E /Z). List of these can be [found here](http://ss64.com/nt/robocopy.html)","DefaultValue":"/E /V","DisplaySettings":{}},{"Name":"CreateStampedBackupFolder","Label":"Create stamped backup folder","HelpText":"If set to _True_ then it will create a dated backup folder under the destination folder (e.g. c:\\backup\\2014-05-11)","DefaultValue":"True","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"function Get-Stamped-Destination($BackupDestination) {\n\t$stampedFolderName = get-date -format \"yyyy-MM-dd\"\n\t$count = 1\n\t$stampedDestination = Join-Path $BackupDestination $stampedFolderName\n\twhile(Test-Path $stampedDestination) {\n\t\t$count++\n\t\t$stamped = $stampedFolderName + \"(\" + $count + \")\"\n\t\t$stampedDestination = Join-Path $BackupDestination $stamped\n\t}\n\treturn $stampedDestination\n}\n\n$BackupSource = $OctopusParameters['BackupSource']\n$BackupDestination = $OctopusParameters['BackupDestination']\n$CreateStampedBackupFolder = $OctopusParameters['CreateStampedBackupFolder']\nif($CreateStampedBackupFolder -like \"True\" ) {\n\t$BackupDestination = get-stamped-destination $BackupDestination\n}\n\n$options = $OctopusParameters['Options'] -split \"\\s+\"\n\nif(Test-Path -Path $BackupSource) {\n robocopy $BackupSource $BackupDestination $options\n}\n\nif($LastExitCode -gt 8) {\n exit 1\n}\nelse {\n exit 0\n}\n","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-backup-directory.json","Website":"/step-templates/0acca3d2-7afa-4c51-963e-6f204b009f85","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"47fa89d0-fffd-4686-978d-4d54d944df55","Name":"File System - Clean ASP.NET Temp Files","Description":"Most ASP.NET websites today make use of dynamic compilation. \nThe dynamically compiled assemblies are stored in the Temporary ASP.NET files directory.\nHowever, files in this directory are not automatically removed and may build up over time.\nThis script will clean out all files in this directory.\nYou should note that this may cause running websites to be restarted.","Version":9,"ExportedAt":"2014-08-25T05:12:40.750+00:00","ActionType":"Octopus.Script","Author":"Lavinski","Parameters":[{"Name":"FrameworkVersion","Label":"Framework version","HelpText":"This is the framework version to target. \nSpecifying `All` will clean out the temp files for each installed version of the framework.\nIf you need to target a specific version, you can specify either the bit-ness, version or both.\n\nExample values:\n`Framework`\n`Framework64`\n`v4`\n`v2.0.50727`\n`v2.0.50727`\n`Framework\\v4.0.30319`\n`Framework64\\v4.0.30319`\n`Framework64\\v2`\n\nSpecifying a bit-ness value will match all versions.\nSpecifying only a version will match that version regarless of bit-ness.\nA fully specified framework version will match only that value.","DefaultValue":"All","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DaysToKeep","Label":"Days to keep","HelpText":"Number of days since last write time to keep temporary files.\n\nNote that this is the write time of the top level folder.","DefaultValue":"30","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n\t[string]$frameworkVersion,\n\t[int]$daysToKeep,\n\t[switch]$whatIf\n) \n\n$ErrorActionPreference = \"Stop\"\n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n\t$result = $null\n\t\n\tif ($OctopusParameters -ne $null) {\n\t\t$result = $OctopusParameters[$Name]\n\t}\n\n\tif ($result -eq $null) {\n\t\t$variable = Get-Variable $Name -EA SilentlyContinue\t\n\t\tif ($variable -ne $null) {\n\t\t\t$result = $variable.Value\n\t\t}\n\t}\n\t\n\tif ($result -eq $null) {\n\t\tif ($Required) {\n\t\t\tthrow \"Missing parameter value $Name\"\n\t\t} else {\n\t\t\t$result = $Default\n\t\t}\n\t}\n\n\treturn $result\n}\n\nfunction RemoveSafely-Item($folder, $Old, [switch]$whatIf) {\n\t\n\tif ($folder.LastWriteTime -lt $old) {\n\t\t\n\t\ttry {\n\t\t\tWrite-Host \"Removing: $($folder.FullName)\"\n\t\t\t$folder | Remove-Item -Recurse -Force -WhatIf:$whatIf -EA Stop\n\t\t} catch {\n\t\t\t$message = $_.Exception.Message\n\t\t\tWrite-Host \"Info: Could not remove $itemName. $message\"\n\t\t}\n\t}\n}\n\n& {\n\tparam(\n\t\t[string]$frameworkVersion,\n\t\t[int]$daysToKeep\n\t) \n\n\tWrite-Host \"Cleaning Temporary ASP.NET files directory\"\n\t\n\tif ([string]::IsNullOrEmpty($frameworkVersion)) {\n\t\tthrow \"You need to specify the frameworkVersion parameter\"\n\t}\n\t\n\tWrite-Host \"FrameworkVersion: $frameworkVersion\"\n\t\n\t$dotnetPath = [System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory() | Split-Path | Split-Path\n\t$bitnessValues = @(\"Framework\", \"Framework64\")\n\t$versionStart = \"v\"\n\t$versionFilter = \"$versionStart\"\n\t$tempDir = \"Temporary ASP.NET Files\"\n\t\n\t$directoriesToClean = @()\n\t\n\tif ($frameworkVersion -ne \"All\") {\n\t\n\t\t# Starts with v\n\t\tif ($frameworkVersion.StartsWith($versionStart, \"CurrentCultureIgnoreCase\")) {\n\t\t\t$versionFilter = $frameworkVersion\n\t\t\tif ($frameworkVersion -contains \"\\\") {\n\t\t\t\tthrow \"Framework version cannot contain '\\'\"\n\t\t\t}\n\t\t} else {\n\t\t\n\t\t\t# Includes one \\\n\t\t\t$firstSlash = $frameworkVersion.IndexOf(\"\\\")\n\t\t\t\n\t\t\t$NotAVersion = -1\n\t\t\tif ($firstSlash -eq $NotAVersion) {\n\t\t\t\t$bitnessValues = @($frameworkVersion)\n\t\t\t} else {\n\t\t\t\n\t\t\t\t$secondSlash = $frameworkVersion.IndexOf(\"\\\", $firstSlash)\n\t\t\t\t\n\t\t\t\t$NoExtraSlash = -1\n\t\t\t\tif ($secondSlash -ne $NoExtraSlash) {\n\t\t\t\t\t\n\t\t\t\t\t$bitnessValues = @($frameworkVersion | Split-Path)\n\t\t\t\t\t$versionFilter = @($frameworkVersion | Split-Path -Leaf)\n\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Includes more than one '\\'\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (!$versionFilter.StartsWith($versionStart, \"CurrentCultureIgnoreCase\")) {\n\t\tthrow \"Version filter must start with '$versionStart'\"\n\t}\n\t\n\tforeach ($bitness in $bitnessValues) {\n\t\t$fvPath = (Join-Path $dotnetPath $bitness)\n\t\tif (Test-Path $fvPath) {\n\t\t\t$directoriesToClean += (ls $fvPath -Filter \"$versionFilter*\")\n\t\t}\n\t}\n\t\n\tforeach ($dir in $directoriesToClean) {\n\t\t$fullTempPath = Join-Path $dir.FullName $tempDir\n\t\t\n\t\tif (Test-Path $fullTempPath) {\n\t\t\t$virtualDirectories = ls $fullTempPath\n\t\t\tforeach ($virtualPathDir in $virtualDirectories) {\n\t\t\t\t$old = (Get-Date).AddDays(-$daysToKeep)\n\t\t\t\t\n\t\t\t\tforeach ($siteDir in (Get-ChildItem $virtualPathDir.FullName)) {\n\t\t\t\t\tRemoveSafely-Item $siteDir $old -WhatIf:$whatIf\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n } `\n (Get-Param 'frameworkVersion' -Required) `\n (Get-Param 'daysToKeep' -Default 30) \n ","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-clean-asp-net-temp-files.json","Website":"/step-templates/47fa89d0-fffd-4686-978d-4d54d944df55","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"9a2b84db-2940-4d9a-b61f-c82df35cee6c","Name":"File System - Clean Configuration Transforms","Description":"Clean out configuration transform files from the installation directory after a deployment (e.g. Web.Release.config, YourApp.Production.config, etc.).","Version":10,"ExportedAt":"2016-01-21T15:39:24.527+00:00","ActionType":"Octopus.Script","Author":"boro2g","Parameters":[{"Name":"PathToClean","Label":"Path to clean","HelpText":"The path to clean.\n\nUsually you would set this to `#{Octopus.Action[StepName].Output.Package.InstallationDirectoryPath}`.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"EnvironmentName","Label":"Environment Name","HelpText":"If you want to nuke all config files i.e. `*.*.config` then leave with the default value `*`.\n\nOtherwise to just nuke `*.EnvironmentName.config` then set as the environment name: `#{Octopus.Environment.Name}`","DefaultValue":"*","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside Octopus Deploy\nparam(\n [string]$pathToClean,\n [string]$environmentName,\n [switch]$whatIf\n)\n\nfunction GetParam($Name, [switch]$Required) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue\n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($Required -and [string]::IsNullOrEmpty($result)) {\n throw \"Missing parameter value $Name\"\n }\n\n return $result\n}\n\n& {\n param(\n [string]$pathToClean,\n [string]$environmentName\n )\n\n Write-Host \"Cleaning Configuration Transform files from $pathToClean and environment: $environmentName\"\n\n if (Test-Path $pathToClean) {\n Write-Host \"Scanning directory $pathToClean\"\n $regexFilter = \"*.$environmentName.config\" \n Write-Host \"Filter $regexFilter\"\n\n if ($pathToClean -eq \"\\\" -or $pathToClean -eq \"/\") {\n throw \"Cannot clean root directory\"\n }\n\n $filesToDelete = Get-ChildItem $pathToClean -Filter $regexFilter -Recurse | `\n Where-Object {!$_.PsIsContainer -and ($_.Name -NotMatch \"((?i)(^.*\\.exe\\.config$|.*\\.dll\\.config$)$)\")}\n\n if (!$filesToDelete -or $filesToDelete.Count -eq 0) {\n Write-Warning \"There were no files matching the criteria\"\n } else {\n\n Write-Host \"Deleting files\"\n if ($whatIf) {\n Write-Host \"What if: Performing the operation `\"Remove File`\" on targets\"\n }\n\n foreach ($file in $filesToDelete)\n {\n Write-Host \"Deleting file $($file.FullName)\"\n \n if (!$whatIf) {\n Remove-Item $file.FullName -Force\n }\n }\n }\n\n } else {\n Write-Warning \"Could not locate path `\"$pathToClean`\"\"\n }\n\n} `\n(GetParam 'PathToClean' -Required) `\n(GetParam 'EnvironmentName' -Required)\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-clean-configuration-transforms.json","Website":"/step-templates/9a2b84db-2940-4d9a-b61f-c82df35cee6c","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"e56aafe2-0d59-453b-9449-d7384914468d","Name":"File System - Clean Directory","Description":"Clean out unwanted files from the installation directory after a deployment.","Version":26,"ExportedAt":"2014-08-20T06:59:52.579+00:00","ActionType":"Octopus.Script","Author":"Lavinski","Parameters":[{"Name":"PathsToClean","Label":"Paths to clean","HelpText":"A semicolon-separated list of paths to clean.\n\nUsually you would set this to `Octopus.Action[StepName].Output.Package.InstallationDirectoryPath`.","DefaultValue":null,"DisplaySettings":{}},{"Name":"CleanInclude","Label":"Files to remove","HelpText":"A semicolon-separated list of path expressions that match files to be removed.\n\nExamples: \n\n - *.jpg\n - web.*.config\n - **\\*.dll\n - \\Logs\\**\\*.txt\n - web.*.config;*.txt\n\n`\\**\\` denotes a recursive search","DefaultValue":"","DisplaySettings":{}},{"Name":"CleanIgnore","Label":"Files to ignore","HelpText":"A semicolon-separated list of path expressions that will be not be removed.\n\nExamples: \n\n - web.log4net.config\n - img\\needed.jpg\n - **\\*.dll\n - web.config;Release Notes.txt\n\n`\\**\\` denotes a recursive search","DefaultValue":null,"DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n\t[string]$cleanInclude,\n\t[string]$cleanIgnore,\n\t[string]$pathsToClean,\n\t[switch]$whatIf\n) \n\nfunction ExpandPathExpressions($workingDirectory, $fileExpressionList) {\n\treturn @($fileExpressionList.Split(@(\";\"), \"RemoveEmptyEntries\")) | \n\t% { $_.Trim() } |\n\t% { ExpandPathExpression $workingDirectory $_ }\n}\n\nfunction ExpandPathExpression($workingDirectory, $FileExpression) {\n\n\t# \\**\\ denotes a recursive search\n\t$recurse = \"**\"\n\n\t# Scope the clean!\n\t$fileExpression = Join-Path $workingDirectory $fileExpression\n\n\t$headSegments = Split-Path $fileExpression\n\t$lastSegment = Split-Path $fileExpression -Leaf\n\t$secondLastSegment = $(if($headSegments -ne \"\") {Split-Path $headSegments -Leaf} else {$null}) \n\n\t$path = \"\\\"\n\t$recursive = $false\n\t$filter = \"*\"\n\t\n\tif ($lastSegment -eq $recurse) {\t\n\t\n\t\t$path = $headSegments\n\t\t$recursive = $true\n\t\t\n\t} elseif ($secondLastSegment -eq $recurse) {\n\t\t\n\t\t$path = Split-Path $headSegments\n\t\t$recursive = $true\n\t\t$filter = $lastSegment\t\n\t\n\t} else {\n\t\t\n\t\t$path = $headSegments\n\t\t$filter = $lastSegment \n\t}\n\n\treturn Get-ChildItem -Path $path -Filter $filter -Recurse:$recursive | ? { !$_.PSIsContainer }\n}\n\nfunction GetParam($Name, [switch]$Required) {\n\t$result = $null\n\t\n\tif ($OctopusParameters -ne $null) {\n\t\t$result = $OctopusParameters[$Name]\n\t}\n\n\tif ($result -eq $null) {\n\t\t$variable = Get-Variable $Name -EA SilentlyContinue\t\n\t\tif ($variable -ne $null) {\n\t\t\t$result = $variable.Value\n\t\t}\n\t}\n\t\n\tif ($Required -and $result -eq $null) {\n\t\tthrow \"Missing parameter value $Name\"\n\t}\n\t\n\treturn $result\n}\n\n& {\n\tparam(\n\t\t[string]$cleanInclude,\n\t\t[string]$cleanIgnore,\n\t\t[string]$pathsToClean\n\t) \n\n\tWrite-Host \"Cleaning files from installation directory\"\n\tWrite-Host \"Include: $cleanInclude\"\n\tWrite-Host \"Ignore: $cleanIgnore\"\n\tWrite-Host \"Paths To Clean: $pathsToClean\"\n\t\n\tif (!$cleanInclude) {\n\t\tthrow \"You must specify files to include\"\n\t}\n\t\n\tif (!$pathsToClean) {\n\t\tthrow \"You must specify the paths to clean\"\n\t}\n\t\n\t$paths = @($pathsToClean.Split(@(\";\"), \"RemoveEmptyEntries\")) | \n\t% { $_.Trim() }\n\t\n\tforeach ($pathToClean in $paths) {\n\t\t\n\t\tif (Test-Path $pathToClean) {\n\t\t\tWrite-Host \"Scanning directory $pathToClean\"\n\t\t\t\n\t\t\tif ($pathToClean -eq \"\\\" -or $pathToClean -eq \"/\") {\n\t\t\t\tthrow \"Cannot clean root directory\"\n\t\t\t}\n\t\t\t\n\t\t\tcd $pathToClean\n\t\t\t\n\t\t\t$include = ExpandPathExpressions $pathToClean $cleanInclude\n\t\t\t$exclude = ExpandPathExpressions $pathToClean $cleanIgnore\n\t\t\t\n\t\t\tif ($include -eq $null -or $exclude -eq $null) {\n\t\t\t\t$deleteSet = $include\n\t\t\t} else {\n\t\t\t\t$exclude = $exclude | % {$_}\n\t\t\t\t$deleteSet = Compare-Object $include $exclude | ? { $_.SideIndicator -eq \"<=\" } | % { $_.InputObject }\n\t\t\t}\n\t\t\t\n\t\t\tif (!$deleteSet -or $deleteSet.Count -eq 0) {\n\t\t\t\tWrite-Warning \"There were no files matching the criteria\"\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tWrite-Host \"Deleting files\"\n\t\t\t\tif ($whatIf) {\n\t\t\t\t\tWrite-Host \"What if: Performing the operation `\"Remove File`\" on targets\"\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$deleteSet | Write-Host\n\t\t\t\t\n\t\t\t\tif (!$whatIf) {\n\t\t\t\t\t$deleteSet | % { $_.FullName } | Remove-Item -Force -Recurse -WhatIf:$whatIf\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t} else {\n\t\t\t\n\t\t\tWrite-Warning \"Could not locate path `\"$pathToClean`\"\"\n\t\t}\n\t}\n } `\n (GetParam 'CleanInclude' -Required) `\n (GetParam 'CleanIgnore') `\n (GetParam 'PathsToClean')\n ","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-clean-directory.json","Website":"/step-templates/e56aafe2-0d59-453b-9449-d7384914468d","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"072c2939-2c77-4ed1-abd2-e41cb8a57661","Name":"File System - Copy File","Description":"Copies a file in the file system.","Version":6,"ExportedAt":"2018-03-16T12:58:03.401Z","ActionType":"Octopus.Script","Author":"Jens-H-Eriksen","Parameters":[{"Id":"80271c96-5190-4cc6-93c0-6e28c4aba6f1","Name":"sourcePath","Label":"File source path","HelpText":"The full path of the file you wish to copy.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"702e4cfd-6633-4206-94df-8fa4fa47e564","Name":"destinationPath","Label":"File destionation path","HelpText":"The full path for the destination of the file. You can rename the file by giving it a new name in the path. If the file already exists at the destination it is overwritten.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"function Test-FileLocked([string]$filePath)\n{\n $fileExists = Test-Path -Path $filePath\n if (!$fileExists)\n {\n return (1 -eq 0) #false\n }\n Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue\n return ($errs.Count -ne 0)\n}\n\nfunction Wait-ForFileUnlock([string]$filePath)\n{ \n Write-Host \"Destinationfile at $filePath is locked\"\n \n for ($attemptNo = 1; $attemptNo -lt 6; $attemptNo++) {\n Write-Host \"Waiting for the file to become unlocked $attemptNo/5\"\n\n Start-Sleep -Seconds 10\n\n $fileIsLocked = Test-FileLocked($filePath)\n\n if (!$fileIsLocked)\n {\n return\n }\n\n if ($attemptNo -eq 5) {\n Write-Error \"destinationfile at location $filePath is locked and cannot be overwritten.\"\n\n return\n }\n }\n}\n\n#\n#script starts here\n#\n\n$filePath = $OctopusParameters['sourcePath']\n$newFilePath = $OctopusParameters['destinationPath']\n\n$fileExists = Test-Path -Path $filePath\n\nif (!$fileExists)\n{\n Write-Error \"Sourcefile not found at $filePath\"\n\n return\n}\n\n$fileIsLocked = Test-FileLocked($newFilePath)\n\n\nif ($fileIsLocked)\n{\n Wait-ForFileUnlock($newFilePath)\n}\n\n\n$fileIsLocked = Test-FileLocked($newFilePath)\nif ($fileIsLocked)\n{\n return\n}\n\nCopy-Item -Path $filePath -Destination $newFilePath -Force\n\nWrite-Host \"Successfully copied file at location: $filePath to $newFilePath\""},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-copy-file.json","Website":"/step-templates/072c2939-2c77-4ed1-abd2-e41cb8a57661","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"175a91a9-562e-49b9-bfa6-609a4e16bc56","Name":"File System - Create File","Description":"Creates a file, using the full path that is provided.","Version":2,"ExportedAt":"2017-04-28T10:48:34.361Z","ActionType":"Octopus.Script","Author":"carlpett","Parameters":[{"Name":"FilePath","Label":"The full path where the file will be created.","HelpText":"Provide the entire physical path to which the physical file will be created. For example, 'C:\\Temp\\MyFile.txt' will create am empty text file named 'MyFile.txt' in the 'Temp' folder on the C: drive.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"FileContent","Label":"File Content","HelpText":"The text you would like inside the file, if nothing then will create an empty file.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"43aff0e0-e7ad-40cb-ae54-a49ca03adfc5","Name":"Encoding","Type":"String","Label":"","HelpText":null,"DefaultValue":"UTF8","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"UTF8|UTF-8\nASCII|ASCII (7-bit)\nBigEndianUnicode|UTF-16 (big-endian)\nByte|Encodes as byte sequence\nUnicode|UTF-16 (little-endian)\nUTF7|UTF-7\nUnknown|Binary"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$filePath = $OctopusParameters['FilePath']\n$fileContent = $OctopusParameters['FileContent']\n$encoding = $OctopusParameters['Encoding']\n\nNew-Item -ItemType file -Path $filePath -Value '' -force\n\nif(![string]::IsNullOrEmpty($fileContent))\n{\n Set-Content -path $filePath -value $fileContent -encoding $encoding\n}","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-create-file.json","Website":"/step-templates/175a91a9-562e-49b9-bfa6-609a4e16bc56","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"b7211497-59ea-41e9-b466-c9a46b4c76b3","Name":"File System - Create Folder","Description":"Creates a folder structure that is passed in.","Version":2,"ExportedAt":"2017-04-05T12:30:02.127Z","ActionType":"Octopus.Script","Author":"mhenry1384","Parameters":[{"Name":"FolderPath","Label":"The folder path to create on the filesystem.","HelpText":"The entire path to the folder, this step will also created nested folders. For example \"D:\\one\\two\" will create two folders ('one', and then 'two' under folder 'one'). This script will not remove items from the folders.","DefaultValue":null},{"Id":"becbcbd1-7026-40f0-a655-eb5861d53557","Name":"ReadPermissionsTo","Label":"Read Users","HelpText":"A comma separated list of users to grant read permissions to","DefaultValue":null,"DisplaySettings":{}},{"Id":"029ea466-4907-460a-a3f4-c00b23ad1a96","Name":"WritePermissionsTo","Label":"Write Users","HelpText":"A comma separated list of users to grant write permissions to","DefaultValue":null,"DisplaySettings":{}},{"Id":"860e0480-db8d-4669-9b25-00f1ce33d0ac","Name":"ModifyPermissionsTo","Label":"Modify Users","HelpText":"A comma separated list of users to grant modify permissions to","DefaultValue":null,"DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$item = $OctopusParameters['FolderPath']\n$readPermissionsTo = $OctopusParameters['ReadPermissionsTo']\n$writePermissionsTo = $OctopusParameters['WritePermissionsTo']\n$modifyPermissionsTo = $OctopusParameters['ModifyPermissionsTo']\n\n\nWrite-Host \"Creating folder $item with permissions.\"\n\nif((Test-Path $item))\n{\n Write-Host \"Folder $item already exists\"\n}\nelse\n{\n New-Item -ItemType directory -Path $item -force\n}\n\n# Check item exists\nif(!(Test-Path $item))\n{\n throw \"$item does not exist\"\n}\n\n# Assign read permissions\n\nif($readPermissionsTo)\n{\n $users = $readPermissionsTo.Split(\",\")\n foreach($user in $users)\n {\n Write-Host \"Adding read permissions for $user\"\n $acl = Get-Acl $item\n $acl.SetAccessRuleProtection($False, $False)\n $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(\n $user, \"Read\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n}\n\n# Assign write permissions\n\nif($writePermissionsTo)\n{\n $users = $writePermissionsTo.Split(\",\")\n foreach($user in $users)\n {\n Write-Host \"Adding write permissions for $user\"\n $acl = Get-Acl $item\n $acl.SetAccessRuleProtection($False, $False)\n $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(\n $user, \"Write\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n}\n\n# Assign modify permissions\n\nif($modifyPermissionsTo)\n{\n $users = $modifyPermissionsTo.Split(\",\")\n foreach($user in $users)\n {\n Write-Host \"Adding modify permissions for $user\"\n $acl = Get-Acl $item\n $acl.SetAccessRuleProtection($False, $False)\n $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(\n $user, \"Modify\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n}\n\nWrite-Host \"Complete\"","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-create-folder.json","Website":"/step-templates/b7211497-59ea-41e9-b466-c9a46b4c76b3","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"7eaad6c2-fd5c-40a4-b880-350c983dc51d","Name":"File System - Create Folders","Description":"Ensure/Create multiple folders separated by ;","Version":7,"ExportedAt":"2015-07-02T13:47:00.305+00:00","ActionType":"Octopus.Script","Author":"jbennett","Parameters":[{"Name":"FolderPaths","Label":"Folder Paths","HelpText":"A list of folders to create separated by a ;","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Name":"ContinueOnError","Label":"Continue On Error","HelpText":"When this is selected the script will log failures but continue and succeed in octopus.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n [string]$FolderPaths,\n [string]$ContinueOnError\n) \n\n$ErrorActionPreference = \"Stop\" \n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\n& {\n param(\n [string]$FolderPaths,\n [string]$ContinueOnError\n ) \n\n Write-Host \"File System - Create Folders\"\n Write-Host \"FolderPaths: $FolderPaths\"\n \n $isContinueOnError = $ContinueOnError.ToLower() -match \"(y|yes|true)\"\n\n $FolderPaths.Split(\";\") | ForEach {\n $path = $_.Trim()\n\n if($path.Length -lt 1){\n break;\n }\n\n Write-Host \"Trying to ensure directory structure for $path.\"\n try {\n $newFolder = New-Item -ItemType directory -Path $path -force\n Write-Host \"SUCCESS\" -ForegroundColor Green\n } catch {\n $errorMessage = \"FAILED - $_.Exception.Message\"\n \n if($isContinueOnError){\n Write-Host $errorMessage -ForegroundColor Red\n } else {\n throw $errorMessage\n }\n }\n \n }\n\n } `\n (Get-Param 'FolderPaths' -Required) `\n (Get-Param 'ContinueOnError')","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-create-folders.json","Website":"/step-templates/7eaad6c2-fd5c-40a4-b880-350c983dc51d","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"f0cae939-caef-4979-93ac-6c9b3a3c4986","Name":"File System - Create Symlink","Description":"Creates a Symbolic Link","Version":23,"ExportedAt":"2014-08-26T15:58:34.242+00:00","ActionType":"Octopus.Script","Author":"diegoavanzini","Parameters":[{"Name":"link_path","Label":"LinkPath","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"target_path","Label":"TargetPath","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"function New-Symlink {\n <#\n .SYNOPSIS\n Creates a symbolic link.\n #>\n param (\n [Parameter(Position=0, Mandatory=$true)]\n [string] $Link,\n [Parameter(Position=1, Mandatory=$true)]\n [string] $Target\n )\n\n Write-Host \"New-Symlink $Link to $Target\"\n \n Invoke-MKLINK -Link $Link -Target $Target\n}\n\nfunction Invoke-MKLINK {\n <#\n .SYNOPSIS\n Creates a symbolic link.\n #>\n param (\n [Parameter(Position=0, Mandatory=$true)]\n [string] $Link,\n [Parameter(Position=1, Mandatory=$true)]\n [string] $Target\n )\n \n # Resolve the paths incase a relative path was passed in.\n $Link = (Force-Resolve-Path $Link)\n $Target = (Force-Resolve-Path $Target)\n\n # Ensure target exists.\n if (-not(Test-Path $Target)) {\n throw \"Target does not exist.`nTarget: $Target\"\n }\n\n # Ensure link does not exist.\n if (Test-Path $Link) {\n Write-Host \"A file or directory already exists at the link path.`nLink: $Link\"\n return\n }\n\n $isDirectory = (Get-Item $Target).PSIsContainer\n\n # Capture the MKLINK output so we can return it properly.\n # Includes a redirect of STDERR to STDOUT so we can capture it as well.\n $output = cmd /c mklink /D `\"$Link`\" `\"$Target`\" 2>&1\n \n Write-Host \"output : $output\"\n if ($lastExitCode -ne 0) {\n Write-Host \"MKLINK failed. Exit code: $lastExitCode`n$output\"\n throw \"MKLINK failed. Exit code: $lastExitCode`n$output\"\n }\n else {\n Write-Output $output\n }\n}\n\nfunction Force-Resolve-Path {\n <#\n .SYNOPSIS\n Calls Resolve-Path but works for files that don't exist.\n .REMARKS\n From http://devhawk.net/2010/01/21/fixing-powershells-busted-resolve-path-cmdlet/\n #>\n param (\n [string] $FileName\n )\n \n $FileName = Resolve-Path $FileName -ErrorAction SilentlyContinue `\n -ErrorVariable _frperror\n if (-not($FileName)) {\n $FileName = $_frperror[0].TargetObject\n }\n \n return $FileName\n}\n\nNew-Symlink $link_path $target_path\n\n\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-create-symlink.json","Website":"/step-templates/f0cae939-caef-4979-93ac-6c9b3a3c4986","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"87cbaa94-4477-4474-a9c3-7943b5668d30","Name":"File System - Find and Replace","Description":"Find and replace text in one or more files.","Version":6,"ExportedAt":"2014-05-14T05:38:42.041+00:00","ActionType":"Octopus.Script","Author":"nblumhardt","Parameters":[{"Name":"FRCandidatePathGlobs","Label":"Files","HelpText":"The files to search. Wildcards `*` and `**` are supported. Paths must be fully-qualified, e.g. `C:\\MyApp\\**\\*.xml`. Separate multiple paths with `;` semicolons.","DefaultValue":null},{"Name":"FRFindText","Label":"Find","HelpText":"The text to find in the target files.","DefaultValue":null},{"Name":"FRReplaceText","Label":"Replace with","HelpText":"The replacement text to insert in place of each occurrence of _Find_.","DefaultValue":null},{"Name":"FRIgnoreCase","Label":"Ignore case","HelpText":"If **True**, variations on the character case of _Find_ will be considered a match, for example `Bar` will match `BAR` and `bar`. If **False** only exact matches will be considered.","DefaultValue":"False"}],"Properties":{"Octopus.Action.Script.ScriptBody":"function Execute-FindReplace($target, $find, $replace, $ignoreCase) {\n $options = [System.Text.RegularExpressions.RegexOptions]::None\n if ($ignoreCase) {\n $options = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase\n }\n \n Write-Output \"Searching $target...\"\n $orig = [System.IO.File]::ReadAllText($target)\n \n $escFind = [System.Text.RegularExpressions.Regex]::Escape($find)\n $regex = new-object System.Text.RegularExpressions.Regex($escFind, $options)\n $removed = $regex.Replace($orig, '')\n \n $occurrences = ($orig.Length - $removed.Length) / $find.Length\n if ($occurrences -gt 0) {\n Write-Output \"Found $occurrences occurrence(s), replacing...\"\n \n $escReplace = $replace.Replace('$', '$$')\n $replaced = $regex.Replace($orig, $escReplace)\n [System.IO.File]::WriteAllText($target, $replaced)\n }\n}\n\nif ([string]::IsNullOrEmpty($FRFindText)) {\n throw \"A non-empty 'Find' text block is required\"\n}\n\nWrite-Output \"Replacing occurrences of '$FRFindText' with '$FRReplaceText'\"\nif ([Boolean] $FRIgnoreCase) {\n Write-Output \"Case will be ignored\"\n}\n\n$FRCandidatePathGlobs.Split(\";\") | foreach {\n $glob = $_.Trim()\n Write-Output \"Searching for files that match $glob...\"\n\n $matches = $null\n $splits = $glob.Split(@('/**/'), [System.StringSplitOptions]::RemoveEmptyEntries)\n\n if ($splits.Length -eq 1) {\n $splits = $glob.Split(@('\\**\\'), [System.StringSplitOptions]::RemoveEmptyEntries)\n }\n \n if ($splits.Length -eq 1) {\n $matches = ls $glob\n } else {\n if ($splits.Length -eq 2) {\n pushd $splits[0]\n $matches = ls $splits[1] -Recurse\n popd\n } else {\n $splits\n throw \"The segment '**' can only appear once, as a directory name, in the glob expression\"\n\n }\n }\n\n $matches | foreach {\n \n $target = $_.FullName\n\n Execute-FindReplace -target $target -find $FRFindText -replace $FRReplaceText -ignoreCase ([Boolean] $FRIgnoreCase)\n }\n}\n\n\nWrite-Output \"Done.\"","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-find-and-replace.json","Website":"/step-templates/87cbaa94-4477-4474-a9c3-7943b5668d30","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"b77d55ae-7f54-45ab-ba57-7afff97c93a2","Name":"File System - Grant Permissions","Description":"Grant read, write and modify permissions to folders or files","Version":5,"ExportedAt":"2017-10-26T07:11:38.851Z","ActionType":"Octopus.Script","Author":"mcfozzy","Parameters":[{"Id":"e67e2b43-b1e4-482d-bb5d-e4b6acb2b90f","Name":"Items","Label":"Items","HelpText":"A comma seperated list of full paths to the files or folders","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"b830e92e-ceaa-472e-b1ac-e70a19d9386b","Name":"ReadPermissionsTo","Label":"Read Users","HelpText":"A comma separated list of users to grant read permissions to","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"141f465e-6998-4715-be65-6d5df2604239","Name":"WritePermissionsTo","Label":"Write Users","HelpText":"A comma separated list of users to grant write permissions to","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"c150331e-ea88-4170-8bca-52a8cfd30220","Name":"ModifyPermissionsTo","Label":"Modify Users","HelpText":"A comma separated list of users to grant modify permissions to","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$itemsParameter = $OctopusParameters['Items']\n$readPermissionsTo = $OctopusParameters['ReadPermissionsTo']\n$writePermissionsTo = $OctopusParameters['WritePermissionsTo']\n$modifyPermissionsTo = $OctopusParameters['ModifyPermissionsTo']\n\nif($readPermissionsTo)\n{\n $readUsers = $readPermissionsTo.Split(\",\")\n}\n\nif($writePermissionsTo)\n{\n $writeUsers = $writePermissionsTo.Split(\",\")\n}\n\nif($modifyPermissionsTo)\n{\n $modifyUsers = $modifyPermissionsTo.Split(\",\")\n}\n\n$items = $itemsParameter.Split(\",\")\nforeach($item in $items) \n{\n # Check path exists\n if(!(Test-Path $item))\n {\n throw \"$item does not exist\"\n }\n\n Write-Host \"Path: $item\"\n # Assign read permissions\n foreach($user in $readUsers)\n {\n Write-Host \" Adding read permissions for $user\"\n $acl = (Get-Item $item).GetAccessControl('Access')\n $acl.SetAccessRuleProtection($False, $False)\n $rule = \n if ($acl -is [System.Security.AccessControl.DirectorySecurity])\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Read\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n }\n else\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Read\", \"Allow\")\n }\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n\n # Assign write permissions\n foreach($user in $writeUsers)\n {\n Write-Host \" Adding write permissions for $user\"\n $acl = (Get-Item $item).GetAccessControl('Access')\n $acl.SetAccessRuleProtection($False, $False)\n $rule = \n if ($acl -is [System.Security.AccessControl.DirectorySecurity])\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Write\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n }\n else\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Write\", \"Allow\")\n }\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n\n # Assign modify permissions\n foreach($user in $modifyUsers)\n {\n Write-Host \" Adding modify permissions for $user\"\n $acl = (Get-Item $item).GetAccessControl('Access')\n $acl.SetAccessRuleProtection($False, $False)\n $rule = \n if ($acl -is [System.Security.AccessControl.DirectorySecurity])\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Modify\", \"ContainerInherit, ObjectInherit\", \"None\", \"Allow\")\n }\n else\n {\n New-Object System.Security.AccessControl.FileSystemAccessRule($user, \"Modify\", \"Allow\")\n }\n $acl.AddAccessRule($rule)\n Set-Acl $item $acl\n }\n}\n\nWrite-Host \"Complete\"\n","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-grant-permissions.json","Website":"/step-templates/b77d55ae-7f54-45ab-ba57-7afff97c93a2","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"0bef8c07-5739-4030-8c04-287ceeb51153","Name":"File System - Regular Expression Find and Replace (Updated)","Description":"Find and replace text matching a regular expression in one or more files. Now with working $ replacement.","Version":6,"ExportedAt":"2015-10-26T21:24:18.756+00:00","ActionType":"Octopus.Script","Author":"phillip-haydon","Parameters":[{"Name":"RFRCandidatePathGlobs","Label":"Files","HelpText":"The files to search. Wildcards `*` and `**` are supported. Paths must be fully-qualified, e.g. `C:\\MyApp\\**\\*.xml`. Separate multiple paths with `;` semicolons.","DefaultValue":null,"DisplaySettings":{}},{"Name":"RFRFindRegex","Label":"Pattern","HelpText":"The regular expression to find in the target files.","DefaultValue":null,"DisplaySettings":{}},{"Name":"RFRSubstitution","Label":"Substitution","HelpText":"The text to insert in place of each occurrence of _Pattern_. Regular expression [substitutions](http://msdn.microsoft.com/en-us/library/ewy2t5e0.aspx) are supported, so any literal `$` in the substitution pattern must be escaped by doubling (`$$`).","DefaultValue":null,"DisplaySettings":{}},{"Name":"RFROptions","Label":"Options","HelpText":"A space-separated list of options from the [RegexOptions](http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx) enumeration.","DefaultValue":"ExplicitCapture","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"function Execute-RegexFindReplace($target, $find, $replace, $options) {\n Write-Output \"Searching $target...\"\n $orig = [System.IO.File]::ReadAllText($target)\n \n $regex = new-object System.Text.RegularExpressions.Regex($find, $options)\n if ([string]::IsNullOrEmpty($replace)) { \n$replace = ''\n }\n \n $occurrences = $regex.Matches($orig).Count\n if ($occurrences -gt 0) {\n Write-Output \"Found $occurrences occurrence(s), replacing...\"\n \n $replaced = $regex.Replace($orig, $replace)\n [System.IO.File]::WriteAllText($target, $replaced)\n }\n}\n\nif ([string]::IsNullOrEmpty($RFRFindRegex)) {\n throw \"A non-empty 'Pattern' is required\"\n}\n\n$options = [System.Text.RegularExpressions.RegexOptions]::None\n$RFROptions.Split(' ') | foreach {\n $opt = $_.Trim()\n $flag = [System.Enum]::Parse([System.Text.RegularExpressions.RegexOptions], $opt)\n $options = $options -bor $flag\n}\n\nWrite-Output \"Replacing occurrences of '$RFRFindRegex' with '$RFRSubstitution' applying options $RFROptions\"\n\n$RFRCandidatePathGlobs.Split(\";\") | foreach {\n $glob = $_.Trim()\n Write-Output \"Searching for files that match $glob...\"\n\n $matches = $null\n $splits = $glob.Split(@('/**/'), [System.StringSplitOptions]::RemoveEmptyEntries)\n\n if ($splits.Length -eq 1) {\n $splits = $glob.Split(@('\\**\\'), [System.StringSplitOptions]::RemoveEmptyEntries)\n }\n \n if ($splits.Length -eq 1) {\n $matches = ls $glob\n } else {\n if ($splits.Length -eq 2) {\n pushd $splits[0]\n $matches = ls $splits[1] -Recurse\n popd\n } else {\n $splits\n throw \"The segment '**' can only appear once, as a directory name, in the glob expression\"\n\n }\n }\n\n $matches | foreach {\n \n $target = $_.FullName\n\n Execute-RegexFindReplace -target $target -find $RFRFindRegex -replace $RFRSubstitution -options $options\n }\n}\n\n\nWrite-Output \"Done.\"","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-regular-expression-find-and-replace.json","Website":"/step-templates/0bef8c07-5739-4030-8c04-287ceeb51153","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"5ca37bfb-ebbc-4b4c-ab1e-06d462e7f910","Name":"File System - Rename File","Description":"Renames a file on the file system.","Version":2,"ExportedAt":"2017-06-01T11:11:00.134Z","ActionType":"Octopus.Script","Author":"daviesaus","Parameters":[{"Id":"37fd875e-f5f7-493c-bb8c-30354bf39678","Name":"FilePath","Type":"String","Label":"File Path","HelpText":"The location of the file you wish to rename.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"facc1261-1b0e-476e-a520-13e682c4f8b7","Name":"NewName","Type":"String","Label":"New Name","HelpText":"The new name for the file you're renaming.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"$filePath = $OctopusParameters['FilePath']\n$newName = $OctopusParameters['NewName']\n\nfunction Test-FileLocked([string]$filePath)\n{\n Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue\n return ($errs.Count -ne 0)\n}\n\n$fileExists = Test-Path -Path $filePath\n\nif (!$fileExists)\n{\n Write-Warning \"File not found at $filePath\"\n\n return\n}\n\n$fileIsLocked = Test-FileLocked($filePath)\n\nfunction Wait-ForFileUnlock\n{\n for ($attemptNo = 1; $attemptNo -lt 6; $attemptNo++) {\n Write-Host \"Waiting for the file to become unlocked $attemptNo/5\"\n\n Start-Sleep -Seconds 10\n\n $fileIsLocked = Test-FileLocked($filePath)\n\n if (!$fileIsLocked)\n {\n return\n }\n\n if ($attemptNo -eq 5) {\n Write-Error \"File at location $filePath is locked and cannot be renamed\"\n\n return\n }\n }\n}\n\nif ($fileIsLocked)\n{\n Wait-ForFileUnlock\n}\n\nRename-Item -Path $filePath -NewName $newName\n\nWrite-Host \"Successfully renamed file at location: $filePath to $newName\"","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-rename-file.json","Website":"/step-templates/5ca37bfb-ebbc-4b4c-ab1e-06d462e7f910","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"04a74a00-967d-496a-a966-1acd17fededf","Name":"File System - Restore Directory","Description":"Restores a folder and it's contents (files and sub-folders).","Version":1,"ExportedAt":"2015-12-06T00:00:00.000+00:00","ActionType":"Octopus.Script","Author":"joaoasrosa","Parameters":[{"Name":"Source","Label":"Source","HelpText":"The source directory where files and folders will be copied from","DefaultValue":null,"DisplaySettings":{}},{"Name":"Destination","Label":"Destination folder","HelpText":"The Destination where the files will be copied to.","DefaultValue":null,"DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$source = $OctopusParameters['Source']\n$destination = $OctopusParameters['Destination']\n\nif(Test-Path $destination)\n{\n ## Clean the destination folder\n Write-Host \"Cleaning $destination\"\n Remove-Item $destination -Recurse\n}\n\n## Copy recursively\nWrite-Host \"Copying from $source to $destination\"\nCopy-Item $source $destination -Recurse","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-restore-directory.json","Website":"/step-templates/04a74a00-967d-496a-a966-1acd17fededf","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"fa148b10-99e2-47be-b19f-a16dee1c8f27","Name":"File System - Zip Directory Contents","Description":"Creates a zip archive that contains the files and directories from the specified directory, uses the specified compression level, and optionally includes the base directory.\n\nRequires .NET 4.5 as it relies on the `System.IO.Compression.ZipFile` class.","Version":12,"ExportedAt":"2018-02-08T22:24:00.817+00:00","ActionType":"Octopus.Script","Author":"curiousdev","Parameters":[{"Name":"SourceDirectoryName","Label":"Source Directory","HelpText":"The path to the directory to be archived, specified as a relative or absolute path.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationArchiveFileName","Label":"Destination Archive File","HelpText":"The path of the archive to be created, specified as a relative or absolute path.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"CompressionLevel","Label":"Compression Level","HelpText":"Indicates whether to emphasize speed or compression effectiveness when creating the entry.","DefaultValue":"Optimal","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Optimal|Optimal\nFastest|Fastest\nNoCompression|No Compression"}},{"Name":"IncludeBaseDirectory","Label":"Include Base Directory","HelpText":"Include the directory name from Source Directory at the root of the archive.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"OverwriteDestination","Label":"Overwrite Destination If Exists","HelpText":"Overwrite the destination archive file if it already exists.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$SourceDirectoryName = $OctopusParameters['SourceDirectoryName']\n$DestinationArchiveFileName = $OctopusParameters['DestinationArchiveFileName']\n$CompressionLevel = $OctopusParameters['CompressionLevel']\n$IncludeBaseDirectory = $OctopusParameters['IncludeBaseDirectory']\n$OverwriteDestination = $OctopusParameters['OverwriteDestination']\n\nif (!$SourceDirectoryName)\n{\n Write-Error \"No Source Directory name was specified. Please specify the name of the directory to that will be zipped.\"\n exit -2\n}\n\nif (!$DestinationArchiveFileName)\n{\n Write-Error \"No Destination Archive File name was specified. Please specify the name of the zip file to be created.\"\n exit -2\n}\n\nif (($OverwriteDestination) -and (Test-Path $DestinationArchiveFileName))\n{\n Write-Host \"$DestinationArchiveFileName already exists. Will delete it before we create a new zip file with the same name.\"\n Remove-Item $DestinationArchiveFileName\n}\n\nWrite-Host \"Creating Zip file $DestinationArchiveFileName with the contents of directory $SourceDirectoryName using compression level $CompressionLevel\"\n\n$assembly = [Reflection.Assembly]::LoadWithPartialName(\"System.IO.Compression.FileSystem\")\n[System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectoryName, $DestinationArchiveFileName, $CompressionLevel, $IncludeBaseDirectory)\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"File System","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/file-system-zip-directory-contents.json","Website":"/step-templates/fa148b10-99e2-47be-b19f-a16dee1c8f27","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKhQTFRF/////78A/6oAVVVV/++//+q/gICA1dXV/79A/9R///ff/8MQ/9dg/8cg//vv/68A/+ef//PP//rv/7Ug/68Q/+Sv/8sw/9tw/9NQ/89w/+uv/+OP/8pg/89A/8VQ/9+f/9+A/9qP/+/P/99//7cA/7IA/7wA/6sA/+/A39/f/64A2tjX//Tfn5+f/7MA/7sA/74A/60A/9Zw/7gA/74Q/7oA/7UA/7EAi6g4fwAAAuRJREFUeNrs21tT2mAUheEvaaCQQCSczyi29WzP7f//Z6UdZBIIM44us9hf13vbC+eRbLo3qnNKKaWUUkoppZRSSimllFJKKaWUwlVrLhsvbrLqnoai2+yFr2x+fwKOwasZm/oXdEczxDQnOyYhqgn3uQpxDZhz3gdCesQ3r3mIjDfwXagj7NEgKywkXLMgSzCE9mz1wBDaOzDYETYEEUSQ/wPSaz6rQa174pDnt1x5Atm8emtPIGG48gUClJAh/XtPILi36+L3Zz6oVdBF4w32/sIbYmWH6qAPX5fzjio/14Q/W7nnqtIPDnYfFfThkGpPovXu68IhNdKSVyXkoQ7qgQypvwNVFwQDuXkP6oYM8WbYBWFDYMPNHnZBTv3tV8MuiCC+Q6K36+ypkn/LsJC4lQSkhhkQch4Qa+MgrYBahIKcB35AYrIjyEAQ9gsCm5E2GTIDQabsJysFQcZkxxj0H2LKfkGmIMjM3KgfgbBHfQSCROwnKwZByNtJsACt8WlChnRAkA7ZkaAOqyEZ0gJB7O2LRyAjsmOIutlNjnoJhD3qL9gXyyFjk6N+CKGPegSC2DsNj0DY++IlCEI/DWMQhL0vjh0GYvE0LIWwT8PEgSDsfXEEgmRmR30PYvI0LIGkRvfFAwj9NExBkIXRfXEfYvQ0PISwT8O2A0HYoz4DQb4ZPQ0PID8sj3oO8tXuvliEPJoe9Rzkk9XTcA9yZnhfLEA+mD0Ni5Ar9gvSAUE+2j0Ni5DPdk/DAuTW9L6Yg7BHfehAkC/WR30LoY96CoL8tL0v7iD0fTECQX4Z3xd3EPa+OANBflvfF58g363vi1sIfV+cgiCPPoz6Xwh71EcgyK0Xo76BsPfFBcbhrjzYF/9l/zTcxj4NWyBH7Mmo038zFvWCsCHt1HnxaCWZg8X8ifQwxjlcSvsJaHLpsGW5v2S8vo4qyymF7+5O3wOllFJKKaWUUkoppZRSSimllPKxPwIMAPj2YtijZbi5AAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"3868c17c-8471-4805-89be-e99513afd59a","Name":"Flyway Migrate","Description":"Deploy a database using Flyway","Version":1,"ExportedAt":"2015-11-13T10:25:35.129+00:00","ActionType":"Octopus.Script","Author":"Alex-Yates","Parameters":[{"Name":"FlyWayPackageStep","Label":"Flyway package step (required)","HelpText":"A previous deployment step which deploys a NuGet package containing your FlyWay project.\n\n\n_Requirements:_\n\n1. The NuGet package must contain your FlyWay project.\n\n2. The flyway.conf file needs to contain the correct information for your target database. This can be achieved using the Octopus Deploy \"Substitute variables in files\" feature in your \"Deploy a NuGet package\" step:\nhttp://docs.octopusdeploy.com/display/OD/Substitute+Variables+in+Files\n\n3. You should be able to execute your deployment simply by running \"flyway migrate\" from the flyway.cmd directory.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"}},{"Name":"RelativePath","Label":"Relative path to flyway.cmd (optional)","HelpText":"If your FlyWay project is not in the root of your NuGet package specify the relative path here.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"locations","Label":"-locations (relative path, optional)","HelpText":"Comma-separated list of locations to scan recursively for migrations. The location type is determined by its prefix.\nUnprefixed locations or locations starting with classpath: point to a package on the classpath and may contain both sql and java-based migrations.\nLocations starting with filesystem: point to a directory on the filesystem and may only contain sql migrations.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"targetUrl","Label":"Target -url (required)","HelpText":"The url of the target database in the format specified in the default flyway.conf file.\n\nE.g.\nSQL Server: jdbc:jtds:sqlserver://host:port/database\nOracle: jdbc:oracle:thin:@//host:port/service\nMySQL: jdbc:mysql://host:port/database","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"targetUser","Label":"Target -user (required)","HelpText":"The username to connect to the target database.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"targetPassword","Label":"Target -password (required)","HelpText":"The password to connect to the target database.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"runDriftCheck","Label":"Run pre-deploy drift check","HelpText":"Check for drift with Redgate comparison tool.\n\n_Requirements_\n\nRequires that a Redgate command line comparison tool is installed on the target machine.\n\nFor SQL Server: SQL Compare\n\nhttp://www.red-gate.com/products/sql-development/sql-compare/\n\nFor Oracle: Schema Compare for Oracle\n\nhttp://www.red-gate.com/products/oracle-development/schema-compare-for-oracle/\n\nFor MySQL: MySQL Compare\n\nhttps://www.red-gate.com/products/mysql/mysql-compare/\n\nAll tools include a free trial licence for a limited period of time.\n\n_Limitations_\n\nSQL Server, Oracle and MySQL only","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"comparePath","Label":"Path to Redgate comparison tool (required for drift-check)","HelpText":"Checking for drift requires a database comparison tool. This template uses the Redgate tooling.\n\nPlease provide the path to a Redgate command line tool. The default paths are\n\nSQL Compare (SQL Server):\n\nC:\\Program Files (x86)\\Red Gate\\SQL Automation Pack 1\\SC\\SQLCompare.exe\n\nSchema Compare for Oracle:\n\nC:\\Program Files\\Red Gate\\Schema Compare for Oracle 3\\SCO.exe\n\nMySQL Compare:\n\nC:\\Program Files (x86)\\Red Gate\\MySQL Compare 1\\MC.exe","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"shadowUrl","Label":"Shadow -url (required for drift-check)","HelpText":"The url of the target database in the format specified in the default flyway.conf file.\n\nE.g.\nSQL Server: jdbc:jtds:sqlserver://host:port/database\nOracle: jdbc:oracle:thin:@//host:port/service\nMySQL: jdbc:mysql://host:port/database","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"shadowUser","Label":"Shadow -user (required for drift-check)","HelpText":"The username to connect to the shadow database.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"shadowPassword","Label":"Shadow -password (required for drift-check)","HelpText":"The password to connect to the shadow database.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$VerboseActionPreference=\"Continue\"\n\n# Declaring the path to the NuGet package\n$packagePath = $OctopusParameters[\"Octopus.Action[$flywayPackageStep].Output.Package.InstallationDirectoryPath\"]\n\n# Delcaring path to FlyWay\n$flywayPath = $packagePath\nif ($relativePath -ne $null){\n $flywayPath = Join-Path -Path $packagePath -ChildPath $relativePath\n}\n\n$flywayCmd = Join-Path -Path $flywayPath -ChildPath 'flyway.cmd'\n\nif ($locations -ne $null){\n $locationsPath = Join-Path -Path $packagePath -ChildPath $locations\n}\nelse{\n $locationsPath = Join-Path -Path $flywayPath -ChildPath \"sql\"\n}\n\n\n# Logging for troubleshooting\nWrite-Host \"*******************************************\"\nWrite-Host \"Logging variables:\"\nWrite-Host \" - - - - - - - - - - - - - - - - - - - - -\"\nWrite-Host \"FlywayPackageStep: $FlyWayPackageStep\"\nWrite-Host \"FlywayPath: $flywayPath\"\nWrite-Host \"LocationsPath: $locationsPath\"\nWrite-Host \"Target DB -url: $targetUrl\"\nWrite-Host \"Target DB -user: $targetUser\"\nWrite-Host \"Run drift-check?: $runDriftCheck\"\nWrite-Host \"Compare tool path: $comparePath\"\nWrite-Host \"Shadow DB -url: $shadowUrl\"\nWrite-Host \"Shadow DB -user: $shadowUser\"\n\nif ($runDriftCheck){\n # Can't do drift check without a shadow DB\n if($shadowUrl -eq $null){\n Write-Output \"Cannot run drift check because Shadow DB not provided.\"\n $runDriftCheck = $FALSE\n }\n # Can't do drift check without a comparison tool\n if($comparePath -eq $null){\n Write-Output \"Cannot run drift check as path to comparison tool not provided.\"\n $runDriftCheck = $FALSE\n }\n}\n\n\n# Drift check preperation\n$dbPlatform = \"Unknown\"\n$targetDbVersion = 0\n$targetDbPath = \"Unknown\"\n\nif($runDriftCheck)\n{\n # Determining name and version of target database\n Write-Host \"*******************************************\"\n Write-Host \"Determining name and version of target database:\"\n Write-Host \" - - - - - - - - - - - - - - - - - - - - -\"\n \n # Saving target DB info\n $arguments = @(\n \"info\", \n \"-locations=filesystem:$locationsPath\",\n \"-url=$targetUrl\",\n \"-user=$targetUser\",\n \"-password=$targetPassword\"\n )\n Write-Host \"Determining version of target database:\"\n Write-Host \"Executing the following: & $flywayCmd $arguments\"\n $targetDbInfo = & $flywayCmd $arguments\n Write-Host \"Target DB info:\"\n Write-Host $targetDbInfo\n\n # Finding intended version number of target database\n $targetDbVersion = ($targetDbInfo | ? {$_.StartsWith(\"|\") } | ? { $_ -notcontains \"No migrations found\" } | % { $parts = $_.Split('|'); New-Object PSObject -Property @{Version = $parts[1].Trim(); State = $parts[4].Trim()}} | ? { $_.State -eq \"Success\" } | Select-Object -Last 1).Version\n Write-Host \"Target database is at version $targetDbVersion\"\n\n # Finding connection string for target DB\n Write-Host \"Target database connection string $targetUrl\"\n \n if ($targetUrl -like '*sqlserver*'){\n $dbPlatform = \"SQLServer\" \n }\n \n if ($targetUrl -like '*mysql*'){\n $dbPlatform = \"MySQL\" \n }\n \n if ($targetUrl -like '*oracle*'){\n $dbPlatform = \"Oracle\" \n } \n \n Write-Output \"Database platform $dbPlatform detected.\"\n}\n\nif ($dbPlatform -eq \"Unknown\" -And $runDriftCheck){\n Write-Host \"Cannot run drift check!\"\n Write-Host \"Drift check only supported for SQL Server, Oracle or MySQL.\"\n Write-Host \"Cannot determine from FlyWay info if your database platform is supported.\"\n $runDriftCheck = $FALSE \n}\n\nif ($runDriftCheck -eq $true)\n{\n # Building a shadow DB for drift check\n Write-Host \"*******************************************\"\n Write-Host \"Building a shadow DB for drift check:\"\n Write-Host \" - - - - - - - - - - - - - - - - - - - - -\"\n # In a future version it would be cool to build the shadow DB ourselves\n # and to clean up afterwards. For now, however, asking the user to provide \n # a shadow DB for us removes the requirement to work out how to build a fresh\n # DB on 3 different DB platforms. It also means we don't need to worry about\n # credentials etc\n # $shadowDbPath = $targetDbPath + \"_SHADOW\"\n \n Write-Host \"Cleaning shadow database\"\n $arguments = @(\n \"clean\", \n \"-url=$shadowUrl\",\n \"-user=$shadowUser\",\n \"-password=$shadowPassword\"\n )\n Write-Host \"Executing the following: &$flywayCmd $arguments\"\n &$flywayCmd $arguments\n \n Write-Host \"Migrating shadow database up to current target version\"\n $arguments = @(\n \"migrate\"\n \"-locations=filesystem:$locationsPath\",\n \"-url=$shadowUrl\",\n \"-user=$shadowUser\",\n \"-password=$shadowPassword\",\n \"-target=$targetDbVersion\"\n )\n Write-Host \"Executing the following: &$flywayCmd $arguments\"\n &$flywayCmd $arguments\n\n # Using comparison tool to check for drift\n Write-Host \"*******************************************\"\n Write-Host \"Using comparison tool to check for drift:\"\n Write-Host \" - - - - - - - - - - - - - - - - - - - - -\"\n \n function getServer ($connectionsString){\n return ($connectionsString -split \"/\")[2]\n }\n\n function getDbName ($connectionsString){\n # Note: For MySQL this may return key values as well. e.g:\n # ?=&=...\n # Should fix this!!!!\n Write-Host \"Warning: Function getDbName() does not handle MySQL connection strings fully!\"\n return ($connectionsString -split \"/\")[3]\n }\n\n # SQL Server\n if ($dbPlatform -eq \"SQLServer\"){\n \n # Details for target DB\n $targetServer = getServer($targetUrl)\n $targetDb = getDbName($targetUrl)\n \n # Details for shadow DB\n $shadowServer = getServer($shadowUrl)\n $shadowDb = getDbName($shadowUrl) \n \n # Drift report name and location\n $date = Get-Date -format yyyyMMddHHmmss\n $reportName = \"FlySQLDriftReport_$targetDb_$date.\"\n $reportPath = Join-Path -Path $flywayPath -ChildPath \"driftReport\"\n \n New-Item $reportPath -type directory\n \n $arguments = @(\n \"/s1=$targetServer\", \n \"/db1=$targetDb\", \n \"/u1=$targetUser\", \n \"/p1=$targetPassword\", \n \"/s2=$shadowServer\", \n \"/db2=$shadowDb\", \n \"/u2=$shadowUser\", \n \"/p2=$shadowPassword\",\n \"/assertidentical\",\n \"/r=$reportPath\\reportName.html\",\n \"/rt=Simple\"\n )\n\n Write-Host \"Executing the following command: & $comparePath $arguments\"\n & $comparePath $arguments \n if ($LASTEXITCODE -ne 0){\n Throw \"Drift check failed. For details see report here: $reportPath\"\n }\n else{\n Write-Host \"Drift check passed.\"\n }\n }\n \n # Oracle\n if ($dbPlatform -eq \"Oracle\"){\n \n # \"Target\" and \"Source\" names are very confusing.\n # Consistently in this PS script I have used target\n # to refer to the database we intend to deploy to.\n # At this point we need to use that database as\n # the source in order to create a roll-back\n # script should the drift-check fail.\n # Hence the terms source and target are used\n # for opposite purposes when using Schema Compare\n # for Oracle command line tool.\n \n # Details for target DB\n $targetTns = getServer($targetUrl)\n $targetSchema = getDbName($targetUrl)\n $source = \"$targetUser/$targetPassword@$targetTns{$targetSchema}\"\n \n # Details for shadow DB\n $shadowServer = getServer($shadowUrl)\n $shadowDb = getDbName($shadowUrl) \n $target = \"$sourceUser/$sourcePassword@$sourceTns{$sourceSchema}\"\n \n # Drift report name and location\n $date = Get-Date -format yyyyMMddHHmmss\n $reportName = \"FlySQLDriftReport_$targetSchema_$date.\"\n $reportPath = Join-Path -Path $flywayPath -ChildPath \"driftReport\"\n \n New-Item $reportPath -type directory\n \n $arguments = @(\n \"/source=$source\", \n \"/target=$target\",\n \"/r=$reportPath\\reportName.html\",\n \"/rt=Simple\"\n )\n\n Write-Host \"Executing the following command: & $comparePath $arguments\"\n & $comparePath $arguments \n if ($LASTEXITCODE -ne 0){\n Throw \"Drift check failed. For details see report here: $reportPath\"\n }\n else{\n Write-Host \"Drift check passed.\"\n }\n \n }\n # MySQL\n if ($dbPlatform -eq \"MySQL\"){\n\n # Details for target DB\n $targetServerPort = getServer($targetUrl)\n $targetServer = ($targetServerPort -Split \":\")[0]\n $targetPort = ($targetServerPort -Split \":\")[1]\n $targetDb = getDbName($targetUrl)\n\n # Details for shadow DB \n $shadowServerPort = getServer($targetUrl)\n $shadowServer = ($targetServerPort -Split \":\")[0]\n $shadowPort = ($targetServerPort -Split \":\")[1]\n $shadowDb = getDbName($shadowUrl) \n\n # Drift report name and location \n $date = Get-Date -format yyyyMMddHHmmss\n $reportName = \"FlySQLDriftReport_$targetDb_$date\"\n $reportPath = Join-Path -Path $flywayPath -ChildPath \"driftReport\"\n \n New-Item $reportPath -type directory\n \n $arguments = @(\n \"-verbose\", \n \"-server1=$shadowServer\", \n \"-port1=$shadowPort\",\n \"-database1=$shadowDb\", \n \"-username1=$shadowUser\", \n \"-password1=$shadowPassword\",\n\n \"-server2=$targetServer\", \n \"-database2=$targetDb\", \n \"-port2=$targetPort\",\n \"-username2=$targetUser\",\n \"-password2=$targetPassword\", \n\n \"-assertIdentical\",\n \"-report=$reportPath\\$reportName.html\",\n \"-reportType=Simple\",\n \"-scriptfile=$reportPath\\undoDrift.sql\"\n )\n\n Write-Host \"Executing the following command: & $comparePath $arguments\"\n & $comparePath $arguments \n if ($LASTEXITCODE -ne 0){\n Throw \"Drift check failed. For details see report here: $reportPath\"\n }\n else {\n Write-Host \"Drift check passed.\"\n }\n }\n}\n\n# Executing deployment\nWrite-Host \"*******************************************\"\nWrite-Host \"Executing deployment:\"\nWrite-Host \" - - - - - - - - - - - - - - - - - - - - -\"\n $arguments = @(\n \"migrate\"\n \"-locations=filesystem:$locationsPath\",\n \"-url=$targetUrl\",\n \"-user=$targetUser\",\n \"-password=`\"$targetPassword`\"\"\n )\nWrite-Host \"Executing the following command: & $flywayCmd $arguments\"\n\n& $flywayCmd $arguments","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Flyway","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/flyway-migrate.json","Website":"/step-templates/3868c17c-8471-4805-89be-e99513afd59a","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9QTFRF////JCUm19fXZGVmoaKjOvCyiwAABOpJREFUeNrsm4nSoyoQhdPL+z/zpRujICDGGOf2X+ermpqZLMqhVyC+XgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuBdl/hMyiERFo8tgIWH7K7oSokUBhVbCRNs/OXJ4yPYfoX/k28m56Tt/0Orr/LxzsYoot0P5OMxrZxJ53BZaTCrfpeOLa120RnW7q57NJM2wnzSJNre/VgCYpBcz/Jg5tDMkvhLm3cl/KtxZuDuoL9PV4xm4r+PCPA5z3TNFUQc6Pr79Qc5+ItwPglrlMx186b277HHkP58413EN/Xm4HyfZDyZy8lGlf6njA9+e9TQ/Dvdp0Tt7f5l+7qcZWPjECM+touZX+qFJzjQhZ3rwXnvVzsHPTNKUQb7oXNxvS5TokShpyzldS5wDHWmxu3ud5BkdoxvxLK/2v0Ye/2VJZfqJjvMRe5iCB/FhZYX2EfaDothrE4WGJqkGwM67/R+bMX2L6zC5vyj27JHS48iJttfTmp4WbF2c4lkHjbOwXW9ng7tN0tVh3jwKx+xcKj58TaswfSsafyGJaN6+OQN3e1qf9bFJNO/kconqSEkKEHWdXCf1ezeGmnZXN6uPvNiGVat4i+lJSeNlU2GGrI2g8kN7+ODfrw6mjAc6EtImu6TNkoBFidThfp9JBuVjtcSgGRfhMdTZj7O05lGS3is7obsSV61D1v57G0q3aOjQHlmJ9BYmHkHpraoxvskk9erc3dfnsxx9705yqIOrkr0mDDsfSSIa57qh49p1u+4S1tpV9u4Y36r3IeX8FBNhOizXfbhymcpYb5dnJU+VZZ36Vq1z6VSIbGOvzhMsR6SblZHH3ynhTUb2JvNW8lIt+5E3zpVc/di3Nu8pr7WEuuwberoa8JbtXQaX/TWp13Juz0L2mcvL25ESWa8gpZN5GkmztTRx21vXbKJrJ5H3B9KwzJXSH3Gnkrai7Zd24oVPx/YgHnbCXt/9hsXoLylJnYSPlfPEpMRlljAXaP23uzLhLEHGtf398d46QO3kKL1O5lC6KbmWhe28W8xdV2OoO5ddjnXSuKusIU3WMlYqXN67vZHxun+pKFVlupSwdNHji7bl7PugOJVvFYawcXsDnPtfs7E1wzTZ2LIg4l1FYfoieeVJEDqxC7Q5nHVMdar1Bj5dRZY6mUN54izedlId8t91kCeNuk6wTGoI+1JwGr5k0yeV3ZQeOZFbvIsnJcSyQLPzM1ib6W6t9dC5dS7SSlOD0JkctPQSWq1OnzokNX+ZGkTpdNi63hxjOf3JU4ekw4Vht6yfdVmxVb91RiTy1GnvXInG+PGPryd0EuoR8P790CgxDLIUQ0uaQ4OE+DHWWgx1TTR7HRLDs7TuD9+NVt6e8zz6CuRZ5d7iuvWbN0yDCBm2WbqYRYP8XHFaDTVGhOh80yHGL2FTzk3Z6rCqBwp1ofE2Y5DcK1Qsy/ttbxDP0uLkYGcXzec4QUKd22qYm2/KdT6WZ9XVw7aVwhURmS4NOZxnTbbgg3lWk3w5WM6K7VmntrP+hpAoTxxNd0rDPDo1Sb9BPOuVTx3jJ98lA2v45Psuihp8KbLlrtFihOQVS4l0Y16i6VikNEuRmM/f8noCuhwfatxHVrMIe6Zb9U88oQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgf8p/AgwAsU8XH6dJUA0AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"94146c4c-28a7-444d-bd09-abdcc860e3b6","Name":"Get Azure Web App Publishing Credentials","Description":"Gets the publishing credentials for an Azure Web App. They are exported as variables from this step under the names PublishingUsername and PublishingPassword.","Version":8,"ExportedAt":"2017-08-23T06:42:23.412Z","ActionType":"Octopus.AzurePowerShell","Author":"jimmcslim","Parameters":[{"Id":"5a1d5a50-a950-42a4-85d6-25c2b9c45e91","Name":"azpubcreds_ResourceGroup","Label":"Resource group","HelpText":"The name of the resource group that contains the web app for which publishing credentials are required.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"0f86965c-1f40-4778-8378-197ff4199330","Name":"azpubcreds_WebApp","Label":"Web app","HelpText":"The name of the web app for which publishing credentials are required.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"572ee191-a035-47ab-aec3-ef805e690868","Name":"azpubcreds_AzureAccount","Label":"Azure account","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"$creds = Invoke-AzureRmResourceAction -ResourceGroupName $ResourceGroup -ResourceType Microsoft.Web/sites/config `\n -ResourceName $WebApp/publishingCredentials -Action list -ApiVersion 2015-08-01 -Force\n\nSet-OctopusVariable -name \"PublishingUsername\" -value $creds.Properties.PublishingUsername\nSet-OctopusVariable -name \"PublishingPassword\" -value $creds.Properties.PublishingPassword","Octopus.Action.Azure.AccountId":"#{AzureAccount}","Octopus.Action.Package.FeedId":null,"Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.PackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/Azure-Get-Publishing-Credentials.json","Website":"/step-templates/94146c4c-28a7-444d-bd09-abdcc860e3b6","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////AHjXf7vrv931QJrh7/f8EIDaIIncMJHfYKvmz+b3n8zw3+76j8Ttr9XycLPpUKLkkKvYFAAABGZJREFUeNrsnNmCqjoQRc1MEiD8/9cer7Yt2KBJZQC8ez07sKlKTQlcLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzoUSnt8YxXlFuGHSbIaxvj+fip4btkLn1blkWLaF5v03yLhLOYlVuGYfMOMZzNGxCOzhjTJqFkXnjq3Dr1yyvPI3hGl3Ih3zzHHNKudRstRhX5O58vIcShY67Gq6EPIESlzUWvazaGAOGbvU7ArDu/g8M4o8opDZWvbvPzlL/MMBE8jT9T9W7PbAJlHPTBFRf9yVTEcs63msXz2UHLSgf650G/d5t+wjbxxB2UCMqGrk8/LFSD7uJMeNt5bcJCyQZyAe5Fo9KYfWS2flQrr4b4tpuzaeWjYs49rt9LHf9uZD7+VbyVi9EBNrjYjuq2sxQOrl+p+HuBVu45qvqfq691ttYFQ5KyKbyJgaIY/NGxrlWZwlwGvmvu1oY3PuAv0niTq6tZ78jk//9uc1r1r4lQki7y7sp2Tu4V1y2iLoqFTqi1lIGcpFiebrZNZ1dOkF0cCIlO8jQ47nCkam9Lilz9GhDF1I6XGLzfnhwDIIZVfI7+8SSgfHsijqXENOGJF5QorG4EcW0OrScqX/dDrXpr70Ut/BII+1OfECPuYz/NWxYmgrCsUskxPvyhgmrw+WGZ6lGTuOlIyCYWTFyWjpM5KIZRUIOwjRNYRQ6tZF9BXtk8hWAHPtLNJ727Fq0JSkC1FDRRF0Jalj0d5qVh2KEpM2TuSsCYTCT6ZkdmFYI9LrYp5QayWbo6NXlZwcRD/61pth5Fq5EX423QQxNjhqWvvklkljOLkYjrmphXPZOJOk6Pg7HKMsrtQKcowzZoK3rx1ZUelGMdQA/HaKkjAt2RgqpZeYqbNbH7Hp2ct4nqfSPOfe0ftiSTZJydOV6rG5bQbyLK+nRuCC0343PzDgiOXyQA5c14BTZi98uR/5KJ1SnatLdoO50WWBQZPTq0VgsklU3h932actuo17ayrHrb/3ykiegd3KbqF2wbV6RrlsJ07yLcpsWFTul9RyK6ZScr+tk7oNrFj0o7HQUlj4EiEvJ6rPLKSmlMZCrksl1OnLaRkxc+/HB1naMhNtT/6yM2bDs6azCRHrM3aVPN7aW8irD/10B8njpAMcsl8okXcdKrl4sPsLmQVy/Sj90ucPRc/d/Bxxj+dXSpCayen32D+hLi16MsIV8gfCXrYp6ySsiJKRUF0XXiLpVbFU+fNv4r7mOwhFsX4ZdwpSi1DYs2jb6ebZ9788cblTzMrYhu7sf/17IFdtuviJ2ioHA6pMHkoH4CLUeMBU7iGkxuM/YgcdderF9ibRdc7O982F1HpYhjfWUe+x5a6pjop9iNLfoePvlsdZdTSMwfxSmTY20Q0eHnUNzga1edeNmmqbg18aMVR1L9vwSXHF9TfIWBxpKLs2hj3eQeBC0USvp2HHF3eIkRdhFOd6ER8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/I/4J8AAo/80BciBec4AAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"5c08170d-e919-4afe-9da3-7616c797d42b","Name":"Git - Pull (HTTPS)","Description":"Gets the latest source for a Git repository.","Version":7,"ExportedAt":"2014-05-16T00:23:33.282+00:00","ActionType":"Octopus.Script","Author":"alfhenrik","Parameters":[{"Name":"GitHttpsUrl","Label":"Clone URL","HelpText":"'https://' URL to the repository that will be cloned from.","DefaultValue":null},{"Name":"Username","Label":"Username","HelpText":"Username to use when authenticating with the HTTPS server.","DefaultValue":null},{"Name":"Password","Label":"Password","HelpText":"Password to use when authenticating with the HTTPS server. You should create a sensitive variable in your project variables, and then bind this value.","DefaultValue":null},{"Name":"GitHttpsBranchName","Label":"Branch name","HelpText":"Name of the Git branch to clone","DefaultValue":"master"}],"Properties":{"Octopus.Action.Script.ScriptBody":"[System.Reflection.Assembly]::LoadWithPartialName(\"System.Web\")\nfunction Format-UriWithCredentials($url, $username, $password) {\n $uri = New-Object \"System.Uri\" $url\n \n $url = $uri.Scheme + \"://\"\n if (-not [string]::IsNullOrEmpty($username)) {\n $url = $url + [System.Web.HttpUtility]::UrlEncode($username)\n \n if (-not [string]::IsNullOrEmpty($password)) {\n $url = $url + \":\" + [System.Web.HttpUtility]::UrlEncode($password) \n }\n \n $url = $url + \"@\" \n } elseif (-not [string]::IsNullOrEmpty($uri.UserInfo)) {\n $url = $uri.UserInfo + \"@\"\n }\n\n $url = $url + $uri.Host + $uri.PathAndQuery\n return $url\n}\n\nfunction Test-LastExit($cmd) {\n if ($LastExitCode -ne 0) {\n Write-Host \"##octopus[stderr-error]\"\n write-error \"$cmd failed with exit code: $LastExitCode\"\n }\n}\n\n$tempDirectoryPath = $OctopusParameters['Octopus.Tentacle.Agent.ApplicationDirectoryPath']\n$tempDirectoryPath = join-path $tempDirectoryPath \"GitPull\" \n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Environment.Name']\n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Project.Name']\n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Action.Name']\n\nWrite-Host \"Repository will be cloned to: $tempDirectoryPath\"\n\n# Step 1: Ensure we have the latest version of the repository\nmkdir $tempDirectoryPath -ErrorAction SilentlyContinue\ncd $tempDirectoryPath\n\nWrite-Host \"##octopus[stderr-progress]\"\n\ngit init\nTest-LastExit \"git init\"\n\n$url = Format-UriWithCredentials -url $OctopusParameters['GitHttpsUrl'] -username $OctopusParameters['Username'] -password $OctopusParameters['Password']\n\n$branch = $OctopusParameters['GitHttpsBranchName']\n\n# We might have already run before, so we need to reset the origin\ngit remote remove origin\ngit remote add origin $url\nTest-LastExit \"git remote add origin\"\n\nWrite-Host \"Fetching remote repository\"\ngit fetch origin\nTest-LastExit \"git fetch origin\"\n\nWrite-Host \"Check out branch $branch\"\ngit reset --hard \"origin/$branch\"\nTest-LastExit \"git reset --hard\"\n\nSet-OctopusVariable -name \"RepositoryDirectory\" -value $tempDirectoryPath\nWrite-Verbose \"Directory path '$tempDirectoryPath' available in 'RepositoryDirectory' output variable\"\nWrite-Host \"Repository successfully cloned to: $tempDirectoryPath\"","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Git","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/git-pull-https.json","Website":"/step-templates/5c08170d-e919-4afe-9da3-7616c797d42b","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////9CQ09TJB/dbZ9k1a/vHy+ZGZ/MjM+HaA92l0+62z91tn/uTm+YSN9T9N/Lq/+p+mxWmzxwAAA/5JREFUeNrs3dlyqzAMBmAWs0Po+z9t007OaUJskCXZljL6r3pDqi94w6bTqrJYLBaLxWKxWCwWi8VisVgYsw736GfMrv7NpNvSPhi/lE6xo6mf4rrPcOiVHB1aJe8OnRKfQ6PE79AnCTm0ScIOXZIzhybJuUOP5MqhRXLt0CGBODRIYA4Fkltdf4YEekdMYhKTmKRw7S+bJHol98rdJ0h+6/4AyaNq9ZL/NSuXPFWsWvJSr2LJoVq1krdalUo8laqUeOs8SG5T3/dLI1oS+L5fSvr3877IlQTbjb+kvREqOWn//pJWJ1Jy2o/9JXU3gZKL8chfUiuvn7S4Br9JkwDmh9HbTYSNwpB5bvZeOYmSgObr1Xvpl6Q5HuRo/NcOglYrsPXT4r94lbPuAq4DA5BOzAoSup4lNK0sEvi63F/KLGRVD3cEht9RxvNJhCPQSWQ8acU46noQK4lz1E7qDnekI7DaKi+JdgiVIBzBFzJLSlCO+7TYC5MgHff8fYQECd7xB+nH8hKC4wlSF5dQHM+Q0hKS4wVSVkJzvEJKSoiOA6SchOo4QkpJyI43SBkJ3fEOOUjcNg/D3rukEgaHBxLYgxzTSTgcPkhgVTykOj9hcXghAUmX5vyEx+GHhCRJ7omrE0JCrevyASfeMddJIQHJ5Wb9UOqGBCH1nueWrHVqiL+538CfB8yQGhLY5B6521ZySGCHpVcH8e9KVPunQGb2YSs1ZEI2rTUWMiWG3HC/1lWlhq3gd92iFilz/NQ+JYaMmC7iEGutzqWF+Fr71Vs3TVsVk4QhS/SrKjgHk+RkPBojGxbWwSM5G1jHTA4WyekMsTz1k25K5+CQXEx142OmbrcmpYNBcj1nL/dcPlZTHXQJfPGR1kGWsEA4HFQJB4THQZQwQLgcNAkdwucgScgQTgdFQoXwOggSIoTbgZfQIPwOpGRcn450ZDgwkmaPedrI5YiXvNUxy3BES4bYJ8BcjkjJRtvjT+mIkjQdaZMprSNGsuGODTI5IiT+TdpNigMuoWxg5nBAJaG3fuU4gJIFv8ufywGT4O9IPgdMgu0jOR0gSYs7yMnrgEg21PF9bgdAgprZ8zsAkj7+hpRwACRtbA8p47iWxD6PlHJES76kOiD95K/Hr4tcB2TsGvcfyzpPtWQH29lvcQeXpLyDRyLBwSGR4aBLpDioEjkOmkSSgyKR5cBLpDmwEnkOnESiA3V+ItLBcH6iVCLXESeR7IiRyHbAJdIdUIl8B0yiwQGR6HAg9ruUSvQ4ziWaHGcSXY6wRJsjJNHn8Es0OnwSnY53iVbHUaLX8fo3IU6x457hQXFzpT4//yB4rSwWi8VisVgsFovFYrFYLBbGfAswAOAaON62iVbvAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"85cc56f9-26cb-4b0e-8320-854e88a09a25","Name":"Git - Push (HTTPS)","Description":"Deploy a package using Git to a HTTPS server. Performs a clone, overwrites the repository with the files from your package, then pushes. Great for deploying to AppHarbor and Windows Azure websites.","Version":1,"ExportedAt":"2014-10-24T14:59:45.295+00:00","ActionType":"Octopus.Script","Author":"wurmr","Parameters":[{"Name":"GitHttpsUrl","Label":"Clone URL","HelpText":"`https://` URL to the repository that will be cloned from and pushed to.","DefaultValue":null,"DisplaySettings":{}},{"Name":"Username","Label":"Username","HelpText":"Username to use when authenticating with the HTTPS server.","DefaultValue":null,"DisplaySettings":{}},{"Name":"Password","Label":"Password","HelpText":"Password to use when authenticating with the HTTPS server. You should create a sensitive variable in your project variables, and then bind this value.","DefaultValue":null,"DisplaySettings":{}},{"Name":"GitHttpsPackageStepName","Label":"Package step name","HelpText":"Name of the previously-deployed package step that contains the files that you want to push.","DefaultValue":null,"DisplaySettings":{}},{"Name":"GitHttpsBranchName","Label":"Branch name","HelpText":"Name of the Git branch to clone/push","DefaultValue":"master","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"[System.Reflection.Assembly]::LoadWithPartialName(\"System.Web\")\n\n# A collection of functions that can be used by script steps to determine where packages installed\n# by previous steps are located on the filesystem.\n \nfunction Find-InstallLocations {\n $result = @()\n $OctopusParameters.Keys | foreach {\n if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {\n $result += $OctopusParameters[$_]\n }\n }\n return $result\n}\n \nfunction Find-InstallLocation($stepName) {\n $result = $OctopusParameters.Keys | where {\n $_.Equals(\"Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath\", [System.StringComparison]::OrdinalIgnoreCase)\n } | select -first 1\n \n if ($result) {\n return $OctopusParameters[$result]\n }\n \n throw \"No install location found for step: $stepName\"\n}\n \nfunction Find-SingleInstallLocation {\n $all = @(Find-InstallLocations)\n if ($all.Length -eq 1) {\n return $all[0]\n }\n if ($all.Length -eq 0) {\n throw \"No package steps found\"\n }\n throw \"Multiple package steps have run; please specify a single step\"\n}\n\nfunction Format-UriWithCredentials($url, $username, $password) {\n $uri = New-Object \"System.Uri\" $url\n \n $url = $uri.Scheme + \"://\"\n if (-not [string]::IsNullOrEmpty($username)) {\n $url = $url + [System.Web.HttpUtility]::UrlEncode($username)\n \n if (-not [string]::IsNullOrEmpty($password)) {\n $url = $url + \":\" + [System.Web.HttpUtility]::UrlEncode($password) \n }\n \n $url = $url + \"@\" \n } elseif (-not [string]::IsNullOrEmpty($uri.UserInfo)) {\n $url = $uri.UserInfo + \"@\"\n }\n\n $url = $url + $uri.Host + $uri.PathAndQuery\n return $url\n}\n\nfunction Test-LastExit($cmd) {\n if ($LastExitCode -ne 0) {\n Write-Host \"##octopus[stderr-error]\"\n write-error \"$cmd failed with exit code: $LastExitCode\"\n }\n}\n\n$tempDirectoryPath = $OctopusParameters['Octopus.Tentacle.Agent.ApplicationDirectoryPath']\n$tempDirectoryPath = join-path $tempDirectoryPath \"GitPush\" \n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Environment.Name']\n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Project.Name']\n$tempDirectoryPath = join-path $tempDirectoryPath $OctopusParameters['Octopus.Action.Name']\n\n$stepName = $OctopusParameters['GitHttpsPackageStepName']\n\n$stepPath = \"\"\nif (-not [string]::IsNullOrEmpty($stepName)) {\n Write-Host \"Finding path to package step: $stepName\"\n $stepPath = Find-InstallLocation $stepName\n} else {\n $stepPath = Find-SingleInstallLocation\n}\nWrite-Host \"Package was installed to: $stepPath\"\n\nWrite-Host \"Repository will be cloned to: $tempDirectoryPath\"\n\n# Step 1: Ensure we have the latest version of the repository\nmkdir $tempDirectoryPath -ErrorAction SilentlyContinue\ncd $tempDirectoryPath\n\nWrite-Host \"##octopus[stderr-progress]\"\n \ngit init\nTest-LastExit \"git init\"\n\n$url = Format-UriWithCredentials -url $OctopusParameters['GitHttpsUrl'] -username $OctopusParameters['Username'] -password $OctopusParameters['Password']\n\n$branch = $OctopusParameters['GitHttpsBranchName']\n\n# We might have already run before, so we need to reset the origin\ngit remote remove origin\ngit remote add origin $url\nTest-LastExit \"git remote add origin\"\n\nWrite-Host \"Fetching remote repository\"\ngit fetch origin\nTest-LastExit \"git fetch origin\"\n\nWrite-Host \"Check out branch $branch\"\ngit reset --hard \"origin/$branch\"\n\n# Step 2: Overwrite the contents\nwrite-host \"Synchronizing package contents with local git repository using Robocopy\"\n& robocopy $stepPath $tempDirectoryPath /MIR /xd \".git\"\nif ($lastexitcode -ge 5) {\n write-error \"Unable to copy files from the package to the local cloned Git repository. See the Robocopy errors above for details.\"\n}\n\n# Step 3: Push the results\n$deploymentName = $OctopusParameters['Octopus.Deployment.Name']\n$releaseName = $OctopusParameters['Octopus.Release.Number']\n$projName = $OctopusParameters['Octopus.Project.Name']\n\ngit add . -A\nTest-LastExit \"git add\"\n\ngit diff-index --quiet HEAD\nif ($lastexitcode -ne 0) {\n git commit -m \"$projName release $releaseName - $deploymentName\"\n Test-LastExit \"git commit\"\n}\n\ngit push origin $branch\nTest-LastExit \"git push\"\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Git","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/git-push-https.json","Website":"/step-templates/85cc56f9-26cb-4b0e-8320-854e88a09a25","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////9CQ09TJB/dbZ9k1a/vHy+ZGZ/MjM+HaA92l0+62z91tn/uTm+YSN9T9N/Lq/+p+mxWmzxwAAA/5JREFUeNrs3dlyqzAMBmAWs0Po+z9t007OaUJskCXZljL6r3pDqi94w6bTqrJYLBaLxWKxWCwWi8VisVgYsw736GfMrv7NpNvSPhi/lE6xo6mf4rrPcOiVHB1aJe8OnRKfQ6PE79AnCTm0ScIOXZIzhybJuUOP5MqhRXLt0CGBODRIYA4Fkltdf4YEekdMYhKTmKRw7S+bJHol98rdJ0h+6/4AyaNq9ZL/NSuXPFWsWvJSr2LJoVq1krdalUo8laqUeOs8SG5T3/dLI1oS+L5fSvr3877IlQTbjb+kvREqOWn//pJWJ1Jy2o/9JXU3gZKL8chfUiuvn7S4Br9JkwDmh9HbTYSNwpB5bvZeOYmSgObr1Xvpl6Q5HuRo/NcOglYrsPXT4r94lbPuAq4DA5BOzAoSup4lNK0sEvi63F/KLGRVD3cEht9RxvNJhCPQSWQ8acU46noQK4lz1E7qDnekI7DaKi+JdgiVIBzBFzJLSlCO+7TYC5MgHff8fYQECd7xB+nH8hKC4wlSF5dQHM+Q0hKS4wVSVkJzvEJKSoiOA6SchOo4QkpJyI43SBkJ3fEOOUjcNg/D3rukEgaHBxLYgxzTSTgcPkhgVTykOj9hcXghAUmX5vyEx+GHhCRJ7omrE0JCrevyASfeMddJIQHJ5Wb9UOqGBCH1nueWrHVqiL+538CfB8yQGhLY5B6521ZySGCHpVcH8e9KVPunQGb2YSs1ZEI2rTUWMiWG3HC/1lWlhq3gd92iFilz/NQ+JYaMmC7iEGutzqWF+Fr71Vs3TVsVk4QhS/SrKjgHk+RkPBojGxbWwSM5G1jHTA4WyekMsTz1k25K5+CQXEx142OmbrcmpYNBcj1nL/dcPlZTHXQJfPGR1kGWsEA4HFQJB4THQZQwQLgcNAkdwucgScgQTgdFQoXwOggSIoTbgZfQIPwOpGRcn450ZDgwkmaPedrI5YiXvNUxy3BES4bYJ8BcjkjJRtvjT+mIkjQdaZMprSNGsuGODTI5IiT+TdpNigMuoWxg5nBAJaG3fuU4gJIFv8ufywGT4O9IPgdMgu0jOR0gSYs7yMnrgEg21PF9bgdAgprZ8zsAkj7+hpRwACRtbA8p47iWxD6PlHJES76kOiD95K/Hr4tcB2TsGvcfyzpPtWQH29lvcQeXpLyDRyLBwSGR4aBLpDioEjkOmkSSgyKR5cBLpDmwEnkOnESiA3V+ItLBcH6iVCLXESeR7IiRyHbAJdIdUIl8B0yiwQGR6HAg9ruUSvQ4ziWaHGcSXY6wRJsjJNHn8Es0OnwSnY53iVbHUaLX8fo3IU6x457hQXFzpT4//yB4rSwWi8VisVgsFovFYrFYLBbGfAswAOAaON62iVbvAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"7a6704f9-c675-4dd2-bb2d-5fba374fd439","Name":"GitHub - Create Release","Description":"Create a release for a Github Repository.","Version":4,"ExportedAt":"2018-02-28T02:37:27.534+00:00","ActionType":"Octopus.Script","Author":"alfhenrik","Parameters":[{"Name":"versionNumber","Label":"Version Number","HelpText":"The version number for this release","DefaultValue":"#{Octopus.Release.Number}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"commitId","Label":"Commitish","HelpText":"Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists.","DefaultValue":"master","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"releaseNotes","Label":"Release Notes","HelpText":"The notes to accompany this GitHub release. Defaults to the release notes of the release.","DefaultValue":"#{Octopus.Release.Notes}","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Name":"gitHubUsername","Label":"Owner","HelpText":"The owner of the repository.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"gitHubRepository","Label":"Repository","HelpText":"The repository to create the release for.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"gitHubApiKey","Label":"Api Token","HelpText":"The GitHub [API key](https://github.com/blog/1509-personal-api-tokens)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"draft","Label":"Draft","HelpText":"Set to true to mark this as a draft release (not visible to users)","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Name":"preRelease","Label":"PreRelease","HelpText":"Set to true to mark this as a pre-release version","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\n$formattedVersionNumber = [string]::Format(\"v{0}\", $versionNumber)\n$isDraft = [bool]::Parse($draft)\n$isPrerelease = [bool]::Parse($preRelease)\n\n$releaseData = @{\n tag_name = $formattedVersionNumber;\n target_commitish = $commitId;\n name = $formattedVersionNumber;\n body = $releaseNotes;\n draft = $isDraft;\n prerelease = $isPrerelease;\n}\n\n$releaseParams = @{\n Uri = \"https://api.github.com/repos/$gitHubUsername/$gitHubRepository/releases\";\n Method = 'POST';\n Headers = @{\n Authorization = 'Basic ' + [Convert]::ToBase64String(\n [Text.Encoding]::ASCII.GetBytes($gitHubApiKey + \":x-oauth-basic\")\n );\n }\n ContentType = 'application/json';\n Body = (ConvertTo-Json $releaseData -Compress)\n}\n\nWrite-Host \"Creating release $formattedVersionNumber for $commitId.\"\n$result = Invoke-RestMethod @releaseParams\n\nWrite-Host \"Release successfully created.\"\n$result","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"GitHub","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/github-tag-release.json","Website":"/step-templates/7a6704f9-c675-4dd2-bb2d-5fba374fd439","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"0e295d12-cc29-4f61-9eb1-dac387697d5c","Name":"Grant SeServiceLogonRight To Account","Description":"Grants `SeServiceLogonRight` to Windows account","Version":4,"ExportedAt":"2017-11-30T20:48:26.823Z","ActionType":"Octopus.Script","Author":"nshenoy","Parameters":[{"Id":"456ad1ed-286d-4bbf-a096-026d3928e3ef","Name":"GrantLogonAsServiceAccountName","Label":"Account Name","HelpText":"Domain account name to grant `SeServiceLogonRight`. Example: `US\\testAccount`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"# Code based on Stack Overflow solution https://stackoverflow.com/a/21235462/201382 from @grenade (https://stackoverflow.com/users/68115/grenade)\n\n$grantLogonAsServiceAccountName = $OctopusParameters['GrantLogonAsServiceAccountName']\n\n$tempPath = [System.IO.Path]::GetTempPath()\n$import = Join-Path -Path $tempPath -ChildPath \"import.inf\"\nif (Test-Path $import) { \n Remove-Item -Path $import -Force \n}\n\n$export = Join-Path -Path $tempPath -ChildPath \"export.inf\"\nif (Test-Path $export) { \n Remove-Item -Path $export -Force \n}\n\n$secedt = Join-Path -Path $tempPath -ChildPath \"secedt.sdb\"\nif (Test-Path $secedt) { \n Remove-Item -Path $secedt -Force \n}\n\ntry {\n Write-Output (\"Granting SeServiceLogonRight to user account: $grantLogonAsServiceAccountName.\") \n $sid = ((New-Object System.Security.Principal.NTAccount($grantLogonAsServiceAccountName)).Translate([System.Security.Principal.SecurityIdentifier])).Value\n secedit /export /cfg $export\n $sids = (select-string $export -pattern \"SeServiceLogonRight\").line.Split(\"=\").Trim()[1]\n foreach ($line in @(\"[Unicode]\", \"Unicode=yes\", \"[System Access]\", \"[Event Audit]\", \"[Registry Values]\", \"[Version]\", \"signature=`\"`$CHICAGO$`\"\", \"Revision=1\", \"[Profile Description]\", \"Description=GrantLogOnAsAService security template\", \"[Privilege Rights]\", \"SeServiceLogonRight = $sids,*$sid\")) {\n Add-Content $import $line\n }\n \n Write-Verbose \"Calling secedit...\"\n secedit /import /db $secedt /cfg $import\n secedit /configure /db $secedt\n Write-Verbose \"Calling gpupdate...\"\n gpupdate /force\n Write-Verbose \"Cleaning up temp files...\"\n Remove-Item -Path $import -Force\n Remove-Item -Path $export -Force\n Remove-Item -Path $secedt -Force\n Write-Output(\"SeServiceLogonRight successfully granted to $grantLogonAsServiceAccountName\")\n}\ncatch {\n Write-Error \"Failed to grant SeServiceLogonRight to user account: $grantLogonAsServiceAccountName.\"\n $error[0]\n}\n"},"Category":"Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/windows-grant-logon-as-service.json","Website":"/step-templates/0e295d12-cc29-4f61-9eb1-dac387697d5c","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF////Da3qSsLvhtb0wur6O7zuWcfxldv2aMzyK7ftpOD3s+X48Pr+0fD7d9HzHLLr4fX8xD/OcwAAAaNJREFUeNrs3cFygjAUQFECWott1f//2sJoW6kIKEzNs+euXOmcmSSGDa8oJEmSJEmSJGmsj1W1K9cpsGD1Vr2WdToVEPC+2lYvZfpVrEW0qZpF1F+MRdRugzoNlvkiarfBPk0pT8GhWUSX2yASpDlLr2+DEJBmEY1ug6whx7N0n2b30G1QlmmxHsRYp6X76yvF9vg5RYQczq8UVURI35UiFmTgShED0p6lI1eKzCHTrxS5Qk6PZ9PLDtJ9PIsJmXWlyAky6/dAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQMJCyjltF/iO3gpJUpD8s4OAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8T8itwwKyhbTdMr4ha8hXUwZqhICcOgyNOIkE+V5wo4MSgr1u/fp7poO+AL8K/gL8yw0UeyRB34m9iQ/pVD8L5JYTO3NI58R+AsiEEzsW5OfE3sUe/zRwYkeGnG2g2CPS7rhjF4GKP0ZwyoldxK37kFqEL/7wU0mSJEmSJOmJ+xRgAHxZTCXGdZkfAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"1f76dc61-c7ec-47a8-bd27-fb135851e9c5","Name":"HG - Get Changelog","Description":"Generate exact changelog from Mercurial commit history. It is stored in the output variable \"Changelog\".\n\nRequirement: each release must have been labeled in the repository as \"release-OctopusReleaseNumber\" (for instance using VCS labeling feature of TeamCity).\n\nSee http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html for template format.","Version":17,"ExportedAt":"2016-09-19T18:10:27.463+00:00","ActionType":"Octopus.Script","Author":"avonwyss","Parameters":[{"Id":"9a308d93-915c-4216-a0a6-cbe8de108064","Name":"HgRepository","Label":"Repository Path","HelpText":"The Mercurial repository to use for generating the changelog.\n\nThe repo path needs to be local to where the step is executed because Mercurial does not support remote log listing.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"57f225d5-4579-442f-ac3c-725743952f09","Name":"Template","Label":"","HelpText":"Default template generates HTML <li> elements for inclusion in a <ul> (not part of the step output).","DefaultValue":"{date|shortdate} ({date|age} in {branch|escape}): {desc|strip|escape|addbreaks}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"If ($OctopusParameters[\"Octopus.Release.CurrentForEnvironment.Number\"]) {\n $prm = @('log',\n \t'-r',\"ancestors('release-$($OctopusParameters[\"Octopus.Release.Number\"])') - ancestors('release-$($OctopusParameters[\"Octopus.Release.CurrentForEnvironment.Number\"])')\",\n \t'-T',$Template,\n \t'--repository',$HgRepository)\n Write-Host Getting changelog on $prm[6] '[' $prm[2] ']'\n $changelog = & hg $prm\n}\nElse {\n $changelog = \"(no changelog available)\"\n}\nWrite-Verbose $changelog\nSet-OctopusVariable -name \"Changelog\" -value $changelog","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Mercurial","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/hg-get-changelog.json","Website":"/step-templates/1f76dc61-c7ec-47a8-bd27-fb135851e9c5","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"6a6ce997-c91b-4e06-b237-4484417efc89","Name":"HipChat - Notify","Description":"Notifies a HipChat room of a deployment outcome.","Version":0,"ExportedAt":"2014-07-29T01:56:04.693+00:00","ActionType":"Octopus.Script","Author":"stephengodbold","Parameters":[{"Name":"AuthToken","Label":"API Auth Token","HelpText":"HipChat authentication token for a user who can post notifications to rooms","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"RoomId","Label":"Room","HelpText":"The room name that you wish to post a notification to","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"NotificationText","Label":"Notification Text","HelpText":"An optional text override for the notification. Default is: <(succeeded) or (failed)> (Project) v(Release) deployed to (Environment) on (Machine)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"NotificationColor","Label":"Notification Color","HelpText":"The color for the notification for the room. Default messages will receive green success, and red failure.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"#--------- Notify-Hipchat\n$apitoken = $OctopusParameters['AuthToken']\n$roomid = $OctopusParameters['RoomId']\n$messageText = \"(successful)\"\n$color = 'green'\n\nif ($OctopusParameters['Octopus.Deployment.Error']) {\n $messageText = \"(failed)\"\n $color = 'red'\n}\n\n$messageValue = \"$messageText $($OctopusParameters['Octopus.Project.Name']) [v$($OctopusParameters['Octopus.Release.Number'])] deployed to $($OctopusParameters['Octopus.Environment.Name']) on $($OctopusParameters['Octopus.Machine.Name'])\"\n\nif ($OctopusParameters['NotificationText']) {\n $messageValue = $OctopusParameters['NotificationText']\n $color = $OctopusParameters['NotificationColor']\n}\n\n$message = New-Object PSObject \n$message | Add-Member -MemberType NoteProperty -Name color -Value $color\n$message | Add-Member -MemberType NoteProperty -Name message -Value $messageValue\n$message | Add-Member -MemberType NoteProperty -Name notify -Value $false\n$message | Add-Member -MemberType NoteProperty -Name message_format -Value text\n\n#Do the HTTP POST to HipChat\n$uri = \"https://api.hipchat.com/v2/room/$roomid/notification?auth_token=$apitoken\"\n$postBody = ConvertTo-Json -InputObject $message\n$postStr = [System.Text.Encoding]::UTF8.GetBytes($postBody)\n\n$webRequest = [System.Net.WebRequest]::Create($uri)\n$webRequest.ContentType = \"application/json\"\n$webrequest.ContentLength = $postStr.Length\n$webRequest.Method = \"POST\"\n\n$requestStream = $webRequest.GetRequestStream()\n$requestStream.Write($postStr, 0,$postStr.length)\n$requestStream.Close()\n\n[System.Net.WebResponse] $resp = $webRequest.GetResponse()\n$rs = $resp.GetResponseStream()\n\n[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs\n$sr.ReadToEnd()","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"HipChat","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/hipchat-notify.json","Website":"/step-templates/6a6ce997-c91b-4e06-b237-4484417efc89","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////HVCAvMvZaourDJE3ngAABCpJREFUeNrsXe12KyEI3DDv/85N2rT52igrg2DK3D/tPafqCCIqsNtWKBQKhUKhUCgUCoVCoVAoFAoFZ4gILjj94fvX838vxOF++Hs488kvhw6HOzZ5ZaMncSPzCSwychllkYyLicWVy+rCSCMWFo1gKkwagVTYNKKoONCIWPZycsNUoZw8MU+/dFr14+v+elTfPwJIpF/9RY6mQyiioBO/OpQuepeMhKrVIde84/IjbJWPrNEWF8Qsj2FTgwD1Ep8uZfaSFze7/1bSMpOHpG9c1ZWs0n67H6plwQwmMsMp2l8q4s9j0nbLZBJrUVx5uO27cFRhTPUf/HqTyb6pzNurnH1spx4jTj0efSLidkD4y0QiTqF7MpFsDQZNIMJunYTbc+DtmTBFgsgLTWLnEnsxC5o6IE6xqPMosTx4A0D4Qx9pBNECeRXJqgIhjSHENXEYhKR4CoddvZFBIM8igbmFsEdw83xKDoHYJxRZgkWsA0miWWbVSKNZ1ilFFoE8zyn+K5E8mmUcS6YANxiISB7Nsg0GiTTLpB6fSSQ8BhRFJJXRMil6JqP1bLaKSBEpIkWkiBSRGCIr7+zlNKYmUgerBEQ+5sz+MbcoqrskgMnwkiYj/HstxSx4BDDztaOvl/CINwR9vfZv48GMAUVjvo0PHN0/B8+oSUtxrA8c3Yci8QgKk4GB0HSLGILkoFmKBoSx1zwG9m98zdK8C9tDCqT/nmR/Z5eT1gKPdqOJxxLCo6wiDATj8fivySIYHMTRCdP0o+WylxgKhcwHDb1mNnA4z/VdRujmJRBlsBRaydOvHHAoD5QVMqYKoUMvGfyKgcRvTgDdpo0yJVQbENVEGnZdXUsyh4fFEdJuFLaSO8bOR0Ty1v6N1xZ5a+CosfEHcgZA1Sp6tsKRvAvhadVOY9aT6KGEFJCksdet+fR2LMfqSOm2I2uTcTWAY0lCotKwdpUL8eCx5xh2xNyrryH0HkeXiaLdfbcKmoIjfhmcGG75Umbn+k9dalIcM4NnZh379uWZm909qTFfNSSyQob/TLHVa0LNh8AqHHO0lzlfU6qJNHxC1qKXidWDXGvGYZI8mh4hg8o8C9/2bR28bNdXcbhVJZRpvoPiGGjiMjsPlVMVsEtkRowCpU7jK9+AqBHVGfBaOPPRpb+/OZWmSLY5oJSWRavRWeEvlOqyT+olMeEvFCoSrlsbqQLzg1CCREJaKogXCYuKJBAJh8pNv0IMF3PZ/1GJjkAEi0qocpFs2A+VFAHHsJI5ezUpKmZsilrXtJegGWQ6bC7eJJZgcnd//Yh7bxhjbkxGYBmhsCxd/q9Fqaks8BUvJZUVvkemej1d5MNqiu9ObKugs5Eu9Km79qP2SkRaHg62BbFDZkkeN3/tlxBkKxQKhUKhUCgUCoVCoVAoFAqFwhF8CTAA/z8hbAhfKXMAAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"c37ccd22-2b31-4263-8389-9e63868519b4","Name":"HipChat - Notify (API v1)","Description":"Send a success notification when this step is executed.","Version":4,"ExportedAt":"2014-06-11T02:21:16.787+00:00","ActionType":"Octopus.Script","Author":"Logrythmik","Parameters":[{"Name":"HipChatRoomId","Label":"Room Id","HelpText":null,"DefaultValue":null},{"Name":"HipChatAuthToken","Label":"Auth token","HelpText":"For API version 1.","DefaultValue":null},{"Name":"HipChatFrom","Label":"From name","HelpText":null,"DefaultValue":"Octopus Deploy"},{"Name":"HipChatColor","Label":"Color","HelpText":"HipChat message color","DefaultValue":"green"},{"Name":"HipChatMessage","Label":"Message","HelpText":"You can use variables here. Leave blank for the default build notification format.","DefaultValue":null}],"Properties":{"Octopus.Action.Script.ScriptBody":"$message = if ($OctopusParameters['HipChatMessage']) { $OctopusParameters['HipChatMessage'] } else { \"(successful) \" + $OctopusParameters['Octopus.Project.Name'] + \" [v$($OctopusParameters['Octopus.Release.Number'])] deployed to $($OctopusParameters['Octopus.Environment.Name']) on $($OctopusParameters['Octopus.Machine.Name'])\" } \n#---------\n$apitoken = $OctopusParameters['HipChatAuthToken']\n$roomid = $OctopusParameters['HipChatRoomId']\n$from = $OctopusParameters['HipChatFrom']\n$colour = $OctopusParameters['HipChatColor']\n\nTry \n{\n\t#Do the HTTP POST to HipChat\n\t$post = \"auth_token=$apitoken&room_id=$roomid&from=$from&color=$colour&message=$message¬ify=1&message_format=text\"\n\t$webRequest = [System.Net.WebRequest]::Create(\"https://api.hipchat.com/v1/rooms/message\")\n\t$webRequest.ContentType = \"application/x-www-form-urlencoded\"\n\t$postStr = [System.Text.Encoding]::UTF8.GetBytes($post)\n\t$webrequest.ContentLength = $postStr.Length\n\t$webRequest.Method = \"POST\"\n\t$requestStream = $webRequest.GetRequestStream()\n\t$requestStream.Write($postStr, 0,$postStr.length)\n\t$requestStream.Close()\n\t\n\t[System.Net.WebResponse] $resp = $webRequest.GetResponse();\n\t$rs = $resp.GetResponseStream();\n\t[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;\n\t$sr.ReadToEnd();\t\t\t\t\t\n}\ncatch [Exception] {\n\t\"Woah!, wasn't expecting to get this exception. `r`n $_.Exception.ToString()\"\n}","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"HipChat","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/hipchat-notify-api-v1.json","Website":"/step-templates/c37ccd22-2b31-4263-8389-9e63868519b4","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////HVCAvMvZaourDJE3ngAABCpJREFUeNrsXe12KyEI3DDv/85N2rT52igrg2DK3D/tPafqCCIqsNtWKBQKhUKhUCgUCoVCoVAoFAoFZ4gILjj94fvX838vxOF++Hs488kvhw6HOzZ5ZaMncSPzCSwychllkYyLicWVy+rCSCMWFo1gKkwagVTYNKKoONCIWPZycsNUoZw8MU+/dFr14+v+elTfPwJIpF/9RY6mQyiioBO/OpQuepeMhKrVIde84/IjbJWPrNEWF8Qsj2FTgwD1Ep8uZfaSFze7/1bSMpOHpG9c1ZWs0n67H6plwQwmMsMp2l8q4s9j0nbLZBJrUVx5uO27cFRhTPUf/HqTyb6pzNurnH1spx4jTj0efSLidkD4y0QiTqF7MpFsDQZNIMJunYTbc+DtmTBFgsgLTWLnEnsxC5o6IE6xqPMosTx4A0D4Qx9pBNECeRXJqgIhjSHENXEYhKR4CoddvZFBIM8igbmFsEdw83xKDoHYJxRZgkWsA0miWWbVSKNZ1ilFFoE8zyn+K5E8mmUcS6YANxiISB7Nsg0GiTTLpB6fSSQ8BhRFJJXRMil6JqP1bLaKSBEpIkWkiBSRGCIr7+zlNKYmUgerBEQ+5sz+MbcoqrskgMnwkiYj/HstxSx4BDDztaOvl/CINwR9vfZv48GMAUVjvo0PHN0/B8+oSUtxrA8c3Yci8QgKk4GB0HSLGILkoFmKBoSx1zwG9m98zdK8C9tDCqT/nmR/Z5eT1gKPdqOJxxLCo6wiDATj8fivySIYHMTRCdP0o+WylxgKhcwHDb1mNnA4z/VdRujmJRBlsBRaydOvHHAoD5QVMqYKoUMvGfyKgcRvTgDdpo0yJVQbENVEGnZdXUsyh4fFEdJuFLaSO8bOR0Ty1v6N1xZ5a+CosfEHcgZA1Sp6tsKRvAvhadVOY9aT6KGEFJCksdet+fR2LMfqSOm2I2uTcTWAY0lCotKwdpUL8eCx5xh2xNyrryH0HkeXiaLdfbcKmoIjfhmcGG75Umbn+k9dalIcM4NnZh379uWZm909qTFfNSSyQob/TLHVa0LNh8AqHHO0lzlfU6qJNHxC1qKXidWDXGvGYZI8mh4hg8o8C9/2bR28bNdXcbhVJZRpvoPiGGjiMjsPlVMVsEtkRowCpU7jK9+AqBHVGfBaOPPRpb+/OZWmSLY5oJSWRavRWeEvlOqyT+olMeEvFCoSrlsbqQLzg1CCREJaKogXCYuKJBAJh8pNv0IMF3PZ/1GJjkAEi0qocpFs2A+VFAHHsJI5ezUpKmZsilrXtJegGWQ6bC7eJJZgcnd//Yh7bxhjbkxGYBmhsCxd/q9Fqaks8BUvJZUVvkemej1d5MNqiu9ObKugs5Eu9Km79qP2SkRaHg62BbFDZkkeN3/tlxBkKxQKhUKhUCgUCoVCoVAoFAqFwhF8CTAA/z8hbAhfKXMAAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"5667710e-60b8-4067-bfa5-87196faafdda","Name":"HockeyApp - Upload Mobile App","Description":"This script uploads a new version of an existing app package to the [HockeyApp](http://hockeyapp.net/features/) services.","Version":19,"ExportedAt":"2015-12-01T00:11:50.815+00:00","ActionType":"Octopus.Script","Author":"Colin.Dabritz@Viewpoint.com","Parameters":[{"Name":"HockeyAppApiToken","Label":"HockeyApp Api Token","HelpText":"HockeyApp requires an access token for their API as show in the [HockeyApp API Authentication Documentation]( http://support.hockeyapp.net/kb/api/api-basics-and-authentication#authentication). Logged in users can generate tokens under [API Tokens](https://rink.hockeyapp.net/manage/auth_tokens) in the account menu.\n\nYou should generate an application specific token for this purpose.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppAppID","Label":"HockeyApp App ID","HelpText":"The ID of your App in HockeyApp. This is visible on the [Manage Apps](https://rink.hockeyapp.net/manage/apps) management page for your target app.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MobileAppPackageStepName","Label":"Package Step Name","HelpText":"Name of the previously-deployed package step that contains the App that you want to deploy.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"}},{"Name":"PackageFileName","Label":"Package File Name","HelpText":"The value is optional.\n\nIf no value is provided the scrip will search for exactly one *.apk, *.ipa, or *.appx file in the nupgk package files. Zero or multiple matches will result in an error.\n\nIf a value is provided, it will be used directly instead of searching. Use this to specify a mobile app to upload in the case of multiple apps, such as a signed and unsigned apk, or an apk and ipa in a single Nuget package.\n\nThis value must be the path and filename relative to the root of the nupkg file. You may use octopus parameters if needed, but the passed value must be the combined relative path with full filename for the package.\n\nFor creating the nupkg, the following *.nuspec example will package ALL matching Ipa, Apk (signed), and Appx files. If you have a single package as build output, the Nuget package should work by default.\n\n\t\n\t\n\t \n\t\t$id$\n\t\t$id$\n\t\t$version$\n\t\tMobile project packaged for Octopus deploy. $description$\n\t \n\t \n\t\t\n\n\t\t\n\t\t\n\n\t\t\n\t\t\n\n\t\t\n\t\t\n\t \n\t","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppNotes","Label":"HockeyApp Notes","HelpText":"optional, release notes as Textile or Markdown\n\nAs an example, you could use the Octopus variables from the Nuget package extract step as like this:\n\nDeployed from Nuget Package #{Octopus.Action[Nuget Package Extract].Package.NuGetPackageId}, Version #{Octopus.Action[Nuget Package Extract].Package.NuGetPackageVersion}\n\nAnd get Hockey App notes like:\n\nDeployed from Nuget Package MyiOSPackage, Version 1.2.3.4\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppNotesType","Label":"HockeyApp Notes Type","HelpText":"optional, type of release notes:\n\n- 0 - Textile\n- 1 - Markdown\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppNotify","Label":"HockeyApp Notify","HelpText":"optional, notify testers (can only be set with full-access tokens):\n\n- 0 - Don't notify testers\n- 1 - Notify all testers that can install this app\n- 2 - Notify all testers\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":"1","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppStatus","Label":"HockeyApp Status","HelpText":"optional, download status (can only be set with full-access tokens):\n\n- 1: Don't allow users to download or install the version\n- 2: Available for download or installation\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":"2","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppTags","Label":"HockeyApp Tags","HelpText":"optional, restrict download to comma-separated list of tags\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppTeams","Label":"HockeyApp Teams","HelpText":"optional, restrict download to comma-separated list of team IDs; example:\n\nteams=12,23,42 with 12, 23, and 42 being the database IDs of your teams\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{}},{"Name":"HockeyAppUsers","Label":"HockeyApp Users","HelpText":"optional, restrict download to comma-separated list of user IDs; example:\n\n 1224,5678\nwith 1224 and 5678 being the database IDs of your users\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppMandatory","Label":"HockeyApp Mandatory","HelpText":"optional, set version as mandatory:\n\n- 0 - no\n- 1 - yes\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppCommitSha","Label":"HockeyApp Commit Sha","HelpText":"optional, set to the git commit sha for this build\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppBuildServerUrl","Label":"HockeyApp Build Server Url","HelpText":"optional, set to the URL of the build job on your build server\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"HockeyAppRepositoryUrl","Label":"HockeyApp Repository Url","HelpText":"optional, set to your source repository\n\nSee [Upload API Documentation](http://support.hockeyapp.net/kb/api/api-versions#upload-version)","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Hockey App Upload script\n#\n# Uploads a mobile platform application package to Hockey App from a Nuget file\n# extracted in a previous Octopus Deploy step. Allows a variety of parameters.\n#\n# v0.5 - Turns out Invoke-WebRequest was a memory hog, casuing high memory usage and\n# out-of-memory errors. Switched to dot net native web request and streams.\n# v0.4 - Package location search is now recursive, as required by *.nuspec example.\n# Added default description to pass along nuget version to notes.\n# v0.3 - Now supports windows .appx packages\n# v0.2 - Added extra parameters\n# v0.1 - Initial version, basic upload\n# \n#\n# The following *.nuspec example will package ALL matching Ipa, Apk (signed), and Appx files.\n# The upload script requires exactly one match (or specifying the exact file)\n# \n# Specify specific package path relative to the nuspec file location (or overriden basepath)\n#\n# https://docs.nuget.org/create/nuspec-reference#file-element-examples\n#\n# In some cases the ID, Version, and Description may need manually specified.\n#\n\n<#\n\n \n \n \n $id$\n $id$\n $version$\n Mobile project packaged for Octopus deploy. $description$\n \n \n \n\n \n \n\n \n \n\n \n \n \n \n\n#>\n\n# Hockey App API reference\n#\n# General API reference: http://support.hockeyapp.net/kb/api\n# Auth reference (tokens): http://support.hockeyapp.net/kb/api/api-basics-and-authentication\n# Upload App Version reference: http://support.hockeyapp.net/kb/api/api-versions#upload-version\n\n#############################\n# Debug Parameter Overrides #\n#############################\n\n# These values are set explicitly durring debugging so that the script can\n# be run in the editor.\n# For local debugging, uncomment these values and fill in appropriately.\n\n<#\n\n$OctopusParameters = @{\n\"HockeyAppApiToken\" = \"YourApiKeyhere\";\n\"HockeyAppAppID\" = \"YourAppIdHere\";\n\"PackageFileName\" = \"MyAppFile-1.2.3.4.ipa\"; # app file name\n\"HockeyAppNotify\" = \"1\";\n\"HockeyAppStatus\" = \"2\";\n}\n\n# debug folder with app files\n$stepPath = \"C:\\Temp\\HockeyAppScript\\\"\n\n\n# #>\n\n###################################\n# Octopus Deploy common functions #\n###################################\n\n# A collection of functions that can be used by script steps to determine where packages installed\n# by previous steps are located on the filesystem.\n \nfunction Find-InstallLocations {\n $result = @()\n $OctopusParameters.Keys | foreach {\n if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {\n $result += $OctopusParameters[$_]\n }\n }\n return $result\n}\n \nfunction Find-InstallLocation($stepName) {\n $result = $OctopusParameters.Keys | where {\n $_.Equals(\"Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath\", [System.StringComparison]::OrdinalIgnoreCase)\n } | select -first 1\n \n if ($result) {\n return $OctopusParameters[$result]\n }\n \n throw \"No install location found for step: $stepName\"\n}\n\nfunction Find-SingleInstallLocation {\n $all = @(Find-InstallLocations)\n if ($all.Length -eq 1) {\n return $all[0]\n }\n if ($all.Length -eq 0) {\n throw \"No package steps found\"\n }\n throw \"Multiple package steps have run; please specify a single step\"\n}\n\n#####################\n# Utility functions #\n#####################\n\nfunction Get-ExactlyOneMobilePackageFileInfo($searchPath)\n{\n $apkFiles = Get-ChildItem -Path $searchPath -Recurse -Filter *.apk #Android\n $ipaFiles = Get-ChildItem -Path $searchPath -Recurse -Filter *.ipa #iOS\n $appxFiles = Get-ChildItem -Path $searchPath -Recurse -Filter *.appx # windows\n\n $apkCount = $apkFiles.count\n\n $ipaCount = $ipaFiles.count\n\n $appxCount = $appxFiles.count\n\n $totalCount = $apkCount + $ipaCount + $appxCount\n\n if($totalCount -ne 1)\n {\n throw \"Did not find exactly one (1) mobile application package. Found $apkCount APK file(s), $ipaCount IPA file(s), and $appxCount Appx file(s).\"\n }\n\n if($apkCount -eq 1)\n {\n return $apkFiles\n }\n\n if($ipaCount -eq 1)\n {\n return $ipaFiles\n }\n\n if($appxCount -eq 1)\n {\n return $appxFiles\n }\n\n throw \"Unable to find mobile application packages (fallback error - not expected)\"\n}\n\nfunction AddToHashIfExists([HashTable]$table, $value, $name)\n{\n if(-not [String]::IsNullOrWhiteSpace($value))\n {\n $table.Add($name, $value)\n }\n}\n\nfunction GetMultipartFormSectionString($key,$value)\n{\n return @\"\nContent-Disposition: form-data; name=\"$key\"\n\n$value\n\"@\n}\n\n####################\n# Basic Parameters #\n####################\n\n$apiToken = $OctopusParameters['HockeyAppApiToken']\n$appId = $OctopusParameters['HockeyAppAppID']\n\n$octopusFilePathOverride = $OctopusParameters['PackageFileName']\n\n$stepName = $OctopusParameters['MobileAppPackageStepName']\n\n# set step path, if not already set\nIf([string]::IsNullOrEmpty($stepPath))\n{\n if (![string]::IsNullOrEmpty($stepName)) {\n Write-Host \"Finding path to package step: $stepName\"\n $stepPath = Find-InstallLocation $stepName\n } else {\n $stepPath = Find-SingleInstallLocation\n }\n}\n\nWrite-Host \"Package is located in folder: $stepPath\"\nWrite-Host \"##octopus[stderr-progress]\"\n\n# if we were not provided a file name, search for a single package file\nif([string]::IsNullOrWhiteSpace($octopusFilePathOverride))\n{\n $appFileInfo = Get-ExactlyOneMobilePackageFileInfo $stepPath\n $appFullFilePath = $appFileInfo.FullName\n}\nelse\n{\n $appFullFilePath = Join-Path $stepPath $octopusFilePathOverride\n}\n\n$fileName = [System.IO.Path]::GetFileName($appFullFilePath)\n\n$apiUploadUri = \"https://rink.hockeyapp.net/api/2/apps/$appId/app_versions/upload\"\n\n# Request token details\n$uniqueBoundaryToken = [Guid]::NewGuid().ToString()\n\n$contentType = \"multipart/form-data; boundary=$uniqueBoundaryToken\"\n\n################################\n# Set up Hockey App parameters #\n################################\n\n$HockeyAppParameters = @{} # parameters are a hash table.\n\n# add parameters that have values - See docs at http://support.hockeyapp.net/kb/api/api-versions#upload-version\n\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppNotes'] \"notes\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppNotesType'] \"notes_type\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppNotify'] \"notify\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppStatus'] \"status\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppTags'] \"tags\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppTeams'] \"teams\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppUsers'] \"users\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppMandatory'] \"mandatory\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppCommitSha'] \"commit_sha\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppBuildServerUrl'] \"build_server_url\"\nAddToHashIfExists $HockeyAppParameters $OctopusParameters['HockeyAppRepositoryUrl'] \"repository_url\"\n\n$formSectionSeparator = @\"\n\n--$uniqueBoundaryToken\n\n\"@\n\nif($HockeyAppParameters.Count -gt 0)\n{\n $parameterSectionsString = [String]::Join($formSectionSeparator,($HockeyAppParameters.GetEnumerator() | %{GetMultipartFormSectionString $_.Key $_.Value}))\n}\n\n############################\n# Prepare request wrappers #\n############################\n\n# Standard for multipart form data\n# http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4\n\n$stringEncoding = [System.Text.Encoding]::ASCII\n\n# Note the hard-coded \"ipa\" name here is per HockeyApp API documentation\n# and it applies to ALL platform application files.\n\n$preFileBytes = $stringEncoding.GetBytes(\n$parameterSectionsString + \n$formSectionSeparator +\n@\"\nContent-Disposition: form-data; name=\"ipa\"; filename=\"$fileName\"\nContent-Type: application/octet-stream\n\n\n\"@)\n\n# file bytes will go in between\n\n$postFileBytes = $stringEncoding.GetBytes(@\"\n\n--$uniqueBoundaryToken--\n\"@)\n\n######################\n# Invoke the request #\n######################\n\n# Note, previous approach was Invoke-RestMethod based. It worked, but was NOT memory\n# efficient, leading to high memory usage and \"out of memory\" errors.\n\n# Based on examples from\n# http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data\n# and \n# https://gist.github.com/nolim1t/271018\n\n# Uses a dot net WebRequest and streaming to limit memory usage\n\n$WebRequest = [System.Net.WebRequest]::Create(\"$apiUploadUri\")\n\n$WebRequest.ContentType = $contentType\n$WebRequest.Method = \"POST\"\n$WebRequest.KeepAlive = $true;\n$WebRequest.Headers.Add(\"X-HockeyAppToken\",$apiToken)\n\n$RequestStream = $WebRequest.GetRequestStream()\n\n# before file bytes\n$RequestStream.Write($preFileBytes, 0, $preFileBytes.Length);\n\n#files bytes\n\n$fileMode = [System.IO.FileMode]::Open\n$fileAccess = [System.IO.FileAccess]::Read\n\n$fileStream = New-Object IO.FileStream $appFullFilePath,$fileMode,$fileAccess\n$bufferSize = 4096 # 4k at a time\n$byteBuffer = New-Object Byte[] ($bufferSize)\n\n# read bytes. While bytes are read...\nwhile(($bytesRead = $fileStream.Read($byteBuffer,0,$byteBuffer.Length)) -ne 0)\n{\n # write those byes to the request stream\n $RequestStream.Write($byteBuffer, 0, $bytesRead)\n}\n\n$fileStream.Close()\n\n# after file bytes\n$RequestStream.Write($postFileBytes, 0, $postFileBytes.Length);\n\n$RequestStream.Close()\n\n$response = $WebRequest.GetResponse();\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"HockeyApp","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/hockeyapp-upload-mobile-app.json","Website":"/step-templates/5667710e-60b8-4067-bfa5-87196faafdda","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF////AZ3kXMDutuP3nz1mRAAAA19JREFUeNrsnNtygzAMRLH2//+5hZAphJuMVzLp7MlbpxOySNbNhmEQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEECILjJ8N05+f/Kt/sYlixcnvv47ARn0PEDD9+nZGSV0EjQpKAKOeNA0xEj7kBIuI17BUE+ZMJR2+o6H0gqmln4q3Fs66KA/AOsiYM905xXLNYu50NiU0tztjmCsY82fUhiiGzPzlSU8IMEdQzrqQY1wdwYn3TIwRdVhCMXScfI21PmxIwjg/4EhHZoFNWfFGDRs3IZgEnf2KdjcfYRDG7fw3QsqTXasQvgIPMAjDtVLD71AiheTZBJQyBZEtTusvwEAxSedaq/ZOIrbvbGkgQPyuWKsYt3vPmWzUjwBBXG1x07OQbtczzSJq8U0ywfdV5owW3hGgRaw6ThtfNdu/bf7KWek83HJuEaF6i6jBjW9NfV+jRhh2eA3k7k1hERjUv2n6i2foQHim/ZJhvDdPfcP+SHf/AiPbdrfKwhoNVcTKOftshq6WaotDLb8KyR62NMF0G9EUrtBn3a9XOJqCl+2utgwtH3EKjVHYjuJf6CkO216tNZ3gJJQHnarZNjhLBwAje+xlJaoY278CJaOYJzMR1Bx1M2AVKnAXC3fai4vjZtugAma9eN4KLs4EOo4XVDaOTZXjZaK6MOmwOpjZ1sKHjMTjJnQI2tJA5ozuLNe2XyzlMMplWkrpEJuOusKTWkkdolUE0zojeL+5U4NoiwNcU7jCO3rdmwYx12LHrp29G2P/Q0avVjd/Z+/hY6D6DSViVR9gCKSb5eOSxlrmlupiHy5lrLViO7E8TsumY+ctettPS/yufafXATN64TiI8MTsljcwbm6382KhVc1RiQZ6OoErtld37adF5moRIqQ8udrA/asNX08lLD4zl48DfPS6xIxyczMa84OVVc9Rbh2VmRSz6oe9sM69UEIxdJCbsgpGRtd+EvcCDG8RXftVqAup4+ELqB5F3hMcUXV8TZr4ezp6/tQ/JBZ45DCztQo+BJolJeEsa4c9xG+VkvksQV5jFS8lQot1ev8DV4v1fYkFR4w94y0jLW5mhoe9KqV2Y7fbG0T8enBYjZhrS1cIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCLHmR4ABAJBvJBFaZlmBAAAAAElFTkSuQmCC","$Meta":{"Type":"ActionTemplate"}},{"Id":"bb2a8fef-1407-405b-9251-a259c1868bad","Name":"HTTP - Invoke URL","Description":"Invoke HTTP Get request using provided url. Doesn't throw exception when request fails.","Version":2,"ExportedAt":"2015-08-31T12:25:19.923+00:00","ActionType":"Octopus.Script","Author":"jmalczak","Parameters":[{"Name":"url","Label":"Url","HelpText":"Web request Url","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Running outside octopus\nparam(\n [string]$url,\n [switch]$whatIf\n) \n\n$ErrorActionPreference = \"Stop\" \n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null -or $result -eq \"\") {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\n& {\n param(\n [string]$url\n ) \n\n Write-Host \"Invoke Url: $url\"\n\n try {\n \n Invoke-WebRequest -Uri $url -Method Get -UseBasicParsing\n\n } catch {\n Write-Host \"There was a problem invoking Url\" \n }\n\n } `\n (Get-Param 'url' -Required)","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"HTTP","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/http-invoke-url.json","Website":"/step-templates/bb2a8fef-1407-405b-9251-a259c1868bad","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"3c7a59bd-d66e-4dc6-9509-895b4a5d98c8","Name":"HTTP - Post Form","Description":"Execute a simple form POST via HTTP. The script will construct a body in \"application/x-www-form-urlencoded\" format by extracting Octopus variables with a specified prefix (from the \"HTTP.PostForm.Prefix\" parameter). Variable names and values are encoded accordingly.\n\nFor instance, if \"HTTP.PostForm.Prefix\" is \"foo.\", then the Octopus variable \"foo.Bar\"=\"baz\" will be translated to \"Bar=baz\" in the request body.","Version":2,"ExportedAt":"2015-11-13T21:57:26.839+00:00","ActionType":"Octopus.Script","Author":"kburdett","Parameters":[{"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"HelpText":"Specifies the destination of the POST.","Label":"URI","Name":"HTTP.PostForm.URI"},{"DefaultValue":"HTTP.Parameter.","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"HelpText":"Specifies the variable prefix for composing the body of the POST. Any variables in the current context that begin with this prefix will be extracted and added to the body.","Label":"Prefix","Name":"HTTP.PostForm.Prefix"}],"Properties":{"Octopus.Action.Script.ScriptBody":"try {\r $uri = $OctopusParameters[\"HTTP.PostForm.URI\"]\r $prefix = $OctopusParameters[\"HTTP.PostForm.Prefix\"]\r $body = \"\"\r\r # Ensure URI is populated\r if ([string]::IsNullOrEmpty($uri)) {\r Write-Error \"HTTP.PostForm.URI is required and cannot be empty\"\r return\r }\r\r # Construct the body\r if (![string]::IsNullOrEmpty($prefix)) {\r $params = $OctopusParameters.Keys |\r Where-Object { $_.StartsWith($prefix) } |\r Foreach-Object {\r $key = [uri]::EscapeDataString($_.Substring($prefix.Length))\r $val = [uri]::EscapeDataString($OctopusParameters[$_])\r Write-Verbose \"Found parameter ${key}=${val}\"\r \"${key}=${val}\"\r }\r \r if ($params.Length -gt 0) {\r $body = $params -join \"&\"\r }\r }\r \r # Execute the request\r Write-Host \"Executing trigger: ${uri}\"\r Write-Host \"Body: ${body}\"\r Invoke-WebRequest -Method Post -Uri $uri -Body $body -ContentType \"application/x-www-form-urlencoded\"\r} catch {\r $ErrorMessage = $_.Exception.Message\r Write-Error $ErrorMessage\r}","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"HTTP","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/http-post-form.json","Website":"/step-templates/3c7a59bd-d66e-4dc6-9509-895b4a5d98c8","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"f5cebc0a-cc16-4876-9f72-bfbd513e6fdd","Name":"HTTP - Test URL","Description":"Makes a GET request to a HTTP(S) end point and verifies that a particular status code and response (optional) is returned within a specified period of time","Version":13,"ExportedAt":"2017-06-28T12:51:00.000+00:00","ActionType":"Octopus.Script","Author":"HumanPrinter","Parameters":[{"Id":"ca7c3e92-c243-4115-a326-7693eb830214","Name":"Uri","Label":"URI","HelpText":"The full Uri of the endpoint","DefaultValue":null,"DisplaySettings":{}},{"Id":"0d760ed5-81ed-46d9-b833-74f75df08bfc","Name":"CustomHostHeader","Label":"Custom HOST header","HelpText":"An optional custom HOST header which will be passed with the request","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8f47469e-3b6d-4915-a710-3a601debeb8a","Name":"ExpectedCode","Label":"Expected code","HelpText":"The expected HTTP status code","DefaultValue":"200","DisplaySettings":{}},{"Id":"7c96b2b3-53dd-4281-ae1a-ef67cbc0eb72","Name":"TimeoutSeconds","Label":"Timeout (Seconds)","HelpText":"The number of seconds before the step fails and times out","DefaultValue":"60","DisplaySettings":{}},{"Id":"ac0b303c-0c59-4776-be21-d93ebe9e28e7","Name":"AuthUsername","Label":"Username","HelpText":"Username for authentication. Leave blank to use Anonymous.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"38eae17a-3098-48df-b8dc-96c3185f9f40","Name":"AuthPassword","Label":"Password","HelpText":"Password for authentication. Leave blank for Anonymous.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"60fe87fe-e96d-448e-94fa-f2ce4bfbaf3a","Name":"UseWindowsAuth","Label":"Use Windows Authentication","HelpText":"Should the request be made passing windows authentication (kerberos) credentials otherwise uses basic authentication","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"47c779b5-c515-49f9-a122-f692b0f12ff7","Name":"ExpectedResponse","Label":"Expected Response","HelpText":"The response should be this text","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"$uri = $OctopusParameters['Uri']\n$customHostHeader = $OctopusParameters['CustomHostHeader']\n$expectedCode = [int] $OctopusParameters['ExpectedCode']\n$timeoutSeconds = [int] $OctopusParameters['TimeoutSeconds']\n$Username = $OctopusParameters['AuthUsername']\n$Password = $OctopusParameters['AuthPassword']\n$UseWindowsAuth = [System.Convert]::ToBoolean($OctopusParameters['UseWindowsAuth'])\n$ExpectedResponse = $OctopusParameters['ExpectedResponse']\n\n\nWrite-Host \"Starting verification request to $uri\"\nif ($customHostHeader)\n{\n Write-Host \"Using custom host header $customHostHeader\"\n}\n\nWrite-Host \"Expecting response code $expectedCode.\"\nWrite-Host \"Expecting response: $ExpectedResponse.\"\n\n\n$timer = [System.Diagnostics.Stopwatch]::StartNew()\n$success = $false\ndo\n{\n try\n {\n if ($Username -and $Password -and $UseWindowsAuth)\n {\n Write-Host \"Making request to $uri using windows authentication for user $Username\"\n $request = [system.Net.WebRequest]::Create($uri)\n $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $(ConvertTo-SecureString -String $Password -AsPlainText -Force)\n $request.Credentials = $Credential \n \n if ($customHostHeader)\n {\n $request.Host = $customHostHeader\n }\n\n try\n {\n $response = $request.GetResponse()\n }\n catch [System.Net.WebException]\n {\n Write-Host \"Request failed :-( System.Net.WebException\"\n Write-Host $_.Exception\n $response = $_.Exception.Response\n }\n \n }\n\t\telseif ($Username -and $Password)\n {\n Write-Host \"Making request to $uri using basic authentication for user $Username\"\n $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $(ConvertTo-SecureString -String $Password -AsPlainText -Force)\n if ($customHostHeader)\n {\n $response = Invoke-WebRequest -Uri $uri -Method Get -UseBasicParsing -Credential $Credential -Headers @{\"Host\" = $customHostHeader}\n }\n else \n {\n $response = Invoke-WebRequest -Uri $uri -Method Get -UseBasicParsing -Credential $Credential\n }\n }\n\t\telse\n {\n Write-Host \"Making request to $uri using anonymous authentication\"\n if ($customHostHeader)\n {\n $response = Invoke-WebRequest -Uri $uri -Method Get -UseBasicParsing -Headers @{\"Host\" = $customHostHeader}\n }\n else \n {\n $response = Invoke-WebRequest -Uri $uri -Method Get -UseBasicParsing\n }\n }\n \n $code = $response.StatusCode\n $body = $response.Content;\n Write-Host \"Recieved response code: $code\"\n Write-Host \"Recieved response: $body\"\n\n if($response.StatusCode -eq $expectedCode)\n {\n $success = $true\n }\n if ($success -and $ExpectedResponse)\n {\n $success = ($ExpectedResponse -eq $body)\n }\n }\n catch\n {\n # Anything other than a 200 will throw an exception so\n # we check the exception message which may contain the \n # actual status code to verify\n \n Write-Host \"Request failed :-(\"\n Write-Host $_.Exception\n\n if($_.Exception -like \"*($expectedCode)*\")\n {\n $success = $true\n }\n }\n\n if(!$success)\n {\n Write-Host \"Trying again in 5 seconds...\"\n Start-Sleep -s 5\n }\n}\nwhile(!$success -and $timer.Elapsed -le (New-TimeSpan -Seconds $timeoutSeconds))\n\n$timer.Stop()\n\n# Verify result\n\nif(!$success)\n{\n throw \"Verification failed - giving up.\"\n}\n\nWrite-Host \"Sucesss! Found status code $expectedCode\"","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"HTTP","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/http-test-url.json","Website":"/step-templates/f5cebc0a-cc16-4876-9f72-bfbd513e6fdd","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"17092e2b-7fae-4aae-b8df-bb1c7ec76ff9","Name":"HTTP - Test URL (Bash)","Description":"Makes a GET request to a HTTP(S) end point and verifies that a particular status code is returned within a specified period of time","Version":1,"ExportedAt":"2017-02-17T05:46:18.745Z","ActionType":"Octopus.Script","Author":"cjuroz","Parameters":[{"Id":"d0191097-38d0-4b73-ae74-783a1e439cd4","Name":"uri","Label":"URI","HelpText":"The full Uri of the endpoint","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"cfc51640-dbc9-453f-8e59-9ed33607a6bd","Name":"expectedCode","Label":"Expected code","HelpText":"The expected HTTP status code","DefaultValue":"200","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1f60efab-65fe-415b-8d9b-2f248543e302","Name":"timeout","Label":"Timeout (seconds)","HelpText":"The number of seconds before the step fails and times out","DefaultValue":"30","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"Bash","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"false","Octopus.Action.Script.ScriptBody":"uri=$(get_octopusvariable \"uri\")\nexpectedCode=$(get_octopusvariable \"expectedCode\")\ntimeout=$(get_octopusvariable \"timeout\")\nsuccess=false\n\n# required arguments checking\nif [[ $expectedCode == \"Unrecognized variable\"* ]] || [[ $uri == \"Unrecognized variable\"* ]] || [[ $timeout == \"Unrecognized variable\"* ]]\nthen\n echo \"[ERROR]: Missing required argument. Exit!\"\n exit 1;\nfi\n\necho \"Starting verification request to $uri\"\necho \"Expecting response code $expectedCode\"\n\nend=$((SECONDS+$timeout))\n\nuntil $success || [ $SECONDS -ge $end ];\ndo\n code=$(curl --write-out %{http_code} --silent --output /dev/null $uri)\n echo \"Recieved response code: $code\"\n \n if [ $code -eq $expectedCode ]\n then\n echo \"Sucesss! Found status code $expectedCode\"\n success=true\n exit 0\n else\n echo \"Trying again in 5 seconds...\"\n sleep 5\n fi\ndone\n\nif ! $success\nthen\n echo \"Verification failed - giving up.\"\n exit 1\nfi","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.FeedId":null,"Octopus.Action.Package.PackageId":null},"Category":"Bash","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/bash-http-test-url.json","Website":"/step-templates/17092e2b-7fae-4aae-b8df-bb1c7ec76ff9","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"d4fb1945-f0a8-4de4-9045-8441e14057fa","Name":"Hydra - Update Octopus Tentacle","Description":"Performs an automatic update for a 2.6 Tentacle to a 3.0 Tentacle.","Version":8,"ExportedAt":"2015-07-01T05:57:02.674+00:00","ActionType":"Octopus.TentaclePackage","Author":"Damovisa","Parameters":[{"Name":"ServerMapping","Label":"Server Mapping","HelpText":"Optional mapping to new Octopus server location required for polling Tentacles.\nEither a single IP address or DNS name with a port (e.g. `http://new.server:10943`)\nOr a mapping in the form `https://old.server:10943/=>https://new.server:10943/`, with multiple mappings separated by a comma (`,`) or semicolon (`;`)\n\n_Note: If using the mapping format, the final `/` is required._","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Package.NuGetFeedId":"feeds-builtin","Octopus.Action.EnabledFeatures":"Octopus.Features.CustomScripts","Octopus.Action.Package.AutomaticallyRunConfigurationTransformationFiles":"False","Octopus.Action.Package.AutomaticallyUpdateAppSettingsAndConnectionStrings":"False","Octopus.Action.Package.DownloadOnTentacle":"False","Octopus.Action.Package.NuGetPackageId":"OctopusDeploy.Hydra","Octopus.Action.CustomScripts.PostDeploy.ps1":"if ([System.String]::IsNullOrEmpty($ServerMapping)) {\n & .\\Hydra.exe --defer\n} else {\n $cleanServerMapping = $ServerMapping.Replace(\" \",\"\")\n & .\\Hydra.exe --defer --servers=$cleanServerMapping\n}\n"},"Category":"Octopus","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/hydra-update-octopus-tentacle.json","Website":"/step-templates/d4fb1945-f0a8-4de4-9045-8441e14057fa","Logo":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRFT6Tl////L5Pg8vj9Y67omsvwPJrisdfzfbzs5fL7y+T32Ov5isLucLXqvt31CJPHWwAABMJJREFUeNrs3deW4jAMAFDF3U75/89dlp0ZhiU4blJEjvQ8hYubLJsA00UCBCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIhD8kJm+t+QprfdKfB9HbYpx6CWfspj8HMi+gMgHL/AmQA8W3JTKH+ALFvzCeL0RbpyoCPE9IJeNOSQwh5Z3qd6yRGWQ2qi2cZQWxqj1WzQYSjeoJmJlAklOd4VlArOqPhQEkqBERToeMcfRJBkC0Uep8CfBpjz4JsHJ0zF3dkEWNje0kiB/sUC6eApndaIiCMyAa1PiwJ0AWhRGJHJJQHG2dC7h1rNbO1QOxSA7lNCkkKrQIpJCAB1GREILYIC1NAiwbpKFJgGWDNExcwGstfExcZBCHC6nOglshHtmhViLIig1RNBCN7qjtW8C0Z1UvJcC1Z9XmwMBzzvobmgAyEzgq91dtEEsBsQSQQAFZCSBAATEEEApHZbrVBIkkEIUPSVeB+KtALA0kXQUSrwKZBCIQBnk8Y4i5CsReBeKvkqLM+BCSDWJlrZFvGk9SRTHshkgjZCGAaArIxm3H3grhVzFlW2msfl1ca79UJ1bofYvsDHHlNdTZnlh5MghuPd5NdBDUNZHyCkfktIh03XzALGRPlBDPac7qgWjHZzWcmF5zmmkhidMQ6boKiDXcDTUEaylZqCGJ0Vjvu/fLJtHqhSANEvqb2OYqkOUqEHuVMbJcZdZCGiPhKhC4yjqiIjEE7XThMp8fAWII3mY3kUIQD+AMKQTzPiBhgQ63HlT/KSvgtoi0dq5mCPah1UIE0eh3sT0NhOByvKeAkFzi8PgQomumFhsyOxpIzZN4gLOj5plVwNpR0b2AuePWKBEHQu24pSsJA+LVCeHHQxZ1SiyDIdqok8IOhSSnTottHEQTdyt4ettAj4KkzA4dMikk2Dht2S5ptm1vswnPDxn0YyDZ5oDM3iToo2T5voWaYe+Q+vdjH80QyAzZhCgcDtLMI1Tmtz9w++XHgziHQHJJu/OZ3bs9Xn8gQ72NcP3dKqEfkp10F51xhoIi2I91R+LurXV/5q7pH+wx061CzO16oSQleMyr8fXvwMA0Pro8432DPD/ySx8XrHfSuDAM8n6UhnjQabaiXf5Bq/lREHvEeNtn1rJ08+C/uXkQZHeguxAPC3UvtcJYUogLzZX5hhZZvS6onG5lxXtzWGaygwb79vT/IXhdlNibwlKYOR6T8xjI7W8n+xV7T+GH4tMzWwR+lZhRkJYSsC0thpmCYqyngOz3rN2FLBZ2wZflBCggUHF0Vnp88JKienzIXLSEZCZqU7IKr/gQW9yx3pzV7Y9kvWZWTRRIqDmTtRUnU7b2lLcTYmoqHqnmiO1poER0SPkAeZMAZxaJx0Y3TCdAclsIqDz03ALcyxfTCZBsthoGXWmigGyVhWPLFJJfuuKQWycoEFdXbH4dJJoJxNR1eD/kshz6yn48cF8yW8sFoitflB1w6Q8n+/15Za7oA17/pYNmYgP5fmWm8L1NOHPWgK8kuFew1/JXtOA0yJCv7ah7X8ObUuT5kObU30+fDZm8+zqP+HTIpK0xQ796b5Kv2hSIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIpBf8UeAAQAEjtYmlDTcCgAAAABJRU5ErkJggg==","MaximumServerVersion":"3.0.0","$Meta":{"Type":"ActionTemplate"}},{"Id":"47e1a39c-65f3-43aa-ad5e-ea1946bbf368","Name":"IIS - Add an Allow ISAPI And CGI Restriction Exception","Description":"Adds an IIS Server Allow exception to the ISAPI/CGI Restrictions in IIS 7 and above.","Version":4,"ExportedAt":"2016-01-13T21:28:56.040+00:00","ActionType":"Octopus.Script","Author":"ekrapfl","Parameters":[{"Name":"cgiIsapiExtensionPath","Label":"CGI/ISAPI Extension Path","HelpText":"The full path to the ISAPI/CGI extension to allow.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"description","Label":"Description","HelpText":"A description for the ISAPI/CGI Restriction allowance exception.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"Param\n(\n [Parameter(Position = 0)]\n [ValidateNotNullOrEmpty()]\n [string] $cgiIsapiExtensionPath,\n [Parameter(Position = 1)]\n [string] $description = [string]::Empty\n)\n\n$ErrorActionPrefrence = \"Stop\"\n\n\nfunction Get-Param($Name, [switch]$Required, $Default) \n{\n $result = $null\n\n if ($OctopusParameters -ne $null) \n {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) \n {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) \n {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) \n {\n if ($Required) \n {\n throw \"Missing parameter value $Name\"\n } \n else \n {\n $result = $Default\n }\n }\n\n return $result\n}\n\n& {\n Param\n (\n [Parameter(Mandatory=$True, Position = 0)]\n [ValidateNotNullOrEmpty()]\n [string] $cgiIsapiExtensionPath,\n [Parameter(Position = 1)]\n [string] $description = [string]::Empty\n )\n\n Import-Module \"WebAdministration\"\n\n $cgiIsapiConfiguration = Get-WebConfiguration -Filter \"/system.webServer/security/isapiCgiRestriction/add\" -PSPath \"IIS:\\\"\n\n $cgiIsapiExtensionFullPath = [System.Environment]::ExpandEnvironmentVariables($cgiIsapiExtensionPath)\n $cgiIsapiExtensionFullPath = Resolve-Path -Path $cgiIsapiExtensionFullPa