Add module rCisTag
Module rCisTag provides CRUD functions for Tags, Tag Categories and Tag Assignments. The functions use the Cis REST API functions. This is a beta release (0.9.0), feedback welcome.
This commit is contained in:
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