-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathViewImporter.ps1
More file actions
202 lines (174 loc) · 12.6 KB
/
ViewImporter.ps1
File metadata and controls
202 lines (174 loc) · 12.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
<#------------- FUNCTIONS -------------#>
Function Set-SwisConnection {
Param(
[Parameter(Mandatory=$true, HelpMessage = "What SolarWinds server are you connecting to (Hostname or IP)?" ) ] [string] $solarWindsServer,
[Parameter(Mandatory=$true, HelpMessage = "Do you want to use the credentials from PowerShell [Trusted], or a new login [Explicit]?" ) ] [ ValidateSet( 'Trusted', 'Explicit' ) ] [ string ] $connectionType,
[Parameter(HelpMessage = "Which credentials should we use for an explicit logon type" ) ] $creds
)
IF ( $connectionType -eq 'Trusted' ) {
$swis = Connect-Swis -Trusted -Hostname $solarWindsServer
} ELSEIF(!$creds) {
$creds = Get-Credential -Message "Please provide a Domain or Local Login for SolarWinds"
$swis = Connect-Swis -Credential $creds -Hostname $solarWindsServer
} ELSE {
$swis = Connect-Swis -Credential $creds -Hostname $solarWindsServer
}
RETURN $swis
}
<#------------- ACTUAL SCRIPT -------------#>
clear-host
$now = Get-Date -Format "yyyyMMdd_HHmm"
$script = $MyInvocation.MyCommand
if($script.path){ $dir = Split-Path $script.path }
else { $dir = [Environment]::GetFolderPath("Desktop") }
$Logfile = "$dir\$($script.name)_$now.log"
Start-Transcript -Path $Logfile -Append -IncludeInvocationHeader
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
while(!$swistest) {
$hostname = Read-Host -Prompt "What server should we connect to?"
$connectionType = Read-Host -Prompt "Should we use the current powershell credentials [Trusted], or specify credentials [Explicit]?"
$swis = Set-SwisConnection $hostname $connectionType
$swistest = get-swisdata $swis "SELECT TOP 1 servername FROM Orion.Websites"
}
$swistest = $null
"Connected to $hostname Successfully using $connectiontype credentials"
$quit = $null
while ($quit -ne "Quit" ) {
"`nPlease provide the folder to import"
$quit = Read-Host 'Press Enter to select file to import, or type [Quit] to exit'
switch -regex ($quit) {
"quit" { "`n`nQuitting"; $quit="Quit" ; break}
default {
$inputfolder = $null
$inputfolder = New-Object -Typename System.Windows.Forms.FolderBrowserDialog
$inputfolder.ShowDialog()
$inputfolder = $inputfolder.selectedpath
"$inputfolder selected..."
$isView = test-path ("$inputfolder\Viewdata.xml")
$importedViews = @()
if($isview -eq $false) {
$folders = Get-ChildItem -Path $inputfolder -directory
} else {
$folders = "\"
}
foreach($folder in $folders) {
$isView = test-path ("$inputfolder\$($folder.name)\Viewdata.xml")
if ($isView -eq $false) {
" Folder contains invalid data, missing $inputfolder\$($folder.name)\ViewData.xml"
} else {
$viewdata = Import-Clixml -path ("$inputfolder\$($folder.name)\ViewData.xml")
$resources = Get-ChildItem -Path "$inputfolder\$($folder.name)" | Where-Object {$_.name -like "*.xml" -and $_.name -notlike "viewdata.xml"}
"`nThis folder contains the view $($viewdata.Viewgroupname) : $($viewdata.viewtitle) `nand the following resources`n"
$resources.name
if($viewData.viewgroupname -eq "NoViewGroup") { $viewData.viewgroupname = $null;}
$importedresources = @()
foreach ($resource in $resources) {
$resourceproperties = Import-Clixml ("$inputfolder\$($folder.name)\$($resource.name)")
$Importedresource = New-Object -TypeName PSObject
Add-Member -InputObject $Importedresource -MemberType 'NoteProperty' -Name 'Name' -value $resource.name
Add-Member -InputObject $Importedresource -MemberType 'NoteProperty' -Name 'resourceproperties' -value $resourceproperties
$importedresources += $importedResource
}
$ImportedView = New-Object -TypeName PSObject
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'viewgroupname' -value $viewdata.viewgroupname
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'ViewKey' -value $viewdata.ViewKey
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'ViewTitle' -value $viewdata.ViewTitle
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'ViewType' -value $viewdata.ViewType
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'ViewGroupPosition' -value $viewdata.ViewGroupPosition
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'ViewIcon' -value $viewdata.ViewIcon
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Columns' -value $viewdata.Columns
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column1Width' -value $viewdata.Column1Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column2Width' -value $viewdata.Column2Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column3Width' -value $viewdata.Column3Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column4Width' -value $viewdata.Column4Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column5Width' -value $viewdata.Column5Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Column6Width' -value $viewdata.Column6Width
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'System' -value $viewdata.System
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Customizable' -value $viewdata.Customizable
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'NOCView' -value $viewdata.NOCView
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'NOCViewRotationInterval' -value $viewdata.NOCViewRotationInterval
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'condition' -value $viewdata.condition
Add-Member -InputObject $ImportedView -MemberType 'NoteProperty' -Name 'Resources' -value $importedresources
$importedViews += $ImportedView
}
}
foreach($view in $importedViews) {
" Checking on $($view.viewgroupname) : $($view.viewtitle)"
if($view.viewgroupname -eq $null) {
$existingview = Get-SwisData $swis "select top 1 viewid, uri from orion.views v where v.viewtitle = '$($view.viewtitle)' and (viewgroupname is null or viewgroupname = '')"
} else {
$existingview = Get-SwisData $swis "select top 1 viewid, uri from orion.views v where v.viewtitle = '$($view.viewtitle)' and v.viewgroupname = '$($view.viewgroupname)'"
}
$viewgroup = Get-SwisData $swis "select distinct viewgroup from orion.views v where v.viewgroupname = '$($view.viewgroupname)'"
if($viewgroup -notmatch "\d+") {$viewgroup = $null}
if($view.viewgroupname -ne $null -and $viewgroup -eq $null){
#generate the next available viewgroup number
$viewgroup = get-swisdata $swis "select min(viewgroup+1) as Nextgroup from orion.views where viewgroup is not null and viewgroup+1 not in (select distinct viewgroup from orion.views where viewgroup is not null) "
}
if(!$existingview) {
" Creating $($view.Viewgroupname) : $($view.ViewTitle)"
$viewprops = @{
"ViewGroup" = $viewgroup
"ViewGroupName" = $($view.ViewGroupName)
"Viewkey" = $($view.ViewKey)
"ViewTitle" = $($view.ViewTitle)
"ViewType" = $($view.ViewType)
"ViewGroupPosition" = $($view.ViewGroupPosition)
"ViewIcon" = $($view.ViewIcon)
"Columns" = $($view.Columns)
"Column1Width" = $($view.Column1Width)
"Column2Width" = $($view.Column2Width)
"Column3Width" = $($view.Column3Width)
"Column4Width" = $($view.Column4Width)
"Column5Width" = $($view.Column5Width)
"Column6Width" = $($view.Column6Width)
"System" = $($view.System)
"Customizable" = $($view.Customizable)
"NOCView" = $($view.NOCView)
"NOCViewRotationInterval" = $($view.NOCViewRotationInterval)
}
$newview = New-SwisObject $swis -EntityType "Orion.Views" -properties $viewprops
$viewid = Get-SwisData $swis "select viewid from orion.views where uri = '$newview'"
"New view created - $viewid"
}
if($existingview) {
$viewid = $existingview.viewid
$menu = $null
while($menu -eq $null) {
$menu = Read-Host " View already exists as ViewID $viewid, should we [Add] the resouces to the view, [Replace] the contents of the view, or [Quit]?"
switch -regex ($menu) {
"quit" { "`n`nQuitting"; $menu="Quit" ; break}
"replace" {
$oldresources = get-swisdata $swis "SELECT uri FROM Orion.Resources where viewid = $($existingview.viewid)"
foreach ($r in $oldresources) {
" Removing old resources from view $viewid"
Remove-SwisObject $swis -Uri $r | Out-Null
}
}
"add" { break }
default {$menu = $null; "Invalid response, please re-enter"; break}
}
}
}
if($menu -ne "quit") {
foreach($r in $View.resources) {
" Adding resource $($r.Name)"
$resourceResults = Invoke-SwisVerb $swis Orion.Views AddResourceToView @($viewid, $r.ResourceProperties)
}
"`nCleaning Up"
$cleanup = Invoke-SwisVerb $swis 'Orion.Reporting' 'ExecuteSQL' @"
update resourceproperties set propertyvalue = replace(replace(propertyvalue, 'linebreak', char(10)),'ampersand',char(38)) where propertyvalue like '%linebreak%' or propertyvalue like '%ampersand%'
update resources set resourcename = replace(replace(ResourceName,'ampersand',char(38)),'doublequotes',char(34)), resourcetitle = replace(replace(ResourceTitle,'ampersand',char(38)),'doublequotes',char(34)), resourcesubtitle = replace(replace(resourcesubtitle,'ampersand',char(38)),'doublequotes',char(34)) where resourcename like '%ampersand%' or resourcetitle like '%ampersand%' or resourcesubtitle like '%ampersand%' or resourcename like '%doublequotes%' or resourcetitle like '%doublequotes%' or resourcesubtitle like '%doublequotes%'
"@
if($ImportedView.condition) {
$sqlcondition = Invoke-SwisVerb $swis 'Orion.Reporting' 'ExecuteSQL' "SELECT condition FROM [dbo].[ViewConditions] where viewid = $viewid"
if(!$sqlcondition.ChildNodes.documentelement.executesqlresults) {Invoke-SwisVerb $swis 'Orion.Reporting' 'ExecuteSQL' "insert into [dbo].[ViewConditions] values ( $viewid,'$($ImportedView.condition)' )"}
else {Invoke-SwisVerb $swis 'Orion.Reporting' 'ExecuteSQL' "update [ViewConditions] set condition = '$($ImportedView.condition)' where viewid = '$viewid'" | out-null}
}
}
}
}
}
}
"Finished"
Stop-Transcript