21
Modules/rCisTag/MITLicense.txt
Normal file
21
Modules/rCisTag/MITLicense.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) since 2015 Luc Dekens, Matt Boren
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
15
Modules/rCisTag/README.md
Normal file
15
Modules/rCisTag/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# rCisTag
|
||||
|
||||
A module with cmdlets to provide CRUD functions to
|
||||
* Tags
|
||||
* Tag Categories
|
||||
* Tag Assignments
|
||||
|
||||
The cmdlets use the Cis REST API
|
||||
|
||||
## History
|
||||
|
||||
* Author : **Luc Dekens**
|
||||
* Release :
|
||||
* **0.9.0** First draft
|
||||
|
||||
26
Modules/rCisTag/en-US/about_rCISTag.Help.txt
Normal file
26
Modules/rCisTag/en-US/about_rCISTag.Help.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
TOPIC
|
||||
about_rCISTag
|
||||
|
||||
SHORT DESCRIPTION
|
||||
The rCisTag module provides CRUD functions to work with vSphere Tags
|
||||
|
||||
LONG DESCRIPTION
|
||||
The CisTag module provides CRUD functions to work with vSphere Tags.
|
||||
The functions in the module are based on the REST API
|
||||
|
||||
NOTE
|
||||
The module requires PowerShell 5.0
|
||||
|
||||
TROUBLESHOOTING NOTE
|
||||
|
||||
|
||||
|
||||
EXAMPLES
|
||||
Get-rCisTag
|
||||
|
||||
KEYWORDS
|
||||
|
||||
|
||||
|
||||
SEE ALSO
|
||||
Place related topics here.
|
||||
1793
Modules/rCisTag/en-US/rCISTag-help.xml
Normal file
1793
Modules/rCisTag/en-US/rCISTag-help.xml
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Modules/rCisTag/rCISTag.psd1
Normal file
BIN
Modules/rCisTag/rCISTag.psd1
Normal file
Binary file not shown.
821
Modules/rCisTag/rCISTag.psm1
Normal file
821
Modules/rCisTag/rCISTag.psm1
Normal file
@@ -0,0 +1,821 @@
|
||||
function Disable-SSLValidation{
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Disables SSL certificate validation
|
||||
.DESCRIPTION
|
||||
Disable-SSLValidation disables SSL certificate validation by using reflection to implement the System.Net.ICertificatePolicy class.
|
||||
|
||||
Author: Matthew Graeber (@mattifestation)
|
||||
License: BSD 3-Clause
|
||||
.NOTES
|
||||
Reflection is ideal in situations when a script executes in an environment in which you cannot call csc.ese to compile source code. If compiling code is an option, then implementing System.Net.ICertificatePolicy in C# and Add-Type is trivial.
|
||||
.LINK
|
||||
http://www.exploit-monday.com
|
||||
#>
|
||||
|
||||
Set-StrictMode -Version 2
|
||||
|
||||
# You have already run this function
|
||||
if ([System.Net.ServicePointManager]::CertificatePolicy.ToString() -eq 'IgnoreCerts') { Return }
|
||||
|
||||
$Domain = [AppDomain]::CurrentDomain
|
||||
$DynAssembly = New-Object System.Reflection.AssemblyName('IgnoreCerts')
|
||||
$AssemblyBuilder = $Domain.DefineDynamicAssembly($DynAssembly, [System.Reflection.Emit.AssemblyBuilderAccess]::Run)
|
||||
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('IgnoreCerts', $false)
|
||||
$TypeBuilder = $ModuleBuilder.DefineType('IgnoreCerts', 'AutoLayout, AnsiClass, Class, Public, BeforeFieldInit', [System.Object], [System.Net.ICertificatePolicy])
|
||||
$TypeBuilder.DefineDefaultConstructor('PrivateScope, Public, HideBySig, SpecialName, RTSpecialName') | Out-Null
|
||||
$MethodInfo = [System.Net.ICertificatePolicy].GetMethod('CheckValidationResult')
|
||||
$MethodBuilder = $TypeBuilder.DefineMethod($MethodInfo.Name, 'PrivateScope, Public, Virtual, HideBySig, VtableLayoutMask', $MethodInfo.CallingConvention, $MethodInfo.ReturnType, ([Type[]] ($MethodInfo.GetParameters() | % {$_.ParameterType})))
|
||||
$ILGen = $MethodBuilder.GetILGenerator()
|
||||
$ILGen.Emit([Reflection.Emit.Opcodes]::Ldc_I4_1)
|
||||
$ILGen.Emit([Reflection.Emit.Opcodes]::Ret)
|
||||
$TypeBuilder.CreateType() | Out-Null
|
||||
|
||||
# Disable SSL certificate validation
|
||||
[System.Net.ServicePointManager]::CertificatePolicy = New-Object IgnoreCerts
|
||||
}
|
||||
|
||||
function Invoke-vCisRest{
|
||||
param (
|
||||
[String]$Method,
|
||||
[String]$Request,
|
||||
[PSObject]$Body
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
Write-Verbose -Message "$($MyInvocation.MyCommand.Name)"
|
||||
Write-Verbose -Message "`t$($PSCmdlet.ParameterSetName)"
|
||||
Write-Verbose -Message "`tCalled from $($stack = Get-PSCallStack; $stack[1].Command) at $($stack[1].Location)"
|
||||
|
||||
Disable-SSLValidation
|
||||
|
||||
$sRest = @{
|
||||
Uri = "https:/",$Script:CisServer.Server,'rest',$Request -join '/'
|
||||
Method = $Method
|
||||
# Body = &{if($Body){$Body}}
|
||||
Body = &{if($Body){$Body | ConvertTo-Json -Depth 32}}
|
||||
ContentType = 'application/json'
|
||||
Headers = &{
|
||||
if($Script:CisServer.ContainsKey('vmware-api-session-id')){
|
||||
@{
|
||||
'vmware-api-session-id' = "$($Script:CisServer.'vmware-api-session-id')"
|
||||
}
|
||||
}
|
||||
else{
|
||||
@{
|
||||
Authorization = "$($Script:CisServer.AuthHeader)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Try
|
||||
{
|
||||
# $result = Invoke-WebRequest @sRest
|
||||
$result = Invoke-RestMethod @sRest
|
||||
}
|
||||
Catch
|
||||
{
|
||||
|
||||
}
|
||||
$result
|
||||
}
|
||||
}
|
||||
|
||||
function Connect-rCisServer{
|
||||
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')]
|
||||
param (
|
||||
[Parameter(Mandatory, Position = 1)]
|
||||
[String]$Server,
|
||||
[Parameter(Mandatory = $True,ValueFromPipeline = $True, Position = 2, ParameterSetName = 'Credential')]
|
||||
[System.Management.Automation.PSCredential]$Credential,
|
||||
[Parameter(Mandatory = $True, Position = 2, ParameterSetName = 'PlainText')]
|
||||
[String]$User,
|
||||
[Parameter(Mandatory = $True, Position = 3, ParameterSetName = 'PlainText')]
|
||||
[String]$Password,
|
||||
[string]$Proxy,
|
||||
[Parameter(DontShow)]
|
||||
[switch]$Fiddler = $false
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
if ($Proxy)
|
||||
{
|
||||
if ($PSDefaultParameterValues.ContainsKey('*:Proxy'))
|
||||
{
|
||||
$PSDefaultParameterValues['*:Proxy'] = $Proxy
|
||||
}
|
||||
else
|
||||
{
|
||||
$PSDefaultParameterValues.Add('*:Proxy', $Proxy)
|
||||
}
|
||||
if ($PSDefaultParameterValues.ContainsKey('*:ProxyUseDefaultCredentials'))
|
||||
{
|
||||
$PSDefaultParameterValues['*:ProxyUseDefaultCredentials'] = $True
|
||||
}
|
||||
else
|
||||
{
|
||||
$PSDefaultParameterValues.Add('*:ProxyUseDefaultCredentials', $True)
|
||||
}
|
||||
}
|
||||
if ($PSCmdlet.ParameterSetName -eq 'PlainText')
|
||||
{
|
||||
$sPswd = ConvertTo-SecureString -String $Password -AsPlainText -Force
|
||||
$CisCredential = New-Object System.Management.Automation.PSCredential -ArgumentList ($User, $sPswd)
|
||||
}
|
||||
if ($PSCmdlet.ParameterSetName -eq 'Credential')
|
||||
{
|
||||
$CisCredential = $Credential
|
||||
}
|
||||
if ($Fiddler)
|
||||
{
|
||||
if (Get-Process -Name fiddler -ErrorAction SilentlyContinue)
|
||||
{
|
||||
if ($PSDefaultParameterValues.ContainsKey('Invoke-RestMethod:Proxy'))
|
||||
{
|
||||
$PSDefaultParameterValues['Invoke-RestMethod:Proxy'] = 'http://127.0.0.1:8888'
|
||||
}
|
||||
else
|
||||
{
|
||||
$PSDefaultParameterValues.Add('Invoke-RestMethod:Proxy', 'http://127.0.0.1:8888')
|
||||
}
|
||||
}
|
||||
}
|
||||
$Script:CisServer = @{
|
||||
Server = $Server
|
||||
AuthHeader = &{
|
||||
$User = $CisCredential.UserName
|
||||
$Password = $CisCredential.GetNetworkCredential().password
|
||||
|
||||
$Encoded = [System.Text.Encoding]::UTF8.GetBytes(($User, $Password -Join ':'))
|
||||
$EncodedPassword = [System.Convert]::ToBase64String($Encoded)
|
||||
"Basic $($EncodedPassword)"
|
||||
}
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = 'com/vmware/cis/session'
|
||||
}
|
||||
If($PSCmdlet.ShouldProcess("CisServer $($Server)"))
|
||||
{
|
||||
$result = Invoke-vCisRest @sRest
|
||||
|
||||
$Script:CisServer.Add('vmware-api-session-id',$result.value)
|
||||
$Script:CisServer.Remove('AuthHeader')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Disconnect-rCisServer{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory = $True, Position = 1)]
|
||||
[String]$Server
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
if($Server -ne $Script:CisServer.Server){
|
||||
Write-Warning "You are not connected to server $($Server)"
|
||||
}
|
||||
|
||||
$sRest = @{
|
||||
Method = 'Delete'
|
||||
Request = 'com/vmware/cis/session'
|
||||
}
|
||||
If($PSCmdlet.ShouldProcess("CisServer $($Server)"))
|
||||
{
|
||||
$result = Invoke-vCisRest @sRest
|
||||
$Script:CisServer.Remove('vmware-api-session-id')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Get-rCisTag{`
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Low', DefaultParameterSetName='Name')]
|
||||
param (
|
||||
[Parameter(Position = 1, ParameterSetName='Name')]
|
||||
[String[]]$Name,
|
||||
[Parameter(Position = 2, ParameterSetName='Name',ValueFromPipeline = $true)]
|
||||
[PSObject[]]$Category,
|
||||
[Parameter(Mandatory = $True, Position = 1, ParameterSetName='Id')]
|
||||
[String[]]$Id
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
if($PSCmdlet.ParameterSetName -eq 'Name'){
|
||||
if($Category){
|
||||
$tagIds = $Category | %{
|
||||
$categoryIds = &{if($_ -is [string]){
|
||||
(Get-rCisTagCategory -Name $_).Id
|
||||
}
|
||||
else{
|
||||
$_.Id
|
||||
}}
|
||||
$categoryIds | %{
|
||||
# Get all tags in categories
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = "com/vmware/cis/tagging/tag/id:$([uri]::EscapeDataString($_))?~action=list-tags-for-category"
|
||||
}
|
||||
(Invoke-vCisRest @sRest).value
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
$sRest = @{
|
||||
Method = 'Get'
|
||||
Request = 'com/vmware/cis/tagging/tag'
|
||||
}
|
||||
$tagIds = (Invoke-vCisRest @sRest).value
|
||||
}
|
||||
}
|
||||
else{
|
||||
$tagIds = $Id
|
||||
}
|
||||
|
||||
# Get category details
|
||||
$out = @()
|
||||
$tagIds | where{($PSCmdlet.ParameterSetName -eq 'Id' -and $Id -contains $_) -or $PSCmdlet.ParameterSetName -eq 'Name'} | %{
|
||||
$sRest = @{
|
||||
Method = 'Get'
|
||||
Request = "com/vmware/cis/tagging/tag/id:$([uri]::EscapeDataString($_))"
|
||||
}
|
||||
$result = Invoke-vCisRest @sRest
|
||||
|
||||
if($PSCmdlet.ParameterSetName -eq 'Id' -or ($PSCmdlet.ParameterSetName -eq 'Name' -and ($Name -eq $null -or $Name -contains $result.value.name))){
|
||||
$out += New-Object PSObject -Property @{
|
||||
Description = $result.value.description
|
||||
Id = $result.value.id
|
||||
Name = $result.value.name
|
||||
Category = (Get-rCisTagCategory -Id $result.value.category_id).Name
|
||||
Uid = "$($global:defaultviserver.Id)Tag=$($result.value.id)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
}
|
||||
$out | Select-Object Category,Description,Id,Name,Uid,Client
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function Get-rCisTagCategory{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Low', DefaultParameterSetName='Name')]
|
||||
param (
|
||||
[Parameter(Position = 1, ParameterSetName='Name')]
|
||||
[String[]]$Name,
|
||||
[Parameter(Mandatory = $True, Position = 1, ParameterSetName='Id')]
|
||||
[String[]]$Id
|
||||
)
|
||||
|
||||
Begin
|
||||
{
|
||||
$txtInfo = (Get-Culture).TextInfo
|
||||
$entityTab = @{
|
||||
'ClusterComputeResource' = 'Cluster'
|
||||
'DistributedVirtualSwitch' = 'DistributedSwitch'
|
||||
'VmwareDistributedVirtualSwitch' = 'DistributedSwitch'
|
||||
'HostSystem' = 'VMHost'
|
||||
'DistributedVirtualPortGroup' = 'DistributedPortGroup'
|
||||
'VirtualApp' = 'VApp'
|
||||
'StoragePod' = 'DatastoreCluster'
|
||||
'Network' = 'VirtualPortGroup'
|
||||
}
|
||||
}
|
||||
|
||||
Process
|
||||
{
|
||||
if($PSCmdlet.ParameterSetName -eq 'Name'){
|
||||
# Get all categories
|
||||
$sRest = @{
|
||||
Method = 'Get'
|
||||
Request = 'com/vmware/cis/tagging/category'
|
||||
}
|
||||
$tagCategoryIds = (Invoke-vCisRest @sRest).value
|
||||
}
|
||||
else{
|
||||
$tagCategoryIds = $Id
|
||||
}
|
||||
|
||||
# Get category details
|
||||
$out = @()
|
||||
$tagCategoryids | where{($PSCmdlet.ParameterSetName -eq 'Id' -and $Id -contains $_) -or $PSCmdlet.ParameterSetName -eq 'Name'} | %{
|
||||
$sRest = @{
|
||||
Method = 'Get'
|
||||
Request = "com/vmware/cis/tagging/category/id:$([uri]::EscapeDataString($_))"
|
||||
}
|
||||
$result = Invoke-vCisRest @sRest
|
||||
if($PSCmdlet.ParameterSetName -eq 'Id' -or ($PSCmdlet.ParameterSetName -eq 'Name' -and ($Name -eq $null -or $Name -contains $result.value.name))){
|
||||
$out += New-Object PSObject -Property @{
|
||||
Description = $result.value.description
|
||||
Cardinality = $txtInfo.ToTitleCase($result.value.cardinality.ToLower())
|
||||
EntityType = @(&{
|
||||
if($result.value.associable_types.Count -eq 0){'All'}
|
||||
else{
|
||||
$result.value.associable_types | %{
|
||||
if($entityTab.ContainsKey($_)){
|
||||
$entityTab.Item($_)
|
||||
}
|
||||
else{$_}
|
||||
}
|
||||
}} | Sort-Object -Unique)
|
||||
Id = $result.value.id
|
||||
Name = $result.value.name
|
||||
Uid = "$($global:defaultviserver.Id)TagCategory=$($result.value.id)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
}
|
||||
$out | Select-Object Description,Cardinality,EntityType,Id,Name,Uid,Client
|
||||
}
|
||||
}
|
||||
|
||||
function Get-rCisTagAssignment{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Low')]
|
||||
param (
|
||||
[parameter(Position = 1, ValueFromPipeline = $true)]
|
||||
[PSObject[]]$Entity,
|
||||
[parameter(Position = 2)]
|
||||
[PSObject[]]$Tag,
|
||||
[parameter(Position = 3)]
|
||||
[PSObject[]]$Category
|
||||
)
|
||||
|
||||
Begin
|
||||
{
|
||||
if($Category.Count -ne 0 -or $Tag.Count -ne 0){
|
||||
$tagIds = @((Get-rCisTag -Name $Tag -Category $Category).Id)
|
||||
}
|
||||
else{
|
||||
$tagIds = @((Get-rCisTag).Id)
|
||||
}
|
||||
$out = @()
|
||||
}
|
||||
|
||||
Process
|
||||
{
|
||||
foreach($ent in $Entity){
|
||||
if($ent -is [string]){
|
||||
$ent = Get-Inventory -Name $ent -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
$entMoRef = New-Object PSObject -Property @{
|
||||
type = $ent.ExtensionData.MoRef.Type
|
||||
id = $ent.ExtensionData.MoRef.Value
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = 'com/vmware/cis/tagging/tag-association?~action=list-attached-tags-on-objects'
|
||||
Body = @{
|
||||
object_ids = @($entMoRef)
|
||||
}
|
||||
}
|
||||
$tagObj = (Invoke-vCisRest @sRest).value
|
||||
foreach($obj in @($tagObj)){
|
||||
foreach($tag in ($obj.tag_ids | where{$tagIds -contains $_})){
|
||||
$sMoRef = "$($obj.object_id.type)-$($obj.object_id.id)"
|
||||
$out += New-Object PSObject -Property @{
|
||||
Entity = (Get-View -id $sMoRef -Property Name).Name
|
||||
Tag = (Get-rCisTag -Id $tag).Name
|
||||
Id = 'com.vmware.cis.tagging.TagAssociationModel'
|
||||
Name = 'com.vmware.cis.tagging.TagAssociationModel'
|
||||
Uid = "$($global:defaultviserver.Id)VirtualMachine=$($sMoRef)/TagAssignment=/Tag=$($tag.tag_id)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
End
|
||||
{
|
||||
if($out.Count -eq 0)
|
||||
{
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = 'com/vmware/cis/tagging/tag-association?~action=list-attached-objects-on-tags'
|
||||
Body = @{
|
||||
tag_ids = $tagIds
|
||||
}
|
||||
}
|
||||
$tagObj = (Invoke-vCisRest @sRest).value
|
||||
$out = foreach($tag in @(($tagObj | where{$tagIds -contains $_.tag_id}))){
|
||||
foreach($obj in $tag.object_ids){
|
||||
$sMoRef = "$($obj.type)-$($obj.id)"
|
||||
New-Object PSObject -Property @{
|
||||
Entity = (Get-View -id $sMoRef -Property Name).Name
|
||||
Tag = (Get-rCisTag -Id $tag.tag_id).Name
|
||||
Id = 'com.vmware.cis.tagging.TagAssociationModel'
|
||||
Name = 'com.vmware.cis.tagging.TagAssociationModel'
|
||||
Uid = "$($global:defaultviserver.Id)VirtualMachine=$($sMoRef)/TagAssignment=/Tag=$($tag.tag_id)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$out | Select-Object Uid,Tag,Entity,Id,Name,Client
|
||||
}
|
||||
}
|
||||
|
||||
function New-rCisTag{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1)]
|
||||
[String[]]$Name,
|
||||
[Parameter(Mandatory=$true, Position = 2,ValueFromPipeline = $true)]
|
||||
[PSObject]$Category,
|
||||
[Parameter(Position = 3)]
|
||||
[string]$Description
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
$out = @()
|
||||
if($Category -is [String]){
|
||||
$Category = Get-rCisTagCategory -Name $Category
|
||||
}
|
||||
$Name | %{
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = 'com/vmware/cis/tagging/tag'
|
||||
Body = @{
|
||||
create_spec = @{
|
||||
category_id = $Category.Id
|
||||
name = $_
|
||||
description = $Description
|
||||
}
|
||||
}
|
||||
}
|
||||
$tagId = (Invoke-vCisRest @sRest).value
|
||||
$out += New-Object PSObject -Property @{
|
||||
Category = $Category.Name
|
||||
Description = $Description
|
||||
Id = $tagId
|
||||
Name = $_
|
||||
Uid = "$($global:defaultviserver.Id)Tag=$($tagId)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
$out | Select-Object Category,Description,Id,Name,Uid,Client
|
||||
}
|
||||
}
|
||||
|
||||
function New-rCisTagCategory{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1)]
|
||||
[String[]]$Name,
|
||||
[Parameter(Position = 2)]
|
||||
[ValidateSet('Single','Multiple')]
|
||||
[string]$Cardinality = 'Single',
|
||||
[Parameter(Position = 3)]
|
||||
[string]$Description,
|
||||
[Parameter(Position = 4)]
|
||||
[string[]]$EntityType
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
$out = @()
|
||||
$Name | %{
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = 'com/vmware/cis/tagging/category'
|
||||
Body = @{
|
||||
create_spec = @{
|
||||
cardinality = $Cardinality.ToUpper()
|
||||
associable_types = @($EntityType)
|
||||
name = $_
|
||||
description = $Description
|
||||
}
|
||||
}
|
||||
}
|
||||
$categoryId = (Invoke-vCisRest @sRest).value
|
||||
$out += New-Object PSObject -Property @{
|
||||
Description = $Description
|
||||
Cardinality = $Cardinality
|
||||
EntityType = @($EntityType)
|
||||
Id = $categoryId
|
||||
Name = $_
|
||||
Uid = "$($global:defaultviserver.Id)TagCategory=$($categoryId)/"
|
||||
Client = $global:defaultviserver.Client
|
||||
}
|
||||
}
|
||||
$out | Select-Object Description,Cardinality,EntityType,Id,Name,Uid,Client
|
||||
}
|
||||
}
|
||||
|
||||
function New-rCisTagAssignment{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1)]
|
||||
[String[]]$Tag,
|
||||
[Parameter(Mandatory=$true,ValueFromPipeline = $true, Position = 2)]
|
||||
[PSObject[]]$Entity
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
$tagIds = @((Get-rCisTag -Name $Tag).Id)
|
||||
$Entity = foreach($ent in $Entity){
|
||||
if($ent -is [string]){
|
||||
$ent = Get-Inventory -Name $ent -ErrorAction SilentlyContinue
|
||||
}
|
||||
$entMoRef = New-Object PSObject -Property @{
|
||||
type = $ent.ExtensionData.MoRef.Type
|
||||
id = $ent.ExtensionData.MoRef.Value
|
||||
}
|
||||
foreach($tagId in $tagIds){
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = "com/vmware/cis/tagging/tag-association/id:$($tagId)?~action=attach"
|
||||
Body = @{
|
||||
object_id = $entMoRef
|
||||
}
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# foreach($ent in
|
||||
# if($Tag.Count -eq 1)
|
||||
# {
|
||||
# $tagId = (Get-rCisTag -Name $Tag).Id
|
||||
# }
|
||||
# elseif($Tag.Count -gt 1)
|
||||
# {
|
||||
# $tagIds = (Get-rCisTag -Name $Tag).Id
|
||||
# }
|
||||
# $Entity = foreach($ent in $Entity){
|
||||
# if($ent -is [string]){
|
||||
# Get-Inventory -Name $ent -ErrorAction SilentlyContinue
|
||||
# }
|
||||
# else{$ent}
|
||||
# }
|
||||
#
|
||||
# if($Entity.Count -eq 1)
|
||||
# {
|
||||
# $entMoRef = New-Object PSObject -Property @{
|
||||
# type = $Entity[0].ExtensionData.MoRef.Type
|
||||
# id = $Entity[0].ExtensionData.MoRef.Value
|
||||
# }
|
||||
# if($tag.Count -eq 1){
|
||||
# $sRest = @{
|
||||
# Method = 'Post'
|
||||
# Request = "com/vmware/cis/tagging/tag-association/id:$($tagId)?~action=attach"
|
||||
# Body = @{
|
||||
# object_id = $entMoRef
|
||||
# }
|
||||
# }
|
||||
# Invoke-vCisRest @sRest
|
||||
# }
|
||||
# elseif($Tag.Count -gt 1){
|
||||
# $sRest = @{
|
||||
# Method = 'Post'
|
||||
# Request = 'com/vmware/cis/tagging/tagassociation?~action=attach-multiple-tags-to-object'
|
||||
# Body = @{
|
||||
# object_id = $entMoRef
|
||||
# tag_ids = @($tagIds)
|
||||
# }
|
||||
# }
|
||||
# Invoke-vCisRest @sRest
|
||||
# }
|
||||
# }
|
||||
# elseif($Entity.Count -gt 1)
|
||||
# {
|
||||
# $entMorefs = $Entity | %{
|
||||
# New-Object PSObject -Property @{
|
||||
# type = $_.ExtensionData.MoRef.Type
|
||||
# id = $_.ExtensionData.MoRef.Value
|
||||
# }
|
||||
# }
|
||||
# if($tag.Count -eq 1){
|
||||
# $sRest = @{
|
||||
# Method = 'Post'
|
||||
# Request = 'com/vmware/cis/tagging/tagassociation/id:$($tagId)?~action=attach-tag-to-multiple-objects'
|
||||
# Body = @{
|
||||
# objects_ids = @($entMoRefs)
|
||||
# tag_id = $tagId
|
||||
# }
|
||||
# }
|
||||
# Invoke-vCisRest @sRest
|
||||
# }
|
||||
# elseif($Tag.Count -gt 1){
|
||||
# $tagIds | %{
|
||||
# $sRest = @{
|
||||
# Method = 'Post'
|
||||
# Request = 'com/vmware/cis/tagging/tagassociation/id:$($tagId)?~action=attach-tag-to-multiple-objects'
|
||||
# Body = @{
|
||||
# objects_ids = @($entMoRefs)
|
||||
# tag_id = $_
|
||||
# }
|
||||
# }
|
||||
# Invoke-vCisRest @sRest
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
}
|
||||
|
||||
function Remove-rCisTag{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High', DefaultParameterSetName='Name')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1, ValueFromPipeline = $true,ParameterSetName='Name')]
|
||||
[PSObject[]]$Tag,
|
||||
[Parameter(Mandatory=$true, Position = 1, ValueFromPipelineByPropertyName = $true,ParameterSetName='Id')]
|
||||
[String[]]$Id
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
if($PSCmdlet.ParameterSetName -eq 'Name'){
|
||||
foreach($tagObj in $Tag){
|
||||
if($tagObj -is [string]){
|
||||
$tagObj = Get-rCisTag -Name $tagObj
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Delete'
|
||||
Request = "com/vmware/cis/tagging/tag/id:$($tagObj.Id)"
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
else{
|
||||
foreach($tagId in $Id){
|
||||
$sRest = @{
|
||||
Method = 'Delete'
|
||||
Request = "com/vmware/cis/tagging/tag/id:$($tagId)"
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Remove-rCisTagCategory{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High', DefaultParameterSetName='Name')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true,Position = 1, ValueFromPipeline = $true,ParameterSetName='Name')]
|
||||
[PSObject[]]$Category,
|
||||
[Parameter(Mandatory=$true,Position = 1, ValueFromPipelineByPropertyName = $true,ParameterSetName='Id')]
|
||||
[String[]]$Id
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
if($PSCmdlet.ParameterSetName -eq 'Name'){
|
||||
foreach($catObj in $Category){
|
||||
if($catObj -is [string]){
|
||||
$catObj = Get-rCisTagCategory -Name $catObj
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Delete'
|
||||
Request = "com/vmware/cis/tagging/category/id:$($catObj.Id)"
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
else{
|
||||
foreach($catId in $Id){
|
||||
$sRest = @{
|
||||
Method = 'Delete'
|
||||
Request = "com/vmware/cis/tagging/category/id:$($catId)"
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Remove-rCisTagAssignment{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High',DefaultParameterSetName='Assignment')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1, ValueFromPipeline = $true,ParameterSetName='Assignment')]
|
||||
[PSObject[]]$TagAssignment,
|
||||
[Parameter(Mandatory=$true,Position = 1, ValueFromPipeline = $true,ParameterSetName='Name')]
|
||||
[string[]]$Tag,
|
||||
[Parameter(Position = 2, ParameterSetName='Name')]
|
||||
[string[]]$Category,
|
||||
[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName = $true,ParameterSetName='Id')]
|
||||
[string[]]$TagId,
|
||||
[Parameter(ParameterSetName='Name')]
|
||||
[Parameter(ParameterSetName='Id')]
|
||||
[PSObject[]]$Entity
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
|
||||
switch ($PSCmdlet.ParameterSetName){
|
||||
'Name' {
|
||||
$TagAssignment = Get-rCisTagAssignment -Entity $Entity -Tag $Tag -Category $Category
|
||||
}
|
||||
'Id' {
|
||||
$tags = Get-rCisTag -Id $TagId
|
||||
$TagAssignment = Get-rCisTagAssignment -Tag $tags.Name -Entity $Entity
|
||||
}
|
||||
}
|
||||
if($TagAssignment){
|
||||
$entMoRefs = @(Get-Inventory -Name $TagAssignment.Entity -ErrorAction SilentlyContinue | %{
|
||||
New-Object PSObject -Property @{
|
||||
type = $_.ExtensionData.MoRef.Type
|
||||
id = $_.ExtensionData.MoRef.Value
|
||||
}
|
||||
})
|
||||
$tagIds = @((Get-rCisTag -Name $TagAssignment.Tag).Id)
|
||||
}
|
||||
|
||||
foreach($entMoRef in $entMoRefs){
|
||||
foreach($tId in $tagIds){
|
||||
$sRest = @{
|
||||
Method = 'Post'
|
||||
Request = "com/vmware/cis/tagging/tag-association/id:$($tId)?~action=detach"
|
||||
Body = @{
|
||||
object_id = $entMoRef
|
||||
}
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Set-rCisTag{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1, ValueFromPipeline = $true)]
|
||||
[PSObject[]]$Tag,
|
||||
[Parameter(Position = 2)]
|
||||
[string]$Name,
|
||||
[Parameter(Position = 3)]
|
||||
[string]$Description
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
foreach($tagObj in $Tag){
|
||||
if($tagObj -is [string]){
|
||||
$tagObj = Get-rCisTag -Name $tagObj
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Patch'
|
||||
Request = "com/vmware/cis/tagging/tag/id:$($tagObj.Id)"
|
||||
Body = @{
|
||||
update_spec = @{
|
||||
name = $Name
|
||||
description = $Description
|
||||
}
|
||||
}
|
||||
}
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Set-rCisTagCategory{
|
||||
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'High')]
|
||||
param (
|
||||
[Parameter(Mandatory=$true, Position = 1, ValueFromPipeline = $true)]
|
||||
[PSObject[]]$Category,
|
||||
[Parameter(Position = 2)]
|
||||
[string]$Name,
|
||||
[Parameter(Position = 3)]
|
||||
[ValidateSet('Single','Multiple')]
|
||||
[string]$Cardinality, # Only SINGLE to MULTIPLE
|
||||
# [string[]]$AddEntityType, # Does not work
|
||||
[string]$Description
|
||||
)
|
||||
|
||||
Process
|
||||
{
|
||||
foreach($catObj in $Category){
|
||||
if($catObj -is [string]){
|
||||
$catObj = Get-rCisTagCategory -Name $catObj
|
||||
}
|
||||
$sRest = @{
|
||||
Method = 'Patch'
|
||||
Request = "com/vmware/cis/tagging/category/id:$($catObj.Id)"
|
||||
Body = @{
|
||||
update_spec = @{
|
||||
}
|
||||
}
|
||||
}
|
||||
if($Name){
|
||||
$sRest.Body.update_spec.Add('name',$Name)
|
||||
}
|
||||
if($Description){
|
||||
$sRest.Body.update_spec.Add('description',$Description)
|
||||
}
|
||||
if($Cardinality -and $catObj.Cardinality -eq 'SINGLE'){
|
||||
$sRest.Body.update_spec.Add('cardinality',$Cardinality.ToUpper())
|
||||
}
|
||||
if($Name -or $Description -or $Cardinality){
|
||||
Invoke-vCisRest @sRest
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user