IIS Virtual Directory - Create

Octopus.Script exported 2015-08-25 by jaymickey belongs to ‘IIS’ category.

Create an IIS virtual directory.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Virtual path

VirtualPath =

The full path to the virtual directory you wish to create. Do not include the application (if any) the directory will be created under. The path, not including the virtual directory itself must already exist. Eg. If the virtual directory is to be created under myapp/someFolder/myVdir enter: someFolder/myVdir.

Application

ApplicationName =

Name of the IIS application to create the virtual directory under (not required).

Physical path

PhysicalPath =

Physical folder that the application will serve files from. Example: C:\MyApp.

Create Physical Path (If not exists)

CreatePhysicalPath = False

Create the physical path if it does not exist.

Parent site

ParentSite

The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:

Default Web Site

Username

Username

Pass-through authentication username

Password

Password

Pass-through authentication password

Script body

Steps based on this template will execute the following PowerShell script.

## --------------------------------------------------------------------------------------
## Input
## --------------------------------------------------------------------------------------

$virtualPath = $OctopusParameters['VirtualPath'].TrimStart('/',' ').TrimEnd('/', ' ')
$physicalPath = $OctopusParameters['PhysicalPath']
$parentSite = $OctopusParameters['ParentSite']
$application = $OctopusParameters['ApplicationName']
$username = $OctopusParameters['Username']
$password = $OctopusParameters['Password']
$createPhysicalPath = $OctopusParameters['CreatePhysicalPath']

## --------------------------------------------------------------------------------------
## Helpers
## --------------------------------------------------------------------------------------
# Helper for validating input parameters
function Confirm-Parameter([string]$parameterInput, [string[]]$validInput, $parameterName) {
    Write-Host "${parameterName}: $parameterInput"
    if (! $parameterInput) {
        throw "No value was set for $parameterName, and it cannot be empty"
    }

    if ($validInput) {
        if (! $validInput -contains $parameterInput) {
            throw "'$input' is not a valid input for '$parameterName'"
        }
    }

}

# Helper to run a block with a retry if things go wrong
$maxFailures = 5
$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4
function Invoke-CommandWithRetry([ScriptBlock] $command) {
    $attemptCount = 0
    $operationIncomplete = $true

    while ($operationIncomplete -and $attemptCount -lt $maxFailures) {
        $attemptCount = ($attemptCount + 1)

        if ($attemptCount -ge 2) {
            Write-Output "Waiting for $sleepBetweenFailures seconds before retrying..."
            Start-Sleep -s $sleepBetweenFailures
            Write-Output "Retrying..."
        }

        try {
            & $command

            $operationIncomplete = $false
        } catch [System.Exception] {
            if ($attemptCount -lt ($maxFailures)) {
                Write-Output ("Attempt $attemptCount of $maxFailures failed: " + $_.Exception.Message)

            }
            else {
                throw "Failed to execute command"
            }
        }
    }
}

## --------------------------------------------------------------------------------------
## Configuration
## --------------------------------------------------------------------------------------
Confirm-Parameter $virtualPath -parameterName "Virtual path"
Confirm-Parameter $physicalPath -parameterName "Physical path"
Confirm-Parameter $parentSite -parameterName "Parent site"

if (![string]::IsNullOrEmpty($application)) {
    $application = $application.TrimStart('/',' ').TrimEnd('/',' ')
}

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue


## --------------------------------------------------------------------------------------
## Run
## --------------------------------------------------------------------------------------

Write-Host "Getting web site $parentSite"
$site = Get-Website -name $parentSite
if (!$site) {
    throw "The web site '$parentSite' does not exist. Please create the site first."
}

$virtualFullPath = $virtualPath

if ($application) {
    Write-Host "Verifying existance of application $application"
    $app = Get-WebApplication -site $parentSite -name $application
    if (!$app) {
        throw "The application '$parentSite' does not exist. Please create the application first."
    } else {
        $virtualFullPath = $application + '/' + $virtualPath
    }
}

# If the physical path down not exist and $createPhysicalPath is true,
# then attempt create it, otherwise throw an error.
if (!(Test-Path $physicalPath)) {
    if ($createPhysicalPath) {
        try {
            Write-Host "Attempting to create physical path '$physicalPath'"
            New-Item -Type Directory -Path $physicalPath -Force
        } catch {
            throw "Couldn't create physical path!"
        }
    } else {
        throw "Physical path does not exist!"
    }
}

