\n*Note: Expects the AWS CLI and Powershell to be installed on the worker running this task*
\n*Note: Firewall ports will not be opened on the remote machine*\n*Note: Target machines must be added to your AWS System Manager (SSM)*","Version":2,"ExportedAt":"2020-09-08T16:11:10.456Z","ActionType":"Octopus.AwsRunScript","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"dea51842-271f-48fa-901e-243488049f97","Name":"awsInstallLinuxTentacle.AWSAccount","Label":"AWS Account","HelpText":"AWS account with permissions to the virtual machine in which to install the tentacle on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AmazonWebServicesAccount"}},{"Id":"6a97548c-3b97-4a19-8b9a-45aa58ac62d9","Name":"awsInstallLinuxTentacle.awsRegion","Label":"AWS Region","HelpText":"The name of the aws region. I.E. `us-east-1`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"d9efb017-65c0-4010-b09f-0a6a34fc009f","Name":"awsInstallLinuxTentacle.awsSGName","Label":"Security Group Name","HelpText":"The name of the AWS security group to create an exception in","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e4358aec-2798-412a-bcd2-1c7e41a0728d","Name":"awsInstallLinuxTentacle.awsVmInstanceId","Label":"VM Instance ID","HelpText":"The instance ID of the virtual machine to target when ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8dbe0a29-4e0f-43f8-8ef2-ae23a2884e85","Name":"awsInstallLinuxTentacle.octoServerThumb","Label":"Server Thumbprint","HelpText":"The Thumbprint of the octopus server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"a0859551-6c84-45d1-af2b-c57becb4e8ef","Name":"awsInstallLinuxTentacle.octoApiKey","Label":"Octo User API Key","HelpText":"The API key used to configure the tentacle.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"dd07815d-bfb7-43b9-90f8-21ec5a2d2953","Name":"awsInstallLinuxTentacle.octopusRoles","Label":"Roles","HelpText":"Roles to assign to this tentacle installation.
\n*Note: Each role should be on it's own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"d3ffb38e-7fcf-4547-be9a-6cd8e46f8e5e","Name":"awsInstallLinuxTentacle.octopusEnvironments","Label":"Environments","HelpText":"Environments to assign this tentacle installation to.
\n*Note: Each environment should be on its own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"15150827-7bd3-4146-a798-66344851f602","Name":"instrallTentacle.octoServerUrl","Label":"Octo Server Url","HelpText":"The server url to register the tentacle with. Defaults to the base url","DefaultValue":"#{Octopus.Web.BaseUrl}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9bcd6bb5-2db3-453f-b4f6-6a78f3c39b59","Name":"awsInstallLinuxTentacle.tentacleType","Label":"Tentacle Type","HelpText":"Select between a listing or polling tentacle","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"TentaclePassive|Listening\nTentacleActive|Polling"}},{"Id":"6bb98570-fe3e-4ab7-adfb-79ef7ce5c2ce","Name":"awsInstallLinuxTentacle.tentacleHostName","Label":"Tentacle Host Name","HelpText":"The host name to register the listening tentacles with. Octopus deploy server uses this value to reach out to the vm.
\n*Note: Leave blank to automatically use assigned public IP address.*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"386d9f39-9e90-4215-b739-53a1af5bd105","Name":"awsInstallLinuxTentacle.tentacleName","Label":"Tentacle Name","HelpText":"The name of the tentacle to use in the infrastructure area of octopus deploy. Will use the host name if not provided","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"50621684-c2a5-47c0-9bfe-12f004022e60","Name":"awsInstallLinuxTentacle.portNumber","Label":"Port Number","HelpText":"Port number used when installing and registered tentacle. This is also the port opened on the firewall","DefaultValue":"10933","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{awsInstallLinuxTentacle.AWSAccount}","Octopus.Action.Script.ScriptBody":"$sgName = $OctopusParameters[\"awsInstallLinuxTentacle.awsSGName\"]\n$instanceId = $OctopusParameters[\"awsInstallLinuxTentacle.awsVmInstanceId\"]\n$serverUri = $OctopusParameters[\"instrallTentacle.octoServerUrl\"]\n$apiKey = $OctopusParameters[\"awsInstallLinuxTentacle.octoApiKey\"]\n$rolesRaw = $OctopusParameters[\"awsInstallLinuxTentacle.octopusRoles\"]\n$enviroRaw = $OctopusParameters[\"awsInstallLinuxTentacle.octopusEnvironments\"]\n$octoThumb = $OctopusParameters[\"awsInstallLinuxTentacle.octoServerThumb\"]\n$comStyle = $OctopusParameters[\"awsInstallLinuxTentacle.tentacleType\"]\n$hostname = $OctopusParameters[\"awsInstallLinuxTentacle.tentacleHostName\"]\n$tentacleName = $OctopusParameters[\"awsInstallLinuxTentacle.tentacleName\"]\n$portNumber = $OctopusParameters[\"awsInstallLinuxTentacle.portNumber\"]\n\nWrite-Host \"Parsing Parameters\"\n\nif([string]::IsNullOrEmpty($sgName))\n{\n\tthrow \"Security Group name must be provided\"\n}\n\nif([string]::IsNullOrEmpty($instanceId))\n{\n\tthrow \"Instance Id must be provided\"\n}\n\nif([string]::IsNullOrEmpty($apiKey))\n{\n\tthrow \"apiKey must be provided\"\n}\n\nif([string]::IsNullOrEmpty($rolesRaw))\n{\n\tthrow \"At least one role must be defined\"\n}\n\nif([string]::IsNullOrEmpty($enviroRaw))\n{\n\tthrow \"At least one environment must be defined\"\n}\n\nif([string]::IsNullOrEmpty($octoThumb))\n{\n\tthrow \"octo thumbprint must be provided\"\n}\n\n$roles = \"\"\n$rolesRaw -split \"`n\" | ForEach-Object { $roles += \"--role $_ \"}\n$roles = $roles.TrimEnd(' ')\n\n$environments = \"\"\n$enviroRaw -split \"`n\" | ForEach-Object { $environments += \"--env $_ \"}\n$environments = $environments.TrimEnd(' ')\n\nif($comStyle -eq \"TentaclePassive\")\n{\n\tif([string]::IsNullOrEmpty($hostname))\n {\n \t$hostname = aws ec2 describe-instances --filters \"Name=instance-id,Values=$instanceId\" --query \"Reservations[].Instances[].NetworkInterfaces[].Association.PublicIp\" --output=text\n $hostname = $hostname.Trim(\"`n\")\n }\n \n $noListen = \"--port $portNumber --noListen `\"false`\"\"\n $comStyle += \" --publicHostName='$hostname'\"\n $openFirewall = 'true'\n}\nelse\n{\n\t$noListen = \"--noListen `\"true`\"\"\n $openFirewall = 'false'\n}\n\nif([string]::IsNullOrEmpty($tentacleName))\n{\n\t$tentacleName = $hostname\n}\n\nif($openFirewall -eq 'true')\n{\n\tWrite-Host \"Checking SG...\" -NoNewline\n $sgCheck = aws ec2 describe-security-groups --group-names $sgName --output json --filters Name=ip-permission.from-port,Values=$portNumber Name=ip-permission.cidr,Values='0.0.0.0/0' | convertfrom-json\n \n if($sgCheck.SecurityGroups.count -eq 0)\n {\n\t\tWrite-Host \"Creating SG Rule\"\n \taws ec2 authorize-security-group-ingress --group-name $sgName --ip-permissions IpProtocol=tcp,ToPort=$portNumber,FromPort=$portNumber,IpRanges='[{CidrIp=0.0.0.0/0,Description=\"OctopusListeningTentacle\"}]'\n\t}\n else\n {\n \tWrite-Host \"Found Existing SG Rule\"\n }\n}\n\nWrite-Verbose \"hostname: $hostname`nnoListen: $noListen\"\n\n$remoteScript = @\"\n{\n\t\"commands\": [\n \t\"#!/bin/bash\",\n\t\t\"curl -L https://octopus.com/downloads/latest/Linux_x64TarGz/OctopusTentacle -o /tmp/tentacle-linux_x64.tar.gz -fsS\",\n\t\t\"if [ ! -d \\\"/opt/octopus\\\" ]; then sudo mkdir /opt/octopus; fi\",\n\t\t\"tar xvzf /tmp/tentacle-linux_x64.tar.gz -C /opt/octopus\",\n\t\t\"rm /tmp/tentacle-linux_x64.tar.gz\",\n\t\t\"cd /opt/octopus/tentacle\",\n\t\t\"sudo /opt/octopus/tentacle/Tentacle create-instance --config '/etc/octopus/default/tentacle-default.config'\",\n\t\t\"sudo chmod a+rwx /etc/octopus/default/tentacle-default.config\",\n\t\t\"/opt/octopus/tentacle/Tentacle new-certificate --if-blank\",\n\t\t\"/opt/octopus/tentacle/Tentacle configure --port $portNumber --noListen False --reset-trust --app '/home/Octopus/Applications'\",\n\t\t\"/opt/octopus/tentacle/Tentacle configure --trust $octoThumb\",\n\t\t\"echo 'Registering the Tentacle $name with server $serverUri in environment $environments with role $roles'\",\n\t\t\"/opt/octopus/tentacle/Tentacle register-with --server '$serverUri' --apiKey '$apikey' $environments $roles --comms-style $comStyle --name '$tentacleName' --force\",\n\t\t\"sudo /opt/octopus/tentacle/Tentacle service --install --start\"\n\t]\n}\n\"@\n\nWrite-Host \"Installing tentacle on remote machine\"\n$guid = (new-guid).guid\nSet-Content -Value $remoteScript -Path \"$env:Temp/$guid.json\"\n\nwrite-verbose $remoteScript\n\nwrite-verbose \"aws ssm send-command --document-name `\"AWS-RunShellScript`\" --instance-ids `\"$instanceId`\" --parameters `\"file://$env:Temp/$guid.json`\"\"\ntry {\n\t$cmdResponse = aws ssm send-command --document-name \"AWS-RunShellScript\" --instance-ids \"$instanceId\" --parameters \"file://$env:Temp/$guid.json\" --query \"Command\" --output json | convertfrom-json\n $cmdId = $cmdResponse.CommandId\n $errorResponse = aws ssm get-command-invocation --command-id \"$cmdId\" --instance-id \"$instanceId\" --output json | convertfrom-json\n \n while($errorResponse.Status -eq 'InProgress')\n {\n \twrite-verbose \"`nStatus: $($errorResponse.Status)\"\n \t$errorResponse = aws ssm get-command-invocation --command-id \"$cmdId\" --instance-id \"$instanceId\" --output json | convertfrom-json\n }\n \n write-verbose \"`nErrorResponse: $errorResponse`n\"\n \n if(![string]::IsNullOrEmpty($errorResponse.StandardErrorContent))\n {\n \tthrow $errorResponse.StandardErrorContent\n }\n}\nfinally {\n\tremove-item \"$env:Temp\\$guid.json\"\n}\n","Octopus.Action.Aws.AssumeRole":"False","Octopus.Action.AwsAccount.UseInstanceRole":"False","Octopus.Action.AwsAccount.Variable":"#{awsInstallLinuxTentacle.AWSAccount}","Octopus.Action.Aws.Region":"#{awsInstallLinuxTentacle.awsRegion}"},"Category":"AWS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/aws-linux-install-tentacle.json","Website":"/step-templates/43354ae1-c301-42f8-971d-6e659e4807b3","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":"3dd60fea-b98a-4760-8867-cbd049f7aa31","Name":"AWS RDS SQL Server - Backup to S3 Bucket","Description":"Will create a database user using an existing server user if that database user does not exist without using SMO.","Version":2,"ExportedAt":"2020-08-18T14:30:56.431Z","ActionType":"Octopus.Script","Author":"octopusbob","Packages":[],"Parameters":[{"Id":"3e45bb88-3632-4115-a0d5-54680615f0ca","Name":"rdsSqlBackupSqlServer","Label":"SQL Server","HelpText":"The SQL Server to perform the work on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"880a4e73-64fe-4a36-b4c3-a281b64e3c23","Name":"rdsSqlBackupSqlLoginUserWhoHasCreateUserRights","Label":"SQL Login","HelpText":"The login of the user who has permissions to create a database.\n\nLeave blank for integrated security","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6689fbe5-f47a-4800-945d-df50fc19c7b0","Name":"rdsSqlBackupSqlLoginPasswordWhoHasRights","Label":"SQL Password","HelpText":"The password of the user who has permissions to create SQL Logins\n\nLeave blank for integrated security","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"1a358cca-5cd1-41ae-b763-fcaf2c7350f9","Name":"rdsSqlBackupDatabaseName","Label":"Database Name","HelpText":"The name of the database to create the user on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"c5e2fa69-1b42-4427-91d2-10e1a13af744","Name":"rdsSqlBackupS3Bucket","Label":"S3 Bucket Name","HelpText":"The name of the bucket (including any sub directories).","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ea9d9eb8-9c0f-4c69-a6d4-4d00e43383af","Name":"rdsSqlBackupFileName","Label":"Backup File Name and Extension","HelpText":"The name of the back up file (including the extension).","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"Write-Host \"SqlLoginWhoHasRights $rdsSqlBackupSqlLoginUserWhoHasCreateUserRights\"\nWrite-Host \"CreateSqlServer $rdsSqlBackupSqlServer\"\nWrite-Host \"CreateDatabaseName $rdsSqlBackupDatabaseName\"\nWrite-Host \"Backup S3 Bucket $rdsSqlBackupS3Bucket\"\nWrite-Host \"Backup File Name $rdsSqlBackupFileName\"\n\nif ([string]::IsNullOrWhiteSpace($rdsSqlBackupSqlLoginUserWhoHasCreateUserRights) -eq $true){\n\tWrite-Host \"No username found, using integrated security\"\n $connectionString = \"Server=$rdsSqlBackupSqlServer;Database=msdb;integrated security=true;\"\n}\nelse {\n\tWrite-Host \"Username found, using SQL Authentication\"\n $connectionString = \"Server=$rdsSqlBackupSqlServer;Database=msdb;User ID=$rdsSqlBackupSqlLoginUserWhoHasCreateUserRights;Password=$rdsSqlBackupSqlLoginPasswordWhoHasRights;\"\n}\n\n$sqlConnection = New-Object System.Data.SqlClient.SqlConnection\n$sqlConnection.ConnectionString = $connectionString\n\n$command = New-Object System.Data.SqlClient.SqlCommand(\"dbo.rds_backup_database\", $sqlConnection)\n$command.CommandType = [System.Data.CommandType]'StoredProcedure'\n\n$backupDestParamValue = \"arn:aws:s3:::$rdsSqlBackupS3Bucket/$rdsSqlBackupFileName\"\n$command.Parameters.AddWithValue(\"s3_arn_to_backup_to\", $backupDestParamValue)\n$command.Parameters.AddWithValue(\"overwrite_S3_backup_file\", 1)\n$command.Parameters.AddWithValue(\"source_db_name\", $rdsSqlBackupDatabaseName)\n\n$taskStatusCommand = New-Object System.Data.SqlClient.SqlCommand(\"dbo.rds_task_status\", $sqlConnection)\n$taskStatusCommand.CommandType = [System.Data.CommandType]'StoredProcedure'\n$taskStatusCommand.Parameters.AddWithValue(\"db_name\", $rdsSqlBackupDatabaseName)\n\n$taskStatusAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $taskStatusCommand\n\nWrite-Host \"Opening the connection to $rdsSqlBackupSqlServer\"\n$sqlConnection.Open()\n \nWrite-Host \"Executing backup\"\n$command.ExecuteNonQuery()\n\nWrite-Host \"Closing the connection to $rdsSqlBackupSqlServer\"\n$sqlConnection.Close()\n\nWrite-Host \"Getting status of backup\"\n$backupIsActive = $true\n\nWhile ($backupIsActive)\n{\n\tWrite-Host \"Opening the connection to $rdsSqlBackupSqlServer\"\n\t$sqlConnection.Open()\n \n $taskStatusDataSet = New-Object System.Data.DataSet\n\t$taskStatusAdapter.Fill($taskStatusDataSet)\n $taskStatus = $taskStatusDataSet.Tables[0].Rows[0][\"lifecycle\"]\n $taskComplete = $taskStatusDataSet.Tables[0].Rows[0][\"% complete\"]\n \n Write-Host \"The task is $taskComplete% complete.\"\n $backupIsActive = $taskStatus -eq \"CREATED\" -or $taskStatus -eq \"IN_PROGRESS\"\n \n Write-Host \"Closing the connection to $rdsSqlBackupSqlServer\"\n\t$sqlConnection.Close()\n \n Start-Sleep -Seconds 5\n}"},"Category":"AWS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/aws-rds-sql-backup-s3.json","Website":"/step-templates/3dd60fea-b98a-4760-8867-cbd049f7aa31","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":"55848421-44b9-403c-b1f0-ba8a84b1f177","Name":"AWS RDS SQL Server - Restore from S3 Bucket","Description":"Will restore a database backup from an S3 bucket","Version":2,"ExportedAt":"2020-08-18T13:27:31.393Z","ActionType":"Octopus.Script","Author":"octopusbob","Packages":[],"Parameters":[{"Id":"3e45bb88-3632-4115-a0d5-54680615f0ca","Name":"rdsSqlRestoreBackupSqlServer","Label":"SQL Server","HelpText":"The SQL Server to perform the work on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"880a4e73-64fe-4a36-b4c3-a281b64e3c23","Name":"rdsSqlRestoreBackupSqlLoginUserWhoHasCreateUserRights","Label":"SQL Login","HelpText":"The login of the user who has permissions to create a database.\n\nLeave blank for integrated security","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6689fbe5-f47a-4800-945d-df50fc19c7b0","Name":"rdsSqlRestoreBackupSqlLoginPasswordWhoHasRights","Label":"SQL Password","HelpText":"The password of the user who has permissions to create SQL Logins\n\nLeave blank for integrated security","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"1a358cca-5cd1-41ae-b763-fcaf2c7350f9","Name":"rdsSqlRestoreBackupDatabaseName","Label":"Database Name","HelpText":"The name of the database to restore to","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"c5e2fa69-1b42-4427-91d2-10e1a13af744","Name":"rdsSqlRestoreBackupS3Bucket","Label":"S3 Bucket Name","HelpText":"The name of the bucket (including any sub directories).","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ea9d9eb8-9c0f-4c69-a6d4-4d00e43383af","Name":"rdsSqlRestoreBackupFileName","Label":"Backup File Name and Extension","HelpText":"The name of the back up file (including the extension).","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"Write-Host \"SqlLoginWhoHasRights $rdsSqlRestoreBackupSqlLoginUserWhoHasCreateUserRights\"\nWrite-Host \"CreateSqlServer $rdsSqlRestoreBackupSqlServer\"\nWrite-Host \"CreateDatabaseName $rdsSqlRestoreBackupDatabaseName\"\nWrite-Host \"Backup S3 Bucket $rdsSqlRestoreBackupS3Bucket\"\nWrite-Host \"Backup File Name $rdsSqlRestoreBackupFileName\"\n\nif ([string]::IsNullOrWhiteSpace($rdsSqlRestoreBackupSqlLoginUserWhoHasCreateUserRights) -eq $true){\n\tWrite-Host \"No username found, using integrated security\"\n $connectionString = \"Server=$rdsSqlRestoreBackupSqlServer;Database=msdb;integrated security=true;\"\n}\nelse {\n\tWrite-Host \"Username found, using SQL Authentication\"\n $connectionString = \"Server=$rdsSqlRestoreBackupSqlServer;Database=msdb;User ID=$rdsSqlRestoreBackupSqlLoginUserWhoHasCreateUserRights;Password=$rdsSqlRestoreBackupSqlLoginPasswordWhoHasRights;\"\n}\n\n$sqlConnection = New-Object System.Data.SqlClient.SqlConnection\n$sqlConnection.ConnectionString = $connectionString\n\n$command = New-Object System.Data.SqlClient.SqlCommand(\"dbo.rds_restore_database\", $sqlConnection)\n$command.CommandType = [System.Data.CommandType]'StoredProcedure'\n\n$backupDestParamValue = \"arn:aws:s3:::$rdsSqlRestoreBackupS3Bucket/$rdsSqlRestoreBackupFileName\"\n$command.Parameters.AddWithValue(\"s3_arn_to_restore_from\", $backupDestParamValue)\n$command.Parameters.AddWithValue(\"with_norecovery\", 0)\n$command.Parameters.AddWithValue(\"restore_db_name\", $rdsSqlRestoreBackupDatabaseName)\n\n$taskStatusCommand = New-Object System.Data.SqlClient.SqlCommand(\"dbo.rds_task_status\", $sqlConnection)\n$taskStatusCommand.CommandType = [System.Data.CommandType]'StoredProcedure'\n$taskStatusCommand.Parameters.AddWithValue(\"db_name\", $rdsSqlRestoreBackupDatabaseName)\n\n$taskStatusAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $taskStatusCommand\n\nWrite-Host \"Opening the connection to $rdsSqlRestoreBackupSqlServer\"\n$sqlConnection.Open()\n \nWrite-Host \"Executing backup\"\n$command.ExecuteNonQuery()\n\nWrite-Host \"Closing the connection to $rdsSqlRestoreBackupSqlServer\"\n$sqlConnection.Close()\n\nWrite-Host \"Getting status of backup\"\n$backupIsActive = $true\n\nWhile ($backupIsActive)\n{\n\tWrite-Host \"Opening the connection to $rdsSqlRestoreBackupSqlServer\"\n\t$sqlConnection.Open()\n \n $taskStatusDataSet = New-Object System.Data.DataSet\n\t$taskStatusAdapter.Fill($taskStatusDataSet)\n $taskStatus = $taskStatusDataSet.Tables[0].Rows[0][\"lifecycle\"]\n $taskComplete = $taskStatusDataSet.Tables[0].Rows[0][\"% complete\"]\n \n Write-Host \"The task is $taskComplete% complete.\"\n $backupIsActive = $taskStatus -eq \"CREATED\" -or $taskStatus -eq \"IN_PROGRESS\"\n \n Write-Host \"Closing the connection to $rdsSqlRestoreBackupSqlServer\"\n\t$sqlConnection.Close()\n \n Start-Sleep -Seconds 5\n}"},"Category":"AWS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/aws-rds-restore-s3.json","Website":"/step-templates/55848421-44b9-403c-b1f0-ba8a84b1f177","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":"234ed1c6-a5fa-47ee-8669-a187d8787057","Name":"AWS Win - Install Octopus Tentacle","Description":"This step template will install the latest tentacle on an AWS hosted, Windows virtual machine. This will also open the firewall for inbound traffic on port 10933 on the Security Group.\n
\n*Note: Expects the AWS CLI and Powershell to be installed on the worker running this task*","Version":1,"ExportedAt":"2020-09-10T16:47:02.016Z","ActionType":"Octopus.AwsRunScript","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"dea51842-271f-48fa-901e-243488049f97","Name":"awsInstallWinTentacle.AWSAccount","Label":"AWS Account","HelpText":"AWS account with permissions to the virtual machine in which to install the tentacle on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AmazonWebServicesAccount"}},{"Id":"6a97548c-3b97-4a19-8b9a-45aa58ac62d9","Name":"awsInstallWinTentacle.awsRegion","Label":"AWS Region","HelpText":"The name of the aws region. I.E. `us-east-1`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"d9efb017-65c0-4010-b09f-0a6a34fc009f","Name":"awsInstallWinTentacle.awsSGName","Label":"Security Group Name","HelpText":"The name of the AWS security group to create an exception in","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e4358aec-2798-412a-bcd2-1c7e41a0728d","Name":"awsInstallWinTentacle.awsVmInstanceId","Label":"VM Instance ID","HelpText":"The instance ID of the virtual machine to target when ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8dbe0a29-4e0f-43f8-8ef2-ae23a2884e85","Name":"awsInstallWinTentacle.octoServerThumb","Label":"Server Thumbprint","HelpText":"The Thumbprint of the octopus server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"a0859551-6c84-45d1-af2b-c57becb4e8ef","Name":"awsInstallWinTentacle.octoApiKey","Label":"Octo User API Key","HelpText":"The API key used to configure the tentacle.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"dd07815d-bfb7-43b9-90f8-21ec5a2d2953","Name":"awsInstallWinTentacle.octopusRoles","Label":"Roles","HelpText":"Roles to assign to this tentacle installation.
\n*Note: Each role should be on it's own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"d3ffb38e-7fcf-4547-be9a-6cd8e46f8e5e","Name":"awsInstallWinTentacle.octopusEnvironments","Label":"Environments","HelpText":"Environments to assign this tentacle installation to.
\n*Note: Each environment should be on its own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"15150827-7bd3-4146-a798-66344851f602","Name":"instrallTentacle.octoServerUrl","Label":"Octo Server Url","HelpText":"The server url to register the tentacle with. Defaults to the base url","DefaultValue":"#{Octopus.Web.BaseUrl}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9bcd6bb5-2db3-453f-b4f6-6a78f3c39b59","Name":"awsInstallWinTentacle.tentacleType","Label":"Tentacle Type","HelpText":"Select between a listening or polling tentacle","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"TentaclePassive|Listening\nTentacleActive|Polling"}},{"Id":"6bb98570-fe3e-4ab7-adfb-79ef7ce5c2ce","Name":"awsInstallWinTentacle.tentacleHostName","Label":"Tentacle Host Name","HelpText":"The host name to register the listening tentacles with. Octopus deploy server uses this value to reach out to the vm.
\n*Note: Leave blank to automatically use assigned public IP address.*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"386d9f39-9e90-4215-b739-53a1af5bd105","Name":"awsInstallWinTentacle.tentacleName","Label":"Tentacle Name","HelpText":"The name of the tentacle to use in the infrastructure area of octopus deploy. Will use the host name if not provided","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"2dc806d8-bba5-44a7-b21d-4b3f041f4d49","Name":"awsInstallWinTentacle.portNumber","Label":"Port Number","HelpText":"Port number used when installing and registering the tentacle. This is also the port opened on the firewall","DefaultValue":"10933","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{awsInstallWinTentacle.AWSAccount}","Octopus.Action.Script.ScriptBody":"$sgName = $OctopusParameters[\"awsInstallWinTentacle.awsSGName\"]\n$instanceId = $OctopusParameters[\"awsInstallWinTentacle.awsVmInstanceId\"]\n$serverUri = $OctopusParameters[\"awsInstallWinTentacle.octoServerUrl\"]\n$apiKey = $OctopusParameters[\"awsInstallWinTentacle.octoApiKey\"]\n$rolesRaw = $OctopusParameters[\"awsInstallWinTentacle.octopusRoles\"]\n$enviroRaw = $OctopusParameters[\"awsInstallWinTentacle.octopusEnvironments\"]\n$octoThumb = $OctopusParameters[\"awsInstallWinTentacle.octoServerThumb\"]\n$comStyle = $OctopusParameters[\"awsInstallWinTentacle.tentacleType\"]\n$hostname = $OctopusParameters[\"awsInstallWinTentacle.tentacleHostName\"]\n$tentacleName = $OctopusParameters[\"awsInstallWinTentacle.tentacleName\"]\n$portNumber = $OctopusParameters[\"awsInstallWinTentacle.portNumber\"]\n\nWrite-Host \"Parsing Parameters\"\n\nif([string]::IsNullOrEmpty($sgName))\n{\n\tthrow \"Security Group name must be provided\"\n}\n\nif([string]::IsNullOrEmpty($instanceId))\n{\n\tthrow \"Instance Id must be provided\"\n}\n\nif([string]::IsNullOrEmpty($apiKey))\n{\n\tthrow \"apiKey must be provided\"\n}\n\nif([string]::IsNullOrEmpty($rolesRaw))\n{\n\tthrow \"At least one role must be defined\"\n}\n\nif([string]::IsNullOrEmpty($enviroRaw))\n{\n\tthrow \"At least one environment must be defined\"\n}\n\nif([string]::IsNullOrEmpty($octoThumb))\n{\n\tthrow \"octo thumbprint must be provided\"\n}\n\n$roles = \"\"\n$rolesRaw -split \"`n\" | ForEach-Object { $roles += \"--role $_ \"}\n$roles = $roles.TrimEnd(' ')\n\n$environments = \"\"\n$enviroRaw -split \"`n\" | ForEach-Object { $environments += \"--env $_ \"}\n$environments = $environments.TrimEnd(' ')\n\nif($comStyle -eq \"TentaclePassive\")\n{\n\tif([string]::IsNullOrEmpty($hostname))\n {\n \t$hostname = aws ec2 describe-instances --filters \"Name=instance-id,Values=$instanceId\" --query \"Reservations[].Instances[].NetworkInterfaces[].Association.PublicIp\" --output=text\n $hostname = $hostname.Trim(\"`n\")\n }\n\n $noListen = \"--port $portNumber --noListen 'false'\"\n $comStyle += \" --publicHostName='$hostname'\"\n $openFirewall = 'true'\n}\nelse\n{\n\t$noListen = \"--noListen 'true'\"\n $openFirewall = 'false'\n}\n\nif([string]::IsNullOrEmpty($tentacleName))\n{\n\t$tentacleName = $hostname\n}\n\nif($openFirewall -eq 'true')\n{\n\tWrite-Host \"Checking SG...\" -NoNewline\n $sgCheck = aws ec2 describe-security-groups --group-names $sgName --output json --filters Name=ip-permission.from-port,Values=$portNumber Name=ip-permission.cidr,Values='0.0.0.0/0' | convertfrom-json\n\n if($sgCheck.SecurityGroups.count -eq 0)\n {\n\t\tWrite-Host \"Creating SG Rule\"\n \taws ec2 authorize-security-group-ingress --group-name $sgName --ip-permissions IpProtocol=tcp,ToPort=$portNumber,FromPort=$portNumber,IpRanges='[{CidrIp=0.0.0.0/0,Description=\"OctopusListeningTentacle\"}]'\n\t}\n else\n {\n \tWrite-Host \"Found Existing SG Rule\"\n }\n}\n$remoteGuid = (new-guid).guid\nWrite-Verbose \"hostname: $hostname`nnoListen: $noListen\"\n\n$remoteScript = @\"\n{ \"commands\": [\n\"if('$env:PROCESSOR_ARCHITECTURE' -eq \\\"x86\\\") {Invoke-WebRequest -Uri 'http://octopus.com/downloads/latest/OctopusTentacle' -OutFile `$env:TEMP/$remoteGuid.msi -UseBasicParsing} else { Invoke-WebRequest -Uri 'http://octopus.com/downloads/latest/OctopusTentacle64' -OutFile `$env:TEMP/$remoteGuid.msi -UseBasicParsing}\",\n\"Start-Process `$env:TEMP/$remoteGuid.msi /quiet -Wait\",\n\"Remove-Item \\\"`$env:TEMP/$remoteGuid.msi\\\"\",\n\"cd 'C:/Program Files/Octopus Deploy/Tentacle'\",\n\".\\\\Tentacle.exe create-instance --instance 'Tentacle' --config 'C:/Octopus/Tentacle.config' --console\",\n\".\\\\Tentacle.exe new-certificate --instance 'Tentacle' --if-blank --console\",\n\".\\\\Tentacle.exe configure --instance 'Tentacle' --reset-trust --console\",\n\".\\\\Tentacle.exe configure --instance 'Tentacle' --home 'C:/Octopus/' --app 'C:/Octopus/Applications' $noListen --console\",\n\".\\\\Tentacle.exe configure --instance 'Tentacle' --trust '$octoThumb' --console\",\n\"if('$openFirewall' -eq 'true'){New-NetFirewallRule -DisplayName 'Octopus Tentacle' -Direction Inbound -LocalPort $portNumber -Protocol TCP -Action Allow}\",\n\".\\\\Tentacle.exe register-with --instance 'Tentacle' --server '$serverUri' --apiKey=$apiKey $roles $environments --comms-style $comStyle --force --console\",\n\".\\\\Tentacle.exe service --instance 'Tentacle' --install --start --console\"\n]}\n\"@\n\nWrite-Host \"Installing tentacle on remote machine\"\n$guid = (new-guid).guid\nSet-Content -Value $remoteScript.Replace('`r','') -Path \"$env:Temp/$guid.json\"\n\nwrite-verbose $remoteScript\n\nwrite-verbose \"aws ssm send-command --document-name AWS-RunPowerShellScript --instance-ids $instanceId --parameters file://$env:Temp/$guid.json\"\ntry {\n\t$cmdResponse = aws ssm send-command --document-name \"AWS-RunPowerShellScript\" --instance-ids \"$instanceId\" --parameters \"file://$env:Temp/$guid.json\" --query \"Command\" --output json | convertfrom-json\n $cmdId = $cmdResponse.CommandId\n $errorResponse = aws ssm get-command-invocation --command-id \"$cmdId\" --instance-id \"$instanceId\" --output json | convertfrom-json\n\n while($errorResponse.Status -eq 'InProgress')\n {\n \twrite-verbose \"`nStatus: $($errorResponse.Status)\"\n \t$errorResponse = aws ssm get-command-invocation --command-id \"$cmdId\" --instance-id \"$instanceId\" --output json | convertfrom-json\n }\n\n write-verbose \"`nErrorResponse: $errorResponse`n\"\n\n if(![string]::IsNullOrEmpty($errorResponse.StandardErrorContent))\n {\n \tthrow $errorResponse.StandardErrorContent\n }\n}\nfinally {\n\tremove-item \"$env:Temp\\$guid.json\"\n}\n","Octopus.Action.Aws.AssumeRole":"False","Octopus.Action.AwsAccount.UseInstanceRole":"False","Octopus.Action.AwsAccount.Variable":"#{awsInstallWinTentacle.AWSAccount}","Octopus.Action.Aws.Region":"#{awsInstallWinTentacle.awsRegion}"},"Category":"AWS","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/aws-windows-install-tentacle.json","Website":"/step-templates/234ed1c6-a5fa-47ee-8669-a187d8787057","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":"38791635-a3fc-4b26-bcd7-b65f0f6de5d2","Name":"Azure - Backup Table Storage to Blob","Description":"This script allow to backup the specified azure table storage into the specified blob.","Version":6,"ExportedAt":"2016-11-30T16:22:50.113Z","ActionType":"Octopus.Script","Author":"phuot","Parameters":[{"Name":"sourceStorageAccountName","Label":"Source Storage Account Name","HelpText":"Name of the source storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"sourceStorageAccountKey","Label":"Source Storage Account Key","HelpText":"Key of the source storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"sourceTableName","Label":"Source Table Name","HelpText":"Name of the Source Azure Table","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"destinationStorageAccountName","Label":"Destination Storage Account Name","HelpText":"Name of the destination storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"destinationStorageAccountKey","Label":"Destination Storage Account Key","HelpText":"Key of the destination storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"IsEnabled","Label":"IsEnabled","HelpText":null,"DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"True\nFalse"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"if($IsEnabled -eq \"True\")\n{\nWrite-Output \"Starting Backup the Azure table 'https://$sourceStorageAccountName.table.core.windows.net/$sourceTableName' to the Blob 'https://$destinationStorageAccountName.blob.core.windows.net/$sourceStorageAccountName-$sourceTableName'\"\n\n& \"${Env:ProgramFiles(x86)}\\Microsoft SDKs\\Azure\\AzCopy\\azCopy.exe\" `\n /Source:https://$sourceStorageAccountName.table.core.windows.net/$sourceTableName/ `\n /Dest:https://$destinationStorageAccountName.blob.core.windows.net/$sourceStorageAccountName-$sourceTableName/ `\n /SourceKey:$sourceStorageAccountKey `\n /Destkey:$destinationStorageAccountKey `\n /y\n\nWrite-Output \"Backup Completed\"\n}\nelse\n{\n Write-Output \"This Step is disabled\"\n}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/Azure-Backup-TableStorage-to-Blob.json","Website":"/step-templates/38791635-a3fc-4b26-bcd7-b65f0f6de5d2","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":"dd2b147c-3f20-42e1-a94c-17b157a0f0a4","Name":"Azure - Capture AzureRM Virtual Machine Image","Description":"Prepares an AzureRM Virtual Machine (Managed Disk or Storage Account based) and captures a [Managed Image](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource) or [Image VHD](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image):\n1. Runs Sysprep\n2. Deallocates & Generalizes VM\n3. Creates Managed Image or Image VHD\n4. Removes virtual machine resource group","Version":1,"ExportedAt":"2017-05-29T18:58:54.733Z","ActionType":"Octopus.AzurePowerShell","Author":"paulmarsy","Parameters":[{"Id":"911668fe-9653-4f08-892c-0e103e72cad0","Name":"StepTemplate_Account","Label":"Octopus Azure Account","HelpText":"Select the [account id](#/accounts) to use for the connection.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"b838a80e-3e49-4788-8302-6b64bf0159ea","Name":"StepTemplate_ResourceGroupName","Label":"Resource Group Name","HelpText":"Name of the Azure Resource Group containing the Virtual Machine.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"8be775a8-53e4-4740-ae0f-10d72f9fdc67","Name":"StepTemplate_VMName","Label":"Virtual Machine Name","HelpText":"The name of the AzureRM Virtual Machine to capture. This VM will be shut down & generalized.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"73dae502-7a82-461c-a82b-8c40f519611f","Name":"StepTemplate_ImageType","Label":"Image Type","HelpText":"Desired type of image to capture from the Virtual Machine.","DefaultValue":"managed","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"managed|Managed Image\nunmanaged|Storage Account VHD"},"Links":{}},{"Id":"111b827b-a2c2-4d57-895e-b18daf9c6344","Name":"StepTemplate_ImageDest","Label":"Image Destination","HelpText":"Where the image should be created.\n\n**Managed Images** should enter a _Resource Group_ name\n\n**Storage Account VHDs** should enter a _Storage Account_ name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"f461eac4-565c-47e6-8bf0-923f9647e3b2","Name":"StepTemplate_ImageName","Label":"Image Name","HelpText":"Name to use when creating the image.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"ba0ea0f4-710c-4732-8fb4-9f9b4faf325b","Name":"StepTemplate_DeleteVMResourceGroup","Label":"Delete VM Resource Group?","HelpText":"Delete the virtual machine resource group after an image has been captured.\n\n**Once a Virtual Machine is marked as generalized Azure will prevent it from being started or modified.**","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}}],"Properties":{"Octopus.Action.Azure.AccountId":"#{StepTemplate_Account}","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"<#\n ----- Capture AzureRM Virtual Machine Image ----- \n Paul Marston @paulmarsy (paul@marston.me)\nLinks\n https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-capture-virtualmachine-image.json\n \nThe sequence of steps performed by the step template:\n 1) Virtual Machine prep\n a) PowerState/running - Custom script extension is used to sysprep & shutdown\n b) PowerState/stopped - only when the VM is shutdown by the OS, if Azure stops the VM it is automatically deallocated\n c) PowerState/deallocated\n d) OSState/generalized\n 2) Image capture\n - Managed VM & Managed Image - New image with VM as source\n - Managed VM & Unmanaged VHD - Access to the underlying blob is granted, and the VHD copied into the specified storage account\n - Unmanaged VM & Managed Image - New image with VM as source\n - Unmanaged VM & Unmanaged VHD - VM image is saved, a SAS token is generated and it is copied from the VM's storage account into the specified storage account\n 3) Virtual machine cleanup.\n Once a VM has been marked as 'generalized' Azure will no longer allow it to be started up, making the VM unusable\n If the delete option is selected, and the image just created has been moved outside the VM's resource group \n \n----- Advanced Configuration Settings -----\nVariable names can use either of the following two formats: \n Octopus.Action. - will apply to all steps in the deployment, e.g.\n Octopus.Action.DebugLogging\n Octopus.Action[Step Name]. - will apply to 'step name' alone, e.g.\n Octopus.Action[Capture Web VM Image].StorageAccountKey\n\nAvailable Settings:\n VhdDestContainer - overrides the default container that an unmanaged VHD image is copied to, default is 'images'\n StorageAccountKey - allows copying to a storage account in a different subscription by using the providing the key, default is null\n#>\n#Requires -Modules AzureRM.Resources\n#Requires -Modules AzureRM.Compute\n#Requires -Modules AzureRM.Storage\n#Requires -Modules Azure.Storage\n\n$ErrorActionPreference = 'Stop'\n\n<#---------- SysPrep Script - Begin ----------#>\n<#\n Sysprep marker file: C:\\WindowsAzure\\sysprep\n 1) If marker file exists, sysprep has already been run so exit script\n 2) Start a new powershell process and exit with code 0, this allows the custom script extension to report back as having run successfully to Azure\n a) In the child script wait until the successful exit code has been logged\n b) Create the marker file\n c) Run sysprep\n#>\n$SysPrepScript = @'\nif (Test-Path \"${env:SystemDrive}\\WindowsAzure\\sysprep\") { return }\n\nStart-Process -FilePath 'powershell.exe' -ArgumentList @('-NonInteractive','-NoProfile',('-EncodedCommand {0}' -f ([System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes({\n do {\n Start-Sleep -Seconds 1\n $status = Get-ChildItem \"${env:SystemDrive}\\Packages\\Plugins\\Microsoft.Compute.CustomScriptExtension\\*\\Status\\\" -File | Sort-Object LastWriteTime -Descending | Select-Object -First 1 | Get-Content | ConvertFrom-Json\n } while ($status[0].status.code -ne 0)\n New-Item -ItemType File -Path \"${env:SystemDrive}\\WindowsAzure\\sysprep\" -Force | Out-Null\n & (Join-Path -Resolve ([System.Environment]::SystemDirectory) 'sysprep\\sysprep.exe') /oobe /generalize /quiet /shutdown\n}.ToString())))))\n\nexit 0\n'@\n<#---------- SysPrep Script - End ----------#>\n\nfunction Get-OctopusSetting {\n param([Parameter(Position = 0, Mandatory)][string]$Name, [Parameter(Position = 1)]$DefaultValue)\n $formattedName = 'Octopus.Action.{0}' -f $Name\n if ($OctopusParameters.ContainsKey($formattedName)) {\n $value = $OctopusParameters[$formattedName]\n if ($DefaultValue -is [int]) { return ([int]::Parse($value)) }\n if ($DefaultValue -is [bool]) { return ([System.Convert]::ToBoolean($value)) }\n if ($DefaultValue -is [array] -or $DefaultValue -is [hashtable] -or $DefaultValue -is [pscustomobject]) { return (ConvertFrom-Json -InputObject $value) }\n return $value\n }\n else { return $DefaultValue }\n}\nfunction Test-String {\n param([Parameter(Position=0)]$InputObject,[switch]$ForAbsence)\n\n $hasNoValue = [System.String]::IsNullOrWhiteSpace($InputObject)\n if ($ForAbsence) { $hasNoValue }\n else { -not $hasNoValue }\n}\nfilter Out-Verbose {\n Write-Verbose ($_ | Out-String)\n}\nfunction Split-BlobUri {\n param($Uri)\n $uriRegex = [regex]::Match($Uri, '(?>https:\\/\\/)(?[a-z0-9]{3,24})\\.blob\\.core\\.windows\\.net\\/(?[-a-z0-9]{3,63})\\/(?.+)')\n if (!$uriRegex.Success) {\n throw \"Unable to parse blob uri: $Uri\"\n }\n [pscustomobject]@{\n Account = $uriRegex.Groups['Account'].Value\n Container = $uriRegex.Groups['Container'].Value\n Blob = $uriRegex.Groups['Blob'].Value\n }\n}\nfunction Get-AzureRmAccessToken {\n # https://github.com/paulmarsy/AzureRest/blob/master/Internals/Get-AzureRmAccessToken.ps1\n $accessToken = Invoke-RestMethod -UseBasicParsing -Uri ('https://login.microsoftonline.com/{0}/oauth2/token?api-version=1.0' -f $OctopusAzureADTenantId) -Method Post -Body @{\"grant_type\" = \"client_credentials\"; \"resource\" = \"https://management.core.windows.net/\"; \"client_id\" = $OctopusAzureADClientId; \"client_secret\" = $OctopusAzureADPassword }\n [System.Net.Http.Headers.AuthenticationHeaderValue]::new('Bearer', $accessToken.access_token).ToString()\n}\nfunction Get-TemporarySasBlob {\n param($BlobName)\n # https://github.com/paulmarsy/AzureRest/blob/master/Exported/New-AzureBlob.ps1\n $sasToken = Invoke-RestMethod -UseBasicParsing -Uri 'https://mscompute2.iaas.ext.azure.com/api/Compute/VmExtensions/GetTemporarySas/' -Headers @{\n [Microsoft.WindowsAzure.Commands.Common.ApiConstants]::AuthorizationHeaderName = (Get-AzureRmAccessToken)\n }\n $containerSas = [uri]::new($sasToken)\n $container = [Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer]::new($containerSas)\n $blobRef = $container.GetBlockBlobReference($BlobName)\n \n [psobject]@{\n Blob = $blobRef\n Uri = [uri]::new($blobRef.Uri.AbsoluteUri + $containerSas.Query)\n }\n}\n\n'Checking AzureRM Modules...' | Out-Verbose\nGet-Module | ? Name -like 'AzureRM.*' | Format-Table -AutoSize -Property Name,Version | Out-String | Out-Verbose\nif ((Get-Module AzureRM.Compute | % Version) -lt '2.6.0') {\n $bundledErrorMessage = if ([System.Convert]::ToBoolean($OctopusUseBundledAzureModules)) {\n 'The Azure PowerShell Modules bundled with Octopus have been loaded. To use the version installed on the server create a variable named \"Octopus.Action.Azure.UseBundledAzurePowerShellModules\" and set its value to \"False\".'\n }\n throw \"${bundledErrorMessage}Please ensure version 2.6.0 or newer of the AzureRM.Compute module has been installed. The module can be installed with the PowerShell command: Install-Module AzureRM.Compute -MinimumVersion 2.6.0\"\n}\n\n$vm = Get-AzureRmVM -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -WarningAction SilentlyContinue\nif ($null -eq $vm) {\n throw \"Unable to find virtual machine '$StepTemplate_VMName' in resource group '$StepTemplate_ResourceGroupName'\"\n}\nWrite-Host \"Image will be captured from Virtual Machine '$($vm.Name)' in resource group '$($vm.ResourceGroupName)'\"\nif (Test-String $StepTemplate_ImageDest -ForAbsence) {\n throw \"The Image Destination parameter is required\"\n}\n$StepTemplate_ImageStorageContext = if ($StepTemplate_ImageType -eq 'unmanaged') {\n $storageAccountKey = Get-OctopusSetting StorageAccountKey $null\n if (Test-String $storageAccountKey) {\n Write-Host \"Image will be copied to storage account context '$StepTemplate_ImageDest' using provided key\"\n New-AzureStorageContext -StorageAccountName $StepTemplate_ImageDest -StorageAccountKey $storageAccountKey\n } else {\n $storageAccountResource = Find-AzureRmResource -ResourceNameEquals $StepTemplate_ImageDest -ResourceType Microsoft.Storage/storageAccounts\n if ($storageAccountResource) {\n Write-Host \"Image will be copied to storage account '$($storageAccountResource.Name)' found in resource group '$($storageAccountResource.ResourceGroupName)'\"\n } else {\n throw \"Unable to find storage account '$StepTemplate_ImageDest'\"\n }\n Get-AzureRmStorageAccount -ResourceGroupName $storageAccountResource.ResourceGroupName -Name $storageAccountResource.Name | % Context\n }\n}\n$StepTemplate_ImageResourceGroupName = switch ($StepTemplate_ImageType) {\n 'managed' {\n $resourceGroup = Get-AzureRmResourceGroup -Name $StepTemplate_ImageDest | % ResourceGroupName \n Write-Host \"Managed Image will be created in resource group '$resourceGroup'\"\n $resourceGroup\n }\n 'unmanaged' { Find-AzureRmResource -ResourceNameEquals $StepTemplate_ImageDest -ResourceType Microsoft.Storage/storageAccounts | % ResourceGroupName }\n}\nif ($StepTemplate_ImageResourceGroupName -ieq $StepTemplate_ResourceGroupName -and $StepTemplate_DeleteVMResourceGroup -ieq 'True') {\n throw \"You have chosen to delete the virtual machine and it's resource group ($StepTemplate_ResourceGroupName), however this resource group is also where the captured image will be created!\"\n}\n\nWrite-Host ('-'*80)\nWrite-Host \"Preparing virtual machine $($vm.Name) for image capture...\"\n\n$sysprepRun = $false\nwhile ($true) {\n $statusCode = Get-AzureRmVM -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -Status -WarningAction SilentlyContinue | % Statuses | % Code\n if ($statusCode -contains 'OSState/generalized') {\n Write-Host 'VM is deallocated & generalized, proceeding to image capture...'\n break\n }\n if ($statusCode -contains 'PowerState/deallocated') {\n Write-Host 'VM has been deallocated, setting state to generalized... '\n Set-AzureRmVM -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -Generalized | Out-Verbose\n continue\n }\n if ($statusCode -contains 'PowerState/deallocating') {\n Write-Host 'VM is deallocating, waiting...'\n Start-Sleep 30\n continue\n }\n if ($statusCode -contains 'PowerState/stopped') {\n Write-Host 'VM has been shutdown, starting deallocation...'\n Stop-AzureRmVm -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -Force | Out-Verbose\n continue\n }\n if ($statusCode -contains 'PowerState/stopping') {\n Write-Host 'VM is stopping, waiting...'\n Start-Sleep 30\n continue\n }\n if ($statusCode -contains 'PowerState/running' -and $sysprepRun) {\n Write-Host 'VM is running, but sysprep already deployed, waiting...'\n Start-Sleep 30\n continue\n }\n if ($statusCode -contains 'PowerState/running') {\n Write-Host 'VM is running, performing sysprep...'\n $existingCustomScriptExtensionName = $vm.Extensions | ? VirtualMachineExtensionType -eq 'CustomScriptExtension' | % Name\n if ($existingCustomScriptExtensionName) {\n Write-Warning \"Removing existing CustomScriptExtension ($existingCustomScriptExtensionName)...\"\n Remove-AzureRmVMCustomScriptExtension -ResourceGroupName $StepTemplate_ResourceGroupName -VMName $StepTemplate_VMName -Name $existingCustomScriptExtensionName -Force | Out-Verbose\n }\n \n Write-Host 'Uploading sysprep script to blob storage...'\n $sysprepScriptFileName = 'Sysprep.ps1'\n $sysprepScriptBlob = Get-TemporarySasBlob $sysprepScriptFileName\n $sysprepScriptBlob.Blob.UploadText($SysPrepScript)\n \n Write-Host 'Deploying sysprep custom script extension...'\n Set-AzureRmVMCustomScriptExtension -ResourceGroupName $StepTemplate_ResourceGroupName -VMName $StepTemplate_VMName -Name 'Sysprep' -Location $vm.Location -FileUri $sysprepScriptBlob.Uri -Run $sysprepScriptFileName -ForceRerun (Get-Date).Ticks | Out-Verbose\n $sysprepRun = $true\n continue\n }\n Write-Warning \"VM is in an unknown state. Current status codes: $($statusCode -join ', '). Waiting...\"\n Start-Sleep -Seconds 30\n}\n\nWrite-Host ('-'*80)\n\nWrite-Host 'Retrieving virtual machine disk configuration...'\n$vm = Get-AzureRmVM -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -WarningAction SilentlyContinue \n$isManagedVm = $null -ne $vm.StorageProfile.OsDisk.ManagedDisk\nif ($isManagedVm) { Write-Host \"Virtual machine $($vm.Name) is using Managed Disks\" }\n$isUnmanagedVm = $null -ne $vm.StorageProfile.OsDisk.Vhd\nif ($isUnmanagedVm) { Write-Host \"Virtual machine $($vm.Name) is using unmanaged storage account VHDs\" }\n\nif ($StepTemplate_ImageType -eq 'managed') {\n Write-Host \"Creating Managed Image of $($vm.Name)...\"\n $image = New-AzureRmImageConfig -Location $vm.Location -SourceVirtualMachineId $vm.Id\n New-AzureRmImage -Image $image -ImageName $StepTemplate_ImageName -ResourceGroupName $StepTemplate_ImageResourceGroupName | Out-Verbose\n Write-Host 'Image created:'\n Get-AzureRmImage -ImageName $StepTemplate_ImageName -ResourceGroupName $StepTemplate_ImageResourceGroupName | Out-Host\n}\n\nif ($StepTemplate_ImageType -eq 'unmanaged') {\n if ($isManagedVm) {\n Write-Host \"Granting access to os disk ($($vm.StorageProfile.OsDisk.Name)) blob...\"\n $manageDisk = Grant-AzureRmDiskAccess -ResourceGroupName $StepTemplate_ResourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name -DurationInSecond 3600 -Access Read \n $vhdSasUri = $manageDisk.AccessSAS\n }\n if ($isUnmanagedVm) {\n Write-Host \"Saving Unmanaged Image of $($vm.Name)...\"\n $armTemplatePath = [System.IO.Path]::GetTempFileName()\n $vhdDestContainer = Get-OctopusSetting VhdDestContainer 'images'\n Save-AzureRmVMImage -ResourceGroupName $StepTemplate_ResourceGroupName -Name $StepTemplate_VMName -DestinationContainerName $vhdDestContainer -VHDNamePrefix $StepTemplate_ImageName -Overwrite -Path $armTemplatePath | Out-Verbose\n $armTemplate = Get-Content -Path $armTemplatePath\n \"VM Image ARM Template:`n$armTemplate\" | Out-Verbose\n Remove-Item $armTemplatePath -Force\n $osDiskUri = ($armTemplate | ConvertFrom-Json).resources.properties.storageprofile.osdisk.image.uri\n \"OS Disk Image URI: $osDiskUri\" | Out-Verbose\n $unmanagedVhd = Split-BlobUri $osDiskUri\n \n Write-Host \"Granting access to vhd image ($($unmanagedVhd.Blob))...\"\n $unmanagedVhdStorageResource = Find-AzureRmResource -ResourceNameEquals $unmanagedVhd.Account -ResourceType Microsoft.Storage/storageAccounts\n $unmanagedVhdStorageResource | Out-Verbose\n $unmanagedVhdStorageContext = Get-AzureRmStorageAccount -ResourceGroupName $unmanagedVhdStorageResource.ResourceGroupName -Name $unmanagedVhdStorageResource.Name | % Context\n $vhdSasUri = New-AzureStorageBlobSASToken -Container $unmanagedVhd.Container -Blob $unmanagedVhd.Blob -Permission r -ExpiryTime (Get-Date).AddHours(1) -FullUri -Context $unmanagedVhdStorageContext\n }\n Write-Host \"Source image SAS token created: $vhdSasUri\"\n\n Write-Host 'Copying image to storage account...'\n $destContainerName = Get-OctopusSetting VhdDestContainer 'images'\n $destContainer = Get-AzureStorageContainer -Name $destContainerName -Context $StepTemplate_ImageStorageContext -ErrorAction SilentlyContinue\n if ($destContainer) {\n Write-Host \"Using container '$destContainerName' in storage account $StepTemplate_ImageDest...\"\n } else {\n Write-Host \"Creating container '$destContainerName' in storage account $StepTemplate_ImageDest...\"\n $destContainer = New-AzureStorageContainer -Name $destContainerName -Context $StepTemplate_ImageStorageContext -Permission Off\n }\n\n $copyBlob = Start-AzureStorageBlobCopy -AbsoluteUri $vhdSasUri -DestContainer $destContainerName -DestContext $StepTemplate_ImageStorageContext -DestBlob $StepTemplate_ImageName -Force\n $copyBlob | Out-Verbose\n do { \n if ($copyState.Status -eq 'Pending') {\n Start-Sleep -Seconds 60\n }\n $copyState = $copyBlob | Get-AzureStorageBlobCopyState\n $copyState | Out-Verbose\n $percent = ($copyState.BytesCopied / $copyState.TotalBytes) * 100\n Write-Host \"Blob transfer $($copyState.Status.ToString().ToLower())... $('{0:N2}' -f $percent)% @ $([System.Math]::Round($copyState.BytesCopied/1GB, 2))GB / $([System.Math]::Round($copyState.TotalBytes/1GB, 2))GB\"\n } while ($copyState.Status -eq 'Pending')\n Write-Host \"Final image transfer status: $($copyState.Status)\"\n \n if ($isManagedVm) {\n Write-Host 'Revoking access to os disk blob...'\n Revoke-AzureRmDiskAccess -ResourceGroupName $StepTemplate_ResourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name | Out-Verbose\n }\n}\n\nWrite-Host \"Image of $($vm.Name) captured successfully!\"\n\nif ($StepTemplate_DeleteVMResourceGroup -ieq 'True') {\n Write-Host ('-'*80)\n Write-Host \"Removing $($vm.Name) VM's resource group $StepTemplate_ResourceGroupName, the following resources will be deleted...\"\n Find-AzureRmResource -ResourceGroupNameEquals $StepTemplate_ResourceGroupName | Sort-Object -Property ResourceId -Descending | Select-Object -Property ResourceGroupName,ResourceType,ResourceName | Format-Table -AutoSize | Out-Host\n Remove-AzureRmResourceGroup -Name $StepTemplate_ResourceGroupName -Force | Out-Verbose\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-capture-virtualmachine-image.json","Website":"/step-templates/dd2b147c-3f20-42e1-a94c-17b157a0f0a4","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":"bf955a12-57ee-41b0-af58-672ca48ea07d","Name":"Azure - Copy Storage Account Containers","Description":"Copy blobs between specified containers across two different storage accounts","Version":0,"ExportedAt":"2016-05-12T03:09:48.287+00:00","ActionType":"Octopus.Script","Author":"ahmedig","Parameters":[{"Name":"SourceStorageAccountName","Label":"Source Storage Account Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SourceStorageAccountKey","Label":"Source Storage Account Key","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SourceContainerName","Label":"Source Container Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SourceBlobPrefix","Label":"Source Blob Prefix (Optional)","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationStorageAccountName","Label":"Destination Storage Account Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationStorageAccountKey","Label":"Destination Storage Account Key","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationContainerName","Label":"Destination Container Name","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationBlobPrefix","Label":"Destination Blob Prefix (Optional)","HelpText":null,"DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"# Define the source storage account and context\n$SourceStorageAccountName = $OctopusParameters['SourceStorageAccountName'];\n$SourceStorageAccountKey = $OctopusParameters['SourceStorageAccountKey'];\n$SourceContainerName = $OctopusParameters['SourceContainerName'];\n$SourceContext = New-AzureStorageContext -StorageAccountName $SourceStorageAccountName -StorageAccountKey $SourceStorageAccountKey\n$SourceBlobPrefix = $OctopusParameters['SourceBlobPrefix'];\n\n# Define the destination storage account and context\n$DestinationStorageAccountName = $OctopusParameters['DestinationStorageAccountName'];\n$DestinationStorageAccountKey = $OctopusParameters['DestinationStorageAccountKey'];\n$DestinationContainerName = $OctopusParameters['DestinationContainerName'];\n$DestinationContext = New-AzureStorageContext -StorageAccountName $DestinationStorageAccountName -StorageAccountKey $DestinationStorageAccountKey\n$DestinationBlobPrefix = $OctopusParameters['DestinationBlobPrefix'];\n\n# Check if container exists, otherwise create it\n$isContainerExist = Get-AzureStorageContainer -Context $DestinationContext | Where-Object { $_.Name -eq $DestinationContainerName }\nif($isContainerExist -eq $null)\n{\n New-AzureStorageContainer -Name $DestinationContainerName -Context $DestinationContext\n}\n\n# Get a reference to blobs in the source container\n$blobs = $null\nif ($SourceBlobPrefix -eq $null) {\n $blobs = Get-AzureStorageBlob -Container $SourceContainerName -Context $SourceContext\n}\nelse {\n $blobs = Get-AzureStorageBlob -Container $SourceContainerName -Context $SourceContext -Prefix $SourceBlobPrefix\n}\n\n# Copy blobs from one container to another\nif ($DestinationBlobPrefix -eq $null) {\n\t$blobs | Start-AzureStorageBlobCopy -DestContainer $DestinationContainerName -DestContext $DestinationContext\n}\nelse {\n\t$uri = $SourceContext.BlobEndPoint + $SourceContainerName +\"/\" \n\t$blobs | ForEach-Object `\n \t{ Start-AzureStorageBlobCopy `\n\t -SrcUri \"$uri$($_.Name)\" `\n -Context $SourceContext `\n\t -DestContext $DestinationContext `\n\t -DestContainer $DestinationContainerName `\n\t -DestBlob \"$DestinationBlobPrefix/$($_.Name)\" `\n\t } \n}\n ","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/Azure-Contianer-Copy-to-another-Container.json","Website":"/step-templates/bf955a12-57ee-41b0-af58-672ca48ea07d","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":"24ab7967-8ae5-4852-bfdf-4e81d57245f6","Name":"Azure - Copy Storage Account Containers AZCopy Inline","Description":"Copies Storage Account containers, from a source storage account to destination. It copies the containers with the same names.","Version":2,"ExportedAt":"2016-07-24T12:55:38.909+00:00","ActionType":"Octopus.Script","Author":"ahmedig","Parameters":[{"Name":"SourceStorageAccountName","Label":"Source Storage Account Name","HelpText":"Storage Account Name of the source storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SourceStorageAccountKey","Label":"Source Storage Account Key","HelpText":"Storage Account Key of the source storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationStorageAccountName","Label":"Destination Storage Account Name","HelpText":"Storage Account Name of the destination storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DestinationStorageAccountKey","Label":"Destination Storage Account Key","HelpText":"Storage Account key of the destination storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ContainersIncluded","Label":"Containers Included","HelpText":"A comma separated list of containers that will be copied only, and all the rest will be excluded. If this value is filled with a value, the \"Containers Excluded\" value will be neglected.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ContainersExcluded","Label":"Containers Excluded","HelpText":"A comma separated list of containers that will be excluded. All containers in source storage account will be copied to destination except these containers. Please note that if the \"Containers Included\" has a value, the \"Containers Excluded\" will be neglected.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$SourceStorageAccountName = $OctopusParameters['SourceStorageAccountName'];\n$SourceStorageAccountKey = $OctopusParameters['SourceStorageAccountKey'];\n$DestinationStorageAccountName = $OctopusParameters['DestinationStorageAccountName'];\n$DestinationStorageAccountKey = $OctopusParameters['DestinationStorageAccountKey'];\n$ContainersIncluded = $OctopusParameters['ContainersIncluded'];\n$ContainersExcluded = $OctopusParameters['ContainersExcluded'];\n\n$AzCopy = Join-Path ${env:ProgramFiles(x86)} \"Microsoft SDKs\\Azure\\AzCopy\\AzCopy.exe\"\n\nfunction AzCopyContainer($containerName)\n{\n &$AzCopy /Source:http://$($SourceStorageAccountName).blob.core.windows.net/$containerName `\n\t/Dest:http://$($DestinationStorageAccountName).blob.core.windows.net/$containerName `\n\t/SourceKey:$SourceStorageAccountKey `\n\t/DestKey:$DestinationStorageAccountKey `\n\t/S /XO /XN /V | Out-Host\n}\n\n# List all Containers\n$ctx = New-AzureStorageContext -StorageAccountName $SourceStorageAccountName -StorageAccountKey $SourceStorageAccountKey\n$containers = Get-AzureStorageContainer -Context $ctx\n\n\t\n# If Containers Included is there => Copy Included Only \nif($ContainersIncluded)\n{\n\t# Parse the Included list\n\t$ContainersIncluded.Split(\",\") | foreach {\n\t\tAzCopyContainer $_\n\t}\n}\n\n# If Containers Excluded is there, and no Included => Copy all except excluded\nelseif(!$ContainersIncluded -and $ContainersExcluded)\n{\n\t#Parse the exclusion list\n\t[Collections.Generic.List[String]]$lst = $ContainersExcluded.Split(\",\")\n\n\t# Loop through all the containers, and\n\tforeach ($container in $containers) \n\t{\n\t\tif($lst.Contains($container.Name)) {\n\t\t\tcontinue\n\t\t}\n\t\telse \n\t\t{\n\t\t\t$containerName = $container.Name\n AzCopyContainer $containerName\n\t\t}\n\t} \n}\n\n# Copy all containers\nelse\n{\n\t# Loop through all the containers, and\n\tforeach ($container in $containers) \n\t{\n\t\t$containerName = $container.Name\n AzCopyContainer $containerName\n\t} \n}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.NuGetFeedId":null,"Octopus.Action.Package.NuGetPackageId":null},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/Azure-CopySelectiveStorageAccountContainersUsingAZCopy.json","Website":"/step-templates/24ab7967-8ae5-4852-bfdf-4e81d57245f6","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":"7351a3e7-df59-4e0c-863a-dca6f33ad2e1","Name":"Azure - Remove Resource Group Deployments","Description":"There is a cap in Azure that prevents having more than 800 deployments in the history at any given time: link to microsoft docs\n\nThis script helps alleviate this issue by limiting how many deployments are allowed exist, keeps the latest specified number of deployments, and will remove the rest.\n\nWhat it does: Logs into Azure, selects the resource group of the app. Based on how many deployments it wants to keep, it will keep the latest X deployments and remove the rest. If there are less deployments than X to keep, the script will skip.","Version":2,"ExportedAt":"2019-04-25T13:33:59.856Z","ActionType":"Octopus.AzurePowerShell","Author":"bmdixon","Packages":[],"Parameters":[{"Id":"30a798bd-db11-44d3-82bd-28c3b13e77a5","Name":"AzureSubscriptionAccount","Label":"Azure Subscription Account","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"27c68d1f-7fdc-4e10-aa4a-77a0ff55eb29","Name":"Azure.RemoveResourceGroupDeployments.ResourceGroupName","Label":"Resource Group Name","HelpText":"Enter the name of the resource group.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"2adcf1a9-d319-4ed3-80e7-4c533ddbe5cd","Name":"Azure.RemoveResourceGroupDeployments.NumberOfDeploymentsToKeep","Label":"Number Of Deployments To Keep","HelpText":"Number Of Deployments To Keep. Defaults to empty and will not be used.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"c5ce930b-ea04-42b8-8ade-d167a26dab2a","Name":"Azure.RemoveResourceGroupDeployments.NumberOfDaysToKeep","Label":"Number Of Days To Keep.","HelpText":"Number Of Days To Keep. Defaults to empty and will not be used.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Azure.AccountId":"#{AzureSubscriptionAccount}","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"function Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($null -ne $OctopusParameters) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($null -eq $result) {\n $variable = Get-Variable $Name -EA SilentlyContinue\n if ($null -ne $variable) {\n $result = $variable.Value\n }\n }\n\n if ($null -eq $result) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n }\n else {\n $result = $Default\n }\n }\n\n return $result\n}\n\nFunction Get-Deployments {\n Param(\n [Parameter(Mandatory = $true)]\n [string]$resourceGroupName\n )\n $listOfDeployments = Get-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName\n $azureDeploymentNameAndDate = @()\n $listOfDeployments | ForEach-Object { $azureDeploymentNameAndDate += [PSCustomObject]@{DeploymentName = $_.DeploymentName; Time = $_.Timestamp } }\n\n return $azureDeploymentNameAndDate\n}\n\nFunction Remove-AzureRmResourceDeployments {\n\n [CmdletBinding()]\n Param(\n [Parameter(Mandatory = $true)]\n [string]$resourceGroupName,\n\n [ValidateRange(0, 800)]\n [int]$numberOfDeploymentsToKeep,\n\n [int]$numberOfDaysToKeep\n )\n\n if ($null -ne $($numberOfDaysToKeep) -and $($numberOfDaysToKeep) -gt 0) {\n $azureDeploymentNameAndDate = Get-Deployments $resourceGroupName\n\n Write-Output \"Found $($azureDeploymentNameAndDate.Count) deployments from the $resourceGroupName resource group\"\n\n $itemsToRemove = $azureDeploymentNameAndDate | Where-Object { $_.Time -lt ((get-date).AddDays( - $($numberOfDaysToKeep))) }\n $numberOfItemsToRemove = $itemsToRemove | Measure-Object\n\n if ($numberOfitemsToRemove.Count -eq 0) {\n Write-Output \"There are no deployments older than $($numberOfDaysToKeep) days old in $($resourceGroupName)... skipping\"\n }\n else {\n Write-Output \"Deleting $($numberOfitemsToRemove.Count) deployment(s) from $($resourceGroupName) as they are more than $($numberOfDaysToKeep) days old.\"\n $itemsToRemove | ForEach-Object { Write-Output \"Deleting $($_.DeploymentName)\"; Remove-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -name $_.DeploymentName }\n }\n }\n\n if ($null -ne $($numberOfDeploymentsToKeep) -and $($numberOfDeploymentsToKeep) -gt 0) {\n $azureDeploymentNameAndDate = Get-Deployments $resourceGroupName\n\n Write-Output \"Found $($azureDeploymentNameAndDate.Count) deployments from the $resourceGroupName resource group\"\n\n $itemsToRemove = $azureDeploymentNameAndDate | Sort-Object Time -Descending | select-object -skip $numberOfDeploymentsToKeep\n $numberOfItemsToRemove = $itemsToRemove | Measure-Object\n\n if ($numberOfitemsToRemove.Count -eq 0) {\n Write-Output \"Max number of deployments set to keep is $numberOfDeploymentsToKeep... skipping\"\n }\n else {\n Write-Output \"Maximum number of deployments exceeded. Deleting $($numberOfitemsToRemove.Count) deployment(s) from $($resourceGroupName)\"\n $itemsToRemove | ForEach-Object { Write-Output \"Deleting $($_.DeploymentName)\"; Remove-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -name $_.DeploymentName }\n }\n }\n}\n\n## --------------------------------------------------------------------------------------\n## Input\n## --------------------------------------------------------------------------------------\n\n$resourceGroupName = Get-Param 'Azure.RemoveResourceGroupDeployments.ResourceGroupName' -Required\n$numberOfDeploymentsToKeep = Get-Param 'Azure.RemoveResourceGroupDeployments.NumberOfDeploymentsToKeep' -Default 0\n$numberOfDaysToKeep = Get-Param 'Azure.RemoveResourceGroupDeployments.NumberOfDaysToKeep' -Default 0\n\nRemove-AzureRmResourceDeployments -resourceGroupName $resourceGroupName -numberOfDeploymentsToKeep $numberOfDeploymentsToKeep -numberOfDaysToKeep $numberOfDaysToKeep -Verbose\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-remove-resource-group-deployments.json","Website":"/step-templates/7351a3e7-df59-4e0c-863a-dca6f33ad2e1","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":"72a32f48-2de9-4dac-9c47-b491413478e2","Name":"Azure - Set Web App SSL Certificate","Description":"Configures the SSL binding for an Azure Web App to use an [Octopus-managed certificate](https://octopus.com/docs/deploying-applications/certificates)","Version":1,"ExportedAt":"2018-03-29T00:48:05.333Z","ActionType":"Octopus.AzurePowerShell","Author":"MJRichardson","Parameters":[{"Id":"a8d7da9d-39d6-4bcd-9a08-fe81210e364c","Name":"SslAzureSubscription","Label":"Azure Subscription","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"},"Links":{}},{"Id":"4b978b3d-4f87-49d7-b814-14e2f9ef878a","Name":"SslWebApp","Label":"Azure Web App","HelpText":"The name of the Azure Web App for which the SSL binding will be created.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"df5ee03d-1a63-44c0-b3c4-d75020b1f2b8","Name":"SslResourceGroup","Label":"Resource Group","HelpText":"The name of the Azure Resource Group containing the Web App","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"ff318b09-27de-483c-a9c8-b0583e15208c","Name":"SslSlot","Label":"Slot","HelpText":"The Azure Deployment Slot (optional)","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"9f488222-f373-4f70-841b-3f340357bb85","Name":"SslDomainName","Label":"Domain Name","HelpText":"The fully qualified domain name for the SSL binding. e.g. store.acme.com","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"b8bda333-894a-4223-a07d-afb336b8f75f","Name":"SslCertificate","Label":"Certificate","HelpText":"The certificate to be used for the SSL binding","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Certificate"},"Links":{}},{"Id":"b9c953f5-a21d-4c64-b134-7295d6d7d48e","Name":"SslState","Label":"SSL State","HelpText":"Specifies the SSL state of the certificate","DefaultValue":"SniEnabled","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"SniEnabled\nIpBasedEnabled\nDisabled"},"Links":{}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Azure.AccountId":"#{SslAzureSubscription}","Octopus.Action.Script.ScriptBody":"<#\nTakes an Octopus certificate variable and\n 1) Writes it to a temporary file with a password (as Azure requires the PFX have a password)\n 2) Invokes New-AzureRmWebAppSSLBinding\n 3) Removes the temporary certificate file\n#>\n\n$ErrorActionPreference = 'Stop'\n\nWrite-Verbose \"Creating temporary certificate file\"\n$TempCertificateFile = New-TemporaryFile\n# The PFX upload to Azure must have a password. So we give it a GUID.\n$Password = [guid]::NewGuid().ToString(\"N\")\n\n$CertificateName = $OctopusParameters[\"SslCertificate.Name\"]\n\nWrite-Host \"Creating HTTPS binding on web app '$SslWebApp' for domain $SslDomainName using certificate '$CertificateName' \"\n\n$CertificateBytes = [Convert]::FromBase64String($OctopusParameters[\"SslCertificate.Pfx\"])\n[IO.File]::WriteAllBytes($TempCertificateFile.FullName, $CertificateBytes)\nGet-PfxData -FilePath $TempCertificateFile.FullName | Export-PfxCertificate -FilePath $TempCertificateFile.FullName -Password (ConvertTo-SecureString -String $Password -AsPlainText -Force)\n\n$BindingParams = @{\n WebAppName = $SslWebApp\n ResourceGroupName = $SslResourceGroup\n Name = $SslDomainName\n CertificateFilePath = $TempCertificateFile.FullName\n CertificatePassword = $Password\n SslState = $SslState\n}\n\nif ($SslSlot) { $BindingParams['Slot'] = $SslSlot }\n\nNew-AzureRmWebAppSSLBinding @BindingParams\n\nWrite-Verbose \"Removing temporary certificate file\"\nRemove-Item $TempCertificateFile.FullName -Force"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-ssl.json","Website":"/step-templates/72a32f48-2de9-4dac-9c47-b491413478e2","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":"8a0a75da-4960-40ca-b641-5ed2305fa655","Name":"Azure - Sync Instance Count","Description":"This step template is useful when you want to have the instance count matched just before the VIP swap. It takes the source slot (usually Production slot) and match with the current deployment slot (normally Staging). Note: This will be helpful in scenario when 15 instances in Production and 4 instance in staging. This step template should only be used when a production slot already exists.","Version":7,"ExportedAt":"2015-06-18T13:48:39.548+00:00","ActionType":"Octopus.Script","Author":"mani0070","Parameters":[{"Name":"sourceslot","Label":"Specify the Slot to Get Instance Count","HelpText":"This is usually Production Slot to obtain the Count and match to staging before swap.","DefaultValue":"Production","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"# Current Cloud Service name \n$ServiceName =$octopusparameters[\"Octopus.Action.Azure.CloudServiceName\"]\n\n$deployment = Get-AzureDeployment -slot $sourceslot -serviceName $serviceName\n# Obtain the instance count and role name.\n$SourceInstanceCount =$deployment.RolesConfiguration.values.InstanceCount\n$rolenameService = $deployment.RolesConfiguration.values.Name\n#Set the Current deployment slot instance count to match production count\nSet-AzureRole -ServiceName $serviceName -Slot $octopusparameters[\"Octopus.Action.Azure.Slot\"] -RoleName $rolenameService -Count $SourceInstanceCount "},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-sync-instancecount-from-prod-to-staging.json","Website":"/step-templates/8a0a75da-4960-40ca-b641-5ed2305fa655","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":"bc18b460-06a7-412f-850f-44098f1b497a","Name":"Azure - Upload Files to Azure","Description":"Uploads files and folders to an Azure container from a specified location.\n\n**IMPORTANT:** Azure PowerShell must be installed on the tentacle server for this step to work. This can be downloaded from http://bit.ly/AzurePowershellDownload","Version":8,"ExportedAt":"2016-10-25T19:17:25.877+00:00","ActionType":"Octopus.Script","Author":"kemyke","Parameters":[{"Id":"4cb76611-ff29-4256-9475-3769fd890e0f","Name":"storageAccountName","Label":"Azure Storage Account Name","HelpText":"Name of the account that the files and folders will be uploaded to.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"cc0eb63d-4545-4d9d-aca3-7844e1e0a54e","Name":"storageAccountKey","Label":"Azure Storage Account Key","HelpText":"The key that is used to log into the account.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"8245c4b0-014d-467c-a95d-ab6aac230075","Name":"containerName","Label":"Azure Container Name","HelpText":"The name of the container the files and folder will be uploaded to.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"45f6df33-d04d-44bd-8a26-1ab45c634afc","Name":"localFolder","Label":"Name of the Parent Folder","HelpText":"Name of the Parent Folder being uploaded","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8c559f0f-2d6e-4202-8614-65cabb29e643","Name":"doRecurse","Label":"Recursive","HelpText":null,"DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"8a06615b-69a2-4d32-be29-981b6c5725fc","Name":"doForce","Label":"Force","HelpText":"Override is enabled or not","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"#Sets the Permissions to public if the selection is true\nif ([boolean]::Parse($doRecurse)) \n{\n \n\t$recurse = \"-Recurse\"\n\n}\n\nif ([boolean]::Parse($doForce)) \n{\n \n\t$force = \"-Force\"\n\n}\n\n#--------------------------------------------------------------------\n#Checking to see if Azure is installed on the computer\n$name = 'Azure'\n\nWrite-Output \"Checking if Azure Powershell is installed\"\n\nif(Get-Module -ListAvailable | Where-Object {$_.name -eq $name})\n{\n\t(Get-Module -ListAvailable | Where-Object{ $_.Name -eq $name}) |\n\tSelect Version, Name, Author, PowerShellVersion | Format-List;\n\tWrite-Output \"Azure Powershell is installed\"\n}\nelse\n{\n\t#Provides the link to install Azure Powershell, if it is not installed\n\tWrite-Warning \"Please install Azure Powershell. To install Azure Powershell go to http://bit.ly/AzurePowershellDownload\"\n\tExit 1\n}\n\n\n\n#--------------------------------------------------------------------\n\n#Initialises the Azure Credentials based on the Storage Account Name and the Storage Account Key, \n#so that we can invoke the APIs further down. \n$storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey\n\n#--------------------------------------------------------------------\n\nGet-ChildItem -Path $localFolder -File $recurse | Set-AzureStorageBlobContent -Container $containerName -Blob $blobName -Context $storageContext $force\n\nWrite-Output \"All files in $localFolder uploaded to $containerName!\"\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":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-upload-files.json","Website":"/step-templates/bc18b460-06a7-412f-850f-44098f1b497a","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":"ac7868f9-dc5c-42b8-ab8c-0c1e801f6957","Name":"Azure Administer WebJob","Description":"Start, Stop, or Delete a WebJob from the Azure Web App","Version":2,"ExportedAt":"2015-11-23T20:15:06.113+00:00","ActionType":"Octopus.Script","Author":"dustinchilson","Parameters":[{"Name":"WebJobWebApp","Label":"Web App","HelpText":"The Web App the Azure WebJob is hosted under.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"WebJobUserName","Label":"User Name","HelpText":"The Username of the authentication to the Kudu Api.\n\nSee https://github.com/projectkudu/kudu/wiki/Deployment-credentials","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"WebJobPassword","Label":"Password","HelpText":"The Password of the authentication to the Kudu Api.\n\nSee https://github.com/projectkudu/kudu/wiki/Deployment-credentials","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"WebJobAction","Label":"Action","HelpText":"The action to perform. Start, Stop, or Delete.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"start|Start\nstop|Stop\ndelete|Delete"}},{"Name":"WebJobType","Label":"Job Type","HelpText":"The type of job, Continuous or Triggered","DefaultValue":"continuouswebjobs","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"continuouswebjobs|Continuous\ntriggeredwebjobs|Triggered"}},{"Name":"WebJobName","Label":"Job Name","HelpText":"The name of the Job to act upon.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$httpAction = 'POST'\n\nif ($WebJobAction -eq 'delete') {\n $httpAction = 'DELETE'\n}\n\n$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $WebJobUserName,$WebJobPassword)))\n$apiUrl = \"https://$WebJobWebApp.scm.azurewebsites.net/api/$WebJobType/$WebJobName/$WebJobAction\"\nInvoke-RestMethod -Uri $apiUrl -Headers @{Authorization=(\"Basic {0}\" -f $base64AuthInfo)} -Method $httpAction -ContentType \"Application/Json\""},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-administer-webjob.json","Website":"/step-templates/ac7868f9-dc5c-42b8-ab8c-0c1e801f6957","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":"745fa985-7022-4b19-a788-2fd77aa5b365","Name":"Azure Blob Storage set CORS Rule","Description":"Set a given CORS rule on the specified Azure storage blob container","Version":3,"ExportedAt":"2016-01-22T04:49:27.549+00:00","ActionType":"Octopus.Script","Author":"jonsamwell","Parameters":[{"Name":"PublishSettingsFile","Label":"Publish Settings File","HelpText":"Absolute path on the tentacle to the Azure publishsettings file to use. Eg. C:\\Azure\\Azure.publishsettings","DefaultValue":null,"DisplaySettings":{}},{"Name":"StorageAccount","Label":"Storage Account","HelpText":"The Azure Storage Account to use.","DefaultValue":null,"DisplaySettings":{}},{"Name":"StorageAccountKey","Label":"Storage Account Key","HelpText":"The primary or secondary key for the Azure Storage Account.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"StorageContainer","Label":"Storage Container","HelpText":"The storage container to use.","DefaultValue":null,"DisplaySettings":{}},{"Name":"AllowedHeaders","Label":"Allowed Headers","HelpText":"The allowed headers for the CORS rule","DefaultValue":"\"x-ms-blob-content-type\",\"x-ms-blob-content-disposition\"","DisplaySettings":{}},{"Name":"AllowedOrigins","Label":"Allowed Origins","HelpText":"The allowed origins for the CORS rule","DefaultValue":"*","DisplaySettings":{}},{"Name":"MaxAgeInSeconds","Label":"Max Age In Seconds","HelpText":"The max age in seconds that a pre-flight response can be cached on the client for.","DefaultValue":"1800","DisplaySettings":{}},{"Name":"AllowedMethods","Label":"Allowed Methods","HelpText":"The allowed HTTP methods for the CORS rule","DefaultValue":"Get","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"try\n{ \n Import-Module Azure -ErrorAction Stop\n}\ncatch\n{\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\nImport-AzurePublishSettingsFile $PublishSettingsFile\n\n$context = New-AzureStorageContext `\n -StorageAccountName $StorageAccount `\n -StorageAccountKey $StorageAccountKey\n\n$container = Get-AzureStorageContainer -Context $context | \n Where-Object { $_.Name -like $StorageContainer }\n\nif (-not $container)\n{\n throw \"Azure storage container ($StorageAccount) not found\"\n}\n\n$corsRules = (@{\n AllowedHeaders=@($AllowedHeaders);\n AllowedOrigins=@($AllowedOrigins);\n MaxAgeInSeconds=$MaxAgeInSeconds;\n AllowedMethods=@($AllowedMethods)})\n\nSet-AzureStorageCORSRule -Context $context -ServiceType Blob -CorsRules $corsRules\n\nWrite-Host \"Added CORS rule to container: $StorageContainer\""},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-blob-storage-set-cors.json","Website":"/step-templates/745fa985-7022-4b19-a788-2fd77aa5b365","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":"0b167d34-832e-4c96-8a8f-2ea0a6c0fe0c","Name":"Azure Blob Storage Upload","Description":"Upload files in a directory to a specified Azure Storage blob container.","Version":14,"ExportedAt":"2016-01-21T07:21:36.182+00:00","ActionType":"Octopus.Script","Author":"shawnmclean","Parameters":[{"Name":"CopyDirectory","Label":"Copy Directory","HelpText":"Replicates files and directory under the Copy Directory.\nEg. `Content/CDN` that is located at the root of the nuget package.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"PublishSettingsFile","Label":"Publish Settings File","HelpText":"Absolute path on the tentacle to the Azure publishsettings file to use.\nEg. `C:\\Azure\\Azure.publishsettings`","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"StorageAccount","Label":"Storage Account","HelpText":"The Azure Storage Account to use.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"StorageAccountKey","Label":"Storage Account Key","HelpText":"The primary or secondary key for the Azure Storage Account.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"StorageContainer","Label":"Storage Container","HelpText":"The storage container to use.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"NugetPackageStepName","Label":"Nuget Package Step Name","HelpText":"Name of the previously-deployed package step that contains the Copy Directory.","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"function 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# 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\nImport-AzurePublishSettingsFile $PublishSettingsFile\n\n# The script has been tested on Powershell 3.0\nSet-StrictMode -Version 3\n\n$stepPath = \"\"\nif (-not [string]::IsNullOrEmpty($NugetPackageStepName)) {\n Write-Host \"Finding path to package step: $NugetPackageStepName\"\n $stepPath = Find-InstallLocation $NugetPackageStepName\n} else {\n $stepPath = Find-SingleInstallLocation\n}\nWrite-Host \"Package was installed to: $stepPath\"\n\n$fullPath = \"$stepPath\\$CopyDirectory\"\nWrite-Host \"Copying Files in: $fullPath\"\n\n# Get a list of files from the project folder\n$files = @(ls -Path $fullPath -File -Recurse)\n\n$fileCount = $files.Count\nWrite-Host \"Found $fileCount Files: $files\"\n\n$context = New-AzureStorageContext `\n -StorageAccountName $StorageAccount `\n -StorageAccountKey $StorageAccountKey\n\nif ($files -ne $null -and $files.Count -gt 0)\n{\n # Create the storage container.\n $existingContainer = Get-AzureStorageContainer -Context $context | \n Where-Object { $_.Name -like $StorageContainer }\n\n if (-not $existingContainer)\n {\n $newContainer = New-AzureStorageContainer `\n -Context $context `\n -Name $StorageContainer `\n -Permission Blob\n \"Storage container '\" + $newContainer.Name + \"' created.\"\n }\n\n # Upload the files to storage container.\n $fileCount = $files.Count\n $time = [DateTime]::UtcNow\n if ($files.Count -gt 0)\n {\n foreach ($file in $files) \n {\n $blobFileName = $file.FullName.Replace($fullPath, '').TrimStart('\\')\n $contentType = switch ([System.IO.Path]::GetExtension($file))\n\t {\n\t \".css\" {\"text/css\"}\n\t \".js\" {\"text/javascript\"}\n\t \".json\" {\"application/json\"}\n\t \".html\" {\"text/html\"}\n\t \".png\" {\"image/png\"}\n\t \".svg\" {\"image/svg+xml\"}\n\t default {\"application/octet-stream\"}\n\t }\n\n Set-AzureStorageBlobContent `\n -Container $StorageContainer `\n -Context $context `\n -File $file.FullName `\n -Blob $blobFileName `\n -Properties @{ContentType=$contentType} `\n -Force\n }\n }\n\n $duration = [DateTime]::UtcNow - $time\n\n \"Uploaded \" + $files.Count + \" files to blob container '\" + $StorageContainer + \"'.\"\n \"Total upload time: \" + $duration.TotalMinutes + \" minutes.\"\n}\nelse\n{\n Write-Warning \"No files found.\"\n}","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-blob-storage-upload.json","Website":"/step-templates/0b167d34-832e-4c96-8a8f-2ea0a6c0fe0c","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":"c1d6e994-16c8-4896-b6f2-57f9558184ea","Name":"Azure Database - Export","Description":"Exports a database to a bacpac\n\n*Depends on az cli*\n\n*Source database requires 'Allow Azure services and resources to access this server' option turn on in the SQL server firewall*","Version":1,"ExportedAt":"2020-06-23T21:41:09.205Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"0bf888db-667e-4303-a4bd-c721bf1de0ad","Name":"azDbExport.AzAcct","Label":"Azure Account","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"d5885f12-d921-4ce8-afc2-384f0b82daae","Name":"azDbExport.rgName","Label":"Resource Group Name","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"03b281f5-e1e2-42a8-bb43-317bc4981393","Name":"azDbExport.sqlSvrName","Label":"SQL Server Name","HelpText":"The name of the SQL Server to connect to.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e67ef4ab-3084-45e7-81df-7cda76baf2fc","Name":"azDbExport.dbName","Label":"Database Name","HelpText":"The name of the database you wish to export","DefaultValue":"","DisplaySettings":{}},{"Id":"6da5679d-1c84-4fb4-8f91-22fd91b50baa","Name":"azDbExport.adminName","Label":"SQL Server Admin Name","HelpText":"The admin name of the SQL server containing the database you wish to export","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"44e1a2a3-6b9b-44a5-893d-d26f14166b52","Name":"azDbExport.adminPwd","Label":"Admin Password","HelpText":"The admin password of the SQL server containing the database you wish to export","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"40715e88-4892-48c6-83f2-603c0193439b","Name":"azDbExport.blobAccessKey","Label":"Azure Blob Access Key","HelpText":"the access key (Shared Access Key or Storage Access Key) to grant access to the storage account","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"fcb94050-5f81-410e-9ed9-c5f52653f9c6","Name":"azDbExport.accessKeyType","Label":"Access Key Type","HelpText":"The type of key the access key represents","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"SharedAccessKey|Shared Access Key\nStorageAccessKey|Storage Access Key"}},{"Id":"a8631db7-556e-4532-aacd-595266c4347f","Name":"azDbExport.ContainerUri","Label":"Container Uri","HelpText":"The URI of the container to save the exported database in. Format is: `https://{StorageAccountName}.blob.core.windows.net/{ContainerName}`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"85686923-5e57-4b1d-8dd7-6b5ca263ba42","Name":"azDbExport.backupName","Label":"Backup Name","HelpText":"The name of the file being saved. The bacpac extension (`.bacpac`) will be appended automatically. Defaults to DB Name","DefaultValue":"#{azDbExport.dbName}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{azDbExport.AzAcct}","Octopus.Action.Script.ScriptBody":"$rgname = $OctopusParameters[\"azDbExport.rgName\"]\n$svrName = $OctopusParameters[\"azDbExport.sqlSvrName\"]\n$dbName = $OctopusParameters[\"azDbExport.dbName\"]\n$adminName = $OctopusParameters[\"azDbExport.adminName\"]\n$adminPwd = $OctopusParameters[\"azDbExport.adminPwd\"]\n$accessKey = $OctopusParameters[\"azDbExport.blobAccessKey\"]\n$accessKeyType = $OctopusParameters[\"azDbExport.accessKeyType\"]\n$containerUri = $OctopusParameters[\"azDbExport.ContainerUri\"]\n$backupName = $OctopusParameters[\"azDbExport.backupName\"]\n\n$backupUri = \"$containerUri/$backupName.bacpac\"\n\nif([string]::IsNullOrEmpty($rgname))\n{\n\tthrow \"resource group name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($svrName))\n{\n\tthrow \"sql server name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($dbName))\n{\n\tthrow \"database name not provided\"\n}\n# admin name, password and access key will not be validated in favor of security\n\nif([string]::IsNullOrEmpty($accessKeyType))\n{\n\tthrow \"access key type not provided\"\n}\n\nif([string]::IsNullOrEmpty($containerUri))\n{\n\tthrow \"containerUri not provided\"\n}\n\nif([string]::IsNullOrEmpty($backupName))\n{\n\tthrow \"backup name not provided\"\n}\n\nwrite-host \"starting db export\"\naz sql db export --resource-group $rgname --server $svrName --name $dbName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-database-export.json","Website":"/step-templates/c1d6e994-16c8-4896-b6f2-57f9558184ea","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":"5b4544ed-987b-4532-9d6d-7c7a2ce5bd00","Name":"Azure Database - Import","Description":"Imports a bacpac file into an existing database.\n\n*depends on az cli*\n\n*Target database requires 'Allow Azure services and resources to access this server' option turn on in the SQL server firewall*","Version":1,"ExportedAt":"2020-06-16T14:33:48.670Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"0bf888db-667e-4303-a4bd-c721bf1de0ad","Name":"azDbImport.AzAcct","Label":"Azure Account","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"d5885f12-d921-4ce8-afc2-384f0b82daae","Name":"azDbImport.rgName","Label":"Resource Group Name","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"03b281f5-e1e2-42a8-bb43-317bc4981393","Name":"azDbImport.sqlSvrName","Label":"SQL Server Name","HelpText":"The name of the SQL Server to connect to.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"85686923-5e57-4b1d-8dd7-6b5ca263ba42","Name":"azDbImport.backupName","Label":"Backup Name","HelpText":"The name of the file being saved. Defaults to DB Name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6da5679d-1c84-4fb4-8f91-22fd91b50baa","Name":"azDbImport.adminName","Label":"SQL Server Admin Name","HelpText":"The admin name of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"44e1a2a3-6b9b-44a5-893d-d26f14166b52","Name":"azDbImport.adminPwd","Label":"Admin Password","HelpText":"The admin password of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"40715e88-4892-48c6-83f2-603c0193439b","Name":"azDbImport.blobAccessKey","Label":"Azure Blob Access Key","HelpText":"the access key (Shared Access Key or Storage Access Key) to grant access to the storage account","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"fcb94050-5f81-410e-9ed9-c5f52653f9c6","Name":"azDbImport.accessKeyType","Label":"Access Key Type","HelpText":"The type of key the access key represents","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"SharedAccessKey|Shared Access Key\nStorageAccessKey|Storage Access Key"}},{"Id":"a8631db7-556e-4532-aacd-595266c4347f","Name":"azDbImport.ContainerUri","Label":"Container Uri","HelpText":"The URI of the container to save the exported database in. Format is: `https://{StorageAccountName}.blob.core.windows.net/{ContainerName}`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e67ef4ab-3084-45e7-81df-7cda76baf2fc","Name":"azDbImport.dbName","Label":"Database Name","HelpText":"The name of the database you wish to import","DefaultValue":"","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{azDbImport.AzAcct}","Octopus.Action.Script.ScriptBody":"$rgname = $OctopusParameters[\"azDbImport.rgName\"]\n$svrName = $OctopusParameters[\"azDbImport.sqlSvrName\"]\n$dbName = $OctopusParameters[\"azDbImport.dbName\"]\n$adminName = $OctopusParameters[\"azDbImport.adminName\"]\n$adminPwd = $OctopusParameters[\"azDbImport.adminPwd\"]\n$accessKey = $OctopusParameters[\"azDbImport.blobAccessKey\"]\n$accessKeyType = $OctopusParameters[\"azDbImport.accessKeyType\"]\n$containerUri = $OctopusParameters[\"azDbImport.ContainerUri\"]\n$backupName = $OctopusParameters[\"azDbImport.backupName\"]\n\n$backupUri = \"$containerUri/$backupName.bacpac\"\n\nif([string]::IsNullOrEmpty($rgname))\n{\n\tthrow \"resource group name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($svrName))\n{\n\tthrow \"sql server name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($dbName))\n{\n\tthrow \"database name not provided\"\n}\n\n# admin name, password and access key will not be validated in favor of security\n\nif([string]::IsNullOrEmpty($accessKeyType))\n{\n\tthrow \"access key type not provided\"\n}\n\nif([string]::IsNullOrEmpty($containerUri))\n{\n\tthrow \"containerUri not provided\"\n}\n\nif([string]::IsNullOrEmpty($backupName))\n{\n\tthrow \"backup name not provided\"\n}\n\nwrite-host \"starting db import\"\naz sql db import --resource-group $rgname --server $svrName --name $dbName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-database-import.json","Website":"/step-templates/5b4544ed-987b-4532-9d6d-7c7a2ce5bd00","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":"cc3b7dd9-f107-4477-acc4-4d1ffdf9e820","Name":"Azure Database - Import Create New DTU","Description":"restores a bacpac to a new database\n\n*Depends on az cli*\n\n*Source database requires 'Allow Azure services and resources to access this server' option turn on in the SQL server firewall*","Version":1,"ExportedAt":"2020-06-23T20:12:56.412Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"918c8c99-4afe-4d8b-8c3d-3f7d5443a951","Name":"azDbImportNewDTU.azAccount","Label":"Azure Account","HelpText":"Azure account with permissions to the subscription and resource group","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"dcf78060-568c-4717-87d5-d1d2d1044418","Name":"azDbImportNewDTU.resourceGroup","Label":"Resource Group","HelpText":"Resource group name housing the target SQL server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"2a35cc98-c991-4bbf-bf80-b6fb74b5d066","Name":"azDbImportNewDTU.server","Label":"SQL Server","HelpText":"Name of the Azure SQL server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"aad2ddb7-ea11-4e7b-b90a-8ccb354e4a60","Name":"azDbImportNewDTU.dbName","Label":"Database Name","HelpText":"Name of the database that will be created","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"1c794a0d-d7f2-4757-875a-e2e0148e8fd1","Name":"azDbImportNewDTU.serviceObjective","Label":"Service Objective","HelpText":"The service objective for the new database","DefaultValue":"Basic","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Basic|Basic\nS0|S0\nS1|S1\nS3|S3\nS4|S4\nS6|S6\nS7|S7\nS9|S9\nS12|S12\nP1|P1\nP2|P2\nP4|P4\nP6|P6\nP11|P11\nP15|P15"}},{"Id":"81cef05c-98d2-4e82-bc78-f1bcb6536291","Name":"azDbImportNewDTU.elasticPool","Label":"Elastic Pool","HelpText":"The name or resource id of the elastic pool to create the database in","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"48128da8-94e8-4560-8fa7-7c30e68d1849","Name":"azDbImportNewDTU.readScale","Label":"Read Scale","HelpText":"If enabled, connections that have application intent set to readonly in their connection string may be routed to a readonly secondary replica. This property is only settable for Premium and Business Critical databases","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"4a52b908-7515-4089-91ad-0736e6bb687c","Name":"azDbImportNewDTU.zoneRedundant","Label":"Zone Redundant","HelpText":"Specifies whether to enable zone redundancy","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"948d5fa8-7d9a-4d51-bcd3-6ac6eaf37d3b","Name":"azDbImportNewDTU.maxsize","Label":"Max Storage Size","HelpText":"The max storage size. If no unit is specified, defaults to bytes (B)","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"4bc52675-3963-4bdd-9ca4-b2611dc968eb","Name":"azDbImportNewDTU.tags","Label":"Tags","HelpText":"Space-separated tags. `key[=value] key[=value]`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"40715e88-4892-48c6-83f2-603c0193439b","Name":"azDbImportNewDTU.blobAccessKey","Label":"Azure Blob Access Key","HelpText":"the access key (Shared Access Key or Storage Access Key) to grant access to the storage account","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"fcb94050-5f81-410e-9ed9-c5f52653f9c6","Name":"azDbImportNewDTU.accessKeyType","Label":"Access Key Type","HelpText":"The type of key the access key represents","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"SharedAccessKey|Shared Access Key\nStorageAccessKey|Storage Access Key"}},{"Id":"a8631db7-556e-4532-aacd-595266c4347f","Name":"azDbImportNewDTU.ContainerUri","Label":"Container Uri","HelpText":"The URI of the container to save the exported database in. Format is: `https://{StorageAccountName}.blob.core.windows.net/{ContainerName}`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"85686923-5e57-4b1d-8dd7-6b5ca263ba42","Name":"azDbImportNewDTU.backupName","Label":"Backup Name","HelpText":"The name of the file being saved. Defaults to DB Name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6da5679d-1c84-4fb4-8f91-22fd91b50baa","Name":"azDbImportNewDTU.adminName","Label":"SQL Server Admin Name","HelpText":"The admin name of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"44e1a2a3-6b9b-44a5-893d-d26f14166b52","Name":"azDbImportNewDTU.adminPwd","Label":"Admin Password","HelpText":"The admin password of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"#get variables into easy to use format\n# Create DB Variables\n$databaseName = $OctopusParameters[\"azDbImportNewDTU.dbName\"]\n$sqlServer = $OctopusParameters[\"azDbImportNewDTU.server\"]\n$rgName = $OctopusParameters[\"azDbImportNewDTU.resourceGroup\"]\n$elasticPool = $OctopusParameters[\"azDbImportNewDTU.elasticPool\"]\n$readScaleTruthy = $OctopusParameters[\"azDbImportNewDTU.readScale\"]\n$serviceObjective = $OctopusParameters[\"azDbImportNewDTU.serviceObjective\"]\n$tags = $OctopusParameters[\"azDbImportNewDTU.tags\"]\n$zoneRedundant = $OctopusParameters[\"azDbImportNewDTU.zoneRedundant\"]\n$maxSize = $OctopusParameters[\"azDbImportNewDTU.maxSize\"]\n\n# Import bacpac variables\n$adminName = $OctopusParameters[\"azDbImportNewDTU.adminName\"]\n$adminPwd = $OctopusParameters[\"azDbImportNewDTU.adminPwd\"]\n$accessKey = $OctopusParameters[\"azDbImportNewDTU.blobAccessKey\"]\n$accessKeyType = $OctopusParameters[\"azDbImportNewDTU.accessKeyType\"]\n$containerUri = $OctopusParameters[\"azDbImportNewDTU.ContainerUri\"]\n$backupName = $OctopusParameters[\"azDbImportNewDTU.backupName\"]\n$backupUri = \"$containerUri/$backupName.bacpac\"\n\n$readScaleValue = \"Disabled\"\n\nif($readScaleTruthy -eq \"true\") { $readScalevalue = \"Enabled\" }\n\n$ServiceObjectiveSizes = @{Basic = 2GB; S0 = 250GB; S1 = 250GB; S2 = 250GB; S3 = 1TB; S4 = 1TB; S6 = 1TB; S7 = 1TB; S9 = 1TB; S12 = 1TB; P1 = 1TB; P2 = 1TB; P4 = 1TB; P6 = 1TB; P11 = 4TB; P15 = 4TB}\n\nif($null -eq (az sql server list --query \"[?Name==$sqlServer]\" | ConvertFrom-Json))\n{\n throw \"$sqlServer doesn't exist or the selected azure account doesn't have access to it.\"\n}\n\nif($null -ne (az sql db list --resource-group $rgName --server $sqlServer --query \"[?Name==$databaseName]\" | ConvertFrom-Json))\n{\n throw \"$databaseName already exists\"\n}\n\n#validate parameters\n\nif(($maxSize / 1GB) -gt ($ServiceObjectiveSizes[$serviceObjective] / 1GB))\n{\n Write-Warning \"Desired max size of $($maxSize / 1GB)GB exceeds max size of $($ServiceObjectiveSizes[$serviceObjective] / 1GB)GB for selected service objective: $serviceObjective\"\n Write-Warning \"Setting max size to $($ServiceObjectiveSizes[$serviceObjective] / 1GB)GB\"\n $maxSize = \"$($ServiceObjectiveSizes[$serviceObjective] / 1GB)GB\"\n}\n\nif([string]::IsNullOrEmpty($rgname))\n{\n\tthrow \"resource group name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($sqlServer))\n{\n\tthrow \"sql server name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($databaseName))\n{\n\tthrow \"database name not provided\"\n}\n\n# admin name, password and access key will not be validated in favor of security\n\nif([string]::IsNullOrEmpty($accessKeyType))\n{\n\tthrow \"access key type not provided\"\n}\n\nif([string]::IsNullOrEmpty($containerUri))\n{\n\tthrow \"containerUri not provided\"\n}\n\nif([string]::IsNullOrEmpty($backupName))\n{\n\tthrow \"backup name not provided\"\n}\n\n# validate premium SKU settings\nif(!$serviceObjective.Contains('P'))\n{\n if($readScaleValue -eq \"Enabled\")\n {\n Write-Warning \"Read Scaling only available for premium SKUs. Setting database read scale to disabled\"\n $readScaleValue = \"Disabled\"\n }\n if($zoneRedundant -eq \"true\")\n {\n Write-Warning \"Zone redundant only available for premium SKUs. Setting database zone redundant to false\"\n $zoneRedundant = \"false\"\n }\n}\n\n$cliArgs = \"--name $databaseName --resource-group $rgName --server $sqlServer\"\n\nif($elasticPool) {$cliArgs += \" --elastic-pool $elasticPool\"}\nelse {$cliArgs += \" --max-size $maxSize --service-objective $serviceObjective --zone-redundant $zoneRedundant\"}\n\nif($tags) {$cliArgs += \" --tags $tags\"}\nif($readScale) {$cliArgs += \" --read-scale $readScaleValue\"}\n\n\n$cmd = \"az sql db create $cliArgs\"\n\nwrite-verbose \"cmd is: $cmd\"\n\nWrite-Host \"Creating Database\"\nInvoke-Expression $cmd\n\nwrite-host \"starting db import\"\nwrite-verbose \"import cmd az sql db import --resource-group $rgname --server $sqlServer --name $databaseName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\"\n\naz sql db import --resource-group $rgname --server $sqlServer --name $databaseName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\n","Octopus.Action.Azure.AccountId":"azureserviceprincipal-chris-azure-account-spaces-1"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-database-import-create-new-DTU.json","Website":"/step-templates/cc3b7dd9-f107-4477-acc4-4d1ffdf9e820","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":"4f03ce31-a9ce-4aff-8c7b-5144af5401a1","Name":"Azure Database - Import Create New vcpu","Description":"Restores a bacpac to a new database\n\n*Depends on az cli*\n\n*Source database requires 'Allow Azure services and resources to access this server' option turn on in the SQL server firewall*","Version":1,"ExportedAt":"2020-06-23T20:13:26.129Z","ActionType":"Octopus.AzurePowerShell","Author":"Your GitHub Username","Packages":[],"Parameters":[{"Id":"a7ee5061-2e7a-4b1a-876c-21bee392e455","Name":"azDbImportNewVCPU.azAccount","Label":"Azure Account","HelpText":"Azure account with permissions to the subscription and resource group","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"0f280e95-7f8b-4864-bd1d-6af9930257ec","Name":"azDbImportNewVCPU.resourceGroup","Label":"Resource Group","HelpText":"Resource group name housing the target SQL server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"12c084b7-1a60-4076-91e4-6471a57f8978","Name":"azDbImportNewVCPU.server","Label":"SQL Server","HelpText":"Name of the Azure SQL server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"7e8e96ee-63d6-4b6b-ab69-da69bf35a798","Name":"azDbImportNewVCPU.dbName","Label":"Database Name","HelpText":"Name of the database that will be created","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"a7db94c4-7954-4bbb-af9f-b25f0d282978","Name":"azDbImportNewVCPU.edition","Label":"Edition","HelpText":"The edition component of the sku","DefaultValue":"GeneralPurpose","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"GeneralPurpose|General Purpose\nBusinessCritical|Business Critical\nHyperscale|Hyperscale"}},{"Id":"20568782-31c5-496a-8885-f69f4240a9b4","Name":"azDbImportNewVCPU.computeModel","Label":"Compute Model","HelpText":"The compute model of the database. Only applicable for general purpose instances","DefaultValue":"Provisioned","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Provisioned|Provisioned\nServerless|Serverless"}},{"Id":"c99d1edc-62c4-4d3a-9896-8a7647a42783","Name":"azDbImportNewVCPU.family","Label":"Hardware Configuration","HelpText":"Select Between Gen5, Fsv2 , or M-Series. Please note the documented vCPU overrides if listed.","DefaultValue":"Gen5","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Gen5|Gen5\nFsv2|Fsv2 (General Purpose, Compute Optimized 72 vCPUs)\nM|M-Series (Business Critical, Memory Opimized 128 vCPUs)"}},{"Id":"d869775f-4bf4-4497-a1eb-c83fddf4c215","Name":"azDbImportNewVCPU.coreCount","Label":"vCPU Core Count","HelpText":"the number of vCores to use.\n*General purpose FSv2 hardware is set to 72*","DefaultValue":"2","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"1|1 (Only available for general purpose, serverless instances)\n2|2\n4|4\n6|6\n8|8\n10|10\n12|12\n14|14\n16|16\n18|18\n20|20\n24|24\n32|32\n40|40\n80|80 (Not available for general purpose, serverless instances)"}},{"Id":"fd690b8e-8467-4872-a8b9-b6b046f8c91d","Name":"azDbImportNewVCPU.maxsize","Label":"Max Storage Size","HelpText":"The max storage size. If no unit is specified, defaults to bytes (B)","DefaultValue":"1GB","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ff278593-3b7a-4923-b15e-3dc958c87496","Name":"azDbImportNewVCPU.elasticPool","Label":"Elastic Pool","HelpText":"The name or resource id of the elastic pool to create the database in","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"26414a8b-d167-4b94-9142-fa9bf1c984fe","Name":"azDbImportNewVCPU.zoneRedundant","Label":"Zone Redundant","HelpText":"Specifies whether to enable zone redundancy. This property is only applied to Business Critical databases.","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"a2e4e51d-8a3b-4447-92f4-39e83f82339e","Name":"azDbImportNewVCPU.readScale","Label":"Read Scale","HelpText":"If enabled, connections that have application intent set to read only in their connection string may be routed to a read only secondary replica. This property is only applied to Business Critical databases.","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"61ef6953-b59c-44f4-80a4-a005feba912c","Name":"azDbImportNewVCPU.readReplicaCount","Label":"Read Reaplica Count","HelpText":"The number of readonly replicas to provision for the database. This property is only applied to hyperscale databases.","DefaultValue":"0","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"0|0\n1|1\n2|2\n3|3\n4|4"}},{"Id":"713515d2-9dd1-4d63-8a66-14cfd08a7065","Name":"azDbImportNewVCPU.tags","Label":"Tags","HelpText":"Space-separated tags. `key[=value] key[=value]`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"53913bf4-b70e-455f-8dbe-7002e3584ef0","Name":"azDbImportNewVCPU.blobAccessKey","Label":"Azure Blob Access Key","HelpText":"the access key (Shared Access Key or Storage Access Key) to grant access to the storage account","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"9c7cdde5-e5a1-4566-80f2-f9f5391c398b","Name":"azDbImportNewVCPU.accessKeyType","Label":"Access Key Type","HelpText":"The type of key the access key represents","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"SharedAccessKey|Shared Access Key\nStorageAccessKey|Storage Access Key"}},{"Id":"fda41fbc-36cc-47b2-864f-2670144ad3e7","Name":"azDbImportNewVCPU.ContainerUri","Label":"Container Uri","HelpText":"The URI of the container to save the exported database in. Format is: `https://{StorageAccountName}.blob.core.windows.net/{ContainerName}`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"0a0da7eb-afee-4595-a073-993a9e951838","Name":"azDbImportNewVCPU.backupName","Label":"Backup Name","HelpText":"The name of the file being saved. Defaults to DB Name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8a601118-6e0d-4340-badd-c66d5c8101dd","Name":"azDbImportNewVCPU.adminName","Label":"SQL Server Admin Name","HelpText":"The admin name of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"f3f441ba-e92e-4cf2-bab9-0477591bc907","Name":"azDbImportNewVCPU.adminPwd","Label":"SQL Server Admin Password","HelpText":"The admin password of the SQL server containing the database you wish to import","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"#get variables into easy to use format\n\n# vCPU vars\n$family = $OctopusParameters[\"azDbImportNewVCPU.family\"] # Gen4 is being phased out.\n$computeModel = $OctopusParameters[\"azDbImportNewVCPU.computeModel\"]\n$readReplicaCount = $OctopusParameters[\"azDbImportNewVCPU.readReplicaCount\"]\n$edition = $OctopusParameters[\"azDbImportNewVCPU.edition\"]\n$capacity = $OctopusParameters[\"azDbImportNewVCPU.coreCount\"] -as [int]\n\n# Create DB Variables\n$databaseName = $OctopusParameters[\"azDbImportNewVCPU.dbName\"]\n$sqlServer = $OctopusParameters[\"azDbImportNewVCPU.server\"]\n$rgName = $OctopusParameters[\"azDbImportNewVCPU.resourceGroup\"]\n$elasticPool = $OctopusParameters[\"azDbImportNewVCPU.elasticPool\"]\n$readScaleTruthy = $OctopusParameters[\"azDbImportNewVCPU.readScale\"]\n\n$tags = $OctopusParameters[\"azDbImportNewVCPU.tags\"]\n$zoneRedundant = $OctopusParameters[\"azDbImportNewVCPU.zoneRedundant\"]\n$maxSize = $OctopusParameters[\"azDbImportNewVCPU.maxSize\"]\n\n# Import bacpac variables\n$adminName = $OctopusParameters[\"azDbImportNewVCPU.adminName\"]\n$adminPwd = $OctopusParameters[\"azDbImportNewVCPU.adminPwd\"]\n$accessKey = $OctopusParameters[\"azDbImportNewVCPU.blobAccessKey\"]\n$accessKeyType = $OctopusParameters[\"azDbImportNewVCPU.accessKeyType\"]\n$containerUri = $OctopusParameters[\"azDbImportNewVCPU.ContainerUri\"]\n$backupName = $OctopusParameters[\"azDbImportNewVCPU.backupName\"]\n$backupUri = \"$containerUri/$backupName.bacpac\"\n\n$readScaleValue = \"Disabled\"\n\nif($readScaleTruthy -eq \"true\") { $readScalevalue = \"Enabled\" }\n$maxAvailableSize = 1TB\n\n$gen5VcpuCount = 2,4,6,8,10,12,14,16,18,20,24,32,40,80\n$gen5VcpuCountSvrless = 1,2,4,6,8,10,12,14,16,18,20,24,32,40\n\n#validate parameters\n\nif($null -eq (az sql server list --query \"[?Name==$sqlServer]\" | ConvertFrom-Json))\n{\n throw \"$sqlServer doesn't exist or the selected azure account doesn't have access to it.\"\n}\n\nif($null -ne (az sql db list --resource-group $rgName --server $sqlServer --query \"[?Name==$databaseName]\" | ConvertFrom-Json))\n{\n throw \"$database already exists\"\n}\n\n# max size for all databases (except GP serverless) is 1TB\n\nif([string]::IsNullOrEmpty($rgName))\n{\n\tthrow \"resource group name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($sqlServer))\n{\n\tthrow \"sql server name is not provided\"\n}\n\nif([string]::IsNullOrEmpty($databaseName))\n{\n\tthrow \"database name not provided\"\n}\n\n# admin name, password and access key will not be validated in favor of security\n\nif([string]::IsNullOrEmpty($accessKeyType))\n{\n\tthrow \"access key type not provided\"\n}\n\nif([string]::IsNullOrEmpty($containerUri))\n{\n\tthrow \"containerUri not provided\"\n}\n\nif([string]::IsNullOrEmpty($backupName))\n{\n\tthrow \"backup name not provided\"\n}\n\nswitch($edition)\n{\n \"GeneralPurpose\"\n {\n switch($computeModel)\n {\n \"Provisioned\"\n {\n switch($family)\n {\n \"Gen5\"\n {\n \twrite-verbose \"Capacity set to: $capacity\"\n if($capacity -lt 2)\n {\n \tWrite-Warning \"Minimum vCPU for provisioned is 2\"\n Write-Warning \"setting vCPU to 2\"\n $capacity = 2\n }\n if(!$gen5VcpuCount.Contains($capacity))\n {\n throw \"Invalid max vCPU count entered valid values for Gen5 hardware is: $gen5VcpuCount\"\n }\n $maxAvailableSize = 1TB\n }\n \"FSv2\"\n {\n $capacity = 72\n $maxAvailableSize = 4TB\n }\n \"Default\"\n {\n throw \"Invalid hardware family selected for General purpose\"\n }\n }\n }\n \"Serverless\"\n {\n if($capacity -gt 40)\n {\n Write-Warning \"Max vCPUs for serverless is 40\"\n Write-Warning \"Setting max vCPU to 40\"\n $capacity = 40\n }\n\n if($family -ne \"Gen5\") {throw \"Only Gen5 hardware family available for serverless\"}\n\n if(!$gen5VcpuCountSvrless.Contains($capacity))\n {\n throw \"Invalid max vCPU count entered valid values for serverless Gen5 hardware is: $gen5VcpuCountSvrless\"\n }\n $maxAvailableSize = 512GB\n }\n }\n }\n \"Hyperscale\"\n {\n if($family -ne \"Gen5\") {throw \"Only Gen5 hardware family available for Hyperscale\"}\n\n if($capacity -lt 2)\n {\n Write-Warning \"Minimum vCPU for provisioned is 2\"\n Write-Warning \"setting vCPU to 2\"\n $capacity = 2\n }\n\n if(!$gen5VcpuCount.Contains($capacity))\n {\n throw \"Invalid max vCPU count entered valid values for Gen5 hardware is: $gen5VcpuCount\"\n }\n }\n \"BusinessCritical\"\n {\n switch ($family)\n {\n \"Gen5\"\n {\n if($capacity -lt 2)\n {\n Write-Warning \"Minimum vCPU for provisioned is 2\"\n Write-Warning \"setting vCPU to 2\"\n $capacity = 2\n }\n\n if(!$gen5VcpuCount.Contains($capacity))\n {\n throw \"Invalid max vCPU count entered valid values for Gen5 hardware is: $gen5VcpuCount\"\n }\n $maxAvailableSize = 1TB\n }\n \"M\"\n {\n $capacity = 128\n $maxAvailableSize = 4TB\n if($zoneRedundant -eq \"true\")\n {\n Write-Warning \"Zone redundant not available for M-Series hardware configuration\"\n Write-Warning \"Setting zone redundant to false\"\n $zoneRedundant = \"false\"\n }\n }\n }\n }\n}\n\nif(($maxSize / 1GB) -gt ($maxAvailableSize / 1GB))\n{\n Write-Warning \"Desired max size of $($maxSize / 1GB)GB exceeds available max size of $($maxAvailableSize / 1GB)GB\"\n Write-Warning \"Setting max size to $($maxAvailableSize / 1GB)GB\"\n $maxSize = $maxAvailableSize\n}\n\n$cliArgs = \"--name $databaseName --resource-group $rgName --server $sqlServer\"\n\nif($elasticPool) {$cliArgs += \" --elastic-pool $elasticPool\"}\nelse {$cliArgs += \" --edition $edition --family $family --capacity $capacity\"}\n\nif((!$edition -eq \"Hyperscale\") -and $maxSize) {$cliArgs += \" --max-size $maxSize\"}\nif($edition -eq \"GeneralPurpose\") {$cliArgs += \" --compute-model $computeModel\"}\nif($edition -eq \"Hyperscale\") {cliArgs += \" --read-replicas $readReplicaCount\"}\nif($tags) {$cliArgs += \" --tags $tags\"}\nif($edition -eq \"BusinessCritical\") {$cliArgs += \" --read-scale $readScaleValue --zone-redundant $zoneRedundant\"}\nif($elasticPool) {$cliArgs += \" --elastic-pool $elasticPool\"}\n\n$cmd = \"az sql db create $cliArgs\"\n\nwrite-verbose \"cmd is: $cmd\"\n\nWrite-Host \"Creating Database\"\ninvoke-expression \"$cmd\"\n\nwrite-host \"starting db import\"\nwrite-verbose \"import cmd az sql db import --resource-group $rgname --server $sqlServer --name $databaseName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\"\n\naz sql db import --resource-group $rgname --server $sqlServer --name $databaseName --admin-password $adminPwd --admin-user $adminName --storage-key $accessKey --storage-key-type $accessKeyType --storage-uri $backupUri\n","Octopus.Action.Azure.AccountId":"#{azDbImportNewVCPU.azAccount}"},"Category":"Other","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-database-import-create-new-vcpu.json","Website":"/step-templates/4f03ce31-a9ce-4aff-8c7b-5144af5401a1","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"d09f55f6-5b32-441f-b6b2-1ee6c3e53182","Name":"Azure DB - Execute SQL ","Description":"Runs a sql command against an Azure SQL Server database.\n\nAdds a firewall rule to allow the machine executing the step to access the database; the rule is then removed.\n\n*Depends on az cli*\n\n*Depends on sqlserver powershell module *","Version":1,"ExportedAt":"2020-07-22T16:38:39.012Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"4f94e536-a48f-4d9a-854d-c02ca56d6ef2","Name":"azDbSqlCmd.azAccount","Label":"Azure Account","HelpText":"An Azure account with permissions to the subscription and the sql server being targeted","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"068237eb-7329-426e-8dee-72ed96eb3e32","Name":"azDbSqlCmd.resourceGroupName","Label":"Resource Group Name","HelpText":"The name of the resource group hosting the sql server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"12590219-613f-4556-908a-cd87c509449f","Name":"azDbSqlCmd.ServerName","Label":"SQL Server Name","HelpText":"The name of the sql server. The FQDN (`database.windows.net`) will automatically be appended to this when needed.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"3fe35f76-f140-48df-be0c-2a927069bc8b","Name":"azDbSqlCmd.dbName","Label":"Database Name","HelpText":"The name of the database to execute the sql command against","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"bbe9a203-89db-4286-a684-c95748543805","Name":"azDbSqlCmd.AuthType","Label":"SQL Server Authentication Type","HelpText":"The type of authentication to use when connecting.","DefaultValue":"sql","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"sql|SQL Authentication\nadPwd|Active Directory Password\nad|Active Directory Integration"}},{"Id":"539885ef-8ff9-407e-8e33-3bf211d58df6","Name":"azDbSqlCmd.userId","Label":"User Id","HelpText":"The user id to use when authenticating with the sql server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"60af2045-ec59-4f4f-baf4-79e0ae8bd60d","Name":"azDbSqlCmd.userPwd","Label":"User Password","HelpText":"Used with SQL or Active directory Password authentication.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"e631537b-c109-4678-a7e5-bbc8166cca78","Name":"azDbSqlCmd.connectionTimeout","Label":"Connection Timeout","HelpText":"The timeout for the query measured in seconds between 0 and 65534. 0 indicates no timeout","DefaultValue":"0","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9f787938-012a-45e9-ae58-5a06b1f4f012","Name":"azDbSqlCmd.sqlCmd","Label":"SQL Command","HelpText":"The sql command to execute","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"273c678e-008e-4598-978e-9d7abaadbf6c","Name":"azDbSqlCmd.resultsOutput","Label":"Results Output","HelpText":"How should the results of the sql statement be retained. Results are only provided with select statements.","DefaultValue":"none","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"none|None\nvariable|Output Variable\nartifact|Process Artifact"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{azDbSqlCmd.azAccount}","Octopus.Action.Script.ScriptBody":"# insure module installed. Designed to run on cloud infrastructure where owners doesn't have controll over the workers.\n\nif (Get-Module -ListAvailable -Name sqlserver)\n{\n\tWrite-Verbose \"sqlserver module installed and available\"\n Import-Module sqlserver\n}\n\nelse\n{\n\tWrite-Warning \"installing module for the current user.`nIf worker is owned, consider installing the powershell module 'sqlserver' globally to speed up deployments\"\n\tInstall-Module -Name sqlserver -Scope CurrentUser -AllowClobber -Force\n}\n\n# parse parameters\n\n$resourceGroup = $OctopusParameters[\"azDbSqlCmd.resourceGroupName\"]\n$sqlServerName = $OctopusParameters[\"azDbSqlCmd.ServerName\"]\n$dbName = $OctopusParameters[\"azDbSqlCmd.dbName\"]\n$userId = $OctopusParameters[\"azDbSqlCmd.userId\"]\n$userPwd = $OctopusParameters[\"azDbSqlCmd.userPwd\"]\n$authType = $OctopusParameters[\"azDbSqlCmd.AuthType\"]\n$connTimeout = $OctopusParameters[\"azDbSqlCmd.connectionTimeout\"] -as [int]\n$resultsOutput = $OctopusParameters[\"azDbSqlCmd.resultsOutput\"]\n\n$sqlCmd = $OctopusParameters[\"azDbSqlCmd.sqlCmd\"]\n\n# get current IP address\nWrite-Host \"Getting worker IP address...\" -NoNewLine\n$workerPublicIp = (Invoke-WebRequest -uri \"http://ifconfig.me/ip\" -UseBasicParsing).Content\nWrite-Host \"Done. IP is: $workerPublicIp\"\n\n# create Connection string\nswitch ($authType)\n{\n\t\"sql\"\n {\n \t$connectionString = \"Server=tcp:$sqlServerName.database.windows.net;Initial Catalog=$dbName;Persist Security Info=False;User ID=$userId;Password=$userPwd;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;\"\n }\n \"adPwd\"\n {\n \t$connectionString = \"Server=tcp:$sqlServerName.database.windows.net;Initial Catalog=$dbName;Persist Security Info=False;User ID=$userId;Password=$userPwd;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication=`\"Active Directory Password`\";\"\n }\n \"ad\"\n {\n \t$connectionString = \"Server=tcp:$sqlServerName.database.windows.net;Initial Catalog=$dbName;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication=`\"Active Directory Integrated`\";\"\n }\n}\n\n# open firewall port\nwrite-host \"opening firewall on server $sqlServerName for ip: $workerPublicIp\"\nInvoke-Expression \"az sql server firewall-rule create -g $resourceGroup -n tempOctoSqlCmd -s $sqlServerName --start-ip-address $workerPublicIp --end-ip-address $workerPublicIp\"\n\n# invoke sql cmd\ntry\n{\n\t$id = New-Guid\n $resultFilePath = \"$env:temp/$id.txt\"\n\tWrite-Host \"running sql statement: ``$sqlCmd``\"\n \n switch ($resultsOutput)\n {\n 'none'\n {\n \tInvoke-SqlCmd -ConnectionString $connectionString -Query $sqlCmd -QueryTimeout $connTimeout\n }\n\n 'variable'\n {\n \tInvoke-SqlCmd -ConnectionString $connectionString -Query $sqlCmd -QueryTimeout $connTimeout | ConvertTo-CSV | Out-File -FilePath \"$resultFilePath\"\n $outputContent = Get-Content -Path $resultFilePath | ConvertFrom-CSV\n Set-OctopusVariable -name \"azDbSqlCmd.results\"\n }\n\n 'artifact'\n {\n \tInvoke-SqlCmd -ConnectionString $connectionString -Query $sqlCmd -QueryTimeout $connTimeout | ConvertTo-CSV | Out-File -FilePath \"$resultFilePath\"\n New-OctopusArtifact -Path $resultFilePath -Name azDbSqlCmd.results.csv\n }\n }\n}\ncatch\n{\n\tthrow\n}\nfinally\n{\n # close firewall port\n write-host \"closing firewall on server $sqlServerName for ip: $workerPublicIp\"\n Invoke-Expression \"az sql server firewall-rule delete -g $resourceGroup -n tempOctoSqlCmd -s $sqlServerName\"\n}\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-database-execute-sql-cmd.json","Website":"/step-templates/d09f55f6-5b32-441f-b6b2-1ee6c3e53182","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":"03bb1a08-52be-43ad-bdfd-117eb562b414","Name":"Azure Functions Deployment","Description":"Deploys Azure Functions via the Kudu API to an Azure Function App.\n\nProcess:\n1. Deploys the package to a tentacle.\n2. Zips up the deployment artefacts and uploads the resulting zip file.\n\nThis process enables the following:\n- Config and variable transform \n- Package type agnostic (i.e. will work with .nupkg as well as .zip files)\n- Retention policies can be applied to the target in step 1\n\n**Notes:**\n\nThis deployment step requires an available tentacle to deploy the package to before the final package is deployed to Azure. This tentacle does not need to be within the target deployment environment. It is advised to install the tentacle on the Octopus Deploy server, and deploy to that tentacle.\n\nThe target Function App will not be purged before deployment. This is by design of the Kudu API. An advantage of this is that multiple deployment packages can be deployed to a single Function App, as long as each function to be deployed has a unique name. However, you should be careful not to expect functions that have been removed from the deployment package to also be removed from the Functions App.\n\nThe package to deploy should mirror exactly the file and folder structure that the Functions App expects. A quick and easy way to get this up and running is to download an existing Function App's content from the Azure portal, and upload the downloaded zip file to Octopus Deploy via the Library > Packages page.","Version":4,"ExportedAt":"2020-03-15T18:13:57.632Z","ActionType":"Octopus.TentaclePackage","Author":"twerthi","Parameters":[{"Id":"538b02c5-ca4c-4bb6-aadc-e46906e69537","Name":"Azf.Username","Label":"Username","HelpText":"See [Kudu Deployment Credentials](https://github.com/projectkudu/kudu/wiki/Deployment-credentials#user-level-credentials-aka-deployment-credentials) for more information.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"5510ce13-6016-471b-a65d-051597c0c972","Name":"Azf.Password","Label":"Password","HelpText":"See [Kudu Deployment Credentials](https://github.com/projectkudu/kudu/wiki/Deployment-credentials#user-level-credentials-aka-deployment-credentials) for more information.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}},{"Id":"2bcc2c06-26c7-48c1-9408-1892ecd15910","Name":"Azf.ApplicationName","Label":"Application Name","HelpText":"This value can be determined from the URL of your application. i.e.: https://{ApplicationName}.azurewebsites.net","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"f6ac1609-2cdf-4ba9-a598-6c32df68db85","Name":"Azf.PackageName","Label":"Package Name","HelpText":"The name of the package to deploy.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"0d71cd13-9fb7-4b7f-b352-004a96d6a741","Name":"Azf.JsonConfigFiles","Label":"Json Configuration Files","HelpText":"A comma- or newline-separated list of file names to replace settings in, relative to the package contents. Extended wildcard syntax is supported. E.g., appsettings.json, Config\\*.json, **\\specific-folder\\*.json.. Configuration values can be replaced using a `:` separated key, starting from the root of the hierarchy.\n\nConsider the following appsettings.json file:\n\n {\n \"Data\": {\n \"DefaultConnection\": {\n \"ConnectionString\": \"Server=(localdb)\\\\SQLEXPRESS;Database=OctoFX;Trusted_Connection=True\"\n }\n }\n }\n\nTo replace the value of `ConnectionString` you would add a variable name `Data:DefaultConnection:ConnectionString` to your project variables / library variable set. The JSON also supports extended template syntax.\n\nThe 'Target files' field supports extended template syntax. Conditional `if` and `unless`:\n\n #{if MyVar}...#{/if}\n\nIteration over variable sets or comma-separated values with `each`:\n\n #{each mv in MyVar}...#{mv}...#{/each}","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}}],"Properties":{"Octopus.Action.Package.AutomaticallyRunConfigurationTransformationFiles":"True","Octopus.Action.Package.AutomaticallyUpdateAppSettingsAndConnectionStrings":"True","Octopus.Action.EnabledFeatures":"Octopus.Features.CustomScripts,Octopus.Features.JsonConfigurationVariables","Octopus.Action.Package.DownloadOnTentacle":"False","Octopus.Action.Package.FeedId":"feeds-builtin","Octopus.Action.Package.JsonConfigurationVariablesEnabled":"True","Octopus.Action.CustomScripts.PostDeploy.ps1":"$installationPath = $OctopusParameters[\"Octopus.Action.Package.InstallationDirectoryPath\"]\n$packageId = $OctopusParameters[\"Octopus.Action.Package.PackageId\"]\n$packageVersion = $OctopusParameters[\"Octopus.Action.Package.PackageVersion\"]\n\nWrite-Host \"Installation Path: $($installationPath)\"\nWrite-Host \"Package ID: $($packageId)\"\nWrite-Host \"Package Version: $($packageVersion)\"\n\n$zipFilePath = \"$($installationPath)\\$($packageId).$($packageVersion).zip\"\n\nWrite-Host \"Zip File Path: $($zipFilePath)\"\n\nCompress-Archive -Path \"$($installationPath)\\*\" -DestinationPath $zipFilePath\n\nWrite-Host \"Deployment zip file created\"\n\n$username = $OctopusParameters[\"Azf.Username\"]\n$password = $OctopusParameters[\"Azf.Password\"]\n$appName = $OctopusParameters[\"Azf.ApplicationName\"]\n\nif(!$username){\n Write-Error \"No Username has been supplied. You can do this from the Step Details page of this step.\"\n \n exit 1;\n}\n\n\nif(!$password){\n Write-Error \"No Password has been supplied. You can do this from the Step Details page of this step.\"\n \n exit 1;\n}\n\n\nif(!$appName){\n Write-Error \"No Application Name has been supplied. You can do this from the Step Details page of this step.\"\n \n exit 1;\n}\n\n$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $username,$password)))\n\n$apiUrl = \"https://$($appName).scm.azurewebsites.net/api/zipdeploy\"\n\nWrite-Host \"Uploading deployment zip file to $($apiUrl)\"\n\n# Set secure protocols\n[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls12\n\nInvoke-RestMethod -Uri $apiUrl -Headers @{Authorization=(\"Basic {0}\" -f $authHeader)} -Method POST -InFile $zipFilePath -ContentType \"multipart/form-data\"\n\nWrite-Host \"Upload complete\"\n","Octopus.Action.Package.PackageId":"#{Azf.PackageName}","Octopus.Action.Package.JsonConfigurationVariablesTargets":"#{Azf.JsonConfigFiles}","Octopus.Action.CustomScripts.PreDeploy.ps1":"","Octopus.Action.CustomScripts.Deploy.ps1":""},"Category":"Azurefunctions","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-function-deployment.json","Website":"/step-templates/03bb1a08-52be-43ad-bdfd-117eb562b414","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"2d21abec-491a-4d85-9210-2784bc3dfeb8","Name":"Azure Linux - Install Octopus Tentacle","Description":"This step template will install the latest tentacle on an Azure hosted, Linux virtual machine. This will also open the firewall for inbound traffic on port 10933 on the NSG.\n
\n*Note: Expects the Azure CLI and Powershell to be installed on the worker running this task*
\n*Note: Requires dotnet core to be pre-installed on the target machine*
\n*Note: Firewall ports will not be opened on the remote machine*","Version":2,"ExportedAt":"2020-08-18T17:38:26.173Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"dea51842-271f-48fa-901e-243488049f97","Name":"installLinuxTentacle.AzureAccount","Label":"Azure Account","HelpText":"Azure account with permissions to the virtual machine in which to install the tentacle on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"6a97548c-3b97-4a19-8b9a-45aa58ac62d9","Name":"installLinuxTentacle.azRgName","Label":"Azure Resource Group","HelpText":"The name of the resource group housing the NSG and VM","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"d9efb017-65c0-4010-b09f-0a6a34fc009f","Name":"installLinuxTentacle.azNsgName","Label":"NSG Name","HelpText":"The name of the azure network security group to create ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"36c6d441-9fe8-4ea2-957a-2135aa9d1687","Name":"installLinuxTentacle.azNsgRulePriority","Label":"Azure NSG Rule Priority","HelpText":"the priority to assign to the NSG rule created for the octopus tentacle. Defaults to 400","DefaultValue":"400","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e4358aec-2798-412a-bcd2-1c7e41a0728d","Name":"installLinuxTentacle.azVmName","Label":"VM Name","HelpText":"The name of the virtual machine to target when ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8dbe0a29-4e0f-43f8-8ef2-ae23a2884e85","Name":"installLinuxTentacle.octoServerThumb","Label":"Server Thumbprint","HelpText":"The Thumbprint of the octopus server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"a0859551-6c84-45d1-af2b-c57becb4e8ef","Name":"installLinuxTentacle.octoApiKey","Label":"API Key","HelpText":"The API key used to configure the tentacle.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"dd07815d-bfb7-43b9-90f8-21ec5a2d2953","Name":"installLinuxTentacle.octopusRoles","Label":"Roles","HelpText":"Roles to assign to this tentacle installation.
\n*Note: Each role should be on it's own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"d3ffb38e-7fcf-4547-be9a-6cd8e46f8e5e","Name":"installLinuxTentacle.octopusEnvironments","Label":"Environments","HelpText":"Environments to assign this tentacle installation to.
\n*Note: Each environment should be on its own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"15150827-7bd3-4146-a798-66344851f602","Name":"installLinuxTentacle.octoServerUrl","Label":"Server Url","HelpText":"The server url to register the tentacle with. Defaults to the base url","DefaultValue":"#{Octopus.Web.BaseUrl}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9bcd6bb5-2db3-453f-b4f6-6a78f3c39b59","Name":"installLinuxTentacle.tentacleType","Label":"Tentacle Type","HelpText":"Select between a listening or polling tentacle","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"TentaclePassive|Listening\nTentacleActive|Polling"}},{"Id":"6bb98570-fe3e-4ab7-adfb-79ef7ce5c2ce","Name":"installLinuxTentacle.tentacleHostName","Label":"Tentacle Host Name","HelpText":"The host name to register the listening tentacles with. Octopus deploy server uses this value to reach out to the vm.
\n*Note: Leave blank to automatically use assigned public IP address.*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"1ae37ac0-fc37-447c-941f-7b72ed32a647","Name":"installLinuxTentacle.portNumber","Label":"Port Number","HelpText":"Port number used when installing and registering the tentacle. This port is also opened when installing a listening tentacle","DefaultValue":"10933","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{installLinuxTentacle.AzureAccount}","Octopus.Action.Script.ScriptBody":"$nsgName = $OctopusParameters[\"installLinuxTentacle.azNsgName\"]\n$resourceGroup = $OctopusParameters[\"installLinuxTentacle.azRgName\"]\n$nsgRulePriority = $OctopusParameters[\"installLinuxTentacle.azNsgRulePriority\"]\n$vmName = $OctopusParameters[\"installLinuxTentacle.azVmName\"]\n$serverUri = $OctopusParameters[\"instrallTentacle.octoServerUrl\"]\n$apiKey = $OctopusParameters[\"installLinuxTentacle.octoApiKey\"]\n$rolesRaw = $OctopusParameters[\"installLinuxTentacle.octopusRoles\"]\n$enviroRaw = $OctopusParameters[\"installLinuxTentacle.octopusEnvironments\"]\n$octoThumb = $OctopusParameters[\"installLinuxTentacle.octoServerThumb\"]\n$comStyle = $OctopusParameters[\"installLinuxTentacle.tentacleType\"]\n$hostname = $OctopusParameters[\"installLinuxTentacle.tentacleHostName\"]\n$portNumber = $OctopusParameters[\"installLinuxTentacle.portNumber\"]\n\nWrite-Host \"Parsing Parameters\"\n\nif([string]::IsNullOrEmpty($rolesRaw))\n{\n\tthrow \"At least one role must be defined\"\n}\n\nif([string]::IsNullOrEmpty($enviroRaw))\n{\n\tthrow \"At least one environment must be defined\"\n}\n\n$roles = \"\"\n$rolesRaw -split \"`n\" | ForEach-Object { $roles += \"--role $_ \"}\n$roles = $roles.TrimEnd(' ')\n\n$environments = \"\"\n$enviroRaw -split \"`n\" | ForEach-Object { $environments += \"--env $_ \"}\n$environments = $environments.TrimEnd(' ')\n\nif($comStyle -eq \"TentaclePassive\")\n{\n\tif([string]::IsNullOrEmpty($hostname))\n {\n \t$hostname = az vm show -d -g $resourceGroup -n $vmName --query publicIps -o tsv\n $hostname = $hostname.Trim(\"`n\")\n }\n\n $noListen = \"--port $portNumber --noListen `\"false`\"\"\n $comStyle += \" --publicHostName=`\"$hostname`\"\"\n $openFirewall = 'true'\n}\nelse\n{\n\t$noListen = \"--noListen `\"true`\"\"\n $openFirewall = 'false'\n}\n\nif($openFirewall -eq 'true')\n{\n\tWrite-Host \"Creating NSG Rule\"\n\taz network nsg rule create --name \"OctopusTentacle\" --nsg-name $nsgName --priority $nsgRulePriority --resource-group $resourceGroup --direction Inbound --destination-port-ranges $portNumber\n}\n\nWrite-Verbose \"hostname: $hostname`noListen: $noListen\"\n\n$remoteScript = @\"\n\nprintf '%s\\n' \"Test case x failed\" >&2\nexit 1\n\nconfigFilePath=\"/etc/octopus/default/tentacle-default.config\"\nappPath=\"/home/Octopus/Applications\"\n\n# try curl\n{\n curl -L https://octopus.com/downloads/latest/Linux_x64TarGz/OctopusTentacle --output /tmp/tentacle-linux_x64.tar.gz -fsS\n} || {\n wget https://octopus.com/downloads/latest/Linux_x64TarGz/OctopusTentacle -O /tmp/tentacle-linux_x64.tar.gz -fsS\n}\n\nif [ ! -d \"/opt/octopus\" ]; then\n mkdir /opt/octopus\nfi\n\ntar xvzf /tmp/tentacle-linux_x64.tar.gz -C /opt/octopus\nrm /tmp/tentacle-linux_x64.tar.gz\n\ncd /opt/octopus/tentacle\n\nsudo /opt/octopus/tentacle/Tentacle create-instance --config \"`$configFilePath\"\nsudo chmod a+rwx `$configFilePath\n/opt/octopus/tentacle/Tentacle new-certificate --if-blank\n/opt/octopus/tentacle/Tentacle configure --port $portNumber --noListen False --reset-trust --app \"`$appPath\"\n/opt/octopus/tentacle/Tentacle configure --trust $octoThumb\necho \"Registering the Tentacle $name with server $serverUri in environment $environments with role $roles\"\n/opt/octopus/tentacle/Tentacle register-with --server \"$serverUri\" --apiKey \"$apikey\" --name \"$name\" $environments $roles --comms-style $comStyle --force\nsudo /opt/octopus/tentacle/Tentacle service --install --start\n\n\"@\n\nWrite-Host \"Installing tentacle on remote machine\"\n$scriptGuid = (new-guid).guid\nSet-Content -Value $remoteScript -Path \".\\$scriptGuid.ps1\"\n\n$result = az vm run-command invoke --command-id RunShellScript --name $vmName -g $resourceGroup --scripts \"@script.ps1\"\n\n$result\n\n$msg = ($result | convertfrom-json).value[0].message\n\nif($msg -match \"(?<=\\[stderr\\]).+\")\n{\n\tthrow $msg\n}\n\nremove-item \".\\$scriptGuid.ps1\"\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-linux-install-octopus-tentacle.json","Website":"/step-templates/2d21abec-491a-4d85-9210-2784bc3dfeb8","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":"7518eaa0-677c-4562-82d5-a131f29e1744","Name":"Azure Site Extensions - Install","Description":"Installs an Azure [site extension](https://www.siteextensions.net) in your Azure web app.","Version":1,"ExportedAt":"2017-09-06T20:42:23.783Z","ActionType":"Octopus.AzureResourceGroup","Author":"alfhenrik","Parameters":[{"Id":"d1494374-4db4-4bed-8136-eec378de7c9d","Name":"AzSiteExt_ResourceGroupName","Label":"Resource group name","HelpText":"The Resource Group of your Azure Web App.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1d188d2a-915e-425f-a4d8-5780421ebb00","Name":"AzSiteExt_SiteName","Label":"Site name","HelpText":"The name of your Azure Web App.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"00edff48-a947-424b-b46e-4f58826568c3","Name":"AzSiteExt_AppServicePlanName","Label":"App service plan name","HelpText":"The App Service Plan of your Azure Web App.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"2d2cfc5f-1f41-4d7b-a4df-3dbb652553fb","Name":"AzSiteExt_ExtensionName","Label":"Site extension name","HelpText":"The package name of the extension you want to install.\n\nThe extensions available to be installed can be found on the [siteextensions.net](https://www.siteextensions.net/packages) website. The name of the package can be derived from the URL of the extension (e.g. for the Application Insights extension the URL is `https://www.siteextensions.net/packages/Microsoft.ApplicationInsights.AzureWebSites/`, so the package name is `Microsoft.ApplicationInsights.AzureWebSites`).","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"3629e43b-1af0-4df5-a6ce-6f36ead4dea0","Name":"AzSiteExt_AzureAccountId","Label":"Azure account ID","HelpText":"The Azure account to use for the connection.\n\n**NOTE:** a **service principal** account is required, a **management certificate** account will not work.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}}],"Properties":{"Octopus.Action.Azure.ResourceGroupName":"#{AzSiteExt_ResourceGroupName}","Octopus.Action.Azure.TemplateSource":"Inline","Octopus.Action.Azure.ResourceGroupTemplateParameters":"{\"siteName\":{\"value\":\"#{AzSiteExt_SiteName}\"},\"extensionName\":{\"value\":\"#{AzSiteExt_ExtensionName}\"},\"appServicePlanName\":{\"value\":\"#{AzSiteExt_AppServicePlanName}\"}}","Octopus.Action.Azure.ResourceGroupDeploymentMode":"Incremental","Octopus.Action.Azure.ResourceGroupTemplate":"{\r\n \"$schema\": \"http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\r\n \"contentVersion\": \"1.0.0.0\",\r\n \"parameters\": { \r\n \"siteName\": {\r\n \"type\": \"string\",\r\n \"metadata\": {\r\n \"description\": \"Web site name\"\r\n }\r\n },\r\n \"appServicePlanName\": {\r\n \"type\": \"string\",\r\n \"metadata\": {\r\n \"description\": \"App service plan name\"\r\n }\r\n },\r\n \"extensionName\": {\r\n \"type\": \"string\",\r\n \"metadata\": {\r\n \"description\": \"Extension name\"\r\n }\r\n } \r\n },\r\n \"variables\": { \r\n \"extensionApi\": \"2015-06-01\"\r\n },\r\n \"resources\": [\r\n {\r\n \"apiVersion\": \"[variables('extensionApi')]\",\r\n \"name\": \"[parameters('siteName')]\",\r\n \"type\": \"Microsoft.Web/sites\",\r\n \"location\": \"[resourceGroup().location]\",\r\n \"dependsOn\": [],\r\n \"properties\": {\r\n \"name\": \"[parameters('siteName')]\",\r\n \"serverFarmId\": \"[parameters('appServicePlanName')]\"\r\n },\r\n \"resources\": [\r\n {\r\n \"apiVersion\": \"[variables('extensionApi')]\",\r\n \"name\": \"[parameters('extensionName')]\",\r\n \"type\": \"siteextensions\",\r\n \"dependsOn\": [\r\n \"[resourceId('Microsoft.Web/Sites', parameters('siteName'))]\"\r\n ],\r\n \"properties\": {}\r\n }\r\n ]\r\n }\r\n ]\r\n}","Octopus.Action.Azure.AccountId":"#{AzSiteExt_AzureAccountId}"},"Category":"Azure Site Extensions","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-site-extensions-install.json","Website":"/step-templates/7518eaa0-677c-4562-82d5-a131f29e1744","Logo":"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAtFBMVEUAAACASZigoaJZtNmASZiASZigoaKgoaKgoaKASZiASZiASZiASZiASZiASZiASZiASZiASZiASZigoaKgoaKgoaKgoaKgoaKgoaKgoaJZtNlZtNlZtNlZtNlZtNlZtNlZtNlZtNlZtNlZtNmgoaKgoaKgoaKgoaKgoaKgoaKgoaKgoaKgoaKgoaKgoaJZtNlZtNmgoaKgoaKgoaKgoaKgoaKgoaKgoaKASZigoaJZtNn///88MUhjAAAAOHRSTlMAAAAAWP2fomNT8fPy9f4TODVk+YKEhlLzOCpIR0UUkv3585YTPj9AJ0nx9vqZTFiZ9WQ1c/v+8s7KmYgAAAABYktHRDs5DvRsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABAUlEQVR42u3YRw7CMBRFUUgg9N5L6L33tv+FMY9kLEe2RaR7F/DfGf9YTEvxRPIVLj37AAAAAAAAQKQBnlqptOPoBbwV8wAAAAAAwJ8CMtmcqHyhaAFQKgurVAvmAb+Kl3MAAAAAAABAVAE1r94I1mxZBLQ7qlsAAAAAYArgut1eX5Y/cA0ChqOxrIlvEjD9SBv3hYBsMSnMBqCUSYizAJAEAAAAAAAAAAAAwADAmc0Xopar4IPDBGC92Yra7W0ADjvxUQ8AAAAAAIQDHE9TWcOuOYBiAAAAAKANcL5cO2G63u56AI/zsx2m5/atB2AkAAAAAAAAAAAAAAAAAAAQBHwB/SLmwJclsisAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTQtMDYtMTVUMDk6MDI6MTYtMDc6MDAhb+VcAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTA2LTEyVDExOjA4OjE5LTA3OjAwi613rgAAABZ0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMDvo9WkAAAAASUVORK5CYII=","$Meta":{"Type":"ActionTemplate"}},{"Id":"7a3caa63-8312-4e6e-aeb9-674022e5da2f","Name":"Azure Web App - Delete Files","Description":"Provides the ability to delete files and folders from an Azure Web App through the kudu API.","Version":1,"ExportedAt":"2018-08-17T02:46:48.536Z","ActionType":"Octopus.AzurePowerShell","Author":"matt-byrne","Parameters":[{"Id":"a575296c-babf-4c73-9023-d5a4c9cc84bf","Name":"FilesList","Label":"List of Files & Folders to Delete","HelpText":"List each file/folder on a new line.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"7643ed88-ed04-46d2-ae74-1d65b94f03f9","Name":"AzureAccount","Label":"Azure Account","HelpText":"Must exactly match the name of a configured Azure account.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ac5e4147-8b41-4aa5-82d0-ad5cf5e23499","Name":"ResourceGroupName","Label":"Resource Group Name","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6a833494-e3e6-4b8d-8639-c03f37d6d347","Name":"WebAppName","Label":"Web App Name","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"0186edda-110a-4cb7-a270-bdc92e55ea1e","Name":"SlotName","Label":"Slot Name","HelpText":"Optional. If you want to target a specific slot, enter it's name.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ffeb3047-63d5-4ce7-9c90-81f117106a93","Name":"RetryAttempts","Label":"Retry Attempts","HelpText":"Number of delete attempts before failing. This should be set higher than 1, as the Azure Kudu API often fails on the first request.","DefaultValue":"3","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"Write-Host \"Resource Group Name: $($ResourceGroupName)\"\nWrite-Host \"Web App Name: $($WebAppName)\"\nWrite-Host \"Slot Name: $($SlotName)\"\n\nfunction Get-AzureRmWebAppPublishingCredentials($ResourceGroupName, $WebAppName, $SlotName = $null){\t\n\t\n\tif ([string]::IsNullOrWhiteSpace($SlotName)) {\n\t\t$resourceType = \"Microsoft.Web/sites/config\"\n\t\t$resourceName = \"$WebAppName/publishingcredentials\"\n\t} else {\n\t\t$resourceType = \"Microsoft.Web/sites/slots/config\"\n\t\t$resourceName = \"$WebAppName/$SlotName/publishingcredentials\"\n\t}\n\n\t$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $ResourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force\n \n return $publishingCredentials\n\n}\n\nfunction Get-KuduApiAuthorisationHeaderValue($ResourceGroupName, $WebAppName, $SlotName = $null) {\n\n $publishingCredentials = Get-AzureRmWebAppPublishingCredentials $ResourceGroupName $WebAppName $SlotName\n\n return (\"Basic {0}\" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword))))\n\n}\n\nfunction Delete-PathFromWebApp($ResourceGroupName, $WebAppName, $SlotName = $null, $kuduPath) {\n\t\n $kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue $ResourceGroupName $WebAppName $SlotName\n \n Write-Host \"Kudu Auth Token\":\n Write-Host $kuduApiAuthorisationToken\n \n if ([string]::IsNullOrWhiteSpace($SlotName)) {\n $kuduApiUrl = \"https://$WebAppName.scm.azurewebsites.net/api/vfs\"\n } else {\n $kuduApiUrl = \"https://$WebAppName`-$SlotName.scm.azurewebsites.net/api/vfs\"\n }\n \n Write-Host \"API Url: $($kuduApiUrl)\"\n Write-Host \"File Path: $($kuduPath)\"\n \n Invoke-RestMethod -Uri \"$kuduApiUrl/site/wwwroot/$kuduPath\" `\n -Headers @{\"Authorization\"=$kuduApiAuthorisationToken;\"If-Match\"=\"*\"} `\n -Method DELETE \n}\n\nfunction Delete-FilesAndFoldersFromWebApp($ResourceGroupName, $WebAppName, $SlotName, $FilesList, $RetryAttempts = 3) {\n\n $list = $FilesList.Split([Environment]::NewLine)\n\n foreach($item in $list) {\n if(![string]::IsNullOrWhiteSpace($item)) {\n\n $retryCount = $RetryAttempts\n $retry = $true\n\n while ($retryCount -gt 0 -and $retry) {\n try {\n $retryCount = $retryCount -1\n\n Delete-PathFromWebApp $ResourceGroupName $WebAppName $SlotName $item\n\n $retry = $false\n } catch {\n $retry = $true\n if($retryCount -eq 0) {\n throw (\"Exceeded retry attempts \" + $RetryAttempts + \" for \" + $item)\n }\n }\n }\n }\n }\n}\n\nDelete-FilesAndFoldersFromWebApp $ResourceGroupName $WebAppName $SlotName $FilesList $RetryAttempts","Octopus.Action.Azure.AccountId":"#{AzureAccount}"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-delete-from-webapp.json","Website":"/step-templates/7a3caa63-8312-4e6e-aeb9-674022e5da2f","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":"1f40e418-17bf-4b3e-bbe7-c6d41cbded93","Name":"Azure Web App - Restart","Description":"Restarts an azure web app.\n
\n\n*Note This template is designed to run against an azure web app octopus target
*\n*Depends on Azure CLI and powershell to be installed on the running machine
*","Version":1,"ExportedAt":"2020-06-08T18:38:30.045Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"e732ddaa-a43b-4369-8813-065286069d65","Name":"azWebApp.AzureAcct","Label":"Azure Account","HelpText":"The azure account that has access to the web app","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"901ec60b-0ffd-4d08-be6f-fa9e8aec457a","Name":"azWebApp.StartIfStopped","Label":"Start if stopped","HelpText":"If the web app is stopped, start it","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","OctopusUseBundledTooling":"False","Octopus.Action.Azure.AccountId":"#{azWebApp.AzureAcct}","Octopus.Action.Script.ScriptBody":"try {az --version}\ncatch\n{\n throw \"az CLI not installed\"\n}\n\n$webApp = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$resourceGroup = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n$startIfStopped = $OctopusParameters[\"azWebApp.StartIfStopped\"]\n\nWrite-Host \"Checking webapp $webApp status in resource group $resourceGroup\"\n\n$appState = az webapp list --resource-group $resourceGroup --query \"[?name=='$webApp'].{state: state, hostName: defaultHostName}\" | ConvertFrom-Json\nif($appState.state -eq \"stopped\")\n{\n if($startIfStopped) -eq 'true')\n {\n Write-Host \"Webapp is not running. Starting...\" -NoNewline\n \taz webapp start --name $webApp --resource-group $resourceGroup\n Write-Host \"Done\"\n }\n else\n {\n Throw \"Webapp is not running.\"\n }\n}\n\nWrite-Host \"Webapp running, restarting\"\n\nelse\n{\n\tWrite-Host \"Restarting $webApp in resource group $resourceGroup\"\n\taz webapp restart --name $webApp --resource-group $resourceGroup\n}\n\nStart-Sleep -s 5\n\n$appState = az webapp list --resource-group $resourceGroup --query \"[?name=='$webApp'].{state: state, hostName: defaultHostName}\" | ConvertFrom-Json\n\nif($appState.state -ne \"running\")\n{\n\tThrow \"Webapp failed to start. Check the app's activity/error log\"\n}\n\nwrite-host \"Webapp $webApp running. Check at: $($appState.hostName)\"\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-restart.json","Website":"/step-templates/1f40e418-17bf-4b3e-bbe7-c6d41cbded93","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":"850667b2-567d-46ba-a87d-d85dc31ebc83","Name":"Azure Web App - Set App Settings","Description":"Sets the Azure web app settings of a targeted Azure web app deployment target. Will use the deployment slot if defined.\n
\n\n*Note This template is designed to run against an azure web app octopus target
*\n*Depends on Azure CLI and powershell to be installed on the worker
*","Version":1,"ExportedAt":"2020-06-30T15:48:06.905Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"598025e6-2d89-49bf-8abb-fda6da181de5","Name":"azureWebAppSettings.azAccount","Label":"Azure Account","HelpText":"An Azure account with permissions to the subscription and web app being modified","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"5d232cfd-8e9f-4b3e-8c4e-7bf3a75ced19","Name":"azureWebAppSettings.settings","Label":"Web App Settings","HelpText":"The web app settings to append or update. Each new setting should be on a new line as a key value pair using the template `key=value`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"9bbee2cf-c57c-45db-8a7f-62a752779b56","Name":"azureWebAppSettings.isSlotSettings","Label":"Is Slot Settings","HelpText":"This is used to distinguish what settings are slot specific and which one are not. Slot setting do not follow the deployed app when the slot is swapped.","DefaultValue":"false","DisplaySettings":{"Octopus.ControlType":"Checkbox"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{azureWebAppSettings.azAccount}","Octopus.Action.Script.ScriptBody":"$webAppName = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$rg = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n$slot = $OctopusParameters[\"Octopus.Action.Azure.DeploymentSlot\"]\n$isSlotSettings = $OctopusParameters[\"azureWebAppSettings.isSlotSettings\"]\n\n$settingsType = \"settings\"\n\n$appSettings = $OctopusParameters[\"azureWebAppSettings.settings\"]\n\n$settings = \"\"\n\nWrite-Host \"Parsing Settings\"\n\n$appSettings -split \"`n\" | ForEach-Object { $settings += \"$_ \"}\n\n$settings = $settings.TrimEnd(' ')\n\n$cmdArgs = \"--name $webAppName --resource-group $rg\"\n\nif(![string]::IsNullOrEmpty($slot))\n{\n\tif($isSlotSettings -eq 'true')\n {\n \t$settingsType = \"slot-settings\"\n }\n \n\t$settings += \" --slot $slot\"\n}\n\n$settingsArgs = \" --$settingsType $settings\"\n\nWrite-Host \"Setting app settings\"\n\n$cmd = \"az webapp config appsettings set $cmdArgs $settingsArgs\"\n\nwrite-verbose \"command to execute: $cmd\"\n\nInvoke-Expression $cmd\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-set-app-settings.json","Website":"/step-templates/850667b2-567d-46ba-a87d-d85dc31ebc83","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":"36791d2d-aa55-4bc7-bee4-a0d12d73f78e","Name":"Azure Web App - Set Traffic","Description":"Sets the traffic distribution between multiple web app slots.\n
\n\n*Note This template is designed to run against an azure web app octopus target, but will not use the slot defined.
*\n*Depends on Azure CLI and powershell to be installed on the worker
*","Version":1,"ExportedAt":"2020-06-29T16:52:24.007Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"53d1306d-691c-4739-a09a-8fc9d66c60d3","Name":"azWebAppSetTraffic.AzureAcct","Label":"Azure Account","HelpText":"An Azure account with permissions to the subscription and web app being modified","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"1f788822-9980-44cc-9e9c-f87db5998dd5","Name":"azWebAppSetTraffic.trafficDistro","Label":"Traffic Distribution","HelpText":"\nThe distribution of traffic in percent (0-100). Each web app slot should be defined on a separate line. Any remaining percentage will automatically be applied to production.\n
\n*Example*\n```\nmyOtherSlot=10\nstage=30\n```\n
","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{azWebAppSetTraffic.AzureAcct}","Octopus.Action.Script.ScriptBody":"$webAppName = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$rg = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n\n$trafficDistro = $OctopusParameters[\"azWebAppSetTraffic.trafficDistro\"]\n\n$cmdArgs = \"--name $webAppName --resource-group $rg\" \n\n$cmdAction = \"clear\"\n\nwrite-host \"Checking distribution\"\nif(![string]::IsNullOrEmpty($trafficDistro))\n{\n\t$distribution = \"\"\n\n\t$trafficDistro -split \"`n\" | ForEach-Object { $distribution += \"$_ \"}\n\n\t$distribution = $distribution.TrimEnd(' ')\n \n $cmdArgs += \" --distribution $distribution\"\n \n $cmdAction = \"set\"\n}\n\n\n$cmd = \"az webapp traffic-routing $cmdAction $cmdArgs\"\n\nwrite-verbose \"cmd to invoke: $cmd\"\n\nwrite-host \"setting distributions\"\ninvoke-expression $cmd\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-set-traffic.json","Website":"/step-templates/36791d2d-aa55-4bc7-bee4-a0d12d73f78e","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":"f256502a-4143-4d29-914e-80e541b05783","Name":"Azure Web App - Slot Swap","Description":"Swaps an azure web app slot. Defaults to the deployment slot defined in the web app target.\n
\n\n*Note This template is designed to run against an azure web app octopus target
*\n*Depends on Azure CLI and powershell to be installed on the running machine
*","Version":3,"ExportedAt":"2020-06-25T15:05:37.259Z","ActionType":"Octopus.AzurePowerShell","Author":"harrisonmeister","Packages":[],"Parameters":[{"Id":"a204505b-f995-40ff-95b3-300638d9b9df","Name":"azureWebAppSwap.AzAccount","Label":"Azure Account","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"0b3383f9-31ae-402c-af57-be3b82a3d5b9","Name":"azWebAppSwap.targetSlot","Label":"Target Slot","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"7e4ed213-d5bb-4725-b13f-78e366535479","Name":"azWebAppSwap.sourceSlot","Label":"Source Slot","HelpText":null,"DefaultValue":"#{Octopus.Action.Azure.DeploymentSlot}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$rg = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n$webAppName = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$destinationSlot = $OctopusParameters[\"azWebAppSwap.targetSlot\"]\n$sourceSlot = $OctopusParameters[\"azWebAppSwap.sourceSlot\"]\n\nif([string]::IsNullOrEmpty($sourceSlot))\n{\n\tthrow \"value for source slot must be provided\"\n}\n\n$cmdArgs = \"-g $rg -n $webAppName -s $sourceSlot\"\n\nif(![string]::IsNullOrEmpty($destinationSlot)) {$cmdArgs += \" --target-slot $destinationSlot\"}\n\n$cmd = \"az webapp deployment slot swap $cmdArgs\"\n\nwrite-verbose \"command being invoked: $cmd\"\n\nInvoke-Expression $cmd","Octopus.Action.Azure.AccountId":"#{azureWebAppSwap.AzAccount}"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-slot-swap.json","Website":"/step-templates/f256502a-4143-4d29-914e-80e541b05783","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":"96ce9c63-91b5-4773-9511-830a2e106083","Name":"Azure Web App - Start","Description":"Starts an azure web app.\n
\n\n*Note This template is designed to run against an azure web app octopus target
*\n*Depends on Azure CLI and powershell to be installed on the running machine
*","Version":1,"ExportedAt":"2020-06-08T18:36:48.569Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"bcb5fe61-4f02-44af-85b9-8c9197567d50","Name":"azWebApp.AzureAcct","Label":"Azure Account","HelpText":"The azure account that has access to the web app","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","OctopusUseBundledTooling":"False","Octopus.Action.Azure.AccountId":"#{azWebApp.AzureAcct}","Octopus.Action.Script.ScriptBody":"try\n{\n\taz --version\n}\n\ncatch\n{\n\tthrow \"az cli not installed\"\n}\n\n$webApp = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$resourceGroup = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n\n$appState = az webapp list --resource-group $resourceGroup --query \"[?name=='$webApp'].{state: state, hostName: defaultHostName}\" | ConvertFrom-Json\n\nif($appState.state -eq 'running')\n{\n\tWrite-Host \"Web App $webApp already running\"\n return \n}\n\nWrite-Host \"Starting web app $webApp in resource group $resourceGroup\"\naz webapp start --name $webApp --resource-group $resourceGroup\n\nStart-Sleep -s 5\n\n$appState = az webapp list --resource-group $resourceGroup --query \"[?name=='$webApp'].{state: state, hostName: defaultHostName}\" | ConvertFrom-Json\n\nif($appState.state -ne \"running\")\n{\n\tThrow \"Webapp failed to start. Check the app's activity/error log\"\n}\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-start.json","Website":"/step-templates/96ce9c63-91b5-4773-9511-830a2e106083","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":"5178ba6d-e0b9-4176-8487-148060ed3a70","Name":"Azure Web App - Stop","Description":"Stops an azure web app.\n
\n\n*Note This template is designed to run against an azure web app octopus target
*\n*Depends on Azure CLI and powershell to be installed on the running machine
*","Version":1,"ExportedAt":"2020-06-08T18:36:07.610Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"bcb5fe61-4f02-44af-85b9-8c9197567d50","Name":"azWebApp.AzureAcct","Label":"Azure Account","HelpText":"The azure account that has access to the web app","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","OctopusUseBundledTooling":"False","Octopus.Action.Azure.AccountId":"#{azWebApp.AzureAcct}","Octopus.Action.Script.ScriptBody":"try\n{\n\taz --version\n}\n\ncatch\n{\n\tthrow \"az cli not installed\"\n}\n\n$webApp = $OctopusParameters[\"Octopus.Action.Azure.WebAppName\"]\n$resourceGroup = $OctopusParameters[\"Octopus.Action.Azure.ResourceGroupName\"]\n\n$appState = az webapp list --resource-group $resourceGroup --query \"[?name=='$webApp'].{state: state, hostName: defaultHostName}\" | ConvertFrom-Json\n\nif($appState.state -eq 'stopped')\n{\n\tWrite-Host \"Web App $webApp already stopped\"\n return\n}\n\nWrite-Host \"Stopping webapp $webApp in group $resourceGroup\"\naz webapp stop --name $webApp --resource-group $resourceGroup\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-web-app-stop.json","Website":"/step-templates/5178ba6d-e0b9-4176-8487-148060ed3a70","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":"140d22e8-abe9-4a32-aab7-20af667c6255","Name":"Azure Website - Load App Settings From File (Geta)","Description":"Loads app settings from a json file (e.g. local.settings.json) which is also json-transformed to inject environment-specific values.","Version":6,"ExportedAt":"2019-01-22T09:58:08.811Z","ActionType":"Octopus.AzurePowerShell","Author":"sarbis","Packages":[{"Id":"31f79f978a2e46f9b3add02f695e672b","Name":"LoadAppSettingsFromFile.Package","PackageId":"#{Parameters.PackageId}","FeedId":"feeds-builtin","AcquisitionLocation":"Server","Properties":{"Extract":"True"}}],"Parameters":[{"Id":"e21c4265-7e92-4893-a359-3d8c4b0223c2","Name":"Parameters.ResourceGroup.Name","Label":"Resource group name","HelpText":"Name of the target resource group.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"4485ab2e-2003-4fab-814f-90ce9a338cce","Name":"Parameters.WebApp.Name","Label":"Webapp / function name","HelpText":"Name of the target webapp.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"f589143a-3f46-4a2b-b14f-02469ed80c19","Name":"Parameters.SettingsFile.Path","Label":"Settings file path","HelpText":"Path of the JSON settings file relative to script directory. Or in most of the cases easiest is to use Octopus Action variable for the extract path: `#{Octopus.Action.Package[LoadAppSettingsFromFile.Package].ExtractedPath}`","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"fb46e50c-283a-4d7d-b4ec-2a171f76d8c4","Name":"Parameters.DeploySlot.Name","Label":"Deploy slot name","HelpText":"Name of the deploy slot. Production slot will be updated if left blank.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"81b491a9-e1f5-4b22-b9d2-22df2bb60686","Name":"Parameters.PackageId","Label":"Package Id","HelpText":"Id of the referenced package which when extracted might contain the settings file.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Azure.AccountId":"#{Azure.Subscription.Name}","Octopus.Action.Package.JsonConfigurationVariablesEnabled":"True","Octopus.Action.EnabledFeatures":"Octopus.Features.JsonConfigurationVariables","Octopus.Action.Package.JsonConfigurationVariablesTargets":"#{Parameters.SettingsFile.Path}","Octopus.Action.Script.ScriptFileName":null,"Octopus.Action.Package.PackageId":"#{Utilities.PackageId}","Octopus.Action.Package.FeedId":"feeds-builtin","Octopus.Action.Package.DownloadOnTentacle":"False","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"Function Get-Parameter($Name, $Required, $Default, [switch]$FailOnValidate) {\n $result = $null\n $errMessage = [string]::Empty\n\n If ($null -ne $OctopusParameters) {\n $result = $OctopusParameters[$Name]\n Write-Host (\"Octopus parameter value for \" + $Name + \": \" + $result)\n }\n\n If ($null -eq $result) {\n $variable = Get-Variable $Name -EA SilentlyContinue\n if ($null -ne $variable) {\n $result = $variable.Value\n }\n }\n\n If ($null -eq $result) {\n If ($Required) {\n $errMessage = \"Mandatory parameter '$Name' not specified\"\n }\n Else {\n $result = $Default\n }\n } \n\n If (-Not [string]::IsNullOrEmpty($errMessage)) {\n If ($FailOnValidate) {\n Throw $errMessage\n }\n Else {\n Write-Warning $errMessage\n }\n }\n\n return $result\n}\n\nFunction Main(\n [Parameter(Mandatory = $true)][string] $azureResourceGroupName,\n [Parameter(Mandatory = $true)][string] $azureWebAppName,\n [Parameter(Mandatory = $true)][string] $azureSettingsFilePath,\n [Parameter(Mandatory = $false)][string] $azureDeploySlotName = $null\n) {\n Write-Host \"Start AzureLoadAppSettingsFromFile\"\n\n If ((Test-Path $azureSettingsFilePath) -ne $true) {\n Write-Warning \"Settings file '$azureSettingsFilePath' not found!\"\n Exit 0\n }\n\n $settingsJson = Get-Content -Raw -Path $azureSettingsFilePath | ConvertFrom-Json\n\n If (($settingsJson -eq $null) -or ($settingsJson.Values -eq $null)) {\n Write-Warning \"Settings file '$azureSettingsFilePath' doesn't contain Values object. Unable to load app settings!\"\n Exit 0\n }\n\n # Parse app settings into a hashtable object\n\n $settingsValues = $settingsJson.Values\n\n $appSettings = @{}\n $settingsValues.psobject.properties | Foreach { $appSettings[$_.Name] = $_.Value }\n\n # Set app settings for either slot or a webapp\n\n If ([string]::IsNullOrEmpty($azureDeploySlotName)) {\n Set-AzureRmWebApp -Name $azureWebAppName -ResourceGroupName $azureResourceGroupName -AppSettings $appSettings\n } Else {\n Set-AzureRmWebAppSlot -Name $azureWebAppName -ResourceGroupName $azureResourceGroupName -AppSettings $appSettings -Slot $azureDeploySlotName\n }\n\n Write-Host \"End AzureLoadAppSettingsFromFile\"\n}\n\n& Main `\n -azureResourceGroupName (Get-Parameter \"Parameters.ResourceGroup.Name\" $true \"\" $true) `\n -azureWebAppName (Get-Parameter \"Parameters.WebApp.Name\" $true \"\" $true) `\n -azureSettingsFilePath (Get-Parameter \"Parameters.SettingsFile.Path\" $true \"\" $true) `\n -azureDeploySlotName (Get-Parameter \"Parameters.DeploySlot.Name\" $false \"\" $true)"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-load-appsettings-from-file.json","Website":"/step-templates/140d22e8-abe9-4a32-aab7-20af667c6255","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":"07b23f27-e76a-4b4b-acb1-017006a83269","Name":"Azure Windows - Install Octopus Tentacle","Description":"This step template will install the latest tentacle on an Azure hosted, Windows virtual machine. This will also open the firewall for inbound traffic on port 10933 on both the NSG and the the vm.\n
\n*note: expects the Azure CLI to be installed on the worker running this task*","Version":2,"ExportedAt":"2020-08-11T13:38:32.140Z","ActionType":"Octopus.AzurePowerShell","Author":"xtreampb","Packages":[],"Parameters":[{"Id":"dea51842-271f-48fa-901e-243488049f97","Name":"installWinTentacle.AzureAccount","Label":"Azure Account","HelpText":"Azure account with permissions to the virtual machine in which to install the tentacle on","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"AzureAccount"}},{"Id":"6a97548c-3b97-4a19-8b9a-45aa58ac62d9","Name":"installWinTentacle.azRgName","Label":"Azure Resource Group","HelpText":"The name of the resource group housing the NSG and VM","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"d9efb017-65c0-4010-b09f-0a6a34fc009f","Name":"installWinTentacle.azNsgName","Label":"NSG Name","HelpText":"The name of the azure network security group to create ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"36c6d441-9fe8-4ea2-957a-2135aa9d1687","Name":"installWinTentacle.azNsgRulePriority","Label":"Azure NSG Rule Priority","HelpText":"the priority to assign to the NSG rule created for the octopus tentacle. Defaults to 400","DefaultValue":"400","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e4358aec-2798-412a-bcd2-1c7e41a0728d","Name":"installWinTentacle.azVmName","Label":"VM Name","HelpText":"The name of the virtual machine to target when ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8dbe0a29-4e0f-43f8-8ef2-ae23a2884e85","Name":"installWinTentacle.octoServerThumb","Label":"Server Thumbprint","HelpText":"The Thumbprint of the octopus server","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"a0859551-6c84-45d1-af2b-c57becb4e8ef","Name":"installWinTentacle.octoApiKey","Label":"API Key","HelpText":"The API key used to configure the tentacle.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"dd07815d-bfb7-43b9-90f8-21ec5a2d2953","Name":"installWinTentacle.octopusRoles","Label":"Roles","HelpText":"Roles to assign to this tentacle installation.
\n*Note: Each role should be on it's own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"d3ffb38e-7fcf-4547-be9a-6cd8e46f8e5e","Name":"installWinTentacle.octopusEnvironments","Label":"Environments","HelpText":"Environments to assign this tentacle installation to.
\n*Note: Each environment should be on its own line*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"}},{"Id":"15150827-7bd3-4146-a798-66344851f602","Name":"instrallTentacle.octoServerUrl","Label":"Server Url","HelpText":"The server url to register the tentacle with. Defaults to the base url","DefaultValue":"#{Octopus.Web.BaseUrl}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"9bcd6bb5-2db3-453f-b4f6-6a78f3c39b59","Name":"installWinTentacle.tentacleType","Label":"Tentacle Type","HelpText":"Select between a listing or polling tentacle","DefaultValue":"Listening","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"TentaclePassive|Listening\nTentacleActive|Polling"}},{"Id":"6bb98570-fe3e-4ab7-adfb-79ef7ce5c2ce","Name":"installWinTentacle.tentacleHostName","Label":"Tentacle Host Name","HelpText":"The host name to register the listening tentacles with. Octopus deploy server uses this value to reach out to the vm.
\n*Note: Leave blank to automatically use assigned public IP address.*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"7cbbafc4-5eed-41bd-ad9d-c1e67567a469","Name":"installWinTentacle.portNumber","Label":"Port Number","HelpText":"Port number used when installing and registering the tentacle. This port is also opened when installing a listening tentacle","DefaultValue":"10933","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Azure.AccountId":"#{installWinTentacle.AzureAccount}","Octopus.Action.Script.ScriptBody":"$nsgName = $OctopusParameters[\"installWinTentacle.azNsgName\"]\n$resourceGroup = $OctopusParameters[\"installWinTentacle.azRgName\"]\n$nsgRulePriority = $OctopusParameters[\"installWinTentacle.azNsgRulePriority\"]\n$vmName = $OctopusParameters[\"installWinTentacle.azVmName\"]\n$serverUri = $OctopusParameters[\"instrallTentacle.octoServerUrl\"]\n$apiKey = $OctopusParameters[\"installWinTentacle.octoApiKey\"]\n$rolesRaw = $OctopusParameters[\"installWinTentacle.octopusRoles\"]\n$enviroRaw = $OctopusParameters[\"installWinTentacle.octopusEnvironments\"]\n$octoThumb = $OctopusParameters[\"installWinTentacle.octoServerThumb\"]\n$comStyle = $OctopusParameters[\"installWinTentacle.tentacleType\"]\n$hostname = $OctopusParameters[\"installWinTentacle.tentacleHostName\"]\n$portNumber = $OctopusParameters[\"installWinTentacle.portNumber\"]\n\nWrite-Host \"Parsing Parameters\"\n\nif([string]::IsNullOrEmpty($rolesRaw))\n{\n\tthrow \"At least one role must be defined\"\n}\n\nif([string]::IsNullOrEmpty($enviroRaw))\n{\n\tthrow \"At least one environment must be defined\"\n}\n\n$roles = \"\"\n$rolesRaw -split \"`n\" | ForEach-Object { $roles += \"--role $_ \"}\n$roles = $roles.TrimEnd(' ')\n\n$environments = \"\"\n$enviroRaw -split \"`n\" | ForEach-Object { $environments += \"--environment $_ \"}\n$environments = $environments.TrimEnd(' ')\n\nif($comStyle -eq \"TentaclePassive\")\n{\n\tif([string]::IsNullOrEmpty($hostname))\n {\n \t$hostname = az vm show -d -g $resourceGroup -n $vmName --query publicIps -o tsv\n $hostname = $hostname.Trim(\"`n\")\n }\n \n $noListen = \"--port $portNumber --noListen `\"false`\"\"\n $comStyle += \" --publicHostName=`\"$hostname`\"\"\n $openFirewall = 'true'\n}\nelse\n{\n\t$noListen = \"--noListen `\"true`\"\"\n $openFirewall = 'false'\n}\n\nif($openFirewall -eq 'true')\n{\n\tWrite-Host \"Creating NSG Rule\"\n\taz network nsg rule create --name \"OctopusTentacle\" --nsg-name $nsgName --priority $nsgRulePriority --resource-group $resourceGroup --direction Inbound --destination-port-ranges $portNumber\n}\n\n$remoteScript = @\"\n`$msiLocation = \"`$env:TEMP\\`$(new-guid).msi\"\n\nif(`$env:PROCESSOR_ARCHITECTURE -eq \"x86\") \n{\n `$downloadPath = \"http://octopus.com/downloads/latest/OctopusTentacle\"\n}\nelse\n{\n `$downloadPath = \"http://octopus.com/downloads/latest/OctopusTentacle64\"\n}\n\nInvoke-WebRequest -Uri `$downloadPath -OutFile `$msiLocation -UseBasicParsing\n\nStart-Process `$msiLocation /quiet -Wait\n\nRemove-Item `$msiLocation\n\n\"@\n\nWrite-Host \"Installing tentacle on remote machine\"\n\nSet-Content -Value $remoteScript -Path \".\\script.ps1\"\n\n$result = az vm run-command invoke --command-id RunPowerShellScript --name $vmName -g $resourceGroup --scripts \"@script.ps1\"\n\n$result\n\n$msg = (($result | convertfrom-json).value | where {$_.code -eq \"componentstatus/stderr/succeeded\"}).message\n\nif(![string]::IsNullOrEmpty($msg))\n{\n\tthrow $msg\n}\n\nWrite-Verbose \"hostname: $hostname`noListen: $noListen\"\n\n$remoteScript = @\"\n\ncd \"C:\\Program Files\\Octopus Deploy\\Tentacle\"\n\n.\\Tentacle.exe create-instance --instance \"Tentacle\" --config \"C:\\Octopus\\Tentacle.config\" --console\n.\\Tentacle.exe new-certificate --instance \"Tentacle\" --if-blank --console\n.\\Tentacle.exe configure --instance \"Tentacle\" --reset-trust --console\n.\\Tentacle.exe configure --instance \"Tentacle\" --home \"C:\\Octopus\" --app \"C:\\Octopus\\Applications\" $noListen --console\n.\\Tentacle.exe configure --instance \"Tentacle\" --trust \"$octoThumb\" --console\nif('$openFirewall' -eq 'true'){\n\tNew-NetFirewallRule -DisplayName \"Octopus Tentacle\" -Direction Inbound -LocalPort $portNumber -Protocol TCP -Action Allow\n}\n.\\Tentacle.exe register-with --instance \"Tentacle\" --server \"$serverUri\" --apiKey=$apiKey $roles $environments --comms-style $comStyle --force --console\n.\\Tentacle.exe service --instance \"Tentacle\" --install --start --console\n\n\"@\n\nWrite-Host \"Configuring tentacle on remote machine\"\n\nSet-Content -Value $remoteScript -Path \".\\script.ps1\"\n\n$result = az vm run-command invoke --command-id RunPowerShellScript --name $vmName -g $resourceGroup --scripts \"@script.ps1\"\n\n$result\n\n$msg = (($result | convertfrom-json).value | where {$_.code -eq \"componentstatus/stderr/succeeded\"}).message\n\nif(![string]::IsNullOrEmpty($msg))\n{\n\tthrow $msg\n}\n"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/azure-install-windows-tentacle.json","Website":"/step-templates/07b23f27-e76a-4b4b-acb1-017006a83269","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":"633e7b90-7025-45d4-b16f-f92d6cf25c9e","Name":"Backup Azure Database To Azure Storage","Description":"Create a backup of SQL Azure Database and store it in Azure Blob Storage. Requires Azure PowerShell to be installed on Tentacle machine.","Version":7,"ExportedAt":"2015-03-25T08:48:19.055+00:00","ActionType":"Octopus.Script","Author":"trailmax","Parameters":[{"Name":"DatabaseServerName","Label":"Database Server Name","HelpText":"Azure SQL Server name, i.e. \"d340fe8ok\". Not a full name, just the machine name","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DatabaseName","Label":"Database Name","HelpText":"Name of the database to be backed-up","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DatabasePassword","Label":"Database Password","HelpText":"SQL Server Password to access the database","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"DatabaseUsername","Label":"Database Username","HelpText":"SQL Server Username to access the database","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"StorageName","Label":"Storage Name","HelpText":"Name of the storage account where the backup should go","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"StorageKey","Label":"Storage Key","HelpText":"Access key to the storage account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"StorageContainerName","Label":"Storage Container Name","HelpText":"Name of the container where the backup should go","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$dateTime = get-date -Format u\n$blobName = \"Deployment-Backup/$DatabaseName/$dateTime.bacpac\"\nWrite-Host \"Using blobName: $blobName\"\n\n# Create Database Connection\n$securedPassword = ConvertTo-SecureString -String $DatabasePassword -asPlainText -Force\n$serverCredential = new-object System.Management.Automation.PSCredential($DatabaseUsername, $securedPassword) \n$databaseContext = New-AzureSqlDatabaseServerContext -ServerName $DatabaseServerName -Credential $serverCredential\n\n# Create Storage Connection\n$storageContext = New-AzureStorageContext -StorageAccountName $StorageName -StorageAccountKey $StorageKey\n\n# Initiate the Export\n$operationStatus = Start-AzureSqlDatabaseExport -StorageContext $storageContext -SqlConnectionContext $databaseContext -BlobName $blobName -DatabaseName $DatabaseName -StorageContainerName $StorageContainerName\n\n# Wait for the operation to finish\ndo{\n $status = Get-AzureSqlDatabaseImportExportStatus -Request $operationStatus \n Start-Sleep -s 3\n $progress =$status.Status.ToString()\n Write-Host \"Waiting for database export completion. Operation status: $progress\" \n}until ($status.Status -eq \"Completed\")\nWrite-Host \"Database export is complete\"","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Azure","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/backup-azure-database-to-azure-storage.json","Website":"/step-templates/633e7b90-7025-45d4-b16f-f92d6cf25c9e","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":"18392835-d50e-4ce9-9065-8e15a3c30954","Name":"Chain Deployment","Description":"Triggers a deployment of another project in Octopus","Version":22,"ExportedAt":"2020-12-31T14:59:01.160Z","ActionType":"Octopus.Script","Author":"joshgk00","Packages":[],"Parameters":[{"Id":"61bffab9-bb89-4107-a5e0-79d69eaf8f2a","Name":"Chain_ApiKey","Label":"API Key","HelpText":"An Octopus API Key with appropriate permissions to perform the deployment","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"},"Links":{}},{"Id":"a37cac4d-8fd3-4d58-bfda-45a436be8dd5","Name":"Chain_ProjectName","Label":"Project Name","HelpText":"Name of the Octopus project that should be deployed","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"4fd440af-70fe-41ca-bec3-074f05155e81","Name":"Chain_Channel","Label":"Channel Name","HelpText":"The project channel to use when finding or [creating](https://octopus.com/docs/key-concepts/projects/channels#Channels-CreatingReleases) the release to deploy\n\n_Leave blank to use the default channel_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"78739052-438d-4dc7-862a-d4567eafc5df","Name":"Chain_ReleaseNum","Label":"Release Number","HelpText":"Release number to use for the deployment\n\n_Leave blank to use the latest release in the channel_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"fd2c3474-7187-4356-aaec-96f4910bb9c5","Name":"Chain_CreateOption","Label":"Create new release?","HelpText":"If a release should be created as part of this deployment\n\n\nThe release is created using either the **Release Number** if specified, or from the project release version template / donor package step if not specified\n\nA release will not be created if it is found to already exist","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}},{"Id":"f648fa0c-b271-4e4a-b4f2-7a88db6b605c","Name":"Chain_SnapshotVariables","Label":"Update Variable Snapshot?","HelpText":"Should variables in the release be updated before deploying?\n\nBy updating the variables, the current snapshot will be discarded, and the latest variables (as seen on the Variables tab) will be imported","DefaultValue":"False","DisplaySettings":{"Octopus.ControlType":"Checkbox"},"Links":{}},{"Id":"80634b3b-3171-4643-b164-a5077c6d387b","Name":"Chain_DeployTo","Label":"Environment Name","HelpText":"The name of an environment to deploy to\n\nMultiple environments can be deployed to by entering the name of a [lifecycle phase](https://octopus.com/docs/key-concepts/lifecycles#Lifecycles-LifecyclePhases)","DefaultValue":"#{Octopus.Environment.Name}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"1334093d-0be4-4115-bb93-d752171a19d8","Name":"Chain_Tenants","Label":"Tenants","HelpText":"_Leave blank to perform an untenanted deployment_\n\nA list of [tenants & tenant tags](https://octopus.com/docs/key-concepts/tenants) to deploy. Tenant Tags are specified in [Canonical Name](https://octopus.com/docs/key-concepts/tenants/tenant-tags#TenantTags-Referencingtenanttags) format:\n\n Tag Set Name/Tag Name\n\nIndividual tenants can be listed in addition to tags\n\n Tenant Name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"83d9d973-7a72-4f71-a890-8f19d955bc37","Name":"Chain_FormValues","Label":"Form Values","HelpText":"Provide values for [prompted variables](https://octopus.com/docs/deploying-applications/variables/prompted-variables) to use in the deployment\n\nVariables should be listed one per line using the format\n\n VariableName = Value","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"6522ca29-898a-4da6-b0c3-da52991e6812","Name":"Chain_StepsToSkip","Label":"Steps To Skip","HelpText":"A list of steps which should be skipped in the deployment\n\nSteps should be listed one per line, and specified using either the step number (as per the deployment plan) or by the step name","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}},{"Id":"acb2cd0e-fc53-42a7-95da-089955ea1870","Name":"Chain_GuidedFailure","Label":"Failure Handling","HelpText":"Determines how deployment failures & [guided failure mode](https://octopus.com/docs/deploying-applications/guided-failures) should be handled for the deployment\n\nAutomatic failure handling is performed by using [guided failure](https://octopus.com/docs/deploying-applications/guided-failures) and submitting an appropriate action\n\nThe number of retry attempts can be customised by [setting the following variables in indexer notion](https://octopus.com/docs/deploying-applications/variables/system-variables#Systemvariables-Action)\n- Octopus.Action.StepRetryCount\n- Octopus.Action.DeploymentRetryCount","DefaultValue":"Default","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"Default|Default - Guided Failure is inherited from this deployment\nEnabled|Enable - Guided Failure is enabled\nDisabled|Disable - Guided Failure is disabled\nRetryIgnore|Retry & Ignore - Automatically retry a failing step, a second failure is ignored\nRetryAbort|Retry & Abort - Automatically retry a failing step, and abort on a second failure\nIgnore|Ignore - Automatically ignore any step failures\nRetryDeployment|Retry Deployment - Automatically retry the entire deployment on failure"},"Links":{}},{"Id":"73a80735-4ca0-4c12-9fa3-f0123db6349f","Name":"Chain_DeploySchedule","Label":"Scheduling","HelpText":"Defines how the deployment should be scheduled & run\n\n_Note: Automated failure handling & post-deploy script functionality is only available when the **Wait For Deployment** option is selected_\n\nA user defined schedule can be set with the **Use a custom expression** option\nFor an exact date & time use the following format, the day is optional and the time is in 24-hour format\n\n [Mon/Tue/Wed/Thu/Fri/Sat/Sun] @ HH:MM\n\nTo schedule a deployment a relative number of hours & minutes in the future use\n\n + MMM\n + HHH:MM\n\n_Note: Reoccurring deployments & automatic retry of failed deployment are possible using a scheduled deployment and the [Always Run or On Failure run conditions](https://octopus.com/docs/deploying-applications#Deployingapplications-Conditions)_","DefaultValue":"WaitForDeployment","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"WaitForDeployment|Wait For Deployment\nNoWait|Queue Immediately\n+ 5|Deploy in 5 minutes\n+ 15|Deploy in 15 minutes\n+ 1:00|Deploy in 1 hour\n+ 24:00|Deploy in 24 hours\n@ 00:00|Deploy At Midnight\n@ 00:00 + 12:00|Deploy At Noon Tomorrow\nMon @ 08:00|Deploy At 8am On Monday\nSat @ 00:00 + 168:00|Deploy the following Saturday at Midnight"},"Links":{}},{"Id":"7e7f9ac5-8674-4a91-a94a-896a3ee1334d","Name":"Chain_PostDeploy","Label":"Post-Deploy Script","HelpText":"A PowerShell script which should be run after a successful deployment\n\nVariables are replaced in the script using the resultant **Manifest VariableSet** from the deployment in the [binding syntax](https://octopus.com/docs/deploying-applications/variables/binding-syntax) format\n\nVariables are not available if they are:\n- [Sensitive](https://octopus.com/docs/deploying-applications/variables/sensitive-variables)\n- Action scoped\n- Machine scoped\n- Role scoped\n\n\nWhen performing a tenanted deployment the script will be run once for each tenant using the specific variables from their deployment","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"MultiLineText"},"Links":{}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.RunOnServer":"true","Octopus.Action.Script.ScriptBody":"<#\n----- Chain Deployment -----\nAuthors & Credits\n Paul Marston @paulmarsy (paul@marston.me)\n Joe Waid @joewaid\n Henrik Andersson @alfhenrik\n Damian Brady @Damovisa\n Aaron Burke @aburke-incomm (aburke@incomm.com)\nLinks\n https://library.octopus.com/step-templates/18392835-d50e-4ce9-9065-8e15a3c30954\n https://github.com/OctopusDeploy/Library/commits/master/step-templates/octopus-chain-deployment.json\n\n----- Advanced Configuration Settings -----\nVariable names can use either of the following two formats: \n Octopus.Action. - will apply to all steps in the deployment, e.g.\n Octopus.Action.DebugLogging\n Octopus.Action[Step Name]. - will apply to 'step name' alone, e.g.\n Octopus.Action[Provision Virtual Machine].DeploymentRetryCount\n\nAvailable Settings:\n - DebugLogging - set to 'True' or 'False' to log all GET web requests\n - GuidedFailureMessage - will change the note used when submitting guided failure actions, the following variables will be replaced in the text:\n #{GuidedFailureActionIndex} - The current count of interrupts for that step e.g. 1\n #{GuidedFailureAction} - The action being submitted by the step e.g. Retry\n - DeploymentRetryCount - will override the number of times a deployment will be retried when unsuccessful and enable retrying when the failure option is set for a different option, default is 1\n - StepRetryCount - will override the number of times a deployment step will be retried before before submitting Ignore or Abort, default is 1\n - RetryWaitPeriod - an additional delay in seconds wait before retrying a failed step/deployment, default is 0\n - QueueTimeout - when scheduling a deployment for later a timeout must be provided, this allows a custom value, default is 30:00, format is hh:mm\n - OctopusServerUrl - will override the base url used for all webrequests, making it possible to chain deployments on a different Octopus instance/server, or as a workaround for misconfigured node settings\n\n----- Changelog -----\n20. Dec 31, 2020 - Josh Slaughter @joshgk00\n\t- Fixed an issue where the script was unable to create a release if Chained project contained a step with multiple package references\n19. Sept 3, 2020 - Mark Hrrison @harrisonmeister\n\t- Included setting to TLS 1.2. \n18. July 17, 2020 - Aaron Burke @aburke-incomm\n\t- Update script handle Regex for Channel Tags in the CreateRelease Function\n17. December 18, 2018 - Jim Burger @burgomg\n\t- Added Spaces compatibility\n16. November 22, 2018 - Patrick Kearney @patrickkearney\n - Fixed an issue where the step was unable to pass a form variable containing an \"=\" in the value.\n15. July 17, 2017 - Robert Glickman @robertglickman\n - Fixed an issue where the step would fail in Octopus 3.15+ due to templated URIs not being handled\n14. May 5, 2017 - Paul Marston @paulmarsy (paul@marston.me)\n - Improved step parameter metadata & validation\n - Added changelog, documentation of advanced settings\n - Supports deploying to multiple environments in one step by specifying a lifecycle phase name e.g. 'Dev'\n - Automated retry of the entire deployment as an additional failure handling option\n - Number of step/deployment retries is configurable using a settings variable\n - Supports Octopus scheduled deployments (can be used for reoccuring scheduled deploys, or autonomous deployment retry)\n - Individual tenants as well as tenant tags can be deployed to\n - Fixing a bug where Guided Failure is always evaluated to true\n - Improved identification of valid environment&tenant promotions by using the 'deployment template' api\n - If a release version has already been created, it will be used rather than erroring trying to recreate it\n - Using 'Fail-Step' for better error logging\n - Fixed a bug where log messages with an identical timestamp were repeatedly reported\n - Added an option to wait before retrying a step/deployment\n - A release's channel is taken into account when checking if an existing release version can be used\n13. Apr 21, 2017 - Paul Marston @paulmarsy (paul@marston.me)\n - Complete step template rewrite\n - Improved logging\n * Logs only written when chained deployment changes\n * Progress of deployment step states is reported\n * Errors & warnings are reported without interpretation in parent deployment\n * Manual intervention & guided failure events are reported\n * Queue position reported before deployment starts\n * Verbose logging of useful API urls\n - Multi-tenancy support and handling multiple tenant deploys from one chain step\n - Support for skipping steps\n - Support for prompted form variables\n - Create release functionality supports using the version from the incremented version template or donor package\n - Ability to snapshot update variables of a release before deploying\n - Automated handling of guided failure scenarios e.g. retry on step failure, then abort if it errors a second time\n - Transient Octopus API request failures are handled (e.g. we saw many deployments failing because of a request timeout)\n - Post-deploy script support with variable substitution performed using the manifest variable set of the chained deployment with appropriate scoping applied (though not advanced scope specificity)\n - Defaulting channel to a blank value which looks for one with 'IsDefault' set true\n - Create release performs a simplified package version lookup to populate the 'SelectedPackages' field\n12. Mar 30, 2017 - Joe Waid @joewaid\n - Pass the Environments \"Guided Failure\" setting\n - Check status after deployment when Chain_WaitForDeployment is true\n11. Nov 21, 2016 - Henrik Andersson @alfhenrik\n - Add Wait for deployment option to chain deployment step template\n10. May 2, 2016 - Damian Brady @Damovisa\n - Add Chained Deployment step template\n#>\n#Requires -Version 5\n$ErrorActionPreference = 'Stop'\n$ProgressPreference = 'SilentlyContinue'\n\n[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n\nfunction Test-String {\n param([Parameter(Position=0)]$InputObject,[switch]$ForAbsence)\n\n $hasNoValue = [System.String]::IsNullOrWhiteSpace($InputObject)\n if ($ForAbsence) { $hasNoValue }\n else { -not $hasNoValue }\n}\n\nfunction Get-OctopusSetting {\n param([Parameter(Position = 0, Mandatory)][string]$Name, [Parameter(Position = 1, Mandatory)]$DefaultValue)\n $formattedName = 'Octopus.Action.{0}' -f $Name\n if ($OctopusParameters.ContainsKey($formattedName)) {\n $value = $OctopusParameters[$formattedName]\n if ($DefaultValue -is [int]) { return ([int]::Parse($value)) }\n if ($DefaultValue -is [bool]) { return ([System.Convert]::ToBoolean($value)) }\n if ($DefaultValue -is [array] -or $DefaultValue -is [hashtable] -or $DefaultValue -is [pscustomobject]) { return (ConvertFrom-Json -InputObject $value) }\n return $value\n }\n else { return $DefaultValue }\n}\n\n# Write functions are re-defined using octopus service messages to preserve formatting of log messages received from the chained deployment and avoid errors being twice wrapped in an ErrorRecord\nfunction Write-Fatal($message, $exitCode = -1) {\n if (Test-Path Function:\\Fail-Step) {\n Fail-Step $message\n }\n else {\n Write-Host (\"##octopus[stdout-error]`n{0}\" -f $message)\n Exit $exitCode\n }\n}\nfunction Write-Error($message) { Write-Host (\"##octopus[stdout-error]`n{0}`n##octopus[stdout-default]\" -f $message) }\nfunction Write-Warning($message) { Write-Host (\"##octopus[stdout-warning]`n{0}`n##octopus[stdout-default]\" -f $message) }\nfunction Write-Verbose($message) { Write-Host (\"##octopus[stdout-verbose]`n{0}`n##octopus[stdout-default]\" -f $message) }\n\n$DefaultUrl = $OctopusParameters['Octopus.Web.BaseUrl']\n# Use \"Octopus.Web.ServerUri\" if it is available\nif ($OctopusParameters['Octopus.Web.ServerUri']) {\n $DefaultUrl = $OctopusParameters['Octopus.Web.ServerUri']\n}\n\n$Chain_BaseUrl = (Get-OctopusSetting OctopusServerUrl $DefaultUrl).Trim('/')\nif (Test-String $Chain_ApiKey -ForAbsence) {\n Write-Fatal \"The step parameter 'API Key' was not found. This step requires an API Key to function, please provide one and try again.\"\n}\n$DebugLogging = Get-OctopusSetting DebugLogging $false\n\nfunction Invoke-OctopusApi {\n param(\n [Parameter(Position = 0, Mandatory)]$Uri,\n [ValidateSet('Get', 'Post', 'Put')]$Method = 'Get',\n $Body,\n [switch]$GetErrorResponse\n )\n $Uri = $Uri -replace '{.*?}',''\n $requestParameters = @{\n Uri = ('{0}/{1}' -f $Chain_BaseUrl, $Uri.TrimStart('/'))\n Method = $Method\n Headers = @{ 'X-Octopus-ApiKey' = $Chain_ApiKey }\n UseBasicParsing = $true\n }\n if ($Method -ne 'Get' -or $DebugLogging) {\n Write-Verbose ('{0} {1}' -f $Method.ToUpperInvariant(), $requestParameters.Uri)\n }\n if ($null -ne $Body) {\n $requestParameters.Add('Body', (ConvertTo-Json -InputObject $Body -Depth 10))\n Write-Verbose $requestParameters.Body\n }\n \n $wait = 0\n $webRequest = $null\n while ($null -eq $webRequest) {\t\n try {\n $webRequest = Invoke-WebRequest @requestParameters\n } catch {\n if ($_.Exception -is [System.Net.WebException] -and $null -ne $_.Exception.Response) {\n $errorResponse = [System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()).ReadToEnd()\n Write-Verbose (\"Error Response:`n{0}\" -f $errorResponse)\n if ($GetErrorResponse) {\n return ($errorResponse | ConvertFrom-Json)\n }\n if ($_.Exception.Response.StatusCode -in @([System.Net.HttpStatusCode]::NotFound, [System.Net.HttpStatusCode]::InternalServerError, [System.Net.HttpStatusCode]::BadRequest, [System.Net.HttpStatusCode]::Unauthorized)) {\n Write-Fatal $_.Exception.Message\n }\n }\n if ($wait -eq 120) {\n Write-Fatal (\"Octopus web request ({0}: {1}) failed & the maximum number of retries has been exceeded:`n{2}\" -f $Method.ToUpperInvariant(), $requestParameters.Uri, $_.Exception.Message) -43\n }\n $wait = switch ($wait) {\n 0 { 30 }\n 30 { 60 }\n 60 { 120 }\n }\n Write-Warning (\"Octopus web request ({0}: {1}) failed & will be retried in $wait seconds:`n{2}\" -f $Method.ToUpperInvariant(), $requestParameters.Uri, $_.Exception.Message)\n Start-Sleep -Seconds $wait\n }\n }\n $webRequest.Content | ConvertFrom-Json | Write-Output\n}\n\nfunction Test-SpacesApi {\n\tWrite-Verbose \"Checking API compatibility\";\n\t$rootDocument = Invoke-OctopusApi 'api/';\n if($rootDocument.Links -ne $null -and $rootDocument.Links.Spaces -ne $null) {\n \tWrite-Verbose \"Spaces API found\"\n \treturn $true;\n }\n Write-Verbose \"Pre-spaces API found\"\n return $false;\n}\n\n$Chain_BaseApiUrl = \"/api\"\nif(Test-SpacesApi) {\n\t$spaceId = $OctopusParameters['Octopus.Space.Id'];\n if([string]::IsNullOrWhiteSpace($spaceId)) {\n throw \"This step needs to be run in a context that provides a value for the 'Octopus.Space.Id' system variable. In this case, we received a blank value, which isn't expected - please reach out to our support team at https://help.octopus.com if you encounter this error.\";\n }\n\t$Chain_BaseApiUrl = \"/api/$spaceId\" ;\n}\n\nenum GuidedFailure {\n Default\n Enabled\n Disabled\n RetryIgnore\n RetryAbort\n Ignore\n RetryDeployment\n}\n\nclass DeploymentContext {\n hidden $BaseUrl\n\thidden $BaseApiUrl\n DeploymentContext($baseUrl, $baseApiUrl) {\n $this.BaseUrl = $baseUrl\n $this.BaseApiUrl = $baseApiUrl\n }\n\n hidden $Project\n hidden $Lifecycle\n [void] SetProject($projectName) {\n $this.Project = Invoke-OctopusApi \"$($this.BaseApiUrl)/projects/all\" | ? Name -eq $projectName\n if ($null -eq $this.Project) {\n Write-Fatal \"Project $projectName not found\"\n }\n Write-Host \"Project: $($this.Project.Name)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.Project.Links.Self)\"\n \n $this.Lifecycle = Invoke-OctopusApi (\"$($this.BaseApiUrl)/lifecycles/{0}\" -f $this.Project.LifecycleId)\n Write-Host \"Project Lifecycle: $($this.Lifecycle.Name)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.Lifecycle.Links.Self)\"\n }\n \n hidden $Channel\n [void] SetChannel($channelName) {\n $useDefaultChannel = Test-String $channelName -ForAbsence\n $this.Channel = Invoke-OctopusApi $this.Project.Links.Channels | % Items | ? { $useDefaultChannel -and $_.IsDefault -or $_.Name -eq $channelName }\n if ($null -eq $this.Channel) {\n Write-Fatal \"$(if ($useDefaultChannel) { 'Default channel' } else { \"Channel $channelName\" }) not found\"\n }\n Write-Host \"Channel: $($this.Channel.Name)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.Channel.Links.Self)\"\n\n if ($null -ne $this.Channel.LifecycleId) {\n $this.Lifecycle = Invoke-OctopusApi (\"$($this.BaseApiUrl)/lifecycles/{0}\" -f $this.Channel.LifecycleId)\n Write-Host \"Channel Lifecycle: $($this.Lifecycle.Name)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.Lifecycle.Links.Self)\" \n }\n }\n\n hidden $Release\n [void] SetRelease($releaseVersion) {\n if (Test-String $releaseVersion) {\n $this.Release = Invoke-OctopusApi (\"$($this.BaseApiUrl)/projects/{0}/releases/{1}\" -f $this.Project.Id, $releaseVersion) -GetErrorResponse\n if ($null -ne $this.Release.ErrorMessage) {\n Write-Fatal $this.Release.ErrorMessage\n }\n }\n else {\n $this.Release = Invoke-OctopusApi $this.Channel.Links.Releases | % Items | Select-Object -First 1\n if ($null -eq $this.Release) {\n Write-Fatal \"There are no releases for channel $($this.Channel.Name)\"\n }\n }\n Write-Host \"Release: $($this.Release.Version)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.BaseApiUrl)/releases/$($this.Release.Id)\"\n }\n [void] CreateRelease($releaseVersion) {\n $template = Invoke-OctopusApi ('{0}/template?channel={1}' -f $this.Project.Links.DeploymentProcess, $this.Channel.Id)\n $selectedPackages = @()\n Write-Host 'Resolving package versions...'\n $template.Packages | % {\n $preReleaseTag = $this.Channel.Rules | ? Actions -contains $_.StepName | ? { $null -ne $_ } | % { '&preReleaseTag={0}' -f $([System.Net.WebUtility]::UrlEncode($_.Tag)) }\n $versionRange = $this.Channel.Rules | ? Actions -contains $_.StepName | ? { $null -ne $_ } | % { '&versionRange={0}' -f $([System.Net.WebUtility]::UrlEncode($_.VersionRange)) }\n\n $package = Invoke-OctopusApi (\"$($this.BaseApiUrl)/feeds/{0}/packages?packageId={1}&partialMatch=false&includeMultipleVersions=false&includeNotes=false&includePreRelease=true&take=1{2}{3}\" -f $_.FeedId, $_.PackageId, $preReleaseTag, $versionRange)\n $packageDesc = \"$($package.Title) @ $($package.Version) for step $($_.StepName)\"\n if ( $_.PackageReferenceName )\n {\n $packageDesc += \"/$($_.PackageReferenceName)\"\n }\n Write-Host \"Found $packageDesc\"\n \n $selectedPackages += @{\n StepName = $_.StepName\n ActionName = $_.ActionName\n PackageReferenceName = $_.PackageReferenceName\n Version = $package.Version\n }\n\n if ( (Test-String $releaseVersion -ForAbsence) -and ($_.StepName -eq $template.VersioningPackageStepName) ) {\n Write-Host \"Release will be created using the version number from package step $($template.VersioningPackageStepName): $($package.Version)\"\n $releaseVersion = $package.Version\n }\n }\n if (Test-String $releaseVersion) {\n $this.Release = Invoke-OctopusApi (\"$($this.BaseApiUrl)/projects/{0}/releases/{1}\" -f $this.Project.Id, $releaseVersion) -GetErrorResponse\n if ( ($null -eq $this.Release.ErrorMessage) -and ($this.Release.Version -ieq $releaseVersion) -and ($this.Release.ChannelId -eq $this.Channel.Id) ) {\n Write-Host \"Release version $($this.Release.Version) has already been created, selecting it for deployment\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.BaseApiUrl)/releases/$($this.Release.Id)\"\n return\n }\n }\n else {\n Write-Host \"Release will be created using the incremented release version: $($template.NextVersionIncrement)\"\n $releaseVersion = $template.NextVersionIncrement\n }\n\n $this.Release = Invoke-OctopusApi \"$($this.BaseApiUrl)/releases?ignoreChannelRules=false\" -Method Post -Body @{\n ProjectId = $this.Project.Id\n ChannelId = $this.Channel.Id \n Version = $releaseVersion\n SelectedPackages = $selectedPackages\n } -GetErrorResponse\n if ($null -ne $this.Release.ErrorMessage) {\n Write-Fatal \"$($this.Release.ErrorMessage)`n$($this.Release.Errors -join \"`n\")\"\n }\n Write-Host \"Release $($this.Release.Version) has been successfully created\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.BaseApiUrl)/releases/$($this.Release.Id)\"\n }\n\n [void] UpdateVariableSnapshot() {\n $this.Release = Invoke-OctopusApi $this.Release.Links.SnapshotVariables -Method Post\n Write-Host 'Variables snapshot update performed. The release now references the latest variables.'\n }\n\n hidden $DeploymentTemplate\n [void] GetDeploymentTemplate() {\n Write-Host 'Getting deployment template for release...'\n $this.DeploymentTemplate = Invoke-OctopusApi $this.Release.Links.DeploymentTemplate\n }\n\n hidden [bool]$UseGuidedFailure\n hidden [string[]]$GuidedFailureActions\n hidden [string]$GuidedFailureMessage\n hidden [int]$DeploymentRetryCount\n [void] SetGuidedFailure([GuidedFailure]$guidedFailure, $guidedFailureMessage) {\n $this.UseGuidedFailure = switch ($guidedFailure) {\n ([GuidedFailure]::Default) { [System.Convert]::ToBoolean($global:OctopusUseGuidedFailure) }\n ([GuidedFailure]::Enabled) { $true }\n ([GuidedFailure]::Disabled) { $false }\n ([GuidedFailure]::RetryIgnore) { $true }\n ([GuidedFailure]::RetryAbort) { $true }\n ([GuidedFailure]::Ignore) { $true } \n ([GuidedFailure]::RetryDeployment) { $false }\n }\n Write-Host \"Setting Guided Failure: $($this.UseGuidedFailure)\"\n \n $retryActions = @(1..(Get-OctopusSetting StepRetryCount 1) | % {'Retry'})\n $this.GuidedFailureActions = switch ($guidedFailure) {\n ([GuidedFailure]::Default) { $null }\n ([GuidedFailure]::Enabled) { $null }\n ([GuidedFailure]::Disabled) { $null }\n ([GuidedFailure]::RetryIgnore) { $retryActions + @('Ignore') }\n ([GuidedFailure]::RetryAbort) { $retryActions + @('Abort') }\n ([GuidedFailure]::Ignore) { @('Ignore') }\n ([GuidedFailure]::RetryDeployment) { $null }\n }\n if ($null -ne $this.GuidedFailureActions) {\n Write-Host \"Automated Failure Guidance: $($this.GuidedFailureActions -join '; ') \"\n }\n $this.GuidedFailureMessage = $guidedFailureMessage\n \n $defaultRetries = if ($guidedFailure -eq [GuidedFailure]::RetryDeployment) { 1 } else { 0 }\n $this.DeploymentRetryCount = Get-OctopusSetting DeploymentRetryCount $defaultRetries\n if ($this.DeploymentRetryCount -ne 0) {\n Write-Host \"Failed Deployments will be retried #$($this.DeploymentRetryCount) times\"\n }\n }\n \n [bool]$WaitForDeployment\n hidden [datetime]$QueueTime\n hidden [datetime]$QueueTimeExpiry\n [void] SetSchedule($deploySchedule) {\n if (Test-String $deploySchedule -ForAbsence) {\n Write-Fatal 'The deployment schedule step parameter was not found.'\n }\n if ($deploySchedule -eq 'WaitForDeployment') {\n $this.WaitForDeployment = $true\n Write-Host 'Deployment will be queued to start immediatley...'\n return\n }\n $this.WaitForDeployment = $false\n if ($deploySchedule -eq 'NoWait') {\n Write-Host 'Deployment will be queued to start immediatley...'\n return\n }\n <#\n ^(?i) - Case-insensitive matching\n (?:\n (?MON|TUE|WED|THU|FRI|SAT|SUN)? - Capture an optional day\n \\s*@\\s* - '@' indicates deploying at a specific time\n (?(?:[01]?[0-9]|2[0-3]):[0-5][0-9]) - Captures the time of day, in 24 hour format\n )? - Day & TimeOfDay are optional\n \\s*\n (?:\n \\+\\s* - '+' indicates deploying after a length of tie\n (?\n \\d{1,3} - Match 1 to 3 digits\n (?::[0-5][0-9])? - Optionally match a colon and 00 to 59, this denotes if the previous 1-3 digits are hours or minutes\n )\n )?$ - TimeSpan is optional\n #>\n $parsedSchedule = [regex]::Match($deploySchedule, '^(?i)(?:(?MON|TUE|WED|THU|FRI|SAT|SUN)?\\s*@\\s*(?(?:[01]?[0-9]|2[0-3]):[0-5][0-9]))?\\s*(?:\\+\\s*(?\\d{1,3}(?::[0-5][0-9])?))?$')\n if (!$parsedSchedule.Success) {\n Write-Fatal \"The deployment schedule step parameter contains an invalid value. Valid values are 'WaitForDeployment', 'NoWait' or a schedule in the format '[[DayOfWeek] @ HH:mm] [+ ]'\" \n }\n $this.QueueTime = Get-Date\n if ($parsedSchedule.Groups['Day'].Success) {\n Write-Verbose \"Parsed Day: $($parsedSchedule.Groups['Day'].Value)\"\n while (!$this.QueueTime.DayOfWeek.ToString().StartsWith($parsedSchedule.Groups['Day'].Value)) {\n $this.QueueTime = $this.QueueTime.AddDays(1)\n }\n }\n if ($parsedSchedule.Groups['TimeOfDay'].Success) {\n Write-Verbose \"Parsed Time Of Day: $($parsedSchedule.Groups['TimeOfDay'].Value)\"\n $timeOfDay = [datetime]::ParseExact($parsedSchedule.Groups['TimeOfDay'].Value, 'HH:mm', $null)\n $this.QueueTime = $this.QueueTime.Date + $timeOfDay.TimeOfDay\n }\n if ($parsedSchedule.Groups['TimeSpan'].Success) {\n Write-Verbose \"Parsed Time Span: $($parsedSchedule.Groups['TimeSpan'].Value)\"\n $timeSpan = $parsedSchedule.Groups['TimeSpan'].Value.Split(':')\n $hoursToAdd = if ($timeSpan.Length -eq 2) {$timeSpan[0]} else {0}\n $minutesToAdd = if ($timeSpan.Length -eq 2) {$timeSpan[1]} else {$timeSpan[0]}\n $this.QueueTime = $this.QueueTime.Add((New-TimeSpan -Hours $hoursToAdd -Minutes $minutesToAdd))\n }\n Write-Host \"Deployment will be queued to start at: $($this.QueueTime.ToLongDateString()) $($this.QueueTime.ToLongTimeString())\"\n Write-Verbose \"Local Time: $($this.QueueTime.ToLocalTime().ToString('r'))\"\n Write-Verbose \"Universal Time: $($this.QueueTime.ToUniversalTime().ToString('o'))\"\n $this.QueueTimeExpiry = $this.QueueTime.Add([timespan]::ParseExact((Get-OctopusSetting QueueTimeout '00:30'), \"hh\\:mm\", $null))\n Write-Verbose \"Queued deployment will expire on: $($this.QueueTimeExpiry.ToUniversalTime().ToString('o'))\"\n }\n\n hidden $Environments\n [void] SetEnvironment($environmentName) {\n $lifecyclePhaseEnvironments = $this.Lifecycle.Phases | ? Name -eq $environmentName | % {\n $_.AutomaticDeploymentTargets\n $_.OptionalDeploymentTargets\n }\n $this.Environments = $this.DeploymentTemplate.PromoteTo | ? { $_.Id -in $lifecyclePhaseEnvironments -or $_.Name -ieq $environmentName }\n if ($null -eq $this.Environments) {\n Write-Fatal \"The specified environment ($environmentName) was not found or not eligible for deployment of the release ($($this.Release.Version)). Verify that the release has been deployed to all required environments before it can be promoted to this environment. Once you have corrected these problems you can try again.\" \n }\n Write-Host \"Environments: $(($this.Environments | % Name) -join ', ')\"\n }\n \n [bool] $IsTenanted\n hidden $Tenants\n [void] SetTenants($tenantFilter) {\n $this.IsTenanted = Test-String $tenantFilter\n if (!$this.IsTenanted) {\n return\n }\n $tenantPromotions = $this.DeploymentTemplate.TenantPromotions | % Id\n $this.Tenants = $tenantFilter.Split(\"`n\") | % { [uri]::EscapeUriString($_.Trim()) } | % {\n $criteria = if ($_ -like '*/*') { 'tags' } else { 'name' }\n \n $tenantResults = Invoke-OctopusApi (\"$($this.BaseApiUrl)/tenants/all?projectId={0}&{1}={2}\" -f $this.Project.Id, $criteria, $_) -GetErrorResponse\n if ($tenantResults -isnot [array] -and $tenantResults.ErrorMessage) {\n Write-Warning \"Full Exception: $($tenantResults.FullException)\"\n Write-Fatal $tenantResults.ErrorMessage\n }\n $tenantResults\n } | ? Id -in $tenantPromotions\n\n if ($null -eq $this.Tenants) {\n Write-Fatal \"No eligible tenants found for deployment of the release ($($this.Release.Version)). Verify that the tenants have been associated with the project.\"\n }\n Write-Host \"Tenants: $(($this.Tenants | % Name) -join ', ')\"\n }\n\n [DeploymentController[]] GetDeploymentControllers() {\n Write-Verbose 'Determining eligible environments & tenants. Retrieving deployment previews...'\n $deploymentControllers = @()\n foreach ($environment in $this.Environments) {\n $envPrefix = if ($this.Environments.Count -gt 1) {$environment.Name}\n if ($this.IsTenanted) {\n foreach ($tenant in $this.Tenants) {\n $tenantPrefix = if ($this.Tenants.Count -gt 1) {$tenant.Name}\n if ($this.DeploymentTemplate.TenantPromotions | ? Id -eq $tenant.Id | % PromoteTo | ? Id -eq $environment.Id) {\n $logPrefix = ($envPrefix,$tenantPrefix | ? { $null -ne $_ }) -join '::'\n $deploymentControllers += [DeploymentController]::new($this, $logPrefix, $environment, $tenant)\n }\n }\n }\n else {\n $deploymentControllers += [DeploymentController]::new($this, $envPrefix, $environment, $null)\n }\n }\n return $deploymentControllers\n }\n}\n\nclass DeploymentController {\n hidden [string]$BaseUrl\n hidden [DeploymentContext]$DeploymentContext\n hidden [string]$LogPrefix\n hidden [object]$Environment\n hidden [object]$Tenant\n hidden [object]$DeploymentPreview\n hidden [int]$DeploymentRetryCount\n hidden [int]$DeploymentAttempt\n \n DeploymentController($deploymentContext, $logPrefix, $environment, $tenant) {\n $this.BaseUrl = $deploymentContext.BaseUrl\n $this.DeploymentContext = $deploymentContext\n if (Test-String $logPrefix) {\n $this.LogPrefix = \"[${logPrefix}] \"\n }\n $this.Environment = $environment\n $this.Tenant = $tenant\n if ($tenant) {\n $this.DeploymentPreview = Invoke-OctopusApi (\"$($this.DeploymentContext.BaseApiUrl)/releases/{0}/deployments/preview/{1}/{2}\" -f $this.DeploymentContext.Release.Id, $this.Environment.Id, $this.Tenant.Id)\n }\n else {\n $this.DeploymentPreview = Invoke-OctopusApi (\"$($this.DeploymentContext.BaseApiUrl)/releases/{0}/deployments/preview/{1}\" -f $this.DeploymentContext.Release.Id, $this.Environment.Id)\n }\n $this.DeploymentRetryCount = $deploymentContext.DeploymentRetryCount\n $this.DeploymentAttempt = 0\n }\n\n hidden [string[]]$SkipActions = @()\n [void] SetStepsToSkip($stepsToSkip) {\n $comparisonArray = $stepsToSkip.Split(\"`n\") | % Trim\n $this.SkipActions = $this.DeploymentPreview.StepsToExecute | ? {\n $_.CanBeSkipped -and ($_.ActionName -in $comparisonArray -or $_.ActionNumber -in $comparisonArray)\n } | % {\n $logMessage = \"Skipping Step $($_.ActionNumber): $($_.ActionName)\"\n if ($this.LogPrefix) { Write-Verbose \"$($this.LogPrefix)$logMessage\" }\n else { Write-Host $logMessage }\n $_.ActionId\n }\n }\n\n hidden [hashtable]$FormValues\n [void] SetFormValues($formValuesToSet) {\n $this.FormValues = @{}\n $this.DeploymentPreview.Form.Values | Get-Member -MemberType NoteProperty | % {\n $this.FormValues.Add($_.Name, $this.DeploymentPreview.Form.Values.$($_.Name))\n }\n\n $formValuesToSet.Split(\"`n\") | % {\n $entry = $_.Split('=') | % Trim\n $entryName, $entryValues = $entry\n $entry = @($entryName, $($entryValues -join \"=\"))\n $this.DeploymentPreview.Form.Elements | ? { $_.Control.Name -ieq $entry[0] } | % {\n $logMessage = \"Setting Form Value '$($_.Control.Label)' to: $($entry[1])\"\n if ($this.LogPrefix) { Write-Verbose \"$($this.LogPrefix)$logMessage\" }\n else { Write-Host $logMessage }\n $this.FormValues[$_.Name] = $entry[1]\n }\n }\n }\n\t\n [ServerTask]$Task\n [void] Start() {\n $request = @{\n ReleaseId = $this.DeploymentContext.Release.Id\n EnvironmentId = $this.Environment.Id\n SkipActions = $this.SkipActions\n FormValues = $this.FormValues\n UseGuidedFailure = $this.DeploymentContext.UseGuidedFailure\n }\n if ($this.DeploymentContext.QueueTime -ne [datetime]::MinValue) { $request.Add('QueueTime', $this.DeploymentContext.QueueTime.ToUniversalTime().ToString('o')) }\n if ($this.DeploymentContext.QueueTimeExpiry -ne [datetime]::MinValue) { $request.Add('QueueTimeExpiry', $this.DeploymentContext.QueueTimeExpiry.ToUniversalTime().ToString('o')) }\n if ($this.Tenant) { $request.Add('TenantId', $this.Tenant.Id) }\n\n $deployment = Invoke-OctopusApi \"$($this.DeploymentContext.BaseApiUrl)/deployments\" -Method Post -Body $request -GetErrorResponse\n if ($deployment.ErrorMessage) { Write-Fatal \"$($deployment.ErrorMessage)`n$($deployment.Errors -join \"`n\")\" }\n Write-Host \"Queued $($deployment.Name)...\"\n Write-Host \"`t$($this.BaseUrl)$($deployment.Links.Web)\"\n Write-Verbose \"`t$($this.BaseUrl)$($deployment.Links.Self)\"\n Write-Verbose \"`t$($this.BaseUrl)$($this.DeploymentContext.BaseApiUrl)/deploymentprocesses/$($deployment.DeploymentProcessId)\"\n Write-Verbose \"`t$($this.BaseUrl)$($deployment.Links.Variables)\"\n Write-Verbose \"`t$($this.BaseUrl)$($deployment.Links.Task)/details\"\n\n $this.Task = [ServerTask]::new($this.DeploymentContext, $deployment, $this.LogPrefix)\n }\n\n [bool] PollCheck() {\n $this.Task.Poll()\n if ($this.Task.IsCompleted -and !$this.Task.FinishedSuccessfully -and $this.DeploymentAttempt -lt $this.DeploymentRetryCount) {\n $retryWaitPeriod = New-TimeSpan -Seconds (Get-OctopusSetting RetryWaitPeriod 0)\n $waitText = if ($retryWaitPeriod.TotalSeconds -gt 0) {\n $minutesText = if ($retryWaitPeriod.Minutes -gt 1) { \" $($retryWaitPeriod.Minutes) minutes\" } elseif ($retryWaitPeriod.Minutes -eq 1) { \" $($retryWaitPeriod.Minutes) minute\" }\n $secondsText = if ($retryWaitPeriod.Seconds -gt 1) { \" $($retryWaitPeriod.Seconds) seconds\" } elseif ($retryWaitPeriod.Seconds -eq 1) { \" $($retryWaitPeriod.Seconds) second\" }\n \"Waiting${minutesText}${secondsText} before \"\n }\n $this.DeploymentAttempt++\n Write-Error \"$($this.LogPrefix)Deployment failed. ${waitText}Queuing retry #$($this.DeploymentAttempt) of $($this.DeploymentRetryCount)...\"\n if ($retryWaitPeriod.TotalSeconds -gt 0) {\n Start-Sleep -Seconds $retryWaitPeriod.TotalSeconds\n }\n $this.Start()\n return $true\n }\n return !$this.Task.IsCompleted\n }\n}\n\nclass ServerTask {\n hidden [DeploymentContext]$DeploymentContext\n hidden [object]$Deployment\n hidden [string]$LogPrefix\n\n hidden [bool] $IsCompleted = $false\n hidden [bool] $FinishedSuccessfully\n hidden [string] $ErrorMessage\n \n hidden [int]$PollCount = 0\n hidden [bool]$HasInterruptions = $false\n hidden [hashtable]$State = @{}\n hidden [System.Collections.Generic.HashSet[string]]$Logs\n \n ServerTask($deploymentContext, $deployment, $logPrefix) {\n $this.DeploymentContext = $deploymentContext\n $this.Deployment = $deployment\n $this.LogPrefix = $logPrefix\n $this.Logs = [System.Collections.Generic.HashSet[string]]::new()\n }\n \n [void] Poll() {\t\n if ($this.IsCompleted) { return }\n\n $details = Invoke-OctopusApi (\"$($this.DeploymentContext.BaseApiUrl)/tasks/{0}/details?verbose=false&tail=30\" -f $this.Deployment.TaskId)\n $this.IsCompleted = $details.Task.IsCompleted\n $this.FinishedSuccessfully = $details.Task.FinishedSuccessfully\n $this.ErrorMessage = $details.Task.ErrorMessage\n\n $this.PollCount++\n if ($this.PollCount % 10 -eq 0) {\n $this.Verbose(\"$($details.Task.State). $($details.Task.Duration), $($details.Progress.EstimatedTimeRemaining)\")\n }\n \n if ($details.Task.HasPendingInterruptions) { $this.HasInterruptions = $true }\n $this.LogQueuePosition($details.Task)\n $activityLogs = $this.FlattenActivityLogs($details.ActivityLogs) \n $this.WriteLogMessages($activityLogs)\n }\n\n hidden [bool] IfNewState($firstKey, $secondKey, $value) {\n $key = '{0}/{1}' -f $firstKey, $secondKey\n $containsKey = $this.State.ContainsKey($key)\n if ($containsKey) { return $false }\n $this.State[$key] = $value\n return $true\n }\n\n hidden [bool] HasChangedState($firstKey, $secondKey, $value) {\n $key = '{0}/{1}' -f $firstKey, $secondKey\n $hasChanged = if (!$this.State.ContainsKey($key)) { $true } else { $this.State[$key] -ne $value }\n if ($hasChanged) {\n $this.State[$key] = $value\n }\n return $hasChanged\n }\n\n hidden [object] GetState($firstKey, $secondKey) { return $this.State[('{0}/{1}' -f $firstKey, $secondKey)] }\n\n hidden [void] ResetState($firstKey, $secondKey) { $this.State.Remove(('{0}/{1}' -f $firstKey, $secondKey)) }\n\n hidden [void] Error($message) { Write-Error \"$($this.LogPrefix)${message}\" }\n hidden [void] Warn($message) { Write-Warning \"$($this.LogPrefix)${message}\" }\n hidden [void] Host($message) { Write-Host \"$($this.LogPrefix)${message}\" } \n hidden [void] Verbose($message) { Write-Verbose \"$($this.LogPrefix)${message}\" }\n\n hidden [psobject[]] FlattenActivityLogs($ActivityLogs) {\n $flattenedActivityLogs = {@()}.Invoke()\n $this.FlattenActivityLogs($ActivityLogs, $null, $flattenedActivityLogs)\n return $flattenedActivityLogs\n }\n\n hidden [void] FlattenActivityLogs($ActivityLogs, $Parent, $flattenedActivityLogs) {\n foreach ($log in $ActivityLogs) {\n $log | Add-Member -MemberType NoteProperty -Name Parent -Value $Parent\n $insertBefore = $null -eq $log.Parent -and $log.Status -eq 'Running'\t\n if ($insertBefore) { $flattenedActivityLogs.Add($log) }\n foreach ($childLog in $log.Children) {\n $this.FlattenActivityLogs($childLog, $log, $flattenedActivityLogs)\n }\n if (!$insertBefore) { $flattenedActivityLogs.Add($log) }\n }\n }\n\n hidden [void] LogQueuePosition($Task) {\n if ($Task.HasBeenPickedUpByProcessor) {\n $this.ResetState($Task.Id, 'QueuePosition')\n return\n }\n\t\t\n $queuePosition = (Invoke-OctopusApi (\"$($this.DeploymentContext.BaseApiUrl)/tasks/{0}/queued-behind\" -f $this.Deployment.TaskId)).Items.Count\n if ($this.HasChangedState($Task.Id, 'QueuePosition', $queuePosition) -and $queuePosition -ne 0) {\n $this.Host(\"Queued behind $queuePosition tasks...\")\n }\n }\n\n hidden [void] WriteLogMessages($ActivityLogs) {\n $interrupts = if ($this.HasInterruptions) {\n Invoke-OctopusApi (\"$($this.DeploymentContext.BaseApiUrl)/interruptions?regarding={0}\" -f $this.Deployment.TaskId) | % Items\n }\n foreach ($activity in $ActivityLogs) {\n $correlatedInterrupts = $interrupts | ? CorrelationId -eq $activity.Id \n $correlatedInterrupts | ? IsPending -eq $false | % { $this.LogInterruptMessages($activity, $_) }\n\n $this.LogStepTransition($activity) \n $this.LogErrorsAndWarnings($activity)\n $correlatedInterrupts | ? IsPending -eq $true | % { \n $this.LogInterruptMessages($activity, $_)\n $this.HandleInterrupt($_)\n }\n }\n }\n\n hidden [void] LogStepTransition($ActivityLog) {\n if ($ActivityLog.ShowAtSummaryLevel -and $ActivityLog.Status -ne 'Pending') {\n $existingState = $this.GetState($ActivityLog.Id, 'Status')\n if ($this.HasChangedState($ActivityLog.Id, 'Status', $ActivityLog.Status)) {\n $existingStateText = if ($existingState) { \"$existingState -> \" }\n $this.Host(\"$($ActivityLog.Name) ($existingStateText$($ActivityLog.Status))\")\n }\n }\n }\n\n hidden [void] LogErrorsAndWarnings($ActivityLog) {\n foreach ($logEntry in $ActivityLog.LogElements) {\n if ($logEntry.Category -eq 'Info') { continue }\n if ($this.Logs.Add(($ActivityLog.Id,$logEntry.OccurredAt,$logEntry.MessageText -join '/'))) {\n switch ($logEntry.Category) {\n 'Fatal' {\n if ($ActivityLog.Parent) {\n $this.Error(\"FATAL: During $($ActivityLog.Parent.Name)\")\n $this.Error(\"FATAL: $($logEntry.MessageText)\")\n }\n }\n 'Error' { $this.Error(\"[$($ActivityLog.Parent.Name)] $($logEntry.MessageText)\") }\n 'Warning' { $this.Warn(\"[$($ActivityLog.Parent.Name)] $($logEntry.MessageText)\") }\n }\n }\n }\n }\n\n hidden [void] LogInterruptMessages($ActivityLog, $Interrupt) {\n $message = $Interrupt.Form.Elements | ? Name -eq Instructions | % Control | % Text\n if ($Interrupt.IsPending -and $this.HasChangedState($Interrupt.Id, $ActivityLog.Parent.Name, $message)) {\n $this.Warn(\"Deployment is paused at '$($ActivityLog.Parent.Name)' for manual intervention: $message\")\n }\n if ($null -ne $Interrupt.ResponsibleUserId -and $this.HasChangedState($Interrupt.Id, 'ResponsibleUserId', $Interrupt.ResponsibleUserId)) {\n $user = Invoke-OctopusApi $Interrupt.Links.User\n $emailText = if (Test-String $user.EmailAddress) { \" ($($user.EmailAddress))\" }\n $this.Warn(\"$($user.DisplayName)$emailText has taken responsibility for the manual intervention\")\n }\n $manualAction = $Interrupt.Form.Values.Result\n if ((Test-String $manualAction) -and $this.HasChangedState($Interrupt.Id, 'Action', $manualAction)) {\n $this.Warn(\"Manual intervention action '$manualAction' submitted with notes: $($Interrupt.Form.Values.Notes)\")\n }\n $guidanceAction = $Interrupt.Form.Values.Guidance\n if ((Test-String $guidanceAction) -and $this.HasChangedState($Interrupt.Id, 'Action', $guidanceAction)) {\n $this.Warn(\"Failure guidance to '$guidanceAction' submitted with notes: $($Interrupt.Form.Values.Notes)\")\n }\n }\n\n hidden [void] HandleInterrupt($Interrupt) {\n $isGuidedFailure = $null -ne ($Interrupt.Form.Elements | ? Name -eq Guidance)\n if (!$isGuidedFailure -or !$this.DeploymentContext.GuidedFailureActions -or !$Interrupt.IsPending) {\n return\n }\n $this.IfNewState($Interrupt.CorrelationId, 'ActionIndex', 0)\n if ($Interrupt.CanTakeResponsibility -and $null -eq $Interrupt.ResponsibleUserId) {\n Invoke-OctopusApi $Interrupt.Links.Responsible -Method Put\n }\n if ($Interrupt.HasResponsibility) {\n $guidanceIndex = $this.GetState($Interrupt.CorrelationId, 'ActionIndex')\n $guidance = $this.DeploymentContext.GuidedFailureActions[$guidanceIndex]\n $guidanceIndex++\n \n $retryWaitPeriod = New-TimeSpan -Seconds (Get-OctopusSetting RetryWaitPeriod 0)\n if ($guidance -eq 'Retry' -and $retryWaitPeriod.TotalSeconds -gt 0) {\n $minutesText = if ($retryWaitPeriod.Minutes -gt 1) { \" $($retryWaitPeriod.Minutes) minutes\" } elseif ($retryWaitPeriod.Minutes -eq 1) { \" $($retryWaitPeriod.Minutes) minute\" }\n $secondsText = if ($retryWaitPeriod.Seconds -gt 1) { \" $($retryWaitPeriod.Seconds) seconds\" } elseif ($retryWaitPeriod.Seconds -eq 1) { \" $($retryWaitPeriod.Seconds) second\" }\n $this.Warn(\"Waiting${minutesText}${secondsText} before submitting retry failure guidance...\")\n Start-Sleep -Seconds $retryWaitPeriod.TotalSeconds\n }\n Invoke-OctopusApi $Interrupt.Links.Submit -Body @{\n Notes = $this.DeploymentContext.GuidedFailureMessage.Replace('#{GuidedFailureActionIndex}', $guidanceIndex).Replace('#{GuidedFailureAction}', $guidance)\n Guidance = $guidance\n } -Method Post\n\n $this.HasChangedState($Interrupt.CorrelationId, 'ActionIndex', $guidanceIndex)\n }\n }\n}\n\nfunction Show-Heading {\n param($Text)\n $padding = ' ' * ((80 - 2 - $Text.Length) / 2)\n Write-Host \" `n\"\n Write-Host (@(\"`t\", ([string][char]0x2554), (([string][char]0x2550) * 80), ([string][char]0x2557)) -join '')\n Write-Host \"`t$(([string][char]0x2551))$padding $Text $padding$([string][char]0x2551)\" \n Write-Host (@(\"`t\", ([string][char]0x255A), (([string][char]0x2550) * 80), ([string][char]0x255D)) -join '')\n Write-Host \" `n\"\n}\n\nif ($OctopusParameters['Octopus.Action.RunOnServer'] -ieq 'False') {\n Write-Warning \"For optimal performance use 'Run On Server' for this action\"\n}\n\n$deploymentContext = [DeploymentContext]::new($Chain_BaseUrl, $Chain_BaseApiUrl)\n\nif ($Chain_CreateOption -ieq 'True') {\n Show-Heading 'Creating Release'\n}\nelse {\n Show-Heading 'Retrieving Release'\n}\n$deploymentContext.SetProject($Chain_ProjectName)\n$deploymentContext.SetChannel($Chain_Channel)\nWrite-Host \"`t$Chain_BaseUrl$($deploymentContext.Project.Links.Web)\"\n\nif ($Chain_CreateOption -ieq 'True') {\n $deploymentContext.CreateRelease($Chain_ReleaseNum)\n}\nelse {\n $deploymentContext.SetRelease($Chain_ReleaseNum)\n}\nWrite-Host \"`t$Chain_BaseUrl$($deploymentContext.Release.Links.Web)\"\nif ($Chain_SnapshotVariables -ieq 'True') {\n $deploymentContext.UpdateVariableSnapshot()\n}\n\nShow-Heading 'Configuring Deployment'\n$deploymentContext.GetDeploymentTemplate()\n$email = if (Test-String $OctopusParameters['Octopus.Deployment.CreatedBy.EmailAddress']) { \"($($OctopusParameters['Octopus.Deployment.CreatedBy.EmailAddress']))\" }\n$guidedFailureMessage = Get-OctopusSetting GuidedFailureMessage @\"\nAutomatic Failure Guidance will #{GuidedFailureAction} (Failure ###{GuidedFailureActionIndex})\nInitiated by $($OctopusParameters['Octopus.Deployment.Name']) of $($OctopusParameters['Octopus.Project.Name']) release $($OctopusParameters['Octopus.Release.Number'])\nCreated By: $($OctopusParameters['Octopus.Deployment.CreatedBy.DisplayName']) $email\n${Chain_BaseUrl}$($OctopusParameters['Octopus.Web.DeploymentLink'])\n\"@\n$deploymentContext.SetGuidedFailure($Chain_GuidedFailure, $guidedFailureMessage)\n$deploymentContext.SetSchedule($Chain_DeploySchedule)\n\n$deploymentContext.SetEnvironment($Chain_DeployTo)\n$deploymentContext.SetTenants($Chain_Tenants)\n\n$deploymentControllers = $deploymentContext.GetDeploymentControllers()\nif (Test-String $Chain_StepsToSkip) {\n $deploymentControllers | % { $_.SetStepsToSkip($Chain_StepsToSkip) }\n}\nif (Test-String $Chain_FormValues) {\n $deploymentControllers | % { $_.SetFormValues($Chain_FormValues) }\n}\n\nShow-Heading 'Queue Deployment'\nif ($deploymentContext.IsTenanted) {\n Write-Host 'Queueing tenant deployments...'\n}\nelse {\n Write-Host 'Queueing untenanted deployment...'\n}\n$deploymentControllers | % Start\n\nif (!$deploymentContext.WaitForDeployment) {\n Write-Host 'Deployments have been queued, proceeding to the next step...'\n return\n}\n\nShow-Heading 'Waiting For Deployment'\ndo {\n Start-Sleep -Seconds 1\n $tasksStillRunning = $false\n foreach ($deployment in $deploymentControllers) {\n if ($deployment.PollCheck()) {\n $tasksStillRunning = $true\n }\n }\n} while ($tasksStillRunning)\n\nif ($deploymentControllers | % Task | ? FinishedSuccessfully -eq $false) {\n Show-Heading 'Deployment Failed!'\n Write-Fatal (($deploymentControllers | % Task | % ErrorMessage) -join \"`n\")\n}\nelse {\n Show-Heading 'Deployment Successful!'\n}\n\nif (Test-String $Chain_PostDeploy -ForAbsence) {\n return \n}\n\nShow-Heading 'Post-Deploy Script'\n$rawPostDeployScript = Invoke-OctopusApi (\"$Chain_BaseApiUrl/releases/{0}\" -f $OctopusParameters['Octopus.Release.Id']) |\n % { Invoke-OctopusApi $_.Links.ProjectDeploymentProcessSnapshot } |\n % Steps | ? Id -eq $OctopusParameters['Octopus.Step.Id'] |\n % Actions | ? Id -eq $OctopusParameters['Octopus.Action.Id'] |\n % { $_.Properties.Chain_PostDeploy }\nWrite-Verbose \"Raw Post-Deploy Script:`n$rawPostDeployScript\"\n\nAdd-Type -Path (Get-WmiObject Win32_Process | ? ProcessId -eq $PID | % { Get-Process -Id $_.ParentProcessId } | % { Join-Path (Split-Path -Path $_.Path -Parent) 'Octostache.dll' })\n\n$deploymentControllers | % {\n $deployment = $_.Task.Deployment\n $tenant = $_.Tenant\n $variablesDictionary = [Octostache.VariableDictionary]::new()\n Invoke-OctopusApi (\"$Chain_BaseApiUrl/variables/{0}\" -f $deployment.ManifestVariableSetId) | % Variables | ? {\n ($_.IsSensitive -eq $false) -and `\n ($_.Scope.Private -ne 'True') -and `\n\t\t($null -eq $_.Scope.Action) -and `\n\t\t($null -eq $_.Scope.Machine) -and `\n ($null -eq $_.Scope.TargetRole) -and `\n\t\t($null -eq $_.Scope.Role) -and `\n ($null -eq $_.Scope.Tenant -or $_.Scope.Tenant -contains $tenant.Id) -and `\n\t\t($null -eq $_.Scope.TenantTag -or (Compare-Object $_.Scope.TenantTag $tenant.TenantTags -ExcludeDifferent -IncludeEqual)) -and `\n ($null -eq $_.Scope.Environment -or $_.Scope.Environment -contains $deployment.EnvironmentId) -and `\n\t\t($null -eq $_.Scope.Channel -or $_.Scope.Channel -contains $deployment.ChannelId) -and `\n\t\t($null -eq $_.Scope.Project -or $_.Scope.Project -contains $deployment.ProjectId)\n } | % { $variablesDictionary.Set($_.Name, $_.Value) }\n $postDeployScript = $variablesDictionary.Evaluate($rawPostDeployScript)\n Write-Host \"$($_.LogPrefix)Evaluated Post-Deploy Script:\"\n Write-Host $postDeployScript\n Write-Host 'Script output:'\n [scriptblock]::Create($postDeployScript).Invoke()\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-chain-deployment.json","Website":"/step-templates/18392835-d50e-4ce9-9065-8e15a3c30954","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":"cb0ca23c-524d-44a9-86e0-2ae05989d6a0","Name":"Check for Pending Restart and Restart if required","Description":"Checks if Server is pending a reboot, and reboots if it needs it.","Version":0,"ExportedAt":"2020-01-14T08:41:32.508Z","ActionType":"Octopus.Script","Author":"DevOpsDerek","Packages":[],"Parameters":[],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"# Sourced from https://github.com/adbertram/Random-PowerShell-Work/blob/master/Random%20Stuff/Test-PendingReboot.ps1\n# Script will run only on the server with the Tentacle installed\n\nfunction Test-RegistryKey($Key) {\n if (Get-Item -Path $Key -ErrorAction Ignore) {\n return $true\n }\n return $false\n}\n\nfunction Test-RegistryValue($Key, $Value) {\n if (Get-ItemProperty -Path $Key -Name $Value -ErrorAction Ignore) {\n return $true\n }\n return $false\n}\n\nfunction Test-RegistryValueNotNull($Key, $Value) {\n if (($regVal = Get-ItemProperty -Path $Key -Name $Value -ErrorAction Ignore) -and $regVal.($Value)) {\n return $true\n }\n return $false\n}\n\n$IsPendingReboot = $false\n\n# Testing Registry keys for Restarts\n# an exception is thrown when Get-ItemProperty or Get-ChildItem are passed a nonexistant key path\n$tests = @(\n { Test-RegistryKey -Key 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending' }\n { Test-RegistryKey -Key 'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootInProgress' }\n { Test-RegistryKey -Key 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired' }\n { Test-RegistryKey -Key 'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\PackagesPending' }\n { Test-RegistryKey -Key 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\PostRebootReporting' }\n { Test-RegistryValueNotNull -Key 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager' -Value 'PendingFileRenameOperations' }\n { Test-RegistryValueNotNull -Key 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager' -Value 'PendingFileRenameOperations2' }\n { \n\t\t(Test-RegistryKey -Key 'HKLM:\\SOFTWARE\\Microsoft\\Updates') -and\n\t\t(Get-ItemProperty -Path 'HKLM:\\SOFTWARE\\Microsoft\\Updates' -Name 'UpdateExeVolatile' | Select-Object -ExpandProperty UpdateExeVolatile) -ne 0 \n\t}\n { Test-RegistryValue -Key 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce' -Value 'DVDRebootSignal' }\n { Test-RegistryKey -Key 'HKLM:\\SOFTWARE\\Microsoft\\ServerManager\\CurrentRebootAttemps' }\n { Test-RegistryValue -Key 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Netlogon' -Value 'JoinDomain' }\n { Test-RegistryValue -Key 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Netlogon' -Value 'AvoidSpnSet' }\n {\n (Get-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ActiveComputerName').ComputerName -ne\n (Get-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName').ComputerName\n }\n {\n if (Get-ChildItem -Path 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Services\\Pending') {\n $true\n }\n }\n)\n\nWrite-Debug \"Running tests to checking for reboot pending\"\nforeach ($test in $tests) {\n if (& $test) {\n Write-Debug \"Test found reboot pending: $test\"\n $IsPendingReboot = $true\n break\n }\n}\n \n\nif($IsPendingReboot -eq $true) {\n Write-Host \"Restarting\"\n Restart-Computer -Force\n}\nif($IsPendingReboot -eq $false) {\n Write-Host \"No Restart required\"\n}\n"},"Category":"Windows","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/windows-restart-if-required.json","Website":"/step-templates/cb0ca23c-524d-44a9-86e0-2ae05989d6a0","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":"735d2f76-fdbb-4232-9f36-07020cad120d","Name":"Check SQL Server in High Availability Group","Description":"Checks for SQL Node currently being serving as primary on high availability group and sets Octopus variable : SQLIsOnSecondary to true if secondary is active in High Availability Group","Version":1,"ExportedAt":"2019-10-13T08:11:56.532Z","ActionType":"Octopus.Script","Author":"vasant-horapeti","Parameters":[{"Id":"afe518f5-5778-45b4-86c7-3715fa55b4d9","Name":"HAGroupSQLServer","Label":"Enter server name","HelpText":"SQL Server name used in connection string from website code","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"},"Links":{}},{"Id":"c3c49b74-9982-400d-bc8f-b292ea7b2488","Name":"HAGroupPrimaryNode","Label":"Enter primary node","HelpText":"Enter primary SQL server name which serves traffic","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 CheckSQLServerInAOAG($SqlServer, $PrimaryNode)\n{\n $serverConn = new-object ('Microsoft.SqlServer.Management.Common.ServerConnection') $SqlServer\n \n try{\n $serverConn.Connect();\n $server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverConn \n if (!$server.IsHadrEnabled)\n {\n \t Write-Host \"The SQL Server [$SqlServer] is not configured with High Availability Group.\"\n }\n else\n {\n # Get SQL Availability Group\n $SQLAvailabilityGroup = $server.AvailabilityGroups[0]\n \n Write-Host \"Getting High Availability Group properties.\"\n \n # Get SQL Availability Groups Properties\n\t $SQLAvailabilityGroupName = $SQLAvailabilityGroup.Name;\n\t $SQLAvailabilityGroupID = $SQLAvailabilityGroup.Id;\n\t $SQLAvailabilityGroupGuid = $SQLAvailabilityGroup.UniqueId;\n\t $SQLLocalReplicaRole = $SQLAvailabilityGroup.LocalReplicaRole;\n\t $SQLPrimaryReplicaServerName = $SQLAvailabilityGroup.PrimaryReplicaServerName;\n\t \n\t Write-Host\t\"SQLAvailabilityGroupName : $SQLAvailabilityGroupName\"\n Write-Host\t\"SQLAvailabilityGroupID : $SQLAvailabilityGroupID\"\n Write-Host\t\"SQLAvailabilityGroupGuid : $SQLAvailabilityGroupGuid\"\n Write-Host\t\"SQLLocalReplicaRole : $SQLLocalReplicaRole\"\n Write-Host\t\"SQLPrimaryReplicaServerName : $SQLPrimaryReplicaServerName\" \n \n if ($SQLPrimaryReplicaServerName -eq $PrimaryNode)\n {\n \t Write-Host \"Setting Octopus variable SQLIsOnSecondary false\"\n Set-OctopusVariable -name \"SQLIsOnSecondary\" -value \"false\" \n }\n else \n {\n \t Write-Host \"Setting Octopus variable SQLIsOnSecondary true\"\n \t Set-OctopusVariable -name \"SQLIsOnSecondary\" -value \"true\"\n }\n }\n }\n catch\n {\n throw \"Could not connect to server $SqlServer. Exception is:`r`n$($_ | fl -force | out-string)\"\n }\n finally\n {\n $serverConn.Disconnect();\n }\n}\n\n[System.Reflection.Assembly]::LoadWithPartialName(\"Microsoft.SqlServer.SMO\") | out-null\n[System.Reflection.Assembly]::LoadWithPartialName(\"Microsoft.SqlServer.ConnectionInfo\") | out-null\nCheckSQLServerInAOAG $HAGroupSQLServer $HAGroupPrimaryNode","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/sqlserver-high-availability-group.json","Website":"/step-templates/735d2f76-fdbb-4232-9f36-07020cad120d","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"877815ea-0cfb-4dfa-80a3-983140f8cf52","Name":"Chef - Run Cookbook","Description":"Runs a chef cookbook using chef-client.","Version":1,"ExportedAt":"2018-10-16T14:31:14.894Z","ActionType":"Octopus.Script","Author":"margani","Parameters":[{"Id":"dc6cfaed-3df0-4245-88a3-d59f14a64399","Name":"CookBookDir","Label":"Cookbook directory","HelpText":"The directory of the cookbook which has Berksfile","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"6782c7cf-7562-48ff-93a2-fbeb99f0a088","Name":"OverrideRunList","Label":"Override run list","HelpText":"The list of cookbook/recipes which you want to run and override","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Package.DownloadOnTentacle":"False","Octopus.Action.Script.ScriptParameters":"-CookBookFolder #{CookBookDir}","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$cookBookFolder = $OctopusParameters[\"CookBookDir\"]\n$overrideRunList = $OctopusParameters[\"OverrideRunList\"]\n\nif (-not $cookBookFolder -or -not $overrideRunList) {\n\tthrow \"The parameters are mandatory.\"\n}\n\n$ClientPath = Join-Path $cookBookFolder \"client.rb\"\n$WorkingPath = Join-Path $cookBookFolder \"temp\"\n$DatabagPath = Join-Path $WorkingPath \"data_bags\"\n$EnvironmentPath = Join-Path $WorkingPath \"environments\"\n$CookbooksPath = Join-Path $WorkingPath \"cookbooks\"\n$FileCachePath = Join-Path $WorkingPath \"cache\"\n\n$ClientContent = @\"\ndata_bag_path \"$($DatabagPath -replace '\\\\','/')\"\nenvironment_path \"$($EnvironmentPath -replace '\\\\','/')\"\ncookbook_path \"$($CookbooksPath -replace '\\\\','/')\"\nfile_cache_path \"$($FileCachePath -replace '\\\\','/')\"\nssl_verify_mode :verify_peer\n\"@\n\n[System.IO.File]::WriteAllText($ClientPath, $ClientContent)\n\n@($DatabagPath, $EnvironmentPath, $CookbooksPath, $FileCachePath) | %{\n\tif (!(Test-Path $_) ){ \n\t\tmkdir -p $_\n\t}\n}\n\nPush-Location $cookBookFolder\nRemove-Item *.lock\n&berks vendor $CookbooksPath\n&chef-client -z -c $ClientPath -o $overrideRunList\nPop-Location"},"Category":"Chef","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chef-run-cookbook.json","Website":"/step-templates/877815ea-0cfb-4dfa-80a3-983140f8cf52","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"c364b0a5-a0b7-48f8-a1a4-35e9f54a82d3","Name":"Chocolatey - Ensure Installed","Description":"Ensures that the Chocolatey package manager is installed on the system. The installer is downloaded from https://chocolatey.org if required.","Version":7,"ExportedAt":"2020-07-28T13:42:22.284+00:00","ActionType":"Octopus.Script","Author":"pauby","Parameters":[],"Properties":{"Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\nWrite-Output \"Ensuring the Chocolatey package manager is installed...\"\n\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\n$chocInstalled = Test-Path \"$chocolateyBin\\choco.exe\"\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","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-ensure-installed.json","Website":"/step-templates/c364b0a5-a0b7-48f8-a1a4-35e9f54a82d3","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"b2385b12-e5b5-440f-bed8-6598c29b2528","Name":"Chocolatey - Install Package","Description":"Installs or upgrades a package using the Chocolatey package manager.","Version":5,"ExportedAt":"2020-08-10T15:59:10.300Z","ActionType":"Octopus.Script","Author":"pauby","Parameters":[{"Id":"449e25a9-2984-4cb7-b190-ae5114cfbb19","Name":"ChocolateyPackageId","Label":"(Required) Package Name","HelpText":"The name of the Chocolatey package to install. Install multiple packages by separating them with a space.\n\nExamples:\n\n* _git_\n* _git_ _vscode_ _notepadplusplus_\n","DefaultValue":"","DisplaySettings":{}},{"Id":"17ff15ac-f925-493c-9330-64180687f44c","Name":"ChocolateyPackageVersion","Label":"(Optional) Version","HelpText":"If a specific version of the Chocolatey package is required enter it here. Otherwise, leave this field blank to use the latest version. Example: _2.3.4_.","DefaultValue":"","DisplaySettings":{}},{"Id":"8bad47c8-9537-4e8d-8ff4-0508df29ed67","Name":"ChocolateyCacheLocation","Label":"(Optional) Cache Location","HelpText":"Use a specific folder to cache the Chocolatey package.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"e4251d60-1a9c-4ee4-aa49-bd2ecfd5d64e","Name":"ChocolateySource","Label":"(Optional) Package Source","HelpText":"Use a package source to install Chocolatey packages from. This can be a http or https URL, a local folder or file share. When using URL's don't forget the trailing `/` at the end.\n\nFor example: \n\n* _https://chocolatey.org/api/v2/_\n* _c:\\choco-packages_\n* _\\\\business.server.local\\chocolatey-packages_","DefaultValue":"","DisplaySettings":{}},{"Id":"7790d99f-9fb2-4cfb-bdcb-74b4d254dba7","Name":"ChocolateyNoProgress","Label":"(Optional) Disable Download Progress","HelpText":"Disables the download progress percentage being displayed as this can generate a lot of output for the logs.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"e994f28e-f306-4af9-90da-0ad68ec8f30c","Name":"ChocolateyOtherParameters","Label":"(Optional) Other Parameters","HelpText":"Add additional Chocolatey parameters here, separated by spaces, and they will be prefixed to the end of the Chocolatey command being executed. Examples:\n\n* _--ignorepackagecodes_\n* _--ignorepackagecodes --requirechecksum --allow-downgrade_","DefaultValue":"","DisplaySettings":{}}],"Properties":{"Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\nif(-not (Test-Path $chocolateyBin)) {\n Write-Output \"Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables...\"\n $chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"User\") + \"\\bin\"\n}\n\n$choco = \"$chocolateyBin\\choco.exe\"\n\nif (-not (Test-Path $choco)) {\n throw \"Chocolatey was not found at $chocolateyBin.\"\n}\n\n$chocoArgs = @('install')\nif (-not $ChocolateyPackageId) {\n throw \"Please specify the ID of an application package to install.\"\n}\nelse {\n $chocoArgs += $ChocolateyPackageId -split ' '\n}\n\n$chocoVersion = & $choco --version\nWrite-Output \"Running Chocolatey version $chocoVersion\"\n\nif (-not $ChocolateyPackageVersion) {\n Write-Output \"Installing package(s) $ChocolateyPackageId from the Chocolatey package repository...\"\n} else {\n Write-Output \"Installing package $ChocolateyPackageId version $ChocolateyPackageVersion from the Chocolatey package repository...\"\n $chocoArgs += @('--version', $ChocolateyPackageVersion)\n}\n\nif([System.Version]::Parse($chocoVersion) -ge [System.Version]::Parse(\"0.9.8.33\")) {\n Write-Output \"Adding --yes to arguments passed to Chocolatey\"\n $chocoArgs += @(\"--yes\")\n}\n\nif (![String]::IsNullOrEmpty($ChocolateyCacheLocation)) {\n Write-Output \"Using --cache-location $ChocolateyCacheLocation\"\n $chocoArgs += @(\"--cache-location\", \"`\"'$ChocolateyCacheLocation'`\"\")\n}\n\nif (![String]::IsNullOrEmpty($ChocolateySource)) {\n Write-Output \"Using package --source $ChocolateySource\"\n $chocoArgs += @('--source', \"`\"'$ChocolateySource'`\"\")\n}\n\nif (($ChocolateyNoProgress -eq 'True') -and ([System.Version]::Parse($chocoVersion) -ge [System.Version]::Parse(\"0.10.4\"))) {\n Write-Output \"Disabling download progress with --no-progress\"\n $chocoArgs += @('--no-progress')\n}\n\nif (![String]::IsNullOrEmpty($ChocolateyOtherParameters)) {\n\t$chocoArgs += $ChocolateyOtherParameters -split ' '\n}\n\n# execute the command line\nWrite-Output \"Running the command: $choco $chocoArgs\"\n& $choco $chocoArgs\n\nif ($global:LASTEXITCODE -eq 3010) { \n\t# ignore reboot required exit code\n Write-Output \"A restart may be required for the package to work\"\n $global:LASTEXITCODE = 0\n}","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.EnabledFeatures":""},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-install-package.json","Website":"/step-templates/b2385b12-e5b5-440f-bed8-6598c29b2528","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"dd45cba9-a39b-43e0-922e-da9fb7818186","Name":"Chocolatey - Manage Config","Description":"Allows managing Chocolatey config.","Version":1,"ExportedAt":"2020-08-13T20:03:44.800Z","ActionType":"Octopus.Script","Author":"pauby","Packages":[],"Parameters":[{"Id":"3d26fd31-9a8a-432d-add8-caee77c88235","Name":"ChocolateyConfigName","Label":"(Required) Config Name","HelpText":"The config name you want to manage. This is a single config name. Multiple config names must be managed in separate steps.\n\nExample:\n\n* _cacheLocation_\n* _commandExeecutionTimeoutSeconds_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"5eda17f2-d5e0-4e7b-a005-f540d1854db9","Name":"ChocolateyConfigAction","Label":"(Required) Config Action","HelpText":"The action to perform on the config name.","DefaultValue":"set","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"set|Set a config\nunset|Unset a config"}},{"Id":"120540e8-0915-469f-bfc7-5ab0f8dec244","Name":"ChocolateyConfigValue","Label":"(Required / Optional)","HelpText":"The value of the config name you want to set. This is not required if the action is 'unset' and required if the action is 'set'.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8ecc2ac2-4566-4b98-a979-67b755971460","Name":"ChocolateyConfigOtherParameters","Label":"(Optional) Other Chocolatey Parameters","HelpText":"Other parameters to pass to Chocolatey. You can pass multiple parameters separated by a space.\n\nExamples:\n\n* _--debug_\n* _--debug_ _--verbose_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\nif(-not (Test-Path $chocolateyBin)) {\n Write-Host \"Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables...\"\n $chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"User\") + \"\\bin\"\n}\n\n$choco = \"$chocolateyBin\\choco.exe\"\n\nif (-not (Test-Path $choco)) {\n throw \"Chocolatey was not found at $chocolateyBin.\"\n}\n\n# Report the actual version here\n$chocoVersion = & $choco --version\nWrite-Host \"Running Chocolatey version $chocoVersion\"\n\n# default args\n$chocoArgs = @('config', $ChocolateyConfigAction, '--yes')\n\n# we need a source name\nif ([string]::IsNullOrEmpty($ChocolateyConfigName)) {\n throw \"To manage a feature, you need to provide a feature name.\"\n}\nelse {\n\t$chocoArgs += \"--name=\"\"'$ChocolateyConfigName'\"\"\"\n}\n\nif ($ChocolateyConfigAction -eq 'set') {\n if ([string]::IsNullOrEmpty($ChocolateyConfigValue)) {\n throw 'To set the config, you need to provide a value.'\n }\n \n $chocoArgs += \"--value=\"\"'$ChocolateyConfigValue'\"\"\"\n}\n\n# finally add any other parameters\nif (-not [string]::IsNullOrEmpty($ChocolateyConfigOtherParameters)) {\n\t$chocoArgs += $ChocolateyConfigOtherParameters -split ' '\n}\n\n# execute the command line\nWrite-Host \"Running the command: $choco $chocoArgs\"\n& $choco $chocoArgs","Octopus.Action.EnabledFeatures":""},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-manage-config.json","Website":"/step-templates/dd45cba9-a39b-43e0-922e-da9fb7818186","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"718f6e95-e176-4f13-9512-a3a8f1bb10a0","Name":"Chocolatey - Manage Features","Description":"Allows enabling and disabling of Chocolatey features.","Version":1,"ExportedAt":"2020-08-13T17:03:20.000Z","ActionType":"Octopus.Script","Author":"pauby","Packages":[],"Parameters":[{"Id":"b0258989-3337-4e22-ab96-ba54e1a533f7","Name":"ChocolateyFeatureName","Label":"(Required) Feature Name","HelpText":"The feature name to manage. Multiple feature can be specified separated by a space. \n\nExamples:\n\n* _checksumFiles_\n* _autoUninstaller_ _allowGlobalConfirmation_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"31522ad7-f257-4deb-9973-7d4c7eb4fa16","Name":"ChocolateyFeatureAction","Label":"(Required) Feature Action","HelpText":"The action to perform on the feature name.","DefaultValue":"enable","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"enable|Enable the feature\ndisable|Disable the feature"}},{"Id":"218c539e-fe74-408a-9b6d-0b8654ae82dd","Name":"ChocolateyFeatureOtherParameters","Label":"(Optional) Other Chocolatey Parameters","HelpText":"Other parameters to pass to Chocolatey. You can pass multiple parameters separated by a space.\n\nExamples:\n\n* _--debug_\n* _--debug_ _--verbose_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\nif(-not (Test-Path $chocolateyBin)) {\n Write-Host \"Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables...\"\n $chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"User\") + \"\\bin\"\n}\n\n$choco = \"$chocolateyBin\\choco.exe\"\n\nif (-not (Test-Path $choco)) {\n throw \"Chocolatey was not found at $chocolateyBin.\"\n}\n\n# Report the actual version here\n$chocoVersion = & $choco --version\nWrite-Host \"Running Chocolatey version $chocoVersion\"\n\n# default args\n$chocoArgs = @('feature', $ChocolateyFeatureAction, '--yes')\n\n# we need a source name\nif ([string]::IsNullOrEmpty($ChocolateyFeatureName)) {\n throw \"To manage a feature, you need to provide a feature name.\"\n}\n\n# finally add any other parameters\nif (-not [string]::IsNullOrEmpty($ChocolateyFeatureOtherParameters)) {\n\t$chocoArgs += $ChocolateyFeatureOtherParameters -split ' '\n}\n\n$featureNames = $ChocolateyFeatureName -split ' '\nForEach ($name in $featureNames) {\n\t$cmdArgs = $chocoArgs + \"--name=\"\"'$name'\"\"\"\n\n # execute the command line\n Write-Host \"Running the command: $choco $cmdArgs\"\n & $choco $cmdArgs\n}","Octopus.Action.EnabledFeatures":""},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-manage-features.json","Website":"/step-templates/718f6e95-e176-4f13-9512-a3a8f1bb10a0","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"131ba9b0-c95e-464f-a2ff-aacedbcd29a1","Name":"Chocolatey - Manage Sources","Description":"Allows managing Chocolatey Package sources.","Version":1,"ExportedAt":"2020-08-13T13:35:57.400Z","ActionType":"Octopus.Script","Author":"pauby","Packages":[],"Parameters":[{"Id":"86c495d0-0098-4af0-bf10-cde87bfbc348","Name":"ChocolateySourceName","Label":"(Required) Source Name","HelpText":"The name of the source to manage. Examples: \n\n* _production-repo_\n* _my-smb-share_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"f2b13125-1328-48b5-b341-3c5a78869a8c","Name":"ChocolateySourceAction","Label":"(Required) Source Action","HelpText":"The action to perform on the source.\n\nNote that you can use the 'add' action to change a source configuration. So you may not need to remove it and add it again.","DefaultValue":"add","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"add|Add a source\nremove|Remove a source\nenable|Enable a source\ndisable|Disable a source"}},{"Id":"80507f89-d52e-43d7-b857-9697e9f837fa","Name":"ChocolateySourceLocation","Label":"(Required / Optional) Source Location","HelpText":"This can be a folder / file share or an http / https location. If it is a URL, it will be a location you can go to in a browser and it returns OData with something that says 'Packages' in the browser, similar to what you see when you go to https://chocolatey.org/api/v2/.\n\n**Required with 'add' action. Optional with all other actions.**\n\nExamples:\n\n* _c:\\local-packages_\n* _\\\\\\\\my-server\\packages_\n* _https://internalserver.local/packages/_ (note the trailing slash)","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"7580abfd-89ae-4bc0-af86-cbe58b9d8074","Name":"ChocolateySourcePriority","Label":"(Optional) Source Priority","HelpText":"The priority order of this source as compared to other sources, lower is better. Defaults to 0 (no priority). \n\nAll priorities above 0 will be evaluated first, then zero-based values will be evaluated in config file order.\n\n_Available in Chocolatey version 0.9.9.9 and later._","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8517408c-5812-448b-986a-7fabc970039f","Name":"ChocolateySourceAllowSelfService","Label":"(Optional) Allow Self Service Source","HelpText":"Should this source be allowed to be used with self-service? Defaults to false. \n\n_Available in Chocolatey For Business version 0.10.4 and later. Requires feature 'useBackgroundServiceWithSelfServiceSourcesOnly' to be enabled._","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"6e12a4e6-eae4-4ce9-b759-76f4a9b4b0c5","Name":"ChocolateySourceEnableAdminOnly","Label":"(Optional) Enable Admin Only Source","HelpText":"Should this source be visible to non-administrators?\n\n_Requires Chocolatey For Business Extension version 1.12.2 or later and Chocolatey version 0.10.8 or later._","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"b3e074ba-ba3a-43dc-8e23-7e92647cb246","Name":"ChocolateySourceUsername","Label":"(Optional) Source Authentication Username","HelpText":"Username to authenticate to the source with.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"3af96a08-19ba-43a3-893d-6afe929eba0a","Name":"ChocolateySourcePassword","Label":"(Optional) Source Authentication Password","HelpText":"Password to authenticate to the source with.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"53457094-5867-4bde-95c0-7f7100e7b561","Name":"ChocolateySourceCertificatePath","Label":"(Optional) Source Certificate Path","HelpText":"Path to the PFX client certificate used for an x509 authenticated source.\n\n_NOTE: The certificate path must exist and be local to the computer this step is running on. So you will need to add additional steps to ensure the certificate is available at the path._\n\n_Available in Chocolatey from version 0.9.10._","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"8e431f4f-8c24-4aa0-b7ba-2045d4efab3a","Name":"ChocolateySourceCertificatePassword","Label":"(Optional) Chocolatey Certificate Password","HelpText":"The client certificate's password to the source. Can only be used if a client certificate path has been provided.\n\n_Available in Chocolatey version 0.9.10 or later._","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"67ab1c30-a3e6-4ca8-a3a1-802702e34019","Name":"ChocolateySourceOtherParameters","Label":"(Optional) Other Parameters","HelpText":"Add additional Chocolatey parameters here, separated by spaces, and they will be prefixed to the end of the Chocolatey command being executed. ","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\nif(-not (Test-Path $chocolateyBin)) {\n Write-Host \"Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables...\"\n $chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"User\") + \"\\bin\"\n}\n\n$choco = \"$chocolateyBin\\choco.exe\"\n\nif (-not (Test-Path $choco)) {\n throw \"Chocolatey was not found at $chocolateyBin.\"\n}\n\n# Report the actual version here\n$chocoVersion = & $choco --version\nWrite-Host \"Running Chocolatey version $chocoVersion\"\n\n# You cannot use [version] with SemVer 2 versions\n# this allows pre-release versions to still work by stripping everything after the '-' as we could have\n# 0.10.15-beta-20200101. We are only interested in the major.minor.build version\n$chocoVersion = ($chocoVersion -split '-')[0].ToString()\n\n# default args\n$chocoArgs = @('source', $ChocolateySourceAction, '--yes')\n\n# we need a source name\nif ([string]::IsNullOrEmpty($ChocolateySourceName)) {\n throw \"To manage a source you need to provide a source name.\"\n}\nelse {\n\t$chocoArgs += \"--name=\"\"'$ChocolateySourceName'\"\"\"\n}\n\n# we are adding a source - check all of the parameters\nif ($ChocolateySourceAction -eq 'add') {\n\tif ([string]::IsNullOrEmpty($ChocolateySourceLocation)) {\n\t\tthrow 'To add a source you need to provide a source location.'\n\t}\n else {\n \t$chocoArgs += \"--source=\"\"'$ChocolateySourceLocation'\"\"\"\n }\n\n # source priority\n if (-not [string]::IsNullOrEmpty($ChocolateySourcePriority)) {\n \tif ([version]$chocoVersion -ge [version]'0.9.9.9') {\n \t\t$chocoArgs += \"--priority=\"\"'$ChocolateySourcePriority'\"\"\"\n }\n else {\n \tWrite-Warning 'To use a source priority you must have Chocolatey version 0.9.9.9 or later. Ignoring source priority.'\n }\n }\n\n # allow self service\n if ($ChocolateySourceAllowSelfService) {\n \t$edition = & $choco\n \tif ($edition -like '*Business*' -and [version]$chocoVersion -ge [version]'0.10.4') {\n \t$chocoArgs += '--allow-self-service'\n }\n else {\n \tWrite-Warning 'To allow self service on a source you must have Chocolatey For Business version 0.10.4 or later. Ignoring allowing self service.'\n }\n }\n\n # allow admin only\n if ($ChocolateySourceEnableAdminOnly) {\n # we are not going to check for the Business Edition but the chocolatey.extension version need to check we have the chocolatey.extension installed\n $licensedExtension = & $choco list chocolatey.extension --exact --limit-output --local-only | ConvertFrom-Csv -Delimiter '|' -Header 'Name', 'Version'\n\n # lets get the major.minor.build licensed extension version by stripping any pre-release\n $licensedExtensionVersion = ($licensedExtension.Version -split '-')[0].ToString()\n if ((-not [string]::IsNullOrEmpty($licensedExtensionVersion)) -and ([version]$chocoVersion -ge [version]'0.10.8' -and [version]$licensedExtensionVersion -ge [version]'1.12.2')) {\n \t$chocoArgs += '--enable-admin-only'\n }\n else {\n \tWrite-Warning 'To enable admin only on a source you must have Chocolatey For Business Licensed Extension (chocolatey.extension package) version 1.12.2 or later and Chocolatey version 0.10.8 or later. Ignoring admin only enablement.'\n }\n\t}\n\n # we need both a username and a password - if one is used without the other then throw\n if (($ChocolateySourceUsername -and -not $ChocolateySourcePassword) -or ($ChocolateySourcePassword -and -not $ChocolateySourceUsername)) {\n \tthrow 'If you are using an authenticated source you must provide both a username AND a password.'\n }\n elseif ($ChocolateySourceUsername -and $ChocolateySourcePassword) {\n\t\t$chocoArgs += @(\"--user=\"\"'$ChocolateySourceUsername'\"\"\", \"--password=\"\"'$ChocolateySourcePassword'\"\"\")\n }\n\n # check if we have a certificate path\n if (-not [string]::IsNullOrEmpty($ChocolateySourceCertificatePath)) {\n \tif (-not (Test-Path -Path $ChocolateySourceCertificatePath)) {\n \tthrow \"The certificate at '$ChocolateySourceCertificatePath' does not exist. Please make sure the certificate exists on the target at the provided path.\"\n }\n\n $chocoArgs += \"--cert=\"\"'$ChocolateySourceCertificatePath'\"\"\"\n\n # if we have a password it can only be used with a certificate path\n if (-not [string]::IsNullOrEmpty($ChocolateySourceCertificatePassword)) {\n\t\t\t$chocoArgs += \"--certpassword=\"\"'$ChocolateySourceCertificatePassword'\"\"\"\n }\n }\n elseif (-not [string]::IsNullOrEmpty($ChocolateySourceCertificatePassword)) {\n \tWrite-Warning 'You have provided a client certificate password but no client certificate path. Ignoring client certificate password.'\n }\n}\n\n# finally add any other parameters\nif (-not [string]::IsNullOrEmpty($ChocolateySourceOtherParameters)) {\n\t$chocoArgs += $ChocolateySourceOtherParameters -split ' '\n}\n\n# execute the command line\nWrite-Host \"Running the command: $choco $chocoArgs\"\n& $choco $chocoArgs","Octopus.Action.EnabledFeatures":""},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-manage-sources.json","Website":"/step-templates/131ba9b0-c95e-464f-a2ff-aacedbcd29a1","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"81d9b602-7969-4cb2-a9c0-b5c961937db4","Name":"Chocolatey - Pin Package","Description":"Allows pinning versions of packages using the Chocolatey package manager.","Version":1,"ExportedAt":"2020-08-10T17:30:40.400Z","ActionType":"Octopus.Script","Author":"pauby","Packages":[],"Parameters":[{"Id":"2194aed6-a753-4e95-8067-b98a2a1a54bb","Name":"ChocolateyPackagePinId","Label":"(Required) Package Name","HelpText":"The name of the Chocolatey package to install. Install multiple packages by separating them with a space.\n\nExamples:\n\n* _git_\n* _git_ _vscode_ _notepadplusplus_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"65b0dd7d-7643-4d55-8a63-d8506b674688","Name":"ChocolateyPackagePinVersion","Label":"(Optional) Package Version","HelpText":"If a specific version of the Chocolatey package is required enter it here. If you specify a version this will apply to all packages in 'Package Name'. Otherwise, leave this field blank to use the latest version. Example: _2.3.4_.","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"32722882-c1cc-42fe-b3c9-4405218795ba","Name":"ChocolateyPackagePinAction","Label":"(Required) Pin Action","HelpText":"The Chocolatey pin action to take place. You can add a pin or remove an existing pin.","DefaultValue":"add","DisplaySettings":{"Octopus.ControlType":"Select","Octopus.SelectOptions":"add|Add a package pin\nremove|Remove an existing package pin"}},{"Id":"00ef4776-72bc-4a1a-8a73-ee2a5c86a810","Name":"ChocolateyPackagePinReason","Label":"(Optional) Pin Reason","HelpText":"The reason for the package being pinned. \n\n_NOTE: This only works with Chocolatey For Business editions 1.12.2+_","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12\n$chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"Machine\") + \"\\bin\"\nif(-not (Test-Path $chocolateyBin)) {\n Write-Output \"Environment variable 'ChocolateyInstall' was not found in the system variables. Attempting to find it in the user variables...\"\n $chocolateyBin = [Environment]::GetEnvironmentVariable(\"ChocolateyInstall\", \"User\") + \"\\bin\"\n}\n\n$choco = \"$chocolateyBin\\choco.exe\"\n\nif (-not (Test-Path $choco)) {\n throw \"Chocolatey was not found at $chocolateyBin.\"\n}\n\n# check we have required parameters\nif (-not $ChocolateyPackagePinId) {\n throw \"Please specify the ID of an application package to install.\"\n}\n\n$chocoVersion = & $choco --version\nWrite-Output \"Running Chocolatey version $chocoVersion\"\n\n# base arguments to use with choco.exe\n$chocoBaseArgs = @('pin', $ChocolateyPackagePinAction)\n\n# this parameter only works in Chocolatey licensed editions\nif ($ChocolateyPackagePinReason) {\n \t# determine if this is a licensed edition\n\t$edition = & $choco\n if ($edition -like '*Business*' -and [version]$chocoVersion -ge [version]'1.12.2') {\n \tWrite-Output \"Using reason '$ChocolateyPackagePinReason' when pinning packages.\"\n \t$chocoBaseArgs += \"--reason=\"\"'$ChocolateyPackagePinReason'\"\"\"\n }\n\telse {\n \tWrite-Output \"Using a reason for a package pin only works with Chocolatey For Business licensed editions. Ignoring the pin reason '$ChocolateyPackagePinReason'.\"\n\t}\n}\n\nif ($ChocolateyPackagePinVersion) {\n\t$chocoBaseArgs += \"--version=$ChocolateyPackagePinVersion\"\n}\n\n$chocoPackages = $ChocolateyPackagePinId -split ' '\nForEach ($package in $chocoPackages) {\n\tWrite-Output \"Pinning Chocolatey package $package.\"\n $chocoArgs = $chocoBaseArgs + @(\"--name=\"\"'$package'\"\"\")\n \n # execute the command line\n\tWrite-Output \"Running the command: $choco $chocoArgs\"\n\t& $choco $chocoArgs\n}","Octopus.Action.EnabledFeatures":""},"Category":"Chocolatey","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/chocolatey-pin-package.json","Website":"/step-templates/81d9b602-7969-4cb2-a9c0-b5c961937db4","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"d97ff2d4-250a-4a1a-bd5e-36644893888c","Name":"Clear EdgeCast CDN Cache","Description":"This step will clear (purge) the EdgeCast CDN Cache","Version":1,"ExportedAt":"2015-02-20T16:10:46.008+00:00","ActionType":"Octopus.Script","Author":"yooakim","Parameters":[{"Name":"AccountNumber","Label":null,"HelpText":"CDN Account number, can be found in MCC","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ApiToken","Label":null,"HelpText":"API token for accessing the EdgeCast API for the account","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"MediaPath","Label":null,"HelpText":"A string that indicates the CDN or edge CNAME URL for the asset or the location that will be purged from our edge servers. Make sure to include the proper protocol (i.e., http:// or rtmp://).","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"MediaType","Label":"MediaType","HelpText":"An integer that indicates the service for which an asset will be purged. It should be replaced with the ID associated with the desired service., default is 3. HTTP Large","DefaultValue":"3","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"function Clear-EdgeCastCache\n{\n [CmdletBinding()]\n Param\n (\n # CDN Account number, can be found in MCC\n [Parameter(Mandatory=$true)]\n $AccountNumber,\n\n # API Token\n [Parameter(Mandatory=$true)]\n [string]$ApiToken,\n\n # A string that indicates the CDN or edge CNAME URL for the asset or the location that will be purged from our edge servers. Make sure to include the proper protocol (i.e., http:// or rtmp://).\n [Parameter(Mandatory=$true)]\n [string]\n $MediaPath,\n\n #An integer that indicates the service for which an asset will be purged. It should be replaced with the ID associated with the desired service., default is 3. HTTP Large\n [ValidateSet(2,3,8,14)]\n [int]\n $MediaType=3\n )\n\n Begin\n {\n $uri = \"https://api.edgecast.com/v2/mcc/customers/$AccountNumber/edge/purge\"\n\n $headers = @{\n 'Authorization' = \"tok:\" + $ApiToken\n 'Accept' = 'Application/JSON'\n 'Content-Type' = 'Application/JSON'\n }\n $RequestParameters = @{\n 'MediaPath'=$MediaPath\n 'MediaType'=$MediaType\n }\n\n $body = ConvertTo-Json $RequestParameters\n\n }\n Process\n {\n Write-Verbose \"Request body $body\"\n \t$request = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body -DisableKeepAlive\n $request\n\n }\n End\n {\n }\n}\n\nClear-EdgeCastCache -AccountNumber $AccountNumber -ApiToken $ApiToken -MediaPath $MediaPath -MediaType $MediaType -Verbose\n","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"EdgeCast","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/edgecast-cdn-purge.json","Website":"/step-templates/d97ff2d4-250a-4a1a-bd5e-36644893888c","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"a9fd43af-257e-49c9-9434-618568e1df52","Name":"Clear Jasper Web-Cache","Description":"Clears the Jasper web cache","Version":3,"ExportedAt":"2015-07-09T12:17:59.666+00:00","ActionType":"Octopus.Script","Author":"matt40k","Parameters":[{"Name":"fqdn","Label":"Server Name","HelpText":"Enter the server name of your Jasper web server","DefaultValue":"server","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"environment","Label":"Environment","HelpText":"Enter the environment","DefaultValue":"dev","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"username","Label":"Username","HelpText":"Enter the username to authenticate.","DefaultValue":"username","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"password","Label":"Password","HelpText":"Enter the password","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptBody":"# Name: ClearCache.ps1\n# Author: Matt Smith\n# Created Date: 28 July 2014\n# Modified Date: 13 October 2014\n# Version: 1.3\n\n$servers = $OctopusParameters['fqdn'] -split \";\"\n\nforeach ($server in $servers)\n{\n Write-Host 'Clearing cache in '$server\n $url = 'http://' + $server + '/' + $OctopusParameters['environment'] + '_web/report/meta'\n\n Function ClearCache($type)\n { \n return Invoke-WebRequest -Uri $url/$type -Method GET -Headers @{\"Authorization\" = \"Basic \"+[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($OctopusParameters['username']+\":\"+$OctopusParameters['password'] ))}\n }\n \n # Clear cache\n $reportresult = ClearCache -type 'reportcache?CLEAR=Clear+Cache'\n $templateresult = ClearCache -type 'templatecache?CLEAR=Clear+Cache'\n $imageresult = ClearCache -type 'imagescache?CLEAR=Clear+Cache'\n\n}","Octopus.Action.Script.Syntax":"PowerShell"},"Category":"Jasper","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/jasper-clear-cache.json","Website":"/step-templates/a9fd43af-257e-49c9-9434-618568e1df52","Logo":"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","$Meta":{"Type":"ActionTemplate"}},{"Id":"1b7909be-4870-4f81-8957-8357b9342c0f","Name":"ClickOnce - Create from deployed package","Description":"Create binaries manifest & CO application and sign them with given code sign certificate ... using mage.exe.","Version":28,"ExportedAt":"2016-09-15T06:53:27.970+00:00","ActionType":"Octopus.Script","Author":"Grendizr","Parameters":[{"Name":"DeployStepName","Label":"Deploy step to read binaries from","HelpText":"Name of the previous step used to deploy binaries that will be packed in CO package","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"StepName"}},{"Name":"DestinationPath","Label":"Path to the directory where to deploy the ClickOnce package","HelpText":"Path to the target directory for the ClickOnce package. This will contain the created *.application file and the \"Application Files\" folder","DefaultValue":"\\\\MyServer\\MyClickOnceRepo\\#{Octopus.Project.Name}\\#{Octopus.Environment.Name}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"ExeFileName","Label":"Name of the target executable file","HelpText":"Name of the executable file of the application to pack","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"Publisher","Label":"Publisher name","HelpText":"Publisher name to use when creating the CO package","DefaultValue":"MyCompany","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SignCertFilePath","Label":"Path to the certification file","HelpText":"Path to the certification pfx file","DefaultValue":"\\\\MyServer\\Auth\\cert\\my-cert.pfx","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"SignCertPassword","Label":"Password of the certification file","HelpText":null,"DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Name":"MageExePath","Label":"Path to mage.exe","HelpText":"Path to mage.exe which is used to update manifest and .application files and sign them.","DefaultValue":"\\\\MyServer\\Tools\\Octopus\\Tentacles\\mage.exe","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"IconFile","Label":"Icon filename","HelpText":"Name of icon file in the package, eg. ApplicationIcon.ico","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Name":"DisplayName","Label":"Application display name","HelpText":"Name which appears in the Start Menu","DefaultValue":null,"DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.ScriptBody":"Write-Host \"Building clickonce application ...\"\n\nfunction Validate-Parameter([REF]$f, $name, $value) {\n if (!$value) {\n throw ('Missing required value for parameter ''{0}''.' -f $name)\n }\n \n $f.Value = $value\n Write-Host \"Parameters [$name] has been initialized with : [$value]\"\n}\n\n### Parameters\n$deployStepName = $null\n$appName = $null\n$exeFileName = $null\n$destinationPath = $null\n$certFilePath = $null\n$certPassword = $null\n$publisher = $null\n$mageExe = $null\n$version = $null\n$binariesFolderPath = $null\n$coAppName = $null\n$iconFile = $null\n\nValidate-Parameter ([REF]$deployStepName) 'Deploy step name to read binaries from' $OctopusParameters['DeployStepName']\nValidate-Parameter ([REF]$appName) 'Project name' $OctopusParameters['Octopus.Project.Name']\nValidate-Parameter ([REF]$coAppName) 'Application display name' $OctopusParameters['DisplayName']\n\nValidate-Parameter ([REF]$exeFileName) 'Executable file name' $OctopusParameters['ExeFileName']\nValidate-Parameter ([REF]$destinationPath) 'Path to the directory where to deploy the ClickOnce package' $OctopusParameters['DestinationPath']\nValidate-Parameter ([REF]$certFilePath) 'Path to the certification file' $OctopusParameters['SignCertFilePath']\nValidate-Parameter ([REF]$certPassword) 'Password of the certification file' $OctopusParameters['SignCertPassword']\nValidate-Parameter ([REF]$publisher) 'Publisher name' $OctopusParameters['Publisher']\nValidate-Parameter ([REF]$mageExe) 'Path to the mage.exe' $OctopusParameters['MageExePath']\nValidate-Parameter ([REF]$iconFile) 'Icon file' $OctopusParameters['IconFile']\n\n### end of parameters\n\nValidate-Parameter ([REF]$version) 'Version number (from release)' $OctopusParameters['Octopus.Release.Number']\n\n$binariesFolderParameter = -join(\"Octopus.Action[\",$deployStepName,\"].Output.Package.InstallationDirectoryPath\")\nWrite-Host \"Trying to get Installation folder parameter value for : [$binariesFolderParameter]\"\n\n$binariesFolderPath = $OctopusParameters[$binariesFolderParameter]\nif(!$binariesFolderPath){\n throw ('Unable to retrieve binaries path from previous step execution for step with name ''{0}''.' -f $deployStepName)\n}\n\n$appVersionAndNumber = -join($appName, \"_\", $version)\n$packageDestinationSubDirectory = -join (\"Application_Files/\", $appVersionAndNumber)\n$packageDestinationPath = -join ($destinationPath, \"/\", $packageDestinationSubDirectory) \n$appManifestRelativePath = -join (\"Application_Files/\",$appVersionAndNumber, \"/\", $exeFileName, \".manifest\")\n$appManifestFilePath = -join ($binariesFolderPath, \"/\", $exeFileName, \".manifest\")\n\n$coAppFilePath = -join($binariesFolderPath, \"\\\", $appName, \".application\")\n$coAppFilePathServer = -join($destinationPath, \"\\\", $appName, \".application\")\n\n### Create Application manifest\nWrite-Host \"Creating application manifest at \"$appManifestFilePath\n& $mageExe -New Application -t \"$appManifestFilePath\" -n \"$coAppName\" -v $version -p msil -fd \"$binariesFolderPath\" -tr FullTrust -a sha256RSA -if $iconFile\nWrite-Host \"Signing application manifest ...\"\n& $mageExe -Sign \"$appManifestFilePath\" -cf $certFilePath -pwd $certPassword\n\n### Create Deployment application\nWrite-Host \"Creating CO application [$coAppName] at \"$coAppFilePath\n& $mageExe -New Deployment -t \"$coAppFilePath\" -n \"$coAppName\" -v $version -p msil -appm $appManifestFilePath -ip true -i true -um true -pub $publisher -pu \"$coAppFilePathServer\" -appc $appManifestRelativePath -a sha256RSA\n\nWrite-Host \"Updating minimum version to force auto-update\"\n& $mageExe -Update $coAppFilePath -mv $version -pub $publisher -a sha256RSA\n\nWrite-Host \"Changing expiration max age => before application startup (hacking xml) of \"$coAppFilePath\n$content = Get-Content $coAppFilePath\n$content -replace \"\", \"\" | 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":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAFdRJREFUeNrsnWtwW/WZxiVZlmRJtiVZlmzXdnwjiQmJM0kmCWQxQ8OaDFPCLi39sCSwHyB8KN3d9EPLLJRh6GamdHeSzix0GujObLnsdAiwEKZA0oQEQzaXkkBs4kviux3ZkmVZsi6WZMnex/onJ8qRLNtHV0vvMxrNsaxzdDm/877P+79JPDc3JyKREi0JfQUkAotEYJEILBKJwCIRWCQCi0QisEgEFonAIpEILBKBRSKwSCQCi0RgkQgsEonAIhFYJAKLRCKwSAQWicAikeKUNMc//7jbZ3V5PTPBwUl37Gc2Gopwr1crSlVy4obA4mM0NOkGQ51mxzxSbp+w41RrVcBrlVYF2nCvlEmJJJ7EWT9h1eMPfD1i67RMASbBJC3KGQi701iMe4Isy8FCQLo4bGvttwwtluMSq82VOty2VOpynLAsBKvNNNnaN35uyJretwG8musMuCewslDIgEiFg8xXhbZT/Ab0Kjnw2rWmPNcCmDinFgWBx7o4YuswO3Cf4pe+t87w6Pqq3Kkoxbm52sz0zMzXw5Mw9SBMKTNrlN1W1wZ/QEN4EViJkS/gaTd/8efOiWuWupS9KNjK+uS4IsHqd/aavWN9uJ8ew80dcPc5e8KfsF7bhHtjQRludYX1dYUNBoUx9jG/7LO09o93mh2p+QjK/Lw9m2thvwisNKt98jJubbZvcS9gdxAG2jZoN67XNcWADAb/g/bhePCq0LTiXia1y6S3DmKZ2mr3rIl8cqOhaN/dd2RlZsxosBCKzlnOnB3/6qzlTAIPiwD2QMWDuKmkqoWiF/AaX35rKuza6rI3sZEnubGv07tqIaq40PXo+upda8sJrBTFpxOmY+DJHXAl71UYXixvRgpsfdY9KqCF4s6KNwpk5gnXBpO9Wa9uy5N4h20tsXfZXKl7ZntDNrmujAPrpOn4h0Pv8zxTUoUA9nfVP9xZ0RK1eeLwuR4BmREwBWcVy9pFr5Lvb167SqsisBKP1Dt9f4QZT8urw4Q9XvdkVLyOdY++3z6cmsbVfdsbssPRZwRYSHzv9P5RmCtPrJAWH69/MjI5InQdau0aTEm34711BqRFAiteew6kPhp6P6O+FBivfWt+Emnt377U/1nXaGrY2rupZkVbrnSC1e/s/dXlF7ncx+IEHI86Xx3+tDbbt7jvc/Ym1cjzpJKqf3bXz7eX7uA9fnHEBtcVOy2WquSNxmIUlcycwW9plN0l6rZpv9EX0MDUL8V+VWtVL+xct3LZShtYHw19gLrvbsOOusL69dqNC1X+vPAGUx9Pa9Zyhbe3f90veO9taNINtqKmRVjvPZtr2VhTUajj6MvBV69Y/hL+HKd3lcu7yuM3YiM2YSuarfSABURCUSGuCujc+JmzljPJbpJA6Prlxpd5rsszEzxw4jseW4+ur8It8ghHrjw34miLenC7Z/WEq4m1csmkdtZZiQ2N8irC23xJUSj65795SFtQTGClgdFzljPJLifh6P+h7gneg6+f62nts7BABbtdvUBLQa/t3NGul2McHMlxwLp7feV/mqe2IZitLnuTa1+FAsHyp7YcXHFsZRxYqL+4Jm+pxFuqlmoUSxorl+zSMmpaBFt6lTxqoOI0MtV+5LtfRD4enJUjG4IhRCxsw4QVKgajHiFPtPWf7nmJwBKij69c/7xnLLwXxVB0oUp3nG3LpapSVX1g5snVeiN8sTI/LwZer3f/LkntqygskBYX7c/Ge7BMm7kmMYD1+3PvDNta6g1HeOi0jzwrlzoKZGbuky6kFcdWRoD11sX+Y938Mr5C02ooOo8L2h+YzwImezPsCOeR2ahf/QLdtydNxw93v5YM7wXL9cqWg7WF9bFbT3695SBny84Pf374rLfBcAQARY1b4YkvhmqKn/r7dY+uFLDyXnopzdcBbMq7l4fYNnyrsegCEkToG1fgTMzOKmaCajiPMcetyt/hnWkbtX/WPdppmRKHOIsILfUPVe2e9Nv6nL2Jfbczs/4vxk5t0W/VynWRgerFb567OPFXbO9f93Pu8dO9IqvnYmnhpagHlIiDS3xpu++SSrrRWGggsBYXCqvXzlydmZ3jopREHABJTVW/xZlAlaTIt87NSa3OTXMiSWRxzoYat5u/MKgtparbRurJJDK4og26jSgbQUPC2dLJS+puxi0Eqv++9ofXOn/LYqSxoOyR6h/eyvIdpjGnCBdM/C/dY/uysXRXQb6CwFpEvzndGT7XzztTEgiq8/NcwEuRP+Gb0Tm9teCpUneySDE4Oyed9pdFHqSs+L1Bx4kOywmFVM3DC+cYoWvEMzTiHk4sW2fHz9QXNVSqqsMDFdMGXVNz2f3cn8d7DiKJT/uN+XluOCps4FJZYvqLCG+BS6Zv7ql+iMBaxFpdCpvUUKK+DCMCjFTyUbNjh8dfpp8vlIbkUjvyBc6KRnkV5hdhjDc4vbrkU9z7gu5e21k4ZYOqQSXThIcunGaxWJzwgvGi9a8jnmHUCjwzd1/Z9zmDZXEPvndZB5K8M3qkeMQtfBBhVN0wxeLJ/ong+rImAiu6Ll3v+bz3RpW0puwtsOKb0eNeKTcVF/TmS6eQCtkJCHchuOJlUgf2Ch86p5SNIbyx7Smf+cS18anpehSP4S+HM40AAxQSmBZxqKge7vH6JxEpb5aEg6d75liRi8+lkl+P/3WnfNe0iu2lKk0mg5We1WY8/sDn/S+Wa1pxq9EfNU9tw9Vcb3hXpRhSyswjk3+rVXYxqvB4p+npCdcGbl9QlSfxhh/N6a25vb2x6YP24ec/vcybA729dAcKOu6UJ0/hL9EznnfzkrAbEmGzRKHhqZ9c/Q+KWNFarTqud49bUGmPOe5BlIKpwpcOpAJBlcOzZtKzBqchMKsEIgPW3fDy2EWn6hCFBo+7fd8btrUgudyKHEEVHBjMGW6T7nWsVQKV49mhCZj/8JoRpdwDFbvgh1AwJumjqaTqf7zjKe7PT7svisQXcCXgeuDCagJaiTI+Iaahg3Ngcrhr4kWr6zHYXMBUrvm4feRZ+CdfQKtVdqIAlEp8CEJVuuNmx3a2C9d+KJPaey0/5h0QaHaYno4aF+d7i+3uPZtqw0686tdbDj739c+S1oh6WxOXuuDdcok5GS9kcn04Of1Ixnb1pCEVvnflkFgchK9aX/lqveEIy24IRc7pGkSp6pJPVpe9CZKmQ/3/GmU3UiQ344WX9Zaiz7pGD7V2eWaCPLbqChuSA9atw6KegOdLVq6ReN/+9vfksW6o0+xw+3yKfCvHChLizVaDs3LpJAwECsNRe3P32F48CAfGNb7jQfAnpHwbsR048V1q2KoPO+a4uy+pX2Zg7guE/8wEK9VdOgdOfi2XH2DGfCI0qz3Uwj4WGg13lXGGZMca35lJZ+2iiGqBWQX+K3giPMzW/ua14b1A7oA74Tnx1e2vcx0+34x+dLr/cHI9cqb2IUpSHK7Mrm8BDdLciK0Fac5QdL5Sd7xE3caoYoaJUcVgurPijc01/4bMiAf16st6dZvgVx+cdP/r7aUi4tYvN74Mu53AzxjejZjsiDV/1YkuZGbQSilYn1x7vrb0A2wUyMysg5nXVIhMxzIgFHJXR1jGhGcvUV9G5YgH42zm4Pktg8L4ypaDiWKLl1st7t4UfKtHO/8rp8E6M3BWIukLEXM1xAp/sh4s1LCthesQVIaNBcAuNfqPGWFxvo1xt4/ntxBjnlnzk2SUhCmIWBkbtFIH1oWR/43xX1BlsjeHP4IQFa0U8iEzwtHHQ1jkKPKdFS0JMfLhTaOgasD6MFeaJFUfd/1PjoI1f0lJvlvov/BPPKo45x5V8GSCzVZzneH5net4QwUPXflNQix8+NB4gIX3iUIkBWz5gucnpx25CNbnvR/Hws76cOSDMao/p7fG6a0V8Db2bq7dd/tcUFYYnjAdS7jHsnsnUHzASl4dewLeMal44SI83XcyF8Gyeb9a0CLMyuURfqtC0xp1vOX8odx3KWWjGmWnUraMtkekv/3Nax9cc9uiLv3OXlCVqFEPyIPhI+K/6qsJNfBerTe86/EbIzsMEqse258zCqxUdOkcu/qXPIl94avNx3pscBp8N6NUeWiVKZ6m/UZkTNSG2IV16HoWW8WFo+qFnet4s2jA06++fTGBw5d5Y+F7rGKPfy+CFsBC5RGapyoPNf/K2dCMkjiaTqKcyLxR+I0abVUOgdVtXWR1Kxac2P1ohNkShebf4WRMuJoQpXCqgCD+dN1s7oqtVVrV8w/cxTNVJ03HD155JbEfc4NuI7dtdXvZbGm8VbxtFCKm+W6DbY0Vb4AtbCCGJRYs6P8GT9Von8ghsPyzbXlLTrmBWYWx6DzvwRBMNagEFfnW9pFnl974Dqu+Z3Mtj6rXu3+XjNUiwtsa7N750ROIxIisCLSwWfPjE0NXSKjp5GiH6Wkwt9B8L2G67vxCJMoZsM4Pt8Wo7yIVdSIU6y5sMBwxT21dOlWlKnmkVT905ZXErg94y2MpbrU1WD2nStRTw7aW0JxBhcdvvFmm7EagAl7Y7rU8BsK4Locsy4ZJB+tSggquesMR2BRuBthSxJtHmoyewXCFd+ZY3H15kkKWCm+vVBRcPzq2wRmSuy9QLJX4EI/x5I3VcY3gOzd0PlfAcvm7pHlxHYEV6jgHMVbyjCq9+rbZLGwNEtySHa5EoRHSUkn+Ej6agpHnn+9uMoqWM80wqkadqGl+lP1gTU47EJ/jOQKiFBIKkqmAQQ28xYYeqU7dbM9xd1+5pk+j7GarynCBlv1YAR5xRqs8QqOu4/p9sqCoR5QZSi5YHeaOuFx/oJj1Hi53PU+miyO2tPxGUoflBFft4gZTpZxf67YJkFXqjoOe8pt1LhvKgctGLnXgv/F7eRyqbfTKhvJ1WQ5Wt/WbeHZ3TNcLQ4qptc/SaCi6N7VLek75LKcH+GOwUBsaQjO8lbIbS+LAs3Pjz1h1gg23rzL+N9Br685+sCa9HRKhbfsompZrqiI1v+axZUoYW2LRrDzfJpVMi8WzS9xlxNF2afRDXyD6UqVRAxKX+7DBYRdV034jDP6iuXLM1SvKACUXrDmRwMkwsRfdX27cYqtYLTenJLYtYEkoiwMxzLt5auu0v4y3elYUZzkzmAlgJbevMEZPTmyZorW/p1KppypUbZSh+F3ov1W644FZ+dWxJxC64D7ZPIAoZ1TSl+VgnRk4K7gSjMdaxS8UbqmniuVKfPDw2bm8pAm24PE7TE93j+1ls3wXKsazORW6/AL7d9NLFUuC6Xp1oNNjeQxkR813rDsItSSewKZY9vqN3CgPX6hzAnUoivEdNXdnLVjXp64Jokqe3jxYbzgSZ2NSPAIWAKV95KcLNcGHd12vLnuLrV96qwwf22ssuuApnc5yjyWAKniI9Eas1Awmjh20uBb5RcUblMZ2HHZ0ZTNYtun+5Xv2+7j+2nTJMrUtvW9AJnUAl6UUxbgGIs3+/OhC+cPZDJZYvOyAPJ1uqjJEhqLzlqmtC7n4cIaiXofulPyeVNo81hKFspnlPtiLZQ2wyWLBSMGhs2i00HhAu2f1Qm0TQyn5MamMBivce26s/ncUO4lqF40nWmRI0DJPbWXjtyID1ai9GbEqvWY0Q8EasD7MG1wFgyWPez5q3P7GnpYWrGitHr41ZW9x88I5UwULaJ6f85Pp69umB6xhW0vkkL0lriSjlEl3rSlvNBav0qpi/JJAHMq0pWO/vxKzeRLBCgTrZQt0L0QyBHfFfrgBlgtBHgmRDeqNpCpyvg0p1yKWDJRErtEQLezPD0jqtTwGkrAdY/oKYhVRletg5UkGTI5thYqBSNeilJlZnYyNGv3R+Ta9mzMEw0eFR4q3FjIpF8GaCWyp0PypfeSnxqILvAmo8MgMLJSBBaHZBAKOv+eU6dJEkE6hYG0qyXv7/ookHTyJDaSzwXW9lh8jr5nszbzVGRClStSXQz9oOz+9PervTSyqlf5Li2lXUr/AJEYsmKFOy41ZA7ypEKil2XpXTCAMIQ21NMJbuGFnUw/YCpHYBVm1UFEoEq0nJnI6FarClqECXvDmKPqQBNlcFLDi8Zex0bpscj0eDM0puAEWglmV7jiILJCZ6TwRWGEOPf+2g7MWhEgXjzKQDYEKrRx5q0sHORSPEFUEFl+rtMpFn8P1oSIJri17s97wrmVqGzNeS2mnIGWskmjeeRORYwvWqmvsiWFbC3LlhKsp7WPeSZkbsUpVyxsxFxru3cR19cBgpXEkJylzIxbUaCgSvO8Sh1CSchGseLpflGTbCayF/btAsOC0yLwTWAunQqFde/pEL6NIyiqw4N/1KiGTXoT1HpJyBSzBQYv97DudHgIr8YVhIONH35LSCdYWoUufuai5gcCK2WogFbasHhtsk/Z5yaQMBQsSvF5jqG/nPjpJBFaCs6EoNO1i0QnBpBwFC9kwnoVAB6y7qXuHwIqu5trSeHbvtTxGrQ8EVhQ1GouFtZQyBWcV3WN7R+3Nc3MSOmcE1m3i/QCJALZQJ7p8VXTOCCy+hU/OjHhSJip1azfMr7mwtuKD9oT93vq/rM0fddrpFApWeaEmG8AShSbIf9Zl8swkZpbpHUUSvYQmrAqXVp3EfJVSL8yCFp1R8lhJCVrxlIckAmvBoBVneUgisKKruc4QzyQLEoG1oPbdfQd99QRW4lWqklNCJLCSIoBFa/MRWEnRM9sbqC2ewEq8VmlVezbX0jkgsJJSIab4N5tJOQEWtHdTDZktAivxYku3k9nKMkkz4U2ArecfuOvAie8S1T+dDJXrVilkypVyXkdtg16/J6cjFmfk9zevpQudUmHi1Wgs3re9gU4JpcKkFIm4f/1cT6IO6PfP2KyTAnbU6bUyWT7xkSVgJZYtUHXs6KnJCSGjTLUlmgd3309sZUMqDGcLfiv+OtFssgijCsKO2J34yJ6IxbS5Uhd/nVhV8737H9xhswphS6fXYHfiI9vAYnXigYc2HmrtiucXjgEH8UGpkK9SlfyFneuoz4fASryUMukz2xv2bKK+akqFSdCuteWNxqLDiWuGECDntD29bdnLUiA4k943IF5Zv/pndfu4ST52l3XSNU6xQbC06lKNWp+jqZAnmjpGHotEYJFIBBaJwCIRWCQSgUUisEgEFolEYJEyXFL6CpYomqVDEYtEqZBEqXAlanjgOg1NJrAST9WpY2cE737/gzuILUqFUaQqVAmev4UdsTvxQRErWjor0fzgRy0up5C5GOpClZrAIrCID0qFJAKLRKJUmGxNOM0S8Yq5Dv0BH4G1Qk7VjJe+BEqFJAKLRGCRSAQWicAiEVgkEoFFIrBIBBaJRGCRCCwSgUUiEVgkAouULVphi9uGKxCcSfvawCta0rx83AgsEqVCEoFFXwGJwCIRWCQCi0QisEgEFonAIpEILBKBRSKwSCQCi0RgkQgsEonAIhFYJAKLRCKwSAQWicAikQgsEoFFyiX9vwADAIlBLCac7vqAAAAAAElFTkSuQmCC","$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":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAFdRJREFUeNrsnWtwW/WZxiVZlmRJtiVZlmzXdnwjiQmJM0kmCWQxQ8OaDFPCLi39sCSwHyB8KN3d9EPLLJRh6GamdHeSzix0GujObLnsdAiwEKZA0oQEQzaXkkBs4kviux3ZkmVZsi6WZMnex/onJ8qRLNtHV0vvMxrNsaxzdDm/877P+79JPDc3JyKREi0JfQUkAotEYJEILBKJwCIRWCQCi0QisEgEFonAIpEILBKBRSKwSCQCi0RgkQgsEonAIhFYJAKLRCKwSAQWicAikeKUNMc//7jbZ3V5PTPBwUl37Gc2Gopwr1crSlVy4obA4mM0NOkGQ51mxzxSbp+w41RrVcBrlVYF2nCvlEmJJJ7EWT9h1eMPfD1i67RMASbBJC3KGQi701iMe4Isy8FCQLo4bGvttwwtluMSq82VOty2VOpynLAsBKvNNNnaN35uyJretwG8musMuCewslDIgEiFg8xXhbZT/Ab0Kjnw2rWmPNcCmDinFgWBx7o4YuswO3Cf4pe+t87w6Pqq3Kkoxbm52sz0zMzXw5Mw9SBMKTNrlN1W1wZ/QEN4EViJkS/gaTd/8efOiWuWupS9KNjK+uS4IsHqd/aavWN9uJ8ew80dcPc5e8KfsF7bhHtjQRludYX1dYUNBoUx9jG/7LO09o93mh2p+QjK/Lw9m2thvwisNKt98jJubbZvcS9gdxAG2jZoN67XNcWADAb/g/bhePCq0LTiXia1y6S3DmKZ2mr3rIl8cqOhaN/dd2RlZsxosBCKzlnOnB3/6qzlTAIPiwD2QMWDuKmkqoWiF/AaX35rKuza6rI3sZEnubGv07tqIaq40PXo+upda8sJrBTFpxOmY+DJHXAl71UYXixvRgpsfdY9KqCF4s6KNwpk5gnXBpO9Wa9uy5N4h20tsXfZXKl7ZntDNrmujAPrpOn4h0Pv8zxTUoUA9nfVP9xZ0RK1eeLwuR4BmREwBWcVy9pFr5Lvb167SqsisBKP1Dt9f4QZT8urw4Q9XvdkVLyOdY++3z6cmsbVfdsbssPRZwRYSHzv9P5RmCtPrJAWH69/MjI5InQdau0aTEm34711BqRFAiteew6kPhp6P6O+FBivfWt+Emnt377U/1nXaGrY2rupZkVbrnSC1e/s/dXlF7ncx+IEHI86Xx3+tDbbt7jvc/Ym1cjzpJKqf3bXz7eX7uA9fnHEBtcVOy2WquSNxmIUlcycwW9plN0l6rZpv9EX0MDUL8V+VWtVL+xct3LZShtYHw19gLrvbsOOusL69dqNC1X+vPAGUx9Pa9Zyhbe3f90veO9taNINtqKmRVjvPZtr2VhTUajj6MvBV69Y/hL+HKd3lcu7yuM3YiM2YSuarfSABURCUSGuCujc+JmzljPJbpJA6Prlxpd5rsszEzxw4jseW4+ur8It8ghHrjw34miLenC7Z/WEq4m1csmkdtZZiQ2N8irC23xJUSj65795SFtQTGClgdFzljPJLifh6P+h7gneg6+f62nts7BABbtdvUBLQa/t3NGul2McHMlxwLp7feV/mqe2IZitLnuTa1+FAsHyp7YcXHFsZRxYqL+4Jm+pxFuqlmoUSxorl+zSMmpaBFt6lTxqoOI0MtV+5LtfRD4enJUjG4IhRCxsw4QVKgajHiFPtPWf7nmJwBKij69c/7xnLLwXxVB0oUp3nG3LpapSVX1g5snVeiN8sTI/LwZer3f/LkntqygskBYX7c/Ge7BMm7kmMYD1+3PvDNta6g1HeOi0jzwrlzoKZGbuky6kFcdWRoD11sX+Y938Mr5C02ooOo8L2h+YzwImezPsCOeR2ahf/QLdtydNxw93v5YM7wXL9cqWg7WF9bFbT3695SBny84Pf374rLfBcAQARY1b4YkvhmqKn/r7dY+uFLDyXnopzdcBbMq7l4fYNnyrsegCEkToG1fgTMzOKmaCajiPMcetyt/hnWkbtX/WPdppmRKHOIsILfUPVe2e9Nv6nL2Jfbczs/4vxk5t0W/VynWRgerFb567OPFXbO9f93Pu8dO9IqvnYmnhpagHlIiDS3xpu++SSrrRWGggsBYXCqvXzlydmZ3jopREHABJTVW/xZlAlaTIt87NSa3OTXMiSWRxzoYat5u/MKgtparbRurJJDK4og26jSgbQUPC2dLJS+puxi0Eqv++9ofXOn/LYqSxoOyR6h/eyvIdpjGnCBdM/C/dY/uysXRXQb6CwFpEvzndGT7XzztTEgiq8/NcwEuRP+Gb0Tm9teCpUneySDE4Oyed9pdFHqSs+L1Bx4kOywmFVM3DC+cYoWvEMzTiHk4sW2fHz9QXNVSqqsMDFdMGXVNz2f3cn8d7DiKJT/uN+XluOCps4FJZYvqLCG+BS6Zv7ql+iMBaxFpdCpvUUKK+DCMCjFTyUbNjh8dfpp8vlIbkUjvyBc6KRnkV5hdhjDc4vbrkU9z7gu5e21k4ZYOqQSXThIcunGaxWJzwgvGi9a8jnmHUCjwzd1/Z9zmDZXEPvndZB5K8M3qkeMQtfBBhVN0wxeLJ/ong+rImAiu6Ll3v+bz3RpW0puwtsOKb0eNeKTcVF/TmS6eQCtkJCHchuOJlUgf2Ch86p5SNIbyx7Smf+cS18anpehSP4S+HM40AAxQSmBZxqKge7vH6JxEpb5aEg6d75liRi8+lkl+P/3WnfNe0iu2lKk0mg5We1WY8/sDn/S+Wa1pxq9EfNU9tw9Vcb3hXpRhSyswjk3+rVXYxqvB4p+npCdcGbl9QlSfxhh/N6a25vb2x6YP24ec/vcybA729dAcKOu6UJ0/hL9EznnfzkrAbEmGzRKHhqZ9c/Q+KWNFarTqud49bUGmPOe5BlIKpwpcOpAJBlcOzZtKzBqchMKsEIgPW3fDy2EWn6hCFBo+7fd8btrUgudyKHEEVHBjMGW6T7nWsVQKV49mhCZj/8JoRpdwDFbvgh1AwJumjqaTqf7zjKe7PT7svisQXcCXgeuDCagJaiTI+Iaahg3Ngcrhr4kWr6zHYXMBUrvm4feRZ+CdfQKtVdqIAlEp8CEJVuuNmx3a2C9d+KJPaey0/5h0QaHaYno4aF+d7i+3uPZtqw0686tdbDj739c+S1oh6WxOXuuDdcok5GS9kcn04Of1Ixnb1pCEVvnflkFgchK9aX/lqveEIy24IRc7pGkSp6pJPVpe9CZKmQ/3/GmU3UiQ344WX9Zaiz7pGD7V2eWaCPLbqChuSA9atw6KegOdLVq6ReN/+9vfksW6o0+xw+3yKfCvHChLizVaDs3LpJAwECsNRe3P32F48CAfGNb7jQfAnpHwbsR048V1q2KoPO+a4uy+pX2Zg7guE/8wEK9VdOgdOfi2XH2DGfCI0qz3Uwj4WGg13lXGGZMca35lJZ+2iiGqBWQX+K3giPMzW/ua14b1A7oA74Tnx1e2vcx0+34x+dLr/cHI9cqb2IUpSHK7Mrm8BDdLciK0Fac5QdL5Sd7xE3caoYoaJUcVgurPijc01/4bMiAf16st6dZvgVx+cdP/r7aUi4tYvN74Mu53AzxjejZjsiDV/1YkuZGbQSilYn1x7vrb0A2wUyMysg5nXVIhMxzIgFHJXR1jGhGcvUV9G5YgH42zm4Pktg8L4ypaDiWKLl1st7t4UfKtHO/8rp8E6M3BWIukLEXM1xAp/sh4s1LCthesQVIaNBcAuNfqPGWFxvo1xt4/ntxBjnlnzk2SUhCmIWBkbtFIH1oWR/43xX1BlsjeHP4IQFa0U8iEzwtHHQ1jkKPKdFS0JMfLhTaOgasD6MFeaJFUfd/1PjoI1f0lJvlvov/BPPKo45x5V8GSCzVZzneH5net4QwUPXflNQix8+NB4gIX3iUIkBWz5gucnpx25CNbnvR/Hws76cOSDMao/p7fG6a0V8Db2bq7dd/tcUFYYnjAdS7jHsnsnUHzASl4dewLeMal44SI83XcyF8Gyeb9a0CLMyuURfqtC0xp1vOX8odx3KWWjGmWnUraMtkekv/3Nax9cc9uiLv3OXlCVqFEPyIPhI+K/6qsJNfBerTe86/EbIzsMEqse258zCqxUdOkcu/qXPIl94avNx3pscBp8N6NUeWiVKZ6m/UZkTNSG2IV16HoWW8WFo+qFnet4s2jA06++fTGBw5d5Y+F7rGKPfy+CFsBC5RGapyoPNf/K2dCMkjiaTqKcyLxR+I0abVUOgdVtXWR1Kxac2P1ohNkShebf4WRMuJoQpXCqgCD+dN1s7oqtVVrV8w/cxTNVJ03HD155JbEfc4NuI7dtdXvZbGm8VbxtFCKm+W6DbY0Vb4AtbCCGJRYs6P8GT9Von8ghsPyzbXlLTrmBWYWx6DzvwRBMNagEFfnW9pFnl974Dqu+Z3Mtj6rXu3+XjNUiwtsa7N750ROIxIisCLSwWfPjE0NXSKjp5GiH6Wkwt9B8L2G67vxCJMoZsM4Pt8Wo7yIVdSIU6y5sMBwxT21dOlWlKnmkVT905ZXErg94y2MpbrU1WD2nStRTw7aW0JxBhcdvvFmm7EagAl7Y7rU8BsK4Locsy4ZJB+tSggquesMR2BRuBthSxJtHmoyewXCFd+ZY3H15kkKWCm+vVBRcPzq2wRmSuy9QLJX4EI/x5I3VcY3gOzd0PlfAcvm7pHlxHYEV6jgHMVbyjCq9+rbZLGwNEtySHa5EoRHSUkn+Ej6agpHnn+9uMoqWM80wqkadqGl+lP1gTU47EJ/jOQKiFBIKkqmAQQ28xYYeqU7dbM9xd1+5pk+j7GarynCBlv1YAR5xRqs8QqOu4/p9sqCoR5QZSi5YHeaOuFx/oJj1Hi53PU+miyO2tPxGUoflBFft4gZTpZxf67YJkFXqjoOe8pt1LhvKgctGLnXgv/F7eRyqbfTKhvJ1WQ5Wt/WbeHZ3TNcLQ4qptc/SaCi6N7VLek75LKcH+GOwUBsaQjO8lbIbS+LAs3Pjz1h1gg23rzL+N9Br685+sCa9HRKhbfsompZrqiI1v+axZUoYW2LRrDzfJpVMi8WzS9xlxNF2afRDXyD6UqVRAxKX+7DBYRdV034jDP6iuXLM1SvKACUXrDmRwMkwsRfdX27cYqtYLTenJLYtYEkoiwMxzLt5auu0v4y3elYUZzkzmAlgJbevMEZPTmyZorW/p1KppypUbZSh+F3ov1W644FZ+dWxJxC64D7ZPIAoZ1TSl+VgnRk4K7gSjMdaxS8UbqmniuVKfPDw2bm8pAm24PE7TE93j+1ls3wXKsazORW6/AL7d9NLFUuC6Xp1oNNjeQxkR813rDsItSSewKZY9vqN3CgPX6hzAnUoivEdNXdnLVjXp64Jokqe3jxYbzgSZ2NSPAIWAKV95KcLNcGHd12vLnuLrV96qwwf22ssuuApnc5yjyWAKniI9Eas1Awmjh20uBb5RcUblMZ2HHZ0ZTNYtun+5Xv2+7j+2nTJMrUtvW9AJnUAl6UUxbgGIs3+/OhC+cPZDJZYvOyAPJ1uqjJEhqLzlqmtC7n4cIaiXofulPyeVNo81hKFspnlPtiLZQ2wyWLBSMGhs2i00HhAu2f1Qm0TQyn5MamMBivce26s/ncUO4lqF40nWmRI0DJPbWXjtyID1ai9GbEqvWY0Q8EasD7MG1wFgyWPez5q3P7GnpYWrGitHr41ZW9x88I5UwULaJ6f85Pp69umB6xhW0vkkL0lriSjlEl3rSlvNBav0qpi/JJAHMq0pWO/vxKzeRLBCgTrZQt0L0QyBHfFfrgBlgtBHgmRDeqNpCpyvg0p1yKWDJRErtEQLezPD0jqtTwGkrAdY/oKYhVRletg5UkGTI5thYqBSNeilJlZnYyNGv3R+Ta9mzMEw0eFR4q3FjIpF8GaCWyp0PypfeSnxqILvAmo8MgMLJSBBaHZBAKOv+eU6dJEkE6hYG0qyXv7/ookHTyJDaSzwXW9lh8jr5nszbzVGRClStSXQz9oOz+9PervTSyqlf5Li2lXUr/AJEYsmKFOy41ZA7ypEKil2XpXTCAMIQ21NMJbuGFnUw/YCpHYBVm1UFEoEq0nJnI6FarClqECXvDmKPqQBNlcFLDi8Zex0bpscj0eDM0puAEWglmV7jiILJCZ6TwRWGEOPf+2g7MWhEgXjzKQDYEKrRx5q0sHORSPEFUEFl+rtMpFn8P1oSIJri17s97wrmVqGzNeS2mnIGWskmjeeRORYwvWqmvsiWFbC3LlhKsp7WPeSZkbsUpVyxsxFxru3cR19cBgpXEkJylzIxbUaCgSvO8Sh1CSchGseLpflGTbCayF/btAsOC0yLwTWAunQqFde/pEL6NIyiqw4N/1KiGTXoT1HpJyBSzBQYv97DudHgIr8YVhIONH35LSCdYWoUufuai5gcCK2WogFbasHhtsk/Z5yaQMBQsSvF5jqG/nPjpJBFaCs6EoNO1i0QnBpBwFC9kwnoVAB6y7qXuHwIqu5trSeHbvtTxGrQ8EVhQ1GouFtZQyBWcV3WN7R+3Nc3MSOmcE1m3i/QCJALZQJ7p8VXTOCCy+hU/OjHhSJip1azfMr7mwtuKD9oT93vq/rM0fddrpFApWeaEmG8AShSbIf9Zl8swkZpbpHUUSvYQmrAqXVp3EfJVSL8yCFp1R8lhJCVrxlIckAmvBoBVneUgisKKruc4QzyQLEoG1oPbdfQd99QRW4lWqklNCJLCSIoBFa/MRWEnRM9sbqC2ewEq8VmlVezbX0jkgsJJSIab4N5tJOQEWtHdTDZktAivxYku3k9nKMkkz4U2ArecfuOvAie8S1T+dDJXrVilkypVyXkdtg16/J6cjFmfk9zevpQudUmHi1Wgs3re9gU4JpcKkFIm4f/1cT6IO6PfP2KyTAnbU6bUyWT7xkSVgJZYtUHXs6KnJCSGjTLUlmgd3309sZUMqDGcLfiv+OtFssgijCsKO2J34yJ6IxbS5Uhd/nVhV8737H9xhswphS6fXYHfiI9vAYnXigYc2HmrtiucXjgEH8UGpkK9SlfyFneuoz4fASryUMukz2xv2bKK+akqFSdCuteWNxqLDiWuGECDntD29bdnLUiA4k943IF5Zv/pndfu4ST52l3XSNU6xQbC06lKNWp+jqZAnmjpGHotEYJFIBBaJwCIRWCQSgUUisEgEFolEYJEyXFL6CpYomqVDEYtEqZBEqXAlanjgOg1NJrAST9WpY2cE737/gzuILUqFUaQqVAmev4UdsTvxQRErWjor0fzgRy0up5C5GOpClZrAIrCID0qFJAKLRKJUmGxNOM0S8Yq5Dv0BH4G1Qk7VjJe+BEqFJAKLRGCRSAQWicAiEVgkEoFFIrBIBBaJRGCRCCwSgUUiEVgkAouULVphi9uGKxCcSfvawCta0rx83AgsEqVCEoFFXwGJwCIRWCQCi0QisEgEFonAIpEILBKBRSKwSCQCi0RgkQgsEonAIhFYJAKLRCKwSAQWicAikQgsEoFFyiX9vwADAIlBLCac7vqAAAAAAElFTkSuQmCC","$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":"3b0f8df0-93b8-44eb-86dd-264d1283ae70","Name":"Clone Tenant","Description":"Clone an Octopus [tenant](https://octopus.com/docs/deployment-patterns/multi-tenant-deployments). The project connections and tenant tags will be cloned and the non-sensitive variables can optionally be cloned.","Version":3,"ExportedAt":"2019-04-16T15:35:56.930Z","ActionType":"Octopus.Script","Author":"ryanrousseau","Packages":[],"Parameters":[{"Id":"cbedd129-210e-4bab-a446-3f89192653c7","Name":"CloneTenantStep_OctopusUrl","Label":"Octopus URL","HelpText":"The URL of the Octopus Server to clone the tenant to.","DefaultValue":"#{Octopus.Web.BaseUrl}","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"ea2614f0-bd41-4011-b263-7d2b12af5977","Name":"CloneTenantStep_ApiKey","Label":"Octopus API Key","HelpText":"The Octopus API Key to use for the API requests","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Sensitive"}},{"Id":"b29e27fb-362e-45e2-a244-6d590875fb68","Name":"CloneTenantStep_TenantIdToClone","Label":"Id of Tenant to Clone","HelpText":"The Id of the tenant to clone. This will be in the format of *Tenants-1*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"b9b3a6c7-6c83-4a79-9a94-febc6c5818d3","Name":"CloneTenantStep_TenantName","Label":"New Tenant Name","HelpText":"The name of the tenant to create. *Note this must be unique*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}},{"Id":"be821ad4-b195-4b11-81c2-f432ff05b86d","Name":"CloneTenantStep_CloneVariables","Label":"Clone Variables?","HelpText":"Flag indicating whether the source tenant's variables should be cloned to the new tenant. *Note this does not copy sensitive variables*","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"831db28c-edc2-496b-b082-e6de827ca5df","Name":"CloneTenantStep_CloneTags","Label":"Clone Tags?","HelpText":"Flag indicating whether the source tenant's tags should be cloned.","DefaultValue":"True","DisplaySettings":{"Octopus.ControlType":"Checkbox"}},{"Id":"f9320a59-9752-43a5-b46a-a4d1486cfced","Name":"CloneTenantStep_SpaceId","Label":"Space Id","HelpText":"The Id of the Space used to clone the tenant. **Leave blank if you are using an Octopus version earlier than 2019.1 or if you wish to use the Octopus.Space.Id variable value.**","DefaultValue":"","DisplaySettings":{"Octopus.ControlType":"SingleLineText"}}],"Properties":{"Octopus.Action.Script.ScriptSource":"Inline","Octopus.Action.Script.Syntax":"PowerShell","Octopus.Action.Script.ScriptBody":"$securityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12\n[Net.ServicePointManager]::SecurityProtocol = $securityProtocol\n\n$octopusBaseUrl = $CloneTenantStep_OctopusUrl.Trim('/')\n$apiKey = $CloneTenantStep_ApiKey\n$tenantToClone = $CloneTenantStep_TenantIdToClone\n$tenantName = $CloneTenantStep_TenantName\n$cloneVariables = $CloneTenantStep_CloneVariables\n$cloneTags = $CloneTenantStep_CloneTags\n$spaceId = $CloneTenantStep_SpaceId\n\n$ErrorActionPreference = 'Stop'\n\nif ([string]::IsNullOrWhiteSpace($octopusBaseUrl)) {\n throw \"The step parameter 'Octopus Base Url' was not found. This step requires the Octopus Server URL to function, please provide one and try again.\"\n}\n\nif ([string]::IsNullOrWhiteSpace($apiKey)) {\n throw \"The step parameter 'Octopus API Key' was not found. This step requires an API Key to function, please provide one and try again.\"\n}\n\nif ([string]::IsNullOrWhiteSpace($tenantToClone)) {\n throw \"The step parameter 'Id of Tenant to Clone' was not found. Please provide one and try again.\"\n}\n\nif ([string]::IsNullOrWhiteSpace($tenantName)) {\n throw \"The step parameter 'New Tenant Name' was not found. Please provide one and try again.\"\n}\n\nfunction Invoke-OctopusApi {\n param(\n [Parameter(Position = 0, Mandatory)]$Uri,\n [ValidateSet(\"Get\", \"Post\", \"Put\", \"Delete\")]$Method = 'Get',\n $Body\n )\n \n $uriParts = @($octopusBaseUrl, $Uri.TrimStart('/')) \n $uri = ($uriParts -join '/')\n\n Write-Verbose \"Uri: $uri\"\n \n $requestParameters = @{\n Uri = $uri\n Method = $Method\n Headers = @{ \"X-Octopus-ApiKey\" = $apiKey }\n UseBasicParsing = $true\n }\n \n if ($null -ne $Body) { $requestParameters.Add('Body', ($Body | ConvertTo-Json -Depth 10)) }\n \n return Invoke-WebRequest @requestParameters | % Content | ConvertFrom-Json\n}\n\nfunction Test-SpacesApi {\n\tWrite-Verbose \"Checking API compatibility\";\n\t$rootDocument = Invoke-OctopusApi 'api/';\n if($rootDocument.Links -ne $null -and $rootDocument.Links.Spaces -ne $null) {\n \tWrite-Verbose \"Spaces API found\"\n \treturn $true;\n }\n Write-Verbose \"Pre-spaces API found\"\n return $false;\n}\n\nif([string]::IsNullOrWhiteSpace($spaceId)) {\n\tif(Test-SpacesApi) {\n \t$spaceId = $OctopusParameters['Octopus.Space.Id'];\n \tif([string]::IsNullOrWhiteSpace($spaceId)) {\n \tthrow \"This step needs to be run in a context that provides a value for the 'Octopus.Space.Id' system variable. In this case, we received a blank value, which isn't expected - please reach out to our support team at https://help.octopus.com if you encounter this error or try providing the Space Id parameter.\";\n \t}\n\t}\n}\n\n$apiPrefix = \"api/\"\n$tenantUrlBase = @($octopusBaseUrl, 'app#')\n\nif ($spaceId) {\n\t$apiPrefix += $spaceId\n $tenantUrlBase += $spaceId\n}\n\nWrite-Host \"Fetching source tenant\"\n$tenant = Invoke-OctopusApi \"$apiPrefix/tenants/$tenantToClone\"\n\n$sourceTenantId = $tenant.Id\n$sourceTenantName = $tenant.Name\n$tenant.Id = $null\n$tenant.Name = $tenantName\n\nif ($cloneTags -ne $true) {\n\tWrite-Host \"Clearing tenant tags\"\n $tenant.TenantTags = @()\n}\n\nWrite-Host \"Creating new tenant\"\n$newTenant = Invoke-OctopusApi \"$apiPrefix/tenants\" -Method Post -Body $tenant\n\nif ($cloneVariables -eq $true) {\n\tWrite-Host \"Cloning variables\"\n $variables = Invoke-OctopusApi $tenant.Links.Variables\n $variables.TenantId = $newTenant.Id\n $variables.TenantName = $tenantName\n\n Invoke-OctopusApi $newTenant.Links.Variables -Method Put -Body $variables | Out-Null\n}\n\n$tenantUrl = ($tenantUrlBase + \"tenants\" + $newTenant.Id + \"overview\") -join '/'\n$sourceTenantUrl = ($tenantUrlBase + \"tenants\" + $sourceTenantId + \"overview\") -join '/'\n\nWrite-Highlight \"New tenant [$tenantName]($tenantUrl) has been cloned from [$sourceTenantName]($sourceTenantUrl)\""},"Category":"Octopus","HistoryUrl":"https://github.com/OctopusDeploy/Library/commits/master/step-templates/clone-tenant.json","Website":"/step-templates/3b0f8df0-93b8-44eb-86dd-264d1283ae70","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":"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":10,"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":{"Octo