Public/New-ISInstance.ps1
#requires -version 4 function ModuleRoot { $MyInvocation.ScriptName | Split-Path -Parent } $PrivPath = $(Join-Path $(ModuleRoot | Split-Path -Parent) "\Private") $PluginPath = $(Join-Path $(ModuleRoot | Split-Path -Parent) "\InstanceCreationPlugins") . $PrivPath\HelperFunctions.ps1 . $PrivPath\New-SymLink.ps1 . $PrivPath\Open-ISComponentConfiguration.ps1 . $PrivPath\Register-ISPlugins.ps1 . $PrivPath\Invoke-ISPlugins.ps1 <# .SYNOPSIS Creates a new instance of an IntelliSearch component .DESCRIPTION The New-ISInstance cmdlet will create a new, blank component from an installed component package. It will use the configuration file found in the package at /etc/ISPSInstance.config .PARAMETER Name The name for the new instance. Should contain only alphanumeric characters and hyphens. .PARAMETER ComponentDirectory The directory of the IntelliSearch component to instantiate. .PARAMETER Path The path to where the instance should be created. Defaults to the InstanceStore setting. Usually C:\ProgramData\IntelliSearch. .EXAMPLE Install-ISComponent -Name IntelliSearch.Connector.File | New-ISInstance -Name FileShare .EXAMPLE Get-ISComponent -Name Crawler* | New-ISInstance -Name FileCrawlerManager .INPUTS Component, System.String .OUTPUTS Instance #> function New-ISInstance { [CmdletBinding(ConfirmImpact = 'Low')] [OutputType()] param( [Parameter( Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true )] [ValidateNotNull()] [ValidateNotNullOrEmpty()] [ValidateScript( { if (ValidateInstanceName $_) { return $true } else { Throw [System.Management.Automation.ValidationMetadataException] "The instance name '${_}' is not valid." } })] [Alias("ComponentName")] [String] $Name, [Parameter( Mandatory = $true, Position = 1, ValueFromPipelineByPropertyName = $true )] [ValidateScript( { Test-Path $_ -PathType Container})] [Alias()] [String] $ComponentDirectory, [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )] [Alias()] [ValidateScript( { if (ValidatePath $_) { return $true } else { Throw [System.Management.Automation.ValidationMetadataException] "The instance store path '${_}' is not valid." } })] [String[]] $Path = $IS_Settings.InstanceStore ) begin { Write-Verbose "Loading plugins..." $Plugins = Register-ISPlugins $IS_Settings.InstanceCreationPluginStore Write-Verbose "Loaded $($Plugins.Count) plugins." } process { $ConfigurationPath = Join-Path $ComponentDirectory "\etc\ISPSInstance.config" $InstanceDirectory = (Join-Path $Path $Name) Write-Verbose ("Making new instance {0}" -f $Name) if (-not (ValidatePath $Path)) { Write-Error "Instance path is not valid. Got: $($Path)" -ErrorAction:Stop } if (Test-Path $InstanceDirectory -PathType Container) { Write-Error "Instance name already exists. Names must be unique. Got $Name" -ErrorAction:Stop } Write-Verbose ("Processing ISPSInstance.config for {0}" -f $Name) try { $ConfigurationNodes = Open-ISComponentConfiguration -Path $ConfigurationPath } catch [System.Management.Automation.ParameterBindingException], [System.Management.Automation.MethodInvocationException] { Throw "Found no valid ISPSInstance.config file" } $InstanceDirectory = New-Item -Path $InstanceDirectory -ItemType Container $PluginArguments = @{ "InstanceName" = $Name "InstanceDirectory" = $InstanceDirectory "ComponentDirectory" = $ComponentDirectory } if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) { $PluginArguments.Add("Verbose", $true) } foreach ($Node in $ConfigurationNodes.ChildNodes) { Write-Verbose "Working on node: $($Node.Name)" # If the child node is a comment, skip it if ($Node.Name -eq "#comment") { continue } $PluginArguments.Node = $Node Write-Verbose "Arguments: $($PluginArguments | Out-String)" Invoke-ISPlugins -Plugins $Plugins -PluginArguments $PluginArguments } } end { } } |