# This needs to be improved, especially given applicaltions can be nested.
if ($application) {
    $existing = Get-WebVirtualDirectory -site $parentSite -Application $application -Name $virtualPath
} else {
    $existing = Get-WebVirtualDirectory -site $parentSite -Name $virtualPath
}

Invoke-CommandWithRetry {

    $virtualDirectoryPath = "IIS:\Sites\$parentSite\$virtualFullPath"

    if (!$existing) {
        Write-Host "Creating virtual directory '$virtualPath'"

        New-Item $virtualDirectoryPath -type VirtualDirectory -physicalPath $physicalPath

        Write-Host "Virtual directory created"
    }
    else {
        Write-Host "The virtual directory '$virtualPath' already exists. Checking physical path."

        $currentPath = (Get-ItemProperty $virtualDirectoryPath).physicalPath
        Write-Host "Physical path currently set to $currentPath"

        if ([string]::Compare($currentPath, $physicalPath, $True) -ne 0) {
            Set-ItemProperty $virtualDirectoryPath -name physicalPath -value $physicalPath
            Write-Host "Physical path changed to $physicalPath"
        }
    }

    ## Set vdir pass-through credentails, if applicable
    if (![string]::IsNullOrEmpty($username) -and ![string]::IsNullOrEmpty($password)) {
        Write-Host "Setting Pass-through credentials for username '$username'"

        Set-ItemProperty $virtualDirectoryPath -Name userName -Value $username
        Set-ItemProperty $virtualDirectoryPath -Name password -Value $password

        Write-Host "Pass-through credentials set"
    }
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "2cfbcd72-cf43-43fd-8291-9bb564cc512c",
  "Name": "IIS Virtual Directory - Create",
  "Description": "Create an IIS virtual directory.",
  "Version": 7,
  "ExportedAt": "2015-08-25T13:55:15.518+00:00",
  "ActionType": "Octopus.Script",
  "Author": "jaymickey",
  "Parameters": [
    {
      "Name": "VirtualPath",
      "Label": "Virtual path",
      "HelpText": "The full path to the virtual directory you wish to create. Do not include the application (if any) the directory will be created under. The path, not including the virtual directory itself must already exist. Eg. If the virtual directory is to be created under `myapp/someFolder/myVdir` enter: `someFolder/myVdir`.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "ApplicationName",
      "Type": "String",
      "Label": "Application",
      "HelpText": "Name of the IIS application to create the virtual directory under (not required).",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "PhysicalPath",
      "Label": "Physical path",
      "HelpText": "Physical folder that the application will serve files from. Example: `C:\\MyApp`.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "CreatePhysicalPath",
      "Label": "Create Physical Path (If not exists)",
      "HelpText": "Create the physical path if it does not exist.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Name": "ParentSite",
      "Label": "Parent site",
      "HelpText": "The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:\n\n    Default Web Site",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "Username",
      "Label": "Username",
      "HelpText": "Pass-through authentication username",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "Password",
      "Label": "Password",
      "HelpText": "Pass-through authentication password",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "## --------------------------------------------------------------------------------------\n## Input\n## --------------------------------------------------------------------------------------\n\n$virtualPath = $OctopusParameters['VirtualPath'].TrimStart('/',' ').TrimEnd('/', ' ')\n$physicalPath = $OctopusParameters['PhysicalPath']\n$parentSite = $OctopusParameters['ParentSite']\n$application = $OctopusParameters['ApplicationName']\n$username = $OctopusParameters['Username']\n$password = $OctopusParameters['Password']\n$createPhysicalPath = $OctopusParameters['CreatePhysicalPath']\n\n## --------------------------------------------------------------------------------------\n## Helpers\n## --------------------------------------------------------------------------------------\n# Helper for validating input parameters\nfunction Confirm-Parameter([string]$parameterInput, [string[]]$validInput, $parameterName) {\n    Write-Host \"${parameterName}: $parameterInput\"\n    if (! $parameterInput) {\n        throw \"No value was set for $parameterName, and it cannot be empty\"\n    }\n\n    if ($validInput) {\n        if (! $validInput -contains $parameterInput) {\n            throw \"'$input' is not a valid input for '$parameterName'\"\n        }\n    }\n\n}\n\n# Helper to run a block with a retry if things go wrong\n$maxFailures = 5\n$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\nfunction Invoke-CommandWithRetry([ScriptBlock] $command) {\n    $attemptCount = 0\n    $operationIncomplete = $true\n\n    while ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n        $attemptCount = ($attemptCount + 1)\n\n        if ($attemptCount -ge 2) {\n            Write-Output \"Waiting for $sleepBetweenFailures seconds before retrying...\"\n            Start-Sleep -s $sleepBetweenFailures\n            Write-Output \"Retrying...\"\n        }\n\n        try {\n            & $command\n\n            $operationIncomplete = $false\n        } catch [System.Exception] {\n            if ($attemptCount -lt ($maxFailures)) {\n                Write-Output (\"Attempt $attemptCount of $maxFailures failed: \" + $_.Exception.Message)\n\n            }\n            else {\n                throw \"Failed to execute command\"\n            }\n        }\n    }\n}\n\n## --------------------------------------------------------------------------------------\n## Configuration\n## --------------------------------------------------------------------------------------\nConfirm-Parameter $virtualPath -parameterName \"Virtual path\"\nConfirm-Parameter $physicalPath -parameterName \"Physical path\"\nConfirm-Parameter $parentSite -parameterName \"Parent site\"\n\nif (![string]::IsNullOrEmpty($application)) {\n    $application = $application.TrimStart('/',' ').TrimEnd('/',' ')\n}\n\nAdd-PSSnapin WebAdministration -ErrorAction SilentlyContinue\nImport-Module WebAdministration -ErrorAction SilentlyContinue\n\n\n## --------------------------------------------------------------------------------------\n## Run\n## --------------------------------------------------------------------------------------\n\nWrite-Host \"Getting web site $parentSite\"\n$site = Get-Website -name $parentSite\nif (!$site) {\n    throw \"The web site '$parentSite' does not exist. Please create the site first.\"\n}\n\n$virtualFullPath = $virtualPath\n\nif ($application) {\n    Write-Host \"Verifying existance of application $application\"\n    $app = Get-WebApplication -site $parentSite -name $application\n    if (!$app) {\n        throw \"The application '$parentSite' does not exist. Please create the application first.\"\n    } else {\n        $virtualFullPath = $application + '/' + $virtualPath\n    }\n}\n\n# If the physical path down not exist and $createPhysicalPath is true,\n# then attempt create it, otherwise throw an error.\nif (!(Test-Path $physicalPath)) {\n    if ($createPhysicalPath) {\n        try {\n            Write-Host \"Attempting to create physical path '$physicalPath'\"\n            New-Item -Type Directory -Path $physicalPath -Force\n        } catch {\n            throw \"Couldn't create physical path!\"\n        }\n    } else {\n        throw \"Physical path does not exist!\"\n    }\n}\n\n# This needs to be improved, especially given applicaltions can be nested.\nif ($application) {\n    $existing = Get-WebVirtualDirectory -site $parentSite -Application $application -Name $virtualPath\n} else {\n    $existing = Get-WebVirtualDirectory -site $parentSite -Name $virtualPath\n}\n\nInvoke-CommandWithRetry {\n\n    $virtualDirectoryPath = \"IIS:\\Sites\\$parentSite\\$virtualFullPath\"\n\n    if (!$existing) {\n        Write-Host \"Creating virtual directory '$virtualPath'\"\n\n        New-Item $virtualDirectoryPath -type VirtualDirectory -physicalPath $physicalPath\n\n        Write-Host \"Virtual directory created\"\n    }\n    else {\n        Write-Host \"The virtual directory '$virtualPath' already exists. Checking physical path.\"\n\n        $currentPath = (Get-ItemProperty $virtualDirectoryPath).physicalPath\n        Write-Host \"Physical path currently set to $currentPath\"\n\n        if ([string]::Compare($currentPath, $physicalPath, $True) -ne 0) {\n            Set-ItemProperty $virtualDirectoryPath -name physicalPath -value $physicalPath\n            Write-Host \"Physical path changed to $physicalPath\"\n        }\n    }\n\n    ## Set vdir pass-through credentails, if applicable\n    if (![string]::IsNullOrEmpty($username) -and ![string]::IsNullOrEmpty($password)) {\n        Write-Host \"Setting Pass-through credentials for username '$username'\"\n\n        Set-ItemProperty $virtualDirectoryPath -Name userName -Value $username\n        Set-ItemProperty $virtualDirectoryPath -Name password -Value $password\n\n        Write-Host \"Pass-through credentials set\"\n    }\n}\n",
    "Octopus.Action.Script.Syntax": "PowerShell"
  },
  "Category": "IIS",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/iis-vdir-create.json",
  "Website": "/step-templates/2cfbcd72-cf43-43fd-8291-9bb564cc512c",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Tuesday, August 25, 2015