From 0119bfdd0110a8c9434923f8298594804be19098 Mon Sep 17 00:00:00 2001 From: clvieira_microsoft Date: Mon, 2 Sep 2024 15:11:20 -0300 Subject: [PATCH] ARI v3.5.0 --- Automation/README.md | 43 +- Automation/images/ARIAUT_ModuleImport.png | Bin 8580 -> 0 bytes Automation/images/ARIAUT_RunBookScript.png | Bin 41454 -> 24090 bytes Automation/images/ARIAUT_StgAcc.png | Bin 30176 -> 0 bytes Automation/images/AUTv3Modules.png | Bin 51143 -> 0 bytes Automation/images/AUTv3Runbook.png | Bin 12343 -> 0 bytes Automation/images/AUTv3STGPerm.png | Bin 23062 -> 0 bytes Automation/images/AUTv3StorageName.png | Bin 50077 -> 0 bytes Automation/images/AUTv3Tenant.png | Bin 26534 -> 0 bytes Automation/images/AUTv4Modules.png | Bin 0 -> 47152 bytes Automation/images/AUTv4Runbook.png | Bin 0 -> 15185 bytes Automation/images/AUTv4STGPerm.png | Bin 0 -> 22107 bytes Automation/images/AUTv4Tenant.png | Bin 0 -> 21605 bytes AzureResourceInventory.ps1 | 1682 ----- AzureResourceInventory.psd1 | 181 + AzureResourceInventory.psm1 | 363 + Extras/Advisory.ps1 | 77 - Extras/Charts.ps1 | 805 --- Extras/DrawIODiagram.ps1 | 5945 ----------------- Extras/Policy.ps1 | 90 - Extras/QuotaUsage.ps1 | 58 - Extras/SecurityCenter.ps1 | 71 - Extras/Subscriptions.ps1 | 58 - Modules/ARIResourceJobs.psm1 | 224 + Modules/ARIResourcesReport.psm1 | 72 + Modules/Core/ARIExtraJobs.psm1 | 314 + Modules/Core/ARIGetSubs.psm1 | 17 + Modules/Core/ARIInventoryLoop.psm1 | 97 + Modules/Core/ARILoginSession.psm1 | 123 + Modules/Core/ARITestPS.psm1 | 51 + Modules/Diagram/ARIDiagramNetwork.psm1 | 3070 +++++++++ Modules/Diagram/ARIDiagramOrganization.psm1 | 994 +++ Modules/Diagram/ARIDiagramSubscription.psm1 | 1856 +++++ Modules/Diagram/ARIDrawIODiagram.psm1 | 79 + {Extras => Modules/Diagram}/VisioDiagram.ps1 | 0 Modules/Extras/ARIReportCharts.psm1 | 989 +++ .../Extras}/Module-template.tpl | 0 {Extras => Modules/Extras}/Support.json | 0 Modules/Inventory/ARIAPIInv.psm1 | 154 + Modules/Inventory/ARIAdvisoryInv.psm1 | 71 + Modules/Inventory/ARIMGMTGroups.psm1 | 57 + Modules/Inventory/ARIPolicyInv.psm1 | 104 + Modules/Inventory/ARIQuotaInv.psm1 | 103 + Modules/Inventory/ARIResourceDataPull.psm1 | 161 + Modules/Inventory/ARIResourceReport.psm1 | 157 + Modules/Inventory/ARISecCenterInv.psm1 | 68 + Modules/Inventory/ARISubInv.psm1 | 55 + Modules/Scripts/APIs/AdvisorScore.ps1 | 106 + Modules/Scripts/APIs/ManagedIds.ps1 | 91 + Modules/Scripts/APIs/Outages.ps1 | 125 + Modules/Scripts/APIs/ReservationRecom.ps1 | 101 + Modules/Scripts/APIs/SupportTickets.ps1 | 113 + Modules/{ => Scripts}/Analytics/AzureAI.ps1 | 0 .../Analytics/ComputerVision.ps1 | 0 .../{ => Scripts}/Analytics/ContentMod.ps1 | 0 .../{ => Scripts}/Analytics/ContentSafety.ps1 | 0 .../{ => Scripts}/Analytics/CustomVision.ps1 | 0 .../{ => Scripts}/Analytics/Databricks.ps1 | 0 .../Analytics/DocIntelligence.ps1 | 0 Modules/{ => Scripts}/Analytics/EvtHub.ps1 | 0 Modules/{ => Scripts}/Analytics/FaceAPI.ps1 | 0 .../Analytics/HealthInsights.ps1 | 0 .../Analytics/ImmersiveReader.ps1 | 0 Modules/{ => Scripts}/Analytics/Language.ps1 | 0 .../Analytics/MachineLearning.ps1 | 0 .../Analytics/SearchServices.ps1 | 0 .../{ => Scripts}/Analytics/SpeechService.ps1 | 0 .../Analytics/Streamanalytics.ps1 | 0 Modules/{ => Scripts}/Analytics/Synapse.ps1 | 0 .../{ => Scripts}/Analytics/Translator.ps1 | 0 Modules/{ => Scripts}/Analytics/WrkSpace.ps1 | 0 .../{ => Scripts}/Compute/APPSERVICEPLAN.ps1 | 0 Modules/{ => Scripts}/Compute/APPSERVICES.ps1 | 0 Modules/{ => Scripts}/Compute/ARCServers.ps1 | 17 +- Modules/{ => Scripts}/Compute/ARO.ps1 | 0 Modules/{ => Scripts}/Compute/AVD.ps1 | 0 .../{ => Scripts}/Compute/CloudServices.ps1 | 2 +- Modules/{ => Scripts}/Compute/VM.ps1 | 4 +- Modules/{ => Scripts}/Compute/VMWare.ps1 | 0 Modules/{ => Scripts}/Containers/AKS.ps1 | 2 + .../{ => Scripts}/Containers/CONTAINER.ps1 | 0 .../{ => Scripts}/Containers/REGISTRIES.ps1 | 0 Modules/{ => Scripts}/Containers/VMSS.ps1 | 0 Modules/{ => Scripts}/Data/CosmosDB.ps1 | 0 Modules/{ => Scripts}/Data/MariaDB.ps1 | 0 Modules/{ => Scripts}/Data/MySQL.ps1 | 0 Modules/{ => Scripts}/Data/MySQLflexible.ps1 | 0 Modules/{ => Scripts}/Data/POSTGRE.ps1 | 0 .../{ => Scripts}/Data/POSTGREFlexible.ps1 | 0 Modules/{ => Scripts}/Data/Purview.ps1 | 0 Modules/{ => Scripts}/Data/RedisCache.ps1 | 0 Modules/{ => Scripts}/Data/SQLDB.ps1 | 0 Modules/{ => Scripts}/Data/SQLMI.ps1 | 232 +- Modules/{ => Scripts}/Data/SQLMIDB.ps1 | 194 +- Modules/{ => Scripts}/Data/SQLPOOL.ps1 | 0 Modules/{ => Scripts}/Data/SQLSERVER.ps1 | 0 Modules/{ => Scripts}/Data/SQLVM.ps1 | 0 .../{ => Scripts}/Infrastructure/AppGW.ps1 | 0 .../Infrastructure/AutomationAcc.ps1 | 0 .../{ => Scripts}/Infrastructure/AvSet.ps1 | 0 .../{ => Scripts}/Infrastructure/BASTION.ps1 | 0 .../Infrastructure/Frontdoor.ps1 | 0 .../Infrastructure/RecoveryVault.ps1 | 0 .../{ => Scripts}/Infrastructure/Vault.ps1 | 0 Modules/{ => Scripts}/Integration/APIM.ps1 | 0 .../{ => Scripts}/Integration/AppInsights.ps1 | 0 Modules/{ => Scripts}/Integration/Backup.ps1 | 0 Modules/{ => Scripts}/Integration/IOTHubs.ps1 | 0 .../{ => Scripts}/Integration/ServiceBUS.ps1 | 0 .../Networking/AzureFirewall.ps1 | 0 .../{ => Scripts}/Networking/Connections.ps1 | 0 .../{ => Scripts}/Networking/ExpressRoute.ps1 | 0 .../{ => Scripts}/Networking/LoadBalancer.ps1 | 30 +- .../{ => Scripts}/Networking/NATGAteway.ps1 | 0 .../Networking/NetworkInterface.ps1 | 0 .../Networking/NetworkSecurityGroup.ps1 | 24 +- .../{ => Scripts}/Networking/PrivateDNS.ps1 | 0 .../Networking/PrivateEndpoint.ps1 | 0 .../{ => Scripts}/Networking/PublicDNS.ps1 | 0 Modules/{ => Scripts}/Networking/PublicIP.ps1 | 0 .../{ => Scripts}/Networking/ROUTETABLE.ps1 | 0 .../Networking/TrafficManager.ps1 | 0 Modules/{ => Scripts}/Networking/VNETGTW.ps1 | 0 .../Networking/VirtualNetwork.ps1 | 4 +- .../{ => Scripts}/Networking/VirtualWAN.ps1 | 0 .../{ => Scripts}/Networking/vNETPeering.ps1 | 0 .../Storage/DataExplorerCluster.ps1 | 0 Modules/{ => Scripts}/Storage/NetApp.ps1 | 0 Modules/{ => Scripts}/Storage/StorageAcc.ps1 | 0 Modules/{ => Scripts}/Storage/VMDisk.ps1 | 0 README.md | 201 +- images/ARIv3-Overview.png | Bin 387070 -> 0 bytes images/ARIv35-Overview.png | Bin 0 -> 363446 bytes images/Execution.png | Bin 42406 -> 0 bytes images/InstallARI.gif | Bin 0 -> 771623 bytes images/RunningARI.gif | Bin 0 -> 28550 bytes 136 files changed, 10269 insertions(+), 9166 deletions(-) delete mode 100644 Automation/images/ARIAUT_ModuleImport.png delete mode 100644 Automation/images/ARIAUT_StgAcc.png delete mode 100644 Automation/images/AUTv3Modules.png delete mode 100644 Automation/images/AUTv3Runbook.png delete mode 100644 Automation/images/AUTv3STGPerm.png delete mode 100644 Automation/images/AUTv3StorageName.png delete mode 100644 Automation/images/AUTv3Tenant.png create mode 100644 Automation/images/AUTv4Modules.png create mode 100644 Automation/images/AUTv4Runbook.png create mode 100644 Automation/images/AUTv4STGPerm.png create mode 100644 Automation/images/AUTv4Tenant.png delete mode 100644 AzureResourceInventory.ps1 create mode 100644 AzureResourceInventory.psd1 create mode 100644 AzureResourceInventory.psm1 delete mode 100644 Extras/Advisory.ps1 delete mode 100644 Extras/Charts.ps1 delete mode 100644 Extras/DrawIODiagram.ps1 delete mode 100644 Extras/Policy.ps1 delete mode 100644 Extras/QuotaUsage.ps1 delete mode 100644 Extras/SecurityCenter.ps1 delete mode 100644 Extras/Subscriptions.ps1 create mode 100644 Modules/ARIResourceJobs.psm1 create mode 100644 Modules/ARIResourcesReport.psm1 create mode 100644 Modules/Core/ARIExtraJobs.psm1 create mode 100644 Modules/Core/ARIGetSubs.psm1 create mode 100644 Modules/Core/ARIInventoryLoop.psm1 create mode 100644 Modules/Core/ARILoginSession.psm1 create mode 100644 Modules/Core/ARITestPS.psm1 create mode 100644 Modules/Diagram/ARIDiagramNetwork.psm1 create mode 100644 Modules/Diagram/ARIDiagramOrganization.psm1 create mode 100644 Modules/Diagram/ARIDiagramSubscription.psm1 create mode 100644 Modules/Diagram/ARIDrawIODiagram.psm1 rename {Extras => Modules/Diagram}/VisioDiagram.ps1 (100%) create mode 100644 Modules/Extras/ARIReportCharts.psm1 rename {Extras => Modules/Extras}/Module-template.tpl (100%) rename {Extras => Modules/Extras}/Support.json (100%) create mode 100644 Modules/Inventory/ARIAPIInv.psm1 create mode 100644 Modules/Inventory/ARIAdvisoryInv.psm1 create mode 100644 Modules/Inventory/ARIMGMTGroups.psm1 create mode 100644 Modules/Inventory/ARIPolicyInv.psm1 create mode 100644 Modules/Inventory/ARIQuotaInv.psm1 create mode 100644 Modules/Inventory/ARIResourceDataPull.psm1 create mode 100644 Modules/Inventory/ARIResourceReport.psm1 create mode 100644 Modules/Inventory/ARISecCenterInv.psm1 create mode 100644 Modules/Inventory/ARISubInv.psm1 create mode 100644 Modules/Scripts/APIs/AdvisorScore.ps1 create mode 100644 Modules/Scripts/APIs/ManagedIds.ps1 create mode 100644 Modules/Scripts/APIs/Outages.ps1 create mode 100644 Modules/Scripts/APIs/ReservationRecom.ps1 create mode 100644 Modules/Scripts/APIs/SupportTickets.ps1 rename Modules/{ => Scripts}/Analytics/AzureAI.ps1 (100%) rename Modules/{ => Scripts}/Analytics/ComputerVision.ps1 (100%) rename Modules/{ => Scripts}/Analytics/ContentMod.ps1 (100%) rename Modules/{ => Scripts}/Analytics/ContentSafety.ps1 (100%) rename Modules/{ => Scripts}/Analytics/CustomVision.ps1 (100%) rename Modules/{ => Scripts}/Analytics/Databricks.ps1 (100%) rename Modules/{ => Scripts}/Analytics/DocIntelligence.ps1 (100%) rename Modules/{ => Scripts}/Analytics/EvtHub.ps1 (100%) rename Modules/{ => Scripts}/Analytics/FaceAPI.ps1 (100%) rename Modules/{ => Scripts}/Analytics/HealthInsights.ps1 (100%) rename Modules/{ => Scripts}/Analytics/ImmersiveReader.ps1 (100%) rename Modules/{ => Scripts}/Analytics/Language.ps1 (100%) rename Modules/{ => Scripts}/Analytics/MachineLearning.ps1 (100%) rename Modules/{ => Scripts}/Analytics/SearchServices.ps1 (100%) rename Modules/{ => Scripts}/Analytics/SpeechService.ps1 (100%) rename Modules/{ => Scripts}/Analytics/Streamanalytics.ps1 (100%) rename Modules/{ => Scripts}/Analytics/Synapse.ps1 (100%) rename Modules/{ => Scripts}/Analytics/Translator.ps1 (100%) rename Modules/{ => Scripts}/Analytics/WrkSpace.ps1 (100%) rename Modules/{ => Scripts}/Compute/APPSERVICEPLAN.ps1 (100%) rename Modules/{ => Scripts}/Compute/APPSERVICES.ps1 (100%) rename Modules/{ => Scripts}/Compute/ARCServers.ps1 (93%) rename Modules/{ => Scripts}/Compute/ARO.ps1 (100%) rename Modules/{ => Scripts}/Compute/AVD.ps1 (100%) rename Modules/{ => Scripts}/Compute/CloudServices.ps1 (99%) rename Modules/{ => Scripts}/Compute/VM.ps1 (99%) rename Modules/{ => Scripts}/Compute/VMWare.ps1 (100%) rename Modules/{ => Scripts}/Containers/AKS.ps1 (99%) rename Modules/{ => Scripts}/Containers/CONTAINER.ps1 (100%) rename Modules/{ => Scripts}/Containers/REGISTRIES.ps1 (100%) rename Modules/{ => Scripts}/Containers/VMSS.ps1 (100%) rename Modules/{ => Scripts}/Data/CosmosDB.ps1 (100%) rename Modules/{ => Scripts}/Data/MariaDB.ps1 (100%) rename Modules/{ => Scripts}/Data/MySQL.ps1 (100%) rename Modules/{ => Scripts}/Data/MySQLflexible.ps1 (100%) rename Modules/{ => Scripts}/Data/POSTGRE.ps1 (100%) rename Modules/{ => Scripts}/Data/POSTGREFlexible.ps1 (100%) rename Modules/{ => Scripts}/Data/Purview.ps1 (100%) rename Modules/{ => Scripts}/Data/RedisCache.ps1 (100%) rename Modules/{ => Scripts}/Data/SQLDB.ps1 (100%) rename Modules/{ => Scripts}/Data/SQLMI.ps1 (97%) rename Modules/{ => Scripts}/Data/SQLMIDB.ps1 (97%) rename Modules/{ => Scripts}/Data/SQLPOOL.ps1 (100%) rename Modules/{ => Scripts}/Data/SQLSERVER.ps1 (100%) rename Modules/{ => Scripts}/Data/SQLVM.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/AppGW.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/AutomationAcc.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/AvSet.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/BASTION.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/Frontdoor.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/RecoveryVault.ps1 (100%) rename Modules/{ => Scripts}/Infrastructure/Vault.ps1 (100%) rename Modules/{ => Scripts}/Integration/APIM.ps1 (100%) rename Modules/{ => Scripts}/Integration/AppInsights.ps1 (100%) rename Modules/{ => Scripts}/Integration/Backup.ps1 (100%) rename Modules/{ => Scripts}/Integration/IOTHubs.ps1 (100%) rename Modules/{ => Scripts}/Integration/ServiceBUS.ps1 (100%) rename Modules/{ => Scripts}/Networking/AzureFirewall.ps1 (100%) rename Modules/{ => Scripts}/Networking/Connections.ps1 (100%) rename Modules/{ => Scripts}/Networking/ExpressRoute.ps1 (100%) rename Modules/{ => Scripts}/Networking/LoadBalancer.ps1 (97%) rename Modules/{ => Scripts}/Networking/NATGAteway.ps1 (100%) rename Modules/{ => Scripts}/Networking/NetworkInterface.ps1 (100%) rename Modules/{ => Scripts}/Networking/NetworkSecurityGroup.ps1 (94%) rename Modules/{ => Scripts}/Networking/PrivateDNS.ps1 (100%) rename Modules/{ => Scripts}/Networking/PrivateEndpoint.ps1 (100%) rename Modules/{ => Scripts}/Networking/PublicDNS.ps1 (100%) rename Modules/{ => Scripts}/Networking/PublicIP.ps1 (100%) rename Modules/{ => Scripts}/Networking/ROUTETABLE.ps1 (100%) rename Modules/{ => Scripts}/Networking/TrafficManager.ps1 (100%) rename Modules/{ => Scripts}/Networking/VNETGTW.ps1 (100%) rename Modules/{ => Scripts}/Networking/VirtualNetwork.ps1 (99%) rename Modules/{ => Scripts}/Networking/VirtualWAN.ps1 (100%) rename Modules/{ => Scripts}/Networking/vNETPeering.ps1 (100%) rename Modules/{ => Scripts}/Storage/DataExplorerCluster.ps1 (100%) rename Modules/{ => Scripts}/Storage/NetApp.ps1 (100%) rename Modules/{ => Scripts}/Storage/StorageAcc.ps1 (100%) rename Modules/{ => Scripts}/Storage/VMDisk.ps1 (100%) delete mode 100644 images/ARIv3-Overview.png create mode 100644 images/ARIv35-Overview.png delete mode 100644 images/Execution.png create mode 100644 images/InstallARI.gif create mode 100644 images/RunningARI.gif diff --git a/Automation/README.md b/Automation/README.md index cf8f0e2..8596a4d 100644 --- a/Automation/README.md +++ b/Automation/README.md @@ -4,7 +4,7 @@
-# Azure Resource Inventory Automation Account v3 +# Azure Resource Inventory Automation Account v4
@@ -52,7 +52,7 @@ Once you have created the Automation Account, Storage Account and Blob Container
-#### This will create an identity in the Azure AD. +#### This will create an identity in the Entra ID. ### Now we are going to use that identity to give the following permissions to the Automation Account: @@ -63,7 +63,7 @@ Once you have created the Automation Account, Storage Account and Blob Container

- +


@@ -77,7 +77,7 @@ Once you have created the Automation Account, Storage Account and Blob Container

- +


@@ -86,11 +86,10 @@ Once you have created the Automation Account, Storage Account and Blob Container ### Now, back in the Automation Account, the following Modules need to be imported with Runtime __7.2__: -#### 1) "ImportExcel" -#### 2) "Az.ResourceGraph" -#### 3) "Az.Storage" -#### 4) "Az.Account" -#### 5) "ThreadJob" +#### 1) "AzureResourceInventory" +#### 2) "ImportExcel" +#### 3) "Az.ResourceGraph" +#### 4) "ThreadJob"
@@ -103,7 +102,7 @@ Once you have created the Automation Account, Storage Account and Blob Container

- +


@@ -118,35 +117,35 @@ Once you have created the Automation Account, Storage Account and Blob Container

- +



-#### Then just copy the script content from __ARI_Automation.ps1__ +#### Then just add the "Invoke-ARI" command line inside the runbook.
-
+The line must contain the following parameters: -

- -

+```` +-TenantID +-SkipDiagram +-Automation +-StorageAccount +-StorageContainer +````
-
- -Remember to change the lines 33 and 36 with your Storage Account and Container name: - -
+The parameter "StorageAccount" is used to inform the Storage Account where the report will be placed and the "StorageContainer" parameter is used to pass the container within that Storage Account where the report will be placed.

- +

diff --git a/Automation/images/ARIAUT_ModuleImport.png b/Automation/images/ARIAUT_ModuleImport.png deleted file mode 100644 index f1e4953da6b167ba94cb1e49bf7fff10eca91a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8580 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 X)$`*()g;896G-o6l%=8XOg{e)be70F diff --git a/Automation/images/ARIAUT_RunBookScript.png b/Automation/images/ARIAUT_RunBookScript.png index 6e082ceebc7d5a6d82ad92be4b15336ee25cd628..9f42b13b8e78d374eebaec396a22cec09deec89b 100644 GIT binary patch literal 24090 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�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

4an+=P@bdn{h( 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 BA|3z$ diff --git a/Automation/images/ARIAUT_StgAcc.png b/Automation/images/ARIAUT_StgAcc.png deleted file mode 100644 index bfaf09acf113e19dc28bd83f5ac1e7836083df6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30176 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 z 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 diff --git a/Automation/images/AUTv3Runbook.png b/Automation/images/AUTv3Runbook.png deleted file mode 100644 index 2058fa4755c7b5cc3fd6ffee909bd8af65a62f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12343 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 F{{_VYUMc_p diff --git a/Automation/images/AUTv4Modules.png b/Automation/images/AUTv4Modules.png new file mode 100644 index 0000000000000000000000000000000000000000..0235d4fc2d3840b8041680c28156fd02948e1d38 GIT binary patch literal 47152 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�X@cLgF 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 literal 0 HcmV?d00001 diff --git a/Automation/images/AUTv4Runbook.png b/Automation/images/AUTv4Runbook.png new file mode 100644 index 0000000000000000000000000000000000000000..549685ea173df19196f82148a1946dc43f83f119 GIT binary patch literal 15185 zcmeIZcT^KmzxNxYiAqsKL?Lx2!?$LBfkx#yhqoOj)O*L&Cf8-kDxnuPQRx6IfW!1twI-WWY6^HRN0-DJGWl%^u;&K;%f@w2Ed zz0l-<@hhg$bi(vsSD(?1@5km$KK)IXe>Ix3(syC8Y&y6hGh>aT|C2>RNzzF$Y>I$N z$>4yHTu&%ogS0%7G{B?2>rmY|1-6QJSwg8mAQk}{tG`FjQC$T#SxTU;be2u{NObm+ zOYQ54xb%|uwfy7NO$simXF#Eo)-E)&qy_1t>8}pR9Hn)mfYvs=Aza_aIf9$gtqZNL zJOflx-**JM&NE&5+Ywbzk)?thiF`DM`Cl zwfT*U9s~;I5R0MSddY>KE~tP*)>k=P`@-*Znw%y&I~-cXHz5407O?(f&iD0)RoMMS z`ySmgUpE+;C=F`g)XM_CQ}P{;6PB)_s1clGI?}8DfcaFBEwf4a&LKNmWMl;s;-s@k z2(oZ9t5X`2k*ThJJO~vx`m|wI3KJSJ%KqNU1Qv2veSJ=Yb5?C30d0vSC)bpE1=#VA z(D~}uqB-ql3ihMxi9Y8+ErCguXQoeMYMm`@T`AwlPUiz~7EC5H)pL#= zXoSjYT+BKnbe zb1Vl9qt2YEHgOfo4kUcU_Lom1%6Wi%OcI~gw z&5ronyS41Ybs&f5&p^%MVzskQSW2+1T8Z{g zR7N*x^p=d5zrLz9ChqZp*>(EEA49DZ&y_>x8A^)?%sB?%%`IH%fcX!3yL;y zl79^XxncX;K*ur^J{?`tEnT!ItzGq#ctWG5O3cRDg^d>uAy&W6i*fSk*RsCZaXudt zQ(C9VtYEy%s2l*fu}r)cId+=c1Qmcwa;Y4W6PwSsS2^l3+3fGG>8a-D%ql|6@pmjPrj-tZGMtiL?6tUOA-s0r^^Uq$?@?vsclz!qy=>++_Bis6!{MAy z6}EK!(Cd^!T8ovymOcFwpBZEb<>K=G^;Mo31lk=gcA}PbZZca2>qW#NbL9hIO_RnxAE_XKMWH+{AmlUkK

6ORQnvSevho_19=7GE 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 literal 0 HcmV?d00001 diff --git a/Automation/images/AUTv4Tenant.png b/Automation/images/AUTv4Tenant.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ef849deec1233434f9b34a6f1b18f975ce5746 GIT binary patch literal 21605 zcmeFYcT|&2+b@cbj};Ibpi~tBMFFKnx(yMfNSDx5Iw2rJCtB?-<;_V-e)AMBxvyB!n~Ax^jn2%K|1; zjuYB*{P{*f*TJSa(dCCj4*LV|y4{!nyXVP_n(n^2fxQd`|ERhUuZX(q?)38Kud2%! zAy~xIo2O3gd=k;WYIvSC#CXd%PKeLn_f~uzs z`TGMt@6uD+2f*GFr&NaGXZz+&$!j(mB&}XQv`uj-+gpkIxf?%o&qJYAkX7~mAMBq# zrGpNDBa%W(qc3MqFdyAON5+-O26(l#ZHF31g#y#`t?0sv4bMX!PAv?; zwN0EpWpoNwrLDuecZvg!DY1mWx2*yg)PiHpH#JDyi3q}S~PTg|#p}8<2?JXW+fl9j# z7>sw*41R?rJmSEf317Ey`|3APw;D#U)4cZ5Yxc_iW0L25i@3v)gV;rH^T`U3rQNyt zcRv&yiw?1>TLbTpgBu)pJ6+u?YEpv@Q!*z&#RM^IV6ko7bRt{97abi0Ba=J|)tmMV zIIoi2?23WAT7hUwJ?Dn5H=xbsRy3?qJ-%+4q2p2X$lIZKQ=2nzGn&3pFxccUroOzP z!E}i78}m)^yAjwVl0J{=FZem@>pgzm9_M8*(w^A1s^6pcJQqm0Ou(%6Jhq?}>9{DinVZg0dbg z=ik@`JE*jreSghT^p9APq{4uvtAF=4*@Jh-ru-WRN{YJjJkzh<@LBrsDTKX5G21*O zNE`X0RdTsMfHbShM0l!d)l0qf(q5pBlvpy2Zr^-0U4f& z?@E0OrW?*-?EkkY^+j_*>y>-WJFVqL#rkOx8IX5lu3Q-NUt_f=YCv#8F$TKcA8O)(AOgZgM z?+i8F6^sS$z2VGheWtO?fJ=4ctuiaSv|`i@152mc;l@|QV`(m zp>#fcf$Oq zw*y031jp;b%AhjW`_lG--&UIs1_h(O5Vv>nS5(?-DlXO2Zst!HPBjS3#jA6UYYQlv z-fI91=a=R&iiwZKgNyd=#KrVV(2cCyf~NQB^7Ub<;`0MV5Zk@7zJ$~P$3ou`Ek>=9 zU9ZRa$)3Rt(w8kMPg7Wq&|;hdqz-so(4lB=a4bn%qeU}en&~EIR<#@^JutSYC1|f@ znv%#=8r`?W(^(;`uYc{mA{FYzZ;PV(HzL$Kt7a9h>2H%zrjwU&cbqde(@MG+O@QiU zk3+z+bCxcAJ&(NEPZHR_U{L_M;lR*=0@T=DbR`bgS#dPpBT8)$R}J zu*q>6LRw7ptk33K+qP6qOE@K%J5OIL(S7nX`89o@Xw^j<0f~7D+_q>Cx;RPc1ta{! z8Hx(?y|I=Shqd2ifNt6;5={zQ?YjrGv8A_#M0as#jt@|HFX8InrLgacuJQY`k3S19 zX5E_965Ox6_Ecx@A7B<9RpO1&9zQ-XSxRiYWIZhKtM=Q&cN1u?x z@@xHhC+$PhMbD>pv>xg-9`+8jEpE_vX_PBXNz2ik;j5$-z1p@ZtkxY5sYq~E{H8gh`e`>9;I)2#dG}c3rUEYK zoAnjRBXZ5*+TmH#Z}2WYQKit3-i+#@*d*$*$hbM)%@D>seg;`>OGTQqN{4{ z-Djk<$}9j-U!pbe!Ep}WlPY%oN}xyk1Hjj$!X((Cqmy$_nML20<2UCBd%iZHhFAU}VP(4nQ91X(m20dVDKz^CrUq0C$X0`S^{V z_(;$sr6|R(%M#-iVWnNAw?uXv>=-fVNjhek`&jN1h<3*!Ua)htJ1whQKr46 zL+NA1hVD3NM=l6`R%>tyx>>O8#%dVnsM1)xxbtEsqSM_B&uz~D744jRi_EZCnmZCp zn<4>OlovG?jUNnXPqMN3t{lVZkrP)86PsY!{Hht&9i8I+e>KHRpi^qtKvXfv0{C@4 zDhV(;^z4lp$K|u<@?={mSDByPdME*RdeM9Ec+e zBMG&3Ss3Ton}@{#!RS(Fi;BGR`AHs@caino29=oK%SKQrIeUhIn2pNl!PIlA!!*3lg=S?zjC?rK zLV0ign)NQ|6cYx$eOj+ELc6;8^k!_&A3z_Ol#`iHPb7G5Mk@KQ9-3|St}qTVY;vz| z=*=}MmWbYSHHlw4Zts-0v;josn9xf%K$sr>BXKD~-YPsQWBa@iX*Kj{jUH~RqZw^3 z0^bbo--TF}0F!fUtP_Cn2@S{%{jV7$$IQS+8RLNF0tk3blr~62l?qe79s6|N7hAaD zPJghkNRTCmH;+_WhE8e$G9R1NiWlVl)#+53m2eU?Y4<-Mu&{8;R*lu`Tl4h*Ns+CZx#msW{zLBiC@+@V(aTVS;YiJxYM`Zv9a8nug^V z^0M)wLw;@-5jv{?&2F-3+UWn)`#hdhR~PmY)DYOTuvD(M+%-bWUS5*-3?s(%ZdFB> zhj#Q=b@7h9j4f&kK`qokT6-v2Hbp_dn&cvDlVViR-2z40pi*;#DU4e$MqPFj(}3}a zma}>QZP2{kEK;E#mg(AnrhtK@Q5yRNSB&QhsG0epX;#{kk&2q=KmpG?`m-s2p|ABc zRoLO)e>&nfTR7vnUjwc}8(~P@PdJ}?JzkCTS&nTZVyvktjVv{DzUwFm`s zKO<{j@)20L){r=g{8mG-v7S$B@aqi#OdzM165atvT)Heo<{xikAoZ;hg z(uJV4VWoKWax^74*6^H!`)okrhqRKchu`7TVfH>O%Uk;NUs_yI9RvYgZjuq%9?0Yf=cByCB z;lqouxXhg>5G7ROn6ZX+t99?tl(N(;^{7t5cKPow=1+4!#>zhE#jwdP>A~shG|bE} zep8C&w$U08`K%|6EuNY6(C1aQ^5?*jyZh%%Sh6-rCXzo`Eg#Yg)?gVodb58t9=t7G}>zK9y(GCImdnf zkIY?x6JyJeBAcKF5y0}3_I-o#%FveiSFDT z%SBi_l#&{+x zY<(7870V^mOcz`pjN5c#MV?68S%`+>RPcf)3ccl<*7z+`GW`^{3##o`0i3AX- z%}mp?!?>3N7u8)EA!GRm(poZ?(*mjeZv}J;;^R*M^yK8^2HbR*=K%pP*)sr~X<%TD zLfzD9_G$v$!rVN`6_3cpvB@~d*@`Z}?dBY0Yc;vARa3q?0Q(tbZqp3sY zyOf7Ni(y004hjso-fO1>(v}XzFhXWEsgqJ=?jiwii!mSrMzmuqM9`@LX6w z@rYSn;vvgD{uWxj0ncyk{4_;ucqd4NX*|6GcQo+{d5qI?%V}E9`{twebZ^m3chDu- zUdX!GZ?U|6;SI0C3a35uOJT*e1hc_nZSRnvGS$biH4R+O>-F2YlaxUxUbB{*gWCt$F|IYEae1~l)|*$0H{nZ% zLQ$(GP%^$Eq9(gE#0D3_2}Ho+_8VQv+q;~chN8fE3+4366>0XG0HZ-Q6}!q5b@<@b zKg^00Szhk5aa1KMC!_>2h_R(soofB%vrDB!n#U%od(U#_?`2wkzNjW7T)c+7D_n^? z*szlEMR#vpKw~~9NhNGA2q0b8(_`O~ajnR#3G0TliV;|k>>Umk+?P!4F54D6?uU?(Spm+8? z3j0$@CJ$z1CD7WD&h!(49MDg={4goc@fsaxGWqs_7osLUR9{mn%e-b_E!z`TB)iP!5N~+b%~> z356~yaz52$gqa7%iR4cBC2Y#xUsR4rNA8!{(lm`hKBD>Y==h=dBaS3~E$?eTs2Tb&SiBFa(pf`d5xavVwxu=$?-D_~Jl|`=HcgTU zah!!uJ3-mY3G@0%c&0j^Fvk(jhQx_$R`-gCi(Zm|&RzWc`LiCfX{7HoAFmH~8T!Sin^&sTQP9O^x4d&s+%1E=k5HMkl$XL~875(XJ&s7OU@-M^ll9 z(qdob+}SnPzeYbZxxVBfwLTPyTkwEeI=yQO-7eIS8h?s1&2C@F zx~5xdBU^V&f0)^;i!LP{F3yOE|8{vA#fu7p52ns zn{IQAJJ1;x_L5g^I+j17f7`8n6X^-HK+oQKAnmB@P&xMW{>G2NtPJbfUKM6`uQ->! zu{=UeZ2rM#{^Z!%Cjq$pJQJ~O<*@>v4?VZ+p*w`9XU@?auv=y!uQe7Pk&{`l6(1MRHaGTv zoBd!;Y6h3^L8ncUbWCG<())(zJL7Hl#on8qRia_E)Pd4Kqpv%+0T%6uD@M@aMY{bV z&zSC=0NEb>p5CFPWU<_Rzg|g|9Z-Wx&1zijYe+%JdbVU-WRmluza~vV*#E~d**WgU zN^D>tWC>9$Dok;H=dBCNjRj&!4$+uLV}>L~^1#*S?KJ3OA&K#P6;-2uZ^EP1=t>u- zBA$IM6Cm4WHXP~w`@IkR;;TDZwh3&xmcJLM;ophGxd;F@FFA236-wJxc<4O$;g=r& z8L@P=%)%+<8NX)Yg^}0`N}0MZ`7ig3U}bEWnoljpdhE&FnL;^!HYpE#i98dQ0(;!>25+_N-2t&oA*yXAZH!uCVbK8_pW$8bU{8J;h?OjeB3?MZ#Cd<|CB#OW9CFTUF99Y%2=ggN4999aU`MEpg7 zPl!z*n3k=}5Y0?*mdG_9Tfc`_<44}|%_0TgUP(V^yZc=8ud;pkT2jVPo)NM!{_rKH z1bokz(S-EB`@q#TFR<4r$LU~$I4lAGY?wXr?FHjhj8`wmr+vwHQ+BJdM#ajg{c}Ik{N(|cRUfDYJLRmU5>;tgJN+HWa5)z@M@+ti(MYMEl{K9;8 z-ZzErY1UV-v0ULe(qhymT}sw12qdGtAT_XGw=3W}V(ovYB}~vErLePCEPXj^i4E9v zg_CXWrJ^+b`vtC9>!ayl(yp4syKd*I7%*J@HGDU`=awav9onG~aM=m;Vh260nxWXb zSt;|14?Yx|udmbA_LcScckpPhI0F!5W@Pg0#{`h!*Ddc>jhdjc*17O@-0kO)NYTSQ ze~-iqi6rzF@4ddt!_zW)r)d7b>#}*`g!ENtCD*uYIj*YB^LrJZpWhj0Q=Qz2G5Ggu z-b}8?i|2Mhe#U65HWJ`I zUq6{_H~3@Lz7yd#$^HAk@t6OvH_`rcKmGrVb`PJ2j#jC#42}4-q&3G{LwjYITL2kU=<7{x2S%_5tM#0Qe&5;>kfx;g~G>sP(a(^B0S!zuD?a$w9*$$ z-La!l53iiiI{J~Dee399F=#yiP)s;6MJm9A<_8S7w~4sG`~==wYwWS5-W|8V_G9z9 zv!CD1l`H(r75Dc8A}{AUv?#4eqATV;qR<6Td}EX1ec#hosPP5vej(lYG@_%GK)u|3 z&9QhEJXlq?!C9K2v-wXS!%rFhvwHCE$KcR8PzJawuSgE4YJo1& z3vH9gx4D+pC9Nq`$+l>27pmaBHtCrS6gG-ed@sc>Q&L)D?eRQaw;mk5MiSNo35%W$ zMh%a)pAgjZd~ek|SX7sYi`ym(s|F4e}Fve?fnrE-0k}E2h=ROB#D_A z+$`gt_j|j;2IG)PoJ3g{zt|}6b(3Pgz~{YaryNOoy7%T4>bRP$n49yi%$C=~)6Sz- zyWz6%RT+42U}Le`rVZe4lgkgu?U&|f(ttNQi~|qM6+PWLO8m>E2Usw1-RH*1P70`G zabdWzWTeQ(?)QToYTjpDZFl47zxvI8X?<&LrakJt<+ZmM^=g@)LUwO4*RKZQhq^0{ zVWg}$>%2!^Mqm>{XM_vC3x>42=^w|29=$G^n89_NxD-9B$Hny|zv#V{h@z~fTj!`t z44mZ4m*GLh3&a%9jN;I+VP-x35DUSpruzZ?IhIZN_!w)%)y8+N-|zKSOZysO7744= zOBjVjeej|uEX$og1~$|~)Tdmxr6+|QQ0dSy38(~Wo~;X`5mJnq)zlZNJQPnGhL6Qv)2BP5dz9&QswL0xaf16S6U@IF z?)c^jh1!b)8i6S#yp~glux*UOa$*i_zWb`4gI~3~Q37oE_GfjvC+_zsuyF5Jr$XWlXeEok)v-JQVezGm-L&a3LlGN}Iwr^857QWMiI-lzwS;|8==ryd z{0BqM5SiZ-^1NpO%f*dpY)P&h|3PlFm}7X;%%`AadLE0yQQ~$rrx0F=pNhL z``_(P9BkqLLlfSfl7SH$6d6C9A99fo~5b&qyxt^oiw@NlCff-c0 zIx_}#D+{UQFYecNUZnC__yc=rA(9)a^LqS!-`kcMyx_H}{Jgd}eo0w*N8=T)=ACP+ z%|8-_w-wM`jEqdKK_V%CHvC8_E^UfD)v_Ux;uP=uuU6u@t$00PvuO>P<1RzOO}`_# zer)kc{831f_DWXb7s?F z#*dRj92rf!rJQlerh<;ywEP74-Xyh=#$FB_t#^qH<1mk?zM6U{|8xtjK`*In4CdCp zeTiFJ%(lUg0wEPuR6N>Oaf?SH#^9wk*$9LuC3se#V1q08+h*@1_^wt*y7lO?v%jDV z2t$SDl%Xc@XqADr^(PP>&Uq&y$^G2=D<1Ll{>9~chDP0(1Zht{^CQ{d6kJ+No;To- zq*b*65;blBSa}*?(-3bjEO{6V^wd%O;_a6mMP9}f{rcB|rE`?(My)uwJ*3h&d8@3~ zfrm%u`e8|EfNtrG6`%wPzGZgkpR$$XH;!apQ28+83f`1R=OC)2ok->MQSf@N5F+U; zaEbOU1QpFZH@a5!Ei_-q@Ktt{Ezt|*j<)puA}aZ=aa$AP6qYW^)s?8xZ}&`CGp-}u z=0LSxQAdpLN(2PW^X&M|YpyQ!S0(SF{exziE!~>~uA1`at~ZoY{x}~`s{HC3M19$i zpV|Lwx;w4ZOta8CG(V4?^P{s9>(za` zexhN2BiF?aSKE4$ACsSrK$g@_2r(F^)mh;r>!SHhAIttKBAk+A>U4IGtUz&f^jXGC zA>{QOSc$mcPEr~R80RzNoXlTp-9IE0WFlQS{V0WY-v$XVFY0wSMN-o36twQMjEed6_XOS*Q609NwGw-LK-KI1*>HAGAY; zkL?_TyK(&&>CF-84+pFFE(tnMdjM0?&bd#x@*YaO8*-amQCRdSTSF?W4r(c1aiF+n z207#YS+x53#nRVj%Xbe!>hCzl79F>5ZkBL+?($JY$o8LOUYg&93?D6wz0Y@$PJHv^ z~hPWfrtTk;z3ARu)FKV?0EHS7i(?ne$l(bT{$RE0F!>o-KgRHvXl)BvA!Fu;P ze?Mo+;xO!+0Glz`n5>ZxV?qf75-Z!+2p{GT`Ktb^4zL+iT!c6*`L==mpkB~LF(0%3 zox(zz<_y#6UM7wcAE&yIDk@pD!)ZV;%gl;aH!C0HhWBP!v=bk9vIC2AmCM3Xwi^wO zT5@CQ;BSv>C+2~-OL>%Z8onc`4bisYMSvYgqHjc2#lt(!nNW-;VElQ6bzeq)+-Ywh2TM)(~mlxj{Ys;Eg8X3w~Cpt50_Df3ux#b``LK-R)Bsv?jlaCTH&vPeAHS z9cx6aiN)(hPn!Ygm+3%Fr^nNZ3UoGNIoF7F{bSK=+m~*n&+#trVStHXKPkbMGjlr} zW|mT9bluaSvP}lQIx$S|DMiv~p+WPDgN?+4y%&4#+=8c=$9%%k4+&RzEmc^kNJCZP zb+v<1gDV$bPN?@-gda0C(3QH*Y>K5yIqN9PbpnSP)vLW|aBDw_tX-DkU)#F|5HEwA zF?e3g>=7bhmX`}*$1dD8$?-s9chm`>SBa8^(a|ct%%-ZP*C@+qRnjk{t(2nQ(1?tk zE7Z}ti0P+7<(JvdQhYD;`cme#!de-(4iMrIZ<4UvrOeVA=;zDcjH#(!bw45@?0GfD zY@4ca&@27)Edhs%eJAeoz8QbT-G!mLS{hFS>>J|V{)lw3txTNqaRrgH&{u6600lVx z>Q{&Tr9vjwQaV%mvf{1B=3Wm&D9Bd*t#6OTQH4D& zi&%HbO+UGFWjh12ZjW?d&^IAopZTmNBe%y#10LPeqo&;m3HPnNY)DR z+KKnB11h4S2>j-|c44X7k^h^Ny4G)gP-Kpan(1Atd+a(AL~M9&ktLEOZD~kzdc~j;$a1UpY0{~ z{3>28%Q#S|V7#u=^ZqBRFgRz#325yWTVbMmj#0r~2{m&Z@Nb)xGsV8~Lr1w*`+@T> z=c0ug-x~esmMV=-!Q!M}LI_UBlkEFNAyO>G%U5rY6gMb{ZCOXdXrzx#zXX?l3DUN9 zWuOGDk@kw}%NXUE=e%Hpc=-zBqS=zXUq-*mftfnI=G5{}#iogf?BS-prOo~v_pc4k zJJLJby^{X_G0qIyP=`S7DKJn2px3N1YSE?m&YE)8&gX{LnJY|$oj5PKKkth{-SpdC zjH+Y>YiQ(@=)_-mg5e$YRqet00tFy>fKqj(%v+AV$Yxi@#gBK+v7<;*+wA(ov)tAi{al6uIA`adOSrLBC!?X2Llq&%ha93}< zO8uH1;+r%|yqr~ex$Xy$8~Ng6?_5-?_C(5w2!5$58@+3&uQGgYJC;;CD%4KY0)N0K zlw*`TJR=s%^*p_H5+~GW6{(;0SbB}S*T>3|0J^@8n{wOXY@J_EthmTQMEz9`#}6+8 zkPZzH=bmW~G!{cG_|N>6N&I`F=QmAeIH#b@Mo*Nz+Y3dL^xIDdh+aKTq0$1ZuY37i zF?8TP{~UB`aubB+=z|`1)7OfE%UzvB^I7!*3UJ?ewOR;M*roVlMJYf1Dk5bQ+Z!hK zf$0`(G`4{8{NeAzc0Qd@nKLMGEPA%K*MZ(?SX1f`*2F~oOjUsn2j8(`kkYk3l~qs{=qwboOwx1h#o4>IBg+s6Fit_R9~NE z2jVbg|G=BEA*tTYF-Y$`W*+Mb-l{byI&WcK*EHh5W9{toh@<&bCe@6L?Cmk6jfq+C)!dq@EWyl6Ne#U(>;*Yb7r4aS1y0*;oxc5<&U8uCKn z72(@uj}$T{4tGx$3~yWdE+XZfVFV-~!JW6q-I76;SNE++O&91fH{v z4UR+g=+wOV46SCPCGyVfeo+dmsYITXdMEA=+XKy%I><$+|0jUSYAI+av=cOBt)k3UfDld5BX$+fqhNpyfStD_kKpE{;ump;>XRlp zh{;FbKg)U3!0E_8M)uw*=ndy#??SL5_zocf0=pxdnC3cr=nwQ8uv7_6w*niMymcSc zj;*l7)_#xMZIrRCTRv5AaSfzCx`&YR2@63zDB39b-Iz=ES~7cSkE`y;a4c=3cvnml z(rbfVk@nuNd;&z9A#cfsX1k}yyq`6Jb=;7}t?_^gBV1cajO9yQ(9!K+^^4#A1=EF@x%NK4xs$<+0Jo!lu{HZ zpTK+8LEdDAD z`kUHsBiK3{pq&s-g3DXoc`(-;^)&D5JLF$`3lA?g+RD>&7wV$*R}zGX7H@rIYTkXVT^Sl#VF;vVFBKP4|%homg)1~Pnv;41Xyw~@(W*gie z}A18t_q}XCMHq^5)K<7|JkVtJU#nI0S;f{q7ylkErXOb{OrcXCo2Lgh@iSW z$L&x;$%ih}CebQ0bTTUS@@}*z%A(2E=f$#xC8oMyQV?zxwiyI}_Dv?_$9=TU5I$Oh z{?pEuIduf(P@(fYKI|W_*XEVL#ehIv@5mU7KGGi(@z&8lll*7(CqVWHaoa@-okPA- z`nBcfH1R#W6&oI5IzSjKOVyOBx&7`5Vt!8N))01?)TaEE3+qHELhJAONi}97E zzg;J;%dfp3s;UZTBbEC@@&+66?}=qw^^P&*Y*3cam>YP2C+L}yWr$@p0uZ=sM9y;@ z4m`;<)BfFwroF=Qodg=EHEw$`Ax_6MERyql;;G`?@Sk;h8vcH$6jXEbNp;6(A-t(& z4Dg7k+zZULY6C0iMX3#FFv5y>+TBVPgQ^DXX;ypKP*QVn=t)(9V&1VRE;(v7R5#uf zgeSbg5=LYK%4f$j-s-K2%ZSO%Jgp#+=F>MuioWViahGP41b0ohxzsuNFZN4Sy`a;* zV|pWzN6>qIaizCPW7oQe~{)UWrXjR8Yq0NP88&_LY8xRw9A$`mdsDJ_zi?m zZGJu}U`Yxuc@B@Xb^6P^gjIcuS{JuY6)JR7%JjL5wKDqZ{fF#0f&Fu6p1U=%=)*`2 zWW@qmp9fXgNvjm={0h!C&T|H<2*O&x7NeM-YBro%cz|wbM82= zdqQvI4EGJ(Vof@{Hz-*(Xj5=X#?bl5-?P0{sTSMgb+}fw4zl2)!3l0mTVGb*k$WFe ztJ|9`@IK95-M;<3^=Pi*J_u`R|CjMx##$Mc0oU|w4VUq1Rp+&E3fw*|)m|9ILY|J$ zj#p^+3l=~pGv_XITfU&q-H@xIMp+B_z03VG$(wrcprL@rV3&3CK!W&)a8^@VXJz8 zLoI}xZmF4Pn%H1*R;yw?*Mq?mb%a}t=*Xyl48yUs0g+`}zr+LQYA0U&Yl+VFQ~$n4 zB-4p?7vFV|>0IX>m%eIw+xIpz7Iyo`{9HDL`-$)4cM4D6BNm)j9y|HN*}^nYluL5m z(&BPi-1Z5@*d9JA1=D5J{8IJRkH6DiQXnFb`CM=AJw|TD{|L-e@%h7Ro%DS7XXrec z|69D?|5%dGCZPs5{l_=*`rsYzS-wG|Fra^g`1>~BrS&QgkL47^oOUOnmTVL-`bBRh ztuU87_VewP3iiEnaLASxVI?(2ayM3#H;R(5H1t059YBWL=cwTW#PzCzV80sC>d~sq z9{#_gQuuF3HJu4wv}gf&w`H!|MLpQteSGOp*e;*_TLJCuL!E$qOex&1f4CBiwW_=G z`(;JATMXxcWC-K>{wiuRN4GwOTX^eXDt< zc-$)qQ3O?jeztXy+TK`NJPTVsJ)(MPhn5V=O0Jb;oWjYANmRGIu{2qX zhE*XvHWP1YTh1O1%&5+&QZg1;OO1AHg%Uhi3q!DwJ1!-bl&;wRcmBp1w|2Tn1#aMQ^rKugDW31?jRh z)lpTW0t;cMm&c=R9X8}v|1zxK1xlb2xz3bffk+gy_k3JX3cc>u@^GwCYu-mu!(6gk+~qIgG3vTr_&L&bv*gS>e|Q1q+W<94Pb%d;vCf>|*OBqzr}Z ze+~~8ZjIbkF1|7t5pmsqy^uPIW54BBV@tY0$-X)pfbx?8Yx9WxLbhiJu^V1$Yd!b( zXT90b`>nFLV&Uvr(5D$k|141*W4F{sN5ug{F5KbsJ0b+FP_Rf$hH4B|)Y+h9yr#H@ z&4w$;ZcoNp+CW3|{kz=Nkwet|?U70BzSLxN*0>z~Oy_3QUjyXi&j7$_#LO0+{825p zrR>>pR$TvR?3RrE=VB?Ns_qsw12QG4iWxrDg>|{x{O}CV*xjfn_3i3U+?>UiBKb&S zy)={L(ja-uGIdjF+Ky<4xOvDK^*?0!|0Lbo_KL+v=*26 ztUP=X$ei^2I>Gru%JCV& zP4C?csp&V-W>$-8mFwasd*

    hvutYdyNwrpQwrLok+O!{wnloV3hmiaz$9 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 DvN803 literal 0 HcmV?d00001 diff --git a/AzureResourceInventory.ps1 b/AzureResourceInventory.ps1 deleted file mode 100644 index 3c718f5..0000000 --- a/AzureResourceInventory.ps1 +++ /dev/null @@ -1,1682 +0,0 @@ -########################################################################################## -# # -# * Azure Resource Inventory ( ARI ) Report Generator * # -# # -# Version: 3.1.38 # -# # -# Date: 07/15/2024 # -# # -########################################################################################## -<# -.SYNOPSIS - This script creates Excel file to Analyze Azure Resources inside a Tenant - -.DESCRIPTION - Do you want to analyze your Azure Advisories in a table format? Document it in xlsx format. - -.PARAMETER TenantID - Specify the tenant ID you want to create a Resource Inventory. - - >>> IMPORTANT: YOU NEED TO USE THIS PARAMETER FOR TENANTS WITH MULTI-FACTOR AUTHENTICATION. <<< - -.PARAMETER SubscriptionID - Use this parameter to collect a specific Subscription in a Tenant - -.PARAMETER ManagementGroup - Use this parameter to collect a all Subscriptions in a Specific Management Group in a Tenant - -.PARAMETER Lite - Use this parameter to use only the Import-Excel module and don't create the charts (using Excel's API) - -.PARAMETER SecurityCenter - Use this parameter to collect Security Center Advisories - -.PARAMETER SkipAdvisory - Use this parameter to skip the capture of Azure Advisories - -.PARAMETER IncludeTags - Use this parameter to include Tags of every Azure Resources - -.PARAMETER Debug - Execute ASCI in debug mode. - -.EXAMPLE - Default utilization. Read all tenants you have privileges, select a tenant in menu and collect from all subscriptions: - PS C:\> .\AzureResourceInventory.ps1 - - Define the Tenant ID: - PS C:\> .\AzureResourceInventory.ps1 -TenantID - - Define the Tenant ID and for a specific Subscription: - PS C:\>.\AzureResourceInventory.ps1 -TenantID -SubscriptionID - -.NOTES - AUTHORS: Claudio Merola and Renato Gregio | Azure Infrastucture/Automation/Devops/Governance - -.LINK - Copyright (c) 2018 Microsoft Corporation. All rights reserved. - - 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. -#> - -param ($TenantID, - [switch]$SecurityCenter, - $SubscriptionID, - $ManagementGroup, - $Appid, - $Secret, - [string[]]$ResourceGroup, - $TagKey, - $TagValue, - [switch]$SkipAdvisory, - [switch]$SkipPolicy, - [switch]$IncludeTags, - [switch]$QuotaUsage, - [switch]$Online, - [switch]$Diagram, - [switch]$SkipDiagram, - [switch]$Lite, - [switch]$Debug, - [switch]$Help, - [switch]$DeviceLogin, - $AzureEnvironment, - [switch]$DiagramFullEnvironment, - $ReportName = 'AzureResourceInventory', - $ReportDir) - - if ($Debug.IsPresent) {$DebugPreference = 'Continue'} - - if ($Debug.IsPresent) {$ErrorActionPreference = "Continue" }Else {$ErrorActionPreference = "silentlycontinue" } - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Debbuging Mode: On. ErrorActionPreference was set to "Continue", every error will be presented.') - - if ($IncludeTags.IsPresent) { $Global:InTag = $true } else { $Global:InTag = $false } - - if ($Online.IsPresent) { $Global:RunOnline = $true }else { $Global:RunOnline = $false } - if ($Lite.IsPresent) { $Global:RunLite = $true }else { $Global:RunLite = $false } - if ($DiagramFullEnvironment.IsPresent) {$Global:FullEnv = $true}else{$Global:FullEnv = $false} - - $Global:SRuntime = Measure-Command -Expression { - - <######################################################### Help ######################################################################> - - Function usageMode() { - Write-Host "" - Write-Host "Parameters" - Write-Host "" - Write-Host " -TenantID : Specifies the Tenant to be inventoried. " - Write-Host " -SubscriptionID : Specifies Subscription(s) to be inventoried. " - Write-Host " -ResourceGroup : Specifies one (or more) unique Resource Group to be inventoried, This parameter requires the -SubscriptionID to work. " - Write-Host " -TagKey : Specifies the tag key to be inventoried, This parameter requires the -SubscriptionID to work. " - Write-Host " -TagValue : Specifies the tag value be inventoried, This parameter requires the -SubscriptionID to work. " - Write-Host " -SkipAdvisory : Do not collect Azure Advisory. " - Write-Host " -SkipPolicy : Do not collect Azure Policies. " - Write-Host " -SecurityCenter : Include Security Center Data. " - Write-Host " -IncludeTags : Include Resource Tags. " - Write-Host " -Online : Use Online Modules. " - Write-Host " -Debug : Run in a Debug mode. " - Write-Host " -AzureEnvironment : Change the Azure Cloud Environment. " - Write-Host " -ReportName : Change the Default Name of the report. " - Write-Host " -ReportDir : Change the Default Path of the report. " - Write-Host "" - Write-Host "" - Write-Host "" - Write-Host "Usage Mode and Examples: " - Write-Host "For CloudShell:" - Write-Host "e.g. />./AzureResourceInventory.ps1" - Write-Host "" - Write-Host "For PowerShell Desktop:" - Write-Host "" - Write-Host "If you do not specify Resource Inventory will be performed on all subscriptions for the selected tenant. " - Write-Host "e.g. />./AzureResourceInventory.ps1" - Write-Host "" - Write-Host "To perform the inventory in a specific Tenant and subscription use <-TenantID> and <-SubscriptionID> parameter " - Write-Host "e.g. />./AzureResourceInventory.ps1 -TenantID -SubscriptionID " - Write-Host "" - Write-Host "Including Tags:" - Write-Host " By Default Azure Resource inventory do not include Resource Tags." - Write-Host " To include Tags at the inventory use <-IncludeTags> parameter. " - Write-Host "e.g. />./AzureResourceInventory.ps1 -TenantID -IncludeTags" - Write-Host "" - Write-Host "Skipping Azure Advisor:" - Write-Host " By Default Azure Resource inventory collects Azure Advisor Data." - Write-Host " To ignore this use <-SkipAdvisory> parameter. " - Write-Host "e.g. />./AzureResourceInventory.ps1 -TenantID -SubscriptionID -SkipAdvisory" - Write-Host "" - Write-Host "Using the latest modules :" - Write-Host " You can use the latest modules. For this use <-Online> parameter." - Write-Host " It's a pre-requisite to have internet access for ARI GitHub repo" - Write-Host "e.g. />./AzureResourceInventory.ps1 -TenantID -Online" - Write-Host "" - Write-Host "Running in Debug Mode :" - Write-Host " To run in a Debug Mode use <-Debug> parameter." - Write-Host ".e.g. />/AzureResourceInventory.ps1 -TenantID -Debug" - Write-Host "" - } - - Function Variables { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Cleaning default variables') - $Global:ResourceContainers = @() - $Global:Resources = @() - $Global:Advisories = @() - $Global:Security = @() - $Global:Policies = @() - $Global:Subscriptions = '' - $Global:ReportName = $ReportName - - $Global:Repo = 'https://api.github.com/repos/microsoft/ari/git/trees/main?recursive=1' - $Global:RawRepo = 'https://raw.githubusercontent.com/microsoft/ARI/main' - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if -Online parameter will have to be forced.') - if(!$Online.IsPresent) - { - if($PSScriptRoot -like '*\*') - { - $LocalFilesValidation = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Subscriptions.ps1') - } - else - { - $LocalFilesValidation = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Subscriptions.ps1') - } - if([string]::IsNullOrEmpty($LocalFilesValidation)) - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Using -Online by force.') - $Global:RunOnline = $true - } - else - { - $Global:RunOnline = $false - } - } - - } - - <######################################################### Environment ######################################################################> - - Function Extractor { - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Extractor function') - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Powershell Edition: ' + ([string]$psversiontable.psEdition)) - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Powershell Version: ' + ([string]$psversiontable.psVersion)) - function checkAzCli() { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting checkAzCli function') - Write-Host "Validating Az Cli.." - $azcli = az --version - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Current az cli version: ' + $azcli[0]) - if ($null -eq $azcli) { - Read-Host "Azure CLI Not Found. Press to finish script" - Exit - } - Write-Host "Validating Az Cli Extension.." - $azcliExt = az extension list --output json | ConvertFrom-Json - $azcliExt = $azcliExt | Where-Object {$_.name -eq 'resource-graph'} - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Current Resource-Graph Extension Version: ' + $azcliExt.version) - $AzcliExtV = $azcliExt | Where-Object {$_.name -eq 'resource-graph'} - if (!$AzcliExtV) { - Write-Host "Adding Az Cli Extension" - az extension add --name resource-graph - } - Write-Host "Validating ImportExcel Module.." - $VarExcel = Get-InstalledModule -Name ImportExcel -ErrorAction silentlycontinue - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'ImportExcel Module Version: ' + ([string]$VarExcel.Version.Major + '.' + [string]$VarExcel.Version.Minor + '.' + [string]$VarExcel.Version.Build)) - if ($null -eq $VarExcel) { - Write-Host "Trying to install ImportExcel Module.." - Install-Module -Name ImportExcel -Force - } - $VarExcel = Get-InstalledModule -Name ImportExcel -ErrorAction silentlycontinue - if ($null -eq $VarExcel) { - Read-Host 'Admininstrator rights required to install ImportExcel Module. Press to finish script' - Exit - } - } - - function LoginSession() { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting LoginSession function') - if(![string]::IsNullOrEmpty($AzureEnvironment)) - { - az cloud set --name $AzureEnvironment - } - $CloudEnv = az cloud list | ConvertFrom-Json - Write-Host "Azure Cloud Environment: " -NoNewline - $CurrentCloudEnvName = $CloudEnv | Where-Object {$_.isActive -eq 'True'} - Write-Host $CurrentCloudEnvName.name -BackgroundColor Green - if (!$TenantID) { - write-host "Tenant ID not specified. Use -TenantID parameter if you want to specify directly. " - write-host "Authenticating Azure" - write-host "" - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Cleaning az account cache') - az account clear | Out-Null - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Calling az login') - if($DeviceLogin.IsPresent) - { - az login --use-device-code - } - else - { - az login --only-show-errors | Out-Null - } - write-host "" - write-host "" - $Tenants = az account list --query [].homeTenantId -o tsv --only-show-errors | Sort-Object -Unique - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking number of Tenants') - if ($Tenants.Count -eq 1) { - write-host "You have privileges only in One Tenant " - write-host "" - $TenantID = $Tenants - } - else { - write-host "Select the the Azure Tenant ID that you want to connect : " - write-host "" - $SequenceID = 1 - foreach ($TenantID in $Tenants) { - write-host "$SequenceID) $TenantID" - $SequenceID ++ - } - write-host "" - [int]$SelectTenant = read-host "Select Tenant ( default 1 )" - $defaultTenant = --$SelectTenant - $TenantID = $Tenants[$defaultTenant] - if($DeviceLogin.IsPresent) - { - az login --use-device-code -t $TenantID - } - else - { - az login -t $TenantID --only-show-errors | Out-Null - } - } - - write-host "Extracting from Tenant $TenantID" - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting Subscription details') - $Global:Subscriptions = az account list --output json --only-show-errors | ConvertFrom-Json - $Global:Subscriptions = $Subscriptions | Where-Object { $_.tenantID -eq $TenantID } - if ($SubscriptionID) - { - if($SubscriptionID.count -gt 1) - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -in $SubscriptionID } - } - else - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -eq $SubscriptionID } - } - } - } - else { - az account clear | Out-Null - if (!$Appid) { - if($DeviceLogin.IsPresent) - { - az login --use-device-code -t $TenantID - } - else - { - $AZConfig = az config get core.enable_broker_on_windows --only-show-errors | ConvertFrom-Json - if ($AZConfig.value -eq $true) - { - az config set core.enable_broker_on_windows=false --only-show-errors - #az config set core.login_experience_v2=off --only-show-errors - az login -t $TenantID --only-show-errors - az config set core.enable_broker_on_windows=true --only-show-errors - } - else - { - az login -t $TenantID --only-show-errors - } - - } - } - elseif ($Appid -and $Secret -and $tenantid) { - write-host "Using Service Principal Authentication Method" - az login --service-principal -u $appid -p $secret -t $TenantID | Out-Null - } - else{ - write-host "You are trying to use Service Principal Authentication Method in a wrong way." - write-host "It's Mandatory to specify Application ID, Secret and Tenant ID in Azure Resource Inventory" - write-host "" - write-host ".\AzureResourceInventory.ps1 -appid -secret -tenant " - Exit - } - $Global:Subscriptions = az account list --output json | ConvertFrom-Json - $Global:Subscriptions = $Subscriptions | Where-Object { $_.tenantID -eq $TenantID } - if ($SubscriptionID) - { - if($SubscriptionID.count -gt 1) - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -in $SubscriptionID } - } - else - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -eq $SubscriptionID } - } - } - } - } - - function checkPS() { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting checkPS function') - $CShell = try{Get-CloudShellTip}catch{} - if ($CShell) { - write-host 'Azure CloudShell Identified.' - $Global:PlatOS = 'Azure CloudShell' - write-host "" - if($ReportDir) - { - try - { - Resolve-Path $ReportDir -ErrorAction STOP - if ($ReportDir -notmatch '/$') - { - $ReportDir = $ReportDir + '/' - } - } - catch - { - Write-Host "ERROR:" -NoNewline -ForegroundColor Red - Write-Host " Wrong ReportDir Path!" - Write-Host "" - Write-Host "ReportDir Parameter must contain the full path." - Write-Host "" - Exit - } - } - $Global:DefaultPath = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/"} - $Global:DiagramCache = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/DiagramCache/"} - $Global:Subscriptions = az account list --output json --only-show-errors | ConvertFrom-Json - if ($SubscriptionID) - { - if($SubscriptionID.count -gt 1) - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -in $SubscriptionID } - } - else - { - $Global:Subscriptions = $Subscriptions | Where-Object { $_.ID -eq $SubscriptionID } - } - } - } - else - { - if ($PSVersionTable.Platform -eq 'Unix') { - write-host "PowerShell Unix Identified." - $Global:PlatOS = 'PowerShell Unix' - write-host "" - if($ReportDir) - { - try - { - Resolve-Path $ReportDir -ErrorAction STOP - if ($ReportDir -notmatch '/$') - { - $ReportDir = $ReportDir + '/' - } - } - catch - { - Write-Host "ERROR:" -NoNewline -ForegroundColor Red - Write-Host " Wrong ReportDir Path!" - Write-Host "" - Write-Host "ReportDir Parameter must contain the full path." - Write-Host "" - Exit - } - } - $Global:DefaultPath = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/"} - $Global:DiagramCache = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/DiagramCache/"} - LoginSession - } - else { - write-host "PowerShell Desktop Identified." - $Global:PlatOS = 'PowerShell Desktop' - write-host "" - if($ReportDir) - { - try - { - Resolve-Path $ReportDir -ErrorAction STOP - if ($ReportDir -notlike '*\') - { - $ReportDir = $ReportDir + '\' - } - } - catch - { - Write-Host "ERROR:" -NoNewline -ForegroundColor Red - Write-Host " Wrong ReportDir Path!" - Write-Host "" - Write-Host "ReportDir Parameter must contain the full path." - Write-Host "" - Exit - } - } - $Global:DefaultPath = if($ReportDir) {$ReportDir} else {"C:\AzureResourceInventory\"} - $Global:DiagramCache = if($ReportDir) {($ReportDir+'DiagramCache\')} else {"C:\AzureResourceInventory\DiagramCache\"} - LoginSession - } - } - } - - <###################################################### Checking PowerShell ######################################################################> - - checkAzCli - checkPS - - #Field for tags - if ($IncludeTags.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Tags will be included") - $GraphQueryTags = ",tags " - } else { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Tags will be ignored") - $GraphQueryTags = "" - } - - <###################################################### Subscriptions ######################################################################> - - Write-Progress -activity 'Azure Inventory' -Status "1% Complete." -PercentComplete 2 -CurrentOperation 'Discovering Subscriptions..' - - if (![string]::IsNullOrEmpty($ManagementGroup)) - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Management group name supplied: ' + $ManagmentGroupName) - $group = az account management-group entities list --query "[?name =='$ManagementGroup']" | ConvertFrom-Json - if ($group.Count -lt 1) - { - Write-Host "ERROR:" -NoNewline -ForegroundColor Red - Write-Host "Management Group $ManagementGroup not found!" - Write-Host "" - Write-Host "Please check the Management Group name and try again." - Write-Host "" - Exit - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Management groups found: ' + $group.count) - foreach ($item in $group) - { - $Global:Subscriptions = @() - $GraphQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$($item.name)' | summarize count()" - $EnvSize = az graph query -q $GraphQuery --output json --only-show-errors | ConvertFrom-Json - $EnvSizeNum = $EnvSize.data.'count_' - - if ($EnvSizeNum -ge 1) { - $Loop = $EnvSizeNum / 1000 - $Loop = [math]::ceiling($Loop) - $Looper = 0 - $Limit = 0 - - while ($Looper -lt $Loop) { - $GraphQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$($item.name)' | project id = subscriptionId" - $Resource = (az graph query -q $GraphQuery --skip $Limit --first 1000 --output json --only-show-errors).tolower() | ConvertFrom-Json - - foreach ($Sub in $Resource.data) { - $Global:Subscriptions += az account show --subscription $Sub.id --output json --only-show-errors | ConvertFrom-Json - } - - Start-Sleep 2 - $Looper ++ - Write-Progress -Id 1 -activity "Running Subscription Inventory Job" -Status "$Looper / $Loop of Subscription Jobs" -PercentComplete (($Looper / $Loop) * 100) - $Limit = $Limit + 1000 - } - } - Write-Progress -Id 1 -activity "Running Subscription Inventory Job" -Status "$Looper / $Loop of Subscription Jobs" -Completed - } - } - } - - $SubCount = [string]$Global:Subscriptions.id.count - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Number of Subscriptions Found: ' + $SubCount) - Write-Progress -activity 'Azure Inventory' -Status "3% Complete." -PercentComplete 3 -CurrentOperation "$SubCount Subscriptions found.." - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking report folder: ' + $DefaultPath ) - if ((Test-Path -Path $DefaultPath -PathType Container) -eq $false) { - New-Item -Type Directory -Force -Path $DefaultPath | Out-Null - } - if ((Test-Path -Path $DiagramCache -PathType Container) -eq $false) { - New-Item -Type Directory -Force -Path $DiagramCache | Out-Null - } - - <######################################################## INVENTORY LOOPs #######################################################################> - - $Global:ExtractionRuntime = Measure-Command -Expression { - - Write-Progress -Id 1 -activity "Running Inventory Jobs" -Status "1% Complete." -Completed - function Invoke-InventoryLoop { - param($GraphQuery,$FSubscri,$LoopName) - - $LocalResults = @() - if($FSubscri.count -gt 200) - { - $SubLoop = $FSubscri.count / 200 - $SubLooper = 0 - $NStart = 0 - $NEnd = 200 - while ($SubLooper -lt $SubLoop) - { - $Sub = $FSubscri[$NStart..$NEnd] - try - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $Sub --first 1000 --output json --only-show-errors | ConvertFrom-Json - } - catch - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $Sub --first 200 --output json --only-show-errors | ConvertFrom-Json - } - $LocalResults += $QueryResult - while ($QueryResult.skip_token) { - try - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $Sub --skip-token $QueryResult.skip_token --first 1000 --output json --only-show-errors | ConvertFrom-Json - } - catch - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $Sub --skip-token $QueryResult.skip_token --first 200 --output json --only-show-errors | ConvertFrom-Json - } - $LocalResults += $QueryResult - } - $NStart = $NStart + 200 - $NEnd = $NEnd + 200 - $SubLooper ++ - } - } - else - { - try - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $FSubscri --first 1000 --output json --only-show-errors - } - catch - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $FSubscri --first 200 --output json --only-show-errors - } - try - { - $QueryResult = $QueryResult | ConvertFrom-Json - } - catch - { - $QueryResult = $QueryResult | ConvertFrom-Json -AsHashtable - } - - $LocalResults += $QueryResult - while ($QueryResult.skip_token) { - try - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $FSubscri --skip-token $QueryResult.skip_token --first 1000 --output json --only-show-errors - } - catch - { - $QueryResult = az graph query -q $GraphQuery --subscriptions $FSubscri --skip-token $QueryResult.skip_token --first 200 --output json --only-show-errors - } - try - { - $QueryResult = $QueryResult | ConvertFrom-Json - } - catch - { - $QueryResult = $QueryResult | ConvertFrom-Json -AsHashtable - } - $LocalResults += $QueryResult - } - } - $LocalResults.data - } - - - Write-Progress -activity 'Azure Inventory' -Status "4% Complete." -PercentComplete 4 -CurrentOperation "Starting Resources extraction jobs.." - - if(![string]::IsNullOrEmpty($ResourceGroup) -and [string]::IsNullOrEmpty($SubscriptionID)) - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resource Group Name present, but missing Subscription ID.') - Write-Host '' - Write-Host 'If Using the -ResourceGroup Parameter, the Subscription ID must be informed' - Write-Host '' - Exit - } - else - { - $Subscri = $Global:Subscriptions.id - $RGQueryExtension = '' - $TagQueryExtension = '' - $MGQueryExtension = '' - if(![string]::IsNullOrEmpty($ResourceGroup) -and ![string]::IsNullOrEmpty($SubscriptionID)) - { - $RGQueryExtension = "| where resourceGroup in~ ('$([String]::Join("','",$ResourceGroup))')" - } - elseif(![string]::IsNullOrEmpty($TagKey) -and ![string]::IsNullOrEmpty($TagValue)) - { - $TagQueryExtension = "| where isnotempty(tags) | mvexpand tags | extend tagKey = tostring(bag_keys(tags)[0]) | extend tagValue = tostring(tags[tagKey]) | where tagKey =~ '$TagKey' and tagValue =~ '$TagValue'" - } - elseif (![string]::IsNullOrEmpty($ManagementGroup)) - { - $MGQueryExtension = "| join kind=inner (resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$ManagementGroup' | project subscriptionId, managanagementGroup = managementGroupParent.name) on subscriptionId" - $MGContainerExtension = "| mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$ManagementGroup'" - } - } - - $GraphQuery = "resources $RGQueryExtension $TagQueryExtension $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Resources') - $Global:Resources += Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Resources' - - $GraphQuery = "networkresources $RGQueryExtension $TagQueryExtension $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Network Resources') - $Global:Resources += Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Network Resources' - - $GraphQuery = "recoveryservicesresources $RGQueryExtension $TagQueryExtension | where type =~ 'microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems' or type =~ 'microsoft.recoveryservices/vaults/backuppolicies' $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Backup Resources') - $Global:Resources += Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Backup Items' - - $GraphQuery = "desktopvirtualizationresources $RGQueryExtension $MGQueryExtension| project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for AVD Resources') - $Global:Resources += Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Virtual Desktop' - - $GraphQuery = "resourcecontainers $RGQueryExtension $TagQueryExtension $MGContainerExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Resource Containers') - $Global:ResourceContainers = Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Subscriptions and Resource Groups' - - if (!($SkipPolicy.IsPresent)) - { - $GraphQuery = "policyresources | where type == 'microsoft.authorization/policyassignments' | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Policies Resources') - $Global:Policies = Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Policies' - } - if (!($SkipAdvisory.IsPresent)) - { - $GraphQuery = "advisorresources $RGQueryExtension $MGQueryExtension | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Advisories') - $Global:Advisories = Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Advisories' - } - if ($SecurityCenter.IsPresent) - { - $GraphQuery = "securityresources $RGQueryExtension | where type =~ 'microsoft.security/assessments' and properties['status']['code'] == 'Unhealthy' $MGQueryExtension | order by id asc" - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Security Resources') - $Global:Security = Invoke-InventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Security Center' - } - - <######################################################### QUOTA JOB ######################################################################> - - if($QuotaUsage.isPresent) - { - Start-Job -Name 'Quota Usage' -ScriptBlock { - - $Location = @() - Foreach($Sub in $($args[1])) - { - $Locs = ($($args[0]) | Where-Object {$_.subscriptionId -eq $Sub.id -and $_.Type -in 'microsoft.compute/virtualmachines','microsoft.compute/virtualmachinescalesets'} | Group-Object -Property Location).name - $Val = @{ - 'Loc' = $Locs; - 'Sub' = $Sub.name - } - $Location += $Val - } - $Quotas = @() - Foreach($Loc in $Location) - { - if($Loc.Loc.count -eq 1) - { - $Quota = az vm list-usage --location $Loc.Loc --subscription $Loc.Sub -o json | ConvertFrom-Json - $Quota = $Quota | Where-Object {$_.CurrentValue -ge 1} - $Q = @{ - 'Location' = $Loc.Loc; - 'Subscription' = $Loc.Sub; - 'Data' = $Quota - } - $Quotas += $Q - } - else { - foreach($Loc1 in $Loc.loc) - { - $Quota = az vm list-usage --location $Loc1 --subscription $Loc.Sub -o json | ConvertFrom-Json - $Quota = $Quota | Where-Object {$_.CurrentValue -ge 1} - $Q = @{ - 'Location' = $Loc1; - 'Subscription' = $Loc.Sub; - 'Data' = $Quota - } - $Quotas += $Q - } - } - } - $Quotas - } -ArgumentList $Global:Resources, $Global:Subscriptions - } - - Write-Progress -activity 'Azure Inventory' -PercentComplete 20 - - Write-Progress -Id 1 -activity "Running Inventory Jobs" -Status "100% Complete." -Completed - - } - } - - - <######################################################### Creating Excel File ######################################################################> - - Function RunMain { - - $Global:ReportingRunTime = Measure-Command -Expression { - - #### Creating Excel file variable: - $Global:File = ($DefaultPath + $Global:ReportName + "_Report_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".xlsx") - #$Global:DFile = ($DefaultPath + $Global:ReportName + "_Diagram_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".vsdx") - $Global:DDFile = ($DefaultPath + $Global:ReportName + "_Diagram_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".xml") - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Excel file:' + $File) - - #### Generic Conditional Text rules, Excel style specifications for the spreadsheets and tables: - $Global:TableStyle = "Light19" - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Excel Table Style used: ' + $TableStyle) - - Write-Progress -activity 'Azure Inventory' -Status "21% Complete." -PercentComplete 21 -CurrentOperation "Starting to process extraction data.." - - - <######################################################### IMPORT UNSUPPORTED VERSION LIST ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Importing List of Unsupported Versions.') - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/Support.json') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/Support.json') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\Support.json') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Support.json') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/Support.json') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Support.json') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $Unsupported = $ModuSeq | ConvertFrom-Json - - $DataActive = ('Azure Resource Inventory Reporting (' + ($resources.count) + ') Resources') - - <######################################################### DRAW.IO DIAGRAM JOB ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Draw.io Diagram Job Should be Run.') - if (!$SkipDiagram.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Draw.io Diagram Processing Job.') - Start-job -Name 'DrawDiagram' -ScriptBlock { - - $DiagramCache = $($args[5]) - - $TempPath = $DiagramCache.split("DiagramCache\")[0] - - $Logfile = ($TempPath+'DiagramLogFile.log') - - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Draw.IO Job') - - If ($($args[8]) -eq $true) { - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Running Online') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[10]) + '/Extras/DrawIODiagram.ps1') - } - Else { - if($($args[0]) -like '*\*') - { - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Running Local') - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\DrawIODiagram.ps1') - } - else - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/DrawIODiagram.ps1') - } - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/DrawIODiagram.ps1') - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Draw.IO Thread') - try - { - $DrawRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])).AddArgument($($args[4])).AddArgument($($args[5])).AddArgument($($args[6])).AddArgument($($args[7])) - - $DrawJob = $DrawRun.BeginInvoke() - - while ($DrawJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $DrawRun.EndInvoke($DrawJob) - - $DrawRun.Dispose() - } - catch - { - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+$_.Exception.Message) - } - Add-Content -Path $Logfile -Value ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Draw.IO Ended.') - - } -ArgumentList $PSScriptRoot, $Subscriptions, $Resources, $Advisories, $DDFile, $DiagramCache, $FullEnv, $ResourceContainers ,$RunOnline, $Repo, $RawRepo | Out-Null - } - - <######################################################### VISIO DIAGRAM JOB ######################################################################> - <# - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Visio Diagram Job Should be Run.') - if ($Diagram.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Visio Diagram Processing Job.') - Start-job -Name 'VisioDiagram' -ScriptBlock { - - If ($($args[5]) -eq $true) { - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[7]) + '/Extras/VisioDiagram.ps1') - } - Else { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\VisioDiagram.ps1') - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $ScriptBlock = [Scriptblock]::Create($ModuSeq) - - $VisioRun = ([PowerShell]::Create()).AddScript($ScriptBlock).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])).AddArgument($($args[4])) - - $VisioJob = $VisioRun.BeginInvoke() - - while ($VisioJob.IsCompleted -contains $false) {} - - $VisioRun.EndInvoke($VisioJob) - - $VisioRun.Dispose() - - } -ArgumentList $PSScriptRoot, $Subscriptions, $Resources, $Advisories, $DFile, $RunOnline, $Repo, $RawRepo | Out-Null - } - #> - - <######################################################### SECURITY CENTER JOB ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Security Center Job.') - if ($SecurityCenter.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Security Job.') - Start-Job -Name 'Security' -ScriptBlock { - - If ($($args[5]) -eq $true) { - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[6]) + '/Extras/SecurityCenter.ps1') - } - Else { - if($($args[0]) -like '*\*') - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\SecurityCenter.ps1') - } - else - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/SecurityCenter.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $SecRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])) - - $SecJob = $SecRun.BeginInvoke() - - while ($SecJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $SecResult = $SecRun.EndInvoke($SecJob) - - $SecRun.Dispose() - - $SecResult - - } -ArgumentList $PSScriptRoot, $Subscriptions , $Security, 'Processing' , $File, $RunOnline, $RawRepo | Out-Null - } - - <######################################################### POLICY JOB ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Policy Job.') - if (!$SkipPolicy.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Policy Processing Job.') - Start-Job -Name 'Policy' -ScriptBlock { - - If ($($args[5]) -eq $true) { - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[6]) + '/Extras/Policy.ps1') - } - Else { - if($($args[0]) -like '*\*') - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\Policy.ps1') - } - else - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/Policy.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $PolRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])).AddArgument($($args[4])) - - $PolJob = $PolRun.BeginInvoke() - - while ($PolJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $PolResult = $PolRun.EndInvoke($PolJob) - - $PolRun.Dispose() - - $PolResult - - } -ArgumentList $PSScriptRoot, $Policies, 'Processing', $Subscriptions, $File, $RunOnline, $RawRepo | Out-Null - } - - <######################################################### ADVISORY JOB ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Advisory Job.') - if (!$SkipAdvisory.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Advisory Processing Job.') - Start-Job -Name 'Advisory' -ScriptBlock { - - If ($($args[4]) -eq $true) { - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[5]) + '/Extras/Advisory.ps1') - } - Else { - if($($args[0]) -like '*\*') - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\Advisory.ps1') - } - else - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/Advisory.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $AdvRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])) - - $AdvJob = $AdvRun.BeginInvoke() - - while ($AdvJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $AdvResult = $AdvRun.EndInvoke($AdvJob) - - $AdvRun.Dispose() - - $AdvResult - - } -ArgumentList $PSScriptRoot, $Advisories, 'Processing' , $File, $RunOnline, $RawRepo | Out-Null - } - - <######################################################### SUBSCRIPTIONS JOB ######################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Subscriptions job.') - Start-Job -Name 'Subscriptions' -ScriptBlock { - - If ($($args[5]) -eq $true) { - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[6]) + '/Extras/Subscriptions.ps1') - } - Else { - if($($args[0]) -like '*\*') - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\Subscriptions.ps1') - } - else - { - $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '/Extras/Subscriptions.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $SubRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])).AddArgument($($args[4])) - - $SubJob = $SubRun.BeginInvoke() - - while ($SubJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $SubResult = $SubRun.EndInvoke($SubJob) - - $SubRun.Dispose() - - $SubResult - - } -ArgumentList $PSScriptRoot, $Subscriptions, $Resources, 'Processing' , $File, $RunOnline, $RawRepo | Out-Null - - <######################################################### RESOURCE GROUP JOB ######################################################################> - - switch ($Resources.count) - { - {$_ -le 1000} - { - $EnvSizeLooper = 1000 - $DebugEnvSize = 'Small' - } - {$_ -gt 1000 -and $_ -le 30000} - { - $EnvSizeLooper = 5000 - $DebugEnvSize = 'Medium' - } - {$_ -gt 30000 -and $_ -le 60000} - { - $EnvSizeLooper = 10000 - $DebugEnvSize = 'Large' - Write-Host $DebugEnvSize -NoNewline -ForegroundColor Green - Write-Host (' Size Environment Identified.') - Write-Host ('Jobs will be run in batches to avoid CPU Overload.') - } - {$_ -gt 60000} - { - $EnvSizeLooper = 5000 - $DebugEnvSize = 'Enormous' - Write-Host $DebugEnvSize -NoNewline -ForegroundColor Green - Write-Host (' Size Environment Identified.') - Write-Host ('Jobs will be run in batches to prevent CPU Overload.') - } - } - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Processing Jobs in '+ $DebugEnvSize +' Mode.') - - $Loop = $resources.count / $EnvSizeLooper - $Loop = [math]::ceiling($Loop) - $Looper = 0 - $Limit = 0 - $JobLoop = 1 - - $ResourcesCount = [string]$Resources.count - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Total Resources Being Processed: '+ $ResourcesCount) - - while ($Looper -lt $Loop) { - $Looper ++ - - $Resource = $resources | Select-Object -First $EnvSizeLooper -Skip $Limit - - $ResourceCount = [string]$Resource.count - $LoopCountStr = [string]$Looper - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resources Being Processed in ResourceJob_'+ $LoopCountStr + ': ' + $ResourceCount) - - Start-Job -Name ('ResourceJob_'+$Looper) -ScriptBlock { - - $Job = @() - - $Subscriptions = $($args[2]) - $InTag = $($args[3]) - $Resource = $($args[4]) - $Task = $($args[5]) - $Unsupported = $($args[12]) - $RunOnline = $($args[9]) - $Repo = $($args[10]) - $RawRepo = $($args[11]) - - If ($RunOnline -eq $true) { - $OnlineRepo = Invoke-WebRequest -Uri $Repo - $RepoContent = $OnlineRepo | ConvertFrom-Json - $Modules = ($RepoContent.tree | Where-Object {$_.path -like '*.ps1' -and $_.path -notlike 'Extras/*' -and $_.path -ne 'AzureResourceInventory.ps1' -and $_.path -notlike 'Automation/*'}).path - } - Else { - if($($args[1]) -like '*\*') - { - $Modules = Get-ChildItem -Path ($($args[1]) + '\Modules\*.ps1') -Recurse - } - else - { - $Modules = Get-ChildItem -Path ($($args[1]) + '/Modules/*.ps1') -Recurse - } - } - $job = @() - - $Modules | ForEach-Object { - If ($RunOnline -eq $true) { - $Modul = $_.split('/') - $ModName = $Modul[2] - $ModName = $ModName.replace(".ps1","") - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/' + $_) - } Else { - $ModName = $_.Name.replace(".ps1","") - $ModuSeq0 = New-Object System.IO.StreamReader($_.FullName) - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - Start-Sleep -Milliseconds 250 - - New-Variable -Name ('ModRun' + $ModName) - New-Variable -Name ('ModJob' + $ModName) - - Set-Variable -Name ('ModRun' + $ModName) -Value ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($PSScriptRoot).AddArgument($Subscriptions).AddArgument($InTag).AddArgument($Resource).AddArgument($Task).AddArgument($null).AddArgument($null).AddArgument($null).AddArgument($Unsupported) - - Set-Variable -Name ('ModJob' + $ModName) -Value ((get-variable -name ('ModRun' + $ModName)).Value).BeginInvoke() - - $job += (get-variable -name ('ModJob' + $ModName)).Value - Start-Sleep -Milliseconds 250 - Clear-Variable -Name ModName - } - - while ($Job.Runspace.IsCompleted -contains $false) { Start-Sleep -Milliseconds 1000 } - - $Modules | ForEach-Object { - If ($RunOnline -eq $true) { - $Modul = $_.split('/') - $ModName = $Modul[2] - $ModName = $ModName.replace(".ps1","") - } Else { - $ModName = $_.Name.replace(".ps1","") - } - Start-Sleep -Milliseconds 250 - - New-Variable -Name ('ModValue' + $ModName) - Set-Variable -Name ('ModValue' + $ModName) -Value (((get-variable -name ('ModRun' + $ModName)).Value).EndInvoke((get-variable -name ('ModJob' + $ModName)).Value)) - - Clear-Variable -Name ('ModRun' + $ModName) - Clear-Variable -Name ('ModJob' + $ModName) - Start-Sleep -Milliseconds 250 - Clear-Variable -Name ModName - } - - [System.GC]::GetTotalMemory($true) | out-null - - $Hashtable = New-Object System.Collections.Hashtable - - $Modules | ForEach-Object { - If ($RunOnline -eq $true) { - $Modul = $_.split('/') - $ModName = $Modul[2] - $ModName = $ModName.replace(".ps1","") - } Else { - $ModName = $_.Name.replace(".ps1","") - } - Start-Sleep -Milliseconds 250 - - $Hashtable["$ModName"] = (get-variable -name ('ModValue' + $ModName)).Value - - Clear-Variable -Name ('ModValue' + $ModName) - Start-Sleep -Milliseconds 100 - - Clear-Variable -Name ModName - } - - [System.GC]::GetTotalMemory($true) | out-null - - $Hashtable - } -ArgumentList $null, $PSScriptRoot, $Subscriptions, $InTag, $Resource, 'Processing', $null, $null, $null, $RunOnline, $Repo, $RawRepo, $Unsupported | Out-Null - $Limit = $Limit + $EnvSizeLooper - Start-Sleep -Milliseconds 250 - if($DebugEnvSize -in ('Large','Enormous') -and $JobLoop -eq 5) - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Waiting Batch of Jobs to Complete.') - - $coun = 0 - - $InterJobNames = (Get-Job | Where-Object {$_.name -like 'ResourceJob_*' -and $_.State -eq 'Running'}).Name - - while (get-job -Name $InterJobNames | Where-Object { $_.State -eq 'Running' }) { - $jb = get-job -Name $InterJobNames - $c = (((($jb.count - ($jb | Where-Object { $_.State -eq 'Running' }).Count)) / $jb.Count) * 100) - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'initial Jobs Running: '+[string]($jb | Where-Object { $_.State -eq 'Running' }).count) - $c = [math]::Round($coun) - Write-Progress -Id 1 -activity "Processing Initial Resource Jobs" -Status "$coun% Complete." -PercentComplete $coun - Start-Sleep -Seconds 15 - } - $JobLoop = 0 - } - $JobLoop ++ - [System.GC]::GetTotalMemory($true) | out-null - } - - <############################################################## RESOURCES LOOP CREATION #############################################################> - - - $Global:ResourcesCount = $Global:Resources.Count - - if($DebugEnvSize -in ('Large','Enormous')) - { - Clear-Variable Resources -Scope Global - [System.GC]::GetTotalMemory($true) | out-null - } - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Jobs Collector.') - Write-Progress -activity $DataActive -Status "Processing Inventory" -PercentComplete 0 - $c = 0 - - $JobNames = (Get-Job | Where-Object {$_.name -like 'ResourceJob_*'}).Name - - while (get-job -Name $JobNames | Where-Object { $_.State -eq 'Running' }) { - $jb = get-job -Name $JobNames - $c = (((($jb.count - ($jb | Where-Object { $_.State -eq 'Running' }).Count)) / $jb.Count) * 100) - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Jobs Still Running: '+[string]($jb | Where-Object { $_.State -eq 'Running' }).count) - $c = [math]::Round($c) - Write-Progress -Id 1 -activity "Processing Resource Jobs" -Status "$c% Complete." -PercentComplete $c - Start-Sleep -Seconds 5 - } - Write-Progress -Id 1 -activity "Processing Resource Jobs" -Status "100% Complete." -Completed - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Jobs Compleated.') - - $AzSubs = Receive-Job -Name 'Subscriptions' - - $Global:SmaResources = @() - - Foreach ($Job in $JobNames) - { - $TempJob = Receive-Job -Name $Job - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Job '+ $Job +' Returned: ' + ($TempJob.values | Where-Object {$_ -ne $null}).Count + ' Resource Types.') - $Global:SmaResources += $TempJob - } - - <############################################################## REPORTING ###################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Reporting Phase.') - Write-Progress -activity $DataActive -Status "Processing Inventory" -PercentComplete 50 - - If ($RunOnline -eq $true) { - $OnlineRepo = Invoke-WebRequest -Uri $Repo - $RepoContent = $OnlineRepo | ConvertFrom-Json - $Modules = ($RepoContent.tree | Where-Object {$_.path -like '*.ps1' -and $_.path -notlike 'Extras/*' -and $_.path -ne 'AzureResourceInventory.ps1' -and $_.path -notlike 'Automation/*'}).path - } - Else { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Running Offline, Gathering List Of Modules.') - if($PSScriptRoot -like '*\*') - { - $Modules = Get-ChildItem -Path ($PSScriptRoot + '\Modules\*.ps1') -Recurse - } - else - { - $Modules = Get-ChildItem -Path ($PSScriptRoot + '/Modules/*.ps1') -Recurse - } - } - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Modules Found: ' + $Modules.Count) - $Lops = $Modules.count - $ReportCounter = 0 - - foreach ($Module in $Modules) { - - $c = (($ReportCounter / $Lops) * 100) - $c = [math]::Round($c) - Write-Progress -Id 1 -activity "Building Report" -Status "$c% Complete." -PercentComplete $c - - If ($RunOnline -eq $true) { - $Modul = $Module.split('/') - $ModName = $Modul[2] - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/' + $Module) - } Else { - $ModuSeq0 = New-Object System.IO.StreamReader($Module.FullName) - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - Start-Sleep -Milliseconds 50 - $ModuleName = $Module.name.replace('.ps1','') - - $ModuleResourceCount = $SmaResources.$ModuleName.count - - if ($ModuleResourceCount -gt 0) - { - Start-Sleep -Milliseconds 100 - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Running Module: '$ModuleName'. Resources Count: $ModuleResourceCount") - - $ExcelRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($PSScriptRoot).AddArgument($null).AddArgument($InTag).AddArgument($null).AddArgument('Reporting').AddArgument($file).AddArgument($SmaResources).AddArgument($TableStyle).AddArgument($Unsupported) - - $ExcelJob = $ExcelRun.BeginInvoke() - - while ($ExcelJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $ExcelRun.EndInvoke($ExcelJob) - - $ExcelRun.Dispose() - - [System.GC]::GetTotalMemory($true) | out-null - } - - $ReportCounter ++ - - } - - if($DebugEnvSize -in ('Large','Enormous')) - { - Clear-Variable SmaResources -Scope Global - [System.GC]::GetTotalMemory($true) | out-null - } - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resource Reporting Phase Done.') - - <################################################################### QUOTAS ###################################################################> - - if($QuotaUsage.IsPresent) - { - get-job -Name 'Quota Usage' | Wait-Job - - $Global:AzQuota = Receive-Job -Name 'Quota Usage' - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Quota Usage sheet for: ' + $Global:AzQuota.count + ' Subscriptions/Regions.') - - Write-Progress -activity 'Azure Resource Inventory Quota Usage' -Status "50% Complete." -PercentComplete 50 -CurrentOperation "Building Quota Sheet" - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/QuotaUsage.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/QuotaUsage.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\QuotaUsage.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\QuotaUsage.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/QuotaUsage.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/QuotaUsage.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $QuotaRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($File).AddArgument($Global:AzQuota).AddArgument($TableStyle) - - $QuotaJob = $QuotaRun.BeginInvoke() - - while ($QuotaJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $QuotaRun.EndInvoke($QuotaJob) - - $QuotaRun.Dispose() - - Write-Progress -activity 'Azure Resource Inventory Quota Usage' -Status "100% Complete." -Completed - } - - - <################################################ SECURITY CENTER #######################################################> - #### Security Center worksheet is generated apart - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Security Center Sheet.') - if ($SecurityCenter.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Security Center Sheet.') - $Global:Secadvco = $Security.Count - - Write-Progress -activity $DataActive -Status "Building Security Center Report" -PercentComplete 0 -CurrentOperation "Considering $Secadvco Security Advisories" - - while (get-job -Name 'Security' | Where-Object { $_.State -eq 'Running' }) { - Write-Progress -Id 1 -activity 'Processing Security Center Advisories' -Status "50% Complete." -PercentComplete 50 - Start-Sleep -Seconds 2 - } - Write-Progress -Id 1 -activity 'Processing Security Center Advisories' -Status "100% Complete." -Completed - - $Sec = Receive-Job -Name 'Security' - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/SecurityCenter.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/SecurityCenter.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\SecurityCenter.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\SecurityCenter.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/SecurityCenter.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/SecurityCenter.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $SecExcelRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($null).AddArgument($null).AddArgument('Reporting').AddArgument($file).AddArgument($Sec).AddArgument($TableStyle) - - $SecExcelJob = $SecExcelRun.BeginInvoke() - - while ($SecExcelJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $SecExcelRun.EndInvoke($SecExcelJob) - - $SecExcelRun.Dispose() - } - - - <################################################ POLICY #######################################################> - #### Policy worksheet is generated apart from the resources - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Policy Sheet.') - if (!$SkipPolicy.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Policy Sheet.') - $Global:polco = $Policies.count - - Write-Progress -activity $DataActive -Status "Building Policy Report" -PercentComplete 0 -CurrentOperation "Considering $polco Policies" - - while (get-job -Name 'Policy' | Where-Object { $_.State -eq 'Running' }) { - Write-Progress -Id 1 -activity 'Processing Policies' -Status "50% Complete." -PercentComplete 50 - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Policy Job is: '+(get-job -Name 'Policy').State) - Start-Sleep -Seconds 2 - } - Write-Progress -Id 1 -activity 'Processing Policies' -Status "100% Complete." -Completed - - $Global:Pol = Receive-Job -Name 'Policy' - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/Policy.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/Policy.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\Policy.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Policy.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/Policy.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Policy.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $PolExcelRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($null).AddArgument('Reporting').AddArgument($null).AddArgument($file).AddArgument($Pol).AddArgument($TableStyle) - - $PolExcelJob = $PolExcelRun.BeginInvoke() - - while ($PolExcelJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $PolExcelRun.EndInvoke($PolExcelJob) - - $PolExcelRun.Dispose() - } - - - <################################################ ADVISOR #######################################################> - #### Advisor worksheet is generated apart from the resources - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Advisory Sheet.') - if (!$SkipAdvisory.IsPresent) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Advisor Sheet.') - $Global:advco = $Advisories.count - - Write-Progress -activity $DataActive -Status "Building Advisories Report" -PercentComplete 0 -CurrentOperation "Considering $advco Advisories" - - while (get-job -Name 'Advisory' | Where-Object { $_.State -eq 'Running' }) { - Write-Progress -Id 1 -activity 'Processing Advisories' -Status "50% Complete." -PercentComplete 50 - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Advisory Job is: '+(get-job -Name 'Advisory').State) - Start-Sleep -Seconds 2 - } - Write-Progress -Id 1 -activity 'Processing Advisories' -Status "100% Complete." -Completed - - $Adv = Receive-Job -Name 'Advisory' - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/Advisory.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/Advisory.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\Advisory.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Advisory.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/Advisory.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Advisory.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $AdvExcelRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($null).AddArgument('Reporting').AddArgument($file).AddArgument($Adv).AddArgument($TableStyle) - - $AdvExcelJob = $AdvExcelRun.BeginInvoke() - - while ($AdvExcelJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $AdvExcelRun.EndInvoke($AdvExcelJob) - - $AdvExcelRun.Dispose() - } - - <################################################################### SUBSCRIPTIONS ###################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Subscription sheet for: ' + $Subscriptions.count + ' Subscriptions.') - - Write-Progress -activity 'Azure Resource Inventory Subscriptions' -Status "50% Complete." -PercentComplete 50 -CurrentOperation "Building Subscriptions Sheet" - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/Subscriptions.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/Subscriptions.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\Subscriptions.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Subscriptions.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/Subscriptions.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Subscriptions.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - $SubsRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($null).AddArgument($null).AddArgument('Reporting').AddArgument($file).AddArgument($AzSubs).AddArgument($TableStyle) - - $SubsJob = $SubsRun.BeginInvoke() - - while ($SubsJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $SubsRun.EndInvoke($SubsJob) - - $SubsRun.Dispose() - - [System.GC]::GetTotalMemory($true) | out-null - - Write-Progress -activity 'Azure Resource Inventory Subscriptions' -Status "100% Complete." -Completed - - <################################################################### CHARTS ###################################################################> - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Overview sheet (Charts).') - - Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "10% Complete." -PercentComplete 10 -CurrentOperation "Starting Excel Chart's Thread." - - If ($RunOnline -eq $true) { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$RawRepo + '/Extras/Charts.ps1') - $ModuSeq = (New-Object System.Net.WebClient).DownloadString($RawRepo + '/Extras/Charts.ps1') - } - Else { - if($PSScriptRoot -like '*\*') - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '\Extras\Charts.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Charts.ps1') - } - else - { - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Looking for the following file: '+$PSScriptRoot + '/Extras/Charts.ps1') - $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Charts.ps1') - } - $ModuSeq = $ModuSeq0.ReadToEnd() - $ModuSeq0.Dispose() - } - - } - - Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "15% Complete." -PercentComplete 15 -CurrentOperation "Invoking Excel Chart's Thread." - - $ChartsRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($file).AddArgument($TableStyle).AddArgument($Global:PlatOS).AddArgument($Global:Subscriptions).AddArgument($Global:ResourcesCount).AddArgument($ExtractionRunTime).AddArgument($ReportingRunTime).AddArgument($RunLite) - - $ChartsJob = $ChartsRun.BeginInvoke() - - Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "30% Complete." -PercentComplete 30 -CurrentOperation "Waiting Excel Chart's Thread." - - while ($ChartsJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } - - $ChartsRun.EndInvoke($ChartsJob) - - $ChartsRun.Dispose() - - [System.GC]::GetTotalMemory($true) | out-null - - Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Finished Charts Phase.') - - Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "100% Complete." -Completed - - if($Diagram.IsPresent) - { - Write-Progress -activity 'Diagrams' -Status "Completing Diagram" -PercentComplete 70 -CurrentOperation "Consolidating Diagram" - - while (get-job -Name 'DrawDiagram' | Where-Object { $_.State -eq 'Running' }) { - Write-Progress -Id 1 -activity 'Processing Diagrams' -Status "50% Complete." -PercentComplete 50 - Start-Sleep -Seconds 2 - } - Write-Progress -Id 1 -activity 'Processing Diagrams' -Status "100% Complete." -Completed - - Write-Progress -activity 'Diagrams' -Status "Closing Diagram File" -Completed - } - - Get-Job | Wait-Job | Remove-Job - } - - - <######################################################### END OF FUNCTIONS ######################################################################> - - if ($Help.IsPresent) { - usageMode - Exit - } - else { - Variables - Extractor - RunMain - } - -} - -$Measure = $Global:SRuntime.Totalminutes.ToString('#######.##') - -Write-Host ('Report Complete. Total Runtime was: ') -NoNewline -Write-Host $Measure -NoNewline -ForegroundColor Cyan -Write-Host (' Minutes') -Write-Host ('Total Resources: ') -NoNewline -Write-Host $Global:ResourcesCount -ForegroundColor Cyan -if (!$SkipAdvisory.IsPresent) - { - Write-Host ('Total Advisories: ') -NoNewline - write-host $advco -ForegroundColor Cyan - } -if (!$SkipPolicy.IsPresent) - { - Write-Host ('Total Policies: ') -NoNewline - write-host $polco -ForegroundColor Cyan - } -if ($SecurityCenter.IsPresent) - { - Write-Host ('Total Security Advisories: ' + $Secadvco) - } - -Write-Host '' -Write-Host ('Excel file saved at: ') -NoNewline -write-host $File -ForegroundColor Cyan -Write-Host '' - -if(!$SkipDiagram.IsPresent) - { - Write-Host ('Draw.io Diagram file saved at: ') -NoNewline - write-host $DDFile -ForegroundColor Cyan - Write-Host '' - } \ No newline at end of file diff --git a/AzureResourceInventory.psd1 b/AzureResourceInventory.psd1 new file mode 100644 index 0000000..a5b4676 --- /dev/null +++ b/AzureResourceInventory.psd1 @@ -0,0 +1,181 @@ +# +# Module manifest for module 'AzureResourceInventory' +# +# Generated by: Claudio Merola +# +# Generated on: 8/14/2024 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'AzureResourceInventory.psm1' + +# Version number of this module. +ModuleVersion = '3.5.0' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = '94bc2a7f-e865-426a-a054-cebde278a355' + +# Author of this module +Author = 'Claudio Merola' + +# Company or vendor of this module +CompanyName = 'Merola' + +# Copyright statement for this module +Copyright = '(c) Merola. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Azure Resource Inventory - Its a Powerful tool to create EXCEL inventory from Azure Resources with low effort' + +# Minimum version of the PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# ClrVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +RequiredModules = @('ImportExcel','Az.Accounts','Az.Compute','Az.ResourceGraph','Az.Storage') + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +NestedModules = @('Modules/Core/ARITestPS.psm1', + 'Modules/ARIResourceJobs.psm1', + 'Modules/ARIResourcesReport.psm1', + 'Modules/Core/ARIExtraJobs.psm1' + 'Modules/Core/ARILoginSession.psm1', + 'Modules/Inventory/ARIResourceDataPull.psm1', + 'Modules/Core/ARIInventoryLoop.psm1', + 'Modules/Core/ARIGetSubs.psm1', + 'Modules/Inventory/ARIResourceReport.psm1', + 'Modules/Inventory/ARISecCenterInv.psm1', + 'Modules/Inventory/ARIPolicyInv.psm1', + 'Modules/Inventory/ARIAdvisoryInv.psm1', + 'Modules/Inventory/ARISubInv.psm1', + 'Modules/Inventory/ARIQuotaInv.psm1', + 'Modules/Extras/ARIReportCharts.psm1', + 'Modules/Diagram/ARIDrawIODiagram.psm1', + 'Modules/Diagram/ARIDiagramNetwork.psm1', + 'Modules/Diagram/ARIDiagramOrganization.psm1', + 'Modules/Diagram/ARIDiagramSubscription.psm1', + 'Modules/Inventory/ARIMGMTGroups.psm1', + 'Modules/Inventory/ARIAPIInv.psm1') + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = @('Invoke-ARI', + 'Connect-ARILoginSession', + 'Test-ARIPS', + 'Start-AzureResourceDataPull', + 'Get-ARISubscriptions', + 'Invoke-ResourceInventoryLoop', + 'Build-AzureResourceReport', + 'Invoke-ARISecCenterProcessing', + 'Build-ARISecCenterReport', + 'Invoke-ARIPolicyProcessing', + 'Build-ARIPolicyReport', + 'Invoke-ARIAdvisoryProcessing', + 'Build-ARIAdvisoryReport', + 'Invoke-ARISubsProcessing', + 'Build-ARISubsReport', + 'Build-ARIQuotaReport', + 'Build-ARIExcelChart', + 'Invoke-ARIDrawIODiagram', + 'Invoke-ARIDiagramNetwork', + 'Invoke-ARIDiagramOrganization', + 'Invoke-ARIDiagramSubscription', + 'Get-ARIManagementGroups', + 'Start-ARIResourceReporting', + 'Start-ARIResourceJobs', + 'Start-ARIExtraJobs', + 'Start-ARIExtraReports', + 'Get-ARIUnsupportedData', + 'Start-ARIQuotaJob', + 'Start-ARIAutResourceJob', + 'Get-ARIAPIResources') + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = @() + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = @() + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('Azure','Inventory','ResourceInventory','ARI','AzureResourceInventory','Resources') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/microsoft/ARI/blob/main/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/microsoft/ARI' + + # A URL to an icon representing this module. + IconUri = 'https://github.com/microsoft/ARI/blob/main/images/ARI_Logo.png' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + # Prerelease = '' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + +} # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/AzureResourceInventory.psm1 b/AzureResourceInventory.psm1 new file mode 100644 index 0000000..a3a9e58 --- /dev/null +++ b/AzureResourceInventory.psm1 @@ -0,0 +1,363 @@ +<# +.SYNOPSIS + This script creates Excel file to Analyze Azure Resources inside a Tenant + +.DESCRIPTION + Do you want to analyze your Azure Advisories in a table format? Document it in xlsx format. + +.PARAMETER TenantID + Specify the tenant ID you want to create a Resource Inventory. + + >>> IMPORTANT: YOU NEED TO USE THIS PARAMETER FOR TENANTS WITH MULTI-FACTOR AUTHENTICATION. <<< + +.PARAMETER SubscriptionID + Use this parameter to collect a specific Subscription in a Tenant + +.PARAMETER ManagementGroup + Use this parameter to collect a all Subscriptions in a Specific Management Group in a Tenant + +.PARAMETER Lite + Use this parameter to use only the Import-Excel module and don't create the charts (using Excel's API) + +.PARAMETER SecurityCenter + Use this parameter to collect Security Center Advisories + +.PARAMETER SkipAdvisory + Use this parameter to skip the capture of Azure Advisories + +.PARAMETER SkipPolicy + Use this parameter to skip the capture of Azure Policies + +.PARAMETER QuotaUsage + Use this parameter to include Quota information + +.PARAMETER IncludeTags + Use this parameter to include Tags of every Azure Resources + +.PARAMETER Debug + Output detailed debug information. + +.EXAMPLE + Default utilization. Read all tenants you have privileges, select a tenant in menu and collect from all subscriptions: + PS C:\> Invoke-ARI + + Define the Tenant ID: + PS C:\> Invoke-ARI -TenantID + + Define the Tenant ID and for a specific Subscription: + PS C:\> Invoke-ARI -TenantID -SubscriptionID + +.NOTES + AUTHORS: Claudio Merola and Renato Gregio | Azure Infrastucture/Automation/Devops/Governance + + Copyright (c) 2018 Microsoft Corporation. All rights reserved. + + 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. + +.LINK + Official Repository: https://github.com/microsoft/ARI +#> +Function Invoke-ARI { +param ([ValidateSet('AzureCloud', 'AzureUSGovernment')] + $AzureEnvironment = 'AzureCloud', + $TenantID, + $SubscriptionID, + $ManagementGroup, + [string[]]$ResourceGroup, + $TagKey, + $TagValue, + [switch]$SecurityCenter, + [switch]$SkipAdvisory, + [switch]$SkipPolicy, + [switch]$SkipAPIs, + [switch]$IncludeTags, + [switch]$QuotaUsage, + [switch]$SkipDiagram, + [switch]$Automation, + $StorageAccount, + $StorageContainer, + [switch]$Lite, + [switch]$Debug, + [switch]$Help, + [switch]$DeviceLogin, + [switch]$DiagramFullEnvironment, + $ReportName = 'AzureResourceInventory', + $ReportDir) + + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Debbuging Mode: On. ErrorActionPreference was set to "Continue", every error will be presented.') + + if ($IncludeTags.IsPresent) { $InTag = $true } else { $InTag = $false } + + if ($Lite.IsPresent -or $Automation.IsPresent) { $RunLite = $true }else { $RunLite = $false } + if ($DiagramFullEnvironment.IsPresent) {$FullEnv = $true}else{$FullEnv = $false} + + <######################################################### Help ######################################################################> + + Function Get-UsageMode() { + Write-Host "" + Write-Host "Parameters" + Write-Host "" + Write-Host " -TenantID : Specifies the Tenant to be inventoried. " + Write-Host " -SubscriptionID : Specifies Subscription(s) to be inventoried. " + Write-Host " -ResourceGroup : Specifies one (or more) unique Resource Group to be inventoried, This parameter requires the -SubscriptionID to work. " + Write-Host " -TagKey : Specifies the tag key to be inventoried, This parameter requires the -SubscriptionID to work. " + Write-Host " -TagValue : Specifies the tag value be inventoried, This parameter requires the -SubscriptionID to work. " + Write-Host " -SkipAdvisory : Do not collect Azure Advisory. " + Write-Host " -SkipPolicy : Do not collect Azure Policies. " + Write-Host " -SecurityCenter : Include Security Center Data. " + Write-Host " -IncludeTags : Include Resource Tags. " + Write-Host " -Online : Use Online Modules. " + Write-Host " -Debug : Run in a Debug mode. " + Write-Host " -AzureEnvironment : Change the Azure Cloud Environment. " + Write-Host " -ReportName : Change the Default Name of the report. " + Write-Host " -ReportDir : Change the Default Path of the report. " + Write-Host "" + Write-Host "" + Write-Host "" + Write-Host "Usage Mode and Examples: " + Write-Host "If you do not specify Resource Inventory will be performed on all subscriptions for the selected tenant. " + Write-Host "e.g. /> Invoke-ARI" + Write-Host "" + Write-Host "To perform the inventory in a specific Tenant and subscription use <-TenantID> and <-SubscriptionID> parameter " + Write-Host "e.g. /> Invoke-ARI -TenantID -SubscriptionID " + Write-Host "" + Write-Host "Including Tags:" + Write-Host " By Default Azure Resource inventory do not include Resource Tags." + Write-Host " To include Tags at the inventory use <-IncludeTags> parameter. " + Write-Host "e.g. /> Invoke-ARI -TenantID -IncludeTags" + Write-Host "" + Write-Host "Skipping Azure Advisor:" + Write-Host " By Default Azure Resource inventory collects Azure Advisor Data." + Write-Host " To ignore this use <-SkipAdvisory> parameter. " + Write-Host "e.g. /> Invoke-ARI -TenantID -SubscriptionID -SkipAdvisory" + Write-Host "" + Write-Host "Using the latest modules :" + Write-Host " You can use the latest modules. For this use <-Online> parameter." + Write-Host " It's a pre-requisite to have internet access for ARI GitHub repo" + Write-Host "e.g. /> Invoke-ARI -TenantID -Online" + Write-Host "" + Write-Host "Running in Debug Mode :" + Write-Host " To run in a Debug Mode use <-Debug> parameter." + Write-Host ".e.g. /> Invoke-ARI -TenantID -Debug" + Write-Host "" + } + + <######################################################### END OF FUNCTIONS ######################################################################> + + $TotalRunTime = Measure-Command -Expression { + + if ($Help.IsPresent) { + Get-UsageMode + Exit + } + else { + + Write-Host ('Checking for Powershell Module Updates..') + Update-Module -Name AzureResourceInventory -AcceptLicense + + $PlatOS = Test-ARIPS -Debug $Debug + + if ($PlatOS -ne 'Azure CloudShell' -and !$Automation.IsPresent) + { + $TenantID = Connect-ARILoginSession -AzureEnvironment $AzureEnvironment -TenantID $TenantID -SubscriptionID $SubscriptionID -DeviceLogin $DeviceLogin + } + elseif ($Automation.IsPresent) + { + try { + $AzureConnection = (Connect-AzAccount -Identity).context + + Set-AzContext -SubscriptionName $AzureConnection.Subscription -DefaultProfile $AzureConnection + + $StorageContext = New-AzStorageContext -StorageAccountName $StorageAccount -UseConnectedAccount + } + catch { + Write-Output "Failed to set Automation Account requirements. Aborting." + exit + } + } + + $Subscriptions = Get-ARISubscriptions -TenantID $TenantID -SubscriptionID $SubscriptionID + + if ($PlatOS -eq 'Azure CloudShell') + { + $DefaultPath = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/"} + $DiagramCache = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/DiagramCache/"} + if($ReportDir) + { + try + { + Resolve-Path $ReportDir -ErrorAction STOP + if ($ReportDir -notmatch '/$') + { + $ReportDir = $ReportDir + '/' + } + } + catch + { + Write-Output "ReportDir Parameter must contain the full path." + Exit + } + } + } + elseif ($PlatOS -eq 'PowerShell Unix') + { + $DefaultPath = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/"} + $DiagramCache = if($ReportDir) {$ReportDir} else {"$HOME/AzureResourceInventory/DiagramCache/"} + if($ReportDir) + { + try + { + Resolve-Path $ReportDir -ErrorAction STOP + if ($ReportDir -notmatch '/$') + { + $ReportDir = $ReportDir + '/' + } + } + catch + { + Write-Output "ReportDir Parameter must contain the full path." + Exit + } + } + } + elseif ($PlatOS -eq 'PowerShell Desktop') + { + $DefaultPath = if($ReportDir) {$ReportDir} else {"C:\AzureResourceInventory\"} + $DiagramCache = if($ReportDir) {($ReportDir+'DiagramCache\')} else {"C:\AzureResourceInventory\DiagramCache\"} + if($ReportDir) + { + try + { + Resolve-Path $ReportDir -ErrorAction STOP + if ($ReportDir -notlike '*\') + { + $ReportDir = $ReportDir + '\' + } + } + catch + { + Write-Output "ReportDir Parameter must contain the full path." + Exit + } + } + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking report folder: ' + $DefaultPath ) + if ((Test-Path -Path $DefaultPath -PathType Container) -eq $false) { + New-Item -Type Directory -Force -Path $DefaultPath | Out-Null + } + if ((Test-Path -Path $DiagramCache -PathType Container) -eq $false) { + New-Item -Type Directory -Force -Path $DiagramCache | Out-Null + } + + Write-Host "Starting Resource Extraction.." + + $ExtractionData = Start-AzureResourceDataPull -ManagementGroup $ManagementGroup -Subscriptions $Subscriptions -SubscriptionID $SubscriptionID -ResourceGroup $ResourceGroup -SecurityCenter $SecurityCenter -SkipAdvisory $SkipAdvisory -IncludeTags $IncludeTags -QuotaUsage $QuotaUsage -TagKey $TagKey -TagValue $TagValue -Debug $Debug + + $ExtractionRuntime = $ExtractionData.ExtractionRunTime + $Resources = $ExtractionData.Resources + $ResourceContainers = $ExtractionData.ResourceContainers + $Advisories = $ExtractionData.Advisories + $Security = $ExtractionData.Security + + Clear-Variable -Name ExtractionData + + $ResourcesCount = [string]$Resources.Count + $advco = [string]$Advisories.Count + $Secadvco = [string]$Security.Count + + if(!$SkipAPIs.IsPresent) + { + $APIResults = Get-ARIAPIResources -Subscriptions $Subscriptions -AzureEnvironment $AzureEnvironment -SkipPolicy $SkipPolicy -Debug $Debug + $Resources += $APIResults.ResourceHealth + $Resources += $APIResults.SupportTickets + $Resources += $APIResults.ManagedIdentities + $Resources += $APIResults.AdvisorScore + $Resources += $APIResults.ReservationRecomen + $PolicyAssign = $APIResults.PolicyAssign + $PolicyDef = $APIResults.PolicyDef + $PolicySetDef = $APIResults.PolicySetDef + } + + $polco = [string]$PolicyAssign.policyAssignments.Count + + #### Creating Excel file variable: + if ($Automation.IsPresent) + { + $Date = get-date -Format "yyyy-MM-dd_HH_mm" + + $File = ("ARI_Automation_Report_"+$Date+".xlsx") + } + else + { + $File = ($DefaultPath + $ReportName + "_Report_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".xlsx") + #$Global:DFile = ($DefaultPath + $Global:ReportName + "_Diagram_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".vsdx") + $DDFile = ($DefaultPath + $ReportName + "_Diagram_" + (get-date -Format "yyyy-MM-dd_HH_mm") + ".xml") + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Excel file: ' + $File) + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Default Jobs.') + + Start-ARIExtraJobs -SkipDiagram $SkipDiagram -SkipAdvisory $SkipAdvisory -SkipPolicy $SkipPolicy -SecurityCenter $SecurityCenter -Subscriptions $Subscriptions -Resources $Resources -Advisories $Advisories -DDFile $DDFile -DiagramCache $DiagramCache -FullEnv $FullEnv -ResourceContainers $ResourceContainers -Security $Security -PolicyAssign $PolicyAssign -PolicySetDef $PolicySetDef -PolicyDef $PolicyDef -Automation $Automation -Debug $Debug + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Resources Report Function.') + + Build-AzureResourceReport -Subscriptions $Subscriptions -ExtractionRunTime $ExtractionRuntime -Resources $Resources -SecurityCenter $SecurityCenter -File $File -DDFile $DDFile -SkipDiagram $SkipDiagram -RunLite $RunLite -PlatOS $PlatOS -InTag $InTag -SkipPolicy $SkipPolicy -SkipAdvisory $SkipAdvisory -Automation $Automation -SkipAPIs $SkipAPIs -Debug $Debug + + if ($Automation.IsPresent) + { + Set-AzStorageBlobContent -File $File -Container $StorageContainer -Context $StorageContext | Out-Null + } + } +} + +$Measure = $TotalRunTime.Totalminutes.ToString('#######.##') + +Write-Host ('Report Complete. Total Runtime was: ') -NoNewline +Write-Host $Measure -NoNewline -ForegroundColor Cyan +Write-Host (' Minutes') +Write-Host ('Total Resources: ') -NoNewline +Write-Host $ResourcesCount -ForegroundColor Cyan +if (!$SkipAdvisory.IsPresent) + { + Write-Host ('Total Advisories: ') -NoNewline + write-host $advco -ForegroundColor Cyan + } +if (!$SkipPolicy.IsPresent -and !$SkipAPIs.IsPresent) + { + Write-Host ('Total Policies: ') -NoNewline + write-host $polco -ForegroundColor Cyan + } +if ($SecurityCenter.IsPresent) + { + Write-Host ('Total Security Advisories: ' + $Secadvco) + } + +Write-Host '' +Write-Host ('Excel file saved at: ') -NoNewline +write-host $File -ForegroundColor Cyan +Write-Host '' + +if(!$SkipDiagram.IsPresent) + { + Write-Host ('Draw.io Diagram file saved at: ') -NoNewline + write-host $DDFile -ForegroundColor Cyan + Write-Host '' + } +} \ No newline at end of file diff --git a/Extras/Advisory.ps1 b/Extras/Advisory.ps1 deleted file mode 100644 index 9532c2f..0000000 --- a/Extras/Advisory.ps1 +++ /dev/null @@ -1,77 +0,0 @@ -<# -.Synopsis -Advisory Module - -.DESCRIPTION -This script process and creates the Advisory sheet based on advisorresources. - -.Link -https://github.com/microsoft/ARI/Extras/Advisory.ps1 - -.COMPONENT - This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.0.0 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($Advisories, $Task ,$File, $Adv, $TableStyle) - -If ($Task -eq 'Processing') -{ - $obj = '' - $tmp = @() - - foreach ($1 in $Advisories) - { - if($1) - { - $data = $1.PROPERTIES - - if($null -eq $data.extendedProperties.annualSavingsAmount){$Savings = 0}Else{$Savings = $data.extendedProperties.annualSavingsAmount} - if($null -eq $data.extendedProperties.savingsCurrency){$SavingsCurrency = 'USD'}Else{$SavingsCurrency = $data.extendedProperties.savingsCurrency} - $obj = @{ - 'ResourceGroup' = $1.RESOURCEGROUP; - 'Affected Resource Type' = $data.impactedField; - 'Name' = $data.impactedValue; - 'Category' = $data.category; - 'Impact' = $data.impact; - #'Score' = $data.extendedproperties.score; - 'Problem' = $data.shortDescription.problem; - 'Savings Currency' = $SavingsCurrency; - 'Annual Savings' = "=$Savings"; - 'Savings Region' = $data.extendedProperties.location; - 'Current SKU' = $data.extendedProperties.currentSku; - 'Target SKU' = $data.extendedProperties.targetSku - } - $tmp += $obj - } - } - $tmp -} -Else -{ - $condtxtadv = $(New-ConditionalText High -Range E:E - New-ConditionalText Security -Range D:D -BackgroundColor Wheat) - - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '#,##0.00' -Range H:H - - $Adv | - ForEach-Object { [PSCustomObject]$_ } | - Select-Object 'ResourceGroup', - 'Affected Resource Type', - 'Name', - 'Category', - 'Impact', - #'Score', - 'Problem', - 'Savings Currency', - 'Annual Savings', - 'Savings Region', - 'Current SKU', - 'Target SKU' | - Export-Excel -Path $File -WorksheetName 'Advisory' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzureAdvisory' -MoveToStart -TableStyle $tableStyle -Style $Style -ConditionalText $condtxtadv -KillExcel - -} diff --git a/Extras/Charts.ps1 b/Extras/Charts.ps1 deleted file mode 100644 index 8576a5d..0000000 --- a/Extras/Charts.ps1 +++ /dev/null @@ -1,805 +0,0 @@ -<# -.Synopsis -Module for Main Dashboard - -.DESCRIPTION -This script process and creates the Overview sheet. - -.Link -https://github.com/microsoft/ARI/Extras/Charts.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 3.1.3 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($File, $TableStyle, $PlatOS, $Subscriptions, $Resources, $ExtractionRunTime, $ReportingRunTime, $RunLite) - -if(!$RunLite) - { - $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File - $Worksheets = $Excel.Workbook.Worksheets - - $Order = $Worksheets | Where-Object { $_.Name -notin 'Policy', 'Advisory', 'Security Center', 'Subscriptions', 'Quota Usage' } | Select-Object -Property Index, name, @{N = "Dimension"; E = { $_.dimension.Rows - 1 } } | Sort-Object -Property Dimension -Descending - - $Order0 = $Order | Where-Object { $_.Name -ne $Order[0].name -and $_.Name -ne ($Order | select-object -Last 1).Name } - - $Worksheets.MoveAfter($Order[0].Name, 'Advisory') - $Worksheets.MoveAfter($Order[0].Name, 'Policy') - $Worksheets.MoveBefore(($Order | select-object -Last 1).Name, 'Subscriptions') - - $Loop = 0 - - Foreach ($Ord in $Order0) { - if ($Ord.Index -and $Loop -ne 0) { - $Worksheets.MoveAfter($Ord.Name, $Order0[$Loop - 1].Name) - } - if ($Loop -eq 0) { - $Worksheets.MoveAfter($Ord.Name, $Order[0].Name) - } - $Loop++ - } - - $Excel.Save() - $Excel.Dispose() - } - -"" | Export-Excel -Path $File -WorksheetName 'Overview' -MoveToStart - - if($RunLite) - { - $excel = Open-ExcelPackage -Path $file -KillExcel - } - else - { - $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File - } - $Worksheets = $Excel.Workbook.Worksheets - $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } - - $WS.SetValue(75,70,'') - $WS.SetValue(76,70,'') - $WS.View.ShowGridLines = $false - - if($RunLite) - { - Close-ExcelPackage $excel - } - else - { - $Excel.Save() - $Excel.Dispose() - } - - - $TableStyleEx = if($PlatOS -eq 'PowerShell Desktop'){'Medium1'}else{$TableStyle} - $TableStyle = if($PlatOS -eq 'PowerShell Desktop'){'Medium15'}else{$TableStyle} - #$TableStyle = 'Medium22' - $Font = 'Segoe UI' - - if($RunLite) - { - $excel = Open-ExcelPackage -Path $file -KillExcel - } - else - { - $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File - } - $Worksheets = $Excel.Workbook.Worksheets | Where-Object { $_.name -notin 'Overview', 'Subscriptions', 'Advisory', 'Policy', 'Security Center' } - $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } - - - $TabDraw = $WS.Drawings.AddShape('TP00', 'RoundRect') - $TabDraw.SetSize(130 , 78) - $TabDraw.SetPosition(1, 0, 0, 0) - $TabDraw.TextAlignment = 'Center' - - - $Table = @() - Foreach ($WorkS in $Worksheets) { - $Number = $WorkS.Tables.Name.split('_') - $tmp = @{ - 'Name' = $WorkS.name; - 'Size' = [int]$Number[1] - } - $Table += $tmp - } - - if($RunLite) - { - Close-ExcelPackage $excel - } - else - { - $Excel.Save() - $Excel.Dispose() - } - - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 - - $Table | - ForEach-Object { [PSCustomObject]$_ } | Sort-Object -Property 'Size' -Descending | - Select-Object -Unique 'Name', - 'Size' | Export-Excel -Path $File -WorksheetName 'Overview' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzureTabs' -TableStyle $TableStyleEx -Style $Style -StartRow 6 -StartColumn 1 - - $Date = (get-date -Format "MM/dd/yyyy") - - $ExtractTime = if($ExtractionRunTime.Totalminutes -lt 1){($ExtractionRunTime.Seconds.ToString()+' Seconds')}else{($ExtractionRunTime.Totalminutes.ToString('#######.##')+' Minutes')} - $ReportTime = ($ReportingRunTime.Totalminutes.ToString('#######.##')+' Minutes') - - $User = $Subscriptions[0].user.name - $TotalRes = $Resources - - - if($RunLite) - { - $excel = Open-ExcelPackage -Path $file -KillExcel - } - else - { - $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File - } - $Worksheets = $Excel.Workbook.Worksheets - $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } - - - $cell = $WS.Cells | Where-Object {$_.Address -like 'A*' -and $_.Address -notin 'A1','A2','A3','A4','A5','A6'} - foreach ($item in $cell) { - $Works = $Item.Text - $Link = New-Object -TypeName OfficeOpenXml.ExcelHyperLink ("'"+$Works+"'"+'!A1'),$Works - $Item.Hyperlink = $Link - } - - - $Egg = $WS.Cells | Where-Object {$_.Address -eq 'BR75'} - $Egg.AddComment('Created with alot of effort and hard work, we hope you enjoy it.','.') | Out-Null - $Egg = $WS.Cells | Where-Object {$_.Address -eq 'BR76'} - $Egg.AddComment('By: Claudio Merola and Renato Gregio','.') | Out-Null - - - $TabDraw = $WS.Drawings.AddShape('TP0', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 52, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP1', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 55, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP2', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 58, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP3', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 61, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP4', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 64, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP5', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 67, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP6', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 70, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP7', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 73, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP8', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 76, 0) - $TabDraw.TextAlignment = 'Center' - - $TabDraw = $WS.Drawings.AddShape('TP9', 'RoundRect') - $TabDraw.SetSize(125, 25) - $TabDraw.SetPosition(0, 10, 79, 0) - $TabDraw.TextAlignment = 'Center' - - $Draw = $WS.Drawings.AddShape('ARI', 'RoundRect') - $Draw.SetSize(445, 240) - $Draw.SetPosition(1, 0, 2, 5) - - $txt = $Draw.RichText.Add('Azure Resource Inventory v3.1' + "`n") - $txt.Size = 14 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('https://github.com/microsoft/ARI' + "`n" + "`n") - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('Report Date: ') - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add($Date + "`n") - $txt.Size = 12 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('Extraction Time: ') - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add($ExtractTime + "`n") - $txt.Size = 12 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('Reporting Time: ') - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add($ReportTime + "`n") - $txt.Size = 12 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('User Session: ') - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add($User + "`n") - $txt.Size = 12 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add('Environment: ') - $txt.Size = 11 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $txt = $Draw.RichText.Add($PlatOS) - $txt.Size = 12 - $txt.ComplexFont = $Font - $txt.LatinFont = $Font - - $Draw.TextAlignment = 'Center' - - $RGD = $WS.Drawings.AddShape('RGs', 'RoundRect') - $RGD.SetSize(124, 115) - $RGD.SetPosition(21, 5, 9, 5) - $RGD.TextAlignment = 'Center' - $RGD.RichText.Add('Total Resources' + "`n").Size = 12 - $RGD.RichText.Add($TotalRes).Size = 22 - - - $DrawP00 = $WS.Drawings | Where-Object { $_.Name -eq 'TP00' } - $P00Name = 'Reported Resources' - $DrawP00.RichText.Add($P00Name).Size = 16 - - $DrawP0 = $WS.Drawings | Where-Object { $_.Name -eq 'TP0' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisory' }) { - $P0Name = 'Advisories' - } - else { - $P0Name = 'Public IPs' - } - $DrawP0.RichText.Add($P0Name) | Out-Null - - - $P1Name = 'Subscriptions' - $DrawP1 = $WS.Drawings | Where-Object { $_.Name -eq 'TP1' } - $DrawP1.RichText.Add($P1Name) | Out-Null - - - $DrawP2 = $WS.Drawings | Where-Object { $_.Name -eq 'TP2' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'SecurityCenter' }) { - $P2Name = 'Security Center' - } - elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisory' }) { - $P2Name = 'Annual Savings' - } - else { - $P2Name = 'Virtual Networks' - } - - $DrawP2.RichText.Add($P2Name) | Out-Null - - $DrawP3 = $WS.Drawings | Where-Object { $_.Name -eq 'TP3' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'AKS' }) { - $P3Name = 'Azure Kubernetes' - } - else { - $P3Name = 'Storage Accounts' - } - $DrawP3.RichText.Add($P3Name) | Out-Null - - $DrawP4 = $WS.Drawings | Where-Object { $_.Name -eq 'TP4' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Quota Usage' }) { - $P4Name = 'Quota Usage' - } - else { - $P4Name = 'VM Disks' - } - $DrawP4.RichText.Add($P4Name) | Out-Null - - $DrawP5 = $WS.Drawings | Where-Object { $_.Name -eq 'TP5' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { - $P5Name = 'Virtual Machines' - } - $DrawP5.RichText.Add($P5Name) | Out-Null - - $DrawP6 = $WS.Drawings | Where-Object { $_.Name -eq 'TP6' } - $P6Name = 'Resources by Location' - $DrawP6.RichText.Add($P6Name) | Out-Null - - $DrawP7 = $WS.Drawings | Where-Object { $_.Name -eq 'TP7' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { - $P7Name = 'Virtual Machines' - } - $DrawP7.RichText.Add($P7Name) | Out-Null - - $DrawP8 = $WS.Drawings | Where-Object { $_.Name -eq 'TP8' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisory' }) { - $P8Name = 'Advisories' - } - $DrawP8.RichText.Add($P8Name) | Out-Null - - $DrawP9 = $WS.Drawings | Where-Object { $_.Name -eq 'TP9' } - if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { - $P9Name = 'Virtual Machines' - } - $DrawP9.RichText.Add($P9Name) | Out-Null - - if($RunLite) - { - Close-ExcelPackage $excel - } - else - { - $Excel.Save() - $Excel.Dispose() - } - - - -$excel = Open-ExcelPackage -Path $file -KillExcel - -Add-ExcelChart -Worksheet $excel.Overview -ChartType Area3D -XRange "AzureTabs[Name]" -YRange "AzureTabs[Size]" -SeriesHeader 'Resources', 'Count' -Column 9 -Row 1 -Height 400 -Width 950 -RowOffSetPixels 0 -ColumnOffSetPixels 5 -NoLegend - - -if ($P0Name -eq 'Advisories') { - $PTParams = @{ - PivotTableName = "P0" - Address = $excel.Overview.cells["BA5"] # top-left corner of the table - SourceWorkSheet = $excel.Advisory - PivotRows = @("Category") - PivotData = @{"Category" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "BarStacked3D" - ChartRow = 13 # place the chart below row 22nd - ChartColumn = 2 - Activate = $true - PivotFilter = 'Impact' - ChartTitle = 'Advisories' - ShowPercent = $true - ChartHeight = 275 - ChartWidth = 445 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - Add-PivotTable @PTParams -NoLegend -} -else { - $PTParams = @{ - PivotTableName = "P0" - Address = $excel.Overview.cells["BA5"] # top-left corner of the table - SourceWorkSheet = $excel.'Public IPs' - PivotRows = @("Use") - PivotData = @{"Use" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "BarStacked3D" - ChartRow = 13 # place the chart below row 22nd - ChartColumn = 2 - Activate = $true - PivotFilter = 'location' - ChartTitle = 'Public IPs' - ShowPercent = $true - ChartHeight = 275 - ChartWidth = 445 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -NoLegend -} - -$PTParams = @{ - PivotTableName = "P1" - Address = $excel.Overview.cells["BD6"] # top-left corner of the table - SourceWorkSheet = $excel.Subscriptions - PivotRows = @("Subscription") - PivotData = @{"Resources" = "sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "BarClustered" - ChartRow = 27 # place the chart below row 22nd - ChartColumn = 2 - Activate = $true - PivotFilter = 'Resource Group', 'Resource Type' - ChartTitle = 'Resources by Subscription' - NoLegend = $true - ShowPercent = $true - ChartHeight = 655 - ChartWidth = 570 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 -} -Add-PivotTable @PTParams - - -if ($P2Name -eq 'Security Center') { - $PTParams = @{ - PivotTableName = "P2" - Address = $excel.Overview.cells["BG5"] # top-left corner of the table - SourceWorkSheet = $excel.SecurityCenter - PivotRows = @("Severity") - PivotData = @{"Resource Name" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 21 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - ChartTitle = 'Security Center' - PivotFilter = 'Categories' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -NoLegend -} -elseif ($P2Name -eq 'Annual Savings') { - $PTParams = @{ - PivotTableName = "P2" - Address = $excel.Overview.cells["BG5"] # top-left corner of the table - SourceWorkSheet = $excel.Advisory - PivotRows = @("Savings Currency") - PivotData = @{"Annual Savings" = "Sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 21 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - ChartTitle = 'Potential Savings' - PivotFilter = 'Savings Region' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - PivotNumberFormat = '#,##0.00' - } - - Add-PivotTable @PTParams -NoLegend -} -else { - $PTParams = @{ - PivotTableName = "P2" - Address = $excel.Overview.cells["BG5"] # top-left corner of the table - SourceWorkSheet = $excel.'Virtual Networks' - PivotRows = @("Location") - PivotData = @{"Location" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 21 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - ChartTitle = 'Virtual Networks' - PivotFilter = 'Subscription' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -NoLegend -} - - -if ($P3Name -eq 'Azure Kubernetes') { - $PTParams = @{ - PivotTableName = "P3" - Address = $excel.Overview.cells["BJ5"] # top-left corner of the table - SourceWorkSheet = $excel.AKS - PivotRows = @("Kubernetes Version") - PivotData = @{"Clusters" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "Pie3D" - ChartRow = 34 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - ChartTitle = 'AKS Versions' - PivotFilter = 'Node Size' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -} -else { - $PTParams = @{ - PivotTableName = "P3" - Address = $excel.Overview.cells["BJ5"] # top-left corner of the table - SourceWorkSheet = $excel.'Storage Acc' - PivotRows = @("Tier") - PivotData = @{"Tier" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "Pie3D" - ChartRow = 34 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - PivotFilter = 'SKU' - ChartTitle = 'Storage Accounts' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -} - - - -if ($P4Name -eq 'Quota Usage') { - $PTParams = @{ - PivotTableName = "P4" - Address = $excel.Overview.cells["BM5"] # top-left corner of the table - SourceWorkSheet = $excel.'Quota Usage' - PivotRows = @("Region") - PivotData = @{"vCPUs Available" = "Sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 47 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - PivotFilter = 'Limit' - ChartTitle = 'Available Quota (vCPUs)' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -NoLegend -} -else { - $PTParams = @{ - PivotTableName = "P4" - Address = $excel.Overview.cells["BM5"] # top-left corner of the table - SourceWorkSheet = $excel.Disks - PivotRows = @("Disk State") - PivotData = @{"Disk State" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 47 # place the chart below row 22nd - ChartColumn = 11 - Activate = $true - PivotFilter = 'SKU' - ChartTitle = 'VM Disks' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -NoLegend -} - - - -if ($P5Name -eq 'Virtual Machines') { - $PTParams = @{ - PivotTableName = "P5" - Address = $excel.Overview.cells["BP7"] # top-left corner of the table - SourceWorkSheet = $excel.'Virtual Machines' - PivotRows = @("VM Size") - PivotData = @{"Resource U" = "Sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "BarClustered" - ChartRow = 21 # place the chart below row 22nd - ChartColumn = 16 - Activate = $true - NoLegend = $true - ChartTitle = 'Virtual Machines by Serie' - PivotFilter = 'OS Type', 'Location', 'Power State' - ShowPercent = $true - ChartHeight = 775 - ChartWidth = 502 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 5 - } - - Add-PivotTable @PTParams -} - -$PTParams = @{ - PivotTableName = "P6" - Address = $excel.Overview.cells["BS5"] # top-left corner of the table - SourceWorkSheet = $excel.Subscriptions - PivotRows = @("Location") - PivotData = @{"Resources" = "sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "ColumnStacked3D" - ChartRow = 1 # place the chart below row 22nd - ChartColumn = 24 - Activate = $true - PivotFilter = 'Resource Type' - ChartTitle = 'Resources by Location' - NoLegend = $true - ShowPercent = $true - ChartHeight = 400 - ChartWidth = 315 - ChartRowOffSetPixels = 0 - ChartColumnOffSetPixels = 0 -} - -Add-PivotTable @PTParams - - -if ($P7Name -eq 'Virtual Machines') { - $PTParams = @{ - PivotTableName = "P7" - Address = $excel.Overview.cells["BV5"] # top-left corner of the table - SourceWorkSheet = $excel.'Virtual Machines' - PivotRows = @("OS Type") - PivotData = @{"Resource U" = "Sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "Pie3D" - ChartRow = 21 # place the chart below row 22nd - ChartColumn = 24 - Activate = $true - NoLegend = $true - ChartTitle = 'VMs by OS' - PivotFilter = 'Location' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 0 - } - - Add-PivotTable @PTParams -} - -if ($P8Name -eq 'Advisories') { - $PTParams = @{ - PivotTableName = "P8" - Address = $excel.Overview.cells["BY5"] # top-left corner of the table - SourceWorkSheet = $excel.Advisory - PivotRows = @("Impact") - PivotData = @{"Impact" = "Count" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "BarStacked3D" - ChartRow = 34 - ChartColumn = 24 - Activate = $true - PivotFilter = 'Category' - ChartTitle = 'Advisories' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 0 - } - Add-PivotTable @PTParams -NoLegend -} - -if ($P9Name -eq 'Virtual Machines') { - $PTParams = @{ - PivotTableName = "P9" - Address = $excel.Overview.cells["CB5"] # top-left corner of the table - SourceWorkSheet = $excel.'Virtual Machines' - PivotRows = @("Boot Diagnostics") - PivotData = @{"Resource U" = "Sum" } - PivotTableStyle = $tableStyle - IncludePivotChart = $true - ChartType = "Pie3D" - ChartRow = 47 - ChartColumn = 24 - Activate = $true - NoLegend = $true - ChartTitle = 'Boot Diagnostics' - PivotFilter = 'Location' - ShowPercent = $true - ChartHeight = 255 - ChartWidth = 315 - ChartRowOffSetPixels = 5 - ChartColumnOffSetPixels = 0 - } - - Add-PivotTable @PTParams -} - - - -Close-ExcelPackage $excel - - -if(!$RunLite) - { - $application = New-Object -ComObject Excel.Application - if ($application) { - $Ex = $application.Workbooks.Open($File) - Start-Sleep -Seconds 2 - $WS = $ex.Worksheets | Where-Object { $_.Name -eq 'Overview' } - - $NoChangeChart = ('ChartP0', 'ChartP1', 'ChartP2', 'ChartP3', 'ChartP4', 'ChartP5', 'ChartP6', 'ChartP7', 'ChartP8', 'ChartP9', 'ARI', 'RGs', 'TP00', 'TP0', 'TP1', 'TP2', 'TP3', 'TP4', 'TP5','TP6','TP7','TP8','TP9') - $ChangeChart = ('ARI', 'RGs', 'TP00', 'TP0', 'TP1', 'TP2', 'TP3', 'TP4', 'TP5', 'TP6', 'TP7','TP8','TP9') - - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP0' }).DrawingObject.Chart.ChartStyle = 294 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP1' }).DrawingObject.Chart.ChartStyle = 222 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP2' }).DrawingObject.Chart.ChartStyle = 294 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP3' }).DrawingObject.Chart.ChartStyle = 268 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP4' }).DrawingObject.Chart.ChartStyle = 294 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP5' }).DrawingObject.Chart.ChartStyle = 222 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP6' }).DrawingObject.Chart.ChartStyle = 294 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP7' }).DrawingObject.Chart.ChartStyle = 268 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP8' }).DrawingObject.Chart.ChartStyle = 294 - ($WS.Shapes | Where-Object { $_.name -eq 'ChartP9' }).DrawingObject.Chart.ChartStyle = 268 - ($WS.Shapes | Where-Object { $_.name -notin $NoChangeChart -and $_.name -like 'Chart*' }).DrawingObject.Chart.ChartStyle = 315 - - Foreach ($Changer in $ChangeChart) { - ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.interior.color = 2500134 - ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.color = 16777215 - ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.ColorIndex = -4142 - ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.LineStyle = -4142 - } - - #$WS.Cells.Interior.Color = 0 - - $Draw = ($WS.Shapes | Where-Object {$_.name -eq 'ARI'}) - $Draw.Adjustments(1) = 0.07 - - $Ex.Save() - $Ex.Close() - $application.Quit() - Get-Process -Name "excel" -ErrorAction Ignore | Stop-Process - } - } - diff --git a/Extras/DrawIODiagram.ps1 b/Extras/DrawIODiagram.ps1 deleted file mode 100644 index c5b77ff..0000000 --- a/Extras/DrawIODiagram.ps1 +++ /dev/null @@ -1,5945 +0,0 @@ -<# -.Synopsis -Diagram Module for Draw.io - -.DESCRIPTION -This script process and creates a Draw.io Diagram based on resources present in the extraction variable $Resources. - -.Link -https://github.com/microsoft/ARI/Extras/DrawIODiagram.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 3.1.15 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($Subscriptions, $Resources, $Advisories, $DDFile, $DiagramCache, $FullEnvironment, $ResourceContainers) - -$Global:DiagramCache = $DiagramCache - -$Global:FullEnvironment = $FullEnvironment - -$TempPath = $DiagramCache.split("DiagramCache\")[0] - -$Global:Logfile = ($TempPath+'DiagramLogFile.log') - -Function Network { - Param($Subscriptions,$Resources,$Advisories,$DiagramCache,$FullEnvironment,$DDFile,$XMLFiles) - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Network Diagram Job...') | Out-File -FilePath $LogFile -Append - - Start-Job -Name 'Diagram_NetworkTopology' -ScriptBlock { - - $Global:jobs = @() - $Global:jobs2 = @() - $Global:Subscriptions = $($args[0]) - $Global:Resources = $($args[1]) - $Global:Advisories = $($args[2]) - $Global:DiagramCache = $($args[3]) - $Global:FullEnvironment = $($args[4]) - $Global:DDFile = $($args[5]) - $Global:XMLFiles = $($args[6]) - $Global:Logfile = $($args[7]) - - Function Icon { - Param($Style,$x,$y,$w,$h,$p) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', $Style) - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function VNETContainer { - Param($x,$y,$w,$h,$title) - $Global:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;swimlaneFillColor=#D5E8D4;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function HubContainer { - Param($x,$y,$w,$h,$title) - $Global:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;swimlaneFillColor=#DAE8FC;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function BrokenContainer { - Param($x,$y,$w,$h,$title) - $Global:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#fad9d5;strokeColor=#ae4132;swimlaneFillColor=#FAD9D5;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Connect { - Param($Source,$Target,$Parent) - - if($Parent){$Parent = $Parent}else{$Parent = 1} - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - $Global:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") - $Global:XmlWriter.WriteAttributeString('edge', "1") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $Parent) - $Global:XmlWriter.WriteAttributeString('source', $Source) - $Global:XmlWriter.WriteAttributeString('target', $Target) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('relative', "1") - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - } - - <# Function to create the Visio document and import each stencil #> - Function Stensils { - $Global:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" - - $Global:IconConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" - $Global:IconExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" - $Global:IconVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" - $Global:IconVGW2 = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" - $Global:IconVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" - $Global:IconTraffic = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Local_Network_Gateways.svg;" #width="68" height="68" - $Global:IconNIC = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;" #width="68" height="60" - $Global:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" - $Global:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" - $Global:IconNSG = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Network_Security_Groups.svg;" # width="26.35" height="32" - $Global:IconUDR = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Route_Tables.svg;" #width="30.97" height="30" - $Global:IconDDOS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;" # width="23" height="28" - $Global:IconPIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" - $Global:IconNAT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/NAT.svg;" # width="65" height="52" - - <########################## Azure Generic Stencils #############################> - - $Global:SymError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="50" height="50" - $Global:SymInfo = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Information.svg;" #width="64" height="64" - $Global:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" - $GLobal:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" - $Global:IconBastions = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/general/Launch_Portal.svg;" #width="68" height="67" - $Global:IconContain = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Container_Instances.svg;" #width="64" height="68" - $Global:IconVWAN = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_WANs.svg;" #width="65" height="64" - $Global:IconCostMGMT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Cost_Analysis.svg;" #width="60" height="70" - - <########################## Azure Computing Stencils #############################> - - $Global:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" - $Global:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" - $Global:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" - $Global:IconARO = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/mscae/OpenShift.svg;" #width="50" height="46" - $Global:IconFunApps = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Function_Apps.svg;" # width="68" height="60" - - <########################## Azure Service Stencils #############################> - - $Global:IconAPIMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/app_services/API_Management_Services.svg;" #width="65" height="60" - $Global:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" - - <########################## Azure Storage Stencils #############################> - - $Global:IconNetApp = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;" #width="65" height="52" - - <########################## Azure Storage Stencils #############################> - - $Global:IconDataExplorer = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" #width="68" height="68" - - <########################## Other Stencils #############################> - - $Global:IconFWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;" #width="71" height="60" - $Global:IconDet = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/other/Detonation.svg;" #width="42.63" height="44" - $Global:IconAppGWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;" #width="64" height="64" - $Global:IconBricks = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;" #width="60" height="68" - $Global:IconError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="30" height="30" - $Global:OnPrem = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/mscae/Exchange_On_premises_Access.svg;" #width="168.2" height="290" - $Global:Signature = "aspect=fixed;html=1;points=[];align=left;image;fontSize=22;image=img/lib/azure2/general/Dev_Console.svg;" #width="27.5" height="22" - $Global:CloudOnly = "aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;" #width="380.77" height="275" - - } - - <# Function to begin OnPrem environment drawing. Will begin by Local network Gateway, then Express Route.#> - Function OnPremNet { - $Global:VNETHistory = @() - $Global:RoutsW = $AZVNETs | Select-Object -Property Name, @{N="Subnets";E={$_.properties.subnets.properties.addressPrefix.count}} | Sort-Object -Property Subnets -Descending - - $Global:Alt = 0 - - ##################################### Local Network Gateway ############################################# - - foreach($GTW in $AZLGWs) - { - if($GTW.properties.provisioningState -ne 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'This Local Network Gateway has Errors') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconError 40 ($Global:Alt+25) "25" "25" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Con1 = $AZCONs | Where-Object {$_.properties.localNetworkGateway2.id -eq $GTW.id} - - if(!$Con1 -and $GTW.properties.provisioningState -eq 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'No Connections were found in this Local Network Gateway') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SymInfo 40 ($Global:Alt+30) "20" "20" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Name = $GTW.name - $IP = $GTW.properties.gatewayIpAddress - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name + "`n" + [string]$IP)) - $Global:XmlWriter.WriteAttributeString('Local_Address_Space', [string]$GTW.properties.localNetworkAddressSpace.addressPrefixes) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconTraffic 50 $Global:Alt "67" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:GTWAddress = ($Global:CellID+'-'+($Global:IDNum-1)) - $Global:ConnSourceResource = 'GTW' - - OnPrem $Con1 - - $Global:Alt = $Global:Alt + 150 - } - - ##################################### ERS ############################################# - - Foreach($ERs in $AZEXPROUTEs) - { - if($ERs.properties.provisioningState -ne 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'This Express Route has Errors') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconError 51 ($Global:Alt+25) "25" "25" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Con1 = $AZCONs | Where-Object {$_.properties.peer.id -eq $ERs.id} - - if(!$Con1 -and $ERs.properties.circuitProvisioningState -eq 'Enabled') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'No Connections were found in this Express Route') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SymInfo 51 ($Global:Alt+30) "20" "20" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Name = $ERs.name - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" +[string]$Name)) - $Global:XmlWriter.WriteAttributeString('Provider', [string]$ERs.properties.serviceProviderProperties.serviceProviderName) - $Global:XmlWriter.WriteAttributeString('Peering_location', [string]$ERs.properties.serviceProviderProperties.peeringLocation) - $Global:XmlWriter.WriteAttributeString('Bandwidth', [string]$ERs.properties.serviceProviderProperties.bandwidthInMbps) - $Global:XmlWriter.WriteAttributeString('SKU', [string]$ERs.sku.tier) - $Global:XmlWriter.WriteAttributeString('Billing_model', $ERs.sku.family) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconExpressRoute "61.5" $Global:Alt "44" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:ERAddress = ($Global:CellID+'-'+($Global:IDNum-1)) - $Global:ConnSourceResource = 'ER' - - OnPrem $Con1 - - $Global:Alt = $Global:Alt + 150 - - } - - ##################################### VWAN VPNSITES ############################################# - - foreach($GTW in $AZVPNSITES) - { - if($GTW.properties.provisioningState -ne 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'This VPN Site has Errors') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconError 40 ($Global:Alt+25) "25" "25" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $wan1 = $AZVWAN | Where-Object {$_.properties.vpnSites.id -eq $GTW.id} - - if(!$wan1 -and $GTW.properties.provisioningState -eq 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'No vWANs were found in this VPN Site') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SymInfo 40 ($Global:Alt+30) "20" "20" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Name = $GTW.name - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name)) - $Global:XmlWriter.WriteAttributeString('Address_Space', [string]$GTW.properties.addressSpace.addressPrefixes) - $Global:XmlWriter.WriteAttributeString('Link_Speed_In_Mbps', [string]$GTW.properties.deviceProperties.linkSpeedInMbps) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconNAT 50 $Global:Alt "67" "40" 1 - - $Global:XmlWriter.WriteEndElement() - #$tt = $tt + 200 - - vWan $wan1 - - $Global:Alt = $Global:Alt + 150 - } - - ##################################### VWAN ERs ############################################# - - foreach($GTW in $AZVERs) - { - if($GTW.properties.provisioningState -ne 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'This Express Route Circuit has Errors') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconError 40 ($Global:Alt+25) "25" "25" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $wan1 = $AZVWAN | Where-Object {$_.properties.vpnSites.id -eq $GTW.id} - - if(!$wan1 -and $GTW.properties.provisioningState -eq 'Succeeded') - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Status', 'No vWANs were found in this Express Route Circuit') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SymInfo 40 ($Global:Alt+30) "20" "20" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Name = $GTW.name - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name)) - $Global:XmlWriter.WriteAttributeString('Address_Space', [string]$GTW.properties.addressSpace.addressPrefixes) - $Global:XmlWriter.WriteAttributeString('LinkSpeed_In_Mbps', [string]$GTW.properties.deviceProperties.linkSpeedInMbps) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconNAT 50 $Global:Alt "67" "40" 1 - - $Global:XmlWriter.WriteEndElement() - #$tt = $tt + 200 - - vWan $wan1 - - $Global:Alt = $Global:Alt + 150 - } - - ##################################### LABELs ############################################# - - if(!$Global:FullEnvironment) - { - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Ret -520 -100 "500" ($Global:Alt + 100) 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ('On Premises'+ "`n" +'Environment')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $OnPrem -351 (($Global:Alt + 100)/2) "168.2" "290" 1 - - $Global:XmlWriter.WriteEndElement() - - label - - Icon $Signature -520 ($Global:Alt + 100) "27.5" "22" 1 - - $Global:XmlWriter.WriteEndElement() - } - - } - - Function OnPrem { - Param($Con1) - foreach ($Con2 in $Con1) - { - if([string]::IsNullOrEmpty($Global:vnetLoc)) - { - $Global:vnetLoc = 700 - } - $VGT = $AZVGWs | Where-Object {$_.id -eq $Con2.properties.virtualNetworkGateway1.id} - $VGTPIP = $PIPs | Where-Object {$_.properties.ipConfiguration.id -eq $VGT.properties.ipConfigurations.id} - - $Name2 = $Con2.Name - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', [string]$Name2) - $Global:XmlWriter.WriteAttributeString('Connection_Type', [string]$Con2.properties.connectionType) - $Global:XmlWriter.WriteAttributeString('Use_Azure_Private_IP_Address', [string]$Con2.properties.useLocalAzureIpAddress) - $Global:XmlWriter.WriteAttributeString('Routing_Weight', [string]$Con2.properties.routingWeight) - $Global:XmlWriter.WriteAttributeString('Connection_Protocol', [string]$Con2.properties.connectionProtocol) - $Global:Source = ($Global:CellID+'-'+($Global:IDNum-1)) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconConnections 250 $Global:Alt "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - if($Global:ConnSourceResource -eq 'ER') - { - Connect $Global:ERAddress $Global:Target - } - elseif($Global:ConnSourceResource -eq 'GTW') - { - Connect $Global:GTWAddress $Global:Target - } - - $Global:Source = $Global:Target - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" +[string]$VGT.Name + "`n" + [string]$VGTPIP.properties.ipAddress)) - $Global:XmlWriter.WriteAttributeString('VPN_Type', [string]$VGT.properties.vpnType) - $Global:XmlWriter.WriteAttributeString('Generation', [string]$VGT.properties.vpnGatewayGeneration ) - $Global:XmlWriter.WriteAttributeString('SKU', [string]$VGT.properties.sku.name) - $Global:XmlWriter.WriteAttributeString('Gateway_Type', [string]$VGT.properties.gatewayType) - $Global:XmlWriter.WriteAttributeString('Active_active_mode', [string]$VGT.properties.activeActive) - $Global:XmlWriter.WriteAttributeString('Gateway_Private_IPs', [string]$VGT.properties.enablePrivateIpAddress) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVGW2 425 ($Global:Alt-4) "31.34" "48" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - Connect $Global:Source $Global:Target - - $Global:Source = $Global:Target - - foreach($AZVNETs2 in $AZVNETs) - { - foreach($VNETTEMP in $AZVNETs2.properties.subnets.properties.ipconfigurations.id) - { - $VV4 = $VNETTEMP.Split("/") - $VNETTEMP1 = ($VV4[0] + '/' + $VV4[1] + '/' + $VV4[2] + '/' + $VV4[3] + '/' + $VV4[4] + '/' + $VV4[5] + '/' + $VV4[6] + '/' + $VV4[7]+ '/' + $VV4[8]) - if($VNETTEMP1 -eq $VGT.id) - { - $Global:VNET2 = $AZVNETs2 - - $Global:Alt0 = $Global:Alt - if($VNET2.id -notin $VNETHistory.vnet) - { - if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) - { - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' - }Else{ - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) - if($VNET2.properties.dhcpoptions.dnsServers) - { - $Global:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - else - { - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVNET 600 $Global:Alt "65" "39" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:VNETDrawID = ($Global:CellID+'-'+($Global:IDNum-1)) - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - Connect $Global:Source $Global:Target - - if($VNET2.properties.enableDdosProtection -eq $true) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDDOS 580 ($Global:Alt + 15) "23" "28" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Global:Source = $Global:Target - - VNETCreator $Global:VNET2 - - if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) - { - PeerCreator $Global:VNET2 - } - - $tmp =@{ - 'VNETid' = $Global:VNETDrawID; - 'VNET' = $AZVNETs2.id - } - $Global:VNETHistory += $tmp - - } - else - { - - $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $AZVNETs2.id} - - Connect $Global:Source $VNETDID.VNETid - - } - - } - } - - } - - if($Con1.count -gt 1) - { - $Global:Alt = $Global:Alt + 250 - } - } - - } - - Function vWan { - Param($wan1) - - if([string]::IsNullOrEmpty($Global:vnetLoc)) - { - $Global:vnetLoc = 700 - } - - $Name2 = $wan1.Name - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', [string]$Name2) - $Global:XmlWriter.WriteAttributeString('allow_VnetToVnet_Traffic', [string]$wan1.properties.allowVnetToVnetTraffic) - $Global:XmlWriter.WriteAttributeString('allow_BranchToBranch_Traffic', [string]$wan1.properties.allowBranchToBranchTraffic) - $Global:Source = ($Global:CellID+'-'+($Global:IDNum-1)) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVWAN 250 $Global:Alt "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - Connect $Global:Source $Global:Target - - $Global:Source1 = $Global:Target - - foreach ($Con2 in $wan1.properties.virtualHubs.id) - { - $VHUB = $AZVHUB | Where-Object {$_.id -eq $Con2} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ("`n" +[string]$VHUB.Name)) - $Global:XmlWriter.WriteAttributeString('Address_Prefix', [string]$VHUB.properties.addressPrefix) - $Global:XmlWriter.WriteAttributeString('Preferred_Routing_Gateway', [string]$VHUB.properties.preferredRoutingGateway) - $Global:XmlWriter.WriteAttributeString('Virtual_Router_Asn', [string]$VHUB.properties.virtualRouterAsn) - $Global:XmlWriter.WriteAttributeString('Allow_BranchToBranch_Traffic', [string]$VHUB.properties.allowBranchToBranchTraffic) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVWAN 425 $Global:Alt "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - Connect $Global:Source1 $Global:Target - - $Global:Source = $Global:Target - - foreach($AZVNETs2 in $AZVNETs) - { - foreach($VNETTEMP in $AZVNETs2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) - { - $VV4 = $VNETTEMP.Split("/") - $VNETTEMP1 = $VV4[8] - if($VNETTEMP1 -like ('HV_'+$VHUB.name+'_*')) - { - $Global:VNET2 = $AZVNETs2 - - $Global:Alt0 = $Global:Alt - if($VNET2.id -notin $VNETHistory.vnet) - { - if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) - { - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' - }Else{ - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) - if($VNET2.properties.dhcpoptions.dnsServers) - { - $Global:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - else - { - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVNET 600 $Global:Alt "65" "39" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:VNETDrawID = ($Global:CellID+'-'+($Global:IDNum-1)) - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - Connect $Global:Source $Global:Target - - if($VNET2.properties.enableDdosProtection -eq $true) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDDOS 580 ($Global:Alt + 15) "23" "28" 1 - - $Global:XmlWriter.WriteEndElement() - } - - VNETCreator $Global:VNET2 - - if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id -and $VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id -notlike ('*/HV_'+$VHUB.name+'_*')) - { - PeerCreator $Global:VNET2 - } - - $tmp =@{ - 'VNETid' = $Global:VNETDrawID; - 'VNET' = $AZVNETs2.id - } - $Global:VNETHistory += $tmp - - } - else - { - $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $AZVNETs2.id} - - Connect $Global:Source $VNETDID.VNETid - } - } - } - } - - if($Con1.count -gt 1) - { - $Global:Alt = $Global:Alt + 250 - } - } - - } - - <# Function for Cloud Only Environments #> - Function CloudOnly { - $Global:RoutsW = $AZVNETs | Select-Object -Property Name, @{N="Subnets";E={$_.properties.subnets.properties.addressPrefix.count}} | Sort-Object -Property Subnets -Descending - - $Global:VNETHistory = @() - if([string]::IsNullOrEmpty($Global:vnetLoc)) - { - $Global:vnetLoc = 700 - } - $Global:Alt = 2 - - foreach($AZVNETs2 in $AZVNETs) - { - $Global:VNET2 = $AZVNETs2 - - $Global:Alt0 = $Global:Alt - if($VNET2.id -notin $VNETHistory.vnet) - { - - if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) - { - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' - }Else{ - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) - if($VNET2.properties.dhcpoptions.dnsServers) - { - $Global:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - else - { - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVNET 600 $Global:Alt "65" "39" 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:VNETDrawID = ($Global:CellID+'-'+($Global:IDNum-1)) - - $Global:Target = ($Global:CellID+'-'+($Global:IDNum-1)) - - if($VNET2.properties.enableDdosProtection -eq $true) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDDOS 580 ($Global:Alt + 15) "23" "28" 1 - - $Global:XmlWriter.WriteEndElement() - } - - $Global:Source = $Global:Target - - VNETCreator $Global:VNET2 - - if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) - { - PeerCreator $Global:VNET2 - } - - $tmp =@{ - 'VNETid' = $Global:VNETDrawID; - 'VNET' = $AZVNETs2.id - } - $Global:VNETHistory += $tmp - - } - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Ret -520 -100 "500" ($Global:Alt + 100) 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ('Cloud Only'+ "`n" +'Environment')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Global:CloudOnly -460 (($Global:Alt + 100)/2) "380" "275" 1 - - $Global:XmlWriter.WriteEndElement() - - label - - Icon $Signature -520 ($Global:Alt + 100) "27.5" "22" 1 - - $Global:XmlWriter.WriteEndElement() - - } - - Function FullEnvironment { - foreach($AZVNETs2 in $AZVNETs) - { - $Global:VNET2 = $AZVNETs2 - - if($VNET2.id -notin $VNETHistory.vnet) - { - if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) - { - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' - }Else{ - $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) - if($VNET2.properties.dhcpoptions.dnsServers) - { - $Global:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - else - { - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) - } - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVNET 600 $Global:Alt "65" "39" 1 - - $Global:XmlWriter.WriteEndElement() - - VNETCreator $Global:VNET2 - - if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) - { - PeerCreator $Global:VNET2 - } - } - - $Global:Alt = $Global:Alt + 250 - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Ret -520 -100 "500" ($Global:Alt + 100) 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ('On Premises'+ "`n" +'Environment')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $OnPrem -351 (($Global:Alt + 100)/2) "168.2" "290" 1 - - $Global:XmlWriter.WriteEndElement() - - label - - Icon $Signature -520 ($Global:Alt + 100) "27.5" "22" 1 - - $Global:XmlWriter.WriteEndElement() - - } - - <# Function for VNET creation #> - Function VNETCreator { - Param($VNET2) - $Global:sizeL = $VNET2.properties.subnets.properties.addressPrefix.count - - [System.GC]::GetTotalMemory($true) | out-null - - if($VNET2.id -notin $VNETHistory.vnet) - { - if ($Global:sizeL -gt 5) - { - $Global:sizeL = $Global:sizeL / 2 - $Global:sizeL = [math]::ceiling($Global:sizeL) - $Global:sizeC = $Global:sizeL - $Global:sizeL = (($Global:sizeL * 210) + 30) - - if('gatewaysubnet' -in $VNET2.properties.subnets.name) - { - HubContainer ($Global:vnetLoc) ($Global:Alt0 - 20) $Global:sizeL "490" $VNET2.Name - } - else - { - VNETContainer ($Global:vnetLoc) ($Global:Alt0 - 20) $Global:sizeL "490" $VNET2.Name - } - - - - $Global:VNETSquare = ($Global:CellID+'-'+($Global:IDNum-1)) - - $SubName = $Subscriptions | Where-Object {$_.id -eq $VNET2.subscriptionId} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $SubName.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconSubscription $Global:sizeL 460 "67" "40" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $ADVS = '' - $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} - If($ADVS) - { - $Count = 1 - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - foreach ($ADV in $ADVS) - { - $Attr1 = ('Recommendation'+[string]$Count) - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconCostMGMT ($Global:sizeL + 150) 460 "30" "35" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - } - - Subnet ($Global:vnetLoc + 15) $VNET2 $Global:IDNum $Global:DiagramCache $Global:ContID - - if($Global:VNETPIP) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $Count = 1 - Foreach ($PIPDetail in $Global:VNETPIP) - { - $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) - $Global:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDet ($Global:sizeL + 500) 225 "42.63" "44" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - Connect ($Global:CellID+'-'+($Global:IDNum-1)) $Global:ContID $Global:ContID - } - - $Global:Alt = $Global:Alt + 650 - } - else - { - $Global:sizeL = (($Global:sizeL * 210) + 30) - - if('gatewaysubnet' -in $VNET2.properties.subnets.name) - { - HubContainer ($Global:vnetLoc) ($Global:Alt0 - 15) $Global:sizeL "260" $VNET2.Name - } - else - { - VNETContainer ($Global:vnetLoc) ($Global:Alt0 - 15) $Global:sizeL "260" $VNET2.Name - } - - - $Global:VNETSquare = ($Global:CellID+'-'+($Global:IDNum-1)) - - $SubName = $Subscriptions | Where-Object {$_.id -eq $VNET2.subscriptionId} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $SubName.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconSubscription $Global:sizeL 225 "67" "40" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $ADVS = '' - $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} - If($ADVS) - { - $Count = 1 - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - foreach ($ADV in $ADVS) - { - $Attr1 = ('Recommendation'+[string]$Count) - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconCostMGMT ($Global:sizeL + 150) 225 "30" "35" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - } - - Subnet ($Global:vnetLoc + 15) $VNET2 $Global:IDNum $Global:DiagramCache $Global:ContID - - if($Global:VNETPIP) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $Count = 1 - Foreach ($PIPDetail in $Global:VNETPIP) - { - $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) - $Global:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDet ($Global:sizeL + 500) 107 "42.63" "44" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - Connect ($Global:CellID+'-'+($Global:IDNum-1)) $Global:ContID $Global:ContID - } - $Global:Alt = $Global:Alt + 350 - } - } - - [System.GC]::GetTotalMemory($true) | out-null - } - - <# Function for create peered VNETs #> - Function PeerCreator { - Param($VNET2) - - $Global:vnetLoc1 = $Global:Alt - - Foreach ($Peer in $VNET2.properties.virtualNetworkPeerings) - { - $VNETSUB = $AZVNETs | Where-Object {$_.id -eq $Peer.properties.remoteVirtualNetwork.id} - - if($VNETSUB.id -in $VNETHistory.VNET) - { - $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $VNETSUB.id} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Peering_Name', $Peer.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") - $Global:XmlWriter.WriteAttributeString('edge', "1") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - $Global:XmlWriter.WriteAttributeString('source', $Global:VNETDrawID) - $Global:XmlWriter.WriteAttributeString('target', $VNETDID.VNETid) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('relative', "1") - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - else - { - $Global:sizeL = $VNETSUB.properties.subnets.properties.addressPrefix.count - $BrokenVNET = if($VNETSUB.properties.subnets.properties.addressPrefix.count){'Not Broken'}else{'Broken'} - - if($VNETSUB.properties.addressSpace.addressPrefixes.count -ge 10) - { - $AddSpace = ($VNETSUB.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' - }Else{ - $AddSpace = ($VNETSUB.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) - } - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ($VNETSUB.name + "`n" + $AddSpace)) - if($VNETSUB.properties.dhcpoptions.dnsServers) - { - $Global:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNETSUB.properties.dhcpoptions.dnsServers) - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNETSUB.properties.enableDdosProtection) - } - else - { - $Global:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNETSUB.properties.enableDdosProtection) - } - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVNET $Global:vnetLoc $Global:vnetLoc1 "67" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - - $TwoTarget = ($Global:CellID+'-'+($Global:IDNum-1)) - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('Peering_Name', $Peer.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") - $Global:XmlWriter.WriteAttributeString('edge', "1") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - $Global:XmlWriter.WriteAttributeString('source', $Global:Source) - $Global:XmlWriter.WriteAttributeString('target', $TwoTarget) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('relative', "1") - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - - if($VNETSUB.properties.enableDdosProtection -eq $true) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDDOS ($Global:vnetLoc - 20) ($Global:vnetLoc1 + 15) "23" "28" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - if ($Global:sizeL -gt 5) - { - $Global:sizeL = $Global:sizeL / 2 - $Global:sizeL = [math]::ceiling($Global:sizeL) - $Global:sizeC = $Global:sizeL - $Global:sizeL = (($Global:sizeL * 210) + 30) - - if('gatewaysubnet' -in $VNETSUB.properties.subnets.name) - { - HubContainer ($Global:vnetLoc + 100) ($Global:vnetLoc1 - 20) $Global:sizeL "490" $VNETSUB.name - } - else - { - VNETContainer ($Global:vnetLoc + 100) ($Global:vnetLoc1 - 20) $Global:sizeL "490" $VNETSUB.name - } - - $Global:VNETSquare = ($Global:CellID+'-'+($Global:IDNum-1)) - - $SubName = $Subscriptions | Where-Object {$_.id -eq $VNETSUB.subscriptionId} - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $SubName.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconSubscription $Global:sizeL 460 "67" "40" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $ADVS = '' - $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} - If($ADVS) - { - $Count = 1 - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - foreach ($ADV in $ADVS) - { - $Attr1 = ('Recommendation'+[string]$Count) - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconCostMGMT ($Global:sizeL + 150) 460 "30" "35" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - } - - Subnet ($Global:vnetLoc + 120) $VNETSUB $Global:IDNum $Global:DiagramCache $Global:ContID - - $Global:vnetLoc1 = $Global:vnetLoc1 + 230 - - if($Global:VNETPIP) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $Count = 1 - Foreach ($PIPDetail in $Global:VNETPIP) - { - $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) - $Global:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDet ($Global:sizeL + 500) 225 "42.63" "44" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - Connect ($Global:CellID+'-'+($Global:IDNum-1)) $Global:ContID $Global:ContID - } - - $Global:Alt = $Global:Alt + 650 - } - else - { - $Global:sizeL = (($Global:sizeL * 210) + 30) - - if($BrokenVNET -eq 'Not Broken') - { - if('gatewaysubnet' -in $VNETSUB.properties.subnets.name) - { - HubContainer ($Global:vnetLoc + 100) ($Global:vnetLoc1 - 20) $Global:sizeL "260" $VNETSUB.name - } - else - { - VNETContainer ($Global:vnetLoc + 100) ($Global:vnetLoc1 - 20) $Global:sizeL "260" $VNETSUB.name - } - } - else - { - BrokenContainer ($Global:vnetLoc + 100) ($Global:vnetLoc1 - 20) "250" "260" 'Broken Peering' - $Global:sizeL = '250' - } - - $Global:VNETSquare = ($Global:CellID+'-'+($Global:IDNum-1)) - - $SubName = $Subscriptions | Where-Object {$_.id -eq $VNETSUB.subscriptionId} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $SubName.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconSubscription $Global:sizeL 225 "67" "40" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $ADVS = '' - $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} - If($ADVS) - { - $Count = 1 - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - foreach ($ADV in $ADVS) - { - $Attr1 = ('Recommendation'+[string]$Count) - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconCostMGMT ($Global:sizeL + 150) 225 "30" "35" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - } - - Subnet ($Global:vnetLoc + 120) $VNETSUB $Global:IDNum $Global:DiagramCache $Global:ContID - - if($Global:VNETPIP) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $Count = 1 - Foreach ($PIPDetail in $Global:VNETPIP) - { - $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') - $Global:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) - $Global:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) - - $Count ++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconDet ($Global:sizeL+ 500) 107 "42.63" "44" $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - Connect ($Global:CellID+'-'+($Global:IDNum-1)) $Global:ContID $Global:ContID - - } - - } - - $tmp =@{ - 'VNETid' = $TwoTarget; - 'VNET' = $VNETSUB.id - } - $Global:VNETHistory += $tmp - - $Global:vnetLoc1 = $Global:vnetLoc1 + 350 - } - } - $Global:Alt = $Global:vnetLoc1 - } - - Function Subnet { - Param($subloc,$VNET,$IDNum,$DiagramCache,$ContID) - - $NameString = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - New-Variable -Name ('Run_'+$NameString) -Scope Global - - Set-Variable -name ('Run_'+$NameString) -Value ([PowerShell]::Create()).AddScript({param($subloc,$VNET,$IDNum,$DiagramCache,$ContID,$Resources) - - $etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $IDNum++ - - $SubFile = ($DiagramCache+$CellID+'.xml') - - ###################################################### STENCILS #################################################### - - Function Stensils { - $Global:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" - - $Global:IconConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" - $Global:IconExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" - $Global:IconVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" - $Global:IconVGW2 = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" - $Global:IconVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" - $Global:IconTraffic = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Local_Network_Gateways.svg;" #width="68" height="68" - $Global:IconNIC = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;" #width="68" height="60" - $Global:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" - $Global:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" - $Global:IconNSG = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Network_Security_Groups.svg;" # width="26.35" height="32" - $Global:IconUDR = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Route_Tables.svg;" #width="30.97" height="30" - $Global:IconDDOS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;" # width="23" height="28" - $Global:IconPIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" - $Global:IconNAT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/NAT.svg;" # width="65" height="52" - - <########################## Azure Generic Stencils #############################> - - $Global:SymError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="50" height="50" - $Global:SymInfo = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Information.svg;" #width="64" height="64" - $Global:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" - $GLobal:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" - $Global:IconBastions = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/general/Launch_Portal.svg;" #width="68" height="67" - $Global:IconContain = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Container_Instances.svg;" #width="64" height="68" - $Global:IconVWAN = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_WANs.svg;" #width="65" height="64" - $Global:IconCostMGMT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Cost_Analysis.svg;" #width="60" height="70" - - <########################## Azure Computing Stencils #############################> - - $Global:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" - $Global:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" - $Global:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" - $Global:IconARO = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/mscae/OpenShift.svg;" #width="50" height="46" - $Global:IconFunApps = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Function_Apps.svg;" # width="68" height="60" - - <########################## Azure Service Stencils #############################> - - $Global:IconAPIMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/app_services/API_Management_Services.svg;" #width="65" height="60" - $Global:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" - - <########################## Azure Storage Stencils #############################> - - $Global:IconNetApp = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;" #width="65" height="52" - - <########################## Azure Storage Stencils #############################> - - $Global:IconDataExplorer = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" #width="68" height="68" - - <########################## Other Stencils #############################> - - $Global:IconFWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;" #width="71" height="60" - $Global:IconDet = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/other/Detonation.svg;" #width="42.63" height="44" - $Global:IconAppGWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;" #width="64" height="64" - $Global:IconBricks = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;" #width="60" height="68" - $Global:IconError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="30" height="30" - $Global:OnPrem = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/mscae/Exchange_On_premises_Access.svg;" #width="168.2" height="290" - $Global:Signature = "aspect=fixed;html=1;points=[];align=left;image;fontSize=22;image=img/lib/azure2/general/Dev_Console.svg;" #width="27.5" height="22" - $Global:CloudOnly = "aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;" #width="380.77" height="275" - - } - - ####################################################### PROCTYPE #################################################### - - - Function ProcType { - Param($sub,$subloc,$Alt0,$ContainerID) - - $temp = '' - remove-variable TrueTemp -ErrorAction SilentlyContinue - remove-variable RESNames -ErrorAction SilentlyContinue - - <####################################################### FIND THE RESOURCES IN THE SUBNET ###################################################################> - - if($sub.properties.resourceNavigationLinks.properties.linkedResourceType -eq 'Microsoft.ApiManagement/service') - { - $TrueTemp = 'APIM' - } - if($sub.properties.serviceAssociationLinks.properties.link -and $null -eq $TrueTemp) - { - if($sub.properties.serviceAssociationLinks.properties.link.split("/")[6] -eq 'Microsoft.Web') - { - $TrueTemp = 'App Service' - } - } - if($sub.properties.applicationGatewayIPConfigurations.id -and $null -eq $TrueTemp) - { - if($sub.properties.applicationGatewayIPConfigurations.id.split("/")[7] -eq 'applicationGateways') - { - $TrueTemp = 'applicationGateways' - } - } - if($sub.properties.ipconfigurations.id.count -eq 1 -and $null -eq $TrueTemp) - { - if($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'virtualNetworkGateways') - { - $TrueTemp = 'virtualNetworkGateways' - } - elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'loadBalancers') - { - $TrueTemp = 'loadBalancers' - } - elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'applicationGateways') - { - $TrueTemp = 'applicationGateways' - } - elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'bastionHosts') - { - $TrueTemp = 'bastionHosts' - } - elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'azureFirewalls') - { - $TrueTemp = 'azureFirewalls' - } - } - if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Databricks/workspaces' -and $null -eq $TrueTemp) - { - $TrueTemp = 'DataBricks' - } - if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Web/serverfarms' -and $null -eq $TrueTemp) - { - $TrueTemp = 'App Service' - } - if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.ContainerInstance/containerGroups' -and $null -eq $TrueTemp) - { - $TrueTemp = 'Container Instance' - } - if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Netapp/volumes' -and $null -eq $TrueTemp) - { - $TrueTemp = 'NetApp' - } - if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Kusto/clusters' -and $null -eq $TrueTemp) - { - $TrueTemp = 'Data Explorer Clusters' - } - - if([string]::IsNullOrEmpty($TrueTemp)) - { - $AKS = $Global:AKS - if($sub.id -in $AKS.properties.agentPoolProfiles.vnetSubnetID) - { - $TrueTemp = 'AKS' - } - } - if([string]::IsNullOrEmpty($TrueTemp)) - { - $Types = @() - - Foreach($type in $sub.properties.ipconfigurations.id) - { - if($type.Split("/")[8] -like 'aks-*') - { - $Types += 'AKS' - } - if($type.Split("/")[8] -like 'gwhost*') - { - $Types += 'APIM' - } - else - { - $Types += $type.Split("/")[7] - } - } - $temp = $Types | Group-Object | Sort-Object -Property Count -Descending - if($temp) - { - $TrueTemp = $temp[0].name - } - } - - if([string]::IsNullOrEmpty($TrueTemp)) - { - if ($sub.id -in ($Global:VMSS).properties.virtualMachineProfile.networkprofile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id) - { - $TrueTemp = 'virtualMachineScaleSets' - } - } - - <#################################################### FIND RESOURCE NAME AND DETAILS #################################################################> - - if($TrueTemp -eq 'networkInterfaces') - { - $NIcNames = $Global:NIC | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id} - - if($sub.properties.privateEndpoints.id) - { - $PrivEndNames = $Global:PrivEnd | Where-Object {$_.properties.networkInterfaces.id -in $NIcNames.id} - $TrueTemp = 'privateLinkServices' - $RESNames = $PrivEndNames - } - else - { - $VMNamesAro = $Global:VM | Where-Object {$_.properties.networkprofile.networkInterfaces.id -in $NIcNames.id} - if($VMNamesAro.properties.storageprofile.imageReference.offer -like 'aro*') - { - $ARONames = $Global:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} - $TrueTemp = 'Open Shift' - $RESNames = $ARONames - } - if($TrueTemp -ne 'Open Shift') - { - $VMs = @() - $VMNames = ($Global:VM).properties.networkprofile.networkInterfaces.id | Where-Object {$_ -in $NIcNames.id} - $VMs = foreach($NIC in $VMNames) - { - $Global:VM| Where-Object {$NIC -in $_.properties.networkprofile.networkInterfaces.id} - } - if($VMs) - { - $TrueTemp = 'Virtual Machine' - $RESNames = $VMs - } - } - if($TrueTemp -eq 'networkInterfaces') - { - $TrueTemp = 'Network Interface' - $RESNames = $NIcNames - } - } - } - if($TrueTemp -eq 'AKS') - { - $AKSNames = $Global:AKS | Where-Object {$_.properties.agentPoolProfiles.vnetSubnetID -eq $sub.id} - $RESNames = $AKSNames - } - if($TrueTemp -eq 'Data Explorer Clusters') - { - $KustoNames = $Global:Kusto | Where-Object {$_.properties.virtualNetworkConfiguration.subnetid -eq $sub.id} - $RESNames = $KustoNames - } - if($TrueTemp -eq 'applicationGateways') - { - $AppGTWNames = $Global:AppGtw| Where-Object {$_.properties.gatewayIPConfigurations.id -in $sub.properties.applicationGatewayIPConfigurations.id} - $RESNames = $AppGTWNames - } - if($TrueTemp -eq 'DataBricks') - { - $DatabriksNames = @() - $Databricks = $Global:Databricks - $DatabriksNames = Foreach($Data in $Databricks) - { - if($Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.customPrivateSubnetName.value -eq $sub.id -or $Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.custompublicSubnetName.value -eq $sub.id) - { - $Data - } - } - $RESNames = $DatabriksNames - } - if($TrueTemp -eq 'App Service') - { - $Apps = $Global:AppWeb | Where-Object {$_.properties.virtualNetworkSubnetId -eq $Sub.id} - if($Apps.kind -like 'functionapp*') - { - $FuntionAppNames = $Apps - $TrueTemp = 'Function App' - $RESNames = $FuntionAppNames - } - else - { - $ServiceAppNames = $Apps - $RESNames = $Apps - } - } - if($TrueTemp -eq 'APIM') - { - $APIMNames = $Global:APIM | Where-Object {$_.properties.virtualNetworkConfiguration.subnetResourceId -eq $sub.id} - $RESNames = $APIMNames - } - if($TrueTemp -eq 'loadBalancers') - { - $LBNames = $Global:LB | Where-Object {$_.properties.frontendIPConfigurations.id -in $sub.properties.ipconfigurations.id} - $RESNames = $LBNames - } - if($TrueTemp -eq 'virtualMachineScaleSets') - { - $VMSSNames = $Global:VMSS | Where-Object {$_.properties.virtualMachineProfile.networkProfile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id } - $RESNames = $VMSSNames - } - if($TrueTemp -eq 'virtualNetworkGateways') - { - $VPNGTWNames = $Global:AZVGWs | Where-Object {$_.properties.ipconfigurations.properties.subnet.id -eq $sub.id } - $RESNames = $VPNGTWNames - } - if($TrueTemp -eq 'bastionHosts') - { - $BastionNames = $Global:Bastion | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } - $RESNames = $BastionNames - } - if($TrueTemp -eq 'azureFirewalls') - { - $AzFWNames = $Global:FW | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } - $RESNames = $AzFWNames - } - if($TrueTemp -eq 'Container Instance') - { - $ContainerNames = '' - $ContNICs = $Global:NetProf | Where-Object {$_.properties.containerNetworkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id} - $ContainerNames = $Global:Container | Where-Object {$_.properties.networkprofile.id -in $ContNICs.id} - $RESNames = $ContainerNames - if([string]::IsNullOrEmpty($ContainerNames)) - { - $ARONames = $Global:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} - $TrueTemp = 'Open Shift' - $RESNames = $ARONames - } - } - if($TrueTemp -eq 'NetApp') - { - $NetAppNames = $Global:ANF | Where-Object {$_.properties.subnetId -eq $sub.id } - $RESNames = $NetAppNames - } - - <###################################################### DROP THE ICONS ######################################################> - - switch ($TrueTemp) - { - 'Virtual Machine' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' VMs')) - - $Count = 1 - foreach ($VMName in $RESNames.Name) - { - $Attr1 = ('VirtualMachine-'+[string]("{0:d3}" -f $Count)) - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$VMName) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVMs ($subloc+64) ($Alt0+40) "69" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - $Global:XmlTempWriter.WriteAttributeString('VM_Size', [string]$RESNames.properties.hardwareProfile.vmSize) - $Global:XmlTempWriter.WriteAttributeString('OS', [string]$RESNames.properties.storageProfile.osDisk.osType) - $Global:XmlTempWriter.WriteAttributeString('OS_Disk_Size_GB', [string]$RESNames.properties.storageProfile.osDisk.diskSizeGB) - $Global:XmlTempWriter.WriteAttributeString('Image_Publisher', [string]$RESNames.properties.storageProfile.imageReference.publisher) - $Global:XmlTempWriter.WriteAttributeString('Image_SKU', [string]$RESNames.properties.storageProfile.imageReference.sku) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVMs ($subloc+64) ($Alt0+40) "69" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - 'AKS' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' AKS Clusters')) - - $Count = 1 - foreach ($AKSName in $RESNames.Name) - { - $Attr1 = ('Kubernetes_Cluster-'+[string]("{0:d3}" -f $Count)) - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$AKSName) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAKS ($subloc+65) ($Alt0+40) "68" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) - - $Count = 1 - foreach($Pool in $RESNames.properties.agentPoolProfiles) - { - $Attr1 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Count') - $Attr3 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Size') - $Attr4 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Version') - $Attr5 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Mode') - $Attr6 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Max_Pods') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$Pool.name) - $Global:XmlTempWriter.WriteAttributeString($Attr2, [string]($Pool | Select-Object -Property 'count').count) - $Global:XmlTempWriter.WriteAttributeString($Attr3, [string]$Pool.vmSize) - $Global:XmlTempWriter.WriteAttributeString($Attr4, [string]$Pool.orchestratorVersion) - $Global:XmlTempWriter.WriteAttributeString($Attr5, [string]$Pool.mode) - $Global:XmlTempWriter.WriteAttributeString($Attr6, [string]$Pool.maxPods) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAKS ($subloc+65) ($Alt0+40) "68" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - 'virtualMachineScaleSets' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Machine Scale Sets')) - - $Count = 1 - foreach ($ResName in $RESNames.Name) - { - $Attr1 = ('VMSS-'+[string]("{0:d3}" -f $Count)) - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVMSS ($subloc+65) ($Alt0+40) "68" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) - - $Global:XmlTempWriter.WriteAttributeString('VMSS_Name', [string]$RESNames.name) - $Global:XmlTempWriter.WriteAttributeString('Instances', [string]$temp[0].Count) - $Global:XmlTempWriter.WriteAttributeString('VMSS_SKU_Tier', [string]$RESNames.sku.tier) - $Global:XmlTempWriter.WriteAttributeString('VMSS_Upgrade_Policy', [string]$RESNames.Properties.upgradePolicy.mode) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVMSS ($subloc+65) ($Alt0+40) "68" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'loadBalancers' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Load Balancers')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('LB-'+[string]("{0:d3}" -f $Count)+'-SKU') - $Attr3 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Backends') - $Attr4 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Frontends') - $Attr5 = ('LB-'+[string]("{0:d3}" -f $Count)+'-LB_Rules') - $Attr6 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Probes') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - $Global:XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.sku.name) - $Global:XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.backendAddressPools.properties.backendIPConfigurations.id.count) - $Global:XmlTempWriter.WriteAttributeString($Attr4, [string]$ResName.properties.frontendIPConfigurations.properties.count) - $Global:XmlTempWriter.WriteAttributeString($Attr5, [string]$ResName.properties.loadBalancingRules.count) - $Global:XmlTempWriter.WriteAttributeString($Attr6, [string]$ResName.properties.probes.count) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconLBs ($subloc+65) ($Alt0+40) "72" "72" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $Global:XmlTempWriter.WriteAttributeString('Load_Balancer_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Load_Balancer_SKU', [string]$ResNames.sku.name) - $Global:XmlTempWriter.WriteAttributeString('Backends', [string]$ResNames.properties.backendAddressPools.properties.backendIPConfigurations.id.count) - $Global:XmlTempWriter.WriteAttributeString('Frontends', [string]$ResNames.properties.frontendIPConfigurations.properties.count) - $Global:XmlTempWriter.WriteAttributeString('LB_Rules', [string]$ResNames.properties.loadBalancingRules.count) - $Global:XmlTempWriter.WriteAttributeString('Probes', [string]$ResNames.properties.probes.count) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconLBs ($subloc+65) ($Alt0+40) "72" "72" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - 'virtualNetworkGateways' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Network Gateways')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Network_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVGW ($subloc+80) ($Alt0+40) "52" "69" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconVGW ($subloc+80) ($Alt0+40) "52" "69" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'azureFirewalls' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Firewalls')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-SKU') - $Attr3 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Threat_Intel_Mode') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - $Global:XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.properties.sku.tier) - $Global:XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.threatIntelMode) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconFWs ($subloc+65) ($Alt0+40) "71" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) - - - $Global:XmlTempWriter.WriteAttributeString('Firewall_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.properties.sku.tier) - $Global:XmlTempWriter.WriteAttributeString('Threat_Intel_Mode', [string]$ResNames.properties.threatIntelMode) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconFWs ($subloc+65) ($Alt0+40) "71" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'privateLinkServices' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Private Endpoints')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('PVE-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconPVTs ($subloc+65) ($Alt0+40) "72" "66" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconPVTs ($subloc+65) ($Alt0+40) "72" "66" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'applicationGateways' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Application Gateways')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') - $Attr2 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-SKU') - $Attr3 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Min_Capacity') - $Attr4 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Max_Capacity') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - $Global:XmlTempWriter.WriteAttributeString($Attr2, [string]$RESName.Properties.sku.tier) - $Global:XmlTempWriter.WriteAttributeString($Attr3, [string]$RESName.Properties.autoscaleConfiguration.minCapacity) - $Global:XmlTempWriter.WriteAttributeString($Attr4, [string]$RESName.Properties.autoscaleConfiguration.maxCapacity) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAppGWs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $Global:XmlTempWriter.WriteAttributeString('App_Gateway_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('App_Gateway_SKU', [string]$RESNames.Properties.sku.tier) - $Global:XmlTempWriter.WriteAttributeString('Autoscale_Min_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.minCapacity) - $Global:XmlTempWriter.WriteAttributeString('Autoscale_Max_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.maxCapacity) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAppGWs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'bastionHosts' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Bastion Hosts')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Bastion-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconBastions ($subloc+65) ($Alt0+40) "68" "67" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconBastions ($subloc+65) ($Alt0+40) "68" "67" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - 'APIM' { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $APIMHost = [string]($RESNames.properties.hostnameConfigurations | Where-Object {$_.defaultSslBinding -eq $true}).hostname - - $Global:XmlTempWriter.WriteAttributeString('APIM_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.sku.name) - $Global:XmlTempWriter.WriteAttributeString('VNET_Type', [string]$RESNames.properties.virtualNetworkType) - $Global:XmlTempWriter.WriteAttributeString('Default_Hostname', $APIMHost) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAPIMs ($subloc+65) ($Alt0+40) "65" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - 'App Service' { - if($ServiceAppNames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' App Services')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('AppService-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAPPs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) - - $Global:XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) - $Global:XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) - $Global:XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) - $Global:XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) - $Global:XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) - $Global:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) - $Global:XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) - $Global:XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) - $Global:XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) - - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconAPPs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - } - 'Function App' { - if($FuntionAppNames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Function Apps')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('FunctionApp-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconFunApps ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) - - $Global:XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) - $Global:XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) - $Global:XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) - $Global:XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) - $Global:XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) - $Global:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) - $Global:XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) - $Global:XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) - $Global:XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconFunApps ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - } - 'DataBricks' { - if($DatabriksNames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Databricks')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Databrick-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconBricks ($subloc+65) ($Alt0+40) "60" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $Global:XmlTempWriter.WriteAttributeString('Databrick_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Workspace_URL', [string]$RESNames.properties.workspaceUrl ) - $Global:XmlTempWriter.WriteAttributeString('Pricing_Tier', [string]$RESNames.sku.name) - $Global:XmlTempWriter.WriteAttributeString('Storage_Account', [string]$RESNames.properties.parameters.storageAccountName.value) - $Global:XmlTempWriter.WriteAttributeString('Storage_Account_SKU', [string]$RESNames.properties.parameters.storageAccountSkuName.value) - $Global:XmlTempWriter.WriteAttributeString('Relay_Namespace', [string]$RESNames.properties.parameters.relayNamespaceName.value) - $Global:XmlTempWriter.WriteAttributeString('Require_Infrastructure_Encryption', [string]$RESNames.properties.parameters.requireInfrastructureEncryption.value) - $Global:XmlTempWriter.WriteAttributeString('Enable_Public_IP', [string]$RESNames.properties.parameters.enableNoPublicIp.value) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconBricks ($subloc+65) ($Alt0+40) "60" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - } - 'Open Shift' { - if($ARONames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' OpenShift Clusters')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('OpenShift_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconARO ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - - $Global:XmlTempWriter.WriteAttributeString('ARO_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('OpenShift_Version', [string]$RESNames.properties.clusterProfile.version) - $Global:XmlTempWriter.WriteAttributeString('OpenShift_Console', [string]$RESNames.properties.consoleProfile.url) - $Global:XmlTempWriter.WriteAttributeString('Worker_VM_Count', [string]$RESNames.properties.workerprofiles.Count) - $Global:XmlTempWriter.WriteAttributeString('Worker_VM_Size', [string]$RESNames.properties.workerprofiles.vmSize[0]) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconARO ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - } - 'Container Instance' { - if($ContainerNames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Container Intances')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Container_Intance-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconContain ($subloc+65) ($Alt0+40) "64" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconContain ($subloc+65) ($Alt0+40) "64" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - } - 'NetApp' { - if($NetAppNames) - { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' NetApp Volumes')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('NetApp_Volume-'+[string]("{0:d3}" -f $Count)) - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconNetApp ($subloc+65) ($Alt0+40) "65" "52" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]1+' NetApp Volume')) - $Global:XmlTempWriter.WriteAttributeString('NetApp_Volume_Name', [string]$ResName.name) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconNetApp ($subloc+65) ($Alt0+40) "65" "52" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - } - 'Data Explorer Clusters' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Data Explorer Clusters')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('Data_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconDataExplorer ($subloc+65) ($Alt0+40) "68" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) - $Global:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_Name', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_URI', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_State', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('Computer_Specifications', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('AutoScale_Enabled', [string]$ResNames.name) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconDataExplorer ($subloc+65) ($Alt0+40) "68" "68" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - } - 'Network Interface' { - if($RESNames.count -gt 1) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Network Interfaces')) - - $Count = 1 - foreach ($ResName in $RESNames) - { - $Attr1 = ('NIC-'+[string]("{0:d3}" -f $Count)+'-Name') - - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Count ++ - } - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconNIC ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - else - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ([string]1+' Network Interface')) - - $Attr1 = ('NIC-Name') - $Global:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) - - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconNIC ($subloc+65) ($Alt0+40) "68" "60" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - } - '' {} - default {} - } - if($sub.properties.networkSecurityGroup.id) - { - $NSG = $sub.properties.networkSecurityGroup.id.split('/')[8] - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', '') - $Global:XmlTempWriter.WriteAttributeString('Network_Security_Group', [string]$NSG) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconNSG ($subloc+160) ($Alt0+15) "26.35" "32" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - } - if($sub.properties.routeTable.id) - { - $UDR = $sub.properties.routeTable.id.split('/')[8] - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', '') - $Global:XmlTempWriter.WriteAttributeString('Route_Table', [string]$UDR) - $Global:XmlTempWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon2 $IconUDR ($subloc+15) ($Alt0+15) "30.97" "30" $ContainerID - - $Global:XmlTempWriter.WriteEndElement() - - } - if($sub.properties.ipconfigurations.id) - { - Foreach($SubIPs in $sub.properties.ipconfigurations) - { - $Global:VNETPIP += $Global:CleanPIPs | Where-Object {$_.properties.ipConfiguration.id -eq $SubIPs.id} - } - } - } - - ######################################################### ICON ####################################################### - - Function Icon2 { - Param($Style,$x,$y,$w,$h,$p) - - $Global:XmlTempWriter.WriteStartElement('mxCell') - $Global:XmlTempWriter.WriteAttributeString('style', $Style) - $Global:XmlTempWriter.WriteAttributeString('vertex', "1") - $Global:XmlTempWriter.WriteAttributeString('parent', $p) - - $Global:XmlTempWriter.WriteStartElement('mxGeometry') - $Global:XmlTempWriter.WriteAttributeString('x', $x) - $Global:XmlTempWriter.WriteAttributeString('y', $y) - $Global:XmlTempWriter.WriteAttributeString('width', $w) - $Global:XmlTempWriter.WriteAttributeString('height', $h) - $Global:XmlTempWriter.WriteAttributeString('as', "geometry") - $Global:XmlTempWriter.WriteEndElement() - - $Global:XmlTempWriter.WriteEndElement() - } - - ######################################################## SUBNET ####################################################### - - Stensils - - $Global:XmlTempWriter = New-Object System.XMl.XmlTextWriter($SubFile,$Null) - - $Global:XmlTempWriter.Formatting = 'Indented' - $Global:XmlTempWriter.Indentation = 2 - - $Global:XmlTempWriter.WriteStartDocument() - - $Global:XmlTempWriter.WriteStartElement('mxfile') - $Global:XmlTempWriter.WriteAttributeString('host', 'Electron') - $Global:XmlTempWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') - $Global:XmlTempWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') - $Global:XmlTempWriter.WriteAttributeString('etag', $etag) - $Global:XmlTempWriter.WriteAttributeString('version', '15.4.0') - $Global:XmlTempWriter.WriteAttributeString('type', 'device') - - $Global:XmlTempWriter.WriteStartElement('diagram') - $Global:XmlTempWriter.WriteAttributeString('id', $DiagID) - $Global:XmlTempWriter.WriteAttributeString('name', 'Network Topology') - - $Global:XmlTempWriter.WriteStartElement('mxGraphModel') - $Global:XmlTempWriter.WriteAttributeString('dx', "1326") - $Global:XmlTempWriter.WriteAttributeString('dy', "798") - $Global:XmlTempWriter.WriteAttributeString('grid', "1") - $Global:XmlTempWriter.WriteAttributeString('gridSize', "10") - $Global:XmlTempWriter.WriteAttributeString('guides', "1") - $Global:XmlTempWriter.WriteAttributeString('tooltips', "1") - $Global:XmlTempWriter.WriteAttributeString('connect', "1") - $Global:XmlTempWriter.WriteAttributeString('arrows', "1") - $Global:XmlTempWriter.WriteAttributeString('fold', "1") - $Global:XmlTempWriter.WriteAttributeString('page', "1") - $Global:XmlTempWriter.WriteAttributeString('pageScale', "1") - $Global:XmlTempWriter.WriteAttributeString('pageWidth', "850") - $Global:XmlTempWriter.WriteAttributeString('pageHeight', "1100") - $Global:XmlTempWriter.WriteAttributeString('math', "0") - $Global:XmlTempWriter.WriteAttributeString('shadow', "0") - - $Global:XmlTempWriter.WriteStartElement('root') - - $Global:XmlTempWriter.WriteStartElement('mxCell') - $Global:XmlTempWriter.WriteAttributeString('id', "0") - $Global:XmlTempWriter.WriteEndElement() - - $Global:XmlTempWriter.WriteStartElement('mxCell') - $Global:XmlTempWriter.WriteAttributeString('id', "1") - $Global:XmlTempWriter.WriteAttributeString('parent', "0") - $Global:XmlTempWriter.WriteEndElement() - - $sizeL = $VNET.properties.subnets.properties.addressPrefix.count - if ($sizeL -gt 5) - { - $sizeL = $sizeL / 2 - $sizeL = [math]::ceiling($sizeL) - $sizeC = $sizeL - $sizeL = (($sizeL * 210) + 30) - - $subloc0 = 20 - $SubC = 0 - $alt1 = 40 - $Global:VNETPIP = @() - foreach($Sub in $VNET.properties.subnets) - { - if ($SubC -eq $sizeC) - { - $Alt1 = $Alt1 + 230 - $subloc0 = 20 - $SubC = 0 - } - - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) - $Global:XmlTempWriter.WriteAttributeString('id', ($CellID+'-'+($IDNum++))) - - Icon2 "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $subloc0 $Alt1 "200" "200" $ContID - - $Global:XmlTempWriter.WriteEndElement() - - ProcType $sub $subloc0 $Alt1 $ContID - - $subloc = $subloc + 210 - $subloc0 = $subloc0 + 210 - $SubC ++ - } - - } - Else - { - $sizeL = (($sizeL * 210) + 30) - $subloc0 = 20 - $Global:VNETPIP = @() - foreach($Sub in $VNET.properties.subnets) - { - $Global:XmlTempWriter.WriteStartElement('object') - $Global:XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) - $Global:XmlTempWriter.WriteAttributeString('id', ($CellID+'-'+($IDNum++))) - - Icon2 "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $subloc0 40 "200" "200" $ContID - - $Global:XmlTempWriter.WriteEndElement() - - ProcType $sub $subloc0 40 $ContID - - $subloc = $subloc + 210 - $subloc0 = $subloc0 + 210 - } - } - - $Global:XmlTempWriter.WriteEndElement() - - $Global:XmlTempWriter.WriteEndElement() - - $Global:XmlTempWriter.WriteEndElement() - $Global:XmlTempWriter.WriteEndElement() - - $Global:XmlTempWriter.WriteEndDocument() - $Global:XmlTempWriter.Flush() - $Global:XmlTempWriter.Close() - - }).AddArgument($subloc).AddArgument($VNET).AddArgument($IDNum).AddArgument($DiagramCache).AddArgument($ContID).AddArgument($Resources) - - New-Variable -Name ('Job_'+$NameString) -Scope Global - - Set-Variable -Name ('Job_'+$NameString) -Value ((get-variable -name ('Run_'+$NameString)).Value).BeginInvoke() - - $Global:jobs2 += (get-variable -name ('Job_'+$NameString)).Value - - $Global:jobs += $NameString - - #New-Variable -Name ('End_'+$NameString) - #Set-Variable -Name ('End_'+$NameString) -Value (((get-variable -name ('Run_'+$NameString)).Value).EndInvoke((get-variable -name ('Job_'+$NameString)).Value)) - - #((get-variable -name ('Run_'+$NameString)).Value).Dispose() - - #while ($Job.Runspace.IsCompleted -contains $false) {} - - KillJobs - - } - - Function KillJobs { - - foreach($job in $Global:jobs) - { - if((get-variable -name ('Job_'+$job) -Scope Global).Value.IsCompleted -eq $true) - { - #((get-variable -name ('Run_'+$job)).Value).EndInvoke((get-variable -name ('Job_'+$job)).Value) - ((get-variable -name ('Run_'+$job)).Value).Dispose() - Remove-Variable -Name ('Run_'+$job) -Scope Global -Force - Remove-Variable -Name ('Job_'+$job) -Scope Global -Force - } - } - } - - <# Function to create the Label of Version #> - Function label { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ('Powered by:'+ "`n" +'Azure Resource Inventory v3.0'+ "`n" +'https://github.com/microsoft/ARI')) - $Global:XmlWriter.WriteAttributeString('author', 'Claudio Merola') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - } - - Function Icon { - Param($Style,$x,$y,$w,$h,$p) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', $Style) - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Container { - Param($x,$y,$w,$h,$title) - $Global:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Connect { - Param($Source,$Target,$Parent) - - if($Parent){$Parent = $Parent}else{$Parent = 1} - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - $Global:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") - $Global:XmlWriter.WriteAttributeString('edge', "1") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $Parent) - $Global:XmlWriter.WriteAttributeString('source', $Source) - $Global:XmlWriter.WriteAttributeString('target', $Target) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('relative', "1") - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - } - - Function Variables0 { - Start-Job -Name 'DiagramVariables' -ScriptBlock { - $job = @() - - $AZVGWs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualnetworkgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZLGWs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/localnetworkgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVNETs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualnetworks'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZCONs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/connections'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZEXPROUTEs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/expressroutecircuits'} | Select-Object -Property * -Unique }).AddArgument($($args[0])) - $PIPs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/publicipaddresses'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVWAN = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualwans'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVHUB = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualhubs'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVPNSITES = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/vpnsites'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVERs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/expressroutegateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - - $AZAKS = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.containerservice/managedclusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVMSS = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Compute/virtualMachineScaleSets'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZNIC = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/networkinterfaces'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZPrivEnd = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/privateendpoints'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZVM = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.compute/virtualmachines'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZARO = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.redhatopenshift/openshiftclusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZKusto = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Kusto/clusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZAppGW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/applicationgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZDW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Databricks/workspaces'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZAppWeb = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.web/sites'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZAPIM = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.ApiManagement/service'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZLB = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/loadbalancers'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZBastion = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/bastionhosts'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZFW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/azurefirewalls'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZNetProf = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/networkprofiles'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZCont = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.ContainerInstance/containerGroups'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - $AZANF = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.netapp/netappaccounts/capacitypools/volumes'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) - - $jobAZVGWs = $AZVGWs.BeginInvoke() - $jobAZLGWs = $AZLGWs.BeginInvoke() - $jobAZVNETs = $AZVNETs.BeginInvoke() - $jobAZCONs = $AZCONs.BeginInvoke() - $jobAZEXPROUTEs = $AZEXPROUTEs.BeginInvoke() - $jobPIPs = $PIPs.BeginInvoke() - $jobAZVWAN = $AZVWAN.BeginInvoke() - $jobAZVHUB = $AZVHUB.BeginInvoke() - $jobAZVERs = $AZVERs.BeginInvoke() - $jobAZVPNSITES = $AZVPNSITES.BeginInvoke() - $jobAZAKS = $AZAKS.BeginInvoke() - $jobAZVMSS = $AZVMSS.BeginInvoke() - $jobAZNIC = $AZNIC.BeginInvoke() - $jobAZPrivEnd = $AZPrivEnd.BeginInvoke() - $jobAZVM = $AZVM.BeginInvoke() - $jobAZARO = $AZARO.BeginInvoke() - $jobAZKusto = $AZKusto.BeginInvoke() - $jobAZAppGW = $AZAppGW.BeginInvoke() - $jobAZDW = $AZDW.BeginInvoke() - $jobAZAppWeb = $AZAppWeb.BeginInvoke() - $jobAZAPIM = $AZAPIM.BeginInvoke() - $jobAZLB = $AZLB.BeginInvoke() - $jobAZBastion = $AZBastion.BeginInvoke() - $jobAZFW = $AZFW.BeginInvoke() - $jobAZNetProf = $AZNetProf.BeginInvoke() - $jobAZCont = $AZCont.BeginInvoke() - $jobAZANF = $AZANF.BeginInvoke() - - $job += $jobAZVGWs - $job += $jobAZLGWs - $job += $jobAZVNETs - $job += $jobAZCONs - $job += $jobAZEXPROUTEs - $job += $jobPIPs - $job += $jobAZVWAN - $job += $jobAZVHUB - $job += $jobAZVPNSITES - $job += $jobAZVERs - $job += $jobAZAKS - $job += $jobAZVMSS - $job += $jobAZNIC - $job += $jobAZPrivEnd - $job += $jobAZVM - $job += $jobAZARO - $job += $jobAZKusto - $job += $jobAZAppGW - $job += $jobAZDW - $job += $jobAZAppWeb - $job += $jobAZAPIM - $job += $jobAZLB - $job += $jobAZBastion - $job += $jobAZFW - $job += $jobAZNetProf - $job += $jobAZCont - $job += $jobAZANF - - while ($Job.Runspace.IsCompleted -contains $false) {} - - $AZVGWsS = $AZVGWs.EndInvoke($jobAZVGWs) - $AZLGWsS = $AZLGWs.EndInvoke($jobAZLGWs) - $AZVNETsS = $AZVNETs.EndInvoke($jobAZVNETs) - $AZCONsS = $AZCONs.EndInvoke($jobAZCONs) - $AZEXPROUTEsS = $AZEXPROUTEs.EndInvoke($jobAZEXPROUTEs) - $PIPsS = $PIPs.EndInvoke($jobPIPs) - $AZVWANS = $AZVWAN.EndInvoke($jobAZVWAN) - $AZVHUBS = $AZVHUB.EndInvoke($jobAZVHUB) - $AZVPNSITESS = $AZVPNSITES.EndInvoke($jobAZVPNSITES) - $AZVERsS = $AZVERs.EndInvoke($jobAZVERs) - $AZAKSs = $AZAKS.EndInvoke($jobAZAKS) - $AZVMSSs = $AZVMSS.EndInvoke($jobAZVMSS) - $AZNICs = $AZNIC.EndInvoke($jobAZNIC) - $AZPrivEnds = $AZPrivEnd.EndInvoke($jobAZPrivEnd) - $AZVMs = $AZVM.EndInvoke($jobAZVM) - $AZAROs = $AZARO.EndInvoke($jobAZARO) - $AZKustos = $AZKusto.EndInvoke($jobAZKusto) - $AZAppGWs = $AZAppGW.EndInvoke($jobAZAppGW) - $AZDWs = $AZDW.EndInvoke($jobAZDW) - $AZAppWebs = $AZAppWeb.EndInvoke($jobAZAppWeb) - $AZAPIMs = $AZAPIM.EndInvoke($jobAZAPIM) - $AZLBs = $AZLB.EndInvoke($jobAZLB) - $AZBastions = $AZBastion.EndInvoke($jobAZBastion) - $AZFWs = $AZFW.EndInvoke($jobAZFW) - $AZNetProfs = $AZNetProf.EndInvoke($jobAZNetProf) - $AZConts = $AZCont.EndInvoke($jobAZCont) - $AZANFs = $AZANF.EndInvoke($jobAZANF) - - - $AZVGWs.Dispose() - $AZLGWs.Dispose() - $AZVNETs.Dispose() - $AZCONs.Dispose() - $AZEXPROUTEs.Dispose() - $PIPs.Dispose() - $AZVWAN.Dispose() - $AZVHUB.Dispose() - $AZVPNSITES.Dispose() - $AZVERs.Dispose() - $AZAKS.Dispose() - $AZVMSS.Dispose() - $AZNIC.Dispose() - $AZPrivEnd.Dispose() - $AZVM.Dispose() - $AZARO.Dispose() - $AZKusto.Dispose() - $AZAppGW.Dispose() - $AZDW.Dispose() - $AZAppWeb.Dispose() - $AZAPIM.Dispose() - $AZLB.Dispose() - $AZBastion.Dispose() - $AZFW.Dispose() - $AZNetProf.Dispose() - $AZCont.Dispose() - $AZANF.Dispose() - - $CleanPIPs = $PIPsS | Where-Object {$_.id -notin $AZVGWsS.properties.ipConfigurations.properties.publicIPAddress.id} - - $Variables = @{ - 'AZVGWs' = $AZVGWsS; - 'AZLGWs' = $AZLGWsS; - 'AZVNETs' = $AZVNETsS; - 'AZCONs' = $AZCONsS; - 'AZEXPROUTEs' = $AZEXPROUTEsS; - 'PIPs' = $PIPsS; - 'AZVWAN' = $AZVWANS; - 'AZVHUB' = $AZVHUBS; - 'AZVPNSITES' = $AZVPNSITESS; - 'AZVERs' = $AZVERsS; - 'CleanPIPs' = $CleanPIPs; - 'AKS' = $AZAKSs; - 'VMSS' = $AZVMSSs; - 'NIC' = $AZNICs; - 'PrivEnd' = $AZPrivEnds; - 'VM' = $AZVMs; - 'ARO' = $AZAROs; - 'Kusto' = $AZKustos; - 'AppGtw' = $AZAppGWs; - 'DW' = $AZDWs; - 'AppWeb' = $AZAppWebs; - 'APIM' = $AZAPIMs; - 'LB' = $AZLBs; - 'Bastion' = $AZBastions; - 'FW' = $AZFWs; - 'NetProf' = $AZNetProfs; - 'Container' = $AZConts; - 'ANF' = $AZANFs - } - - $Variables - - } -ArgumentList $resources, $null - - } - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting Subnet files') | Out-File -FilePath $LogFile -Append - - $Subnetfiles = Get-ChildItem -Path $DiagramCache - - foreach($SubFile in $Subnetfiles) - { - if($SubFile.FullName -notin $XMLFiles) - { - Remove-Item -Path $SubFile.FullName - } - } - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Variables0 Function') | Out-File -FilePath $LogFile -Append - - Variables0 - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting Variables Job to complete') | Out-File -FilePath $LogFile -Append - - Get-Job -Name 'DiagramVariables' | Wait-Job - - $Job = Receive-Job -Name 'DiagramVariables' - - Get-Job -Name 'DiagramVariables' | Remove-Job - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting Variables') | Out-File -FilePath $LogFile -Append - - $Global:AZVGWs = $Job.AZVGWs - $Global:AZLGWs = $Job.AZLGWs - $Global:AZVNETs = $Job.AZVNETs - $Global:AZCONs = $Job.AZCONs - $Global:AZEXPROUTEs = $Job.AZEXPROUTEs - $Global:PIPs = $Job.PIPs - $Global:AZVWAN = $Job.AZVWAN - $Global:AZVHUB = $Job.AZVHUB - $Global:AZVPNSITES = $Job.AZVPNSITES - $Global:AZVERs = $Job.AZVERs - $Global:CleanPIPs = $Job.CleanPIPs - $Global:AKS = $Job.AKS - $Global:VMSS = $Job.VMSS - $Global:NIC = $Job.NIC - $Global:PrivEnd = $Job.PrivEnd - $Global:VM = $Job.VM - $Global:ARO = $Job.ARO - $Global:Kusto = $Job.Kusto - $Global:AppGtw = $Job.AppGtw - $Global:Databricks = $Job.DW - $Global:AppWeb = $Job.AppWeb - $Global:APIM = $Job.APIM - $Global:LB = $Job.LB - $Global:Bastion = $Job.Bastion - $Global:FW = $Job.FW - $Global:NetProf = $Job.NetProf - $Global:Container = $Job.Container - $Global:ANF = $Job.ANF - - $Global:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $Global:DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $Global:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $Global:IDNum = 0 - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Defining XML file') | Out-File -FilePath $LogFile -Append - - $Global:XmlWriter = New-Object System.XMl.XmlTextWriter($DDFile,$Null) - - $Global:XmlWriter.Formatting = 'Indented' - $Global:XmlWriter.Indentation = 2 - - $Global:XmlWriter.WriteStartDocument() - - $Global:XmlWriter.WriteStartElement('mxfile') - $Global:XmlWriter.WriteAttributeString('host', 'Electron') - $Global:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') - $Global:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') - $Global:XmlWriter.WriteAttributeString('etag', $etag) - $Global:XmlWriter.WriteAttributeString('version', '15.4.0') - $Global:XmlWriter.WriteAttributeString('type', 'device') - - $Global:XmlWriter.WriteStartElement('diagram') - $Global:XmlWriter.WriteAttributeString('id', $DiagID) - $Global:XmlWriter.WriteAttributeString('name', 'Network Topology') - - $Global:XmlWriter.WriteStartElement('mxGraphModel') - $Global:XmlWriter.WriteAttributeString('dx', "1326") - $Global:XmlWriter.WriteAttributeString('dy', "798") - $Global:XmlWriter.WriteAttributeString('grid', "1") - $Global:XmlWriter.WriteAttributeString('gridSize', "10") - $Global:XmlWriter.WriteAttributeString('guides', "1") - $Global:XmlWriter.WriteAttributeString('tooltips', "1") - $Global:XmlWriter.WriteAttributeString('connect', "1") - $Global:XmlWriter.WriteAttributeString('arrows', "1") - $Global:XmlWriter.WriteAttributeString('fold', "1") - $Global:XmlWriter.WriteAttributeString('page', "1") - $Global:XmlWriter.WriteAttributeString('pageScale', "1") - $Global:XmlWriter.WriteAttributeString('pageWidth', "850") - $Global:XmlWriter.WriteAttributeString('pageHeight', "1100") - $Global:XmlWriter.WriteAttributeString('math', "0") - $Global:XmlWriter.WriteAttributeString('shadow', "0") - - $Global:XmlWriter.WriteStartElement('root') - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "0") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "1") - $Global:XmlWriter.WriteAttributeString('parent', "0") - $Global:XmlWriter.WriteEndElement() - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Stensils') | Out-File -FilePath $LogFile -Append - - Stensils - - if($AZLGWs -or $AZEXPROUTEs -or $AZVERs -or $AZVPNSITES) - { - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling OnPremNet') | Out-File -FilePath $LogFile -Append - - OnPremNet - if($Global:FullEnvironment) - { - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling as FullEnvironment') | Out-File -FilePath $LogFile -Append - - FullEnvironment - } - } - else - { - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling CloudOnly Function') | Out-File -FilePath $LogFile -Append - CloudOnly - } - - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndDocument() - $Global:XmlWriter.Flush() - $Global:XmlWriter.Close() - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting Job2 to complete') | Out-File -FilePath $LogFile -Append - - while ($Global:jobs2.IsCompleted -contains $false) {} - - #$VNetFile = ($DiagramCache+'Network.xml') - - $Subnetfiles = Get-ChildItem -Path $DiagramCache - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Processing Subnet files') | Out-File -FilePath $LogFile -Append - - foreach($SubFile in $Subnetfiles) - { - if($SubFile.FullName -notin $XMLFiles) - { - $newxml = New-Object XML - $newxml.Load($SubFile.FullName) - - $Innerxml = $newxml.mxfile.diagram.mxGraphModel.root.InnerXml - - $Innerxml2 = $Innerxml.Replace('','') - - #force the config into an XML - $xml = [xml](get-content $DDFile) - - $xmlFrag=$xml.CreateDocumentFragment() - $xmlFrag.InnerXml=$Innerxml2 - - $xml.mxfile.diagram.mxGraphModel.root.AppendChild($xmlFrag) - - #save file - $xml.Save($DDFile) - - Remove-Item -Path $SubFile.FullName - } - } - - ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - End of Network Diagram') | Out-File -FilePath $LogFile -Append - - } -ArgumentList $Subscriptions,$Resources,$Advisories,$DiagramCache,$FullEnvironment,$DDFile,$XMLFiles,$Logfile -} - -Function Subscription { - Param($Subscriptions,$Resources,$DiagramCache) - - Start-Job -Name 'Diagram_Subscriptions' -ScriptBlock { - $Global:Subscriptions = $($args[0]) - $Global:Resources = $($args[1]) - $Global:DiagramCache = $($args[2]) - - Function Icon { - Param($Style,$x,$y,$w,$h,$p) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', $Style) - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - function variables { - - $Global:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" - $Global:RetRound = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" - - ############# Azure AI - $Global:AzureBotServices = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Bot_Services.svg;' - $Global:AzureMachineLearning = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Machine_Learning.svg;' - $Global:AzureCognitive = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Cognitive_Services.svg;' - - ############# Azure Analytics - $Global:AzureDatabricks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;' - $Global:AzureAnalysis = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Analysis_Services.svg;' - $Global:AzureSynapses = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Azure_Synapse_Analytics.svg;' - - ############# Azure App Service - $Global:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" - $Global:AppSvcPlan = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/app_services/App_Service_Plans.svg;' #width="43.5" height="43.5" - $Global:AzureAppDomain = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/app_services/App_Service_Domains.svg;' - - - ############# Azure VMware - $Global:AzureAVSPrivateCloud = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/azure_vmware_solution/AVS.svg;' - - - ############# Azure Compute - $Global:SvcFabric = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Service_Fabric_Clusters.svg;' #width="49.47" height="47.25" - $Global:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" - $Global:Disks = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Disks.svg;' #width="40.72" height="40" - $Global:RestorePoint = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Restore_Points_Collections.svg;' - $Global:AzureCloudSvc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;' - $Global:AvSet = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Availability_Sets.svg;' #width="43.5" height="43.5" - $Global:AzureVMImage = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Images.svg;' - $Global:AzureAVDWorkspace = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Workspaces.svg;' - $Global:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" - - ############ Azure Container - $Global:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" - $Global:ContRegis = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/containers/Container_Registries.svg;' - $Global:AzureContainerInstances = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/containers/Container_Instances.svg;' - - ############ Azure Database - $Global:AzureSQLDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Database.svg;' - $Global:AzureSQLDBServer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Server.svg;' - $Global:AzureDataExplorer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;' - $Global:AzureDBforPostgre = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_PostgreSQL_Server.svg;' - $Global:AzureDBforPostgreFlex = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_PostgreSQL_Server_Group.svg;' - $Global:AzureRedisCa = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Cache_Redis.svg;' - $Global:AzureDataFactory = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Azure_DevOps.svg;' - $Global:AzureCosmos = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Cosmos_DB.svg;' - $Global:AzureElastic = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Elastic_Pools.svg;' - $Global:AzureElasticJobAgent = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Elastic_Job_Agents.svg;' - $Global:AzureDB4MySQL = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_MySQL_Server.svg;' - $Global:AzureSQLManagedInstances = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Managed_Instance.svg;' - $Global:AzureSQLManagedInstancesDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Managed_Database.svg;' - $Global:AzureSQLVM = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_SQL_VM.svg;' - $Global:AzureSQLVirtualCluster = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Virtual_Clusters.svg;' - $Global:AzureDBMigration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_Migration_Services.svg;' - $Global:AzurePurviewAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Purview_Accounts.svg;' - $Global:AzureMariaDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_MariaDB_Server.svg;' - - ############ Azure DevOps - $Global:Insight = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Application_Insights.svg;' #width="44" height="63" - $Global:AzureDevOpsOrg = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Azure_DevOps.svg;' - - ############ Azure General - $Global:AzureError = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Error.svg;' #width="50.12" height="48" - $Global:AzureWebSlot = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Web_Slots.svg;' - $Global:AzureWorkbooks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Workbooks.svg;' - $Global:AzureWebTest = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Web_Test.svg;' - $Global:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" - $GLobal:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" - - ############ Azure Identity - $Global:AzureB2C = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/identity/Azure_AD_B2C.svg;' - - ########### Azure Integration - $Global:SvcBus = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Service_Bus.svg;' #width="45.05" height="39.75" - $Global:AzureAPIConnections = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Logic_Apps_Custom_Connector.svg;' - $Global:AzureLogicApp = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Logic_Apps.svg;' - $Global:AzureDataCatalog = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Azure_Data_Catalog.svg;' - $Global:AzureEventGridSymtopics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/System_Topic.svg;' - $Global:AzureAppConfiguration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/App_Configuration.svg;' - $Global:AzureIntegrationAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Integration_Accounts.svg;' - $Global:AzureEvtGridTopics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Event_Grid_Topics.svg;' - $Global:AzureAPIMangement = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/API_Management_Services.svg;' - $Global:AzureEvtGridDomain = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Event_Grid_Subscriptions.svg;' - - ########### Azure IoT - $Global:AzureEvtHubs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/iot/Event_Hubs.svg;' - $Global:AzureIoTHubs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/iot/Event_Hubs.svg;' - - ########### Azure Management Governance - $Global:RecoveryVault = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/Recovery_Services_Vaults.svg;' #width="43.7" height="38" - $Global:AutAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/Automation_Accounts.svg;' - $Global:AzureArcServer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/MachinesAzureArc.svg;' - - - ########### Azure Migrate - $Global:AzureMigration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/migrate/Azure_Migrate.svg;' - - - ########### Azure Networking - $Global:AzureConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" - $Global:AzureExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" - $Global:AzureVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" - $Global:AzureVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" - $Global:AzurePIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" - $Global:Azureproximityplacementgroups = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Proximity_Placement_Groups.svg;' - $Global:AzureUDRs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Route_Tables.svg;' - $Global:AzureRouteFilters = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Route_Filters.svg;' - $Global:AzureBastionHost = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Bastions.svg;' - $Global:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" - $Global:NetWatcher = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Watcher.svg;' - $Global:AzurePvtLinks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Private_Link_Service.svg;' - $Global:AzureIPGroups = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/IP_Groups.svg;' - $Global:AzureFW = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;' - $Global:AzureLNG = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Local_Network_Gateways.svg;' - $Global:AzureFrontDoor = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Front_Doors.svg;' - $Global:AzurePIPPrefixes = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Public_IP_Prefixes.svg;' - $Global:AzureNATGateways = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/NAT.svg;' - $Global:AzureCDN = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/CDN_Profiles.svg;' - $Global:AzureNSG = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Security_Groups.svg;' - $Global:AzureSvcEndpointPol = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Service_Endpoint_Policies.svg;' - $Global:AzureVMNIC = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;' - $Global:AzureWAFPolicies = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Web_Application_Firewall_Policies_WAF.svg;' - $Global:AzureDNSZone = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/DNS_Zones.svg;' - $Global:AzureAppGateway = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;' - $Global:AzureDDOS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;' - $Global:AzureTrafficManager = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Traffic_Manager_Profiles.svg;' - $Global:AzurePvtLink = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Private_Link.svg;' - $Global:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" - $Global:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" - - ########### Azure Other - $Global:Dashboard = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Dashboard_Hub.svg;' #width="50.02" height="38.25" - $Global:TemplSpec = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Template_Specs.svg;' - $Global:AzureBackupVault = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Azure_Backup_Center.svg;' - $Global:AzureERDirect = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/ExpressRoute_Direct.svg;' - $Global:AzureAVDSessionHost = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/AVS_VM.svg;' - $Global:AzureAVDHostPool = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Windows_Virtual_Desktop.svg;' - $Global:AzureGrafana = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Grafana.svg;' - $Global:AzureNetworkManager = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Azure_Network_Manager.svg;' - - - ########### Azure Security - $Global:KeyVault = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Key_Vaults.svg;' #width="49.5" height="49.5" - $Global:AzureAppSecGroup = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Application_Security_Groups.svg;' - $Global:AzureDefender = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Azure_Defender.svg;' - - - ########### Azure Storage - $Global:StorageAcc = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Storage_Accounts.svg;' #width="43.75" height="35" - $Global:AzureNetApp = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;' - $Global:AzureDatalakeGen1 = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Data_Lake_Storage_Gen1.svg;' - - - ########### Azure Web - $Global:AzureMediaServices = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/web/Azure_Media_Service.svg;' - - ########### MSCAE - $Global:Certificate = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Certificate.svg;' #width="50" height="42" - $Global:LogAnalytics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Log_Analytics_Workspaces.svg;' #width="40" height="40" - $Global:PvtDNS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/DNS_Private_Zones.svg;' #width="50" height="50" - $Global:AzureSaaS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Software_as_a_Service.svg;' - $Global:AzureRelay = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Service_Bus_Relay.svg;' - $Global:AzureLogAlertRule = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Notification.svg;' - $Global:AzureSignalR = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/SignalR.svg;' - - - } - - function ResourceTypes { - Param($TempResourceType,$TempResLeft,$TempResTop) - - switch ($TempResourceType.Name) - { - <########## AZURE AI ############> - - 'microsoft.botservice/botservices' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Bot' + "`n" + 'Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureBotServices $TempResLeft $TempResTop "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.machinelearningservices/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Machine' + "`n" + 'Learning')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureMachineLearning $TempResLeft $TempResTop "40" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.cognitiveservices/accounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cognitive' + "`n" + 'Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureCognitive $TempResLeft $TempResTop "58" "38" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE ANALYTICS ############> - - 'microsoft.databricks/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Databricks')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDatabricks $TempResLeft $TempResTop "48" "52" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.analysisservices/servers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Analysis' + "`n" + 'Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAnalysis $TempResLeft $TempResTop "53" "41" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.synapse/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Synapse' + "`n" + 'Analytics')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSynapses $TempResLeft $TempResTop "45" "54" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE APP ############> - - 'microsoft.web/sites' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web App')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconAPPs $TempResLeft $TempResTop "45" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.web/serverfarms' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Service Plan')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AppSvcPlan $TempResLeft $TempResTop "43.5" "43.5" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.domainregistration/domains' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App Service' + "`n" + 'Domain')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAppDomain $TempResLeft $TempResTop "50" "38" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE VMWARE ############> - - 'microsoft.avs/privateclouds' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VMware' + "`n" + 'Private Cloud')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAVSPrivateCloud $TempResLeft $TempResTop "60" "46" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE COMPUTE ############> - - 'microsoft.desktopvirtualization/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Workspaces')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAVDWorkspace $TempResLeft $TempResTop "48" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/virtualmachinescalesets' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VMSS')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVMSS $TempResLeft $TempResTop "45" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.servicefabric/clusters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Fabric')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SvcFabric $TempResLeft $TempResTop "49.4" "47.2" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/disks' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Disk')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Disks $TempResLeft $TempResTop "40.72" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/virtualmachines' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Virtual' + "`n" + 'Machine')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconVMs $TempResLeft $TempResTop "43" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/availabilitysets' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Availability' + "`n" + 'Set')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AvSet $TempResLeft $TempResTop "43.5" "43.5" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/restorepointcollections' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Restore' + "`n" + 'Point Collection')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $RestorePoint $TempResLeft $TempResTop "50" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.classiccompute/domainnames' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cloud' + "`n" + 'Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureCloudSvc $TempResLeft $TempResTop "51" "37" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/images' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Images')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureVMImage $TempResLeft $TempResTop "47" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - <########## AZURE CONTAINERS ############> - - 'microsoft.containerservice/managedclusters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AKS')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconAKS $TempResLeft $TempResTop "51" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.containerregistry/registries' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Container' + "`n" + 'Registry')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $ContRegis $TempResLeft $TempResTop "45" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.kubernetes/connectedclusters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Kubernetes' + "`n" + 'Azure Arc')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconAKS $TempResLeft $TempResTop "51" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.containerinstance/containergroups' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Container' + "`n" + 'Instances')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureContainerInstances $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - <########## AZURE DATABASES ############> - - 'microsoft.sql/servers/databases' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Database')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLDB $TempResLeft $TempResTop "36" "49" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/servers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLDBServer $TempResLeft $TempResTop "49" "49" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.kusto/clusters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Explorer Cluster')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDataExplorer $TempResLeft $TempResTop "41" "41" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dbforpostgresql/servers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'PostgreSQL')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDBforPostgre $TempResLeft $TempResTop "38" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dbforpostgresql/flexibleservers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' PostgreSQL' + "`n" + 'Flexible Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDBforPostgreFlex $TempResLeft $TempResTop "37.94" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.cache/redis' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Redis' + "`n" + 'Cache')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureRedisCa $TempResLeft $TempResTop "55" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.datafactory/factories' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Factory')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDataFactory $TempResLeft $TempResTop "44" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.documentdb/databaseaccounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cosmos' + "`n" + 'Database')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureCosmos $TempResLeft $TempResTop "51" "51" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/servers/elasticpools' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Elastic Pool')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureElastic $TempResLeft $TempResTop "51" "51" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/servers/jobagents' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Elastic' + "`n" + 'Job Agent')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureElasticJobAgent $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dbformysql/servers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MySQL' + "`n" + 'Database Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDB4MySQL $TempResLeft $TempResTop "35" "46" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dbformysql/flexibleservers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MySQL' + "`n" + 'Flexible Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDB4MySQL $TempResLeft $TempResTop "35" "46" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/managedinstances/databases' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Managed Instances' + "`n" + 'Database')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLManagedInstancesDB $TempResLeft $TempResTop "51" "47" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/managedinstances' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Managed Instances')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLManagedInstances $TempResLeft $TempResTop "50" "49" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sqlvirtualmachine/sqlvirtualmachines' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Virtual Machine')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLVM $TempResLeft $TempResTop "50" "46" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.sql/virtualclusters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Virtual Cluster')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSQLVirtualCluster $TempResLeft $TempResTop "50" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.datamigration/sqlmigrationservices' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Service')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.datamigration/services' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Service')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.datamigration/services/projects' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Project')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.purview/accounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Purview' + "`n" + 'Account')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzurePurviewAcc $TempResLeft $TempResTop "58" "32" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dbformariadb/servers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MariaDB' + "`n" + 'Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureMariaDB $TempResLeft $TempResTop "34" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE DEVOPS ############> - - 'microsoft.insights/metricalerts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Insight' + "`n" + 'Metrics')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Insight $TempResLeft $TempResTop "33" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.insights/components' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Insights')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Insight $TempResLeft $TempResTop "50" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.visualstudio/account' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DevOps' + "`n" + 'Organization')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDevOpsOrg $TempResLeft $TempResTop "41" "41" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE GENERAL ############> - - 'microsoft.web/sites/slots' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web' + "`n" + 'Slots')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWebSlot $TempResLeft $TempResTop "44" "49" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.insights/workbooks' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Workbooks')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWorkbooks $TempResLeft $TempResTop "39" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.insights/webtests' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web' + "`n" + 'Test')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWebTest $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE IDENTITY ############> - - 'microsoft.azureactivedirectory/b2cdirectories' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' B2C' + "`n" + 'Directories')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureB2C $TempResLeft $TempResTop "49" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE INTEGRATION ############> - - 'microsoft.servicebus/namespaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Bus')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $SvcBus $TempResLeft $TempResTop "45.05" "39.75" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.web/connections' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' API' + "`n" + 'Connections')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAPIConnections $TempResLeft $TempResTop "43" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.logic/workflows' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Logic' + "`n" + 'Apps')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureLogicApp $TempResLeft $TempResTop "57" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.datacatalog/catalogs' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Catalog')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDataCatalog $TempResLeft $TempResTop "46" "52" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.web/customapis' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Logic App' + "`n" + 'Custom Connector')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAPIConnections $TempResLeft $TempResTop "43" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.eventgrid/systemtopics' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'System Topics')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureEventGridSymtopics $TempResLeft $TempResTop "44" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.appconfiguration/configurationstores' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Configuration')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAppConfiguration $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.logic/integrationaccounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Integration' + "`n" + 'Accounts')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureIntegrationAcc $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.eventgrid/topics' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'Topics')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureEvtGridTopics $TempResLeft $TempResTop "44" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.apimanagement/service' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' API' + "`n" + 'Management')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAPIMangement $TempResLeft $TempResTop "50" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.eventgrid/domains' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'Domain')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureEvtGridDomain $TempResLeft $TempResTop "50" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE IOT ############> - - 'microsoft.eventhub/namespaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event' + "`n" + 'Hubs')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureEvtHubs $TempResLeft $TempResTop "50" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.devices/iothubs' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' IoT' + "`n" + 'Hubs')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureIoTHubs $TempResLeft $TempResTop "50" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - <########## AZURE MANAGEMENT GOVERNANCE ############> - - 'microsoft.recoveryservices/vaults' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Recovery' + "`n" + 'Services Vault')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $RecoveryVault $TempResLeft $TempResTop "43.5" "38" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.automation/automationaccounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Automation' + "`n" + 'Account')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AutAcc $TempResLeft $TempResTop "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'Microsoft.HybridCompute/machines' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Arc' + "`n" + 'Server')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureArcServer $TempResLeft $TempResTop "30" "54" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE MIGRATE ############> - - 'microsoft.migrate/projects' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Migration' + "`n" + 'Project')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureMigration $TempResLeft $TempResTop "62" "34" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE NETWORKING ############> - - 'microsoft.network/privateendpoints' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'Endpoint')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconPVTs $TempResLeft $TempResTop "44" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/loadbalancers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Load' + "`n" + 'Balancer')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconLBs $TempResLeft $TempResTop "41" "41" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/publicipaddresses' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Public IPs')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzurePIP $TempResLeft $TempResTop "51" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/virtualnetworks' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Virtual' + "`n" + 'Network')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureVNET $TempResLeft $TempResTop "62" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/networkwatchers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Watcher')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $NetWatcher $TempResLeft $TempResTop "44" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/virtualnetworkgateways' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VPN' + "`n" + 'Gateway')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureVGW $TempResLeft $TempResTop "36" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/connections' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Connection')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureConnections $TempResLeft $TempResTop "44" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/expressroutecircuits' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Express' + "`n" + 'Route')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureExpressRoute $TempResLeft $TempResTop "45" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/networksecuritygroups' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Security Group')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureNSG $TempResLeft $TempResTop "37" "46" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/routetables' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' User Defined' + "`n" + 'Route Tables')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureUDRs $TempResLeft $TempResTop "43" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/routefilters' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Route' + "`n" + 'Filters')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureRouteFilters $TempResLeft $TempResTop "54" "34" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/bastionhosts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Bastion' + "`n" + 'Host')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureBastionHost $TempResLeft $TempResTop "31" "37" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.compute/proximityplacementgroups' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Proximity' + "`n" + 'Placement Groups')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Azureproximityplacementgroups $TempResLeft $TempResTop "47" "45" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/privatelinkservices' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'Link Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzurePvtLinks $TempResLeft $TempResTop "56" "33" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/ipgroups' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' IP' + "`n" + 'Groups')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureIPGroups $TempResLeft $TempResTop "56" "33" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/azurefirewalls' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Firewall')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureFW $TempResLeft $TempResTop "64" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/localnetworkgateways' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Local' + "`n" + 'Network Gateway')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureLNG $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/frontdoors' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Front Door')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureFrontDoor $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/natgateways' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' NAT' + "`n" + 'Gateways')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureNATGateways $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/publicipprefixes' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Public IP' + "`n" + 'Prefixes')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzurePIPPrefixes $TempResLeft $TempResTop "51" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.cdn/profiles' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' CDN' + "`n" + 'Profile')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureCDN $TempResLeft $TempResTop "64" "36" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/serviceendpointpolicies' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Endpoint Polices')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSvcEndpointPol $TempResLeft $TempResTop "48" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.Network/networkInterfaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Interface')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureVMNIC $TempResLeft $TempResTop "50" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/frontdoorwebapplicationfirewallpolicies' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(FrontDoor)')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.cdn/cdnwebapplicationfirewallpolicies' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(CDN)')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(App Gateway)')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/dnszones' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DNS' + "`n" + 'Zone')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDNSZone $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/applicationgateways' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Application' + "`n" + 'Gateway')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAppGateway $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/ddosprotectionplans' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DDOS' + "`n" + 'Protection')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDDOS $TempResLeft $TempResTop "38" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/trafficmanagerprofiles' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Traffic Manager' + "`n" + 'Profiles')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureTrafficManager $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.hybridcompute/privatelinkscopes' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Arc Private' + "`n" + 'Link Scope')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzurePvtLink $TempResLeft $TempResTop "50" "44" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - <########## AZURE OTHER ############> - - 'microsoft.portal/dashboards' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Shared' + "`n" + 'Dashboard')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Dashboard $TempResLeft $TempResTop "50.02" "38.25" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.resources/templatespecs' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Template' + "`n" + 'Specs')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $TemplSpec $TempResLeft $TempResTop "33" "39" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dataprotection/backupvaults' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Backup' + "`n" + 'Services Vault')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureBackupVault $TempResLeft $TempResTop "40" "36" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/expressrouteports' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' ExpressRoute' + "`n" + 'Direct')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureBackupVault $TempResLeft $TempResTop "45" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.desktopvirtualization/hostpools/sessionhosts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Session Host')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAVDSessionHost $TempResLeft $TempResTop "51" "51" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.desktopvirtualization/hostpools' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Host Pool')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAVDHostPool $TempResLeft $TempResTop "51" "51" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.dashboard/grafana' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Grafana')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureGrafana $TempResLeft $TempResTop "50" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/networkmanagers' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Manager')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureNetworkManager $TempResLeft $TempResTop "46" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE SECURITY ############> - - 'microsoft.keyvault/vaults' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Key' + "`n" + 'Vault')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $KeyVault $TempResLeft $TempResTop "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/applicationsecuritygroups' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Application' + "`n" + 'Security Group')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureAppSecGroup $TempResLeft $TempResTop "35" "43" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.easm/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Defender' + "`n" + 'EASM')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDefender $TempResLeft $TempResTop "50" "38" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE STORAGE ############> - - 'microsoft.storage/storageaccounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Storage' + "`n" + 'Account')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $StorageAcc $TempResLeft $TempResTop "49.94" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.netapp/netappaccounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' NetApp' + "`n" + 'Account')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureNetApp $TempResLeft $TempResTop "40" "32" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'Microsoft.DataLakeStore/accounts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data Lake' + "`n" + 'Storage Gen1')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureDatalakeGen1 $TempResLeft $TempResTop "54" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## AZURE WEB ############> - - 'microsoft.media/mediaservices' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Media' + "`n" + 'Services')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureMediaServices $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - - <########## MSCAE ############> - - 'microsoft.web/certificates' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Certificate')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $Certificate $TempResLeft $TempResTop "50" "42" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.operationalinsights/workspaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Log' + "`n" + 'Analytics')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $LogAnalytics $TempResLeft $TempResTop "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.network/privatednszones' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'DNS Zone')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $PvtDNS $TempResLeft $TempResTop "40" "40" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.saas/resources' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SaaS' + "`n" + 'Resource')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSaaS $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.relay/namespaces' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Relay')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureRelay $TempResLeft $TempResTop "50" "50" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.Insights/ActivityLogAlerts' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Activity Log' + "`n" + 'Alert Rule')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'Microsoft.AlertsManagement/smartDetectorAlertRules' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Smart Detector' + "`n" + 'Alert Rule')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'microsoft.insights/scheduledqueryrules' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Log Search' + "`n" + 'Alert Rule')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - 'Microsoft.SignalRService/SignalR' - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SignalR')) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureSignalR $TempResLeft $TempResTop "48" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - - - default - { - $TempName = [string]$TempResourceType.Name - $TempName = $TempName.Replace('microsoft.','') - $TempName = $TempName.split('/') - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' ' + $TempName[0]+ "`n" + $TempName[1])) - #$Global:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Name)) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $AzureError $TempResLeft $TempResTop "50" "48" 1 - - $Global:XmlWriter.WriteEndElement() - } - } - - } - - - $Global:NonTypes = ('microsoft.compute/virtualmachines/extensions', - 'microsoft.operationsmanagement/solutions', - 'microsoft.network/privatednszones/virtualnetworklinks', - 'microsoft.devtestlab/schedules', - 'microsoft.managedidentity/userassignedidentities', - 'microsoft.compute/virtualmachines/runcommands', - 'microsoft.compute/sshpublickeys', - 'microsoft.resources/templatespecs/versions', - 'microsoft.containerregistry/registries/replications', - 'microsoft.automation/automationaccounts/runbooks', - 'microsoft.compute/snapshots', - 'microsoft.insights/autoscalesettings', - 'microsoft.insights/actiongroups', - 'microsoft.network/networkwatchers/flowlogs', - 'microsoft.compute/diskencryptionsets', - 'microsoft.insights/datacollectionrules', - 'microsoft.netapp/netappaccounts/capacitypools', - 'microsoft.netapp/netappaccounts/capacitypools/volumes', - 'microsoft.network/firewallpolicies', - 'microsoft.web/connectiongateways', - 'microsoft.security/automations', - 'microsoft.datacatalog/catalogs', - 'microsoft.hybridcompute/machines/extensions', - 'microsoft.compute/galleries/images', - 'microsoft.compute/galleries/images/versions', - 'microsoft.desktopvirtualization/applicationgroups', - 'microsoft.network/networkintentpolicies', - 'microsoft.resourcegraph/queries', - 'microsoft.cdn/profiles/endpoints', - 'microsoft.network/networkwatchers/connectionmonitors', - 'microsoft.compute/galleries', - 'microsoft.synapse/workspaces/sqlpools', - 'microsoft.containerregistry/registries/webhooks', - 'microsoft.migrate/movecollections', - 'microsoft.databricks/accessconnectors', - 'microsoft.insights/datacollectionendpoints', - 'microsoft.synapse/workspaces/bigdatapools', - 'microsoft.media/mediaservices/streamingendpoints', - 'microsoft.security/customentitystoreassignments', - 'microsoft.security/securityconnectors', - 'microsoft.security/customassessmentautomations', - 'microsoft.datashare/accounts', - 'microsoft.cdn/profiles/afdendpoints', - 'microsoft.securitydevops/azuredevopsconnectors', - 'microsoft.securitydevops/githubconnectors', - 'microsoft.security/datascanners', - 'microsoft.offazure/importsites', - 'microsoft.offazure/vmwaresites', - 'microsoft.migrate/migrateprojects', - 'microsoft.migrate/assessmentprojects', - 'microsoft.offazure/mastersites', - 'microsoft.automation/automationaccounts/configurations', - 'microsoft.alertsmanagement/actionrules', - 'microsoft.resourceconnector/appliances', - 'microsoft.automanage/configurationprofiles', - 'microsoft.offazure/hypervsites', - 'microsoft.machinelearningservices/registries', - 'microsoft.machinelearningservices/workspaces/onlineendpoints/deployments', - 'microsoft.machinelearningservices/workspaces/onlineendpoints', - 'microsoft.serviceshub/connectors', - 'microsoft.containerregistry/registries/tasks', - 'microsoft.web/staticsites', - 'microsoft.security/standards', - 'microsoft.security/iotsecuritysolutions', - 'microsoft.security/assignments', - 'microsoft.connectedvmwarevsphere/virtualmachines', - 'microsoft.connectedvmwarevsphere/vcenters', - 'microsoft.extendedlocation/customlocations', - 'microsoft.offazure/serversites', - 'microsoft.signalrservice/webpubsub', - 'microsoft.eventgrid/partnerconfigurations') - - - $Subs = $Resources | group-object -Property subscriptionId | Sort-Object -Property Count -Descending - - $DDDFile = ($DiagramCache+'Subscriptions.xml') - - $XLeft = 100 - $XTop = 100 - $CelNum = 0 - - $Global:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $Global:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $Global:IDNum = 0 - - $Global:XmlWriter = New-Object System.XMl.XmlTextWriter($DDDFile,$Null) - - $Global:XmlWriter.Formatting = 'Indented' - $Global:XmlWriter.Indentation = 2 - - $Global:XmlWriter.WriteStartDocument() - - $Global:XmlWriter.WriteStartElement('mxfile') - $Global:XmlWriter.WriteAttributeString('host', 'Electron') - $Global:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') - $Global:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') - $Global:XmlWriter.WriteAttributeString('etag', $etag) - $Global:XmlWriter.WriteAttributeString('version', '15.4.0') - $Global:XmlWriter.WriteAttributeString('type', 'device') - - foreach($Sub in $Subs.Name) - { - $RGLeft = $XLeft + 40 - $RGTop = $XTop + 40 - $Resource = $Resources | Where-Object {$_.subscriptionId -eq $Sub} - $SubName = $Subscriptions | Where-Object {$_.id -eq $Sub} - $Resource0 = $Resource | Group-Object -Property resourceGroup | Sort-Object -Property Count -Descending - $SubName = $SubName.Name - - $DiagID1 = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $Global:XmlWriter.WriteStartElement('diagram') - $Global:XmlWriter.WriteAttributeString('id', $DiagID1) - $Global:XmlWriter.WriteAttributeString('name', $SubName) - - $Global:XmlWriter.WriteStartElement('mxGraphModel') - $Global:XmlWriter.WriteAttributeString('dx', "1326") - $Global:XmlWriter.WriteAttributeString('dy', "798") - $Global:XmlWriter.WriteAttributeString('grid', "1") - $Global:XmlWriter.WriteAttributeString('gridSize', "10") - $Global:XmlWriter.WriteAttributeString('guides', "1") - $Global:XmlWriter.WriteAttributeString('tooltips', "1") - $Global:XmlWriter.WriteAttributeString('connect', "1") - $Global:XmlWriter.WriteAttributeString('arrows', "1") - $Global:XmlWriter.WriteAttributeString('fold', "1") - $Global:XmlWriter.WriteAttributeString('page', "1") - $Global:XmlWriter.WriteAttributeString('pageScale', "1") - $Global:XmlWriter.WriteAttributeString('pageWidth', "850") - $Global:XmlWriter.WriteAttributeString('pageHeight', "1100") - $Global:XmlWriter.WriteAttributeString('math', "0") - $Global:XmlWriter.WriteAttributeString('shadow', "0") - - $Global:XmlWriter.WriteStartElement('root') - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "0") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "1") - $Global:XmlWriter.WriteAttributeString('parent', "0") - $Global:XmlWriter.WriteEndElement() - - variables - - $Global:CellIDRes = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $Witd = 2060 - - $Counter = 1 - $ZCounter = 0 - foreach($RG in $Resource0.Name) - { - $Res = $Resource | Where-Object {$_.resourceGroup -eq $RG -and $_.Type -notin $NonTypes} - $Resource1 = $Res | Group-Object -Property type | Sort-Object -Property Count -Descending - - $RGHeigh = if($Resource1.name.count -le 8){1}else{[math]::ceiling($Resource1.name.count / 8)} - - if($Counter -eq 1) - { - $RGLeft = $RGLeft + $RGWitdh + 40 - $TempHeight1 = $RGTop + ($RGHeigh*120) + 40 - if($ZCounter -eq 1) - { - $RGTop = $TempHeight2 - } - } - else - { - $RGLeft = $XLeft + 40 - $TempHeight2 = $RGTop + ($RGHeigh*120) + 40 - $RGTop = $TempHeight1 - $ZCounter = 1 - } - - if($Counter -eq 1){$Counter = 2}else{$Counter = 1} - } - - if($TempHeight1 -gt $TempHeight2){$RGTop = $TempHeight1}else{$RGTop = $TempHeight2} - - $SubHeight = $RGTop - $XTop - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($CelNum++))) - - Icon $Ret $XLeft $XTop $Witd $SubHeight 1 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $SubName) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconSubscription 30 ($XTop+$SubHeight-20) "67" "40" 1 - - $Global:XmlWriter.WriteEndElement() - - - $RGLeft = $XLeft + 40 - $RGTop = $XTop + 40 - - $Counter = 1 - $ZCounter = 0 - foreach($RG in $Resource0.Name) - { - $Res = $Resource | Where-Object {$_.resourceGroup -eq $RG -and $_.subscriptionId -eq $Sub -and $_.Type -notin $NonTypes} - $Resource1 = $Res | Group-Object -Property type | Sort-Object -Property Count -Descending - - $RGWitdh = 960 - $RGHeigh = if($Resource1.name.count -le 8){1}else{[math]::ceiling($Resource1.name.count / 8)} - - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($CelNum++))) - - Icon $RetRound $RGLeft $RGTop $RGWitdh ($RGHeigh*120) 1 - - $Global:XmlWriter.WriteEndElement() - - if($Counter -eq 1) - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $RG) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconRG ($XLeft+20) ($RGTop+($RGHeigh*120)-20) "37.5" "30" 1 - - $Global:XmlWriter.WriteEndElement() - - $ResTypeLeft = $RGLeft + 60 - $ResTypeTop = $RGTop + 25 - $YCounter = 1 - - foreach($res0 in $Resource1) - { - ResourceTypes $res0 $ResTypeLeft $ResTypeTop - if($YCounter -ge 8) - { - $ResTypeLeft = $RGLeft + 60 - $ResTypeTop = $ResTypeTop + 110 - $YCounter = 1 - } - else - { - $ResTypeLeft = $ResTypeLeft + 110 - $YCounter++ - } - - } - $RGLeft = $RGLeft + $RGWitdh + 40 - $TempHeight1 = $RGTop + ($RGHeigh*120) + 40 - if($ZCounter -eq 1) - { - $RGTop = $TempHeight2 - } - } - else - { - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $RG) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - Icon $IconRG ($RGLeft + $RGWitdh - 20) ($RGTop+($RGHeigh*120)-20) "37.5" "30" 1 - - $Global:XmlWriter.WriteEndElement() - - $ResTypeLeft = $RGLeft + 60 - $ResTypeTop = $RGTop + 25 - $YCounter = 1 - - foreach($res0 in $Resource1) - { - ResourceTypes $res0 $ResTypeLeft $ResTypeTop - if($YCounter -ge 8) - { - $ResTypeLeft = $RGLeft + 60 - $ResTypeTop = $ResTypeTop + 110 - $YCounter = 1 - } - else - { - $ResTypeLeft = $ResTypeLeft + 110 - $YCounter++ - } - - } - - $RGLeft = $XLeft + 40 - $TempHeight2 = $RGTop + ($RGHeigh*120) + 40 - $RGTop = $TempHeight1 - $ZCounter = 1 - } - - if($Counter -eq 1){$Counter = 2}else{$Counter = 1} - - } - - if($TempHeight1 -gt $TempHeight2){$RGTop = $TempHeight1}else{$RGTop = $TempHeight2} - - $XTop = $RGTop + 200 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - $Global:XmlWriter.WriteEndDocument() - $Global:XmlWriter.Flush() - $Global:XmlWriter.Close() - - } -ArgumentList $Subscriptions,$Resources,$DiagramCache - -} - -Function Organization { - Param($ResourceContainers,$DiagramCache) - - Start-Job -Name 'Diagram_Organization' -ScriptBlock { - - $Global:ResourceContainers = $($args[0]) - $Global:DiagramCache = $($args[1]) - - Function Icon { - Param($Style,$x,$y,$w,$h,$p) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('style', $Style) - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Connect { - Param($Source,$Target,$Parent) - - if($Parent){$Parent = $Parent}else{$Parent = 1} - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - $Global:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") - $Global:XmlWriter.WriteAttributeString('edge', "1") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $Parent) - $Global:XmlWriter.WriteAttributeString('source', $Source) - $Global:XmlWriter.WriteAttributeString('target', $Target) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('relative', "1") - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - } - - Function Container0 { - Param($x,$y,$w,$h,$title) - $Global:ContID0 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID0) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;swimlaneFillColor=#F5F5F5;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Container1 { - Param($x,$y,$w,$h,$title) - $Global:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;swimlaneFillColor=#D5E8D4;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', "1") - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Container2 { - Param($x,$y,$w,$h,$title,$p) - $Global:ContID2 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID2) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;swimlaneFillColor=#DAE8FC;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Container3 { - Param($x,$y,$w,$h,$title,$p) - $Global:ContID3 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID3) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;swimlaneFillColor=#FFE6CC;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Container4 { - Param($x,$y,$w,$h,$title,$p) - $Global:ContID4 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', $Global:ContID4) - $Global:XmlWriter.WriteAttributeString('value', "$title") - $Global:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;swimlaneFillColor=#FFE6CC;rounded=1;") - $Global:XmlWriter.WriteAttributeString('vertex', "1") - $Global:XmlWriter.WriteAttributeString('parent', $p) - - $Global:XmlWriter.WriteStartElement('mxGeometry') - $Global:XmlWriter.WriteAttributeString('x', $x) - $Global:XmlWriter.WriteAttributeString('y', $y) - $Global:XmlWriter.WriteAttributeString('width', $w) - $Global:XmlWriter.WriteAttributeString('height', $h) - $Global:XmlWriter.WriteAttributeString('as', "geometry") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - } - - Function Stencils { - $Global:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" - $Global:IconMgmtGroup = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Management_Groups.svg;" #width="44" height="71" - $Global:Ret = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" - $Global:Ret1 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#b0e3e6;strokeColor=#0e8088;" - $Global:Ret2 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#b1ddf0;strokeColor=#10739e;" - $Global:Ret3 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#fad7ac;strokeColor=#b46504;" - $Global:Ret4 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#e1d5e7;strokeColor=#9673a6;" - - } - - Function Org { - - $OrgObjs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions'} - - $Global:1stLevel = @() - $Lvl2 = @() - $Lvl3 = @() - $Lvl4 = @() - foreach($org in $OrgObjs) - { - if($org.properties.managementgroupancestorschain.count -eq 2) - { - $Global:1stLevel += $org.properties.managementgroupancestorschain.displayname[0] - } - if($org.properties.managementgroupancestorschain.count -eq 3) - { - $Lvl2 += $org.properties.managementgroupancestorschain.name[0] - $Global:1stLevel += $org.properties.managementgroupancestorschain.displayname[1] - } - if($org.properties.managementgroupancestorschain.count -eq 4) - { - $Lvl3 += $org.properties.managementgroupancestorschain.name[0] - $Lvl2 += $org.properties.managementgroupancestorschain.name[1] - $Global:1stLevel += $org.properties.managementgroupancestorschain.displayname[2] - } - if($org.properties.managementgroupancestorschain.count -eq 5) - { - $Lvl4 += $org.properties.managementgroupancestorschain.name[0] - $Lvl3 += $org.properties.managementgroupancestorschain.name[1] - $Lvl2 += $org.properties.managementgroupancestorschain.name[2] - $Global:1stLevel += $org.properties.managementgroupancestorschain.displayname[3] - } - } - - $Global:1stLevel = $Global:1stLevel | Select-Object -Unique - $Lvl2 = $Lvl2 | Select-Object -Unique - $Lvl3 = $Lvl3 | Select-Object -Unique - $Lvl4 = $Lvl4 | Select-Object -Unique - - $Global:XLeft = 0 - $Global:XTop = 100 - $XXLeft = 100 - - $Global:XTop = $Global:XTop + 200 - - $RoundSubs00 = @() - foreach($Sub in $OrgObjs) - { - if($Sub.properties.managementgroupancestorschain[0].displayname -eq 'tenant root group') - { - $RoundSubs00 += $Sub - } - } - - $MgmtHeight0 = (($RoundSubs00.id.count * 70) + 80) - - Container0 '0' '0' '200' $MgmtHeight0 'tenant root group' - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('ManagementGroup', 'tenant root group') - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - if($RoundSubs00) - { - icon $Global:IconMgmtGroup '-30' ($MgmtHeight0-15) '50' '50' $Global:ContID0 - } - else - { - icon $Global:IconMgmtGroup '75' '27' '50' '50' $Global:ContID0 - } - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = 50 - $LocalLeft = 25 - - foreach($Sub in $RoundSubs00) - { - $RGs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $sub.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($Global:CelNum++))) - - Icon $Ret1 $LocalLeft $LocalTop '150' '70' $Global:ContID0 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $RGNum = 1 - foreach($RG in $RGs) - { - $Attr = ('ResourceGroup_'+[string]$RGNum) - $Global:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) - $RGNum++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - icon $Global:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Global:ContID0 - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = $LocalTop + 90 - - } - - - - - foreach($1stlvl in $Global:1stLevel) - { - $RoundSubs0 = @() - - foreach($Sub in $OrgObjs) - { - if($Sub.properties.managementgroupancestorschain.displayname[0] -eq $1stlvl) - { - $RoundSubs0 += $Sub - } - } - - $MgmtHeight = (($RoundSubs0.id.count * 70) + 80) - - Container1 $XLeft $XTop '200' $MgmtHeight $1stlvl $Global:ContID0 - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('ManagementGroup', [string]$1stlvl) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - if($RoundSubs0) - { - icon $Global:IconMgmtGroup '-30' ($MgmtHeight-15) '50' '50' $Global:ContID - } - else - { - icon $Global:IconMgmtGroup '75' '27' '50' '50' $Global:ContID - } - - $Global:XmlWriter.WriteEndElement() - - Connect $Global:ContID0 $Global:ContID - - $LocalTop = 50 - $LocalLeft = 25 - - foreach($Sub in $RoundSubs0) - { - $RGs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $sub.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($Global:CelNum++))) - - Icon $Ret1 $LocalLeft $LocalTop '150' '70' $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $RGNum = 1 - foreach($RG in $RGs) - { - $Attr = ('ResourceGroup_'+[string]$RGNum) - $Global:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) - $RGNum++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - icon $Global:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Global:ContID - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = $LocalTop + 90 - - } - - ######################################## 2ND LEVEL ############################################## - - $2ndLevel = @() - foreach($sub2nd in $OrgObjs) - { - if($sub2nd.properties.managementgroupancestorschain.displayname[1] -eq $1stlvl) - { - $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[0] - } - if($sub2nd.properties.managementgroupancestorschain.displayname[2] -eq $1stlvl) - { - $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[1] - } - if($sub2nd.properties.managementgroupancestorschain.displayname[3] -eq $1stlvl) - { - $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[2] - } - } - $2ndLevel = $2ndLevel | Select-Object -Unique - - $XXLeft = 0 - if($2ndLevel.count % 2 -eq 1 ) - { - $Align = $true - $loops = -[Math]::ceiling($2ndLevel.count /2 - 1) - } - else - { - $Align = $false - $loops = [Math]::ceiling($2ndLevel.count / 2) - - } - if($2ndLevel.count -eq 1) - { - $loops = 1 - } - $TempSon = 0 - - - foreach($2nd in $2ndLevel) - { - $RoundSubs = @() - $Temp3rd = @() - $Temp4rd = @() - $Temp5th = @() - - foreach($Sub in $OrgObjs) - { - if($Sub.properties.managementgroupancestorschain.name[0] -eq $2nd) - { - $RoundSubs += $Sub - } - if($Sub.properties.managementgroupancestorschain.name[1] -eq $2nd) - { - $Temp3rd += $Sub.properties.managementgroupancestorschain.name[0] - } - if($Sub.properties.managementgroupancestorschain.name[2] -eq $2nd) - { - $Temp4rd += $Sub.properties.managementgroupancestorschain.name[0] - $Temp3rd += $Sub.properties.managementgroupancestorschain.name[1] - } - if($Sub.properties.managementgroupancestorschain.name[3] -eq $2nd) - { - $Temp5th += $Sub.properties.managementgroupancestorschain.name[0] - $Temp4rd += $Sub.properties.managementgroupancestorschain.name[1] - $Temp3rd += $Sub.properties.managementgroupancestorschain.name[2] - } - } - - $Temp3rd = $Temp3rd | Select-Object -Unique - $Temp4rd = $Temp4rd | Select-Object -Unique - $Temp5th = $Temp5th | Select-Object -Unique - - if($XXLeft -eq 0 -and $Align -eq $true) - { - } - elseif($XXLeft -eq 0 -and $Align -eq $false) - { - $XXLeft = -150 + -((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) - $loops++ - } - elseif($Align -eq $false -and $loops -eq 0) - { - $XXLeft = 150 + ((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) - $loops++ - } - elseif($loops -gt 0 -and $XXLeft -eq 0) - { - $XXLeft = $XXLeft + ($2ndLevel.count*300)/2 + ((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) - $loops++ - } - elseif($XXLeft -le 0 -and $loops -lt 0) - { - $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150))} - $XXLeft = $XXLeft + -$XXTemp - $loops++ - } - elseif($XXLeft -gt 0 -and $loops -ge 0) - { - $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150))} - $XXLeft = $XXLeft + $XXTemp - $loops++ - } - else - { - $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*300)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*300))} - $XXLeft = $XXLeft + $XXTemp - $loops++ - } - write-host $XXleft - - $MgmtHeight1 = if((($RoundSubs.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs.id.count * 90) + 50)} - - $XXTop = $MgmtHeight + 200 - - Container2 $XXLeft $XXTop '200' $MgmtHeight1 $2nd $Global:ContID - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('ManagementGroup', [string]$2nd) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - if($RoundSubs) - { - icon $Global:IconMgmtGroup '-30' ($MgmtHeight1-15) '50' '50' $Global:ContID2 - } - else - { - icon $Global:IconMgmtGroup '75' '27' '50' '50' $Global:ContID2 - } - - $Global:XmlWriter.WriteEndElement() - - Connect $Global:ContID $Global:ContID2 - - $TempSon = (($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)) - - if($XXLeft -eq 0 -and $loops -lt 0) - { - $XXLeft = -1 - } - elseif($XXLeft -lt 0 -and $loops -ge 0) - { - $XXLeft = 1 - } - - $LocalTop = 50 - $LocalLeft = 25 - - foreach($Sub in $RoundSubs) - { - $RGs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $sub.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($Global:CelNum++))) - - Icon $Ret2 $LocalLeft $LocalTop '150' '70' $Global:ContID2 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $RGNum = 1 - foreach($RG in $RGs) - { - $Attr = ('ResourceGroup_'+[string]$RGNum) - $Global:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) - $RGNum++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - icon $Global:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Global:ContID2 - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = $LocalTop + 90 - } - - - ######################################## 3RD LEVEL ############################################## - - $3rdLevel = @() - foreach($sub3rd in $OrgObjs) - { - if($sub3rd.properties.managementgroupancestorschain.name[1] -eq $2nd) - { - $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[0] - } - if($sub3rd.properties.managementgroupancestorschain.name[2] -eq $2nd) - { - $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[1] - } - if($sub3rd.properties.managementgroupancestorschain.name[3] -eq $2nd) - { - $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[2] - } - } - $3rdLevel = $3rdLevel | Select-Object -Unique - - $XXXLeft = 0 - if($3rdLevel.count % 2 -eq 1 ) - { - $Align3 = $true - $loops3 = -[Math]::ceiling($3rdLevel.count / 2 - 1) - } - else - { - $Align3 = $false - $loops3 = [Math]::ceiling($3rdLevel.count / 2) - 1 - - } - if($3rdLevel.count -eq 1) - { - $loops3 = 1 - } - - - foreach($3rd in $3rdLevel) - { - $RoundSubs3 = @() - $Temp4rd3 = @() - $Temp5th3 = @() - - foreach($Sub in $OrgObjs) - { - if($Sub.properties.managementgroupancestorschain.name[0] -eq $3rd) - { - $RoundSubs3 += $Sub - } - if($Sub.properties.managementgroupancestorschain.name[1] -eq $3rd) - { - $Temp4rd3 += $Sub.properties.managementgroupancestorschain.name[0] - } - if($Sub.properties.managementgroupancestorschain.name[2] -eq $3rd) - { - $Temp5th3 += $Sub.properties.managementgroupancestorschain.name[0] - $Temp4rd3 += $Sub.properties.managementgroupancestorschain.name[1] - } - } - - $Temp4rd3 = $Temp4rd3 | Select-Object -Unique - $Temp5th3 = $Temp5th3 | Select-Object -Unique - - - if($XXXLeft -eq 0 -and $Align3 -eq $true) - { - } - elseif($XXXLeft -eq 0 -and $Align3 -eq $false) - { - $XXXLeft = -150 + -((((($Temp4rd3.count)+($Temp5th3.count)))*150)/2) - $loops3++ - } - elseif($Align3 -eq $false -and $loops3 -eq 0) - { - $XXXLeft = 150 + ((((($Temp4rd3.count)+($Temp5th3.count)))*150)/2) - $loops3++ - } - elseif($loops3 -gt 0 -and $XXXLeft -eq 0) - { - $XXXLeft = $XXXLeft + ($3rdLevel.count*300)/2 + ((((($Temp4rd3.count)+($Temp5th3.count)))*300)/2) - $loops3++ - } - elseif($XXXLeft -eq 0 -and $loops3 -lt 0) - { - $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} - $XXXLeft = $XXXLeft + -$XXXTemp - $loops3++ - } - elseif($XXXLeft -lt 0 -and $loops3 -lt 0) - { - $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} - $XXXLeft = $XXXLeft + -$XXXTemp - $loops3++ - } - elseif($XXXLeft -eq 1 -and $loops3 -gt 0) - { - $XXXLeft = 150 + ((((($Temp4rd3.count)+($Temp5th3.count)))*150)) - $loops3++ - } - else - { - $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} - $XXXLeft = $XXXLeft + $XXXTemp - $loops3++ - } - - - $MgmtHeight2 = if((($RoundSubs3.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs3.id.count * 90) + 50)} - - $XXXTop = $MgmtHeight1 + 200 - - Container3 $XXXLeft $XXXTop '200' $MgmtHeight2 $3rd $Global:ContID2 - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('ManagementGroup', [string]$3rd) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - if($RoundSubs3) - { - icon $Global:IconMgmtGroup '-30' ($MgmtHeight2-15) '50' '50' $Global:ContID3 - } - else - { - icon $Global:IconMgmtGroup '75' '27' '50' '50' $Global:ContID3 - } - - $Global:XmlWriter.WriteEndElement() - - Connect $Global:ContID2 $Global:ContID3 - - if($XXXLeft -eq 0 -and $loops3 -lt 0) - { - $XXXLeft = -1 - } - elseif($XXXLeft -lt 0 -and $loops3 -ge 0) - { - $XXXLeft = 1 - } - - $LocalTop = 50 - $LocalLeft = 25 - - foreach($Sub in $RoundSubs3) - { - - $RGs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $sub.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($Global:CelNum++))) - - Icon $Ret3 $LocalLeft $LocalTop '150' '70' $Global:ContID3 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $RGNum = 1 - foreach($RG in $RGs) - { - $Attr = ('ResourceGroup_'+[string]$RGNum) - $Global:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) - $RGNum++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - icon $Global:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Global:ContID3 - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = $LocalTop + 90 - } - - - ######################################## 4TH LEVEL ############################################## - - $4thLevel = @() - foreach($sub4th in $OrgObjs) - { - if($sub4th.properties.managementgroupancestorschain.name[1] -eq $3rd) - { - $4thLevel += $sub4th.properties.managementgroupancestorschain.name[0] - } - if($sub4th.properties.managementgroupancestorschain.name[2] -eq $3rd) - { - $4thLevel += $sub4th.properties.managementgroupancestorschain.name[1] - } - if($sub4th.properties.managementgroupancestorschain.name[3] -eq $3rd) - { - $4thLevel += $sub4th.properties.managementgroupancestorschain.name[2] - } - } - $4thLevel = $4thLevel | Select-Object -Unique - - $XXXXLeft = 0 - if($4thLevel.count % 2 -eq 1 ) - { - $Align4 = $true - $loops4 = -[Math]::ceiling($sub4th.count / 2 - 1) - } - else - { - $Align4 = $false - $loops4 = [Math]::ceiling($sub4th.count / 2) - 1 - - } - if($4thLevel.count -eq 1) - { - $loops4 = 1 - } - - - foreach($4th in $4thLevel) - { - $RoundSubs4 = @() - $Temp5th4 = @() - - foreach($Sub in $OrgObjs) - { - if($Sub.properties.managementgroupancestorschain.name[0] -eq $4th) - { - $RoundSubs4 += $Sub - } - if($Sub.properties.managementgroupancestorschain.name[1] -eq $4th) - { - $Temp5th4 += $Sub.properties.managementgroupancestorschain.name[0] - } - if($Sub.properties.managementgroupancestorschain.name[2] -eq $4th) - { - $Temp5th4 += $Sub.properties.managementgroupancestorschain.name[0] - } - } - - $Temp5th4 = $Temp5th4 | Select-Object -Unique - - if($XXXXLeft -eq 0 -and $Align4 -eq $true) - { - } - elseif($XXXXLeft -eq 0 -and $Align4 -eq $false) - { - $XXXXLeft = -150 + -((((($Temp4rd4.count)+($Temp5th4.count)))*150)/2) - $loops4++ - } - elseif($Align4 -eq $false -and $loops4 -eq 0) - { - $XXXXLeft = 150 + ((((($Temp4rd4.count)+($Temp5th4.count)))*150)/2) - $loops4++ - } - elseif($loops4 -gt 0 -and $XXXXLeft -eq 0) - { - $XXXXLeft = $XXXXLeft + ($4thLevel.count*300)/2 + ((((($Temp5th4.count)))*300)/2) - $loops4++ - } - elseif($XXXXLeft -eq 0 -and $loops4 -lt 0) - { - $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} - $XXXXLeft = $XXXXLeft + -$XXXXTemp - $loops4++ - } - elseif($XXXXLeft -lt 0 -and $loops4 -lt 0) - { - $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} - $XXXXLeft = $XXXXLeft + -$XXXXTemp - $loops4++ - } - elseif($XXXXLeft -eq 1 -and $loops4 -gt 0) - { - $XXXXLeft = 150 + ((((($Temp5th4.count)))*150)) - $loops4++ - } - else - { - $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} - $XXXXLeft = $XXXXLeft + $XXXXTemp - $loops4++ - } - - - $MgmtHeight3 = if((($RoundSubs4.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs4.id.count * 90) + 50)} - - $XXXXTop = $MgmtHeight2 + 200 - - Container4 $XXXXLeft $XXXXTop '200' $MgmtHeight3 $4th $Global:ContID3 - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - $Global:XmlWriter.WriteAttributeString('ManagementGroup', [string]$4th) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - if($RoundSubs4) - { - icon $Global:IconMgmtGroup '-30' ($MgmtHeight3-15) '50' '50' $Global:ContID4 - } - else - { - icon $Global:IconMgmtGroup '75' '27' '50' '50' $Global:ContID4 - } - - $Global:XmlWriter.WriteEndElement() - - Connect $Global:ContID3 $Global:ContID4 - - if($XXXXLeft -eq 0 -and $loops4 -lt 0) - { - $XXXXLeft = -1 - } - elseif($XXXXLeft -lt 0 -and $loops4 -ge 0) - { - $XXXXLeft = 1 - } - - $LocalTop = 50 - $LocalLeft = 25 - - foreach($Sub in $RoundSubs4) - { - - $RGs = $Global:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', $sub.name) - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellIDRes+'-'+($Global:CelNum++))) - - Icon $Ret4 $LocalLeft $LocalTop '150' '70' $Global:ContID4 - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('object') - $Global:XmlWriter.WriteAttributeString('label', '') - - $RGNum = 1 - foreach($RG in $RGs) - { - $Attr = ('ResourceGroup_'+[string]$RGNum) - $Global:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) - $RGNum++ - } - - $Global:XmlWriter.WriteAttributeString('id', ($Global:CellID+'-'+($Global:IDNum++))) - - icon $Global:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Global:ContID4 - - $Global:XmlWriter.WriteEndElement() - - $LocalTop = $LocalTop + 90 - } - - } - - } - - } - - } - - } - - Stencils - - $OrgFile = ($DiagramCache+'Organization.xml') - - $Global:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $Global:DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - $Global:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) - - $Global:IDNum = 0 - $Global:CelNum = 0 - - $Global:XmlWriter = New-Object System.XMl.XmlTextWriter($OrgFile,$Null) - - $Global:XmlWriter.Formatting = 'Indented' - $Global:XmlWriter.Indentation = 2 - - $Global:XmlWriter.WriteStartDocument() - - $Global:XmlWriter.WriteStartElement('mxfile') - $Global:XmlWriter.WriteAttributeString('host', 'Electron') - $Global:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') - $Global:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') - $Global:XmlWriter.WriteAttributeString('etag', $etag) - $Global:XmlWriter.WriteAttributeString('version', '15.4.0') - $Global:XmlWriter.WriteAttributeString('type', 'device') - - $Global:XmlWriter.WriteStartElement('diagram') - $Global:XmlWriter.WriteAttributeString('id', $DiagID) - $Global:XmlWriter.WriteAttributeString('name', 'Organization') - - $Global:XmlWriter.WriteStartElement('mxGraphModel') - $Global:XmlWriter.WriteAttributeString('dx', "1326") - $Global:XmlWriter.WriteAttributeString('dy', "798") - $Global:XmlWriter.WriteAttributeString('grid', "1") - $Global:XmlWriter.WriteAttributeString('gridSize', "10") - $Global:XmlWriter.WriteAttributeString('guides', "1") - $Global:XmlWriter.WriteAttributeString('tooltips', "1") - $Global:XmlWriter.WriteAttributeString('connect', "1") - $Global:XmlWriter.WriteAttributeString('arrows', "1") - $Global:XmlWriter.WriteAttributeString('fold', "1") - $Global:XmlWriter.WriteAttributeString('page', "1") - $Global:XmlWriter.WriteAttributeString('pageScale', "1") - $Global:XmlWriter.WriteAttributeString('pageWidth', "850") - $Global:XmlWriter.WriteAttributeString('pageHeight', "1100") - $Global:XmlWriter.WriteAttributeString('math', "0") - $Global:XmlWriter.WriteAttributeString('shadow', "0") - - $Global:XmlWriter.WriteStartElement('root') - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "0") - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteStartElement('mxCell') - $Global:XmlWriter.WriteAttributeString('id', "1") - $Global:XmlWriter.WriteAttributeString('parent', "0") - $Global:XmlWriter.WriteEndElement() - - - Org - - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndElement() - - $Global:XmlWriter.WriteEndDocument() - $Global:XmlWriter.Flush() - $Global:XmlWriter.Close() - - } -ArgumentList $ResourceContainers,$DiagramCache - -} - - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Draw.IO file') | Out-File -FilePath $LogFile -Append - -$XMLFiles = @() - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting XML files to be clean') | Out-File -FilePath $LogFile -Append - -$XMLFiles += ($DiagramCache+'Organization.xml') -$XMLFiles += ($DiagramCache+'Subscriptions.xml') - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Cleaning old files') | Out-File -FilePath $LogFile -Append - -foreach($File in $XMLFiles) - { - Remove-Item -Path $File -ErrorAction SilentlyContinue - } - - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Organization Function') | Out-File -FilePath $LogFile -Append - -Organization $ResourceContainers $DiagramCache - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Network Topology Function') | Out-File -FilePath $LogFile -Append - -Network $Subscriptions $Resources $Advisories $DiagramCache $FullEnvironment $DDFile $XMLFiles - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Subscription Function') | Out-File -FilePath $LogFile -Append - -Subscription $Subscriptions $Resources $DiagramCache - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting for Jobs to complete') | Out-File -FilePath $LogFile -Append - -(Get-Job | Where-Object {$_.name -like 'Diagram_*'}) | Wait-Job - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting to process files') | Out-File -FilePath $LogFile -Append - -foreach($File in $XMLFiles) - { - $oldxml = New-Object XML - $oldxml.Load($File) - - $newxml = New-Object XML - $newxml.Load($DDFile) - - $oldxml.DocumentElement.InsertAfter($oldxml.ImportNode($newxml.SelectSingleNode('mxfile'), $true), $afternode) - - $oldxml.Save($DDFile) - - Remove-Item -Path $File - } - -('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Cleaning old jobs') | Out-File -FilePath $LogFile -Append - -(Get-Job | Where-Object {$_.name -like 'Diagram_*'}) | Remove-Job diff --git a/Extras/Policy.ps1 b/Extras/Policy.ps1 deleted file mode 100644 index 3f9f473..0000000 --- a/Extras/Policy.ps1 +++ /dev/null @@ -1,90 +0,0 @@ -<# -.Synopsis -Policy Module - -.DESCRIPTION -This script process and creates the Policy sheet based on advisorresources. - -.Link -https://github.com/microsoft/ARI/Extras/Policy.ps1 - -.COMPONENT - This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 3.0.1 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($Policies, $Task , $Subscriptions, $File ,$Pol, $TableStyle) - -If ($Task -eq 'Processing') -{ - $obj = '' - $tmp = @() - - foreach ($1 in $Policies) - { - $data = $1.PROPERTIES - if($data.policyDefinitionId -like '/providers/microsoft.management/managementgroups/*') - { - $Definition = $data.policyDefinitionId.split('/')[8] - } - else - { - $Definition = $data.policyDefinitionId.split('/')[4] - } - $timecreated = [datetime]$data.metadata.createdon - $timecreated = $timecreated.ToString("yyyy-MM-dd HH:mm") - if($data.scope -like '/subscriptions/*') - { - $ScopeType = 'Subscription' - $Scope = ($Subscriptions | Where-Object {$_.id -eq $data.scope.split('/')[2]}).name - } - else - { - $ScopeType = 'Management Group' - $Scope = $data.scope.split('/')[4] - } - - $obj = @{ - 'ID' = $1.id; - 'Definition Id' = $Definition; - 'Name' = $data.displayName; - 'Description' = $data.description; - 'Location' = $1.location; - 'Enforcement Mode' = $data.enforcementmode; - 'Created On' = $timecreated; - 'Assigned By' = $data.metadata.assignedby; - 'Scope Type' = $ScopeType; - 'Scope' = $Scope; - 'Identity Type' = $1.identity.type; - 'Principal Id' = $1.identity.principalId - } - $tmp += $obj - } - $tmp -} -Else -{ - - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0.0 - $StyleExt = New-ExcelStyle -HorizontalAlignment Left -Range B:C -Width 70 -WrapText - - $Pol | - ForEach-Object { [PSCustomObject]$_ } | - Select-Object 'Definition Id', - 'Name', - 'Description', - 'Location', - 'Enforcement Mode', - 'Created On', - 'Assigned By', - 'Scope Type', - 'Scope', - 'Identity Type', - 'Principal Id' | - Export-Excel -Path $File -WorksheetName 'Policy' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzurePolicy' -MoveToStart -TableStyle $tableStyle -Style $Style,$StyleExt -KillExcel - -} diff --git a/Extras/QuotaUsage.ps1 b/Extras/QuotaUsage.ps1 deleted file mode 100644 index a70333c..0000000 --- a/Extras/QuotaUsage.ps1 +++ /dev/null @@ -1,58 +0,0 @@ -<# -.Synopsis -vCPU Quotas Module - -.DESCRIPTION -This script process and creates the Quota sheet based on Quotas Used. - -.Link -https://github.com/microsoft/ARI/Extras/QuotaUsage.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.1.0 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($File, $AzQuota, $TableStyle) - -$tmp = @() -$Total = ($AzQuota.Data).count -foreach($Quota in $AzQuota) -{ - foreach($Data in $Quota.Data) - { - $FreevCPU = '' - if($Data.Name.LocalizedValue -like '*vCPUs'){$FreevCPU = $Data.limit - $Data.CurrentValue} - $obj = @{ - 'Subscription' = $Quota.Subscription; - 'Region' = $Quota.Location; - 'Current Usage' = $Data.currentValue; - 'Limit' = $Data.limit; - 'Quota' = $Data.Name.LocalizedValue; - 'vCPUs Available' = $FreevCPU; - 'Total' = $Total - } - $tmp += $obj - } -} - - $ExcelVar = $tmp - - $TableName = ('QuotaTable_'+$ExcelVar[0].Total) - $ExcelVar | - ForEach-Object { [PSCustomObject]$_ } | - Select-Object -Unique 'Subscription', - 'Region', - 'Current Usage', - 'Limit', - 'Quota', - 'vCPUs Available' | - Export-Excel -Path $File -WorksheetName 'Quota Usage' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -Numberformat '0' -MoveToEnd - - - - \ No newline at end of file diff --git a/Extras/SecurityCenter.ps1 b/Extras/SecurityCenter.ps1 deleted file mode 100644 index 5b6bee5..0000000 --- a/Extras/SecurityCenter.ps1 +++ /dev/null @@ -1,71 +0,0 @@ -<# -.Synopsis -Security Center Module - -.DESCRIPTION -This script process and creates the Security Center sheet based on securityresources. - -.Link -https://github.com/microsoft/ARI/Extras/SecurityCenter.ps1 - -.COMPONENT - This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.0.0 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($Subscriptions,$Security, $Task ,$File, $Sec, $TableStyle) - -If ($Task -eq 'Processing') -{ - $obj = '' - $tmp = @() - - foreach ($1 in $Security) { - $data = $1.PROPERTIES - - $sub1 = $($args[1]) | Where-Object { $_.id -eq $1.properties.resourceDetails.Id.Split("/")[2] } - - $obj = @{ - 'Subscription' = $sub1.Name; - 'Resource Group' = $1.RESOURCEGROUP; - 'Resource Type' = $data.resourceDetails.Id.Split("/")[7]; - 'Resource Name' = $data.resourceDetails.Id.Split("/")[8]; - 'Categories' = [string]$data.metadata.categories; - 'Control' = $data.displayName; - 'Severity' = $data.metadata.severity; - 'Status' = $data.status.code; - 'Remediation' = $data.metadata.remediationDescription; - 'Remediation Effort' = $data.metadata.implementationEffort; - 'User Impact' = $data.metadata.userImpact; - 'Threats' = [string]$data.metadata.threats - } - $tmp += $obj - } - $tmp -} -else -{ - $condtxtsec = $(New-ConditionalText High -Range G:G - New-ConditionalText High -Range L:L) - - $Sec | - ForEach-Object { [PSCustomObject]$_ } | - Select-Object 'Subscription', - 'Resource Group', - 'Resource Type', - 'Resource Name', - 'Categories', - 'Control', - 'Severity', - 'Status', - 'Remediation', - 'Remediation Effort', - 'User Impact', - 'Threats' | - Export-Excel -Path $File -WorksheetName 'SecurityCenter' -AutoSize -MaxAutoSizeRows 100 -MoveToStart -TableName 'SecurityCenter' -TableStyle $tableStyle -ConditionalText $condtxtsec -KillExcel - -} \ No newline at end of file diff --git a/Extras/Subscriptions.ps1 b/Extras/Subscriptions.ps1 deleted file mode 100644 index fbd273f..0000000 --- a/Extras/Subscriptions.ps1 +++ /dev/null @@ -1,58 +0,0 @@ -<# -.Synopsis -Module for Subscriptions - -.DESCRIPTION -This script process and creates the Subscriptions sheet based on resources and subscriptions the resources belong. - -.Link -https://github.com/azureinventory/ARI/Extras/Subscriptions.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.2.1 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> -param($Subscriptions,$resources, $Task ,$File, $Sub, $TableStyle) - -If ($Task -eq 'Processing') -{ - $ResTable = $resources | Where-Object { $_.type -ne 'microsoft.advisor/recommendations' } - $resTable2 = $ResTable | Select-Object id, Type, location, resourcegroup, subscriptionid - $ResTable3 = $ResTable2 | Group-Object -Property type, location, resourcegroup, subscriptionid - - $tmp = @() - - foreach ($ResourcesSUB in $ResTable3) { - $ResourceDetails = $ResourcesSUB.name -split "," - $SubName = $Subscriptions | Where-Object { $_.Id -eq ($ResourceDetails[3] -replace (" ", "")) } - - $obj = @{ - 'Subscription' = $SubName.Name; - 'Resource Group' = $ResourceDetails[2]; - 'Location' = $ResourceDetails[1]; - 'Resource Type' = $ResourceDetails[0]; - 'Resources' = $ResourcesSUB.Count - } - $tmp += $obj - } - $tmp -} -else -{ - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' - - $Sub | - ForEach-Object { [PSCustomObject]$_ } | - Select-Object 'Subscription', - 'Resource Group', - 'Location', - 'Resource Type', - 'Resources' | Export-Excel -Path $File -WorksheetName 'Subscriptions' -AutoSize -MaxAutoSizeRows 100 -TableName 'Subscriptions' -TableStyle $tableStyle -Style $Style -Numberformat '0' -MoveToEnd - - -} \ No newline at end of file diff --git a/Modules/ARIResourceJobs.psm1 b/Modules/ARIResourceJobs.psm1 new file mode 100644 index 0000000..f80948c --- /dev/null +++ b/Modules/ARIResourceJobs.psm1 @@ -0,0 +1,224 @@ +function Start-ARIResourceJobs { + Param ($Resources, $Subscriptions, $InTag, $Unsupported, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + switch ($Resources.count) + { + {$_ -le 1000} + { + $EnvSizeLooper = 1000 + $DebugEnvSize = 'Small' + } + {$_ -gt 1000 -and $_ -le 30000} + { + $EnvSizeLooper = 5000 + $DebugEnvSize = 'Medium' + } + {$_ -gt 30000 -and $_ -le 60000} + { + $EnvSizeLooper = 10000 + $DebugEnvSize = 'Large' + Write-Host $DebugEnvSize -NoNewline -ForegroundColor Green + Write-Host (' Size Environment Identified.') + Write-Host ('Jobs will be run in batches to avoid CPU Overload.') + } + {$_ -gt 60000} + { + $EnvSizeLooper = 5000 + $DebugEnvSize = 'Enormous' + Write-Host $DebugEnvSize -NoNewline -ForegroundColor Green + Write-Host (' Size Environment Identified.') + Write-Host ('Jobs will be run in batches to prevent CPU Overload.') + } + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Processing Jobs in '+ $DebugEnvSize +' Mode.') + + $Loop = $Resources.count / $EnvSizeLooper + $Loop = [math]::ceiling($Loop) + $Looper = 0 + $Limit = 0 + $JobLoop = 1 + + $ResourcesCount = [string]$Resources.count + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Total Resources Being Processed: '+ $ResourcesCount) + + while ($Looper -lt $Loop) { + $Looper ++ + + $Resource = $Resources | Select-Object -First $EnvSizeLooper -Skip $Limit + + $ResourceCount = [string]$Resource.count + $LoopCountStr = [string]$Looper + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resources Being Processed in ResourceJob_'+ $LoopCountStr + ': ' + $ResourceCount) + + Start-Job -Name ('ResourceJob_'+$Looper) -ScriptBlock { + + $Job = @() + + $Subscriptions = $($args[2]) + $InTag = $($args[3]) + $Resource = $($args[4]) + $Task = $($args[5]) + $Unsupported = $($args[9]) + + if($($args[1]) -like '*\*') + { + $Modules = Get-ChildItem -Path ($($args[1]) + '\Scripts\*.ps1') -Recurse + } + else + { + $Modules = Get-ChildItem -Path ($($args[1]) + '/Scripts/*.ps1') -Recurse + } + + $job = @() + + $Modules | ForEach-Object { + $ModName = $_.Name.replace(".ps1","") + $ModuSeq0 = New-Object System.IO.StreamReader($_.FullName) + $ModuSeq = $ModuSeq0.ReadToEnd() + $ModuSeq0.Dispose() + Start-Sleep -Milliseconds 250 + + New-Variable -Name ('ModRun' + $ModName) + New-Variable -Name ('ModJob' + $ModName) + + Set-Variable -Name ('ModRun' + $ModName) -Value ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($PSScriptRoot).AddArgument($Subscriptions).AddArgument($InTag).AddArgument($Resource).AddArgument($Task).AddArgument($null).AddArgument($null).AddArgument($null).AddArgument($Unsupported) + + Set-Variable -Name ('ModJob' + $ModName) -Value ((get-variable -name ('ModRun' + $ModName)).Value).BeginInvoke() + + $job += (get-variable -name ('ModJob' + $ModName)).Value + Start-Sleep -Milliseconds 250 + Clear-Variable -Name ModName + } + + while ($Job.Runspace.IsCompleted -contains $false) { Start-Sleep -Milliseconds 1000 } + + $Modules | ForEach-Object { + $ModName = $_.Name.replace(".ps1","") + Start-Sleep -Milliseconds 250 + + New-Variable -Name ('ModValue' + $ModName) + Set-Variable -Name ('ModValue' + $ModName) -Value (((get-variable -name ('ModRun' + $ModName)).Value).EndInvoke((get-variable -name ('ModJob' + $ModName)).Value)) + + Clear-Variable -Name ('ModRun' + $ModName) + Clear-Variable -Name ('ModJob' + $ModName) + Start-Sleep -Milliseconds 250 + Clear-Variable -Name ModName + } + + [System.GC]::GetTotalMemory($true) | out-null + + $Hashtable = New-Object System.Collections.Hashtable + + $Modules | ForEach-Object { + $ModName = $_.Name.replace(".ps1","") + Start-Sleep -Milliseconds 250 + + $Hashtable["$ModName"] = (get-variable -name ('ModValue' + $ModName)).Value + + Clear-Variable -Name ('ModValue' + $ModName) + Start-Sleep -Milliseconds 100 + + Clear-Variable -Name ModName + } + + [System.GC]::GetTotalMemory($true) | out-null + + $Hashtable + } -ArgumentList $null, $PSScriptRoot, $Subscriptions, $InTag, $Resource, 'Processing', $null, $null, $null, $Unsupported | Out-Null + $Limit = $Limit + $EnvSizeLooper + Start-Sleep -Milliseconds 250 + if($DebugEnvSize -in ('Large','Enormous') -and $JobLoop -eq 5) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Waiting Batch of Jobs to Complete.') + + $coun = 0 + + $InterJobNames = (Get-Job | Where-Object {$_.name -like 'ResourceJob_*' -and $_.State -eq 'Running'}).Name + + while (get-job -Name $InterJobNames | Where-Object { $_.State -eq 'Running' }) { + $jb = get-job -Name $InterJobNames + $c = (((($jb.count - ($jb | Where-Object { $_.State -eq 'Running' }).Count)) / $jb.Count) * 100) + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'initial Jobs Running: '+[string]($jb | Where-Object { $_.State -eq 'Running' }).count) + $c = [math]::Round($coun) + Write-Progress -Id 1 -activity "Processing Initial Resource Jobs" -Status "$coun% Complete." -PercentComplete $coun + Start-Sleep -Seconds 15 + } + $JobLoop = 0 + } + $JobLoop ++ + [System.GC]::GetTotalMemory($true) | out-null + } + return $DebugEnvSize +} + + +function Start-ARIAutResourceJob { + Param($Resources,$Subscriptions,$InTag,$Unsupported) + Write-Output ('Starting Resources Processes') + Write-Output ('Total Resources Being Analyzed: '+$Resources.count) + + $Modules = Get-ChildItem -Path ($PSScriptRoot + '/Scripts/*.ps1') -Recurse + + $SmaResources = @{} + + foreach ($Module in $Modules) + { + + if($RunDebug) + { + Write-Output '' + Write-Output ('DEBUG - Running Module: '+$Module) + } + + $ModName = $Module.Name.replace(".ps1","") + $ModuSeq0 = New-Object System.IO.StreamReader($Module.FullName) + $ModuSeq = $ModuSeq0.ReadToEnd() + $ModuSeq0.Dispose() + + $ScriptBlock = [Scriptblock]::Create($ModuSeq) + + $SmaResources[$ModName] = Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList $PSScriptRoot, $Subscriptions, $InTag, $Resources, 'Processing', $null, $null, $null, $Unsupported + + Start-Sleep -Milliseconds 100 + + } + return $SmaResources +} + + +function Get-ARIUnsupportedData { + Param($Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + if($PSScriptRoot -like '*\*') + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Validating file: '+$PSScriptRoot + '\Extras\Support.json') + $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '\Extras\Support.json') + } + else + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Validating file: '+$PSScriptRoot + '/Extras/Support.json') + $ModuSeq0 = New-Object System.IO.StreamReader($PSScriptRoot + '/Extras/Support.json') + } + $ModuSeq = $ModuSeq0.ReadToEnd() + $ModuSeq0.Dispose() + + $Unsupported = $ModuSeq | ConvertFrom-Json + + return $Unsupported +} \ No newline at end of file diff --git a/Modules/ARIResourcesReport.psm1 b/Modules/ARIResourcesReport.psm1 new file mode 100644 index 0000000..f0b165f --- /dev/null +++ b/Modules/ARIResourcesReport.psm1 @@ -0,0 +1,72 @@ +function Start-ARIResourceReporting { + Param($InTag, $file, $SmaResources, $TableStyle, $Unsupported, $DebugEnvSize, $DataActive, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Reporting Phase.') + Write-Progress -activity $DataActive -Status "Processing Inventory" -PercentComplete 50 + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Running Offline, Gathering List Of Modules.') + if($PSScriptRoot -like '*\*') + { + $Modules = Get-ChildItem -Path ($PSScriptRoot + '\Scripts\*.ps1') -Recurse + } + else + { + $Modules = Get-ChildItem -Path ($PSScriptRoot + '/Scripts/*.ps1') -Recurse + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Modules Found: ' + $Modules.Count) + $Lops = $Modules.count + $ReportCounter = 0 + + foreach ($Module in $Modules) { + + $c = (($ReportCounter / $Lops) * 100) + $c = [math]::Round($c) + Write-Progress -Id 1 -activity "Building Report" -Status "$c% Complete." -PercentComplete $c + + $ModuSeq0 = New-Object System.IO.StreamReader($Module.FullName) + $ModuSeq = $ModuSeq0.ReadToEnd() + $ModuSeq0.Dispose() + Start-Sleep -Milliseconds 50 + $ModuleName = $Module.name.replace('.ps1','') + + $ModuleResourceCount = $SmaResources.$ModuleName.count + + if ($ModuleResourceCount -gt 0) + { + Start-Sleep -Milliseconds 100 + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Running Module: '$ModuleName'. Lines Count: $ModuleResourceCount") + + $ExcelRun = ([PowerShell]::Create()).AddScript($ModuSeq).AddArgument($PSScriptRoot).AddArgument($null).AddArgument($InTag).AddArgument($null).AddArgument('Reporting').AddArgument($file).AddArgument($SmaResources).AddArgument($TableStyle).AddArgument($Unsupported) + + $ExcelJob = $ExcelRun.BeginInvoke() + + while ($ExcelJob.IsCompleted -contains $false) { Start-Sleep -Milliseconds 100 } + + $ExcelRun.EndInvoke($ExcelJob) + + $ExcelRun.Dispose() + + [System.GC]::GetTotalMemory($true) | out-null + } + + $ReportCounter ++ + + } + + if($DebugEnvSize -in ('Large','Enormous')) + { + Clear-Variable SmaResources -Scope Global + [System.GC]::GetTotalMemory($true) | out-null + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resource Reporting Phase Done.') +} \ No newline at end of file diff --git a/Modules/Core/ARIExtraJobs.psm1 b/Modules/Core/ARIExtraJobs.psm1 new file mode 100644 index 0000000..cb9b890 --- /dev/null +++ b/Modules/Core/ARIExtraJobs.psm1 @@ -0,0 +1,314 @@ +function Start-ARIExtraJobs { + Param ($SkipDiagram, $SkipAdvisory, $SkipPolicy, $SecurityCenter, $Subscriptions, $Resources, $Advisories, $DDFile, $DiagramCache, $FullEnv, $ResourceContainers, $Security, $PolicyDef, $PolicySetDef, $PolicyAssign, $Automation, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + <######################################################### DRAW IO DIAGRAM JOB ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Draw.io Diagram Job Should be Run.') + if (!$SkipDiagram.IsPresent) { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Draw.io Diagram Processing Job.') + Start-job -Name 'DrawDiagram' -ScriptBlock { + + Import-Module AzureResourceInventory + + $DiagramCache = $($args[5]) + + $TempPath = $DiagramCache.split("DiagramCache\")[0] + + $Logfile = ($TempPath+'DiagramLogFile.log') + + ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Draw.IO Job') | Out-File -FilePath $LogFile -Append + + ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Draw.IO Thread') | Out-File -FilePath $LogFile -Append + try + { + Invoke-ARIDrawIODiagram -Subscriptions $($args[0]) -Resources $($args[1]) -Advisories $($args[2]) -DDFile $($args[3]) -DiagramCache $($args[4]) -FullEnvironment $($args[5]) -ResourceContainers $($args[6]) + + } + catch + { + ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+$_.Exception.Message) | Out-File -FilePath $LogFile -Append + } + ('DrawIOCoreJob - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Draw.IO Ended.') | Out-File -FilePath $LogFile -Append + + } -ArgumentList $Subscriptions, $Resources, $Advisories, $DDFile, $DiagramCache, $FullEnv, $ResourceContainers | Out-Null + } + + <######################################################### VISIO DIAGRAM JOB ######################################################################> + <# + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Visio Diagram Job Should be Run.') + if ($Diagram.IsPresent) { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Visio Diagram Processing Job.') + Start-job -Name 'VisioDiagram' -ScriptBlock { + + If ($($args[5]) -eq $true) { + $ModuSeq = (New-Object System.Net.WebClient).DownloadString($($args[7]) + '/Extras/VisioDiagram.ps1') + } + Else { + $ModuSeq0 = New-Object System.IO.StreamReader($($args[0]) + '\Extras\VisioDiagram.ps1') + $ModuSeq = $ModuSeq0.ReadToEnd() + $ModuSeq0.Dispose() + } + + $ScriptBlock = [Scriptblock]::Create($ModuSeq) + + $VisioRun = ([PowerShell]::Create()).AddScript($ScriptBlock).AddArgument($($args[1])).AddArgument($($args[2])).AddArgument($($args[3])).AddArgument($($args[4])) + + $VisioJob = $VisioRun.BeginInvoke() + + while ($VisioJob.IsCompleted -contains $false) {} + + $VisioRun.EndInvoke($VisioJob) + + $VisioRun.Dispose() + + } -ArgumentList $PSScriptRoot, $Subscriptions, $Resources, $Advisories, $DFile, $RunOnline, $Repo, $RawRepo | Out-Null + } + #> + + <######################################################### SECURITY CENTER JOB ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Security Center Job.') + if ($SecurityCenter.IsPresent) { + if (![string]::IsNullOrEmpty($Security)) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Security Job.') + if ($Automation.IsPresent) + { + Write-Output ('Starting SecurityCenter Job') + Start-ThreadJob -Name 'Security' -ScriptBlock { + + Import-Module AzureResourceInventory + + $SecResult = Invoke-ARISecCenterProcessing -Subscriptions $Subscriptions -Security $Security + + $SecResult + + } -ArgumentList $Subscriptions , $Security | Out-Null + } + else + { + Start-Job -Name 'Security' -ScriptBlock { + + Import-Module AzureResourceInventory + + $SecResult = Invoke-ARISecCenterProcessing -Subscriptions $Subscriptions -Security $Security + + $SecResult + + } -ArgumentList $Subscriptions , $Security | Out-Null + } + } + } + + <######################################################### POLICY JOB ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Policy Job.') + if (!$SkipPolicy.IsPresent) { + if (![string]::IsNullOrEmpty($PolicyAssign) -and ![string]::IsNullOrEmpty($PolicyDef)) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Policy Processing Job.') + if ($Automation.IsPresent) + { + Write-Output ('Starting Policy Job') + Start-ThreadJob -Name 'Policy' -ScriptBlock { + + Import-Module AzureResourceInventory + + $PolResult = Invoke-ARIPolicyProcessing -Subscriptions $($args[0]) -PolicySetDef $($args[1]) -PolicyAssign $($args[2]) -PolicyDef $($args[3]) + + $PolResult + + } -ArgumentList $Subscriptions, $PolicySetDef, $PolicyAssign, $PolicyDef | Out-Null + } + else + { + Start-Job -Name 'Policy' -ScriptBlock { + + Import-Module AzureResourceInventory + + $PolResult = Invoke-ARIPolicyProcessing -Subscriptions $($args[0]) -PolicySetDef $($args[1]) -PolicyAssign $($args[2]) -PolicyDef $($args[3]) + + $PolResult + + } -ArgumentList $Subscriptions, $PolicySetDef, $PolicyAssign, $PolicyDef | Out-Null + } + } + } + + <######################################################### ADVISORY JOB ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking If Should Run Advisory Job.') + if (!$SkipAdvisory.IsPresent) { + if (![string]::IsNullOrEmpty($Advisories)) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Advisory Processing Job.') + if ($Automation.IsPresent) + { + Write-Output ('Starting Advisory Job') + Start-ThreadJob -Name 'Advisory' -ScriptBlock { + + Import-Module AzureResourceInventory + + $AdvResult = Invoke-ARIAdvisoryProcessing -Advisories $args + + $AdvResult + + } -ArgumentList $Advisories | Out-Null + } + else + { + Start-Job -Name 'Advisory' -ScriptBlock { + + Import-Module AzureResourceInventory + + $AdvResult = Invoke-ARIAdvisoryProcessing -Advisories $args + + $AdvResult + + } -ArgumentList $Advisories | Out-Null + } + } + } + + <######################################################### SUBSCRIPTIONS JOB ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Subscriptions job.') + if ($Automation.IsPresent) + { + Write-Output ('Starting Subscription Job') + Start-ThreadJob -Name 'Subscriptions' -ScriptBlock { + + Import-Module AzureResourceInventory + + $SubResult = Invoke-ARISubsProcessing -Subscriptions $($args[0]) -Resources $($args[1]) + + $SubResult + + } -ArgumentList $Subscriptions, $Resources | Out-Null + } + else + { + Start-Job -Name 'Subscriptions' -ScriptBlock { + + Import-Module AzureResourceInventory + + $SubResult = Invoke-ARISubsProcessing -Subscriptions $($args[0]) -Resources $($args[1]) + + $SubResult + + } -ArgumentList $Subscriptions, $Resources | Out-Null + } +} + +function Start-ARIExtraReports { + Param($File, $QuotaUsage, $SecurityCenter, $SkipPolicy, $SkipAdvisory, $TableStyle, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + if($QuotaUsage.IsPresent) + { + get-job -Name 'Quota Usage' | Wait-Job + + $AzQuota = Receive-Job -Name 'Quota Usage' + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Quota Usage sheet for: ' + $AzQuota.count + ' Subscriptions/Regions.') + + Write-Progress -activity 'Azure Resource Inventory Quota Usage' -Status "50% Complete." -PercentComplete 50 -CurrentOperation "Building Quota Sheet" + + Build-ARIQuotaReport -File $File -AzQuota $AzQuota -TableStyle $TableStyle + + Write-Progress -activity 'Azure Resource Inventory Quota Usage' -Status "100% Complete." -Completed + } + + <################################################ SECURITY CENTER #######################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Security Center Sheet.') + if ($SecurityCenter.IsPresent) { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Security Center Sheet.') + + while (get-job -Name 'Security' | Where-Object { $_.State -eq 'Running' }) { + Write-Progress -Id 1 -activity 'Processing Security Center Advisories' -Status "50% Complete." -PercentComplete 50 + Start-Sleep -Seconds 2 + } + Write-Progress -Id 1 -activity 'Processing Security Center Advisories' -Status "100% Complete." -Completed + + $Sec = Receive-Job -Name 'Security' + + Build-ARISecCenterReport -File $File -Sec $Sec -TableStyle $TableStyle + + } + + <################################################ POLICY #######################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Policy Sheet.') + if (!$SkipPolicy.IsPresent) { + if(get-job -Name 'Policy') + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Policy Sheet.') + + while (get-job -Name 'Policy' | Where-Object { $_.State -eq 'Running' }) { + Write-Progress -Id 1 -activity 'Processing Policies' -Status "50% Complete." -PercentComplete 50 + Start-Sleep -Seconds 2 + } + Write-Progress -Id 1 -activity 'Processing Policies' -Status "100% Complete." -Completed + + $Pol = Receive-Job -Name 'Policy' + + Build-ARIPolicyReport -File $File -Pol $Pol -TableStyle $TableStyle + + Start-Sleep -Milliseconds 200 + } + } + + <################################################ ADVISOR #######################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Checking if Should Generate Advisory Sheet.') + if (!$SkipAdvisory.IsPresent) { + if (get-job -Name 'Advisory') + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Advisor Sheet.') + + while (get-job -Name 'Advisory' | Where-Object { $_.State -eq 'Running' }) { + Write-Progress -Id 1 -activity 'Processing Advisories' -Status "50% Complete." -PercentComplete 50 + Start-Sleep -Seconds 2 + } + Write-Progress -Id 1 -activity 'Processing Advisories' -Status "100% Complete." -Completed + + $Adv = Receive-Job -Name 'Advisory' + + Build-ARIAdvisoryReport -File $File -Adv $Adv -TableStyle $TableStyle + + Start-Sleep -Milliseconds 200 + } + } + + <################################################################### SUBSCRIPTIONS ###################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Subscription sheet.') + + Write-Progress -activity 'Azure Resource Inventory Subscriptions' -Status "50% Complete." -PercentComplete 50 -CurrentOperation "Building Subscriptions Sheet" + + $AzSubs = Receive-Job -Name 'Subscriptions' + + Build-ARISubsReport -File $File -Sub $AzSubs -TableStyle $TableStyle + + [System.GC]::GetTotalMemory($true) | out-null + + Write-Progress -activity 'Azure Resource Inventory Subscriptions' -Status "100% Complete." -Completed +} \ No newline at end of file diff --git a/Modules/Core/ARIGetSubs.psm1 b/Modules/Core/ARIGetSubs.psm1 new file mode 100644 index 0000000..1f14299 --- /dev/null +++ b/Modules/Core/ARIGetSubs.psm1 @@ -0,0 +1,17 @@ +function Get-ARISubscriptions { + Param ($TenantID,$SubscriptionID) + Write-Host "Extracting Subscriptions from Tenant $TenantID" + $Subscriptions = Get-AzSubscription -TenantId $TenantID -WarningAction SilentlyContinue -InformationAction SilentlyContinue + if ($SubscriptionID) + { + if($SubscriptionID.count -gt 1) + { + $Subscriptions = $Subscriptions | Where-Object { $_.ID -in $SubscriptionID } + } + else + { + $Subscriptions = $Subscriptions | Where-Object { $_.ID -eq $SubscriptionID } + } + } + return $Subscriptions +} \ No newline at end of file diff --git a/Modules/Core/ARIInventoryLoop.psm1 b/Modules/Core/ARIInventoryLoop.psm1 new file mode 100644 index 0000000..dffc586 --- /dev/null +++ b/Modules/Core/ARIInventoryLoop.psm1 @@ -0,0 +1,97 @@ +<# +.Synopsis +Azure Resource Graph loop module + +.DESCRIPTION +This module is use to loop trough the Azure Resource Graph. + +.Link +https://github.com/microsoft/ARI/Modules/Core/ARIInventoryLoop.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ResourceInventoryLoop { + param($GraphQuery,$FSubscri,$LoopName) + + Write-Progress -activity 'Azure Inventory' -Status "10% Complete." -PercentComplete 10 -CurrentOperation ('Extracting: ' + $LoopName) + $ReportCounter = 1 + $LocalResults = @() + if($FSubscri.count -gt 200) + { + $SubLoop = $FSubscri.count / 200 + $SubLooper = 0 + $NStart = 0 + $NEnd = 200 + while ($SubLooper -lt $SubLoop) + { + $Sub = $FSubscri[$NStart..$NEnd] + try + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting First 1000 Resources') + $QueryResult = Search-AzGraph -Query $GraphQuery -first 1000 -Subscription $Sub + } + catch + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting First 200 Resources') + $QueryResult = Search-AzGraph -Query $GraphQuery -first 200 -Subscription $Sub + } + $LocalResults += $QueryResult + while ($QueryResult.SkipToken) { + $ReportCounterVar = [string]$ReportCounter + try + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting Next 1000 Resources. Loop Number: ' + $ReportCounterVar) + $QueryResult = Search-AzGraph -Query $GraphQuery -SkipToken $QueryResult.SkipToken -Subscription $Sub -first 1000 + } + catch + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting Next 200 Resources. Loop Number: ' + $ReportCounterVar) + $QueryResult = Search-AzGraph -Query $GraphQuery -SkipToken $QueryResult.SkipToken -Subscription $Sub -first 200 + } + $LocalResults += $QueryResult + } + $NStart = $NStart + 200 + $NEnd = $NEnd + 200 + $SubLooper ++ + $ReportCounter ++ + } + } + else + { + try + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting First 1000 Resources') + $QueryResult = Search-AzGraph -Query $GraphQuery -first 1000 -Subscription $FSubscri + } + catch + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting First 200 Resources') + $QueryResult = Search-AzGraph -Query $GraphQuery -first 200 -Subscription $FSubscri + } + + $LocalResults += $QueryResult + while ($QueryResult.SkipToken) { + $ReportCounterVar = [string]$ReportCounter + try + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting Next 1000 Resources. Loop Number: ' + $ReportCounterVar) + $QueryResult = Search-AzGraph -Query $GraphQuery -SkipToken $QueryResult.SkipToken -Subscription $FSubscri -first 1000 + } + catch + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Extracting Next 200 Resources. Loop Number: ' + $ReportCounterVar) + $QueryResult = Search-AzGraph -Query $GraphQuery -SkipToken $QueryResult.SkipToken -Subscription $FSubscri -first 200 + } + $LocalResults += $QueryResult + $ReportCounter ++ + } + } + $LocalResults +} \ No newline at end of file diff --git a/Modules/Core/ARILoginSession.psm1 b/Modules/Core/ARILoginSession.psm1 new file mode 100644 index 0000000..38714ec --- /dev/null +++ b/Modules/Core/ARILoginSession.psm1 @@ -0,0 +1,123 @@ +<# +.Synopsis +Azure Login Session Module for Azure Resource Inventory + +.DESCRIPTION +This module is used to invoke the authentication process that is handle by the Azure CLI. + +.Link +https://github.com/microsoft/ARI/Core/Connect-LoginSession.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Connect-ARILoginSession { + Param($AzureEnvironment,$TenantID,$SubscriptionID,$DeviceLogin,$Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Connect-LoginSession function') + Write-Host $AzureEnvironment -BackgroundColor Green + if (!$TenantID) { + write-host "Tenant ID not specified. Use -TenantID parameter if you want to specify directly. " + write-host "Authenticating Azure" + write-host "" + Clear-AzContext -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -InformationAction SilentlyContinue + if($DeviceLogin.IsPresent) + { + Connect-AzAccount -UseDeviceAuthentication -Environment $AzureEnvironment | Out-Null + } + else + { + try + { + $AZConfigNewLogin = Get-AzConfig -LoginExperienceV2 -WarningAction SilentlyContinue -InformationAction SilentlyContinue + if ($AZConfigNewLogin.value -eq 'On' ) + { + Update-AzConfig -LoginExperienceV2 Off | Out-Null + Connect-AzAccount -Environment $AzureEnvironment | Out-Null + Update-AzConfig -LoginExperienceV2 On | Out-Null + } + else + { + Connect-AzAccount -Environment $AzureEnvironment | Out-Null + } + } + catch + { + Connect-AzAccount -Environment $AzureEnvironment | Out-Null + } + } + write-host "" + write-host "" + $Tenants = Get-AzTenant -WarningAction SilentlyContinue -InformationAction SilentlyContinue | Sort-Object -Unique + if ($Tenants.Count -eq 1) { + write-host "You have privileges only in One Tenant " + write-host "" + $TenantID = $Tenants.Id + } + else { + write-host "Select the the Azure Tenant ID that you want to connect : " + write-host "" + $SequenceID = 1 + foreach ($Tenant in $Tenants) { + $TenantName = $Tenant.name + write-host "$SequenceID) $TenantName" + $SequenceID ++ + } + write-host "" + [int]$SelectTenant = read-host "Select Tenant ( default 1 )" + $defaultTenant = --$SelectTenant + $TenantID = ($Tenants[$defaultTenant]).Id + if($DeviceLogin.IsPresent) + { + Connect-AzAccount -Tenant $TenantID -UseDeviceAuthentication -Environment $AzureEnvironment | Out-Null + } + else + { + Connect-AzAccount -Tenant $TenantID -Environment $AzureEnvironment | Out-Null + } + } + } + else { + Clear-AzContext -Force | Out-Null + if($DeviceLogin.IsPresent) + { + Connect-AzAccount -Tenant $TenantID -UseDeviceAuthentication -Environment $AzureEnvironment | Out-Null + } + else + { + try + { + $AZConfig = Get-AzConfig -LoginExperienceV2 -WarningAction SilentlyContinue -InformationAction SilentlyContinue + if ($AZConfig.value -eq 'On') + { + Update-AzConfig -LoginExperienceV2 Off | Out-Null + Connect-AzAccount -Tenant $TenantID -Environment $AzureEnvironment | Out-Null + Update-AzConfig -LoginExperienceV2 On | Out-Null + } + else + { + Connect-AzAccount -Tenant $TenantID -Environment $AzureEnvironment | Out-Null + } + } + catch + { + Connect-AzAccount -Tenant $TenantID -Environment $AzureEnvironment | Out-Null + } + } + } + return $TenantID +} \ No newline at end of file diff --git a/Modules/Core/ARITestPS.psm1 b/Modules/Core/ARITestPS.psm1 new file mode 100644 index 0000000..45e4ab7 --- /dev/null +++ b/Modules/Core/ARITestPS.psm1 @@ -0,0 +1,51 @@ +<# +.Synopsis +Test Powershell environment + +.DESCRIPTION +This module is use to test and validate the Powershell environment. + +.Link +https://github.com/microsoft/ARI/Modules/Core/Test-ARIPS.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Test-ARIPS { + Param($Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Test-ARIPS function') + $CShell = try{Get-CloudShellTip}catch{$null} + if ($CShell) { + Write-Host 'Azure CloudShell Identified.' -ForegroundColor Cyan + $PlatOS = 'Azure CloudShell' + } + else + { + if ($PSVersionTable.Platform -eq 'Unix') { + Write-Host "PowerShell Unix Identified." -ForegroundColor Cyan + $PlatOS = 'PowerShell Unix' + + } + else { + Write-Host "PowerShell Desktop Identified." -ForegroundColor Cyan + $PlatOS = 'PowerShell Desktop' + + } + } + return $PlatOS +} \ No newline at end of file diff --git a/Modules/Diagram/ARIDiagramNetwork.psm1 b/Modules/Diagram/ARIDiagramNetwork.psm1 new file mode 100644 index 0000000..ca5b45c --- /dev/null +++ b/Modules/Diagram/ARIDiagramNetwork.psm1 @@ -0,0 +1,3070 @@ +<# +.Synopsis +Network Module for Draw.io Diagram + +.DESCRIPTION +This module is use for the Network topology in the Draw.io Diagram. + +.Link +https://github.com/microsoft/ARI/Modules/Extras/ARIDiagramNetwork.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +Function Invoke-ARIDiagramNetwork { + Param($Subscriptions,$Resources,$Advisories,$DiagramCache,$FullEnvironment,$DDFile,$XMLFiles,$LogFile) + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Network Diagram Job...') | Out-File -FilePath $LogFile -Append + + Start-Job -Name 'Diagram_NetworkTopology' -ScriptBlock { + + Import-Module AzureResourceInventory + + $Script:jobs = @() + $Script:jobs2 = @() + $Script:Subscriptions = $($args[0]) + $Script:Resources = $($args[1]) + $Script:Advisories = $($args[2]) + $Script:DiagramCache = $($args[3]) + $Script:FullEnvironment = $($args[4]) + $Script:DDFile = $($args[5]) + $Script:XMLFiles = $($args[6]) + $Script:Logfile = $($args[7]) + + Function Icon { + Param($Style,$x,$y,$w,$h,$p) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', $Style) + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function VNETContainer { + Param($x,$y,$w,$h,$title) + $Script:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;swimlaneFillColor=#D5E8D4;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function HubContainer { + Param($x,$y,$w,$h,$title) + $Script:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;rounded=1;swimlaneFillColor=#DAE8FC;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function BrokenContainer { + Param($x,$y,$w,$h,$title) + $Script:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#fad9d5;strokeColor=#ae4132;swimlaneFillColor=#FAD9D5;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Connect { + Param($Source,$Target,$Parent) + + if($Parent){$Parent = $Parent}else{$Parent = 1} + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + $Script:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") + $Script:XmlWriter.WriteAttributeString('edge', "1") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $Parent) + $Script:XmlWriter.WriteAttributeString('source', $Source) + $Script:XmlWriter.WriteAttributeString('target', $Target) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('relative', "1") + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + } + + <# Function to create the Visio document and import each stencil #> + Function Stensils { + $Script:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" + + $Script:IconConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" + $Script:IconExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" + $Script:IconVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" + $Script:IconVGW2 = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" + $Script:IconVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" + $Script:IconTraffic = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Local_Network_Gateways.svg;" #width="68" height="68" + $Script:IconNIC = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;" #width="68" height="60" + $Script:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" + $Script:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" + $Script:IconNSG = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Network_Security_Groups.svg;" # width="26.35" height="32" + $Script:IconUDR = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Route_Tables.svg;" #width="30.97" height="30" + $Script:IconDDOS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;" # width="23" height="28" + $Script:IconPIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" + $Script:IconNAT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/NAT.svg;" # width="65" height="52" + + <########################## Azure Generic Stencils #############################> + + $Script:SymError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="50" height="50" + $Script:SymInfo = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Information.svg;" #width="64" height="64" + $Script:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" + $Script:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" + $Script:IconBastions = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/general/Launch_Portal.svg;" #width="68" height="67" + $Script:IconContain = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Container_Instances.svg;" #width="64" height="68" + $Script:IconVWAN = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_WANs.svg;" #width="65" height="64" + $Script:IconCostMGMT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Cost_Analysis.svg;" #width="60" height="70" + + <########################## Azure Computing Stencils #############################> + + $Script:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" + $Script:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" + $Script:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" + $Script:IconARO = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/mscae/OpenShift.svg;" #width="50" height="46" + $Script:IconFunApps = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Function_Apps.svg;" # width="68" height="60" + + <########################## Azure Service Stencils #############################> + + $Script:IconAPIMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/app_services/API_Management_Services.svg;" #width="65" height="60" + $Script:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" + + <########################## Azure Storage Stencils #############################> + + $Script:IconNetApp = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;" #width="65" height="52" + + <########################## Azure Storage Stencils #############################> + + $Script:IconDataExplorer = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" #width="68" height="68" + + <########################## Other Stencils #############################> + + $Script:IconFWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;" #width="71" height="60" + $Script:IconDet = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/other/Detonation.svg;" #width="42.63" height="44" + $Script:IconAppGWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;" #width="64" height="64" + $Script:IconBricks = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;" #width="60" height="68" + $Script:IconError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="30" height="30" + $Script:OnPrem = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/mscae/Exchange_On_premises_Access.svg;" #width="168.2" height="290" + $Script:Signature = "aspect=fixed;html=1;points=[];align=left;image;fontSize=22;image=img/lib/azure2/general/Dev_Console.svg;" #width="27.5" height="22" + $Script:CloudOnly = "aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;" #width="380.77" height="275" + + } + + <# Function to begin OnPrem environment drawing. Will begin by Local network Gateway, then Express Route.#> + Function OnPremNet { + $Script:VNETHistory = @() + $Script:RoutsW = $AZVNETs | Select-Object -Property Name, @{N="Subnets";E={$_.properties.subnets.properties.addressPrefix.count}} | Sort-Object -Property Subnets -Descending + + $Script:Alt = 0 + + ##################################### Local Network Gateway ############################################# + + foreach($GTW in $AZLGWs) + { + if($GTW.properties.provisioningState -ne 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'This Local Network Gateway has Errors') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconError 40 ($Script:Alt+25) "25" "25" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Con1 = $AZCONs | Where-Object {$_.properties.localNetworkGateway2.id -eq $GTW.id} + + if(!$Con1 -and $GTW.properties.provisioningState -eq 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'No Connections were found in this Local Network Gateway') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SymInfo 40 ($Script:Alt+30) "20" "20" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Name = $GTW.name + $IP = $GTW.properties.gatewayIpAddress + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name + "`n" + [string]$IP)) + $Script:XmlWriter.WriteAttributeString('Local_Address_Space', [string]$GTW.properties.localNetworkAddressSpace.addressPrefixes) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconTraffic 50 $Script:Alt "67" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:GTWAddress = ($Script:CellID+'-'+($Script:IDNum-1)) + $Script:ConnSourceResource = 'GTW' + + OnPrem $Con1 + + $Script:Alt = $Script:Alt + 150 + } + + ##################################### ERS ############################################# + + Foreach($ERs in $AZEXPROUTEs) + { + if($ERs.properties.provisioningState -ne 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'This Express Route has Errors') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconError 51 ($Script:Alt+25) "25" "25" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Con1 = $AZCONs | Where-Object {$_.properties.peer.id -eq $ERs.id} + + if(!$Con1 -and $ERs.properties.circuitProvisioningState -eq 'Enabled') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'No Connections were found in this Express Route') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SymInfo 51 ($Script:Alt+30) "20" "20" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Name = $ERs.name + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" +[string]$Name)) + $Script:XmlWriter.WriteAttributeString('Provider', [string]$ERs.properties.serviceProviderProperties.serviceProviderName) + $Script:XmlWriter.WriteAttributeString('Peering_location', [string]$ERs.properties.serviceProviderProperties.peeringLocation) + $Script:XmlWriter.WriteAttributeString('Bandwidth', [string]$ERs.properties.serviceProviderProperties.bandwidthInMbps) + $Script:XmlWriter.WriteAttributeString('SKU', [string]$ERs.sku.tier) + $Script:XmlWriter.WriteAttributeString('Billing_model', $ERs.sku.family) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconExpressRoute "61.5" $Script:Alt "44" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:ERAddress = ($Script:CellID+'-'+($Script:IDNum-1)) + $Script:ConnSourceResource = 'ER' + + OnPrem $Con1 + + $Script:Alt = $Script:Alt + 150 + + } + + ##################################### VWAN VPNSITES ############################################# + + foreach($GTW in $AZVPNSITES) + { + if($GTW.properties.provisioningState -ne 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'This VPN Site has Errors') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconError 40 ($Script:Alt+25) "25" "25" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $wan1 = $AZVWAN | Where-Object {$_.properties.vpnSites.id -eq $GTW.id} + + if(!$wan1 -and $GTW.properties.provisioningState -eq 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'No vWANs were found in this VPN Site') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SymInfo 40 ($Script:Alt+30) "20" "20" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Name = $GTW.name + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name)) + $Script:XmlWriter.WriteAttributeString('Address_Space', [string]$GTW.properties.addressSpace.addressPrefixes) + $Script:XmlWriter.WriteAttributeString('Link_Speed_In_Mbps', [string]$GTW.properties.deviceProperties.linkSpeedInMbps) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconNAT 50 $Script:Alt "67" "40" 1 + + $Script:XmlWriter.WriteEndElement() + #$tt = $tt + 200 + + vWan $wan1 + + $Script:Alt = $Script:Alt + 150 + } + + ##################################### VWAN ERs ############################################# + + foreach($GTW in $AZVERs) + { + if($GTW.properties.provisioningState -ne 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'This Express Route Circuit has Errors') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconError 40 ($Script:Alt+25) "25" "25" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $wan1 = $AZVWAN | Where-Object {$_.properties.vpnSites.id -eq $GTW.id} + + if(!$wan1 -and $GTW.properties.provisioningState -eq 'Succeeded') + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Status', 'No vWANs were found in this Express Route Circuit') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SymInfo 40 ($Script:Alt+30) "20" "20" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Name = $GTW.name + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" + [string]$Name)) + $Script:XmlWriter.WriteAttributeString('Address_Space', [string]$GTW.properties.addressSpace.addressPrefixes) + $Script:XmlWriter.WriteAttributeString('LinkSpeed_In_Mbps', [string]$GTW.properties.deviceProperties.linkSpeedInMbps) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconNAT 50 $Script:Alt "67" "40" 1 + + $Script:XmlWriter.WriteEndElement() + #$tt = $tt + 200 + + vWan $wan1 + + $Script:Alt = $Script:Alt + 150 + } + + ##################################### LABELs ############################################# + + if(!$Script:FullEnvironment) + { + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Ret -520 -100 "500" ($Script:Alt + 100) 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ('On Premises'+ "`n" +'Environment')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $OnPrem -351 (($Script:Alt + 100)/2) "168.2" "290" 1 + + $Script:XmlWriter.WriteEndElement() + + label + + Icon $Signature -520 ($Script:Alt + 100) "27.5" "22" 1 + + $Script:XmlWriter.WriteEndElement() + } + + } + + Function OnPrem { + Param($Con1) + foreach ($Con2 in $Con1) + { + if([string]::IsNullOrEmpty($Script:vnetLoc)) + { + $Script:vnetLoc = 700 + } + $VGT = $AZVGWs | Where-Object {$_.id -eq $Con2.properties.virtualNetworkGateway1.id} + $VGTPIP = $PIPs | Where-Object {$_.properties.ipConfiguration.id -eq $VGT.properties.ipConfigurations.id} + + $Name2 = $Con2.Name + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', [string]$Name2) + $Script:XmlWriter.WriteAttributeString('Connection_Type', [string]$Con2.properties.connectionType) + $Script:XmlWriter.WriteAttributeString('Use_Azure_Private_IP_Address', [string]$Con2.properties.useLocalAzureIpAddress) + $Script:XmlWriter.WriteAttributeString('Routing_Weight', [string]$Con2.properties.routingWeight) + $Script:XmlWriter.WriteAttributeString('Connection_Protocol', [string]$Con2.properties.connectionProtocol) + $Script:Source = ($Script:CellID+'-'+($Script:IDNum-1)) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconConnections 250 $Script:Alt "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + if($Script:ConnSourceResource -eq 'ER') + { + Connect $Script:ERAddress $Script:Target + } + elseif($Script:ConnSourceResource -eq 'GTW') + { + Connect $Script:GTWAddress $Script:Target + } + + $Script:Source = $Script:Target + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" +[string]$VGT.Name + "`n" + [string]$VGTPIP.properties.ipAddress)) + $Script:XmlWriter.WriteAttributeString('VPN_Type', [string]$VGT.properties.vpnType) + $Script:XmlWriter.WriteAttributeString('Generation', [string]$VGT.properties.vpnGatewayGeneration ) + $Script:XmlWriter.WriteAttributeString('SKU', [string]$VGT.properties.sku.name) + $Script:XmlWriter.WriteAttributeString('Gateway_Type', [string]$VGT.properties.gatewayType) + $Script:XmlWriter.WriteAttributeString('Active_active_mode', [string]$VGT.properties.activeActive) + $Script:XmlWriter.WriteAttributeString('Gateway_Private_IPs', [string]$VGT.properties.enablePrivateIpAddress) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVGW2 425 ($Script:Alt-4) "31.34" "48" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + Connect $Script:Source $Script:Target + + $Script:Source = $Script:Target + + foreach($AZVNETs2 in $AZVNETs) + { + foreach($VNETTEMP in $AZVNETs2.properties.subnets.properties.ipconfigurations.id) + { + $VV4 = $VNETTEMP.Split("/") + $VNETTEMP1 = ($VV4[0] + '/' + $VV4[1] + '/' + $VV4[2] + '/' + $VV4[3] + '/' + $VV4[4] + '/' + $VV4[5] + '/' + $VV4[6] + '/' + $VV4[7]+ '/' + $VV4[8]) + if($VNETTEMP1 -eq $VGT.id) + { + $Script:VNET2 = $AZVNETs2 + + $Script:Alt0 = $Script:Alt + if($VNET2.id -notin $VNETHistory.vnet) + { + if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) + { + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' + }Else{ + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) + if($VNET2.properties.dhcpoptions.dnsServers) + { + $Script:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + else + { + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVNET 600 $Script:Alt "65" "39" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:VNETDrawID = ($Script:CellID+'-'+($Script:IDNum-1)) + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + Connect $Script:Source $Script:Target + + if($VNET2.properties.enableDdosProtection -eq $true) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDDOS 580 ($Script:Alt + 15) "23" "28" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Script:Source = $Script:Target + + VNETCreator $Script:VNET2 + + if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) + { + PeerCreator $Script:VNET2 + } + + $tmp =@{ + 'VNETid' = $Script:VNETDrawID; + 'VNET' = $AZVNETs2.id + } + $Script:VNETHistory += $tmp + + } + else + { + + $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $AZVNETs2.id} + + Connect $Script:Source $VNETDID.VNETid + + } + + } + } + + } + + if($Con1.count -gt 1) + { + $Script:Alt = $Script:Alt + 250 + } + } + + } + + Function vWan { + Param($wan1) + + if([string]::IsNullOrEmpty($Script:vnetLoc)) + { + $Script:vnetLoc = 700 + } + + $Name2 = $wan1.Name + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', [string]$Name2) + $Script:XmlWriter.WriteAttributeString('allow_VnetToVnet_Traffic', [string]$wan1.properties.allowVnetToVnetTraffic) + $Script:XmlWriter.WriteAttributeString('allow_BranchToBranch_Traffic', [string]$wan1.properties.allowBranchToBranchTraffic) + $Script:Source = ($Script:CellID+'-'+($Script:IDNum-1)) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVWAN 250 $Script:Alt "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + Connect $Script:Source $Script:Target + + $Script:Source1 = $Script:Target + + foreach ($Con2 in $wan1.properties.virtualHubs.id) + { + $VHUB = $AZVHUB | Where-Object {$_.id -eq $Con2} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ("`n" +[string]$VHUB.Name)) + $Script:XmlWriter.WriteAttributeString('Address_Prefix', [string]$VHUB.properties.addressPrefix) + $Script:XmlWriter.WriteAttributeString('Preferred_Routing_Gateway', [string]$VHUB.properties.preferredRoutingGateway) + $Script:XmlWriter.WriteAttributeString('Virtual_Router_Asn', [string]$VHUB.properties.virtualRouterAsn) + $Script:XmlWriter.WriteAttributeString('Allow_BranchToBranch_Traffic', [string]$VHUB.properties.allowBranchToBranchTraffic) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVWAN 425 $Script:Alt "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + Connect $Script:Source1 $Script:Target + + $Script:Source = $Script:Target + + foreach($AZVNETs2 in $AZVNETs) + { + foreach($VNETTEMP in $AZVNETs2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) + { + $VV4 = $VNETTEMP.Split("/") + $VNETTEMP1 = $VV4[8] + if($VNETTEMP1 -like ('HV_'+$VHUB.name+'_*')) + { + $Script:VNET2 = $AZVNETs2 + + $Script:Alt0 = $Script:Alt + if($VNET2.id -notin $VNETHistory.vnet) + { + if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) + { + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' + }Else{ + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) + if($VNET2.properties.dhcpoptions.dnsServers) + { + $Script:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + else + { + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVNET 600 $Script:Alt "65" "39" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:VNETDrawID = ($Script:CellID+'-'+($Script:IDNum-1)) + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + Connect $Script:Source $Script:Target + + if($VNET2.properties.enableDdosProtection -eq $true) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDDOS 580 ($Script:Alt + 15) "23" "28" 1 + + $Script:XmlWriter.WriteEndElement() + } + + VNETCreator $Script:VNET2 + + if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id -and $VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id -notlike ('*/HV_'+$VHUB.name+'_*')) + { + PeerCreator $Script:VNET2 + } + + $tmp =@{ + 'VNETid' = $Script:VNETDrawID; + 'VNET' = $AZVNETs2.id + } + $Script:VNETHistory += $tmp + + } + else + { + $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $AZVNETs2.id} + + Connect $Script:Source $VNETDID.VNETid + } + } + } + } + + if($Con1.count -gt 1) + { + $Script:Alt = $Script:Alt + 250 + } + } + + } + + <# Function for Cloud Only Environments #> + Function CloudOnly { + $Script:RoutsW = $AZVNETs | Select-Object -Property Name, @{N="Subnets";E={$_.properties.subnets.properties.addressPrefix.count}} | Sort-Object -Property Subnets -Descending + + $Script:VNETHistory = @() + if([string]::IsNullOrEmpty($Script:vnetLoc)) + { + $Script:vnetLoc = 700 + } + $Script:Alt = 2 + + foreach($AZVNETs2 in $AZVNETs) + { + $Script:VNET2 = $AZVNETs2 + + $Script:Alt0 = $Script:Alt + if($VNET2.id -notin $VNETHistory.vnet) + { + + if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) + { + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' + }Else{ + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) + if($VNET2.properties.dhcpoptions.dnsServers) + { + $Script:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + else + { + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVNET 600 $Script:Alt "65" "39" 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:VNETDrawID = ($Script:CellID+'-'+($Script:IDNum-1)) + + $Script:Target = ($Script:CellID+'-'+($Script:IDNum-1)) + + if($VNET2.properties.enableDdosProtection -eq $true) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDDOS 580 ($Script:Alt + 15) "23" "28" 1 + + $Script:XmlWriter.WriteEndElement() + } + + $Script:Source = $Script:Target + + VNETCreator $Script:VNET2 + + if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) + { + PeerCreator $Script:VNET2 + } + + $tmp =@{ + 'VNETid' = $Script:VNETDrawID; + 'VNET' = $AZVNETs2.id + } + $Script:VNETHistory += $tmp + + } + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Ret -520 -100 "500" ($Script:Alt + 100) 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ('Cloud Only'+ "`n" +'Environment')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Script:CloudOnly -460 (($Script:Alt + 100)/2) "380" "275" 1 + + $Script:XmlWriter.WriteEndElement() + + label + + Icon $Signature -520 ($Script:Alt + 100) "27.5" "22" 1 + + $Script:XmlWriter.WriteEndElement() + + } + + Function FullEnvironment { + foreach($AZVNETs2 in $AZVNETs) + { + $Script:VNET2 = $AZVNETs2 + + if($VNET2.id -notin $VNETHistory.vnet) + { + if($VNET2.properties.addressSpace.addressPrefixes.count -ge 10) + { + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' + }Else{ + $AddSpace = ($VNET2.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$VNET2.Name + "`n" + $AddSpace)) + if($VNET2.properties.dhcpoptions.dnsServers) + { + $Script:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNET2.properties.dhcpoptions.dnsServers) + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + else + { + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNET2.properties.enableDdosProtection) + } + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVNET 600 $Script:Alt "65" "39" 1 + + $Script:XmlWriter.WriteEndElement() + + VNETCreator $Script:VNET2 + + if($VNET2.properties.virtualNetworkPeerings.properties.remoteVirtualNetwork.id) + { + PeerCreator $Script:VNET2 + } + } + + $Script:Alt = $Script:Alt + 250 + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Ret -520 -100 "500" ($Script:Alt + 100) 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ('On Premises'+ "`n" +'Environment')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $OnPrem -351 (($Script:Alt + 100)/2) "168.2" "290" 1 + + $Script:XmlWriter.WriteEndElement() + + label + + Icon $Signature -520 ($Script:Alt + 100) "27.5" "22" 1 + + $Script:XmlWriter.WriteEndElement() + + } + + <# Function for VNET creation #> + Function VNETCreator { + Param($VNET2) + $Script:sizeL = $VNET2.properties.subnets.properties.addressPrefix.count + + [System.GC]::GetTotalMemory($true) | out-null + + if($VNET2.id -notin $VNETHistory.vnet) + { + if ($Script:sizeL -gt 5) + { + $Script:sizeL = $Script:sizeL / 2 + $Script:sizeL = [math]::ceiling($Script:sizeL) + $Script:sizeC = $Script:sizeL + $Script:sizeL = (($Script:sizeL * 210) + 30) + + if('gatewaysubnet' -in $VNET2.properties.subnets.name) + { + HubContainer ($Script:vnetLoc) ($Script:Alt0 - 20) $Script:sizeL "490" $VNET2.Name + } + else + { + VNETContainer ($Script:vnetLoc) ($Script:Alt0 - 20) $Script:sizeL "490" $VNET2.Name + } + + + + $Script:VNETSquare = ($Script:CellID+'-'+($Script:IDNum-1)) + + $SubName = $Subscriptions | Where-Object {$_.id -eq $VNET2.subscriptionId} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $SubName.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconSubscription $Script:sizeL 460 "67" "40" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $ADVS = '' + $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} + If($ADVS) + { + $Count = 1 + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + foreach ($ADV in $ADVS) + { + $Attr1 = ('Recommendation'+[string]$Count) + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconCostMGMT ($Script:sizeL + 150) 460 "30" "35" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + } + + Subnet ($Script:vnetLoc + 15) $VNET2 $Script:IDNum $Script:DiagramCache $Script:ContID + + if($Script:VNETPIP) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $Count = 1 + Foreach ($PIPDetail in $Script:VNETPIP) + { + $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) + $Script:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDet ($Script:sizeL + 500) 225 "42.63" "44" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + Connect ($Script:CellID+'-'+($Script:IDNum-1)) $Script:ContID $Script:ContID + } + + $Script:Alt = $Script:Alt + 650 + } + else + { + $Script:sizeL = (($Script:sizeL * 210) + 30) + + if('gatewaysubnet' -in $VNET2.properties.subnets.name) + { + HubContainer ($Script:vnetLoc) ($Script:Alt0 - 15) $Script:sizeL "260" $VNET2.Name + } + else + { + VNETContainer ($Script:vnetLoc) ($Script:Alt0 - 15) $Script:sizeL "260" $VNET2.Name + } + + + $Script:VNETSquare = ($Script:CellID+'-'+($Script:IDNum-1)) + + $SubName = $Subscriptions | Where-Object {$_.id -eq $VNET2.subscriptionId} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $SubName.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconSubscription $Script:sizeL 225 "67" "40" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $ADVS = '' + $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} + If($ADVS) + { + $Count = 1 + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + foreach ($ADV in $ADVS) + { + $Attr1 = ('Recommendation'+[string]$Count) + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconCostMGMT ($Script:sizeL + 150) 225 "30" "35" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + } + + Subnet ($Script:vnetLoc + 15) $VNET2 $Script:IDNum $Script:DiagramCache $Script:ContID + + if($Script:VNETPIP) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $Count = 1 + Foreach ($PIPDetail in $Script:VNETPIP) + { + $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) + $Script:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDet ($Script:sizeL + 500) 107 "42.63" "44" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + Connect ($Script:CellID+'-'+($Script:IDNum-1)) $Script:ContID $Script:ContID + } + $Script:Alt = $Script:Alt + 350 + } + } + + [System.GC]::GetTotalMemory($true) | out-null + } + + <# Function for create peered VNETs #> + Function PeerCreator { + Param($VNET2) + + $Script:vnetLoc1 = $Script:Alt + + Foreach ($Peer in $VNET2.properties.virtualNetworkPeerings) + { + $VNETSUB = $AZVNETs | Where-Object {$_.id -eq $Peer.properties.remoteVirtualNetwork.id} + + if($VNETSUB.id -in $VNETHistory.VNET) + { + $VNETDID = $VNETHistory | Where-Object {$_.VNET -eq $VNETSUB.id} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Peering_Name', $Peer.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") + $Script:XmlWriter.WriteAttributeString('edge', "1") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + $Script:XmlWriter.WriteAttributeString('source', $Script:VNETDrawID) + $Script:XmlWriter.WriteAttributeString('target', $VNETDID.VNETid) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('relative', "1") + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + else + { + $Script:sizeL = $VNETSUB.properties.subnets.properties.addressPrefix.count + $BrokenVNET = if($VNETSUB.properties.subnets.properties.addressPrefix.count){'Not Broken'}else{'Broken'} + + if($VNETSUB.properties.addressSpace.addressPrefixes.count -ge 10) + { + $AddSpace = ($VNETSUB.properties.addressSpace.addressPrefixes | Select-Object -First 20 | ForEach-Object {$_ + "`n"} ) + "`n" +'...' + }Else{ + $AddSpace = ($VNETSUB.properties.addressSpace.addressPrefixes | ForEach-Object {$_ + "`n"}) + } + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ($VNETSUB.name + "`n" + $AddSpace)) + if($VNETSUB.properties.dhcpoptions.dnsServers) + { + $Script:XmlWriter.WriteAttributeString('Custom_DNS_Servers', [string]$VNETSUB.properties.dhcpoptions.dnsServers) + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNETSUB.properties.enableDdosProtection) + } + else + { + $Script:XmlWriter.WriteAttributeString('DDOS_Protection', [string]$VNETSUB.properties.enableDdosProtection) + } + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVNET $Script:vnetLoc $Script:vnetLoc1 "67" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + + $TwoTarget = ($Script:CellID+'-'+($Script:IDNum-1)) + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('Peering_Name', $Peer.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") + $Script:XmlWriter.WriteAttributeString('edge', "1") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + $Script:XmlWriter.WriteAttributeString('source', $Script:Source) + $Script:XmlWriter.WriteAttributeString('target', $TwoTarget) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('relative', "1") + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + + if($VNETSUB.properties.enableDdosProtection -eq $true) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDDOS ($Script:vnetLoc - 20) ($Script:vnetLoc1 + 15) "23" "28" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + if ($Script:sizeL -gt 5) + { + $Script:sizeL = $Script:sizeL / 2 + $Script:sizeL = [math]::ceiling($Script:sizeL) + $Script:sizeC = $Script:sizeL + $Script:sizeL = (($Script:sizeL * 210) + 30) + + if('gatewaysubnet' -in $VNETSUB.properties.subnets.name) + { + HubContainer ($Script:vnetLoc + 100) ($Script:vnetLoc1 - 20) $Script:sizeL "490" $VNETSUB.name + } + else + { + VNETContainer ($Script:vnetLoc + 100) ($Script:vnetLoc1 - 20) $Script:sizeL "490" $VNETSUB.name + } + + $Script:VNETSquare = ($Script:CellID+'-'+($Script:IDNum-1)) + + $SubName = $Subscriptions | Where-Object {$_.id -eq $VNETSUB.subscriptionId} + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $SubName.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconSubscription $Script:sizeL 460 "67" "40" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $ADVS = '' + $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} + If($ADVS) + { + $Count = 1 + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + foreach ($ADV in $ADVS) + { + $Attr1 = ('Recommendation'+[string]$Count) + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconCostMGMT ($Script:sizeL + 150) 460 "30" "35" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + } + + Subnet ($Script:vnetLoc + 120) $VNETSUB $Script:IDNum $Script:DiagramCache $Script:ContID + + $Script:vnetLoc1 = $Script:vnetLoc1 + 230 + + if($Script:VNETPIP) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $Count = 1 + Foreach ($PIPDetail in $Script:VNETPIP) + { + $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) + $Script:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDet ($Script:sizeL + 500) 225 "42.63" "44" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + Connect ($Script:CellID+'-'+($Script:IDNum-1)) $Script:ContID $Script:ContID + } + + $Script:Alt = $Script:Alt + 650 + } + else + { + $Script:sizeL = (($Script:sizeL * 210) + 30) + + if($BrokenVNET -eq 'Not Broken') + { + if('gatewaysubnet' -in $VNETSUB.properties.subnets.name) + { + HubContainer ($Script:vnetLoc + 100) ($Script:vnetLoc1 - 20) $Script:sizeL "260" $VNETSUB.name + } + else + { + VNETContainer ($Script:vnetLoc + 100) ($Script:vnetLoc1 - 20) $Script:sizeL "260" $VNETSUB.name + } + } + else + { + BrokenContainer ($Script:vnetLoc + 100) ($Script:vnetLoc1 - 20) "250" "260" 'Broken Peering' + $Script:sizeL = '250' + } + + $Script:VNETSquare = ($Script:CellID+'-'+($Script:IDNum-1)) + + $SubName = $Subscriptions | Where-Object {$_.id -eq $VNETSUB.subscriptionId} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $SubName.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconSubscription $Script:sizeL 225 "67" "40" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $ADVS = '' + $ADVS = $Advisories | Where-Object {$_.Properties.Category -eq 'Cost' -and $_.Properties.resourceMetadata.resourceId -eq ('/subscriptions/'+$SubName.id)} + If($ADVS) + { + $Count = 1 + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + foreach ($ADV in $ADVS) + { + $Attr1 = ('Recommendation'+[string]$Count) + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$ADV.Properties.shortDescription.solution) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconCostMGMT ($Script:sizeL + 150) 225 "30" "35" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + } + + Subnet ($Script:vnetLoc + 120) $VNETSUB $Script:IDNum $Script:DiagramCache $Script:ContID + + if($Script:VNETPIP) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $Count = 1 + Foreach ($PIPDetail in $Script:VNETPIP) + { + $Attr1 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('PublicIP-'+[string]("{0:d3}" -f $Count)+'-IP') + $Script:XmlWriter.WriteAttributeString($Attr1, [string]$PIPDetail.name) + $Script:XmlWriter.WriteAttributeString($Attr2, [string]$PIPDetail.properties.ipaddress) + + $Count ++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconDet ($Script:sizeL+ 500) 107 "42.63" "44" $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + Connect ($Script:CellID+'-'+($Script:IDNum-1)) $Script:ContID $Script:ContID + + } + + } + + $tmp =@{ + 'VNETid' = $TwoTarget; + 'VNET' = $VNETSUB.id + } + $Script:VNETHistory += $tmp + + $Script:vnetLoc1 = $Script:vnetLoc1 + 350 + } + } + $Script:Alt = $Script:vnetLoc1 + } + + Function Subnet { + Param($subloc,$VNET,$IDNum,$DiagramCache,$ContID) + + $NameString = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + New-Variable -Name ('Run_'+$NameString) -Scope Global + + Set-Variable -name ('Run_'+$NameString) -Value ([PowerShell]::Create()).AddScript({param($subloc,$VNET,$IDNum,$DiagramCache,$ContID,$Resources) + + $etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $IDNum++ + + $SubFile = ($DiagramCache+$CellID+'.xml') + + ###################################################### STENCILS #################################################### + + Function Stensils { + $Script:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" + + $Script:IconConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" + $Script:IconExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" + $Script:IconVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" + $Script:IconVGW2 = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" + $Script:IconVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" + $Script:IconTraffic = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Local_Network_Gateways.svg;" #width="68" height="68" + $Script:IconNIC = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;" #width="68" height="60" + $Script:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" + $Script:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" + $Script:IconNSG = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Network_Security_Groups.svg;" # width="26.35" height="32" + $Script:IconUDR = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Route_Tables.svg;" #width="30.97" height="30" + $Script:IconDDOS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;" # width="23" height="28" + $Script:IconPIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" + $Script:IconNAT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/NAT.svg;" # width="65" height="52" + + <########################## Azure Generic Stencils #############################> + + $Script:SymError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="50" height="50" + $Script:SymInfo = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Information.svg;" #width="64" height="64" + $Script:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" + $Script:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" + $Script:IconBastions = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/general/Launch_Portal.svg;" #width="68" height="67" + $Script:IconContain = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Container_Instances.svg;" #width="64" height="68" + $Script:IconVWAN = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_WANs.svg;" #width="65" height="64" + $Script:IconCostMGMT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Cost_Analysis.svg;" #width="60" height="70" + + <########################## Azure Computing Stencils #############################> + + $Script:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" + $Script:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" + $Script:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" + $Script:IconARO = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/mscae/OpenShift.svg;" #width="50" height="46" + $Script:IconFunApps = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Function_Apps.svg;" # width="68" height="60" + + <########################## Azure Service Stencils #############################> + + $Script:IconAPIMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/app_services/API_Management_Services.svg;" #width="65" height="60" + $Script:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" + + <########################## Azure Storage Stencils #############################> + + $Script:IconNetApp = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;" #width="65" height="52" + + <########################## Azure Storage Stencils #############################> + + $Script:IconDataExplorer = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" #width="68" height="68" + + <########################## Other Stencils #############################> + + $Script:IconFWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;" #width="71" height="60" + $Script:IconDet = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/other/Detonation.svg;" #width="42.63" height="44" + $Script:IconAppGWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;" #width="64" height="64" + $Script:IconBricks = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;" #width="60" height="68" + $Script:IconError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="30" height="30" + $Script:OnPrem = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/mscae/Exchange_On_premises_Access.svg;" #width="168.2" height="290" + $Script:Signature = "aspect=fixed;html=1;points=[];align=left;image;fontSize=22;image=img/lib/azure2/general/Dev_Console.svg;" #width="27.5" height="22" + $Script:CloudOnly = "aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;" #width="380.77" height="275" + + } + + ####################################################### PROCTYPE #################################################### + + + Function ProcType { + Param($sub,$subloc,$Alt0,$ContainerID) + + $temp = '' + remove-variable TrueTemp -ErrorAction SilentlyContinue + remove-variable RESNames -ErrorAction SilentlyContinue + + <####################################################### FIND THE RESOURCES IN THE SUBNET ###################################################################> + + if($sub.properties.resourceNavigationLinks.properties.linkedResourceType -eq 'Microsoft.ApiManagement/service') + { + $TrueTemp = 'APIM' + } + if($sub.properties.serviceAssociationLinks.properties.link -and $null -eq $TrueTemp) + { + if($sub.properties.serviceAssociationLinks.properties.link.split("/")[6] -eq 'Microsoft.Web') + { + $TrueTemp = 'App Service' + } + } + if($sub.properties.applicationGatewayIPConfigurations.id -and $null -eq $TrueTemp) + { + if($sub.properties.applicationGatewayIPConfigurations.id.split("/")[7] -eq 'applicationGateways') + { + $TrueTemp = 'applicationGateways' + } + } + if($sub.properties.ipconfigurations.id.count -eq 1 -and $null -eq $TrueTemp) + { + if($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'virtualNetworkGateways') + { + $TrueTemp = 'virtualNetworkGateways' + } + elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'loadBalancers') + { + $TrueTemp = 'loadBalancers' + } + elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'applicationGateways') + { + $TrueTemp = 'applicationGateways' + } + elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'bastionHosts') + { + $TrueTemp = 'bastionHosts' + } + elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'azureFirewalls') + { + $TrueTemp = 'azureFirewalls' + } + } + if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Databricks/workspaces' -and $null -eq $TrueTemp) + { + $TrueTemp = 'DataBricks' + } + if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Web/serverfarms' -and $null -eq $TrueTemp) + { + $TrueTemp = 'App Service' + } + if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.ContainerInstance/containerGroups' -and $null -eq $TrueTemp) + { + $TrueTemp = 'Container Instance' + } + if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Netapp/volumes' -and $null -eq $TrueTemp) + { + $TrueTemp = 'NetApp' + } + if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Kusto/clusters' -and $null -eq $TrueTemp) + { + $TrueTemp = 'Data Explorer Clusters' + } + + if([string]::IsNullOrEmpty($TrueTemp)) + { + $AKS = $Script:AKS + if($sub.id -in $AKS.properties.agentPoolProfiles.vnetSubnetID) + { + $TrueTemp = 'AKS' + } + } + if([string]::IsNullOrEmpty($TrueTemp)) + { + $Types = @() + + Foreach($type in $sub.properties.ipconfigurations.id) + { + if($type.Split("/")[8] -like 'aks-*') + { + $Types += 'AKS' + } + if($type.Split("/")[8] -like 'gwhost*') + { + $Types += 'APIM' + } + else + { + $Types += $type.Split("/")[7] + } + } + $temp = $Types | Group-Object | Sort-Object -Property Count -Descending + if($temp) + { + $TrueTemp = $temp[0].name + } + } + + if([string]::IsNullOrEmpty($TrueTemp)) + { + if ($sub.id -in ($Script:VMSS).properties.virtualMachineProfile.networkprofile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id) + { + $TrueTemp = 'virtualMachineScaleSets' + } + } + + <#################################################### FIND RESOURCE NAME AND DETAILS #################################################################> + + if($TrueTemp -eq 'networkInterfaces') + { + $NIcNames = $Script:NIC | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id} + + if($sub.properties.privateEndpoints.id) + { + $PrivEndNames = $Script:PrivEnd | Where-Object {$_.properties.networkInterfaces.id -in $NIcNames.id} + $TrueTemp = 'privateLinkServices' + $RESNames = $PrivEndNames + } + else + { + $VMNamesAro = $Script:VM | Where-Object {$_.properties.networkprofile.networkInterfaces.id -in $NIcNames.id} + if($VMNamesAro.properties.storageprofile.imageReference.offer -like 'aro*') + { + $ARONames = $Script:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} + $TrueTemp = 'Open Shift' + $RESNames = $ARONames + } + if($TrueTemp -ne 'Open Shift') + { + $VMs = @() + $VMNames = ($Script:VM).properties.networkprofile.networkInterfaces.id | Where-Object {$_ -in $NIcNames.id} + $VMs = foreach($NIC in $VMNames) + { + $Script:VM| Where-Object {$NIC -in $_.properties.networkprofile.networkInterfaces.id} + } + if($VMs) + { + $TrueTemp = 'Virtual Machine' + $RESNames = $VMs + } + } + if($TrueTemp -eq 'networkInterfaces') + { + $TrueTemp = 'Network Interface' + $RESNames = $NIcNames + } + } + } + if($TrueTemp -eq 'AKS') + { + $AKSNames = $Script:AKS | Where-Object {$_.properties.agentPoolProfiles.vnetSubnetID -eq $sub.id} + $RESNames = $AKSNames + } + if($TrueTemp -eq 'Data Explorer Clusters') + { + $KustoNames = $Script:Kusto | Where-Object {$_.properties.virtualNetworkConfiguration.subnetid -eq $sub.id} + $RESNames = $KustoNames + } + if($TrueTemp -eq 'applicationGateways') + { + $AppGTWNames = $Script:AppGtw| Where-Object {$_.properties.gatewayIPConfigurations.id -in $sub.properties.applicationGatewayIPConfigurations.id} + $RESNames = $AppGTWNames + } + if($TrueTemp -eq 'DataBricks') + { + $DatabriksNames = @() + $Databricks = $Script:Databricks + $DatabriksNames = Foreach($Data in $Databricks) + { + if($Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.customPrivateSubnetName.value -eq $sub.id -or $Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.custompublicSubnetName.value -eq $sub.id) + { + $Data + } + } + $RESNames = $DatabriksNames + } + if($TrueTemp -eq 'App Service') + { + $Apps = $Script:AppWeb | Where-Object {$_.properties.virtualNetworkSubnetId -eq $Sub.id} + if($Apps.kind -like 'functionapp*') + { + $FuntionAppNames = $Apps + $TrueTemp = 'Function App' + $RESNames = $FuntionAppNames + } + else + { + $ServiceAppNames = $Apps + $RESNames = $Apps + } + } + if($TrueTemp -eq 'APIM') + { + $APIMNames = $Script:APIM | Where-Object {$_.properties.virtualNetworkConfiguration.subnetResourceId -eq $sub.id} + $RESNames = $APIMNames + } + if($TrueTemp -eq 'loadBalancers') + { + $LBNames = $Script:LB | Where-Object {$_.properties.frontendIPConfigurations.id -in $sub.properties.ipconfigurations.id} + $RESNames = $LBNames + } + if($TrueTemp -eq 'virtualMachineScaleSets') + { + $VMSSNames = $Script:VMSS | Where-Object {$_.properties.virtualMachineProfile.networkProfile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id } + $RESNames = $VMSSNames + } + if($TrueTemp -eq 'virtualNetworkGateways') + { + $VPNGTWNames = $Script:AZVGWs | Where-Object {$_.properties.ipconfigurations.properties.subnet.id -eq $sub.id } + $RESNames = $VPNGTWNames + } + if($TrueTemp -eq 'bastionHosts') + { + $BastionNames = $Script:Bastion | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } + $RESNames = $BastionNames + } + if($TrueTemp -eq 'azureFirewalls') + { + $AzFWNames = $Script:FW | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } + $RESNames = $AzFWNames + } + if($TrueTemp -eq 'Container Instance') + { + $ContainerNames = '' + $ContNICs = $Script:NetProf | Where-Object {$_.properties.containerNetworkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id} + $ContainerNames = $Script:Container | Where-Object {$_.properties.networkprofile.id -in $ContNICs.id} + $RESNames = $ContainerNames + if([string]::IsNullOrEmpty($ContainerNames)) + { + $ARONames = $Script:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} + $TrueTemp = 'Open Shift' + $RESNames = $ARONames + } + } + if($TrueTemp -eq 'NetApp') + { + $NetAppNames = $Script:ANF | Where-Object {$_.properties.subnetId -eq $sub.id } + $RESNames = $NetAppNames + } + + <###################################################### DROP THE ICONS ######################################################> + + switch ($TrueTemp) + { + 'Virtual Machine' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' VMs')) + + $Count = 1 + foreach ($VMName in $RESNames.Name) + { + $Attr1 = ('VirtualMachine-'+[string]("{0:d3}" -f $Count)) + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$VMName) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVMs ($subloc+64) ($Alt0+40) "69" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + $Script:XmlTempWriter.WriteAttributeString('VM_Size', [string]$RESNames.properties.hardwareProfile.vmSize) + $Script:XmlTempWriter.WriteAttributeString('OS', [string]$RESNames.properties.storageProfile.osDisk.osType) + $Script:XmlTempWriter.WriteAttributeString('OS_Disk_Size_GB', [string]$RESNames.properties.storageProfile.osDisk.diskSizeGB) + $Script:XmlTempWriter.WriteAttributeString('Image_Publisher', [string]$RESNames.properties.storageProfile.imageReference.publisher) + $Script:XmlTempWriter.WriteAttributeString('Image_SKU', [string]$RESNames.properties.storageProfile.imageReference.sku) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVMs ($subloc+64) ($Alt0+40) "69" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + 'AKS' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' AKS Clusters')) + + $Count = 1 + foreach ($AKSName in $RESNames.Name) + { + $Attr1 = ('Kubernetes_Cluster-'+[string]("{0:d3}" -f $Count)) + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$AKSName) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAKS ($subloc+65) ($Alt0+40) "68" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) + + $Count = 1 + foreach($Pool in $RESNames.properties.agentPoolProfiles) + { + $Attr1 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Count') + $Attr3 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Size') + $Attr4 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Version') + $Attr5 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Mode') + $Attr6 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Max_Pods') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$Pool.name) + $Script:XmlTempWriter.WriteAttributeString($Attr2, [string]($Pool | Select-Object -Property 'count').count) + $Script:XmlTempWriter.WriteAttributeString($Attr3, [string]$Pool.vmSize) + $Script:XmlTempWriter.WriteAttributeString($Attr4, [string]$Pool.orchestratorVersion) + $Script:XmlTempWriter.WriteAttributeString($Attr5, [string]$Pool.mode) + $Script:XmlTempWriter.WriteAttributeString($Attr6, [string]$Pool.maxPods) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAKS ($subloc+65) ($Alt0+40) "68" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + 'virtualMachineScaleSets' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Machine Scale Sets')) + + $Count = 1 + foreach ($ResName in $RESNames.Name) + { + $Attr1 = ('VMSS-'+[string]("{0:d3}" -f $Count)) + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVMSS ($subloc+65) ($Alt0+40) "68" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) + + $Script:XmlTempWriter.WriteAttributeString('VMSS_Name', [string]$RESNames.name) + $Script:XmlTempWriter.WriteAttributeString('Instances', [string]$temp[0].Count) + $Script:XmlTempWriter.WriteAttributeString('VMSS_SKU_Tier', [string]$RESNames.sku.tier) + $Script:XmlTempWriter.WriteAttributeString('VMSS_Upgrade_Policy', [string]$RESNames.Properties.upgradePolicy.mode) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVMSS ($subloc+65) ($Alt0+40) "68" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'loadBalancers' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Load Balancers')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('LB-'+[string]("{0:d3}" -f $Count)+'-SKU') + $Attr3 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Backends') + $Attr4 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Frontends') + $Attr5 = ('LB-'+[string]("{0:d3}" -f $Count)+'-LB_Rules') + $Attr6 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Probes') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + $Script:XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.sku.name) + $Script:XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.backendAddressPools.properties.backendIPConfigurations.id.count) + $Script:XmlTempWriter.WriteAttributeString($Attr4, [string]$ResName.properties.frontendIPConfigurations.properties.count) + $Script:XmlTempWriter.WriteAttributeString($Attr5, [string]$ResName.properties.loadBalancingRules.count) + $Script:XmlTempWriter.WriteAttributeString($Attr6, [string]$ResName.properties.probes.count) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconLBs ($subloc+65) ($Alt0+40) "72" "72" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $Script:XmlTempWriter.WriteAttributeString('Load_Balancer_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Load_Balancer_SKU', [string]$ResNames.sku.name) + $Script:XmlTempWriter.WriteAttributeString('Backends', [string]$ResNames.properties.backendAddressPools.properties.backendIPConfigurations.id.count) + $Script:XmlTempWriter.WriteAttributeString('Frontends', [string]$ResNames.properties.frontendIPConfigurations.properties.count) + $Script:XmlTempWriter.WriteAttributeString('LB_Rules', [string]$ResNames.properties.loadBalancingRules.count) + $Script:XmlTempWriter.WriteAttributeString('Probes', [string]$ResNames.properties.probes.count) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconLBs ($subloc+65) ($Alt0+40) "72" "72" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + 'virtualNetworkGateways' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Network Gateways')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Network_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVGW ($subloc+80) ($Alt0+40) "52" "69" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconVGW ($subloc+80) ($Alt0+40) "52" "69" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'azureFirewalls' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Firewalls')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-SKU') + $Attr3 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Threat_Intel_Mode') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + $Script:XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.properties.sku.tier) + $Script:XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.threatIntelMode) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconFWs ($subloc+65) ($Alt0+40) "71" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) + + + $Script:XmlTempWriter.WriteAttributeString('Firewall_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.properties.sku.tier) + $Script:XmlTempWriter.WriteAttributeString('Threat_Intel_Mode', [string]$ResNames.properties.threatIntelMode) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconFWs ($subloc+65) ($Alt0+40) "71" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'privateLinkServices' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Private Endpoints')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('PVE-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconPVTs ($subloc+65) ($Alt0+40) "72" "66" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconPVTs ($subloc+65) ($Alt0+40) "72" "66" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'applicationGateways' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Application Gateways')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') + $Attr2 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-SKU') + $Attr3 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Min_Capacity') + $Attr4 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Max_Capacity') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + $Script:XmlTempWriter.WriteAttributeString($Attr2, [string]$RESName.Properties.sku.tier) + $Script:XmlTempWriter.WriteAttributeString($Attr3, [string]$RESName.Properties.autoscaleConfiguration.minCapacity) + $Script:XmlTempWriter.WriteAttributeString($Attr4, [string]$RESName.Properties.autoscaleConfiguration.maxCapacity) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAppGWs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $Script:XmlTempWriter.WriteAttributeString('App_Gateway_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('App_Gateway_SKU', [string]$RESNames.Properties.sku.tier) + $Script:XmlTempWriter.WriteAttributeString('Autoscale_Min_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.minCapacity) + $Script:XmlTempWriter.WriteAttributeString('Autoscale_Max_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.maxCapacity) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAppGWs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'bastionHosts' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Bastion Hosts')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Bastion-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconBastions ($subloc+65) ($Alt0+40) "68" "67" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconBastions ($subloc+65) ($Alt0+40) "68" "67" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + 'APIM' { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $APIMHost = [string]($RESNames.properties.hostnameConfigurations | Where-Object {$_.defaultSslBinding -eq $true}).hostname + + $Script:XmlTempWriter.WriteAttributeString('APIM_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.sku.name) + $Script:XmlTempWriter.WriteAttributeString('VNET_Type', [string]$RESNames.properties.virtualNetworkType) + $Script:XmlTempWriter.WriteAttributeString('Default_Hostname', $APIMHost) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAPIMs ($subloc+65) ($Alt0+40) "65" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + 'App Service' { + if($ServiceAppNames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' App Services')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('AppService-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAPPs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) + + $Script:XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) + $Script:XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) + $Script:XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) + $Script:XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) + $Script:XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) + $Script:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) + $Script:XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) + $Script:XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) + $Script:XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) + + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconAPPs ($subloc+65) ($Alt0+40) "64" "64" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + } + 'Function App' { + if($FuntionAppNames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Function Apps')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('FunctionApp-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconFunApps ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) + + $Script:XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) + $Script:XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) + $Script:XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) + $Script:XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) + $Script:XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) + $Script:XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) + $Script:XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) + $Script:XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) + $Script:XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconFunApps ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + } + 'DataBricks' { + if($DatabriksNames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Databricks')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Databrick-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconBricks ($subloc+65) ($Alt0+40) "60" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $Script:XmlTempWriter.WriteAttributeString('Databrick_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Workspace_URL', [string]$RESNames.properties.workspaceUrl ) + $Script:XmlTempWriter.WriteAttributeString('Pricing_Tier', [string]$RESNames.sku.name) + $Script:XmlTempWriter.WriteAttributeString('Storage_Account', [string]$RESNames.properties.parameters.storageAccountName.value) + $Script:XmlTempWriter.WriteAttributeString('Storage_Account_SKU', [string]$RESNames.properties.parameters.storageAccountSkuName.value) + $Script:XmlTempWriter.WriteAttributeString('Relay_Namespace', [string]$RESNames.properties.parameters.relayNamespaceName.value) + $Script:XmlTempWriter.WriteAttributeString('Require_Infrastructure_Encryption', [string]$RESNames.properties.parameters.requireInfrastructureEncryption.value) + $Script:XmlTempWriter.WriteAttributeString('Enable_Public_IP', [string]$RESNames.properties.parameters.enableNoPublicIp.value) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconBricks ($subloc+65) ($Alt0+40) "60" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + } + 'Open Shift' { + if($ARONames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' OpenShift Clusters')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('OpenShift_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconARO ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + + $Script:XmlTempWriter.WriteAttributeString('ARO_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('OpenShift_Version', [string]$RESNames.properties.clusterProfile.version) + $Script:XmlTempWriter.WriteAttributeString('OpenShift_Console', [string]$RESNames.properties.consoleProfile.url) + $Script:XmlTempWriter.WriteAttributeString('Worker_VM_Count', [string]$RESNames.properties.workerprofiles.Count) + $Script:XmlTempWriter.WriteAttributeString('Worker_VM_Size', [string]$RESNames.properties.workerprofiles.vmSize[0]) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconARO ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + } + 'Container Instance' { + if($ContainerNames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Container Intances')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Container_Intance-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconContain ($subloc+65) ($Alt0+40) "64" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconContain ($subloc+65) ($Alt0+40) "64" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + } + 'NetApp' { + if($NetAppNames) + { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' NetApp Volumes')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('NetApp_Volume-'+[string]("{0:d3}" -f $Count)) + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconNetApp ($subloc+65) ($Alt0+40) "65" "52" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]1+' NetApp Volume')) + $Script:XmlTempWriter.WriteAttributeString('NetApp_Volume_Name', [string]$ResName.name) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconNetApp ($subloc+65) ($Alt0+40) "65" "52" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + } + 'Data Explorer Clusters' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Data Explorer Clusters')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('Data_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconDataExplorer ($subloc+65) ($Alt0+40) "68" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) + $Script:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_Name', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_URI', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_State', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('Computer_Specifications', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('AutoScale_Enabled', [string]$ResNames.name) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconDataExplorer ($subloc+65) ($Alt0+40) "68" "68" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + } + 'Network Interface' { + if($RESNames.count -gt 1) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Network Interfaces')) + + $Count = 1 + foreach ($ResName in $RESNames) + { + $Attr1 = ('NIC-'+[string]("{0:d3}" -f $Count)+'-Name') + + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Count ++ + } + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconNIC ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + else + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ([string]1+' Network Interface')) + + $Attr1 = ('NIC-Name') + $Script:XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) + + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconNIC ($subloc+65) ($Alt0+40) "68" "60" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + } + '' {} + default {} + } + if($sub.properties.networkSecurityGroup.id) + { + $NSG = $sub.properties.networkSecurityGroup.id.split('/')[8] + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', '') + $Script:XmlTempWriter.WriteAttributeString('Network_Security_Group', [string]$NSG) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconNSG ($subloc+160) ($Alt0+15) "26.35" "32" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + } + if($sub.properties.routeTable.id) + { + $UDR = $sub.properties.routeTable.id.split('/')[8] + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', '') + $Script:XmlTempWriter.WriteAttributeString('Route_Table', [string]$UDR) + $Script:XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon2 $IconUDR ($subloc+15) ($Alt0+15) "30.97" "30" $ContainerID + + $Script:XmlTempWriter.WriteEndElement() + + } + if($sub.properties.ipconfigurations.id) + { + Foreach($SubIPs in $sub.properties.ipconfigurations) + { + $Script:VNETPIP += $Script:CleanPIPs | Where-Object {$_.properties.ipConfiguration.id -eq $SubIPs.id} + } + } + } + + ######################################################### ICON ####################################################### + + Function Icon2 { + Param($Style,$x,$y,$w,$h,$p) + + $Script:XmlTempWriter.WriteStartElement('mxCell') + $Script:XmlTempWriter.WriteAttributeString('style', $Style) + $Script:XmlTempWriter.WriteAttributeString('vertex', "1") + $Script:XmlTempWriter.WriteAttributeString('parent', $p) + + $Script:XmlTempWriter.WriteStartElement('mxGeometry') + $Script:XmlTempWriter.WriteAttributeString('x', $x) + $Script:XmlTempWriter.WriteAttributeString('y', $y) + $Script:XmlTempWriter.WriteAttributeString('width', $w) + $Script:XmlTempWriter.WriteAttributeString('height', $h) + $Script:XmlTempWriter.WriteAttributeString('as', "geometry") + $Script:XmlTempWriter.WriteEndElement() + + $Script:XmlTempWriter.WriteEndElement() + } + + ######################################################## SUBNET ####################################################### + + Stensils + + $Script:XmlTempWriter = New-Object System.XMl.XmlTextWriter($SubFile,$Null) + + $Script:XmlTempWriter.Formatting = 'Indented' + $Script:XmlTempWriter.Indentation = 2 + + $Script:XmlTempWriter.WriteStartDocument() + + $Script:XmlTempWriter.WriteStartElement('mxfile') + $Script:XmlTempWriter.WriteAttributeString('host', 'Electron') + $Script:XmlTempWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') + $Script:XmlTempWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') + $Script:XmlTempWriter.WriteAttributeString('etag', $etag) + $Script:XmlTempWriter.WriteAttributeString('version', '15.4.0') + $Script:XmlTempWriter.WriteAttributeString('type', 'device') + + $Script:XmlTempWriter.WriteStartElement('diagram') + $Script:XmlTempWriter.WriteAttributeString('id', $DiagID) + $Script:XmlTempWriter.WriteAttributeString('name', 'Network Topology') + + $Script:XmlTempWriter.WriteStartElement('mxGraphModel') + $Script:XmlTempWriter.WriteAttributeString('dx', "1326") + $Script:XmlTempWriter.WriteAttributeString('dy', "798") + $Script:XmlTempWriter.WriteAttributeString('grid', "1") + $Script:XmlTempWriter.WriteAttributeString('gridSize', "10") + $Script:XmlTempWriter.WriteAttributeString('guides', "1") + $Script:XmlTempWriter.WriteAttributeString('tooltips', "1") + $Script:XmlTempWriter.WriteAttributeString('connect', "1") + $Script:XmlTempWriter.WriteAttributeString('arrows', "1") + $Script:XmlTempWriter.WriteAttributeString('fold', "1") + $Script:XmlTempWriter.WriteAttributeString('page', "1") + $Script:XmlTempWriter.WriteAttributeString('pageScale', "1") + $Script:XmlTempWriter.WriteAttributeString('pageWidth', "850") + $Script:XmlTempWriter.WriteAttributeString('pageHeight', "1100") + $Script:XmlTempWriter.WriteAttributeString('math', "0") + $Script:XmlTempWriter.WriteAttributeString('shadow', "0") + + $Script:XmlTempWriter.WriteStartElement('root') + + $Script:XmlTempWriter.WriteStartElement('mxCell') + $Script:XmlTempWriter.WriteAttributeString('id', "0") + $Script:XmlTempWriter.WriteEndElement() + + $Script:XmlTempWriter.WriteStartElement('mxCell') + $Script:XmlTempWriter.WriteAttributeString('id', "1") + $Script:XmlTempWriter.WriteAttributeString('parent', "0") + $Script:XmlTempWriter.WriteEndElement() + + $sizeL = $VNET.properties.subnets.properties.addressPrefix.count + if ($sizeL -gt 5) + { + $sizeL = $sizeL / 2 + $sizeL = [math]::ceiling($sizeL) + $sizeC = $sizeL + $sizeL = (($sizeL * 210) + 30) + + $subloc0 = 20 + $SubC = 0 + $alt1 = 40 + $Script:VNETPIP = @() + foreach($Sub in $VNET.properties.subnets) + { + if ($SubC -eq $sizeC) + { + $Alt1 = $Alt1 + 230 + $subloc0 = 20 + $SubC = 0 + } + + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) + $Script:XmlTempWriter.WriteAttributeString('id', ($CellID+'-'+($IDNum++))) + + Icon2 "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $subloc0 $Alt1 "200" "200" $ContID + + $Script:XmlTempWriter.WriteEndElement() + + ProcType $sub $subloc0 $Alt1 $ContID + + $subloc = $subloc + 210 + $subloc0 = $subloc0 + 210 + $SubC ++ + } + + } + Else + { + $sizeL = (($sizeL * 210) + 30) + $subloc0 = 20 + $Script:VNETPIP = @() + foreach($Sub in $VNET.properties.subnets) + { + $Script:XmlTempWriter.WriteStartElement('object') + $Script:XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) + $Script:XmlTempWriter.WriteAttributeString('id', ($CellID+'-'+($IDNum++))) + + Icon2 "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $subloc0 40 "200" "200" $ContID + + $Script:XmlTempWriter.WriteEndElement() + + ProcType $sub $subloc0 40 $ContID + + $subloc = $subloc + 210 + $subloc0 = $subloc0 + 210 + } + } + + $Script:XmlTempWriter.WriteEndElement() + + $Script:XmlTempWriter.WriteEndElement() + + $Script:XmlTempWriter.WriteEndElement() + $Script:XmlTempWriter.WriteEndElement() + + $Script:XmlTempWriter.WriteEndDocument() + $Script:XmlTempWriter.Flush() + $Script:XmlTempWriter.Close() + + }).AddArgument($subloc).AddArgument($VNET).AddArgument($IDNum).AddArgument($DiagramCache).AddArgument($ContID).AddArgument($Resources) + + New-Variable -Name ('Job_'+$NameString) -Scope Global + + Set-Variable -Name ('Job_'+$NameString) -Value ((get-variable -name ('Run_'+$NameString)).Value).BeginInvoke() + + $Script:jobs2 += (get-variable -name ('Job_'+$NameString)).Value + + $Script:jobs += $NameString + + #New-Variable -Name ('End_'+$NameString) + #Set-Variable -Name ('End_'+$NameString) -Value (((get-variable -name ('Run_'+$NameString)).Value).EndInvoke((get-variable -name ('Job_'+$NameString)).Value)) + + #((get-variable -name ('Run_'+$NameString)).Value).Dispose() + + #while ($Job.Runspace.IsCompleted -contains $false) {} + + KillJobs + + } + + Function KillJobs { + + foreach($job in $Script:jobs) + { + if((get-variable -name ('Job_'+$job) -Scope Global).Value.IsCompleted -eq $true) + { + #((get-variable -name ('Run_'+$job)).Value).EndInvoke((get-variable -name ('Job_'+$job)).Value) + ((get-variable -name ('Run_'+$job)).Value).Dispose() + Remove-Variable -Name ('Run_'+$job) -Scope Global -Force + Remove-Variable -Name ('Job_'+$job) -Scope Global -Force + } + } + } + + <# Function to create the Label of Version #> + Function label { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ('Powered by:'+ "`n" +'Azure Resource Inventory v3.0'+ "`n" +'https://github.com/microsoft/ARI')) + $Script:XmlWriter.WriteAttributeString('author', 'Claudio Merola') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + } + + Function Icon { + Param($Style,$x,$y,$w,$h,$p) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', $Style) + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Container { + Param($x,$y,$w,$h,$title) + $Script:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Connect { + Param($Source,$Target,$Parent) + + if($Parent){$Parent = $Parent}else{$Parent = 1} + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + $Script:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") + $Script:XmlWriter.WriteAttributeString('edge', "1") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $Parent) + $Script:XmlWriter.WriteAttributeString('source', $Source) + $Script:XmlWriter.WriteAttributeString('target', $Target) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('relative', "1") + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + } + + Function Variables0 { + Start-Job -Name 'DiagramVariables' -ScriptBlock { + $job = @() + + $AZVGWs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualnetworkgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZLGWs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/localnetworkgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVNETs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualnetworks'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZCONs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/connections'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZEXPROUTEs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/expressroutecircuits'} | Select-Object -Property * -Unique }).AddArgument($($args[0])) + $PIPs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/publicipaddresses'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVWAN = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualwans'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVHUB = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/virtualhubs'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVPNSITES = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/vpnsites'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVERs = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/expressroutegateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + + $AZAKS = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.containerservice/managedclusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVMSS = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Compute/virtualMachineScaleSets'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZNIC = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/networkinterfaces'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZPrivEnd = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/privateendpoints'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZVM = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.compute/virtualmachines'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZARO = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.redhatopenshift/openshiftclusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZKusto = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Kusto/clusters'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZAppGW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/applicationgateways'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZDW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.Databricks/workspaces'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZAppWeb = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.web/sites'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZAPIM = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.ApiManagement/service'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZLB = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/loadbalancers'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZBastion = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/bastionhosts'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZFW = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/azurefirewalls'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZNetProf = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.network/networkprofiles'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZCont = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'Microsoft.ContainerInstance/containerGroups'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + $AZANF = ([PowerShell]::Create()).AddScript({param($resources)$resources | Where-Object {$_.Type -eq 'microsoft.netapp/netappaccounts/capacitypools/volumes'} | Select-Object -Property * -Unique}).AddArgument($($args[0])) + + $jobAZVGWs = $AZVGWs.BeginInvoke() + $jobAZLGWs = $AZLGWs.BeginInvoke() + $jobAZVNETs = $AZVNETs.BeginInvoke() + $jobAZCONs = $AZCONs.BeginInvoke() + $jobAZEXPROUTEs = $AZEXPROUTEs.BeginInvoke() + $jobPIPs = $PIPs.BeginInvoke() + $jobAZVWAN = $AZVWAN.BeginInvoke() + $jobAZVHUB = $AZVHUB.BeginInvoke() + $jobAZVERs = $AZVERs.BeginInvoke() + $jobAZVPNSITES = $AZVPNSITES.BeginInvoke() + $jobAZAKS = $AZAKS.BeginInvoke() + $jobAZVMSS = $AZVMSS.BeginInvoke() + $jobAZNIC = $AZNIC.BeginInvoke() + $jobAZPrivEnd = $AZPrivEnd.BeginInvoke() + $jobAZVM = $AZVM.BeginInvoke() + $jobAZARO = $AZARO.BeginInvoke() + $jobAZKusto = $AZKusto.BeginInvoke() + $jobAZAppGW = $AZAppGW.BeginInvoke() + $jobAZDW = $AZDW.BeginInvoke() + $jobAZAppWeb = $AZAppWeb.BeginInvoke() + $jobAZAPIM = $AZAPIM.BeginInvoke() + $jobAZLB = $AZLB.BeginInvoke() + $jobAZBastion = $AZBastion.BeginInvoke() + $jobAZFW = $AZFW.BeginInvoke() + $jobAZNetProf = $AZNetProf.BeginInvoke() + $jobAZCont = $AZCont.BeginInvoke() + $jobAZANF = $AZANF.BeginInvoke() + + $job += $jobAZVGWs + $job += $jobAZLGWs + $job += $jobAZVNETs + $job += $jobAZCONs + $job += $jobAZEXPROUTEs + $job += $jobPIPs + $job += $jobAZVWAN + $job += $jobAZVHUB + $job += $jobAZVPNSITES + $job += $jobAZVERs + $job += $jobAZAKS + $job += $jobAZVMSS + $job += $jobAZNIC + $job += $jobAZPrivEnd + $job += $jobAZVM + $job += $jobAZARO + $job += $jobAZKusto + $job += $jobAZAppGW + $job += $jobAZDW + $job += $jobAZAppWeb + $job += $jobAZAPIM + $job += $jobAZLB + $job += $jobAZBastion + $job += $jobAZFW + $job += $jobAZNetProf + $job += $jobAZCont + $job += $jobAZANF + + while ($Job.Runspace.IsCompleted -contains $false) {} + + $AZVGWsS = $AZVGWs.EndInvoke($jobAZVGWs) + $AZLGWsS = $AZLGWs.EndInvoke($jobAZLGWs) + $AZVNETsS = $AZVNETs.EndInvoke($jobAZVNETs) + $AZCONsS = $AZCONs.EndInvoke($jobAZCONs) + $AZEXPROUTEsS = $AZEXPROUTEs.EndInvoke($jobAZEXPROUTEs) + $PIPsS = $PIPs.EndInvoke($jobPIPs) + $AZVWANS = $AZVWAN.EndInvoke($jobAZVWAN) + $AZVHUBS = $AZVHUB.EndInvoke($jobAZVHUB) + $AZVPNSITESS = $AZVPNSITES.EndInvoke($jobAZVPNSITES) + $AZVERsS = $AZVERs.EndInvoke($jobAZVERs) + $AZAKSs = $AZAKS.EndInvoke($jobAZAKS) + $AZVMSSs = $AZVMSS.EndInvoke($jobAZVMSS) + $AZNICs = $AZNIC.EndInvoke($jobAZNIC) + $AZPrivEnds = $AZPrivEnd.EndInvoke($jobAZPrivEnd) + $AZVMs = $AZVM.EndInvoke($jobAZVM) + $AZAROs = $AZARO.EndInvoke($jobAZARO) + $AZKustos = $AZKusto.EndInvoke($jobAZKusto) + $AZAppGWs = $AZAppGW.EndInvoke($jobAZAppGW) + $AZDWs = $AZDW.EndInvoke($jobAZDW) + $AZAppWebs = $AZAppWeb.EndInvoke($jobAZAppWeb) + $AZAPIMs = $AZAPIM.EndInvoke($jobAZAPIM) + $AZLBs = $AZLB.EndInvoke($jobAZLB) + $AZBastions = $AZBastion.EndInvoke($jobAZBastion) + $AZFWs = $AZFW.EndInvoke($jobAZFW) + $AZNetProfs = $AZNetProf.EndInvoke($jobAZNetProf) + $AZConts = $AZCont.EndInvoke($jobAZCont) + $AZANFs = $AZANF.EndInvoke($jobAZANF) + + + $AZVGWs.Dispose() + $AZLGWs.Dispose() + $AZVNETs.Dispose() + $AZCONs.Dispose() + $AZEXPROUTEs.Dispose() + $PIPs.Dispose() + $AZVWAN.Dispose() + $AZVHUB.Dispose() + $AZVPNSITES.Dispose() + $AZVERs.Dispose() + $AZAKS.Dispose() + $AZVMSS.Dispose() + $AZNIC.Dispose() + $AZPrivEnd.Dispose() + $AZVM.Dispose() + $AZARO.Dispose() + $AZKusto.Dispose() + $AZAppGW.Dispose() + $AZDW.Dispose() + $AZAppWeb.Dispose() + $AZAPIM.Dispose() + $AZLB.Dispose() + $AZBastion.Dispose() + $AZFW.Dispose() + $AZNetProf.Dispose() + $AZCont.Dispose() + $AZANF.Dispose() + + $CleanPIPs = $PIPsS | Where-Object {$_.id -notin $AZVGWsS.properties.ipConfigurations.properties.publicIPAddress.id} + + $Variables = @{ + 'AZVGWs' = $AZVGWsS; + 'AZLGWs' = $AZLGWsS; + 'AZVNETs' = $AZVNETsS; + 'AZCONs' = $AZCONsS; + 'AZEXPROUTEs' = $AZEXPROUTEsS; + 'PIPs' = $PIPsS; + 'AZVWAN' = $AZVWANS; + 'AZVHUB' = $AZVHUBS; + 'AZVPNSITES' = $AZVPNSITESS; + 'AZVERs' = $AZVERsS; + 'CleanPIPs' = $CleanPIPs; + 'AKS' = $AZAKSs; + 'VMSS' = $AZVMSSs; + 'NIC' = $AZNICs; + 'PrivEnd' = $AZPrivEnds; + 'VM' = $AZVMs; + 'ARO' = $AZAROs; + 'Kusto' = $AZKustos; + 'AppGtw' = $AZAppGWs; + 'DW' = $AZDWs; + 'AppWeb' = $AZAppWebs; + 'APIM' = $AZAPIMs; + 'LB' = $AZLBs; + 'Bastion' = $AZBastions; + 'FW' = $AZFWs; + 'NetProf' = $AZNetProfs; + 'Container' = $AZConts; + 'ANF' = $AZANFs + } + + $Variables + + } -ArgumentList $resources, $null + + } + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting Subnet files') | Out-File -FilePath $LogFile -Append + + $Subnetfiles = Get-ChildItem -Path $DiagramCache + + foreach($SubFile in $Subnetfiles) + { + if($SubFile.FullName -notin $XMLFiles) + { + Remove-Item -Path $SubFile.FullName + } + } + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Variables0 Function') | Out-File -FilePath $LogFile -Append + + Variables0 + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting Variables Job to complete') | Out-File -FilePath $LogFile -Append + + Get-Job -Name 'DiagramVariables' | Wait-Job + + $Job = Receive-Job -Name 'DiagramVariables' + + Get-Job -Name 'DiagramVariables' | Remove-Job + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting Variables') | Out-File -FilePath $LogFile -Append + + $Script:AZVGWs = $Job.AZVGWs + $Script:AZLGWs = $Job.AZLGWs + $Script:AZVNETs = $Job.AZVNETs + $Script:AZCONs = $Job.AZCONs + $Script:AZEXPROUTEs = $Job.AZEXPROUTEs + $Script:PIPs = $Job.PIPs + $Script:AZVWAN = $Job.AZVWAN + $Script:AZVHUB = $Job.AZVHUB + $Script:AZVPNSITES = $Job.AZVPNSITES + $Script:AZVERs = $Job.AZVERs + $Script:CleanPIPs = $Job.CleanPIPs + $Script:AKS = $Job.AKS + $Script:VMSS = $Job.VMSS + $Script:NIC = $Job.NIC + $Script:PrivEnd = $Job.PrivEnd + $Script:VM = $Job.VM + $Script:ARO = $Job.ARO + $Script:Kusto = $Job.Kusto + $Script:AppGtw = $Job.AppGtw + $Script:Databricks = $Job.DW + $Script:AppWeb = $Job.AppWeb + $Script:APIM = $Job.APIM + $Script:LB = $Job.LB + $Script:Bastion = $Job.Bastion + $Script:FW = $Job.FW + $Script:NetProf = $Job.NetProf + $Script:Container = $Job.Container + $Script:ANF = $Job.ANF + + $Script:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $Script:DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $Script:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $Script:IDNum = 0 + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Defining XML file') | Out-File -FilePath $LogFile -Append + + $Script:XmlWriter = New-Object System.XMl.XmlTextWriter($DDFile,$Null) + + $Script:XmlWriter.Formatting = 'Indented' + $Script:XmlWriter.Indentation = 2 + + $Script:XmlWriter.WriteStartDocument() + + $Script:XmlWriter.WriteStartElement('mxfile') + $Script:XmlWriter.WriteAttributeString('host', 'Electron') + $Script:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') + $Script:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') + $Script:XmlWriter.WriteAttributeString('etag', $etag) + $Script:XmlWriter.WriteAttributeString('version', '15.4.0') + $Script:XmlWriter.WriteAttributeString('type', 'device') + + $Script:XmlWriter.WriteStartElement('diagram') + $Script:XmlWriter.WriteAttributeString('id', $DiagID) + $Script:XmlWriter.WriteAttributeString('name', 'Network Topology') + + $Script:XmlWriter.WriteStartElement('mxGraphModel') + $Script:XmlWriter.WriteAttributeString('dx', "1326") + $Script:XmlWriter.WriteAttributeString('dy', "798") + $Script:XmlWriter.WriteAttributeString('grid', "1") + $Script:XmlWriter.WriteAttributeString('gridSize', "10") + $Script:XmlWriter.WriteAttributeString('guides', "1") + $Script:XmlWriter.WriteAttributeString('tooltips', "1") + $Script:XmlWriter.WriteAttributeString('connect', "1") + $Script:XmlWriter.WriteAttributeString('arrows', "1") + $Script:XmlWriter.WriteAttributeString('fold', "1") + $Script:XmlWriter.WriteAttributeString('page', "1") + $Script:XmlWriter.WriteAttributeString('pageScale', "1") + $Script:XmlWriter.WriteAttributeString('pageWidth', "850") + $Script:XmlWriter.WriteAttributeString('pageHeight', "1100") + $Script:XmlWriter.WriteAttributeString('math', "0") + $Script:XmlWriter.WriteAttributeString('shadow', "0") + + $Script:XmlWriter.WriteStartElement('root') + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "0") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "1") + $Script:XmlWriter.WriteAttributeString('parent', "0") + $Script:XmlWriter.WriteEndElement() + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling Stensils') | Out-File -FilePath $LogFile -Append + + Stensils + + if($AZLGWs -or $AZEXPROUTEs -or $AZVERs -or $AZVPNSITES) + { + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling OnPremNet') | Out-File -FilePath $LogFile -Append + + OnPremNet + if($Script:FullEnvironment) + { + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling as FullEnvironment') | Out-File -FilePath $LogFile -Append + + FullEnvironment + } + } + else + { + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Calling CloudOnly Function') | Out-File -FilePath $LogFile -Append + CloudOnly + } + + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndDocument() + $Script:XmlWriter.Flush() + $Script:XmlWriter.Close() + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting Job2 to complete') | Out-File -FilePath $LogFile -Append + + while ($Script:jobs2.IsCompleted -contains $false) {} + + #$VNetFile = ($DiagramCache+'Network.xml') + + $Subnetfiles = Get-ChildItem -Path $DiagramCache + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Processing Subnet files') | Out-File -FilePath $LogFile -Append + + foreach($SubFile in $Subnetfiles) + { + if($SubFile.FullName -notin $XMLFiles) + { + $newxml = New-Object XML + $newxml.Load($SubFile.FullName) + + $Innerxml = $newxml.mxfile.diagram.mxGraphModel.root.InnerXml + + $Innerxml2 = $Innerxml.Replace('','') + + #force the config into an XML + $xml = [xml](get-content $DDFile) + + $xmlFrag=$xml.CreateDocumentFragment() + $xmlFrag.InnerXml=$Innerxml2 + + $xml.mxfile.diagram.mxGraphModel.root.AppendChild($xmlFrag) + + #save file + $xml.Save($DDFile) + + Remove-Item -Path $SubFile.FullName + } + } + + ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - End of Network Diagram') | Out-File -FilePath $LogFile -Append + + } -ArgumentList $Subscriptions,$Resources,$Advisories,$DiagramCache,$FullEnvironment,$DDFile,$XMLFiles,$Logfile +} \ No newline at end of file diff --git a/Modules/Diagram/ARIDiagramOrganization.psm1 b/Modules/Diagram/ARIDiagramOrganization.psm1 new file mode 100644 index 0000000..fdb463e --- /dev/null +++ b/Modules/Diagram/ARIDiagramOrganization.psm1 @@ -0,0 +1,994 @@ +<# +.Synopsis +Organization Module for Draw.io Diagram + +.DESCRIPTION +This module is use for the Organization topology in the Draw.io Diagram. + +.Link +https://github.com/microsoft/ARI/Modules/Extras/ARIDiagramOrganization.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +Function Invoke-ARIDiagramOrganization { + Param($ResourceContainers,$DiagramCache,$LogFile) + + Start-Job -Name 'Diagram_Organization' -ScriptBlock { + + Import-Module AzureResourceInventory + + $Script:ResourceContainers = $($args[0]) + $Script:DiagramCache = $($args[1]) + + Function Icon { + Param($Style,$x,$y,$w,$h,$p) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', $Style) + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Connect { + Param($Source,$Target,$Parent) + + if($Parent){$Parent = $Parent}else{$Parent = 1} + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + $Script:XmlWriter.WriteAttributeString('style', "edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;") + $Script:XmlWriter.WriteAttributeString('edge', "1") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $Parent) + $Script:XmlWriter.WriteAttributeString('source', $Source) + $Script:XmlWriter.WriteAttributeString('target', $Target) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('relative', "1") + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + } + + Function Container0 { + Param($x,$y,$w,$h,$title) + $Script:ContID0 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID0) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;swimlaneFillColor=#F5F5F5;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Container1 { + Param($x,$y,$w,$h,$title) + $Script:ContID = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;swimlaneFillColor=#D5E8D4;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', "1") + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Container2 { + Param($x,$y,$w,$h,$title,$p) + $Script:ContID2 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID2) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;swimlaneFillColor=#DAE8FC;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Container3 { + Param($x,$y,$w,$h,$title,$p) + $Script:ContID3 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID3) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;swimlaneFillColor=#FFE6CC;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Container4 { + Param($x,$y,$w,$h,$title,$p) + $Script:ContID4 = (-join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})+'-'+1) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', $Script:ContID4) + $Script:XmlWriter.WriteAttributeString('value', "$title") + $Script:XmlWriter.WriteAttributeString('style', "swimlane;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;swimlaneFillColor=#FFE6CC;rounded=1;") + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + Function Stencils { + $Script:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" + $Script:IconMgmtGroup = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Management_Groups.svg;" #width="44" height="71" + $Script:Ret = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" + $Script:Ret1 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#b0e3e6;strokeColor=#0e8088;" + $Script:Ret2 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#b1ddf0;strokeColor=#10739e;" + $Script:Ret3 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#fad7ac;strokeColor=#b46504;" + $Script:Ret4 = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;fillColor=#e1d5e7;strokeColor=#9673a6;" + + } + + Function Org { + + $OrgObjs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions'} + + $Script:1stLevel = @() + $Lvl2 = @() + $Lvl3 = @() + $Lvl4 = @() + foreach($org in $OrgObjs) + { + if($org.properties.managementgroupancestorschain.count -eq 2) + { + $Script:1stLevel += $org.properties.managementgroupancestorschain.displayname[0] + } + if($org.properties.managementgroupancestorschain.count -eq 3) + { + $Lvl2 += $org.properties.managementgroupancestorschain.name[0] + $Script:1stLevel += $org.properties.managementgroupancestorschain.displayname[1] + } + if($org.properties.managementgroupancestorschain.count -eq 4) + { + $Lvl3 += $org.properties.managementgroupancestorschain.name[0] + $Lvl2 += $org.properties.managementgroupancestorschain.name[1] + $Script:1stLevel += $org.properties.managementgroupancestorschain.displayname[2] + } + if($org.properties.managementgroupancestorschain.count -eq 5) + { + $Lvl4 += $org.properties.managementgroupancestorschain.name[0] + $Lvl3 += $org.properties.managementgroupancestorschain.name[1] + $Lvl2 += $org.properties.managementgroupancestorschain.name[2] + $Script:1stLevel += $org.properties.managementgroupancestorschain.displayname[3] + } + } + + $Script:1stLevel = $Script:1stLevel | Select-Object -Unique + $Lvl2 = $Lvl2 | Select-Object -Unique + $Lvl3 = $Lvl3 | Select-Object -Unique + $Lvl4 = $Lvl4 | Select-Object -Unique + + $Script:XLeft = 0 + $Script:XTop = 100 + $XXLeft = 100 + + $Script:XTop = $Script:XTop + 200 + + $RoundSubs00 = @() + foreach($Sub in $OrgObjs) + { + if($Sub.properties.managementgroupancestorschain[0].displayname -eq 'tenant root group') + { + $RoundSubs00 += $Sub + } + } + + $MgmtHeight0 = (($RoundSubs00.id.count * 70) + 80) + + Container0 '0' '0' '200' $MgmtHeight0 'tenant root group' + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('ManagementGroup', 'tenant root group') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + if($RoundSubs00) + { + icon $Script:IconMgmtGroup '-30' ($MgmtHeight0-15) '50' '50' $Script:ContID0 + } + else + { + icon $Script:IconMgmtGroup '75' '27' '50' '50' $Script:ContID0 + } + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = 50 + $LocalLeft = 25 + + foreach($Sub in $RoundSubs00) + { + $RGs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $sub.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($Script:CelNum++))) + + Icon $Ret1 $LocalLeft $LocalTop '150' '70' $Script:ContID0 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $RGNum = 1 + foreach($RG in $RGs) + { + $Attr = ('ResourceGroup_'+[string]$RGNum) + $Script:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) + $RGNum++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + icon $Script:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Script:ContID0 + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = $LocalTop + 90 + + } + + + + + foreach($1stlvl in $Script:1stLevel) + { + $RoundSubs0 = @() + + foreach($Sub in $OrgObjs) + { + if($Sub.properties.managementgroupancestorschain.displayname[0] -eq $1stlvl) + { + $RoundSubs0 += $Sub + } + } + + $MgmtHeight = (($RoundSubs0.id.count * 70) + 80) + + Container1 $XLeft $XTop '200' $MgmtHeight $1stlvl $Script:ContID0 + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('ManagementGroup', [string]$1stlvl) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + if($RoundSubs0) + { + icon $Script:IconMgmtGroup '-30' ($MgmtHeight-15) '50' '50' $Script:ContID + } + else + { + icon $Script:IconMgmtGroup '75' '27' '50' '50' $Script:ContID + } + + $Script:XmlWriter.WriteEndElement() + + Connect $Script:ContID0 $Script:ContID + + $LocalTop = 50 + $LocalLeft = 25 + + foreach($Sub in $RoundSubs0) + { + $RGs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $sub.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($Script:CelNum++))) + + Icon $Ret1 $LocalLeft $LocalTop '150' '70' $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $RGNum = 1 + foreach($RG in $RGs) + { + $Attr = ('ResourceGroup_'+[string]$RGNum) + $Script:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) + $RGNum++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + icon $Script:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Script:ContID + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = $LocalTop + 90 + + } + + ######################################## 2ND LEVEL ############################################## + + $2ndLevel = @() + foreach($sub2nd in $OrgObjs) + { + if($sub2nd.properties.managementgroupancestorschain.displayname[1] -eq $1stlvl) + { + $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[0] + } + if($sub2nd.properties.managementgroupancestorschain.displayname[2] -eq $1stlvl) + { + $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[1] + } + if($sub2nd.properties.managementgroupancestorschain.displayname[3] -eq $1stlvl) + { + $2ndLevel += $sub2nd.properties.managementgroupancestorschain.name[2] + } + } + $2ndLevel = $2ndLevel | Select-Object -Unique + + $XXLeft = 0 + if($2ndLevel.count % 2 -eq 1 ) + { + $Align = $true + $loops = -[Math]::ceiling($2ndLevel.count /2 - 1) + } + else + { + $Align = $false + $loops = [Math]::ceiling($2ndLevel.count / 2) + + } + if($2ndLevel.count -eq 1) + { + $loops = 1 + } + $TempSon = 0 + + + foreach($2nd in $2ndLevel) + { + $RoundSubs = @() + $Temp3rd = @() + $Temp4rd = @() + $Temp5th = @() + + foreach($Sub in $OrgObjs) + { + if($Sub.properties.managementgroupancestorschain.name[0] -eq $2nd) + { + $RoundSubs += $Sub + } + if($Sub.properties.managementgroupancestorschain.name[1] -eq $2nd) + { + $Temp3rd += $Sub.properties.managementgroupancestorschain.name[0] + } + if($Sub.properties.managementgroupancestorschain.name[2] -eq $2nd) + { + $Temp4rd += $Sub.properties.managementgroupancestorschain.name[0] + $Temp3rd += $Sub.properties.managementgroupancestorschain.name[1] + } + if($Sub.properties.managementgroupancestorschain.name[3] -eq $2nd) + { + $Temp5th += $Sub.properties.managementgroupancestorschain.name[0] + $Temp4rd += $Sub.properties.managementgroupancestorschain.name[1] + $Temp3rd += $Sub.properties.managementgroupancestorschain.name[2] + } + } + + $Temp3rd = $Temp3rd | Select-Object -Unique + $Temp4rd = $Temp4rd | Select-Object -Unique + $Temp5th = $Temp5th | Select-Object -Unique + + if($XXLeft -eq 0 -and $Align -eq $true) + { + } + elseif($XXLeft -eq 0 -and $Align -eq $false) + { + $XXLeft = -150 + -((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) + $loops++ + } + elseif($Align -eq $false -and $loops -eq 0) + { + $XXLeft = 150 + ((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) + $loops++ + } + elseif($loops -gt 0 -and $XXLeft -eq 0) + { + $XXLeft = $XXLeft + ($2ndLevel.count*300)/2 + ((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)))*300)/2) + $loops++ + } + elseif($XXLeft -le 0 -and $loops -lt 0) + { + $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150))} + $XXLeft = $XXLeft + -$XXTemp + $loops++ + } + elseif($XXLeft -gt 0 -and $loops -ge 0) + { + $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*150))} + $XXLeft = $XXLeft + $XXTemp + $loops++ + } + else + { + $XXTemp = if(((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*300)) -eq 0){300}else{((((($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)+$TempSon))*300))} + $XXLeft = $XXLeft + $XXTemp + $loops++ + } + + $MgmtHeight1 = if((($RoundSubs.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs.id.count * 90) + 50)} + + $XXTop = $MgmtHeight + 200 + + Container2 $XXLeft $XXTop '200' $MgmtHeight1 $2nd $Script:ContID + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('ManagementGroup', [string]$2nd) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + if($RoundSubs) + { + icon $Script:IconMgmtGroup '-30' ($MgmtHeight1-15) '50' '50' $Script:ContID2 + } + else + { + icon $Script:IconMgmtGroup '75' '27' '50' '50' $Script:ContID2 + } + + $Script:XmlWriter.WriteEndElement() + + Connect $Script:ContID $Script:ContID2 + + $TempSon = (($Temp3rd.count)+($Temp4rd.count)+($Temp5th.count)) + + if($XXLeft -eq 0 -and $loops -lt 0) + { + $XXLeft = -1 + } + elseif($XXLeft -lt 0 -and $loops -ge 0) + { + $XXLeft = 1 + } + + $LocalTop = 50 + $LocalLeft = 25 + + foreach($Sub in $RoundSubs) + { + $RGs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $sub.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($Script:CelNum++))) + + Icon $Ret2 $LocalLeft $LocalTop '150' '70' $Script:ContID2 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $RGNum = 1 + foreach($RG in $RGs) + { + $Attr = ('ResourceGroup_'+[string]$RGNum) + $Script:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) + $RGNum++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + icon $Script:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Script:ContID2 + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = $LocalTop + 90 + } + + + ######################################## 3RD LEVEL ############################################## + + $3rdLevel = @() + foreach($sub3rd in $OrgObjs) + { + if($sub3rd.properties.managementgroupancestorschain.name[1] -eq $2nd) + { + $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[0] + } + if($sub3rd.properties.managementgroupancestorschain.name[2] -eq $2nd) + { + $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[1] + } + if($sub3rd.properties.managementgroupancestorschain.name[3] -eq $2nd) + { + $3rdLevel += $sub3rd.properties.managementgroupancestorschain.name[2] + } + } + $3rdLevel = $3rdLevel | Select-Object -Unique + + $XXXLeft = 0 + if($3rdLevel.count % 2 -eq 1 ) + { + $Align3 = $true + $loops3 = -[Math]::ceiling($3rdLevel.count / 2 - 1) + } + else + { + $Align3 = $false + $loops3 = [Math]::ceiling($3rdLevel.count / 2) - 1 + + } + if($3rdLevel.count -eq 1) + { + $loops3 = 1 + } + + + foreach($3rd in $3rdLevel) + { + $RoundSubs3 = @() + $Temp4rd3 = @() + $Temp5th3 = @() + + foreach($Sub in $OrgObjs) + { + if($Sub.properties.managementgroupancestorschain.name[0] -eq $3rd) + { + $RoundSubs3 += $Sub + } + if($Sub.properties.managementgroupancestorschain.name[1] -eq $3rd) + { + $Temp4rd3 += $Sub.properties.managementgroupancestorschain.name[0] + } + if($Sub.properties.managementgroupancestorschain.name[2] -eq $3rd) + { + $Temp5th3 += $Sub.properties.managementgroupancestorschain.name[0] + $Temp4rd3 += $Sub.properties.managementgroupancestorschain.name[1] + } + } + + $Temp4rd3 = $Temp4rd3 | Select-Object -Unique + $Temp5th3 = $Temp5th3 | Select-Object -Unique + + + if($XXXLeft -eq 0 -and $Align3 -eq $true) + { + } + elseif($XXXLeft -eq 0 -and $Align3 -eq $false) + { + $XXXLeft = -150 + -((((($Temp4rd3.count)+($Temp5th3.count)))*150)/2) + $loops3++ + } + elseif($Align3 -eq $false -and $loops3 -eq 0) + { + $XXXLeft = 150 + ((((($Temp4rd3.count)+($Temp5th3.count)))*150)/2) + $loops3++ + } + elseif($loops3 -gt 0 -and $XXXLeft -eq 0) + { + $XXXLeft = $XXXLeft + ($3rdLevel.count*300)/2 + ((((($Temp4rd3.count)+($Temp5th3.count)))*300)/2) + $loops3++ + } + elseif($XXXLeft -eq 0 -and $loops3 -lt 0) + { + $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} + $XXXLeft = $XXXLeft + -$XXXTemp + $loops3++ + } + elseif($XXXLeft -lt 0 -and $loops3 -lt 0) + { + $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} + $XXXLeft = $XXXLeft + -$XXXTemp + $loops3++ + } + elseif($XXXLeft -eq 1 -and $loops3 -gt 0) + { + $XXXLeft = 150 + ((((($Temp4rd3.count)+($Temp5th3.count)))*150)) + $loops3++ + } + else + { + $XXXTemp = if(((((($Temp4rd3.count)+($Temp5th3.count)))*300)) -eq 0){300}else{((((($Temp4rd3.count)+($Temp5th3.count)))*300))} + $XXXLeft = $XXXLeft + $XXXTemp + $loops3++ + } + + + $MgmtHeight2 = if((($RoundSubs3.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs3.id.count * 90) + 50)} + + $XXXTop = $MgmtHeight1 + 200 + + Container3 $XXXLeft $XXXTop '200' $MgmtHeight2 $3rd $Script:ContID2 + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('ManagementGroup', [string]$3rd) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + if($RoundSubs3) + { + icon $Script:IconMgmtGroup '-30' ($MgmtHeight2-15) '50' '50' $Script:ContID3 + } + else + { + icon $Script:IconMgmtGroup '75' '27' '50' '50' $Script:ContID3 + } + + $Script:XmlWriter.WriteEndElement() + + Connect $Script:ContID2 $Script:ContID3 + + if($XXXLeft -eq 0 -and $loops3 -lt 0) + { + $XXXLeft = -1 + } + elseif($XXXLeft -lt 0 -and $loops3 -ge 0) + { + $XXXLeft = 1 + } + + $LocalTop = 50 + $LocalLeft = 25 + + foreach($Sub in $RoundSubs3) + { + + $RGs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $sub.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($Script:CelNum++))) + + Icon $Ret3 $LocalLeft $LocalTop '150' '70' $Script:ContID3 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $RGNum = 1 + foreach($RG in $RGs) + { + $Attr = ('ResourceGroup_'+[string]$RGNum) + $Script:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) + $RGNum++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + icon $Script:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Script:ContID3 + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = $LocalTop + 90 + } + + + ######################################## 4TH LEVEL ############################################## + + $4thLevel = @() + foreach($sub4th in $OrgObjs) + { + if($sub4th.properties.managementgroupancestorschain.name[1] -eq $3rd) + { + $4thLevel += $sub4th.properties.managementgroupancestorschain.name[0] + } + if($sub4th.properties.managementgroupancestorschain.name[2] -eq $3rd) + { + $4thLevel += $sub4th.properties.managementgroupancestorschain.name[1] + } + if($sub4th.properties.managementgroupancestorschain.name[3] -eq $3rd) + { + $4thLevel += $sub4th.properties.managementgroupancestorschain.name[2] + } + } + $4thLevel = $4thLevel | Select-Object -Unique + + $XXXXLeft = 0 + if($4thLevel.count % 2 -eq 1 ) + { + $Align4 = $true + $loops4 = -[Math]::ceiling($sub4th.count / 2 - 1) + } + else + { + $Align4 = $false + $loops4 = [Math]::ceiling($sub4th.count / 2) - 1 + + } + if($4thLevel.count -eq 1) + { + $loops4 = 1 + } + + + foreach($4th in $4thLevel) + { + $RoundSubs4 = @() + $Temp5th4 = @() + + foreach($Sub in $OrgObjs) + { + if($Sub.properties.managementgroupancestorschain.name[0] -eq $4th) + { + $RoundSubs4 += $Sub + } + if($Sub.properties.managementgroupancestorschain.name[1] -eq $4th) + { + $Temp5th4 += $Sub.properties.managementgroupancestorschain.name[0] + } + if($Sub.properties.managementgroupancestorschain.name[2] -eq $4th) + { + $Temp5th4 += $Sub.properties.managementgroupancestorschain.name[0] + } + } + + $Temp5th4 = $Temp5th4 | Select-Object -Unique + + if($XXXXLeft -eq 0 -and $Align4 -eq $true) + { + } + elseif($XXXXLeft -eq 0 -and $Align4 -eq $false) + { + $XXXXLeft = -150 + -((((($Temp4rd4.count)+($Temp5th4.count)))*150)/2) + $loops4++ + } + elseif($Align4 -eq $false -and $loops4 -eq 0) + { + $XXXXLeft = 150 + ((((($Temp4rd4.count)+($Temp5th4.count)))*150)/2) + $loops4++ + } + elseif($loops4 -gt 0 -and $XXXXLeft -eq 0) + { + $XXXXLeft = $XXXXLeft + ($4thLevel.count*300)/2 + ((((($Temp5th4.count)))*300)/2) + $loops4++ + } + elseif($XXXXLeft -eq 0 -and $loops4 -lt 0) + { + $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} + $XXXXLeft = $XXXXLeft + -$XXXXTemp + $loops4++ + } + elseif($XXXXLeft -lt 0 -and $loops4 -lt 0) + { + $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} + $XXXXLeft = $XXXXLeft + -$XXXXTemp + $loops4++ + } + elseif($XXXXLeft -eq 1 -and $loops4 -gt 0) + { + $XXXXLeft = 150 + ((((($Temp5th4.count)))*150)) + $loops4++ + } + else + { + $XXXXTemp = if(((((($Temp5th4.count)))*300)) -eq 0){300}else{((((($Temp5th4.count)))*300))} + $XXXXLeft = $XXXXLeft + $XXXXTemp + $loops4++ + } + + + $MgmtHeight3 = if((($RoundSubs4.id.count * 90) + 50) -eq 50){80}else{(($RoundSubs4.id.count * 90) + 50)} + + $XXXXTop = $MgmtHeight2 + 200 + + Container4 $XXXXLeft $XXXXTop '200' $MgmtHeight3 $4th $Script:ContID3 + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('ManagementGroup', [string]$4th) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + if($RoundSubs4) + { + icon $Script:IconMgmtGroup '-30' ($MgmtHeight3-15) '50' '50' $Script:ContID4 + } + else + { + icon $Script:IconMgmtGroup '75' '27' '50' '50' $Script:ContID4 + } + + $Script:XmlWriter.WriteEndElement() + + Connect $Script:ContID3 $Script:ContID4 + + if($XXXXLeft -eq 0 -and $loops4 -lt 0) + { + $XXXXLeft = -1 + } + elseif($XXXXLeft -lt 0 -and $loops4 -ge 0) + { + $XXXXLeft = 1 + } + + $LocalTop = 50 + $LocalLeft = 25 + + foreach($Sub in $RoundSubs4) + { + + $RGs = $Script:ResourceContainers | Where-Object {$_.Type -eq 'microsoft.resources/subscriptions/resourcegroups' -and $_.subscriptionid -eq $sub.subscriptionid} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $sub.name) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($Script:CelNum++))) + + Icon $Ret4 $LocalLeft $LocalTop '150' '70' $Script:ContID4 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + + $RGNum = 1 + foreach($RG in $RGs) + { + $Attr = ('ResourceGroup_'+[string]$RGNum) + $Script:XmlWriter.WriteAttributeString($Attr, [string]$RG.Name) + $RGNum++ + } + + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + icon $Script:IconSubscription ($LocalLeft+140) ($LocalTop+40) '31' '51' $Script:ContID4 + + $Script:XmlWriter.WriteEndElement() + + $LocalTop = $LocalTop + 90 + } + + } + + } + + } + + } + + } + + Stencils + + $OrgFile = ($DiagramCache+'Organization.xml') + + $Script:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $Script:DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $Script:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $Script:IDNum = 0 + $Script:CelNum = 0 + + $Script:XmlWriter = New-Object System.XMl.XmlTextWriter($OrgFile,$Null) + + $Script:XmlWriter.Formatting = 'Indented' + $Script:XmlWriter.Indentation = 2 + + $Script:XmlWriter.WriteStartDocument() + + $Script:XmlWriter.WriteStartElement('mxfile') + $Script:XmlWriter.WriteAttributeString('host', 'Electron') + $Script:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') + $Script:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') + $Script:XmlWriter.WriteAttributeString('etag', $etag) + $Script:XmlWriter.WriteAttributeString('version', '15.4.0') + $Script:XmlWriter.WriteAttributeString('type', 'device') + + $Script:XmlWriter.WriteStartElement('diagram') + $Script:XmlWriter.WriteAttributeString('id', $DiagID) + $Script:XmlWriter.WriteAttributeString('name', 'Organization') + + $Script:XmlWriter.WriteStartElement('mxGraphModel') + $Script:XmlWriter.WriteAttributeString('dx', "1326") + $Script:XmlWriter.WriteAttributeString('dy', "798") + $Script:XmlWriter.WriteAttributeString('grid', "1") + $Script:XmlWriter.WriteAttributeString('gridSize', "10") + $Script:XmlWriter.WriteAttributeString('guides', "1") + $Script:XmlWriter.WriteAttributeString('tooltips', "1") + $Script:XmlWriter.WriteAttributeString('connect', "1") + $Script:XmlWriter.WriteAttributeString('arrows', "1") + $Script:XmlWriter.WriteAttributeString('fold', "1") + $Script:XmlWriter.WriteAttributeString('page', "1") + $Script:XmlWriter.WriteAttributeString('pageScale', "1") + $Script:XmlWriter.WriteAttributeString('pageWidth', "850") + $Script:XmlWriter.WriteAttributeString('pageHeight', "1100") + $Script:XmlWriter.WriteAttributeString('math', "0") + $Script:XmlWriter.WriteAttributeString('shadow', "0") + + $Script:XmlWriter.WriteStartElement('root') + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "0") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "1") + $Script:XmlWriter.WriteAttributeString('parent', "0") + $Script:XmlWriter.WriteEndElement() + + + Org + + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndDocument() + $Script:XmlWriter.Flush() + $Script:XmlWriter.Close() + + } -ArgumentList $ResourceContainers,$DiagramCache + +} \ No newline at end of file diff --git a/Modules/Diagram/ARIDiagramSubscription.psm1 b/Modules/Diagram/ARIDiagramSubscription.psm1 new file mode 100644 index 0000000..1e6176e --- /dev/null +++ b/Modules/Diagram/ARIDiagramSubscription.psm1 @@ -0,0 +1,1856 @@ +<# +.Synopsis +Subscription Module for Draw.io Diagram + +.DESCRIPTION +This module is use for the Subscription topology in the Draw.io Diagram. + +.Link +https://github.com/microsoft/ARI/Modules/Extras/ARIDiagramSubscription.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +Function Invoke-ARIDiagramSubscription { + Param($Subscriptions,$Resources,$DiagramCache,$LogFile) + + Start-Job -Name 'Diagram_Subscriptions' -ScriptBlock { + + Import-Module AzureResourceInventory + + $Script:Subscriptions = $($args[0]) + $Script:Resources = $($args[1]) + $Script:DiagramCache = $($args[2]) + + Function Icon { + Param($Style,$x,$y,$w,$h,$p) + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('style', $Style) + $Script:XmlWriter.WriteAttributeString('vertex', "1") + $Script:XmlWriter.WriteAttributeString('parent', $p) + + $Script:XmlWriter.WriteStartElement('mxGeometry') + $Script:XmlWriter.WriteAttributeString('x', $x) + $Script:XmlWriter.WriteAttributeString('y', $y) + $Script:XmlWriter.WriteAttributeString('width', $w) + $Script:XmlWriter.WriteAttributeString('height', $h) + $Script:XmlWriter.WriteAttributeString('as', "geometry") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + function variables { + + $Script:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" + $Script:RetRound = "rounded=1;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" + + ############# Azure AI + $Script:AzureBotServices = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Bot_Services.svg;' + $Script:AzureMachineLearning = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Machine_Learning.svg;' + $Script:AzureCognitive = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/ai_machine_learning/Cognitive_Services.svg;' + + ############# Azure Analytics + $Script:AzureDatabricks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;' + $Script:AzureAnalysis = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Analysis_Services.svg;' + $Script:AzureSynapses = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/analytics/Azure_Synapse_Analytics.svg;' + + ############# Azure App Service + $Script:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" + $Script:AppSvcPlan = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/app_services/App_Service_Plans.svg;' #width="43.5" height="43.5" + $Script:AzureAppDomain = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/app_services/App_Service_Domains.svg;' + + + ############# Azure VMware + $Script:AzureAVSPrivateCloud = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/azure_vmware_solution/AVS.svg;' + + + ############# Azure Compute + $Script:SvcFabric = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Service_Fabric_Clusters.svg;' #width="49.47" height="47.25" + $Script:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" + $Script:Disks = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Disks.svg;' #width="40.72" height="40" + $Script:RestorePoint = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Restore_Points_Collections.svg;' + $Script:AzureCloudSvc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;' + $Script:AvSet = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Availability_Sets.svg;' #width="43.5" height="43.5" + $Script:AzureVMImage = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Images.svg;' + $Script:AzureAVDWorkspace = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/compute/Workspaces.svg;' + $Script:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" + + ############ Azure Container + $Script:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" + $Script:ContRegis = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/containers/Container_Registries.svg;' + $Script:AzureContainerInstances = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/containers/Container_Instances.svg;' + + ############ Azure Database + $Script:AzureSQLDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Database.svg;' + $Script:AzureSQLDBServer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Server.svg;' + $Script:AzureDataExplorer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;' + $Script:AzureDBforPostgre = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_PostgreSQL_Server.svg;' + $Script:AzureDBforPostgreFlex = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_PostgreSQL_Server_Group.svg;' + $Script:AzureRedisCa = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Cache_Redis.svg;' + $Script:AzureDataFactory = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Azure_DevOps.svg;' + $Script:AzureCosmos = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Cosmos_DB.svg;' + $Script:AzureElastic = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Elastic_Pools.svg;' + $Script:AzureElasticJobAgent = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Elastic_Job_Agents.svg;' + $Script:AzureDB4MySQL = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_MySQL_Server.svg;' + $Script:AzureSQLManagedInstances = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/SQL_Managed_Instance.svg;' + $Script:AzureSQLManagedInstancesDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Managed_Database.svg;' + $Script:AzureSQLVM = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_SQL_VM.svg;' + $Script:AzureSQLVirtualCluster = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Virtual_Clusters.svg;' + $Script:AzureDBMigration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_Migration_Services.svg;' + $Script:AzurePurviewAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Purview_Accounts.svg;' + $Script:AzureMariaDB = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/databases/Azure_Database_MariaDB_Server.svg;' + + ############ Azure DevOps + $Script:Insight = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Application_Insights.svg;' #width="44" height="63" + $Script:AzureDevOpsOrg = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/devops/Azure_DevOps.svg;' + + ############ Azure General + $Script:AzureError = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Error.svg;' #width="50.12" height="48" + $Script:AzureWebSlot = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Web_Slots.svg;' + $Script:AzureWorkbooks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Workbooks.svg;' + $Script:AzureWebTest = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/general/Web_Test.svg;' + $Script:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" + $Script:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" + + ############ Azure Identity + $Script:AzureB2C = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/identity/Azure_AD_B2C.svg;' + + ########### Azure Integration + $Script:SvcBus = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Service_Bus.svg;' #width="45.05" height="39.75" + $Script:AzureAPIConnections = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Logic_Apps_Custom_Connector.svg;' + $Script:AzureLogicApp = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Logic_Apps.svg;' + $Script:AzureDataCatalog = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Azure_Data_Catalog.svg;' + $Script:AzureEventGridSymtopics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/System_Topic.svg;' + $Script:AzureAppConfiguration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/App_Configuration.svg;' + $Script:AzureIntegrationAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Integration_Accounts.svg;' + $Script:AzureEvtGridTopics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Event_Grid_Topics.svg;' + $Script:AzureAPIMangement = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/API_Management_Services.svg;' + $Script:AzureEvtGridDomain = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/integration/Event_Grid_Subscriptions.svg;' + + ########### Azure IoT + $Script:AzureEvtHubs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/iot/Event_Hubs.svg;' + $Script:AzureIoTHubs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/iot/Event_Hubs.svg;' + + ########### Azure Management Governance + $Script:RecoveryVault = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/Recovery_Services_Vaults.svg;' #width="43.7" height="38" + $Script:AutAcc = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/Automation_Accounts.svg;' + $Script:AzureArcServer = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/management_governance/MachinesAzureArc.svg;' + + + ########### Azure Migrate + $Script:AzureMigration = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/migrate/Azure_Migrate.svg;' + + + ########### Azure Networking + $Script:AzureConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" + $Script:AzureExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" + $Script:AzureVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" + $Script:AzureVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" + $Script:AzurePIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" + $Script:Azureproximityplacementgroups = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Proximity_Placement_Groups.svg;' + $Script:AzureUDRs = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Route_Tables.svg;' + $Script:AzureRouteFilters = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Route_Filters.svg;' + $Script:AzureBastionHost = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Bastions.svg;' + $Script:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" + $Script:NetWatcher = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Watcher.svg;' + $Script:AzurePvtLinks = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Private_Link_Service.svg;' + $Script:AzureIPGroups = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/IP_Groups.svg;' + $Script:AzureFW = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;' + $Script:AzureLNG = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Local_Network_Gateways.svg;' + $Script:AzureFrontDoor = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Front_Doors.svg;' + $Script:AzurePIPPrefixes = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Public_IP_Prefixes.svg;' + $Script:AzureNATGateways = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/NAT.svg;' + $Script:AzureCDN = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/CDN_Profiles.svg;' + $Script:AzureNSG = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Security_Groups.svg;' + $Script:AzureSvcEndpointPol = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Service_Endpoint_Policies.svg;' + $Script:AzureVMNIC = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;' + $Script:AzureWAFPolicies = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Web_Application_Firewall_Policies_WAF.svg;' + $Script:AzureDNSZone = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/DNS_Zones.svg;' + $Script:AzureAppGateway = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;' + $Script:AzureDDOS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;' + $Script:AzureTrafficManager = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Traffic_Manager_Profiles.svg;' + $Script:AzurePvtLink = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/networking/Private_Link.svg;' + $Script:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" + $Script:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" + + ########### Azure Other + $Script:Dashboard = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Dashboard_Hub.svg;' #width="50.02" height="38.25" + $Script:TemplSpec = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Template_Specs.svg;' + $Script:AzureBackupVault = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Azure_Backup_Center.svg;' + $Script:AzureERDirect = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/ExpressRoute_Direct.svg;' + $Script:AzureAVDSessionHost = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/AVS_VM.svg;' + $Script:AzureAVDHostPool = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Windows_Virtual_Desktop.svg;' + $Script:AzureGrafana = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Grafana.svg;' + $Script:AzureNetworkManager = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/other/Azure_Network_Manager.svg;' + + + ########### Azure Security + $Script:KeyVault = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Key_Vaults.svg;' #width="49.5" height="49.5" + $Script:AzureAppSecGroup = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Application_Security_Groups.svg;' + $Script:AzureDefender = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/security/Azure_Defender.svg;' + + + ########### Azure Storage + $Script:StorageAcc = 'image;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Storage_Accounts.svg;' #width="43.75" height="35" + $Script:AzureNetApp = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;' + $Script:AzureDatalakeGen1 = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/storage/Data_Lake_Storage_Gen1.svg;' + + + ########### Azure Web + $Script:AzureMediaServices = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/azure2/web/Azure_Media_Service.svg;' + + ########### MSCAE + $Script:Certificate = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Certificate.svg;' #width="50" height="42" + $Script:LogAnalytics = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Log_Analytics_Workspaces.svg;' #width="40" height="40" + $Script:PvtDNS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/DNS_Private_Zones.svg;' #width="50" height="50" + $Script:AzureSaaS = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Software_as_a_Service.svg;' + $Script:AzureRelay = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Service_Bus_Relay.svg;' + $Script:AzureLogAlertRule = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Notification.svg;' + $Script:AzureSignalR = 'image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/SignalR.svg;' + + + } + + function ResourceTypes { + Param($TempResourceType,$TempResLeft,$TempResTop) + + switch ($TempResourceType.Name) + { + <########## AZURE AI ############> + + 'microsoft.botservice/botservices' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Bot' + "`n" + 'Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureBotServices $TempResLeft $TempResTop "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.machinelearningservices/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Machine' + "`n" + 'Learning')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureMachineLearning $TempResLeft $TempResTop "40" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.cognitiveservices/accounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cognitive' + "`n" + 'Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureCognitive $TempResLeft $TempResTop "58" "38" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE ANALYTICS ############> + + 'microsoft.databricks/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Databricks')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDatabricks $TempResLeft $TempResTop "48" "52" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.analysisservices/servers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Analysis' + "`n" + 'Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAnalysis $TempResLeft $TempResTop "53" "41" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.synapse/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Synapse' + "`n" + 'Analytics')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSynapses $TempResLeft $TempResTop "45" "54" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE APP ############> + + 'microsoft.web/sites' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web App')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconAPPs $TempResLeft $TempResTop "45" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.web/serverfarms' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Service Plan')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AppSvcPlan $TempResLeft $TempResTop "43.5" "43.5" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.domainregistration/domains' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App Service' + "`n" + 'Domain')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAppDomain $TempResLeft $TempResTop "50" "38" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE VMWARE ############> + + 'microsoft.avs/privateclouds' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VMware' + "`n" + 'Private Cloud')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAVSPrivateCloud $TempResLeft $TempResTop "60" "46" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE COMPUTE ############> + + 'microsoft.desktopvirtualization/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Workspaces')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAVDWorkspace $TempResLeft $TempResTop "48" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/virtualmachinescalesets' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VMSS')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVMSS $TempResLeft $TempResTop "45" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.servicefabric/clusters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Fabric')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SvcFabric $TempResLeft $TempResTop "49.4" "47.2" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/disks' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Disk')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Disks $TempResLeft $TempResTop "40.72" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/virtualmachines' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Virtual' + "`n" + 'Machine')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconVMs $TempResLeft $TempResTop "43" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/availabilitysets' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Availability' + "`n" + 'Set')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AvSet $TempResLeft $TempResTop "43.5" "43.5" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/restorepointcollections' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Restore' + "`n" + 'Point Collection')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $RestorePoint $TempResLeft $TempResTop "50" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.classiccompute/domainnames' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cloud' + "`n" + 'Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureCloudSvc $TempResLeft $TempResTop "51" "37" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/images' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Images')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureVMImage $TempResLeft $TempResTop "47" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + <########## AZURE CONTAINERS ############> + + 'microsoft.containerservice/managedclusters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AKS')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconAKS $TempResLeft $TempResTop "51" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.containerregistry/registries' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Container' + "`n" + 'Registry')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $ContRegis $TempResLeft $TempResTop "45" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.kubernetes/connectedclusters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Kubernetes' + "`n" + 'Azure Arc')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconAKS $TempResLeft $TempResTop "51" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.containerinstance/containergroups' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Container' + "`n" + 'Instances')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureContainerInstances $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + <########## AZURE DATABASES ############> + + 'microsoft.sql/servers/databases' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Database')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLDB $TempResLeft $TempResTop "36" "49" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/servers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLDBServer $TempResLeft $TempResTop "49" "49" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.kusto/clusters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Explorer Cluster')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDataExplorer $TempResLeft $TempResTop "41" "41" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dbforpostgresql/servers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'PostgreSQL')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDBforPostgre $TempResLeft $TempResTop "38" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dbforpostgresql/flexibleservers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' PostgreSQL' + "`n" + 'Flexible Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDBforPostgreFlex $TempResLeft $TempResTop "37.94" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.cache/redis' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Redis' + "`n" + 'Cache')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureRedisCa $TempResLeft $TempResTop "55" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.datafactory/factories' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Factory')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDataFactory $TempResLeft $TempResTop "44" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.documentdb/databaseaccounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Cosmos' + "`n" + 'Database')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureCosmos $TempResLeft $TempResTop "51" "51" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/servers/elasticpools' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Elastic Pool')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureElastic $TempResLeft $TempResTop "51" "51" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/servers/jobagents' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Elastic' + "`n" + 'Job Agent')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureElasticJobAgent $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dbformysql/servers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MySQL' + "`n" + 'Database Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDB4MySQL $TempResLeft $TempResTop "35" "46" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dbformysql/flexibleservers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MySQL' + "`n" + 'Flexible Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDB4MySQL $TempResLeft $TempResTop "35" "46" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/managedinstances/databases' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Managed Instances' + "`n" + 'Database')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLManagedInstancesDB $TempResLeft $TempResTop "51" "47" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/managedinstances' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Managed Instances')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLManagedInstances $TempResLeft $TempResTop "50" "49" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sqlvirtualmachine/sqlvirtualmachines' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Virtual Machine')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLVM $TempResLeft $TempResTop "50" "46" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.sql/virtualclusters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SQL' + "`n" + 'Virtual Cluster')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSQLVirtualCluster $TempResLeft $TempResTop "50" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.datamigration/sqlmigrationservices' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Service')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.datamigration/services' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Service')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.datamigration/services/projects' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Database' + "`n" + 'Migration Project')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDBMigration $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.purview/accounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Purview' + "`n" + 'Account')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzurePurviewAcc $TempResLeft $TempResTop "58" "32" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dbformariadb/servers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' MariaDB' + "`n" + 'Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureMariaDB $TempResLeft $TempResTop "34" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE DEVOPS ############> + + 'microsoft.insights/metricalerts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Insight' + "`n" + 'Metrics')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Insight $TempResLeft $TempResTop "33" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.insights/components' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Insights')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Insight $TempResLeft $TempResTop "50" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.visualstudio/account' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DevOps' + "`n" + 'Organization')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDevOpsOrg $TempResLeft $TempResTop "41" "41" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE GENERAL ############> + + 'microsoft.web/sites/slots' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web' + "`n" + 'Slots')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWebSlot $TempResLeft $TempResTop "44" "49" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.insights/workbooks' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Workbooks')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWorkbooks $TempResLeft $TempResTop "39" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.insights/webtests' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Web' + "`n" + 'Test')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWebTest $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE IDENTITY ############> + + 'microsoft.azureactivedirectory/b2cdirectories' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' B2C' + "`n" + 'Directories')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureB2C $TempResLeft $TempResTop "49" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE INTEGRATION ############> + + 'microsoft.servicebus/namespaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Bus')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $SvcBus $TempResLeft $TempResTop "45.05" "39.75" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.web/connections' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' API' + "`n" + 'Connections')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAPIConnections $TempResLeft $TempResTop "43" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.logic/workflows' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Logic' + "`n" + 'Apps')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureLogicApp $TempResLeft $TempResTop "57" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.datacatalog/catalogs' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data' + "`n" + 'Catalog')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDataCatalog $TempResLeft $TempResTop "46" "52" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.web/customapis' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Logic App' + "`n" + 'Custom Connector')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAPIConnections $TempResLeft $TempResTop "43" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.eventgrid/systemtopics' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'System Topics')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureEventGridSymtopics $TempResLeft $TempResTop "44" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.appconfiguration/configurationstores' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' App' + "`n" + 'Configuration')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAppConfiguration $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.logic/integrationaccounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Integration' + "`n" + 'Accounts')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureIntegrationAcc $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.eventgrid/topics' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'Topics')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureEvtGridTopics $TempResLeft $TempResTop "44" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.apimanagement/service' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' API' + "`n" + 'Management')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAPIMangement $TempResLeft $TempResTop "50" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.eventgrid/domains' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event Grid' + "`n" + 'Domain')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureEvtGridDomain $TempResLeft $TempResTop "50" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE IOT ############> + + 'microsoft.eventhub/namespaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Event' + "`n" + 'Hubs')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureEvtHubs $TempResLeft $TempResTop "50" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.devices/iothubs' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' IoT' + "`n" + 'Hubs')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureIoTHubs $TempResLeft $TempResTop "50" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + <########## AZURE MANAGEMENT GOVERNANCE ############> + + 'microsoft.recoveryservices/vaults' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Recovery' + "`n" + 'Services Vault')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $RecoveryVault $TempResLeft $TempResTop "43.5" "38" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.automation/automationaccounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Automation' + "`n" + 'Account')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AutAcc $TempResLeft $TempResTop "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'Microsoft.HybridCompute/machines' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Arc' + "`n" + 'Server')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureArcServer $TempResLeft $TempResTop "30" "54" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE MIGRATE ############> + + 'microsoft.migrate/projects' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Migration' + "`n" + 'Project')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureMigration $TempResLeft $TempResTop "62" "34" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE NETWORKING ############> + + 'microsoft.network/privateendpoints' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'Endpoint')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconPVTs $TempResLeft $TempResTop "44" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/loadbalancers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Load' + "`n" + 'Balancer')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconLBs $TempResLeft $TempResTop "41" "41" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/publicipaddresses' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Public IPs')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzurePIP $TempResLeft $TempResTop "51" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/virtualnetworks' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Virtual' + "`n" + 'Network')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureVNET $TempResLeft $TempResTop "62" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/networkwatchers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Watcher')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $NetWatcher $TempResLeft $TempResTop "44" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/virtualnetworkgateways' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' VPN' + "`n" + 'Gateway')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureVGW $TempResLeft $TempResTop "36" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/connections' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Connection')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureConnections $TempResLeft $TempResTop "44" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/expressroutecircuits' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Express' + "`n" + 'Route')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureExpressRoute $TempResLeft $TempResTop "45" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/networksecuritygroups' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Security Group')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureNSG $TempResLeft $TempResTop "37" "46" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/routetables' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' User Defined' + "`n" + 'Route Tables')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureUDRs $TempResLeft $TempResTop "43" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/routefilters' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Route' + "`n" + 'Filters')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureRouteFilters $TempResLeft $TempResTop "54" "34" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/bastionhosts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Bastion' + "`n" + 'Host')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureBastionHost $TempResLeft $TempResTop "31" "37" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.compute/proximityplacementgroups' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Proximity' + "`n" + 'Placement Groups')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Azureproximityplacementgroups $TempResLeft $TempResTop "47" "45" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/privatelinkservices' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'Link Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzurePvtLinks $TempResLeft $TempResTop "56" "33" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/ipgroups' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' IP' + "`n" + 'Groups')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureIPGroups $TempResLeft $TempResTop "56" "33" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/azurefirewalls' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Firewall')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureFW $TempResLeft $TempResTop "64" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/localnetworkgateways' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Local' + "`n" + 'Network Gateway')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureLNG $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/frontdoors' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Front Door')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureFrontDoor $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/natgateways' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' NAT' + "`n" + 'Gateways')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureNATGateways $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/publicipprefixes' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Public IP' + "`n" + 'Prefixes')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzurePIPPrefixes $TempResLeft $TempResTop "51" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.cdn/profiles' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' CDN' + "`n" + 'Profile')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureCDN $TempResLeft $TempResTop "64" "36" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/serviceendpointpolicies' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Service' + "`n" + 'Endpoint Polices')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSvcEndpointPol $TempResLeft $TempResTop "48" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.Network/networkInterfaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Interface')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureVMNIC $TempResLeft $TempResTop "50" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/frontdoorwebapplicationfirewallpolicies' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(FrontDoor)')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.cdn/cdnwebapplicationfirewallpolicies' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(CDN)')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' WAF Policies' + "`n" + '(App Gateway)')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureWAFPolicies $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/dnszones' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DNS' + "`n" + 'Zone')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDNSZone $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/applicationgateways' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Application' + "`n" + 'Gateway')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAppGateway $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/ddosprotectionplans' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' DDOS' + "`n" + 'Protection')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDDOS $TempResLeft $TempResTop "38" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/trafficmanagerprofiles' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Traffic Manager' + "`n" + 'Profiles')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureTrafficManager $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.hybridcompute/privatelinkscopes' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Arc Private' + "`n" + 'Link Scope')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzurePvtLink $TempResLeft $TempResTop "50" "44" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + <########## AZURE OTHER ############> + + 'microsoft.portal/dashboards' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Shared' + "`n" + 'Dashboard')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Dashboard $TempResLeft $TempResTop "50.02" "38.25" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.resources/templatespecs' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Template' + "`n" + 'Specs')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $TemplSpec $TempResLeft $TempResTop "33" "39" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dataprotection/backupvaults' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Backup' + "`n" + 'Services Vault')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureBackupVault $TempResLeft $TempResTop "40" "36" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/expressrouteports' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' ExpressRoute' + "`n" + 'Direct')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureBackupVault $TempResLeft $TempResTop "45" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.desktopvirtualization/hostpools/sessionhosts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Session Host')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAVDSessionHost $TempResLeft $TempResTop "51" "51" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.desktopvirtualization/hostpools' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' AVD' + "`n" + 'Host Pool')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAVDHostPool $TempResLeft $TempResTop "51" "51" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.dashboard/grafana' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Grafana')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureGrafana $TempResLeft $TempResTop "50" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/networkmanagers' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Network' + "`n" + 'Manager')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureNetworkManager $TempResLeft $TempResTop "46" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE SECURITY ############> + + 'microsoft.keyvault/vaults' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Key' + "`n" + 'Vault')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $KeyVault $TempResLeft $TempResTop "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/applicationsecuritygroups' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Application' + "`n" + 'Security Group')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureAppSecGroup $TempResLeft $TempResTop "35" "43" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.easm/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Defender' + "`n" + 'EASM')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDefender $TempResLeft $TempResTop "50" "38" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE STORAGE ############> + + 'microsoft.storage/storageaccounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Storage' + "`n" + 'Account')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $StorageAcc $TempResLeft $TempResTop "49.94" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.netapp/netappaccounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' NetApp' + "`n" + 'Account')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureNetApp $TempResLeft $TempResTop "40" "32" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'Microsoft.DataLakeStore/accounts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Data Lake' + "`n" + 'Storage Gen1')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureDatalakeGen1 $TempResLeft $TempResTop "54" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## AZURE WEB ############> + + 'microsoft.media/mediaservices' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Media' + "`n" + 'Services')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureMediaServices $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + + <########## MSCAE ############> + + 'microsoft.web/certificates' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Certificate')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $Certificate $TempResLeft $TempResTop "50" "42" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.operationalinsights/workspaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Log' + "`n" + 'Analytics')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $LogAnalytics $TempResLeft $TempResTop "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.network/privatednszones' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Private' + "`n" + 'DNS Zone')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $PvtDNS $TempResLeft $TempResTop "40" "40" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.saas/resources' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SaaS' + "`n" + 'Resource')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSaaS $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.relay/namespaces' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Relay')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureRelay $TempResLeft $TempResTop "50" "50" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.Insights/ActivityLogAlerts' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Activity Log' + "`n" + 'Alert Rule')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'Microsoft.AlertsManagement/smartDetectorAlertRules' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Smart Detector' + "`n" + 'Alert Rule')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'microsoft.insights/scheduledqueryrules' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' Log Search' + "`n" + 'Alert Rule')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureLogAlertRule $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + 'Microsoft.SignalRService/SignalR' + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' SignalR')) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureSignalR $TempResLeft $TempResTop "48" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + + + default + { + $TempName = [string]$TempResourceType.Name + $TempName = $TempName.Replace('microsoft.','') + $TempName = $TempName.split('/') + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Count + ' ' + $TempName[0]+ "`n" + $TempName[1])) + #$Script:XmlWriter.WriteAttributeString('label', ([string]$TempResourceType.Name)) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $AzureError $TempResLeft $TempResTop "50" "48" 1 + + $Script:XmlWriter.WriteEndElement() + } + } + + } + + + $Script:NonTypes = ('microsoft.compute/virtualmachines/extensions', + 'microsoft.operationsmanagement/solutions', + 'microsoft.network/privatednszones/virtualnetworklinks', + 'microsoft.devtestlab/schedules', + 'microsoft.managedidentity/userassignedidentities', + 'microsoft.compute/virtualmachines/runcommands', + 'microsoft.compute/sshpublickeys', + 'microsoft.resources/templatespecs/versions', + 'microsoft.containerregistry/registries/replications', + 'microsoft.automation/automationaccounts/runbooks', + 'microsoft.compute/snapshots', + 'microsoft.insights/autoscalesettings', + 'microsoft.insights/actiongroups', + 'microsoft.network/networkwatchers/flowlogs', + 'microsoft.compute/diskencryptionsets', + 'microsoft.insights/datacollectionrules', + 'microsoft.netapp/netappaccounts/capacitypools', + 'microsoft.netapp/netappaccounts/capacitypools/volumes', + 'microsoft.network/firewallpolicies', + 'microsoft.web/connectiongateways', + 'microsoft.security/automations', + 'microsoft.datacatalog/catalogs', + 'microsoft.hybridcompute/machines/extensions', + 'microsoft.compute/galleries/images', + 'microsoft.compute/galleries/images/versions', + 'microsoft.desktopvirtualization/applicationgroups', + 'microsoft.network/networkintentpolicies', + 'microsoft.resourcegraph/queries', + 'microsoft.cdn/profiles/endpoints', + 'microsoft.network/networkwatchers/connectionmonitors', + 'microsoft.compute/galleries', + 'microsoft.synapse/workspaces/sqlpools', + 'microsoft.containerregistry/registries/webhooks', + 'microsoft.migrate/movecollections', + 'microsoft.databricks/accessconnectors', + 'microsoft.insights/datacollectionendpoints', + 'microsoft.synapse/workspaces/bigdatapools', + 'microsoft.media/mediaservices/streamingendpoints', + 'microsoft.security/customentitystoreassignments', + 'microsoft.security/securityconnectors', + 'microsoft.security/customassessmentautomations', + 'microsoft.datashare/accounts', + 'microsoft.cdn/profiles/afdendpoints', + 'microsoft.securitydevops/azuredevopsconnectors', + 'microsoft.securitydevops/githubconnectors', + 'microsoft.security/datascanners', + 'microsoft.offazure/importsites', + 'microsoft.offazure/vmwaresites', + 'microsoft.migrate/migrateprojects', + 'microsoft.migrate/assessmentprojects', + 'microsoft.offazure/mastersites', + 'microsoft.automation/automationaccounts/configurations', + 'microsoft.alertsmanagement/actionrules', + 'microsoft.resourceconnector/appliances', + 'microsoft.automanage/configurationprofiles', + 'microsoft.offazure/hypervsites', + 'microsoft.machinelearningservices/registries', + 'microsoft.machinelearningservices/workspaces/onlineendpoints/deployments', + 'microsoft.machinelearningservices/workspaces/onlineendpoints', + 'microsoft.serviceshub/connectors', + 'microsoft.containerregistry/registries/tasks', + 'microsoft.web/staticsites', + 'microsoft.security/standards', + 'microsoft.security/iotsecuritysolutions', + 'microsoft.security/assignments', + 'microsoft.connectedvmwarevsphere/virtualmachines', + 'microsoft.connectedvmwarevsphere/vcenters', + 'microsoft.extendedlocation/customlocations', + 'microsoft.offazure/serversites', + 'microsoft.signalrservice/webpubsub', + 'microsoft.eventgrid/partnerconfigurations') + + + $Subs = $Resources | group-object -Property subscriptionId | Sort-Object -Property Count -Descending + + $DDDFile = ($DiagramCache+'Subscriptions.xml') + + $XLeft = 100 + $XTop = 100 + $CelNum = 0 + + $Script:etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + $Script:CellID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $Script:IDNum = 0 + + $Script:XmlWriter = New-Object System.XMl.XmlTextWriter($DDDFile,$Null) + + $Script:XmlWriter.Formatting = 'Indented' + $Script:XmlWriter.Indentation = 2 + + $Script:XmlWriter.WriteStartDocument() + + $Script:XmlWriter.WriteStartElement('mxfile') + $Script:XmlWriter.WriteAttributeString('host', 'Electron') + $Script:XmlWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') + $Script:XmlWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') + $Script:XmlWriter.WriteAttributeString('etag', $etag) + $Script:XmlWriter.WriteAttributeString('version', '15.4.0') + $Script:XmlWriter.WriteAttributeString('type', 'device') + + foreach($Sub in $Subs.Name) + { + $RGLeft = $XLeft + 40 + $RGTop = $XTop + 40 + $Resource = $Resources | Where-Object {$_.subscriptionId -eq $Sub} + $SubName = $Subscriptions | Where-Object {$_.id -eq $Sub} + $Resource0 = $Resource | Group-Object -Property resourceGroup | Sort-Object -Property Count -Descending + $SubName = $SubName.Name + + $DiagID1 = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $Script:XmlWriter.WriteStartElement('diagram') + $Script:XmlWriter.WriteAttributeString('id', $DiagID1) + $Script:XmlWriter.WriteAttributeString('name', $SubName) + + $Script:XmlWriter.WriteStartElement('mxGraphModel') + $Script:XmlWriter.WriteAttributeString('dx', "1326") + $Script:XmlWriter.WriteAttributeString('dy', "798") + $Script:XmlWriter.WriteAttributeString('grid', "1") + $Script:XmlWriter.WriteAttributeString('gridSize', "10") + $Script:XmlWriter.WriteAttributeString('guides', "1") + $Script:XmlWriter.WriteAttributeString('tooltips', "1") + $Script:XmlWriter.WriteAttributeString('connect', "1") + $Script:XmlWriter.WriteAttributeString('arrows', "1") + $Script:XmlWriter.WriteAttributeString('fold', "1") + $Script:XmlWriter.WriteAttributeString('page', "1") + $Script:XmlWriter.WriteAttributeString('pageScale', "1") + $Script:XmlWriter.WriteAttributeString('pageWidth', "850") + $Script:XmlWriter.WriteAttributeString('pageHeight', "1100") + $Script:XmlWriter.WriteAttributeString('math', "0") + $Script:XmlWriter.WriteAttributeString('shadow', "0") + + $Script:XmlWriter.WriteStartElement('root') + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "0") + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('mxCell') + $Script:XmlWriter.WriteAttributeString('id', "1") + $Script:XmlWriter.WriteAttributeString('parent', "0") + $Script:XmlWriter.WriteEndElement() + + variables + + $Script:CellIDRes = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) + + $Witd = 2060 + + $Counter = 1 + $ZCounter = 0 + foreach($RG in $Resource0.Name) + { + $Res = $Resource | Where-Object {$_.resourceGroup -eq $RG -and $_.Type -notin $NonTypes} + $Resource1 = $Res | Group-Object -Property type | Sort-Object -Property Count -Descending + + $RGHeigh = if($Resource1.name.count -le 8){1}else{[math]::ceiling($Resource1.name.count / 8)} + + if($Counter -eq 1) + { + $RGLeft = $RGLeft + $RGWitdh + 40 + $TempHeight1 = $RGTop + ($RGHeigh*120) + 40 + if($ZCounter -eq 1) + { + $RGTop = $TempHeight2 + } + } + else + { + $RGLeft = $XLeft + 40 + $TempHeight2 = $RGTop + ($RGHeigh*120) + 40 + $RGTop = $TempHeight1 + $ZCounter = 1 + } + + if($Counter -eq 1){$Counter = 2}else{$Counter = 1} + } + + if($TempHeight1 -gt $TempHeight2){$RGTop = $TempHeight1}else{$RGTop = $TempHeight2} + + $SubHeight = $RGTop - $XTop + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($CelNum++))) + + Icon $Ret $XLeft $XTop $Witd $SubHeight 1 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $SubName) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconSubscription 30 ($XTop+$SubHeight-20) "67" "40" 1 + + $Script:XmlWriter.WriteEndElement() + + $RGLeft = $XLeft + 40 + $RGTop = $XTop + 40 + + $Counter = 1 + $ZCounter = 0 + foreach($RG in $Resource0.Name) + { + $Res = $Resource | Where-Object {$_.resourceGroup -eq $RG -and $_.subscriptionId -eq $Sub -and $_.Type -notin $NonTypes} + $Resource1 = $Res | Group-Object -Property type | Sort-Object -Property Count -Descending + + $RGWitdh = 960 + $RGHeigh = if($Resource1.name.count -le 8){1}else{[math]::ceiling($Resource1.name.count / 8)} + + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', '') + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellIDRes+'-'+($CelNum++))) + + Icon $RetRound $RGLeft $RGTop $RGWitdh ($RGHeigh*120) 1 + + $Script:XmlWriter.WriteEndElement() + + if($Counter -eq 1) + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $RG) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconRG ($XLeft+20) ($RGTop+($RGHeigh*120)-20) "37.5" "30" 1 + + $Script:XmlWriter.WriteEndElement() + + $ResTypeLeft = $RGLeft + 60 + $ResTypeTop = $RGTop + 25 + $YCounter = 1 + + foreach($res0 in $Resource1) + { + ResourceTypes $res0 $ResTypeLeft $ResTypeTop + if($YCounter -ge 8) + { + $ResTypeLeft = $RGLeft + 60 + $ResTypeTop = $ResTypeTop + 110 + $YCounter = 1 + } + else + { + $ResTypeLeft = $ResTypeLeft + 110 + $YCounter++ + } + + } + $RGLeft = $RGLeft + $RGWitdh + 40 + $TempHeight1 = $RGTop + ($RGHeigh*120) + 40 + if($ZCounter -eq 1) + { + $RGTop = $TempHeight2 + } + } + else + { + $Script:XmlWriter.WriteStartElement('object') + $Script:XmlWriter.WriteAttributeString('label', $RG) + $Script:XmlWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) + + Icon $IconRG ($RGLeft + $RGWitdh - 20) ($RGTop+($RGHeigh*120)-20) "37.5" "30" 1 + + $Script:XmlWriter.WriteEndElement() + + $ResTypeLeft = $RGLeft + 60 + $ResTypeTop = $RGTop + 25 + $YCounter = 1 + + foreach($res0 in $Resource1) + { + ResourceTypes $res0 $ResTypeLeft $ResTypeTop + if($YCounter -ge 8) + { + $ResTypeLeft = $RGLeft + 60 + $ResTypeTop = $ResTypeTop + 110 + $YCounter = 1 + } + else + { + $ResTypeLeft = $ResTypeLeft + 110 + $YCounter++ + } + + } + + $RGLeft = $XLeft + 40 + $TempHeight2 = $RGTop + ($RGHeigh*120) + 40 + $RGTop = $TempHeight1 + $ZCounter = 1 + } + + if($Counter -eq 1){$Counter = 2}else{$Counter = 1} + + } + + if($TempHeight1 -gt $TempHeight2){$RGTop = $TempHeight1}else{$RGTop = $TempHeight2} + + $XTop = $RGTop + 200 + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + + $Script:XmlWriter.WriteEndElement() + } + + $Script:XmlWriter.WriteEndDocument() + $Script:XmlWriter.Flush() + $Script:XmlWriter.Close() + + } -ArgumentList $Subscriptions,$Resources,$DiagramCache + +} \ No newline at end of file diff --git a/Modules/Diagram/ARIDrawIODiagram.psm1 b/Modules/Diagram/ARIDrawIODiagram.psm1 new file mode 100644 index 0000000..56bd315 --- /dev/null +++ b/Modules/Diagram/ARIDrawIODiagram.psm1 @@ -0,0 +1,79 @@ +<# +.Synopsis +Diagram Module for Draw.io + +.DESCRIPTION +This script process and creates a Draw.io Diagram based on resources present in the extraction variable $Resources. + +.Link +https://github.com/microsoft/ARI/Modules/Extras/DrawIODiagram.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ARIDrawIODiagram { + param($Subscriptions, $Resources, $Advisories, $DDFile, $DiagramCache, $FullEnvironment, $ResourceContainers) + + $TempPath = $DiagramCache.split("DiagramCache\")[0] + + $Logfile = ($TempPath+'DiagramLogFile.log') + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Draw.IO file') | Out-File -FilePath $LogFile -Append + + $XMLFiles = @() + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Setting XML files to be clean') | Out-File -FilePath $LogFile -Append + + $XMLFiles += ($DiagramCache+'Organization.xml') + $XMLFiles += ($DiagramCache+'Subscriptions.xml') + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Cleaning old files') | Out-File -FilePath $LogFile -Append + + foreach($File in $XMLFiles) + { + Remove-Item -Path $File -ErrorAction SilentlyContinue + } + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Organization Function') | Out-File -FilePath $LogFile -Append + + Invoke-ARIDiagramOrganization -ResourceContainers $ResourceContainers -DiagramCache $DiagramCache -LogFile $Logfile + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Network Topology Function') | Out-File -FilePath $LogFile -Append + + Invoke-ARIDiagramNetwork -Subscriptions $Subscriptions -Resources $Resources -Advisories $Advisories -DiagramCache $DiagramCache -FullEnvironment $FullEnvironment -DDFile $DDFile -XMLFiles $XMLFiles -LogFile $Logfile + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting Subscription Function') | Out-File -FilePath $LogFile -Append + + Invoke-ARIDiagramSubscription -Subscriptions $Subscriptions -Resources $Resources -DiagramCache $DiagramCache -LogFile $Logfile + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Waiting for Jobs to complete') | Out-File -FilePath $LogFile -Append + + (Get-Job | Where-Object {$_.name -like 'Diagram_*'}) | Wait-Job + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Starting to process files') | Out-File -FilePath $LogFile -Append + + foreach($File in $XMLFiles) + { + $oldxml = New-Object XML + $oldxml.Load($File) + + $newxml = New-Object XML + $newxml.Load($DDFile) + + $oldxml.DocumentElement.InsertAfter($oldxml.ImportNode($newxml.SelectSingleNode('mxfile'), $true), $afternode) + + $oldxml.Save($DDFile) + + Remove-Item -Path $File + } + + ('DrawIOCoreFile - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Cleaning old jobs') | Out-File -FilePath $LogFile -Append + + (Get-Job | Where-Object {$_.name -like 'Diagram_*'}) | Remove-Job +} diff --git a/Extras/VisioDiagram.ps1 b/Modules/Diagram/VisioDiagram.ps1 similarity index 100% rename from Extras/VisioDiagram.ps1 rename to Modules/Diagram/VisioDiagram.ps1 diff --git a/Modules/Extras/ARIReportCharts.psm1 b/Modules/Extras/ARIReportCharts.psm1 new file mode 100644 index 0000000..8887a84 --- /dev/null +++ b/Modules/Extras/ARIReportCharts.psm1 @@ -0,0 +1,989 @@ +<# +.Synopsis +Module for Main Dashboard + +.DESCRIPTION +This script process and creates the Overview sheet. + +.Link +https://github.com/microsoft/ARI/Modules/Extras/ARIReportCharts.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Build-ARIExcelChart { + param($File, $TableStyle, $PlatOS, $Subscriptions, $ExtractionRunTime, $ReportingRunTime, $RunLite, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + $ARIMod = Get-InstalledModule -Name AzureResourceInventory + + $ScriptVersion = [string]$ARIMod.Version + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Excel Charts Customization.') + + if(!$RunLite) + { + $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File + $Worksheets = $Excel.Workbook.Worksheets + + $Order = $Worksheets | Where-Object { $_.Name -notin 'Policy', 'Advisor', 'Security Center', 'Subscriptions', 'Quota Usage', 'AdvisorScore', 'Outages', 'SupportTickets', 'Reservation Advisor' } | Select-Object -Property Index, name, @{N = "Dimension"; E = { $_.dimension.Rows - 1 } } | Sort-Object -Property Dimension -Descending + + $Order0 = $Order | Where-Object { $_.Name -ne $Order[0].name -and $_.Name -ne ($Order | select-object -Last 1).Name } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Validating if Advisor and Policies are included.') + if (($Worksheets | Where-Object { $_.Name -eq 'Advisor'})) + { + $Worksheets.MoveAfter($Order[0].Name, 'Advisor') + } + if (($Worksheets | Where-Object { $_.Name -eq 'Policy'})) + { + $Worksheets.MoveAfter($Order[0].Name, 'Policy') + } + $Worksheets.MoveAfter(($Order | select-object -Last 1).Name, 'Subscriptions') + + $Loop = 0 + + + Foreach ($Ord in $Order0) { + if ($Ord.Index -and $Loop -ne 0) { + $Worksheets.MoveAfter($Ord.Name, $Order0[$Loop - 1].Name) + } + if ($Loop -eq 0) { + $Worksheets.MoveAfter($Ord.Name, $Order[0].Name) + } + $Loop++ + } + + $Excel.Save() + $Excel.Dispose() + } + + "" | Export-Excel -Path $File -WorksheetName 'Overview' -MoveToStart + + if($RunLite) + { + $excel = Open-ExcelPackage -Path $file -KillExcel + } + else + { + $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File + } + $Worksheets = $Excel.Workbook.Worksheets + $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } + + $WS.SetValue(75,70,'') + $WS.SetValue(76,70,'') + $WS.View.ShowGridLines = $false + + if($RunLite) + { + Close-ExcelPackage $excel + } + else + { + $Excel.Save() + $Excel.Dispose() + } + + $TableStyleEx = if($PlatOS -eq 'PowerShell Desktop'){'Medium1'}else{$TableStyle} + $TableStyle = if($PlatOS -eq 'PowerShell Desktop'){'Medium15'}else{$TableStyle} + #$TableStyle = 'Medium22' + $Font = 'Segoe UI' + + if($RunLite) + { + $excel = Open-ExcelPackage -Path $file -KillExcel + } + else + { + $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File + } + $Worksheets = $Excel.Workbook.Worksheets | Where-Object { $_.name -notin 'Overview', 'Advisor', 'Policy', 'Security Center'} + $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } + + $TabDraw = $WS.Drawings.AddShape('TP00', 'RoundRect') + $TabDraw.SetSize(130 , 78) + $TabDraw.SetPosition(1, 0, 0, 0) + $TabDraw.TextAlignment = 'Center' + + $Table = @() + $TotalRes = 0 + Foreach ($WorkS in $Worksheets) { + $Number = $WorkS.Tables.Name.split('_') + $tmp = @{ + 'Name' = $WorkS.name; + 'Size' = [int]$Number[1]; + 'Size2' = if ($WorkS.name -in ('Subscriptions', 'Quota Usage', 'AdvisorScore', 'Outages', 'SupportTickets', 'Reservation Advisor')) {0}else{[int]$Number[1]} + } + $TotalRes = $TotalRes + ([int]$Number[1]) + $Table += $tmp + } + + if($RunLite) + { + Close-ExcelPackage $excel + } + else + { + $Excel.Save() + $Excel.Dispose() + } + + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 + + $Table | + ForEach-Object { [PSCustomObject]$_ } | Sort-Object -Property 'Size2' -Descending | + Select-Object -Unique 'Name', + 'Size' | Export-Excel -Path $File -WorksheetName 'Overview' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzureTabs' -TableStyle $TableStyleEx -Style $Style -StartRow 6 -StartColumn 1 + + $Date = (get-date -Format "MM/dd/yyyy") + + $ExtractTime = if($ExtractionRunTime.Totalminutes -lt 1){($ExtractionRunTime.Seconds.ToString()+' Seconds')}else{($ExtractionRunTime.Totalminutes.ToString('#######.##')+' Minutes')} + $ReportTime = ($ReportingRunTime.Totalminutes.ToString('#######.##')+' Minutes') + + $User = (get-azcontext -WarningAction SilentlyContinue -InformationAction SilentlyContinue | Select-Object -Property Account -Unique).Account.Id + + + #$TotalRes = $TotalResources + + if($RunLite) + { + $excel = Open-ExcelPackage -Path $file -KillExcel + } + else + { + $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $File + } + $Worksheets = $Excel.Workbook.Worksheets + $WS = $Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Overview' } + + $cell = $WS.Cells | Where-Object {$_.Address -like 'A*' -and $_.Address -notin 'A1','A2','A3','A4','A5','A6'} + foreach ($item in $cell) { + $Works = $Item.Text + $Link = New-Object -TypeName OfficeOpenXml.ExcelHyperLink ("'"+$Works+"'"+'!A1'),$Works + $Item.Hyperlink = $Link + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Creating Overall Panel.') + $Egg = $WS.Cells | Where-Object {$_.Address -eq 'BR75'} + $Egg.AddComment('Created with a lot of effort and hard work, we hope you enjoy it.','.') | Out-Null + $Egg = $WS.Cells | Where-Object {$_.Address -eq 'BR76'} + $Egg.AddComment('By: Claudio Merola and Renato Gregio','.') | Out-Null + + $TabDraw = $WS.Drawings.AddShape('TP0', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 52, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP1', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 55, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP2', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 58, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP3', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 61, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP4', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 64, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP5', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 67, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP6', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 70, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP7', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 73, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP8', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 76, 0) + $TabDraw.TextAlignment = 'Center' + + $TabDraw = $WS.Drawings.AddShape('TP9', 'RoundRect') + $TabDraw.SetSize(125, 25) + $TabDraw.SetPosition(0, 10, 79, 0) + $TabDraw.TextAlignment = 'Center' + + $Draw = $WS.Drawings.AddShape('ARI', 'RoundRect') + $Draw.SetSize(445, 240) + $Draw.SetPosition(1, 0, 2, 5) + + $txt = $Draw.RichText.Add('Azure Resource Inventory v' + $ScriptVersion + "`n") + $txt.Size = 14 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('https://github.com/microsoft/ARI' + "`n" + "`n") + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('Report Date: ') + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add($Date + "`n") + $txt.Size = 12 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('Extraction Time: ') + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add($ExtractTime + "`n") + $txt.Size = 12 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('Reporting Time: ') + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add($ReportTime + "`n") + $txt.Size = 12 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('User Session: ') + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add($User + "`n") + $txt.Size = 12 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add('Environment: ') + $txt.Size = 11 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $txt = $Draw.RichText.Add($PlatOS) + $txt.Size = 12 + $txt.ComplexFont = $Font + $txt.LatinFont = $Font + + $Draw.TextAlignment = 'Center' + + $RGD = $WS.Drawings.AddShape('RGs', 'RoundRect') + $RGD.SetSize(124, 115) + $RGD.SetPosition(21, 5, 9, 5) + $RGD.TextAlignment = 'Center' + $RGD.RichText.Add('Total Resources' + "`n").Size = 12 + $RGD.RichText.Add($TotalRes).Size = 22 + + $DrawP00 = $WS.Drawings | Where-Object { $_.Name -eq 'TP00' } + $P00Name = 'Reported Resources' + $DrawP00.RichText.Add($P00Name).Size = 16 + + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Reservation Advisor' }) { + $P00Name = 'Reservation Advisor' + } + else + { + $P00Name = 'Resources' + } + $DrawP0 = $WS.Drawings | Where-Object { $_.Name -eq 'TP0' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Outages' }) { + $P0Name = 'Outages' + } + elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisor' }) { + $P0Name = 'Advisories' + } + else { + $P0Name = 'Public IPs' + } + $DrawP0.RichText.Add($P0Name) | Out-Null + + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'AdvisorScore' }) { + $P1Name = 'AdvisorScore' + } + elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Subscriptions' }) { + $P1Name = 'Subscriptions' + } + $DrawP1 = $WS.Drawings | Where-Object { $_.Name -eq 'TP1' } + $DrawP1.RichText.Add($P1Name) | Out-Null + + $DrawP2 = $WS.Drawings | Where-Object { $_.Name -eq 'TP2' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Policy' }) { + $P2Name = 'Policy' + } + elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisor' }) { + $P2Name = 'Annual Savings' + } + else { + $P2Name = 'Virtual Networks' + } + + $DrawP2.RichText.Add($P2Name) | Out-Null + + $DrawP3 = $WS.Drawings | Where-Object { $_.Name -eq 'TP3' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'SupportTickets' }) { + $P3Name = 'SupportTickets' + } + elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'AKS' }) { + $P3Name = 'Azure Kubernetes' + } + else { + $P3Name = 'Storage Accounts' + } + $DrawP3.RichText.Add($P3Name) | Out-Null + + $DrawP4 = $WS.Drawings | Where-Object { $_.Name -eq 'TP4' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Outages' }) { + $P4Name = 'Outages' + } + elseif ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Quota Usage' }) { + $P4Name = 'Quota Usage' + } + else { + $P4Name = 'VM Disks' + } + $DrawP4.RichText.Add($P4Name) | Out-Null + + $DrawP5 = $WS.Drawings | Where-Object { $_.Name -eq 'TP5' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { + $P5Name = 'Virtual Machines' + } + $DrawP5.RichText.Add($P5Name) | Out-Null + + $DrawP6 = $WS.Drawings | Where-Object { $_.Name -eq 'TP6' } + $P6Name = 'Resources by Location' + $DrawP6.RichText.Add($P6Name) | Out-Null + + $DrawP7 = $WS.Drawings | Where-Object { $_.Name -eq 'TP7' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { + $P7Name = 'Virtual Machines' + } + $DrawP7.RichText.Add($P7Name) | Out-Null + + $DrawP8 = $WS.Drawings | Where-Object { $_.Name -eq 'TP8' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Advisor' }) { + $P8Name = 'Advisories' + } + $DrawP8.RichText.Add($P8Name) | Out-Null + + $DrawP9 = $WS.Drawings | Where-Object { $_.Name -eq 'TP9' } + if ($Excel.Workbook.Worksheets | Where-Object { $_.Name -eq 'Virtual Machines' }) { + $P9Name = 'Virtual Machines' + } + $DrawP9.RichText.Add($P9Name) | Out-Null + + if($RunLite) + { + Close-ExcelPackage $excel + } + else + { + $Excel.Save() + $Excel.Dispose() + } + + $excel = Open-ExcelPackage -Path $file -KillExcel + + if ($P00Name -eq 'Reservation Advisor') + { + $PTParams = @{ + PivotTableName = "P00" + Address = $excel.Overview.cells["CV5"] # top-left corner of the table + SourceWorkSheet = $excel.'Reservation Advisor' + PivotRows = @("Subscription") + PivotData = @{"Net Savings" = "Sum" } + PivotColumns = @("Instance Flexibility Group") + PivotTableStyle = $TableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 1 # place the chart below row 22nd + ChartColumn = 9 + Activate = $true + PivotNumberFormat = '$#' + PivotFilter = 'Recommended Size' + PivotTotals = 'Both' + ShowCategory = $false + NoLegend = $true + ChartTitle = 'Potential Net Savings (VM Reservation)' + ShowPercent = $true + ChartHeight = 400 + ChartWidth = 950 + ChartRowOffSetPixels = 0 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams + } + else + { + Add-ExcelChart -Worksheet $excel.Overview -ChartType Area3D -XRange "AzureTabs[Name]" -YRange "AzureTabs[Size]" -SeriesHeader 'Resources', 'Count' -Column 9 -Row 1 -Height 400 -Width 950 -RowOffSetPixels 0 -ColumnOffSetPixels 5 -NoLegend + } + + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Creating Charts.') + + if ($P0Name -eq 'Outages') { + $PTParams = @{ + PivotTableName = "P0" + Address = $excel.Overview.cells["BA5"] # top-left corner of the table + SourceWorkSheet = $excel.'Outages' + PivotRows = @("Impacted Services") + PivotData = @{"Impacted Services" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarStacked3D" + ChartRow = 13 # place the chart below row 22nd + ChartColumn = 2 + Activate = $true + PivotFilter = 'Subscription' + ChartTitle = 'Outages (Last 6 Months)' + ShowPercent = $true + ChartHeight = 275 + ChartWidth = 445 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams -NoLegend + } + elseif ($P0Name -eq 'Advisories') { + $PTParams = @{ + PivotTableName = "P0" + Address = $excel.Overview.cells["BA5"] # top-left corner of the table + SourceWorkSheet = $excel.Advisor + PivotRows = @("Category") + PivotData = @{"Category" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarStacked3D" + ChartRow = 13 # place the chart below row 22nd + ChartColumn = 2 + Activate = $true + PivotFilter = 'Impact' + ChartTitle = 'Advisor' + ShowPercent = $true + ChartHeight = 275 + ChartWidth = 445 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams -NoLegend + } + else { + $PTParams = @{ + PivotTableName = "P0" + Address = $excel.Overview.cells["BA5"] # top-left corner of the table + SourceWorkSheet = $excel.'Public IPs' + PivotRows = @("Use") + PivotData = @{"Use" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarStacked3D" + ChartRow = 13 # place the chart below row 22nd + ChartColumn = 2 + Activate = $true + PivotFilter = 'location' + ChartTitle = 'Public IPs' + ShowPercent = $true + ChartHeight = 275 + ChartWidth = 445 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams -NoLegend + } + + if ($P1Name -eq 'AdvisorScore') { + $PTParams = @{ + PivotTableName = "P1" + Address = $excel.Overview.cells["BD6"] # top-left corner of the table + SourceWorkSheet = $excel.AdvisorScore + PivotRows = @("Category") + PivotData = @{"Latest Score (%)" = "average" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarClustered" + ChartRow = 27 # place the chart below row 22nd + ChartColumn = 2 + Activate = $true + #PivotNumberFormat = '0' + ShowCategory = $false + PivotFilter = 'Subscription' + ChartTitle = 'Advisor Score (%)' + NoLegend = $true + ShowPercent = $true + ChartHeight = 655 + ChartWidth = 570 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams + + } + else + { + $PTParams = @{ + PivotTableName = "P1" + Address = $excel.Overview.cells["BD6"] # top-left corner of the table + SourceWorkSheet = $excel.Subscriptions + PivotRows = @("Subscription") + PivotData = @{"Resources" = "sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarClustered" + ChartRow = 27 # place the chart below row 22nd + ChartColumn = 2 + Activate = $true + PivotFilter = 'Resource Group', 'Resource Type' + ChartTitle = 'Resources by Subscription' + NoLegend = $true + ShowPercent = $true + ChartHeight = 655 + ChartWidth = 570 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams + } + + if ($P2Name -eq 'Policy') { + $PTParams = @{ + PivotTableName = "P2" + Address = $excel.Overview.cells["BG5"] # top-left corner of the table + SourceWorkSheet = $excel.Policy + PivotRows = @("Policy Category") + PivotData = @{"Policy" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 21 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'Policy Type' + ChartTitle = 'Policies by Category' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams -NoLegend + } + elseif ($P2Name -eq 'Annual Savings') { + $PTParams = @{ + PivotTableName = "P2" + Address = $excel.Overview.cells["BG5"] # top-left corner of the table + SourceWorkSheet = $excel.Advisor + PivotRows = @("Savings Currency") + PivotData = @{"Annual Savings" = "Sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 21 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + ChartTitle = 'Potential Savings' + PivotFilter = 'Savings Region' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + PivotNumberFormat = '#,##0.00' + } + Add-PivotTable @PTParams -NoLegend + } + else { + $PTParams = @{ + PivotTableName = "P2" + Address = $excel.Overview.cells["BG5"] # top-left corner of the table + SourceWorkSheet = $excel.'Virtual Networks' + PivotRows = @("Location") + PivotData = @{"Location" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 21 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + ChartTitle = 'Virtual Networks' + PivotFilter = 'Subscription' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams -NoLegend + } + + if ($P3Name -eq 'SupportTickets') { + $PTParams = @{ + PivotTableName = "P3" + Address = $excel.Overview.cells["BJ5"] # top-left corner of the table + SourceWorkSheet = $excel.SupportTickets + PivotRows = @("Status") + PivotData = @{"Status" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "Pie3D" + ChartRow = 34 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'Current Severity' + ChartTitle = 'Support Tickets' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams + } + elseif ($P3Name -eq 'Azure Kubernetes') { + $PTParams = @{ + PivotTableName = "P3" + Address = $excel.Overview.cells["BJ5"] # top-left corner of the table + SourceWorkSheet = $excel.AKS + PivotRows = @("Kubernetes Version") + PivotData = @{"Clusters" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "Pie3D" + ChartRow = 34 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + ChartTitle = 'AKS Versions' + PivotFilter = 'Node Pool Size' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams + } + else { + $PTParams = @{ + PivotTableName = "P3" + Address = $excel.Overview.cells["BJ5"] # top-left corner of the table + SourceWorkSheet = $excel.'Storage Acc' + PivotRows = @("Tier") + PivotData = @{"Tier" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "Pie3D" + ChartRow = 34 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'SKU' + ChartTitle = 'Storage Accounts' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams + } + + if ($P4Name -eq 'Outages') { + $PTParams = @{ + PivotTableName = "P4" + Address = $excel.Overview.cells["BM5"] # top-left corner of the table + SourceWorkSheet = $excel.'Outages' + PivotRows = @("Subscription") + PivotData = @{"Outage ID" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 47 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'Event Level' + ChartTitle = 'Outages per Subscription' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams -NoLegend + } + elseif ($P4Name -eq 'Quota Usage') { + $PTParams = @{ + PivotTableName = "P4" + Address = $excel.Overview.cells["BM5"] # top-left corner of the table + SourceWorkSheet = $excel.'Quota Usage' + PivotRows = @("Region") + PivotData = @{"vCPUs Available" = "Sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 47 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'Limit' + ChartTitle = 'Available Quota (vCPUs)' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + Add-PivotTable @PTParams -NoLegend + } + else { + $PTParams = @{ + PivotTableName = "P4" + Address = $excel.Overview.cells["BM5"] # top-left corner of the table + SourceWorkSheet = $excel.Disks + PivotRows = @("Disk State") + PivotData = @{"Disk State" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 47 # place the chart below row 22nd + ChartColumn = 11 + Activate = $true + PivotFilter = 'SKU' + ChartTitle = 'VM Disks' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams -NoLegend + } + + if ($P5Name -eq 'Virtual Machines') { + $PTParams = @{ + PivotTableName = "P5" + Address = $excel.Overview.cells["BP7"] # top-left corner of the table + SourceWorkSheet = $excel.'Virtual Machines' + PivotRows = @("VM Size") + PivotData = @{"Resource U" = "Sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarClustered" + ChartRow = 21 # place the chart below row 22nd + ChartColumn = 16 + Activate = $true + NoLegend = $true + ChartTitle = 'Virtual Machines by Serie' + PivotFilter = 'OS Type', 'Location', 'Power State' + ShowPercent = $true + ChartHeight = 775 + ChartWidth = 502 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 5 + } + + Add-PivotTable @PTParams + } + + $PTParams = @{ + PivotTableName = "P6" + Address = $excel.Overview.cells["BS5"] # top-left corner of the table + SourceWorkSheet = $excel.Subscriptions + PivotRows = @("Location") + PivotData = @{"Resources" = "sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "ColumnStacked3D" + ChartRow = 1 # place the chart below row 22nd + ChartColumn = 24 + Activate = $true + PivotFilter = 'Resource Type' + ChartTitle = 'Resources by Location' + NoLegend = $true + ShowPercent = $true + ChartHeight = 400 + ChartWidth = 315 + ChartRowOffSetPixels = 0 + ChartColumnOffSetPixels = 0 + } + + Add-PivotTable @PTParams + + if ($P7Name -eq 'Virtual Machines') { + $PTParams = @{ + PivotTableName = "P7" + Address = $excel.Overview.cells["BV5"] # top-left corner of the table + SourceWorkSheet = $excel.'Virtual Machines' + PivotRows = @("OS Type") + PivotData = @{"Resource U" = "Sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "Pie3D" + ChartRow = 21 # place the chart below row 22nd + ChartColumn = 24 + Activate = $true + NoLegend = $true + ChartTitle = 'VMs by OS' + PivotFilter = 'Location' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 0 + } + + Add-PivotTable @PTParams + } + + if ($P8Name -eq 'Advisories') { + $PTParams = @{ + PivotTableName = "P8" + Address = $excel.Overview.cells["BY5"] # top-left corner of the table + SourceWorkSheet = $excel.Advisor + PivotRows = @("Impact") + PivotData = @{"Impact" = "Count" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "BarStacked3D" + ChartRow = 34 + ChartColumn = 24 + Activate = $true + PivotFilter = 'Category' + ChartTitle = 'Advisor' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 0 + } + Add-PivotTable @PTParams -NoLegend + } + + if ($P9Name -eq 'Virtual Machines') { + $PTParams = @{ + PivotTableName = "P9" + Address = $excel.Overview.cells["CB5"] # top-left corner of the table + SourceWorkSheet = $excel.'Virtual Machines' + PivotRows = @("Boot Diagnostics") + PivotData = @{"Resource U" = "Sum" } + PivotTableStyle = $tableStyle + IncludePivotChart = $true + ChartType = "Pie3D" + ChartRow = 47 + ChartColumn = 24 + Activate = $true + NoLegend = $true + ChartTitle = 'Boot Diagnostics' + PivotFilter = 'Location' + ShowPercent = $true + ChartHeight = 255 + ChartWidth = 315 + ChartRowOffSetPixels = 5 + ChartColumnOffSetPixels = 0 + } + + Add-PivotTable @PTParams + } + + Close-ExcelPackage $excel + + if(!$RunLite) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Validating if Excel is installed (Extra Customizations).') + $application = New-Object -ComObject Excel.Application + if ($application) { + $Ex = $application.Workbooks.Open($File) + Start-Sleep -Seconds 2 + $WS = $ex.Worksheets | Where-Object { $_.Name -eq 'Overview' } + + foreach ($Sheet in ($Ex.Worksheets | Where-Object {$_.Name -in ('Policy', 'Advisor', 'Security Center', 'Subscriptions', 'Quota Usage', 'AdvisorScore', 'Outages', 'SupportTickets', 'Reservation Advisor')})) + { + $Sheet.tab.ColorIndex = 55 + Start-Sleep -Milliseconds 50 + } + + $NoChangeChart = ('ChartP0', 'ChartP1', 'ChartP2', 'ChartP3', 'ChartP4', 'ChartP5', 'ChartP6', 'ChartP7', 'ChartP8', 'ChartP9', 'ARI', 'RGs', 'TP00', 'TP0', 'TP1', 'TP2', 'TP3', 'TP4', 'TP5','TP6','TP7','TP8','TP9') + $ChangeChart = ('ARI', 'RGs', 'TP00', 'TP0', 'TP1', 'TP2', 'TP3', 'TP4', 'TP5', 'TP6', 'TP7','TP8','TP9') + + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP0' }).DrawingObject.Chart.ChartStyle = 294 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP1' }).DrawingObject.Chart.ChartStyle = 222 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP2' }).DrawingObject.Chart.ChartStyle = 294 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP3' }).DrawingObject.Chart.ChartStyle = 268 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP4' }).DrawingObject.Chart.ChartStyle = 294 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP5' }).DrawingObject.Chart.ChartStyle = 222 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP6' }).DrawingObject.Chart.ChartStyle = 294 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP7' }).DrawingObject.Chart.ChartStyle = 268 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP8' }).DrawingObject.Chart.ChartStyle = 294 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -eq 'ChartP9' }).DrawingObject.Chart.ChartStyle = 268 + Start-Sleep -Milliseconds 50 + ($WS.Shapes | Where-Object { $_.name -notin $NoChangeChart -and $_.name -like 'Chart*' }).DrawingObject.Chart.ChartStyle = 315 + Start-Sleep -Milliseconds 50 + + Foreach ($Changer in $ChangeChart) { + ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.interior.color = 2500134 + ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.color = 16777215 + ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.ColorIndex = -4142 + ($WS.Shapes | Where-Object { $_.name -eq $Changer }).DrawingObject.border.LineStyle = -4142 + Start-Sleep -Milliseconds 50 + } + + foreach ($Sheet in ($Ex.Worksheets | Where-Object {$_.Name -notin ('Overview', 'Policy', 'Advisor', 'Security Center', 'Subscriptions', 'Quota Usage', 'AdvisorScore', 'Outages', 'SupportTickets', 'Reservation Advisor')})) + { + $Sheet.tab.ColorIndex = 48 + Start-Sleep -Milliseconds 50 + } + + #$WS.Cells.Interior.Color = 0 + + $Draw = ($WS.Shapes | Where-Object {$_.name -eq 'ARI'}) + $Draw.Adjustments(1) = 0.07 + Start-Sleep -Milliseconds 50 + + $Ex.Save() + $Ex.Close() + $application.Quit() + Get-Process -Name "excel" -ErrorAction Ignore | Stop-Process + } + } +} \ No newline at end of file diff --git a/Extras/Module-template.tpl b/Modules/Extras/Module-template.tpl similarity index 100% rename from Extras/Module-template.tpl rename to Modules/Extras/Module-template.tpl diff --git a/Extras/Support.json b/Modules/Extras/Support.json similarity index 100% rename from Extras/Support.json rename to Modules/Extras/Support.json diff --git a/Modules/Inventory/ARIAPIInv.psm1 b/Modules/Inventory/ARIAPIInv.psm1 new file mode 100644 index 0000000..d27ff57 --- /dev/null +++ b/Modules/Inventory/ARIAPIInv.psm1 @@ -0,0 +1,154 @@ +function Get-ARIAPIResources { + Param($Subscriptions, $AzureEnvironment, $SkipPolicy, $Debug ) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting API Inventory') + + $Token = Get-AzAccessToken -AsSecureString -InformationAction SilentlyContinue -WarningAction SilentlyContinue + + $TokenData = $Token.Token | ConvertFrom-SecureString -AsPlainText + + $header = @{ + 'Authorization' = 'Bearer ' + $TokenData + } + + if ($AzureEnvironment -eq 'AzureCloud') { + $AzURL = 'management.azure.com' + } else { + $AzURL = 'management.usgovcloudapi.net' + } + $ResourceHealthHistoryDate = (Get-Date).AddMonths(-6) + $APIResults = @() + + foreach ($Subscription in $Subscriptions) + { + $ResourceHealth = "" + $SupTickets = "" + $Identities = "" + $ADVScore = "" + $ReservationRecon = "" + $PolicyAssign = "" + $PolicySetDef = "" + $PolicyDef = "" + + $SubName = $Subscription.Name + $Sub = $Subscription.id + + Write-Host 'Running API Inventory at: ' -NoNewline + Write-Host $SubName -ForegroundColor Cyan + + #ResourceHealth Events + $url = ('https://' + $AzURL + '/subscriptions/' + $Sub + '/providers/Microsoft.ResourceHealth/events?api-version=2022-10-01&queryStartTime=' + $ResourceHealthHistoryDate) + try { + $ResourceHealth = Invoke-RestMethod -Uri $url -Headers $header -Method GET + } + catch { + $ResourceHealth = "" + } + + Start-Sleep -Milliseconds 200 + + #Support Tickets + $url = ('https://' + $AzURL + '/subscriptions/' + $Sub + '/providers/Microsoft.Support/supportTickets?api-version=2020-04-01') + try { + $SupTickets = Invoke-RestMethod -Uri $url -Headers $header -Method GET + } + catch { + $SupTickets = "" + } + Start-Sleep -Milliseconds 200 + + #Managed Identities + $url = ('https://' + $AzURL + '/subscriptions/' + $Sub + '/providers/Microsoft.ManagedIdentity/userAssignedIdentities?api-version=2023-01-31') + try { + $Identities = Invoke-RestMethod -Uri $url -Headers $header -Method GET + } + catch { + $Identities = "" + } + Start-Sleep -Milliseconds 200 + + #Advisor Score + $url = ('https://' + $AzURL + '/subscriptions/' + $Sub + '/providers/Microsoft.Advisor/advisorScore?api-version=2023-01-01') + try { + $ADVScore = Invoke-RestMethod -Uri $url -Headers $header -Method GET + } + catch { + $ADVScore = "" + } + Start-Sleep -Milliseconds 200 + + #VM Reservation Recomentation + $url = ('https://' + $AzURL + '/subscriptions/' + $Sub + '/providers/Microsoft.Consumption/reservationRecommendations?api-version=2023-05-01') + try { + $ReservationRecon = Invoke-RestMethod -Uri $url -Headers $header -Method GET + } + catch { + $ReservationRecon = "" + } + Start-Sleep -Milliseconds 200 + + if (!$SkipPolicy.isPresent) + { + #Policies + try { + $url = ('https://'+ $AzURL +'/subscriptions/'+$sub+'/providers/Microsoft.PolicyInsights/policyStates/latest/summarize?api-version=2019-10-01') + $PolicyAssign = (Invoke-RestMethod -Uri $url -Headers $header -Method POST).value + Start-Sleep -Milliseconds 200 + $url = ('https://'+ $AzURL +'/subscriptions/'+$sub+'/providers/Microsoft.Authorization/policySetDefinitions?api-version=2023-04-01') + $PolicySetDef = (Invoke-RestMethod -Uri $url -Headers $header -Method GET).value + Start-Sleep -Milliseconds 200 + $url = ('https://'+ $AzURL +'/subscriptions/'+$sub+'/providers/Microsoft.Authorization/policyDefinitions?api-version=2023-04-01') + $PolicyDef = (Invoke-RestMethod -Uri $url -Headers $header -Method GET).value + } + catch { + $PolicyAssign = "" + $PolicySetDef = "" + $PolicyDef = "" + } + } + + Start-Sleep 1 + + $tmp = @{ + 'Subscription' = $Sub; + 'ResourceHealth' = $ResourceHealth.value; + 'SupportTickets' = $SupTickets.value; + 'ManagedIdentities' = $Identities.value; + 'AdvisorScore' = $ADVScore.value; + 'ReservationRecomen' = $ReservationRecon.value; + 'PolicyAssign' = $PolicyAssign; + 'PolicyDef' = $PolicyDef; + 'PolicySetDef' = $PolicySetDef + } + $APIResults += $tmp + + } + + <# + $Body = @{ + reportType = "OverallSummaryReport" + subscriptionList = @($Subscri) + carbonScopeList = @("Scope1") + dateRange = @{ + start = "2024-06-01" + end = "2024-06-30" + } + } + $url = 'https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2023-04-01-preview' + #$url = 'https://management.azure.com/providers/Microsoft.Carbon/queryCarbonEmissionDataAvailableDateRange?api-version=2023-04-01-preview' + + $Carbon = Invoke-RestMethod -Uri $url -Headers $header -Body ($Body | ConvertTo-Json) -Method POST -ContentType 'application/json' + + #> + + return $APIResults +} \ No newline at end of file diff --git a/Modules/Inventory/ARIAdvisoryInv.psm1 b/Modules/Inventory/ARIAdvisoryInv.psm1 new file mode 100644 index 0000000..12d2fc3 --- /dev/null +++ b/Modules/Inventory/ARIAdvisoryInv.psm1 @@ -0,0 +1,71 @@ +<# +.Synopsis +Advisory Module + +.DESCRIPTION +This script process and creates the Advisory sheet based on advisorresources. + +.Link +https://github.com/microsoft/ARI/Extras/ARIAdvisoryInv.psm1 + +.COMPONENT + This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ARIAdvisoryProcessing { + param($Advisories) + + $tmp = foreach ($1 in $Advisories) + { + $data = $1.PROPERTIES + $Savings = if([string]::IsNullOrEmpty($data.extendedProperties.annualSavingsAmount)){0}Else{$data.extendedProperties.annualSavingsAmount} + $SavingsCurrency = if([string]::IsNullOrEmpty($data.extendedProperties.savingsCurrency)){'USD'}Else{$data.extendedProperties.savingsCurrency} + $obj = @{ + 'ResourceGroup' = $1.RESOURCEGROUP; + 'Affected Resource Type' = $data.impactedField; + 'Name' = $data.impactedValue; + 'Category' = $data.category; + 'Impact' = $data.impact; + #'Score' = $data.extendedproperties.score; + 'Problem' = $data.shortDescription.problem; + 'Savings Currency' = $SavingsCurrency; + 'Annual Savings' = "=$Savings"; + 'Savings Region' = $data.extendedProperties.location; + 'Current SKU' = $data.extendedProperties.currentSku; + 'Target SKU' = $data.extendedProperties.targetSku + } + $obj + } + $tmp +} + +function Build-ARIAdvisoryReport { + param($File, $Adv, $TableStyle) + $condtxtadv = @() + $condtxtadv += New-ConditionalText High -Range E:E + $condtxtadv += New-ConditionalText Security -Range D:D -BackgroundColor Wheat + + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '#,##0.00' -Range H:H + + $Adv | + ForEach-Object { [PSCustomObject]$_ } | + Select-Object 'ResourceGroup', + 'Affected Resource Type', + 'Name', + 'Category', + 'Impact', + #'Score', + 'Problem', + 'Savings Currency', + 'Annual Savings', + 'Savings Region', + 'Current SKU', + 'Target SKU' | + Export-Excel -Path $File -WorksheetName 'Advisor' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzureAdvisory' -MoveToStart -TableStyle $tableStyle -Style $Style -ConditionalText $condtxtadv +} + diff --git a/Modules/Inventory/ARIMGMTGroups.psm1 b/Modules/Inventory/ARIMGMTGroups.psm1 new file mode 100644 index 0000000..a4f6502 --- /dev/null +++ b/Modules/Inventory/ARIMGMTGroups.psm1 @@ -0,0 +1,57 @@ +function Get-ARIManagementGroups { + Param ($ManagementGroup, $Debug) + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Management group name supplied: ' + $ManagmentGroupName) + $group = az account management-group entities list --query "[?name =='$ManagementGroup']" | ConvertFrom-Json + if ($group.Count -lt 1) + { + Write-Host "ERROR:" -NoNewline -ForegroundColor Red + Write-Host "Management Group $ManagementGroup not found!" + Write-Host "" + Write-Host "Please check the Management Group name and try again." + Write-Host "" + Exit + } + else + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Management groups found: ' + $group.count) + foreach ($item in $group) + { + $Subscriptions = @() + $GraphQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$($item.name)' | summarize count()" + $EnvSize = az graph query -q $GraphQuery --output json --only-show-errors | ConvertFrom-Json + $EnvSizeNum = $EnvSize.data.'count_' + + if ($EnvSizeNum -ge 1) { + $Loop = $EnvSizeNum / 1000 + $Loop = [math]::ceiling($Loop) + $Looper = 0 + $Limit = 0 + + while ($Looper -lt $Loop) { + $GraphQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$($item.name)' | project id = subscriptionId" + $Resource = (az graph query -q $GraphQuery --skip $Limit --first 1000 --output json --only-show-errors).tolower() | ConvertFrom-Json + + foreach ($Sub in $Resource.data) { + $Subscriptions += az account show --subscription $Sub.id --output json --only-show-errors | ConvertFrom-Json + } + + Start-Sleep 2 + $Looper ++ + Write-Progress -Id 1 -activity "Running Subscription Inventory Job" -Status "$Looper / $Loop of Subscription Jobs" -PercentComplete (($Looper / $Loop) * 100) + $Limit = $Limit + 1000 + } + } + Write-Progress -Id 1 -activity "Running Subscription Inventory Job" -Status "$Looper / $Loop of Subscription Jobs" -Completed + } + } + return $Subscriptions +} \ No newline at end of file diff --git a/Modules/Inventory/ARIPolicyInv.psm1 b/Modules/Inventory/ARIPolicyInv.psm1 new file mode 100644 index 0000000..4c4622a --- /dev/null +++ b/Modules/Inventory/ARIPolicyInv.psm1 @@ -0,0 +1,104 @@ +<# +.Synopsis +Policy Module + +.DESCRIPTION +This script process and creates the Policy sheet based on advisorresources. + +.Link +https://github.com/microsoft/ARI/Extras/ARIPolicyInv.psm1 + +.COMPONENT + This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.2 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ARIPolicyProcessing { + param($Subscriptions, $PolicySetDef, $PolicyAssign, $PolicyDef) + + $poltmp = $PolicyDef | Select-Object -Property id,properties -Unique + + $tmp = foreach ($1 in $PolicyAssign.policyAssignments) + { + if(![string]::IsNullOrEmpty($1.policySetDefinitionId)) + { + $Initiative = (($PolicySetDef | Where-Object {$_.id -eq $1.policySetDefinitionId}).properties.displayName | Select-Object -Unique ) + $InitNonCompRes = $1.results.nonCompliantResources + $InitNonCompPol = $1.results.nonCompliantPolicies + } + else + { + $Initiative = '' + $InitNonCompRes = '' + $InitNonCompPol = '' + } + + foreach ($2 in $1.policyDefinitions) + { + $Pol = (($poltmp | Where-Object {$_.id -eq $2.policyDefinitionId}).properties) + if(![string]::IsNullOrEmpty($Pol)) + { + $PolMode + $PolResUnkown = ($2.results.resourceDetails | Where-Object {$_.complianceState -eq 'unknown'} | Select-Object -ExpandProperty Count) + $PolResUnkown = if (![string]::IsNullOrEmpty($PolResUnkown)){$PolResUnkown}else{'0'} + $PolResCompl = ($2.results.resourceDetails | Where-Object {$_.complianceState -eq 'compliant'} | Select-Object -ExpandProperty Count) + $PolResCompl = if (![string]::IsNullOrEmpty($PolResCompl)){$PolResCompl}else{'0'} + $PolResNonCompl = ($2.results.resourceDetails | Where-Object {$_.complianceState -eq 'noncompliant'} | Select-Object -ExpandProperty Count) + $PolResNonCompl = if (![string]::IsNullOrEmpty($PolResNonCompl)){$PolResNonCompl}else{'0'} + $PolResExemp = ($2.results.resourceDetails | Where-Object {$_.complianceState -eq 'exempt'} | Select-Object -ExpandProperty Count) + $PolResExemp = if (![string]::IsNullOrEmpty($PolResExemp)){$PolResExemp}else{'0'} + + $obj = @{ + 'Initiative' = $Initiative; + 'Initiative Non Compliance Resources' = $InitNonCompRes; + 'Initiative Non Compliance Policies' = $InitNonCompPol; + 'Policy' = $Pol.displayName; + 'Policy Type' = $Pol.policyType; + 'Effect' = $2.effect; + 'Compliance Resources' = $PolResCompl; + 'Non Compliance Resources' = $PolResNonCompl; + 'Unknown Resources' = $PolResUnkown; + 'Exempt Resources' = $PolResExemp + 'Policy Mode' = $Pol.mode; + 'Policy Version' = $Pol.version; + 'Policy Deprecated' = $Pol.metadata.deprecated; + 'Policy Category' = $Pol.metadata.category + } + $obj + } + } + } + $tmp +} + +function Build-ARIPolicyReport { + param($File ,$Pol, $TableStyle) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 + + $condtxt = @() + $condtxt += New-ConditionalText -Range B2:B500 -ConditionalType GreaterThan 0 + $condtxt += New-ConditionalText -Range C2:C500 -ConditionalType GreaterThan 0 + $condtxt += New-ConditionalText -Range H2:H500 -ConditionalType GreaterThan 0 + + $Pol | + ForEach-Object { [PSCustomObject]$_ } | + Select-Object 'Initiative', + 'Initiative Non Compliance Resources', + 'Initiative Non Compliance Policies', + 'Policy', + 'Policy Type', + 'Effect', + 'Compliance Resources', + 'Non Compliance Resources', + 'Unknown Resources', + 'Exempt Resources', + 'Policy Mode', + 'Policy Version', + 'Policy Deprecated', + 'Policy Category' | Export-Excel -Path $File -WorksheetName 'Policy' -AutoSize -MaxAutoSizeRows 100 -TableName 'AzurePolicy' -MoveToStart -ConditionalText $condtxt -TableStyle $tableStyle -Style $Style +} + diff --git a/Modules/Inventory/ARIQuotaInv.psm1 b/Modules/Inventory/ARIQuotaInv.psm1 new file mode 100644 index 0000000..84de630 --- /dev/null +++ b/Modules/Inventory/ARIQuotaInv.psm1 @@ -0,0 +1,103 @@ +<# +.Synopsis +vCPU Quotas Module + +.DESCRIPTION +This script process and creates the Quota sheet based on Quotas Used. + +.Link +https://github.com/microsoft/ARI/Modules/Inventory/ARIQuotaInv.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> + +function Start-ARIQuotaJob { + Param($Resources,$Subscriptions) + + Start-Job -Name 'Quota Usage' -ScriptBlock { + + $Quotas = @() + $Quotas = Foreach($Sub in $($args[1])) + { + $Locs = ($($args[0]) | Where-Object {$_.subscriptionId -eq $Sub.id -and $_.Type -in 'microsoft.compute/virtualmachines','microsoft.compute/virtualmachinescalesets'} | Group-Object -Property Location).name + if (![string]::IsNullOrEmpty($Locs)) + { + Foreach($Loc in $Locs) + { + if($Loc.Loc.count -eq 1) + { + Set-AzContext -Subscription $Sub.Id + $Quota = get-azvmusage -location $Loc.Loc + $Quota = $Quota | Where-Object {$_.CurrentValue -ge 1} + $Q = @{ + 'Location' = $Loc.Loc; + 'Subscription' = $Sub.name; + 'Data' = $Quota + } + $Q + } + else { + Set-AzContext -Subscription $Sub.Id + foreach($Loc1 in $Loc.loc) + { + $Quota = get-azvmusage -location $Loc1 + $Quota = $Quota | Where-Object {$_.CurrentValue -ge 1} + $Q = @{ + 'Location' = $Loc1; + 'Subscription' = $Sub.name; + 'Data' = $Quota + } + $Q + } + } + } + } + } + $Quotas + } -ArgumentList $Resources, $Subscriptions +} + +function Build-ARIQuotaReport { + param($File, $AzQuota, $TableStyle) + + $tmp = @() + $Total = ($AzQuota.Data).count + foreach($Quota in $AzQuota) + { + foreach($Data in $Quota.Data) + { + $FreevCPU = '' + if($Data.Name.LocalizedValue -like '*vCPUs'){$FreevCPU = $Data.limit - $Data.CurrentValue} + $obj = @{ + 'Subscription' = $Quota.Subscription; + 'Region' = $Quota.Location; + 'Current Usage' = $Data.currentValue; + 'Limit' = $Data.limit; + 'Quota' = $Data.Name.LocalizedValue; + 'vCPUs Available' = $FreevCPU; + 'Total' = $Total + } + $tmp += $obj + } + } + + $ExcelVar = $tmp + + $TableName = ('QuotaTable_'+$ExcelVar[0].Total) + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | + Select-Object -Unique 'Subscription', + 'Region', + 'Current Usage', + 'Limit', + 'Quota', + 'vCPUs Available' | + Export-Excel -Path $File -WorksheetName 'Quota Usage' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -Numberformat '0' -MoveToEnd +} \ No newline at end of file diff --git a/Modules/Inventory/ARIResourceDataPull.psm1 b/Modules/Inventory/ARIResourceDataPull.psm1 new file mode 100644 index 0000000..67e02df --- /dev/null +++ b/Modules/Inventory/ARIResourceDataPull.psm1 @@ -0,0 +1,161 @@ +<# +.Synopsis +Main module for Resource Extraction + +.DESCRIPTION +This module is the main module for the Azure Resource Graphs that will be run against the environment. + +.Link +https://github.com/microsoft/ARI/Core/Start-AzureResourceExtraction.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +Function Start-AzureResourceDataPull { + Param($ManagementGroup, $Subscriptions, $SubscriptionID, $ResourceGroup, $SecurityCenter, $SkipAdvisory, $IncludeTags, $QuotaUsage, $TagKey, $TagValue, $Debug) + + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Extractor function') + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Powershell Edition: ' + ([string]$psversiontable.psEdition)) + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Powershell Version: ' + ([string]$psversiontable.psVersion)) + + #Field for tags + if ($IncludeTags.IsPresent) { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Tags will be included") + $GraphQueryTags = ",tags " + } else { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+"Tags will be ignored") + $GraphQueryTags = "" + } + + <###################################################### Subscriptions ######################################################################> + + Write-Progress -activity 'Azure Inventory' -Status "1% Complete." -PercentComplete 2 -CurrentOperation 'Discovering Subscriptions..' + + if (![string]::IsNullOrEmpty($ManagementGroup)) + { + $Subscriptions = Get-ARIManagementGroups -ManagementGroup $ManagementGroup -Debug $Debug + } + + $SubCount = [string]$Subscriptions.id.count + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Number of Subscriptions Found: ' + $SubCount) + Write-Progress -activity 'Azure Inventory' -Status "3% Complete." -PercentComplete 3 -CurrentOperation "$SubCount Subscriptions found.." + + <######################################################## INVENTORY LOOPs #######################################################################> + +$ExtractionRuntime = Measure-Command -Expression { + + Write-Progress -Id 1 -activity "Running Inventory Jobs" -Status "1% Complete." -Completed + + Write-Progress -activity 'Azure Inventory' -Status "4% Complete." -PercentComplete 4 -CurrentOperation "Starting Resources extraction jobs.." + + if(![string]::IsNullOrEmpty($ResourceGroup) -and [string]::IsNullOrEmpty($SubscriptionID)) + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Resource Group Name present, but missing Subscription ID.') + Write-Output '' + Write-Output 'If Using the -ResourceGroup Parameter, the Subscription ID must be informed' + Write-Output '' + Exit + } + else + { + $Subscri = $Subscriptions.id + $RGQueryExtension = '' + $TagQueryExtension = '' + $MGQueryExtension = '' + if(![string]::IsNullOrEmpty($ResourceGroup) -and ![string]::IsNullOrEmpty($SubscriptionID)) + { + $RGQueryExtension = "| where resourceGroup in~ ('$([String]::Join("','",$ResourceGroup))')" + } + elseif(![string]::IsNullOrEmpty($TagKey) -and ![string]::IsNullOrEmpty($TagValue)) + { + $TagQueryExtension = "| where isnotempty(tags) | mvexpand tags | extend tagKey = tostring(bag_keys(tags)[0]) | extend tagValue = tostring(tags[tagKey]) | where tagKey =~ '$TagKey' and tagValue =~ '$TagValue'" + } + elseif (![string]::IsNullOrEmpty($ManagementGroup)) + { + $MGQueryExtension = "| join kind=inner (resourcecontainers | where type == 'microsoft.resources/subscriptions' | mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$ManagementGroup' | project subscriptionId, managanagementGroup = managementGroupParent.name) on subscriptionId" + $MGContainerExtension = "| mv-expand managementGroupParent = properties.managementGroupAncestorsChain | where managementGroupParent.name =~ '$ManagementGroup'" + } + } + + $GraphQuery = "resources $RGQueryExtension $TagQueryExtension $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Resources') + $Resources += Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Resources' + + $GraphQuery = "networkresources $RGQueryExtension $TagQueryExtension $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Network Resources') + $Resources += Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Network Resources' + + $GraphQuery = "recoveryservicesresources $RGQueryExtension $TagQueryExtension | where type =~ 'microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems' or type =~ 'microsoft.recoveryservices/vaults/backuppolicies' $MGQueryExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Backup Resources') + $Resources += Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Backup Items' + + $GraphQuery = "desktopvirtualizationresources $RGQueryExtension $MGQueryExtension| project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for AVD Resources') + $Resources += Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Virtual Desktop' + + $GraphQuery = "resourcecontainers $RGQueryExtension $TagQueryExtension $MGContainerExtension | project id,name,type,tenantId,kind,location,resourceGroup,subscriptionId,managedBy,sku,plan,properties,identity,zones,extendedLocation$($GraphQueryTags) | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Resource Containers') + $ResourceContainers = Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Subscriptions and Resource Groups' + + if (!($SkipAdvisory.IsPresent)) + { + $GraphQuery = "advisorresources $RGQueryExtension $MGQueryExtension | where properties.impact in~ ('Medium','High') | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Advisories') + $Advisories = Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Advisories' + } + if ($SecurityCenter.IsPresent) + { + $GraphQuery = "securityresources $RGQueryExtension | where type =~ 'microsoft.security/assessments' and properties['status']['code'] == 'Unhealthy' $MGQueryExtension | order by id asc" + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Invoking Inventory Loop for Security Resources') + $Security = Invoke-ResourceInventoryLoop -GraphQuery $GraphQuery -FSubscri $Subscri -LoopName 'Security Center' + } + + Write-Progress -activity 'Azure Inventory' -Status "4% Complete." -PercentComplete 4 -CurrentOperation "Starting API Extraction.." + + + <######################################################### QUOTA JOB ######################################################################> + + if($QuotaUsage.isPresent) + { + Start-ARIQuotaJob -Resources $Resources -Subscriptions $Subscriptions + } + + Write-Progress -activity 'Azure Inventory' -PercentComplete 20 + + Write-Progress -Id 1 -activity "Running Inventory Jobs" -Status "100% Complete." -Completed + +} + $tmp = [pscustomobject]@{ + ExtractionRunTime = $ExtractionRuntime + Resources = $Resources + ResourceContainers = $ResourceContainers + Advisories = $Advisories + Security = $Security + } + return $tmp +} \ No newline at end of file diff --git a/Modules/Inventory/ARIResourceReport.psm1 b/Modules/Inventory/ARIResourceReport.psm1 new file mode 100644 index 0000000..9a34a7f --- /dev/null +++ b/Modules/Inventory/ARIResourceReport.psm1 @@ -0,0 +1,157 @@ +<# +.Synopsis +Main module for Excel Report Building + +.DESCRIPTION +This module is the main module for building the Excel Report. + +.Link +https://github.com/microsoft/ARI/Modules/Inventory/ARIResourceReport.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +Function Build-AzureResourceReport { + Param($Subscriptions, + $ExtractionRuntime, + $Resources, + $SecurityCenter, + $File, + $DDFile, + $SkipDiagram, + $RunLite, + $PlatOS, + $InTag, + $SkipAPIs, + $SkipPolicy, + $SkipAdvisory, + $Automation, + $Debug) + + if ($Debug.IsPresent) + { + $DebugPreference = 'Continue' + $ErrorActionPreference = 'Continue' + } + else + { + $ErrorActionPreference = "silentlycontinue" + } + + $ReportingRunTime = Measure-Command -Expression { + + #### Generic Conditional Text rules, Excel style specifications for the spreadsheets and tables: + $TableStyle = "Light19" + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Excel Table Style used: ' + $TableStyle) + + Write-Progress -activity 'Azure Inventory' -Status "21% Complete." -PercentComplete 21 -CurrentOperation "Starting to process extraction data.." + + + <######################################################### IMPORT UNSUPPORTED VERSION LIST ######################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Importing List of Unsupported Versions.') + + $Unsupported = Get-ARIUnsupportedData -Debug $Debug + + $DataActive = ('Azure Resource Inventory Reporting (' + ($Resources.count) + ') Resources') + + <######################################################### RESOURCE GROUP JOB ######################################################################> + + if ($Automation.IsPresent) + { + $SmaResources = Start-ARIAutResourceJob -Resources $Resources -Subscriptions $Subscriptions -InTag $InTag -Unsupported $Unsupported + } + else + { + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Resource Jobs.') + + $DebugEnvSize = Start-ARIResourceJobs -Resources $Resources -Subscriptions $Subscriptions -InTag $InTag -Unsupported $Unsupported -Debug $Debug + } + + <############################################################## RESOURCES LOOP CREATION #############################################################> + + if (!$Automation.IsPresent) + { + if($DebugEnvSize -in ('Large','Enormous')) + { + Clear-Variable Resources + [System.GC]::GetTotalMemory($true) | out-null + } + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Jobs Collector.') + Write-Progress -activity $DataActive -Status "Processing Inventory" -PercentComplete 0 + $c = 0 + + $JobNames = (Get-Job | Where-Object {$_.name -like 'ResourceJob_*'}).Name + + while (get-job -Name $JobNames | Where-Object { $_.State -eq 'Running' }) { + $jb = get-job -Name $JobNames + $c = (((($jb.count - ($jb | Where-Object { $_.State -eq 'Running' }).Count)) / $jb.Count) * 100) + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Jobs Still Running: '+[string]($jb | Where-Object { $_.State -eq 'Running' }).count) + $c = [math]::Round($c) + Write-Progress -Id 1 -activity "Processing Resource Jobs" -Status "$c% Complete." -PercentComplete $c + Start-Sleep -Seconds 5 + } + Write-Progress -Id 1 -activity "Processing Resource Jobs" -Status "100% Complete." -Completed + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Jobs Compleated.') + + $SmaResources = @() + + Foreach ($Job in $JobNames) + { + $TempJob = Receive-Job -Name $Job + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Job '+ $Job +' Returned: ' + ($TempJob.values | Where-Object {$_ -ne $null}).Count + ' Resource Types.') + $SmaResources += $TempJob + } + } + + <############################################################## REPORTING ###################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Resource Reporting.') + + Start-ARIResourceReporting -InTag $InTag -file $file -SmaResources $SmaResources -TableStyle $TableStyle -Unsupported $Unsupported -DebugEnvSize $DebugEnvSize -DataActive $DataActive -Debug $Debug + + <################################################################### EXTRA REPORTS ###################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Starting Default Data Reporting.') + + Start-ARIExtraReports -File $File -QuotaUsage $QuotaUsage -SecurityCenter $SecurityCenter -SkipPolicy $SkipPolicy -SkipAdvisory $SkipAdvisory -TableStyle $TableStyle -Debug $Debug + + <################################################################### CHARTS ###################################################################> + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Generating Overview sheet (Charts).') + + } + + Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "15% Complete." -PercentComplete 15 -CurrentOperation "Invoking Excel Chart's Module." + + Build-ARIExcelChart -File $File -TableStyle $TableStyle -PlatOS $PlatOS -Subscriptions $Subscriptions -ExtractionRunTime $ExtractionRuntime -ReportingRunTime $ReportingRunTime -RunLite $RunLite -Debug $Debug + + [System.GC]::GetTotalMemory($true) | out-null + + Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - '+'Finished Charts Phase.') + + Write-Progress -activity 'Azure Resource Inventory Reporting Charts' -Status "100% Complete." -Completed + + if(!$SkipDiagram.IsPresent) + { + Write-Progress -activity 'Diagrams' -Status "Completing Diagram" -PercentComplete 70 -CurrentOperation "Consolidating Diagram" + + while (get-job -Name 'DrawDiagram' | Where-Object { $_.State -eq 'Running' }) { + Write-Progress -Id 1 -activity 'Processing Diagrams' -Status "50% Complete." -PercentComplete 50 + Start-Sleep -Seconds 2 + } + Write-Progress -Id 1 -activity 'Processing Diagrams' -Status "100% Complete." -Completed + + Write-Progress -activity 'Diagrams' -Status "Closing Diagram File" -Completed + } + + Get-Job | Wait-Job | Remove-Job +} \ No newline at end of file diff --git a/Modules/Inventory/ARISecCenterInv.psm1 b/Modules/Inventory/ARISecCenterInv.psm1 new file mode 100644 index 0000000..988ff60 --- /dev/null +++ b/Modules/Inventory/ARISecCenterInv.psm1 @@ -0,0 +1,68 @@ +<# +.Synopsis +Security Center Module + +.DESCRIPTION +This script process and creates the Security Center sheet based on securityresources. + +.Link +https://github.com/microsoft/ARI/Extras/ARISecCenterInv.psm1 + +.COMPONENT + This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ARISecCenterProcessing { + param($Subscriptions,$Security) + $obj = '' + $tmp = @() + + foreach ($1 in $Security) { + $data = $1.PROPERTIES + + $sub1 = $Subscriptions | Where-Object { $_.id -eq $1.properties.resourceDetails.Id.Split("/")[2] } + + $obj = @{ + 'Subscription' = $sub1.Name; + 'Resource Group' = $1.RESOURCEGROUP; + 'Resource Type' = $data.resourceDetails.Id.Split("/")[7]; + 'Resource Name' = $data.resourceDetails.Id.Split("/")[8]; + 'Categories' = [string]$data.metadata.categories; + 'Control' = $data.displayName; + 'Severity' = $data.metadata.severity; + 'Status' = $data.status.code; + 'Remediation' = $data.metadata.remediationDescription; + 'Remediation Effort' = $data.metadata.implementationEffort; + 'User Impact' = $data.metadata.userImpact; + 'Threats' = [string]$data.metadata.threats + } + $tmp += $obj + } + $tmp +} +function Build-ARISecCenterReport { + param($File, $Sec, $TableStyle) + $condtxtsec = $(New-ConditionalText High -Range G:G + New-ConditionalText High -Range L:L) + + $Sec | + ForEach-Object { [PSCustomObject]$_ } | + Select-Object 'Subscription', + 'Resource Group', + 'Resource Type', + 'Resource Name', + 'Categories', + 'Control', + 'Severity', + 'Status', + 'Remediation', + 'Remediation Effort', + 'User Impact', + 'Threats' | + Export-Excel -Path $File -WorksheetName 'SecurityCenter' -AutoSize -MaxAutoSizeRows 100 -MoveToStart -TableName 'SecurityCenter' -TableStyle $tableStyle -ConditionalText $condtxtsec +} \ No newline at end of file diff --git a/Modules/Inventory/ARISubInv.psm1 b/Modules/Inventory/ARISubInv.psm1 new file mode 100644 index 0000000..564947a --- /dev/null +++ b/Modules/Inventory/ARISubInv.psm1 @@ -0,0 +1,55 @@ +<# +.Synopsis +Module for Subscriptions + +.DESCRIPTION +This script process and creates the Subscriptions sheet based on resources and subscriptions the resources belong. + +.Link +https://github.com/azureinventory/ARI/Extras/ARISubInv.psm1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 15th Oct, 2024 +Authors: Claudio Merola + +#> +function Invoke-ARISubsProcessing { + param($Subscriptions,$Resources) + + $ResTable = $Resources | Where-Object { $_.type -ne 'microsoft.advisor/recommendations' } + $resTable2 = $ResTable | Select-Object id, Type, location, resourcegroup, subscriptionid + $ResTable3 = $ResTable2 | Group-Object -Property type, location, resourcegroup, subscriptionid + + $tmp = foreach ($ResourcesSUB in $ResTable3) { + $ResourceDetails = $ResourcesSUB.name -split "," + $SubName = $Subscriptions | Where-Object { $_.Id -eq ($ResourceDetails[3] -replace (" ", "")) } + + $obj = @{ + 'Subscription' = $SubName.Name; + 'Resource Group' = $ResourceDetails[2]; + 'Location' = $ResourceDetails[1]; + 'Resource Type' = $ResourceDetails[0]; + 'Resources' = $ResourcesSUB.Count + } + $obj + } + $tmp +} + +function Build-ARISubsReport { + param($File, $Sub, $TableStyle) + $TableName = ('SubsTable_'+($Sub.Subscription | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' + + $Sub | + ForEach-Object { [PSCustomObject]$_ } | + Select-Object 'Subscription', + 'Resource Group', + 'Location', + 'Resource Type', + 'Resources' | Export-Excel -Path $File -WorksheetName 'Subscriptions' -TableName $TableName -AutoSize -MaxAutoSizeRows 100 -TableStyle $tableStyle -Style $Style -Numberformat '0' -MoveToEnd +} diff --git a/Modules/Scripts/APIs/AdvisorScore.ps1 b/Modules/Scripts/APIs/AdvisorScore.ps1 new file mode 100644 index 0000000..b6c116c --- /dev/null +++ b/Modules/Scripts/APIs/AdvisorScore.ps1 @@ -0,0 +1,106 @@ +<# +.Synopsis +Inventory for Azure Advisor Score + +.DESCRIPTION +Excel Sheet Name: AdvisorScore + +.Link +https://github.com/microsoft/ARI/Modules/APIs/AdvisorScore.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 25th Aug, 2024 +Authors: Claudio Merola + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +If ($Task -eq 'Processing') { + + <######### Insert the resource extraction here ########> + + $AdvisorScore = $Resources | Where-Object { $_.TYPE -eq 'Microsoft.Advisor/advisorScore' } + + <######### Insert the resource Process here ########> + + if($AdvisorScore) + { + $tmp = @() + foreach ($1 in $AdvisorScore) { + if ($1.name -in ('Cost','OperationalExcellence','Performance','Security','HighAvailability','Advisor')) + { + $SubId = $1.id.split('/')[2] + $sub1 = $SUB | Where-Object { $_.id -eq $SubId } + $data = $1.PROPERTIES + $Series = $data.timeSeries | Where-Object {$_.aggregationLevel -eq 'Monthly'} + + $RefreshDate = $data.lastRefreshedScore.date + $RefreshDate = [datetime]$RefreshDate + $RefreshDate = $RefreshDate.ToString("yyyy-MM-dd") + + foreach ($Serie in $Series.scoreHistory) + { + $Date = $Serie.date + $Date = [datetime]$Date + $Date = $Date.ToString("yyyy-MM-dd") + + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.Name; + 'Category' = $1.Name; + 'Latest Score (%)' = $data.lastRefreshedScore.score; + 'Latest Refresh Score' = $RefreshDate; + 'Score Date' = $Date; + 'Score' = $Serie.score; + 'Impacted Resources' = $Serie.impactedResourceCount; + 'Consumption Units' = $Serie.consumptionUnits; + 'Potential Score Increase' = $Serie.potentialScoreIncrease + } + $tmp += $obj + } + } + } + $tmp + } +} + +<######## Resource Excel Reporting Begins Here ########> + +Else { + <######## $SmaResources.(RESOURCE FILE NAME) ##########> + + if ($SmaResources.AdvisorScore) { + + $TableName = ('AdvScoreTable_'+($SmaResources.AdvisorScore.id | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' + + $condtxt = @() + $condtxt += New-ConditionalText -Range C:C -ConditionalType LessThan 80 + $condtxt += New-ConditionalText -Range F:F -ConditionalType LessThan 70 + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('Category') + $Exc.Add('Latest Score (%)') + $Exc.Add('Latest Refresh Score') + $Exc.Add('Score Date') + $Exc.Add('Score') + $Exc.Add('Impacted Resources') + $Exc.Add('Consumption Units') + $Exc.Add('Potential Score Increase') + + $ExcelVar = $SmaResources.AdvisorScore + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'AdvisorScore' -AutoSize -TableName $TableName -MaxAutoSizeRows 100 -TableStyle $tableStyle -ConditionalText $condtxt -Numberformat '0' -Style $Style + + } +} \ No newline at end of file diff --git a/Modules/Scripts/APIs/ManagedIds.ps1 b/Modules/Scripts/APIs/ManagedIds.ps1 new file mode 100644 index 0000000..db0cbde --- /dev/null +++ b/Modules/Scripts/APIs/ManagedIds.ps1 @@ -0,0 +1,91 @@ +<# +.Synopsis +Inventory for Azure Managed Identities + +.DESCRIPTION +Excel Sheet Name: ManagedIdentities + +.Link +https://github.com/microsoft/ARI/Modules/APIs/ManagedIdentities.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 25th Aug, 2024 +Authors: Claudio Merola + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +If ($Task -eq 'Processing') { + + <######### Insert the resource extraction here ########> + + $ManagedIdentities = $Resources | Where-Object { $_.TYPE -eq 'Microsoft.ManagedIdentity/userAssignedIdentities' } + + <######### Insert the resource Process here ########> + + if($ManagedIdentities) + { + $tmp = @() + foreach ($1 in $ManagedIdentities) { + $ResUCount = 1 + $SubId = $1.id.split('/')[2] + $sub1 = $SUB | Where-Object { $_.id -eq $SubId } + $data = $1.PROPERTIES + $Tags = if(![string]::IsNullOrEmpty($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} + foreach ($Tag in $Tags) { + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.Name; + 'Name' = $1.Name; + 'Location' = $1.location; + 'Principal ID' = $data.principalId; + 'Client ID' = $data.clientId; + 'Resource U' = $ResUCount; + 'Tag Name' = [string]$Tag.Name; + 'Tag Value' = [string]$Tag.Value + } + $tmp += $obj + if ($ResUCount -eq 1) { $ResUCount = 0 } + } + } + $tmp + } +} + +<######## Resource Excel Reporting Begins Here ########> + +Else { + <######## $SmaResources.(RESOURCE FILE NAME) ##########> + + if ($SmaResources.ManagedIds) { + + $TableName = ('ManIdTable_'+($SmaResources.ManagedIds.id | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('Name') + $Exc.Add('Location') + $Exc.Add('Principal ID') + $Exc.Add('Client ID') + if($InTag) + { + $Exc.Add('Tag Name') + $Exc.Add('Tag Value') + } + + $ExcelVar = $SmaResources.ManagedIds + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'Managed Identity' -AutoSize -TableName $TableName -MaxAutoSizeRows 100 -TableStyle $tableStyle -Numberformat '0' -Style $Style + + } +} \ No newline at end of file diff --git a/Modules/Scripts/APIs/Outages.ps1 b/Modules/Scripts/APIs/Outages.ps1 new file mode 100644 index 0000000..53dd268 --- /dev/null +++ b/Modules/Scripts/APIs/Outages.ps1 @@ -0,0 +1,125 @@ +<# +.Synopsis +Inventory for Azure Outages + +.DESCRIPTION +Excel Sheet Name: Outages + +.Link +https://github.com/microsoft/ARI/Modules/APIs/Outages.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 25th Aug, 2024 +Authors: Claudio Merola + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +If ($Task -eq 'Processing') { + + <######### Insert the resource extraction here ########> + + $Outages = $Resources | Where-Object { $_.TYPE -eq 'Microsoft.ResourceHealth/events' -and $_.properties.description -like '*How can customers make incidents like this less impactful?*' } + + <######### Insert the resource Process here ########> + + if($Outages) + { + $tmp = @() + foreach ($1 in $Outages) { + $ImpactedSubs = $1.properties.impact.impactedRegions.impactedSubscriptions | Select-Object -Unique + + $Data = $1.properties + + foreach ($Sub0 in $ImpactedSubs) + { + $sub1 = $SUB | Where-Object { $_.id -eq $Sub0 } + + $StartTime = $Data.impactStartTime + $StartTime = [datetime]$StartTime + $StartTime = $StartTime.ToString("yyyy-MM-dd HH:mm") + + $Mitigation = $Data.impactMitigationTime + $Mitigation = [datetime]$Mitigation + $Mitigation = $Mitigation.ToString("yyyy-MM-dd HH:mm") + + $ImpactedService = if ($1.properties.impact.impactedService.count -gt 1) { $1.properties.impact.impactedService | ForEach-Object { $_ + ' ,' } }else { $1.properties.impact.impactedService} + $ImpactedService = [string]$ImpactedService + $ImpactedService = if ($ImpactedService -like '* ,*') { $ImpactedService -replace ".$" }else { $ImpactedService } + + $HTML = New-Object -Com 'HTMLFile' + $HTML.write([ref]$1.properties.description) + $OutageDescription = $Html.body.innerText + $SplitDescription = $OutageDescription.split('How can we make our incident communications more useful?').split('How can customers make incidents like this less impactful?').split('How are we making incidents like this less likely or less impactful?').split('How did we respond?').split('What went wrong and why?').split('What happened?') + + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.name; + 'Outage ID' = $1.name; + 'Event Type' = $Data.eventType; + 'Status' = $Data.status; + 'Event Level' = $Data.eventlevel; + 'Title' = $Data.title; + 'Impact Start Time' = $StartTime; + 'Impact Mitigation Time' = $Mitigation; + 'Impacted Services' = $ImpactedService; + 'What happened' = ($SplitDescription[1]).Split([Environment]::NewLine)[1]; + 'What went wrong and why' = ($SplitDescription[2]).Split([Environment]::NewLine)[1]; + 'How did we respond' = ($SplitDescription[3]).Split([Environment]::NewLine)[1]; + 'How are we making incidents like this less likely or less impactful' = ($SplitDescription[4]).Split([Environment]::NewLine)[1]; + 'How can customers make incidents like this less impactful' = ($SplitDescription[5]).Split([Environment]::NewLine)[1] + } + $tmp += $obj + } + } + $tmp + } +} + +<######## Resource Excel Reporting Begins Here ########> + +Else { + <######## $SmaResources.(RESOURCE FILE NAME) ##########> + + if ($SmaResources.Outages) { + + $TableName = ('OutagesTable_'+($SmaResources.Outages.id | Select-Object -Unique).count) + + $Style = @( + New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' -Range 'A:E' + New-ExcelStyle -HorizontalAlignment Left -NumberFormat '0' -WrapText -Width 55 -Range 'F:F' + New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' -Range 'G:I' + New-ExcelStyle -HorizontalAlignment Left -NumberFormat '0' -WrapText -Width 80 -Range 'J:N' + ) + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('Outage ID') + $Exc.Add('Event Type') + $Exc.Add('Status') + $Exc.Add('Event Level') + $Exc.Add('Title') + $Exc.Add('Impact Start Time') + $Exc.Add('Impact Mitigation Time') + $Exc.Add('Impacted Services') + $Exc.Add('What happened') + $Exc.Add('What went wrong and why') + $Exc.Add('How did we respond') + $Exc.Add('How are we making incidents like this less likely or less impactful') + $Exc.Add('How can customers make incidents like this less impactful') + + $ExcelVar = $SmaResources.Outages + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'Outages' -AutoSize -TableName $TableName -MaxAutoSizeRows 100 -TableStyle $tableStyle -Numberformat '0' -Style $Style + + } +} \ No newline at end of file diff --git a/Modules/Scripts/APIs/ReservationRecom.ps1 b/Modules/Scripts/APIs/ReservationRecom.ps1 new file mode 100644 index 0000000..48a9850 --- /dev/null +++ b/Modules/Scripts/APIs/ReservationRecom.ps1 @@ -0,0 +1,101 @@ +<# +.Synopsis +Inventory for Azure Reservation Recommendations + +.DESCRIPTION +Excel Sheet Name: Reservation Advisor + +.Link +https://github.com/microsoft/ARI/Modules/APIs/ReservationRecom.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 25th Aug, 2024 +Authors: Claudio Merola + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +If ($Task -eq 'Processing') { + + <######### Insert the resource extraction here ########> + + $Reserv = $Resources | Where-Object { $_.TYPE -eq 'Microsoft.Consumption/reservationRecommendations' } + + <######### Insert the resource Process here ########> + + if($Reserv) + { + $tmp = @() + foreach ($1 in $Reserv) { + $SubId = $1.id.split('/')[2] + $sub1 = $SUB | Where-Object { $_.id -eq $SubId } + $data = $1.PROPERTIES + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.Name; + 'Current SKU' = $1.SKU; + 'Location' = $1.location; + 'Resource Type' = $data.resourceType; + 'Instance Flexibility Group' = $data.instanceFlexibilityGroup; + 'Recommended Size' = $data.normalizedSize; + 'Recommended Number of Reservations'= $data.recommendedQuantity; + 'Instance Flexibility Ratio' = $data.instanceFlexibilityRatio; + 'Quantity Normalized' = $data.recommendedQuantityNormalized; + 'Cost With No Reserved Instance' = $data.costWithNoReservedInstances; + 'Cost With Reserved Instance' = $data.totalCostWithReservedInstances; + 'Net Savings' = $data.netSavings; + 'Reservation Term' = $data.term; + 'Scope' = $data.scope; + } + $tmp += $obj + } + $tmp + } +} + +<######## Resource Excel Reporting Begins Here ########> + +Else { + <######## $SmaResources.(RESOURCE FILE NAME) ##########> + + if ($SmaResources.ReservationRecom) { + + $TableName = ('ReservRecTable_'+($SmaResources.ReservationRecom.id | Select-Object -Unique).count) + + $Style = @() + $Style += New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' -Range A:I + $Style += New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '#,##0.00' -Range J:L + $Style += New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' -Range M:N + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('Current SKU') + $Exc.Add('Location') + $Exc.Add('Resource Type') + $Exc.Add('Instance Flexibility Group') + $Exc.Add('Recommended Size') + $Exc.Add('Recommended Number of Reservations') + $Exc.Add('Instance Flexibility Ratio') + $Exc.Add('Quantity Normalized') + $Exc.Add('Cost With No Reserved Instance') + $Exc.Add('Cost With Reserved Instance') + $Exc.Add('Net Savings') + $Exc.Add('Reservation Term') + $Exc.Add('Scope') + + $ExcelVar = $SmaResources.ReservationRecom + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'Reservation Advisor' -AutoSize -TableName $TableName -MaxAutoSizeRows 100 -TableStyle $tableStyle -Style $Style + + + } +} \ No newline at end of file diff --git a/Modules/Scripts/APIs/SupportTickets.ps1 b/Modules/Scripts/APIs/SupportTickets.ps1 new file mode 100644 index 0000000..3c98037 --- /dev/null +++ b/Modules/Scripts/APIs/SupportTickets.ps1 @@ -0,0 +1,113 @@ +<# +.Synopsis +Inventory for Azure Support Tickets + +.DESCRIPTION +Excel Sheet Name: SupportTickets + +.Link +https://github.com/microsoft/ARI/Modules/APIs/SupportTickets.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 4.0.1 +First Release Date: 25th Aug, 2024 +Authors: Claudio Merola + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +If ($Task -eq 'Processing') { + + <######### Insert the resource extraction here ########> + + $Tickets = $Resources | Where-Object { $_.TYPE -eq 'Microsoft.Support/supportTickets' } + + <######### Insert the resource Process here ########> + + if($Tickets) + { + $tmp = @() + foreach ($1 in $Tickets) { + $data = $1.PROPERTIES + + $timecreated = $data.createdDate + $timecreated = [datetime]$timecreated + $timecreated = $timecreated.ToString("yyyy-MM-dd HH:mm") + + $ProblemDate = $data.problemStartTime + $ProblemDate = [datetime]$ProblemDate + $ProblemDate = $ProblemDate.ToString("yyyy-MM-dd HH:mm") + + $ModDate = $data.modifiedDate + $ModDate = [datetime]$ModDate + $ModDate = $ModDate.ToString("yyyy-MM-dd HH:mm") + + $obj = @{ + 'ID' = $1.id; + 'Support Ticket' = $data.supportTicketId; + 'Title' = $data.title; + 'Support Plan' = $data.supportPlanType; + 'Service' = $data.serviceDisplayName; + 'Current Severity' = $data.severity; + 'Status' = $data.status; + 'Creation Date' = $timecreated; + '24/7 Response' = $data.require24X7Response; + 'Ticket SLA (minutes)' = $data.serviceLevelAgreement.slaMinutes; + 'Problem Start Date' = $ProblemDate; + 'Last Modified Date' = $ModDate; + 'Support Engineer' = $data.supportEngineer.emailAddress; + 'Ticket Contact Name' = ($data.contactDetails.firstName + ' ' + $data.contactDetails.lastName); + 'Ticket Contact Email' = $data.contactDetails.primaryEmailAddress; + 'Ticket Contact Country' = $data.contactDetails.country; + } + $tmp += $obj + } + $tmp + } +} + +<######## Resource Excel Reporting Begins Here ########> + +Else { + <######## $SmaResources.(RESOURCE FILE NAME) ##########> + + if ($SmaResources.SupportTickets) { + + $TableName = ('TicketsTable_'+($SmaResources.SupportTickets.id | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat '0' + + $cond = @() + $cond += New-ConditionalText Open -Range F:F + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Support Ticket') + $Exc.Add('Title') + $Exc.Add('Support Plan') + $Exc.Add('Service') + $Exc.Add('Current Severity') + $Exc.Add('Status') + $Exc.Add('Creation Date') + $Exc.Add('24/7 Response') + $Exc.Add('Ticket SLA (minutes)') + $Exc.Add('Support Engineer') + $Exc.Add('Problem Start Date') + $Exc.Add('Last Modified Date') + $Exc.Add('Ticket Contact Name') + $Exc.Add('Ticket Contact Email') + $Exc.Add('Ticket Contact Country') + + $ExcelVar = $SmaResources.SupportTickets + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'SupportTickets' -AutoSize -TableName $TableName -MaxAutoSizeRows 100 -TableStyle $tableStyle -ConditionalText $cond -Numberformat '0' -Style $Style + + + } +} \ No newline at end of file diff --git a/Modules/Analytics/AzureAI.ps1 b/Modules/Scripts/Analytics/AzureAI.ps1 similarity index 100% rename from Modules/Analytics/AzureAI.ps1 rename to Modules/Scripts/Analytics/AzureAI.ps1 diff --git a/Modules/Analytics/ComputerVision.ps1 b/Modules/Scripts/Analytics/ComputerVision.ps1 similarity index 100% rename from Modules/Analytics/ComputerVision.ps1 rename to Modules/Scripts/Analytics/ComputerVision.ps1 diff --git a/Modules/Analytics/ContentMod.ps1 b/Modules/Scripts/Analytics/ContentMod.ps1 similarity index 100% rename from Modules/Analytics/ContentMod.ps1 rename to Modules/Scripts/Analytics/ContentMod.ps1 diff --git a/Modules/Analytics/ContentSafety.ps1 b/Modules/Scripts/Analytics/ContentSafety.ps1 similarity index 100% rename from Modules/Analytics/ContentSafety.ps1 rename to Modules/Scripts/Analytics/ContentSafety.ps1 diff --git a/Modules/Analytics/CustomVision.ps1 b/Modules/Scripts/Analytics/CustomVision.ps1 similarity index 100% rename from Modules/Analytics/CustomVision.ps1 rename to Modules/Scripts/Analytics/CustomVision.ps1 diff --git a/Modules/Analytics/Databricks.ps1 b/Modules/Scripts/Analytics/Databricks.ps1 similarity index 100% rename from Modules/Analytics/Databricks.ps1 rename to Modules/Scripts/Analytics/Databricks.ps1 diff --git a/Modules/Analytics/DocIntelligence.ps1 b/Modules/Scripts/Analytics/DocIntelligence.ps1 similarity index 100% rename from Modules/Analytics/DocIntelligence.ps1 rename to Modules/Scripts/Analytics/DocIntelligence.ps1 diff --git a/Modules/Analytics/EvtHub.ps1 b/Modules/Scripts/Analytics/EvtHub.ps1 similarity index 100% rename from Modules/Analytics/EvtHub.ps1 rename to Modules/Scripts/Analytics/EvtHub.ps1 diff --git a/Modules/Analytics/FaceAPI.ps1 b/Modules/Scripts/Analytics/FaceAPI.ps1 similarity index 100% rename from Modules/Analytics/FaceAPI.ps1 rename to Modules/Scripts/Analytics/FaceAPI.ps1 diff --git a/Modules/Analytics/HealthInsights.ps1 b/Modules/Scripts/Analytics/HealthInsights.ps1 similarity index 100% rename from Modules/Analytics/HealthInsights.ps1 rename to Modules/Scripts/Analytics/HealthInsights.ps1 diff --git a/Modules/Analytics/ImmersiveReader.ps1 b/Modules/Scripts/Analytics/ImmersiveReader.ps1 similarity index 100% rename from Modules/Analytics/ImmersiveReader.ps1 rename to Modules/Scripts/Analytics/ImmersiveReader.ps1 diff --git a/Modules/Analytics/Language.ps1 b/Modules/Scripts/Analytics/Language.ps1 similarity index 100% rename from Modules/Analytics/Language.ps1 rename to Modules/Scripts/Analytics/Language.ps1 diff --git a/Modules/Analytics/MachineLearning.ps1 b/Modules/Scripts/Analytics/MachineLearning.ps1 similarity index 100% rename from Modules/Analytics/MachineLearning.ps1 rename to Modules/Scripts/Analytics/MachineLearning.ps1 diff --git a/Modules/Analytics/SearchServices.ps1 b/Modules/Scripts/Analytics/SearchServices.ps1 similarity index 100% rename from Modules/Analytics/SearchServices.ps1 rename to Modules/Scripts/Analytics/SearchServices.ps1 diff --git a/Modules/Analytics/SpeechService.ps1 b/Modules/Scripts/Analytics/SpeechService.ps1 similarity index 100% rename from Modules/Analytics/SpeechService.ps1 rename to Modules/Scripts/Analytics/SpeechService.ps1 diff --git a/Modules/Analytics/Streamanalytics.ps1 b/Modules/Scripts/Analytics/Streamanalytics.ps1 similarity index 100% rename from Modules/Analytics/Streamanalytics.ps1 rename to Modules/Scripts/Analytics/Streamanalytics.ps1 diff --git a/Modules/Analytics/Synapse.ps1 b/Modules/Scripts/Analytics/Synapse.ps1 similarity index 100% rename from Modules/Analytics/Synapse.ps1 rename to Modules/Scripts/Analytics/Synapse.ps1 diff --git a/Modules/Analytics/Translator.ps1 b/Modules/Scripts/Analytics/Translator.ps1 similarity index 100% rename from Modules/Analytics/Translator.ps1 rename to Modules/Scripts/Analytics/Translator.ps1 diff --git a/Modules/Analytics/WrkSpace.ps1 b/Modules/Scripts/Analytics/WrkSpace.ps1 similarity index 100% rename from Modules/Analytics/WrkSpace.ps1 rename to Modules/Scripts/Analytics/WrkSpace.ps1 diff --git a/Modules/Compute/APPSERVICEPLAN.ps1 b/Modules/Scripts/Compute/APPSERVICEPLAN.ps1 similarity index 100% rename from Modules/Compute/APPSERVICEPLAN.ps1 rename to Modules/Scripts/Compute/APPSERVICEPLAN.ps1 diff --git a/Modules/Compute/APPSERVICES.ps1 b/Modules/Scripts/Compute/APPSERVICES.ps1 similarity index 100% rename from Modules/Compute/APPSERVICES.ps1 rename to Modules/Scripts/Compute/APPSERVICES.ps1 diff --git a/Modules/Compute/ARCServers.ps1 b/Modules/Scripts/Compute/ARCServers.ps1 similarity index 93% rename from Modules/Compute/ARCServers.ps1 rename to Modules/Scripts/Compute/ARCServers.ps1 index d7f90ac..ddaadef 100644 --- a/Modules/Compute/ARCServers.ps1 +++ b/Modules/Scripts/Compute/ARCServers.ps1 @@ -13,7 +13,7 @@ https://github.com/microsoft/ARI/Modules/Compute/ARCServers.ps1 This powershell Module is part of Azure Resource Inventory (ARI) .NOTES -Version: 3.0.1 +Version: 4.0.1 First Release Date: 19th November, 2020 Authors: Claudio Merola and Renato Gregio @@ -64,6 +64,14 @@ If ($Task -eq 'Processing') $Subnet = $data.networkprofile.networkinterfaces.ipaddresses.subnet.addressprefix } + $LastStatus = $data.laststatuschange + $LastStatus = [datetime]$LastStatus + $LastStatus = $LastStatus.ToString("yyyy-MM-dd HH:mm") + + $InstallDate = $data.osinstalldate + $InstallDate = [datetime]$InstallDate + $InstallDate = $InstallDate.ToString("yyyy-MM-dd HH:mm") + foreach ($Tag in $Tags) { $obj = @{ 'ID' = $1.id; @@ -87,12 +95,12 @@ If ($Task -eq 'Processing') 'MS SQL Server' = $data.mssqldiscovered; 'Agent Version' = $data.agentversion; 'Status' = $data.status; - 'Last Status Change' = [string](get-date($data.laststatuschange)); + 'Last Status Change' = $LastStatus; 'IP Address' = $IP; 'Subnet' = $Subnet; 'OS Name' = $data.osName; 'OS Version' = $data.osVersion; - 'OS Install Date' = [string](get-date($data.osinstalldate)); + 'OS Install Date' = $InstallDate; 'Operating System' = $data.osSku; 'License Status' = $data.licenseprofile.licensestatus; 'License Channel' = $data.licenseprofile.licensechannel; @@ -162,8 +170,5 @@ Else ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | Export-Excel -Path $File -WorksheetName 'ARC Servers' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -Style $Style - <######## Insert Column comments and documentations here following this model #########> - - Close-ExcelPackage $excel } } \ No newline at end of file diff --git a/Modules/Compute/ARO.ps1 b/Modules/Scripts/Compute/ARO.ps1 similarity index 100% rename from Modules/Compute/ARO.ps1 rename to Modules/Scripts/Compute/ARO.ps1 diff --git a/Modules/Compute/AVD.ps1 b/Modules/Scripts/Compute/AVD.ps1 similarity index 100% rename from Modules/Compute/AVD.ps1 rename to Modules/Scripts/Compute/AVD.ps1 diff --git a/Modules/Compute/CloudServices.ps1 b/Modules/Scripts/Compute/CloudServices.ps1 similarity index 99% rename from Modules/Compute/CloudServices.ps1 rename to Modules/Scripts/Compute/CloudServices.ps1 index 07af095..033b24f 100644 --- a/Modules/Compute/CloudServices.ps1 +++ b/Modules/Scripts/Compute/CloudServices.ps1 @@ -60,7 +60,7 @@ If ($Task -eq 'Processing') { } $tmp += $obj if ($ResUCount -eq 1) { $ResUCount = 0 } - } + } } $tmp } diff --git a/Modules/Compute/VM.ps1 b/Modules/Scripts/Compute/VM.ps1 similarity index 99% rename from Modules/Compute/VM.ps1 rename to Modules/Scripts/Compute/VM.ps1 index e1b5e54..d120540 100644 --- a/Modules/Compute/VM.ps1 +++ b/Modules/Scripts/Compute/VM.ps1 @@ -1,4 +1,4 @@ -<# +<# .Synopsis Inventory for Azure Virtual Machine @@ -34,7 +34,7 @@ If ($Task -eq 'Processing') $vmsizemap = @{} foreach($location in ($vm | Select-Object -ExpandProperty location -Unique)) { - foreach ($vmsize in ( az vm list-sizes -l $location | ConvertFrom-Json)) + foreach ($vmsize in ( Get-AzVMSize -Location $location )) { $vmsizemap[$vmsize.name] = @{ CPU = $vmSize.numberOfCores diff --git a/Modules/Compute/VMWare.ps1 b/Modules/Scripts/Compute/VMWare.ps1 similarity index 100% rename from Modules/Compute/VMWare.ps1 rename to Modules/Scripts/Compute/VMWare.ps1 diff --git a/Modules/Containers/AKS.ps1 b/Modules/Scripts/Containers/AKS.ps1 similarity index 99% rename from Modules/Containers/AKS.ps1 rename to Modules/Scripts/Containers/AKS.ps1 index c0fa60e..c6fc153 100644 --- a/Modules/Containers/AKS.ps1 +++ b/Modules/Scripts/Containers/AKS.ps1 @@ -139,6 +139,7 @@ Else $condtxt = @() #AKS + $condtxt += New-ConditionalText 1.28 -Range F:F $condtxt += New-ConditionalText 1.27 -Range F:F $condtxt += New-ConditionalText 1.26 -Range F:F $condtxt += New-ConditionalText 1.25 -Range F:F @@ -147,6 +148,7 @@ Else $condtxt += New-ConditionalText 1.22 -Range F:F $condtxt += New-ConditionalText 1.21 -Range F:F #Orchestrator + $condtxt += New-ConditionalText 1.28 -Range AC:AC $condtxt += New-ConditionalText 1.27 -Range AC:AC $condtxt += New-ConditionalText 1.26 -Range AC:AC $condtxt += New-ConditionalText 1.25 -Range AC:AC diff --git a/Modules/Containers/CONTAINER.ps1 b/Modules/Scripts/Containers/CONTAINER.ps1 similarity index 100% rename from Modules/Containers/CONTAINER.ps1 rename to Modules/Scripts/Containers/CONTAINER.ps1 diff --git a/Modules/Containers/REGISTRIES.ps1 b/Modules/Scripts/Containers/REGISTRIES.ps1 similarity index 100% rename from Modules/Containers/REGISTRIES.ps1 rename to Modules/Scripts/Containers/REGISTRIES.ps1 diff --git a/Modules/Containers/VMSS.ps1 b/Modules/Scripts/Containers/VMSS.ps1 similarity index 100% rename from Modules/Containers/VMSS.ps1 rename to Modules/Scripts/Containers/VMSS.ps1 diff --git a/Modules/Data/CosmosDB.ps1 b/Modules/Scripts/Data/CosmosDB.ps1 similarity index 100% rename from Modules/Data/CosmosDB.ps1 rename to Modules/Scripts/Data/CosmosDB.ps1 diff --git a/Modules/Data/MariaDB.ps1 b/Modules/Scripts/Data/MariaDB.ps1 similarity index 100% rename from Modules/Data/MariaDB.ps1 rename to Modules/Scripts/Data/MariaDB.ps1 diff --git a/Modules/Data/MySQL.ps1 b/Modules/Scripts/Data/MySQL.ps1 similarity index 100% rename from Modules/Data/MySQL.ps1 rename to Modules/Scripts/Data/MySQL.ps1 diff --git a/Modules/Data/MySQLflexible.ps1 b/Modules/Scripts/Data/MySQLflexible.ps1 similarity index 100% rename from Modules/Data/MySQLflexible.ps1 rename to Modules/Scripts/Data/MySQLflexible.ps1 diff --git a/Modules/Data/POSTGRE.ps1 b/Modules/Scripts/Data/POSTGRE.ps1 similarity index 100% rename from Modules/Data/POSTGRE.ps1 rename to Modules/Scripts/Data/POSTGRE.ps1 diff --git a/Modules/Data/POSTGREFlexible.ps1 b/Modules/Scripts/Data/POSTGREFlexible.ps1 similarity index 100% rename from Modules/Data/POSTGREFlexible.ps1 rename to Modules/Scripts/Data/POSTGREFlexible.ps1 diff --git a/Modules/Data/Purview.ps1 b/Modules/Scripts/Data/Purview.ps1 similarity index 100% rename from Modules/Data/Purview.ps1 rename to Modules/Scripts/Data/Purview.ps1 diff --git a/Modules/Data/RedisCache.ps1 b/Modules/Scripts/Data/RedisCache.ps1 similarity index 100% rename from Modules/Data/RedisCache.ps1 rename to Modules/Scripts/Data/RedisCache.ps1 diff --git a/Modules/Data/SQLDB.ps1 b/Modules/Scripts/Data/SQLDB.ps1 similarity index 100% rename from Modules/Data/SQLDB.ps1 rename to Modules/Scripts/Data/SQLDB.ps1 diff --git a/Modules/Data/SQLMI.ps1 b/Modules/Scripts/Data/SQLMI.ps1 similarity index 97% rename from Modules/Data/SQLMI.ps1 rename to Modules/Scripts/Data/SQLMI.ps1 index 7c1c001..627e0ff 100644 --- a/Modules/Data/SQLMI.ps1 +++ b/Modules/Scripts/Data/SQLMI.ps1 @@ -1,117 +1,117 @@ -<# -.Synopsis -Inventory for Azure SQL Server - -.DESCRIPTION -This script consolidates information for all microsoft.sql/servers resource provider in $Resources variable. -Excel Sheet Name: SQL MI - -.Link -https://github.com/microsoft/ARI/Modules/Data/SQLSERVER.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.3.2 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> - -<######## Default Parameters. Don't modify this ########> - -param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) - -if ($Task -eq 'Processing') { - - $SQLSERVERMI = $Resources | Where-Object { $_.TYPE -eq 'microsoft.sql/managedInstances' } - - if($SQLSERVERMI) - { - $tmp = @() - - foreach ($1 in $SQLSERVERMI) { - $ResUCount = 1 - $sub1 = $SUB | Where-Object { $_.id -eq $1.subscriptionId } - $data = $1.PROPERTIES - - $Tags = if(!!($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} - - $pvteps = if(!($1.privateEndpointConnections)) {[pscustomobject]@{id = 'NONE'}} else {$1.privateEndpointConnections | Select-Object @{Name="id";Expression={$_.id.split("/")[8]}}} - - foreach ($pvtep in $pvteps) { - foreach ($Tag in $Tags) { - $obj = @{ - 'ID' = $1.id; - 'Subscription' = $sub1.Name; - 'Resource Group' = $1.RESOURCEGROUP; - 'Name' = $1.NAME; - 'Location' = $1.LOCATION; - 'SkuName' = $1.sku.Name; - 'SkuCapacity' = $1.sku.capacity; - 'SkuTier' = $1.sku.tier; - 'Admin Login' = $data.adminitrators.login; - 'AzureADOnlyAuthentication' = $data.adminitrators.azureADOnlyAuthentication; - 'Private Endpoint' = $pvtep.id; - 'FQDN' = $data.fullyQualifiedDomainName; - 'Public Network Access' = $data.publicDataEndpointEnabled; - 'licenseType' = $data.licenseType; - 'managedInstanceCreateMode' = $data.managedInstanceCreateMode; - 'Resource U' = $ResUCount; - 'Zone Redundant' = $data.zoneRedundant; - 'Tag Name' = [string]$Tag.Name; - 'Tag Value' = [string]$Tag.Value - } - $tmp += $obj - if ($ResUCount -eq 1) { $ResUCount = 0 } - } - } - } - $tmp - } -} -else { - if ($SmaResources.SQLMI) { - - $TableName = ('SQLMITable_'+($SmaResources.SQLMI.id | Select-Object -Unique).count) - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 - - $condtxt = @() - $condtxt += New-ConditionalText FALSE -Range J:J - $condtxt += New-ConditionalText FALSO -Range J:J - $condtxt += New-ConditionalText FAUX -Range J:J - $condtxt += New-ConditionalText NONE -Range J:J - $condtxt += New-ConditionalText Enabled -Range L:L - $condtxt += New-ConditionalText VRAI -Range L:L - - $Exc = New-Object System.Collections.Generic.List[System.Object] - $Exc.Add('Subscription') - $Exc.Add('Resource Group') - $Exc.Add('Name') - $Exc.Add('Location') - $Exc.Add('SkuName') - $Exc.Add('SkuCapacity') - $Exc.Add('SkuTier') - $Exc.Add('Admin Login') - $Exc.Add('ActiveDirectoryOnlyAuthentication') - $Exc.Add('Private Endpoint') - $Exc.Add('FQDN') - $Exc.Add('Public Network Access') - $Exc.Add('licenseType') - $Exc.Add('managedInstanceCreateMode') - $Exc.Add('Zone Redundant') - if($InTag) - { - $Exc.Add('Tag Name') - $Exc.Add('Tag Value') - } - - $ExcelVar = $SmaResources.SQLMI - - $ExcelVar | - ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | - Export-Excel -Path $File -WorksheetName 'SQL MI' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -ConditionalText $condtxt -Style $Style - - } +<# +.Synopsis +Inventory for Azure SQL Server + +.DESCRIPTION +This script consolidates information for all microsoft.sql/servers resource provider in $Resources variable. +Excel Sheet Name: SQL MI + +.Link +https://github.com/microsoft/ARI/Modules/Data/SQLSERVER.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 2.3.2 +First Release Date: 19th November, 2020 +Authors: Claudio Merola and Renato Gregio + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +if ($Task -eq 'Processing') { + + $SQLSERVERMI = $Resources | Where-Object { $_.TYPE -eq 'microsoft.sql/managedInstances' } + + if($SQLSERVERMI) + { + $tmp = @() + + foreach ($1 in $SQLSERVERMI) { + $ResUCount = 1 + $sub1 = $SUB | Where-Object { $_.id -eq $1.subscriptionId } + $data = $1.PROPERTIES + + $Tags = if(!!($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} + + $pvteps = if(!($1.privateEndpointConnections)) {[pscustomobject]@{id = 'NONE'}} else {$1.privateEndpointConnections | Select-Object @{Name="id";Expression={$_.id.split("/")[8]}}} + + foreach ($pvtep in $pvteps) { + foreach ($Tag in $Tags) { + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.Name; + 'Resource Group' = $1.RESOURCEGROUP; + 'Name' = $1.NAME; + 'Location' = $1.LOCATION; + 'SkuName' = $1.sku.Name; + 'SkuCapacity' = $1.sku.capacity; + 'SkuTier' = $1.sku.tier; + 'Admin Login' = $data.adminitrators.login; + 'AzureADOnlyAuthentication' = $data.adminitrators.azureADOnlyAuthentication; + 'Private Endpoint' = $pvtep.id; + 'FQDN' = $data.fullyQualifiedDomainName; + 'Public Network Access' = $data.publicDataEndpointEnabled; + 'licenseType' = $data.licenseType; + 'managedInstanceCreateMode' = $data.managedInstanceCreateMode; + 'Resource U' = $ResUCount; + 'Zone Redundant' = $data.zoneRedundant; + 'Tag Name' = [string]$Tag.Name; + 'Tag Value' = [string]$Tag.Value + } + $tmp += $obj + if ($ResUCount -eq 1) { $ResUCount = 0 } + } + } + } + $tmp + } +} +else { + if ($SmaResources.SQLMI) { + + $TableName = ('SQLMITable_'+($SmaResources.SQLMI.id | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 + + $condtxt = @() + $condtxt += New-ConditionalText FALSE -Range J:J + $condtxt += New-ConditionalText FALSO -Range J:J + $condtxt += New-ConditionalText FAUX -Range J:J + $condtxt += New-ConditionalText NONE -Range J:J + $condtxt += New-ConditionalText Enabled -Range L:L + $condtxt += New-ConditionalText VRAI -Range L:L + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('Resource Group') + $Exc.Add('Name') + $Exc.Add('Location') + $Exc.Add('SkuName') + $Exc.Add('SkuCapacity') + $Exc.Add('SkuTier') + $Exc.Add('Admin Login') + $Exc.Add('ActiveDirectoryOnlyAuthentication') + $Exc.Add('Private Endpoint') + $Exc.Add('FQDN') + $Exc.Add('Public Network Access') + $Exc.Add('licenseType') + $Exc.Add('managedInstanceCreateMode') + $Exc.Add('Zone Redundant') + if($InTag) + { + $Exc.Add('Tag Name') + $Exc.Add('Tag Value') + } + + $ExcelVar = $SmaResources.SQLMI + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'SQL MI' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -ConditionalText $condtxt -Style $Style + + } } \ No newline at end of file diff --git a/Modules/Data/SQLMIDB.ps1 b/Modules/Scripts/Data/SQLMIDB.ps1 similarity index 97% rename from Modules/Data/SQLMIDB.ps1 rename to Modules/Scripts/Data/SQLMIDB.ps1 index 1cdf7fe..a2687c5 100644 --- a/Modules/Data/SQLMIDB.ps1 +++ b/Modules/Scripts/Data/SQLMIDB.ps1 @@ -1,98 +1,98 @@ -<# -.Synopsis -Inventory for Azure SQL Server - -.DESCRIPTION -This script consolidates information for all microsoft.sql/servers resource provider in $Resources variable. -Excel Sheet Name: SQL MI DBs - -.Link -https://github.com/microsoft/ARI/Modules/Data/SQLSERVER.ps1 - -.COMPONENT -This powershell Module is part of Azure Resource Inventory (ARI) - -.NOTES -Version: 2.3.2 -First Release Date: 19th November, 2020 -Authors: Claudio Merola and Renato Gregio - -#> - -<######## Default Parameters. Don't modify this ########> - -param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) - -if ($Task -eq 'Processing') { - - $SQLSERVERMIDB = $Resources | Where-Object { $_.TYPE -eq 'microsoft.sql/managedinstances/databases' } - - if($SQLSERVERMIDB) - { - $tmp = @() - - foreach ($1 in $SQLSERVERMIDB) { - $ResUCount = 1 - $sub1 = $SUB | Where-Object { $_.id -eq $1.subscriptionId } - $data = $1.PROPERTIES - - $Tags = if(!!($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} - - $pvteps = if(!($data.privateEndpointConnections)) {[pscustomobject]@{id = 'NONE'}} else {$data.privateEndpointConnections | Select-Object @{Name="id";Expression={$_.id.split("/")[10]}}} - - foreach ($pvtep in $pvteps) { - foreach ($Tag in $Tags) { - $obj = @{ - 'ID' = $1.id; - 'Subscription' = $sub1.Name; - 'MI parent' = $1.id.split("/")[8]; - 'Name' = $1.NAME; - 'Collation' = $data.collation; - 'CreationDate' = $data.creationDate; - 'DefaultSecondaryLocation' = $data.defaultSecondaryLocation; - 'Status' = $data.status; - 'Tag Name' = [string]$Tag.Name; - 'Tag Value' = [string]$Tag.Value - } - $tmp += $obj - if ($ResUCount -eq 1) { $ResUCount = 0 } - } - } - } - $tmp - } -} -else { - if ($SmaResources.SQLMIDB) { - - $TableName = ('SQLMIDBTable_'+($SmaResources.SQLMIDB.id | Select-Object -Unique).count) - $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 - - $condtxt = @() - $condtxt += New-ConditionalText FALSE -Range J:J - $condtxt += New-ConditionalText FALSO -Range J:J - $condtxt += New-ConditionalText FAUX -Range J:J - $condtxt += New-ConditionalText offline -Range G:G - - $Exc = New-Object System.Collections.Generic.List[System.Object] - $Exc.Add('Subscription') - $Exc.Add('MI parent') - $Exc.Add('Name') - $Exc.Add('Collation') - $Exc.Add('CreationDate') - $Exc.Add('DefaultSecondaryLocation') - $Exc.Add('Status') - if($InTag) - { - $Exc.Add('Tag Name') - $Exc.Add('Tag Value') - } - - $ExcelVar = $SmaResources.SQLMIDB - - $ExcelVar | - ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | - Export-Excel -Path $File -WorksheetName 'SQL MI DBs' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -ConditionalText $condtxt -Style $Style - - } +<# +.Synopsis +Inventory for Azure SQL Server + +.DESCRIPTION +This script consolidates information for all microsoft.sql/servers resource provider in $Resources variable. +Excel Sheet Name: SQL MI DBs + +.Link +https://github.com/microsoft/ARI/Modules/Data/SQLSERVER.ps1 + +.COMPONENT +This powershell Module is part of Azure Resource Inventory (ARI) + +.NOTES +Version: 2.3.2 +First Release Date: 19th November, 2020 +Authors: Claudio Merola and Renato Gregio + +#> + +<######## Default Parameters. Don't modify this ########> + +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) + +if ($Task -eq 'Processing') { + + $SQLSERVERMIDB = $Resources | Where-Object { $_.TYPE -eq 'microsoft.sql/managedinstances/databases' } + + if($SQLSERVERMIDB) + { + $tmp = @() + + foreach ($1 in $SQLSERVERMIDB) { + $ResUCount = 1 + $sub1 = $SUB | Where-Object { $_.id -eq $1.subscriptionId } + $data = $1.PROPERTIES + + $Tags = if(!!($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} + + $pvteps = if(!($data.privateEndpointConnections)) {[pscustomobject]@{id = 'NONE'}} else {$data.privateEndpointConnections | Select-Object @{Name="id";Expression={$_.id.split("/")[10]}}} + + foreach ($pvtep in $pvteps) { + foreach ($Tag in $Tags) { + $obj = @{ + 'ID' = $1.id; + 'Subscription' = $sub1.Name; + 'MI parent' = $1.id.split("/")[8]; + 'Name' = $1.NAME; + 'Collation' = $data.collation; + 'CreationDate' = $data.creationDate; + 'DefaultSecondaryLocation' = $data.defaultSecondaryLocation; + 'Status' = $data.status; + 'Tag Name' = [string]$Tag.Name; + 'Tag Value' = [string]$Tag.Value + } + $tmp += $obj + if ($ResUCount -eq 1) { $ResUCount = 0 } + } + } + } + $tmp + } +} +else { + if ($SmaResources.SQLMIDB) { + + $TableName = ('SQLMIDBTable_'+($SmaResources.SQLMIDB.id | Select-Object -Unique).count) + $Style = New-ExcelStyle -HorizontalAlignment Center -AutoSize -NumberFormat 0 + + $condtxt = @() + $condtxt += New-ConditionalText FALSE -Range J:J + $condtxt += New-ConditionalText FALSO -Range J:J + $condtxt += New-ConditionalText FAUX -Range J:J + $condtxt += New-ConditionalText offline -Range G:G + + $Exc = New-Object System.Collections.Generic.List[System.Object] + $Exc.Add('Subscription') + $Exc.Add('MI parent') + $Exc.Add('Name') + $Exc.Add('Collation') + $Exc.Add('CreationDate') + $Exc.Add('DefaultSecondaryLocation') + $Exc.Add('Status') + if($InTag) + { + $Exc.Add('Tag Name') + $Exc.Add('Tag Value') + } + + $ExcelVar = $SmaResources.SQLMIDB + + $ExcelVar | + ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | + Export-Excel -Path $File -WorksheetName 'SQL MI DBs' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -ConditionalText $condtxt -Style $Style + + } } \ No newline at end of file diff --git a/Modules/Data/SQLPOOL.ps1 b/Modules/Scripts/Data/SQLPOOL.ps1 similarity index 100% rename from Modules/Data/SQLPOOL.ps1 rename to Modules/Scripts/Data/SQLPOOL.ps1 diff --git a/Modules/Data/SQLSERVER.ps1 b/Modules/Scripts/Data/SQLSERVER.ps1 similarity index 100% rename from Modules/Data/SQLSERVER.ps1 rename to Modules/Scripts/Data/SQLSERVER.ps1 diff --git a/Modules/Data/SQLVM.ps1 b/Modules/Scripts/Data/SQLVM.ps1 similarity index 100% rename from Modules/Data/SQLVM.ps1 rename to Modules/Scripts/Data/SQLVM.ps1 diff --git a/Modules/Infrastructure/AppGW.ps1 b/Modules/Scripts/Infrastructure/AppGW.ps1 similarity index 100% rename from Modules/Infrastructure/AppGW.ps1 rename to Modules/Scripts/Infrastructure/AppGW.ps1 diff --git a/Modules/Infrastructure/AutomationAcc.ps1 b/Modules/Scripts/Infrastructure/AutomationAcc.ps1 similarity index 100% rename from Modules/Infrastructure/AutomationAcc.ps1 rename to Modules/Scripts/Infrastructure/AutomationAcc.ps1 diff --git a/Modules/Infrastructure/AvSet.ps1 b/Modules/Scripts/Infrastructure/AvSet.ps1 similarity index 100% rename from Modules/Infrastructure/AvSet.ps1 rename to Modules/Scripts/Infrastructure/AvSet.ps1 diff --git a/Modules/Infrastructure/BASTION.ps1 b/Modules/Scripts/Infrastructure/BASTION.ps1 similarity index 100% rename from Modules/Infrastructure/BASTION.ps1 rename to Modules/Scripts/Infrastructure/BASTION.ps1 diff --git a/Modules/Infrastructure/Frontdoor.ps1 b/Modules/Scripts/Infrastructure/Frontdoor.ps1 similarity index 100% rename from Modules/Infrastructure/Frontdoor.ps1 rename to Modules/Scripts/Infrastructure/Frontdoor.ps1 diff --git a/Modules/Infrastructure/RecoveryVault.ps1 b/Modules/Scripts/Infrastructure/RecoveryVault.ps1 similarity index 100% rename from Modules/Infrastructure/RecoveryVault.ps1 rename to Modules/Scripts/Infrastructure/RecoveryVault.ps1 diff --git a/Modules/Infrastructure/Vault.ps1 b/Modules/Scripts/Infrastructure/Vault.ps1 similarity index 100% rename from Modules/Infrastructure/Vault.ps1 rename to Modules/Scripts/Infrastructure/Vault.ps1 diff --git a/Modules/Integration/APIM.ps1 b/Modules/Scripts/Integration/APIM.ps1 similarity index 100% rename from Modules/Integration/APIM.ps1 rename to Modules/Scripts/Integration/APIM.ps1 diff --git a/Modules/Integration/AppInsights.ps1 b/Modules/Scripts/Integration/AppInsights.ps1 similarity index 100% rename from Modules/Integration/AppInsights.ps1 rename to Modules/Scripts/Integration/AppInsights.ps1 diff --git a/Modules/Integration/Backup.ps1 b/Modules/Scripts/Integration/Backup.ps1 similarity index 100% rename from Modules/Integration/Backup.ps1 rename to Modules/Scripts/Integration/Backup.ps1 diff --git a/Modules/Integration/IOTHubs.ps1 b/Modules/Scripts/Integration/IOTHubs.ps1 similarity index 100% rename from Modules/Integration/IOTHubs.ps1 rename to Modules/Scripts/Integration/IOTHubs.ps1 diff --git a/Modules/Integration/ServiceBUS.ps1 b/Modules/Scripts/Integration/ServiceBUS.ps1 similarity index 100% rename from Modules/Integration/ServiceBUS.ps1 rename to Modules/Scripts/Integration/ServiceBUS.ps1 diff --git a/Modules/Networking/AzureFirewall.ps1 b/Modules/Scripts/Networking/AzureFirewall.ps1 similarity index 100% rename from Modules/Networking/AzureFirewall.ps1 rename to Modules/Scripts/Networking/AzureFirewall.ps1 diff --git a/Modules/Networking/Connections.ps1 b/Modules/Scripts/Networking/Connections.ps1 similarity index 100% rename from Modules/Networking/Connections.ps1 rename to Modules/Scripts/Networking/Connections.ps1 diff --git a/Modules/Networking/ExpressRoute.ps1 b/Modules/Scripts/Networking/ExpressRoute.ps1 similarity index 100% rename from Modules/Networking/ExpressRoute.ps1 rename to Modules/Scripts/Networking/ExpressRoute.ps1 diff --git a/Modules/Networking/LoadBalancer.ps1 b/Modules/Scripts/Networking/LoadBalancer.ps1 similarity index 97% rename from Modules/Networking/LoadBalancer.ps1 rename to Modules/Scripts/Networking/LoadBalancer.ps1 index 50d02b4..b0f3b9e 100644 --- a/Modules/Networking/LoadBalancer.ps1 +++ b/Modules/Scripts/Networking/LoadBalancer.ps1 @@ -13,7 +13,7 @@ https://github.com/microsoft/ARI/Modules/Networking/LoadBalancer.ps1 This powershell Module is part of Azure Resource Inventory (ARI) .NOTES -Version: 3.1.1 +Version: 3.4.1 First Release Date: 19th November, 2020 Authors: Claudio Merola and Renato Gregio @@ -21,7 +21,7 @@ Authors: Claudio Merola and Renato Gregio <######## Default Parameters. Don't modify this ########> -param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) +param($SCPath, $Sub, $Intag, $Resources, $Task , $File, $SmaResources, $TableStyle, $Unsupported) If ($Task -eq 'Processing') { $LoadBalancer = $Resources | Where-Object { $_.TYPE -eq 'microsoft.network/loadbalancers' } @@ -30,7 +30,7 @@ If ($Task -eq 'Processing') { { $tmp = @() - foreach ($1 in $LoadBalancer) { + foreach ($1 in $LoadBalancer ) { $ResUCount = 1 $sub1 = $SUB | Where-Object { $_.Id -eq $1.subscriptionId } $FrontEnds = @() @@ -46,7 +46,7 @@ If ($Task -eq 'Processing') { $RetFeature = ($Unsupported | Where-Object {$_.Id -eq 8}).RetiringFeature } $Tags = if(![string]::IsNullOrEmpty($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'} - foreach ($2 in $data.frontendIPConfigurations) + $FrontEnds = foreach ($2 in $data.frontendIPConfigurations) { if (![string]::IsNullOrEmpty($2.properties.subnet.id)) { @@ -56,7 +56,7 @@ If ($Task -eq 'Processing') { FrontType = 'VNET' frontsub = $2.properties.subnet.id.split('/')[10] } - $FrontEnds += $tmps + $tmps } elseif (![string]::IsNullOrEmpty($2.properties.publicIPAddress.id)) { @@ -66,10 +66,10 @@ If ($Task -eq 'Processing') { FrontType = 'Public IP' frontsub = $null } - $FrontEnds += $tmps + $tmps } } - foreach ($3 in $data.backendAddressPools) + $Backends = foreach ($3 in $data.backendAddressPools) { if (![string]::IsNullOrEmpty($3.properties.backendIPConfigurations.id)) { @@ -78,10 +78,10 @@ If ($Task -eq 'Processing') { BackTarget = $3.properties.backendIPConfigurations.id.split('/')[8] BackType = $3.properties.backendIPConfigurations.id.split('/')[7] } - $Backends += $tmps + $tmps } } - foreach ($4 in $data.probes) + $Probes = foreach ($4 in $data.probes) { $tmps = [pscustomobject]@{ name = $4.name @@ -90,14 +90,14 @@ If ($Task -eq 'Processing') { Port = $4.properties.port Threshold = $4.properties.numberOfProbes } - $Probes += $tmps + $tmps } $TempAr = @() $ob = [pscustomobject]@{ - loop = 'FrontEnd' - number = $FrontEnds.Count - } + loop = 'FrontEnd' + number = $FrontEnds.Count + } $TempAr += $ob $ob = [pscustomobject]@{ loop = 'BackEnd' @@ -110,11 +110,15 @@ If ($Task -eq 'Processing') { } $TempAr += $ob $Order = $TempAr | Select-Object -Property loop,number | Sort-Object number + $FrontEnds = if(![string]::IsNullOrEmpty($FrontEnds)){$FrontEnds}else{'0'} + $Backends = if(![string]::IsNullOrEmpty($Backends)){$Backends}else{'0'} + $Probes = if(![string]::IsNullOrEmpty($Probes)){$Probes}else{'0'} if (($Order.loop | Select-Object -First 1) -eq 'Probe') { if (($Order.loop | Select-Object -First 1 -Skip 1) -eq 'FrontEnd') { + foreach ($Probe in $Probes) { foreach ($FrontEnd in $FrontEnds) diff --git a/Modules/Networking/NATGAteway.ps1 b/Modules/Scripts/Networking/NATGAteway.ps1 similarity index 100% rename from Modules/Networking/NATGAteway.ps1 rename to Modules/Scripts/Networking/NATGAteway.ps1 diff --git a/Modules/Networking/NetworkInterface.ps1 b/Modules/Scripts/Networking/NetworkInterface.ps1 similarity index 100% rename from Modules/Networking/NetworkInterface.ps1 rename to Modules/Scripts/Networking/NetworkInterface.ps1 diff --git a/Modules/Networking/NetworkSecurityGroup.ps1 b/Modules/Scripts/Networking/NetworkSecurityGroup.ps1 similarity index 94% rename from Modules/Networking/NetworkSecurityGroup.ps1 rename to Modules/Scripts/Networking/NetworkSecurityGroup.ps1 index 7c50c6f..36445bb 100644 --- a/Modules/Networking/NetworkSecurityGroup.ps1 +++ b/Modules/Scripts/Networking/NetworkSecurityGroup.ps1 @@ -13,9 +13,10 @@ https://github.com/microsoft/ARI/Modules/Networking/NetworkSecurityGroup.ps1 This powershell Module is part of Azure Resource Inventory (ARI) .NOTES -Version: 3.1.0 +Version: 4.1.0 First Release Date: 2021.10.05 -Authors: Christopher Lewis +Authors: Christopher Lewis, + Claudio Merola #> @@ -83,7 +84,9 @@ If ($Task -eq 'Processing') { $FinalSUBs = if ($FinalSUBs -like '* ,*') { $FinalSUBs -replace ".$" }else { $FinalSUBs } } - foreach ($2 in $data.securityRules) + $SecurityRules = $data.securityRules + $SecurityRules = if (![string]::IsNullOrEmpty($SecurityRules)) { $SecurityRules }else { '0' } + foreach ($2 in $SecurityRules) { foreach ($Tag in $Tags) { if (![string]::IsNullOrEmpty($2.properties.sourceAddressPrefixes)) @@ -192,13 +195,9 @@ If ($Task -eq 'Processing') { $tmp } } Else { - # -------------------------------------------------------------------------------- - # the $SmaResources object for a module should be the same as the name of the file. - # In this case the file name is "NetworkSecurityGroup.ps1" so the SMA object - # is $SmaResources.NetworkSecurityGroup - # -------------------------------------------------------------------------------- - $ExcelVar = $SmaResources.NetworkSecurityGroup - if ($ExcelVar) { + if ($SmaResources.NetworkSecurityGroup) { + + $Excelvar = $SmaResources.NetworkSecurityGroup $TableName = ('NSGTable_'+($SmaResources.NetworkSecurityGroup.id | Select-Object -Unique).count) $Style = @() @@ -207,7 +206,6 @@ If ($Task -eq 'Processing') { $Style += New-ExcelStyle -HorizontalAlignment Center -WrapText -NumberFormat 0 -Range "O:O" -Width 70 $Style += New-ExcelStyle -HorizontalAlignment Center -WrapText -NumberFormat 0 -Range "Q:R" -Width 70 - #Conditional formats. Note that this can be $() for none $condtxt = @() $condtxt += New-ConditionalText TRUE -Range G:G $condtxt += New-ConditionalText - -Range E:E -ConditionalType ContainsText @@ -245,9 +243,5 @@ If ($Task -eq 'Processing') { ForEach-Object { [PSCustomObject]$_ } | Select-Object -Unique $Exc | Export-Excel -Path $File -WorksheetName 'Network Security Groups' -AutoSize -MaxAutoSizeRows 100 -TableName $TableName -TableStyle $tableStyle -ConditionalText $condtxt -Style $Style -NoNumberConversion $noNumberConversion - - <######## Insert Column comments and documentations here following this model. See StoraceAcc.ps1 for samples #########> - - } } diff --git a/Modules/Networking/PrivateDNS.ps1 b/Modules/Scripts/Networking/PrivateDNS.ps1 similarity index 100% rename from Modules/Networking/PrivateDNS.ps1 rename to Modules/Scripts/Networking/PrivateDNS.ps1 diff --git a/Modules/Networking/PrivateEndpoint.ps1 b/Modules/Scripts/Networking/PrivateEndpoint.ps1 similarity index 100% rename from Modules/Networking/PrivateEndpoint.ps1 rename to Modules/Scripts/Networking/PrivateEndpoint.ps1 diff --git a/Modules/Networking/PublicDNS.ps1 b/Modules/Scripts/Networking/PublicDNS.ps1 similarity index 100% rename from Modules/Networking/PublicDNS.ps1 rename to Modules/Scripts/Networking/PublicDNS.ps1 diff --git a/Modules/Networking/PublicIP.ps1 b/Modules/Scripts/Networking/PublicIP.ps1 similarity index 100% rename from Modules/Networking/PublicIP.ps1 rename to Modules/Scripts/Networking/PublicIP.ps1 diff --git a/Modules/Networking/ROUTETABLE.ps1 b/Modules/Scripts/Networking/ROUTETABLE.ps1 similarity index 100% rename from Modules/Networking/ROUTETABLE.ps1 rename to Modules/Scripts/Networking/ROUTETABLE.ps1 diff --git a/Modules/Networking/TrafficManager.ps1 b/Modules/Scripts/Networking/TrafficManager.ps1 similarity index 100% rename from Modules/Networking/TrafficManager.ps1 rename to Modules/Scripts/Networking/TrafficManager.ps1 diff --git a/Modules/Networking/VNETGTW.ps1 b/Modules/Scripts/Networking/VNETGTW.ps1 similarity index 100% rename from Modules/Networking/VNETGTW.ps1 rename to Modules/Scripts/Networking/VNETGTW.ps1 diff --git a/Modules/Networking/VirtualNetwork.ps1 b/Modules/Scripts/Networking/VirtualNetwork.ps1 similarity index 99% rename from Modules/Networking/VirtualNetwork.ps1 rename to Modules/Scripts/Networking/VirtualNetwork.ps1 index ffbe708..d749ca3 100644 --- a/Modules/Networking/VirtualNetwork.ps1 +++ b/Modules/Scripts/Networking/VirtualNetwork.ps1 @@ -13,7 +13,7 @@ https://github.com/microsoft/ARI/Modules/Networking/VirtualNetwork.ps1 This powershell Module is part of Azure Resource Inventory (ARI) .NOTES -Version: 3.2.1 +Version: 3.2.2 First Release Date: 19th November, 2020 Authors: Claudio Merola and Renato Gregio @@ -106,7 +106,7 @@ If ($Task -eq 'Processing') { 'Available IPs' = [string]$AvailableIPs; 'Subnet Name' = $2.name; 'Private Subnet' = if($2.properties.defaultOutboundAccess -eq 'false'){'true'}else{'false'}; - 'Subnet Prefix' = $Prefixes; + 'Subnet Prefix' = [string]$Prefixes; 'Subnet Private Link Service Network Policies' = $2.properties.privateLinkServiceNetworkPolicies; 'Subnet Private Endpoint Network Policies' = $2.properties.privateEndpointNetworkPolicies; 'Subnet Delegations' = $Delegations; diff --git a/Modules/Networking/VirtualWAN.ps1 b/Modules/Scripts/Networking/VirtualWAN.ps1 similarity index 100% rename from Modules/Networking/VirtualWAN.ps1 rename to Modules/Scripts/Networking/VirtualWAN.ps1 diff --git a/Modules/Networking/vNETPeering.ps1 b/Modules/Scripts/Networking/vNETPeering.ps1 similarity index 100% rename from Modules/Networking/vNETPeering.ps1 rename to Modules/Scripts/Networking/vNETPeering.ps1 diff --git a/Modules/Storage/DataExplorerCluster.ps1 b/Modules/Scripts/Storage/DataExplorerCluster.ps1 similarity index 100% rename from Modules/Storage/DataExplorerCluster.ps1 rename to Modules/Scripts/Storage/DataExplorerCluster.ps1 diff --git a/Modules/Storage/NetApp.ps1 b/Modules/Scripts/Storage/NetApp.ps1 similarity index 100% rename from Modules/Storage/NetApp.ps1 rename to Modules/Scripts/Storage/NetApp.ps1 diff --git a/Modules/Storage/StorageAcc.ps1 b/Modules/Scripts/Storage/StorageAcc.ps1 similarity index 100% rename from Modules/Storage/StorageAcc.ps1 rename to Modules/Scripts/Storage/StorageAcc.ps1 diff --git a/Modules/Storage/VMDisk.ps1 b/Modules/Scripts/Storage/VMDisk.ps1 similarity index 100% rename from Modules/Storage/VMDisk.ps1 rename to Modules/Scripts/Storage/VMDisk.ps1 diff --git a/README.md b/README.md index 58dcc28..59d5f4d 100644 --- a/README.md +++ b/README.md @@ -12,177 +12,179 @@ Tags: Powershell, Azure, Inventory, Excel Report, Customer Engineer
    -![Logo](images/ARI_Logo.png) +

    + +

    # Azure Resource Inventory -Azure Resource inventory (ARI) is a powerful script written in powershell that generates an Excel report of any Azure Environment you have read access. +Azure Resource inventory (ARI) is a powerful powershell module that generates an Excel report of any Azure Environment you have read access. This project is intend to help Cloud Admins and anyone that might need an easy and fast way to build a full Excel Report of an Azure Environment.
    -## What's new ? - -
    - -### Version 3 is alive!! +### What's new ?
    -![Overview](images/ARIv3-Overview.png) +- Version 3.5 is here: + - ARI Powershell Module + - New Automation Account + - Azure Rest API
    -Among the many improvements, those are the highlights of the new version: +## Azure Resource Inventory Overview
    -#### 1) Support for 6 extra resource types, including NetApp and VMWare Solution. +

    + +


    -Since the begining of the project, we wanted ARI to evolve and keep pace with the improvements on Azure Resources. Keeping that in mind we are adding extra modules for newer resources. +

    + +

    -We also reviewed and updated some of the old resources as well. +#### Network Topology View
    -#### 2) Diagram was completely rebuild and now support environments with more than 30.000 resources +

    + +


    -Network Topology was cool but in large environments it had some problems (i.e.: freezing and never finishing), and even when it finished it might take forever. - -We added parallel processing to diagram, now during the execution of ARI, an extra folder (DiagramCache) will be created, that folder is used by the diagram to store temporary components of the diagrams, after all the parallel processing is done those files are merged in the main diagram. - -Now diagram will even finish way before the Excel file. +- An extra detail is that if you hover the mouse cursor over any resource in the Network Topology you get the resource details:
    -#### 3) Network Topology in the Diagram now identifies the Hub and Spokes Virtual Network +

    + +


    -![Draw.IO](images/DrawioImage.png) +- This feature is available for any resource and even peering lines:
    -Tab names were added in the diagram and now the Network Topology is the first tab. - -Also in the Network Topology, we are using color in the diagram to identify the different Virtual Network usages in HUB-Spoke topologies. +

    + +

    -Colors will also be used to indicate broken peers. +

    -#### 4) Diagram now include "Organizational View" (Management Groups) +#### Organization View
    -![Draw.IOOrg](images/DrawioOrganization.png) +

    + +


    -We added extra tabs in the new diagram, the second tab is called "Organization" and will present the hierarquical view of subscriptions in the environment. - -The idea is to make easier to align your environment with the Microsoft's Landing Zone design ([What is an Azure landing zone](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/)). +#### Resources View
    -#### 5) Diagram now include Resource Overview for every subscription in the environment +

    + +


    -![Draw.IOOrg](images/drawiosubs.png) +## Version 3.5
    -Since not everyone have really complex network environments, many people complain about diagram not really presenting much for their environments. - -This change now. Every single Subscription will be a tab in the diagram, those tabs will contain the Subscription, the resource groups and the sum of every type of resource in the resource groups. By now almost every type of draw.io stencil available will be identified, with more coming in the next months. +Among the many improvements, there are two that will considerable change the way we use the script and type of data we are reporting:
    -#### 6) ARI in Automation Account +#### 1) Azure Resource Inventory (Powershell Module)
    -![Overview](images/Automation.png) +We expect this change will positively change the experience of installing and executing ARI:
    -Some people were asking to run ARI in Azure Automation Account and since the old script for automation accounts was not working we managed to fix it for this version. But now is require to use Runtime 7.2 and add the modules: "ImportExcel", "Az.ResourceGraph", "Az.Storage", "Az.Account" and "ThreadJob" in the Automation Account. +Installing ARI: -The required steps are present in the: [Automation Guide](https://github.com/microsoft/ARI/blob/main/Automation/README.md). +``` +Install-Module -Name AzureResourceInventory +```
    +

    + +

    +
    -> ### *1) Excel Overview* +Now to run the script just execute "Invoke-ARI" with the regular parameters: ---------------------- +``` +Invoke-ARI +```
    -- The dashboard shows an overall view and summary of resources in the environment. +

    + +


    -![Overview](images/ARIv3-Overview.png) +#### 2) Automation is now fully integrated within the ARI Module
    -- The resource sheet present details and recommendations, security and costs reducing tips for the resources. +The process to run Azure Resource Inventory using Automation Accounts was changed to fully integrate with the new ARI Module -
    - -![Overview](images/ARIv3ExcelExample.png)
    -> ### *2) Azure Diagram Inventory!* - ---------------------- +

    + +

    -By default everytime you run the Azure Resource Inventory the diagram will be created. +
    -If you do not wish to have the diagram created, you must use the __-SkipDiagram__ parameter. -Also, by default the Network Topology will not consider Virtual Networks that are not connected trough peering. If you wants to include those Virtual Networks in the diagram, you must use the parameter __-DiagramFullEnvironment__. +The required steps are present in the: [Automation Guide](https://github.com/microsoft/ARI/blob/main/Automation/README.md).
    -#### Diagram: -
    -

    - -

    +#### 3) Azure Rest API
    -- An extra detail is that if you hover the mouse cursor over any resource in the Network Topology you get the resource details: +We are finally incorporating Azure REST API data into ARI. -
    +At this time we are only including: -

    - -

    + - Azure Support Tickets + - Azure Health Incidents + - Azure Advisor Score Data + - Reservation Recommendations -
    +We expect this will open doors for extra types of data to be included in the script in the future. -- This feature is available for any resource and even peering lines:
    -

    - -

    - -

    @@ -191,17 +193,18 @@ Also, by default the Network Topology will not consider Virtual Networks that ar | Parameter | Description | | |------------------------|-------------------------------------------------------------------------------------------------------------|----------------------------| | TenantID | Specify the tenant ID you want to create a Resource Inventory. | `-TenantID ` | -| AppId | Service Principal Authentication | `-AppId ` | -| Secret | Client secret of the Service Principal | `-Secret ` | | SubscriptionID | Specifies Subscription(s) to be inventoried. | `-SubscriptionID ` | | ManagementGroup | Specifies the Management Group to be inventoried(all Subscriptions on it) | `-ManagementGroup ` | -| Lite | Speficies to use only the Import-Excel module and don't create the charts (using Excel's API) | `-Lite` | +| Lite | Specifies to use only the Import-Excel module and don't create the charts (using Excel's API) | `-Lite` | | SecurityCenter | Include Security Center Data. | `-SecurityCenter` | | SkipAdvisory | Do not collect Azure Advisory. | `-SkipAdvisory` | +| Automation | Required when running the script with Automation Account | `-Automation` | +| StorageAccount | Storage Account Name (Required when running the script with Automation Account) | `-StorageAccount` | +| StorageContainer | Storage Account Container Name (Required when running the script with Automation Account) | `-StorageContainer` | | IncludeTags | Include Resource Tags. | `-IncludeTags` | | Debug | Run in a Debug mode. | `-Debug` | | DiagramFullEnvironment | Network Diagram of the entire environment | `-DiagramFullEnvironment` | -| Diagram | Create a Visio Diagram. | `-Diagram` | +| Diagram | Create a Draw.IO Diagram. | `-Diagram` | | SkipDiagram | To skip the diagrams creation | `-SkipDiagram` | | DeviceLogin | Authenticating on Azure using the Device login approach | `-DeviceLogin` | | AzureEnvironment | Choose between Azure environments
    > Registered Azure Clouds. Use `az cloud list` to get the list | `-AzureEnvironment ` | @@ -216,35 +219,35 @@ Also, by default the Network Topology will not consider Virtual Networks that ar #### Examples - For CloudShell: ```bash - />./AzureResourceInventory.ps1 + />./Invoke-ARI -Debug ``` - Powershell Desktop: ```bash - />./AzureResourceInventory.ps1 + />./Invoke-ARI -TenantID ``` - > If you do not specify Resource Inventory will be performed on all subscriptions for the selected tenant. + > If you do not specify the Subscription Resource Inventory will be performed on all subscriptions for the selected tenant. > To perform the inventory in a specific Tenant and subscription use `-TenantID` and `-SubscriptionID` parameter ```bash - />./AzureResourceInventory.ps1 -TenantID -SubscriptionID + />./Invoke-ARI -TenantID -SubscriptionID ``` - Including Tags: ```bash - />./AzureResourceInventory.ps1 -TenantID --IncludeTags + />./Invoke-ARI -TenantID --IncludeTags ``` > By Default Azure Resource inventory do not include Resource Tags. - Collecting Security Center Data: ```bash - />./AzureResourceInventory.ps1 -TenantID -SubscriptionID -SecurityCenter + />./Invoke-ARI -TenantID -SubscriptionID -SecurityCenter ``` > By Default Azure Resource inventory do not collect Security Center Data. - Skipping Azure Advisor: ```bash - />./AzureResourceInventory.ps1 -TenantID -SubscriptionID -SkipAdvisory + />./Invoke-ARI -TenantID -SubscriptionID -SkipAdvisory ``` > By Default Azure Resource inventory collects Azure Advisor Data. -- Creating Network Diagram: +- Skipping Network Diagram: ```bash - />./AzureResourceInventory.ps1 -TenantID -Diagram + />./Invoke-ARI -TenantID -SkipDiagram ```
    @@ -258,12 +261,8 @@ These instructions will get you a copy of the project up and running on your loc
    ### Supportability -|Resource Provider|Results|Draw.io Diagram|Comments| -|-----------------|-------------|-----------------|-------------| -|Windows|Fully successfully tested|Supported|Best Results| -|MAC|Fully successfully tested|Not Supported|| -|Linux|Tested on Ubuntu Desktop|Not Supported|No Table auto-fit for columns| -|CloudShell|Tested on Azure CloudShell|Not Supported|No Table auto-fit for columns| + +Even the script might work in almost all environments. Some components (i.e the Topology Diagram) use some APIs and components only present in Windows environment.
    @@ -272,28 +271,18 @@ These instructions will get you a copy of the project up and running on your loc |Tool |Version| |-----------------|-------------| |Windows|11 22H2| -|Powershell|5.1.19041.1237| -|ImportExcel|7.8| -|azure-cli|2.48.1| -|AzCLI account|0.2.3| -|AzCLI resource-graph|2.1.0| +|Powershell|7.4.4| +
    ### Prerequisites -You can use Azure Resource Inventory in both in Cloudshell and Powershell Desktop. - -What things you need to run the script - - -1. Install-Module [ImportExcel](https://github.com/dfinke/ImportExcel) -2. Install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) -3. Install Azure CLI [Account](https://docs.microsoft.com/en-us/cli/azure/azure-cli-extensions-list) Extension -4. Install Azure CLI [Resource-Graph](https://docs.microsoft.com/en-us/cli/azure/azure-cli-extensions-list) Extension +Since the script is a Powershell Module, and we fully migrated az cli to powershell. No extra requirements are needed. +Just install the AzureResourceInventory Module and all the required modules will be automatically installed as well. -By default Azure Resource Inventory will call to install the required Powershell modules and Azure CLI components but you must have administrator privileges during the script execution. +By default Azure Resource Inventory will call to install the required Powershell modules but you must have administrator privileges during the script execution. Special Thanks for __Doug Finke__, the Author of Powershell [ImportExcel](https://github.com/dfinke/ImportExcel) Module. @@ -319,13 +308,13 @@ Special Thanks for __Doug Finke__, the Author of Powershell [ImportExcel](https:
    -* Its really simple to use Azure Resource Inventory, all that you need to do is to call this script in PowerShell. +* Its really simple to use Azure Resource Inventory, all that you need to do is to invoke this cmdlet in PowerShell. -* Run "AzureResourceInventory.ps1". In Azure CloudShell you're already authenticated. In PowerShell Desktop you will be redirected to Azure sign-in page. +* Run "Invoke-ARI". In Azure CloudShell you're already authenticated. In PowerShell Desktop you will be redirected to Azure sign-in page.
    -![Tenants Menu](images/Execution.png) +![RunningARI](images/RunningARI.gif) * If you have privileges in multiple tenants you can specify the desired one by using "-TenantID" parameter or Azure Resource will scan all your tenants ID and ask you to choose one. diff --git a/images/ARIv3-Overview.png b/images/ARIv3-Overview.png deleted file mode 100644 index 202e9d6b591bbaa230ca61561dfc143b89c9cdfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387070 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%0AuC!zQGm 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 z¬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
    qu(nu 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�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 z zj>@m3CISH1q^gBLo1jL#$HX!Y=$prou!j2i9PnI$kl2ZH2=qiPq~}Xp)rRz=D}}F& zGPP8X=&olJkMm^ZY9i9C+jX*^^wTBwlK3dbe;rp!Y!=)}U5{&`kI4bUM<81O@f4E$ z>hv|~iy61!x6ZSt5xI!*88KD&gXvjo?OB&G*W|*{kkqooewMx2!=|FNrJbsTT*bHo zR>SA+yU&mne3xT3&T4z0_1N4=_(_E0qphd(k_Ltbp*Yhq)w~B*_doJm3l# z?Zt$lpMqEicwV8pU5{jL=XD!*#0EsKNQ{V7AzJc4tc2TQht>NzwX(nX{*kh2$0xys z0#3if@h=_VVI0w<_KSP=wja+pWtr~;_j`buo~!+=9@YIhm@}7|A^$J{1eXBraD3mxN3wC6znoLrFQx&=z!?6 zjrZs#6(cO1@MDIOBOowV@{)hW{15?ncTuYJ_;lxE;G&CS^97>K-O;+cAqGm z!tk=(m@~pt_m?l_>}z`U+z;H}N70=Wn<=YO&3W!eU7zTMcQ?7qLLf9re@^YSq zoNOmowk_aUr1KUfwPK%>!#_Y#K@2aDy0ABPP?yN!d9me-KS_r<5w{ES!sLOo@-U}MuobbU~9|txb-VojnNw=Jw*z2~qL+wgO%)W)R)@JB`lS4$U72pkc z{E=sGfyhniUW5zRE*Mn}_5YcpkRr6O;;%$tzEmwuBs<=9cDx`W z8%@D>K|aJIN1sL?KMza_mnBMoAv$+cJ;_-HN01B zzUn8(uKhje8zE`IsDZuwme|J1IIf4)*OsD9`{V2UJ513!PDS_@`+IB}no30|JN~sD zCz?fdq@E28Kuwch%Q@{VC8|xUX`*$pFzXI9L)g|&x`~xN&RW?akBtdLg_%F96Auq>qMkq_fIJXh+oZ!GL zYa);LfzQU8Wt(Ln8OM@>w5a-HI_DlnOHb|^9H9%dG&YQjpakbF%r{IzL>>^H(V)o7 z;AHh=`uG`D3h(6#Tx_>2)pU5@4=Z{<1$99}-PjPWQ%hSm>L-UeL@Kb0TUFc|TJZdg zOIjM~jag(kAAbIbXpAgFH69&v0C?jA3$hE>VW2$&_uoCj$MS^WY%NQ^9Rn?xBd>cQ z8PXNRF%fdWs1$@9K|B%fQqrV8DkE$BZI3ggv)nhvlw1H4CchJ`J~`$2AuoBtQIbjx1f{h9jay(q(sZ~L2y4IN&+*;IViH47|SLbBXH-ZM{a7|8kR zDz*I0?J@+$QmNpEwgu^5E!z#Y(RPeauZ8y1Tv6E^QWigmSG%>(v)3sq!YX>lKJH|w z`DQrsulIOzp?6(+tE!F^8*uiWq-v{RjIy{j@TO9V^`z5{l<2&i5Ta-S+3GwaZ!z?| zF5#NdFqhzb*wmt$`JlIt*_6Oue`K%x>~Kuy+{H;hDj4`?zLB=&u0Yh0<7N0%+h4`5 zyA6gY_c5L6Vd8)l=9~R)@u;iImR(Zp-3_Pe2`|Ky1ykLBLVqScRpF5&lGV_;Zd#8c zfV~i59)Dh!IX%3C&w4TPFHJL&2A;VY6LyPHRqzt5W-fF4LUXeHhyCok@W&k}$xyEE zDCrEMX)3WBw>f680{Hc+I1vftugkCn8AgP;@uuA&W(&l0@XE8@f&bW|k2T9g;R*Sue0& zwAQUG%(meTVxzJ)!&)&24N&Luw?BDb6g_q~*jvF~p%FgCoLXntdQBXF9&~*Y*ZqZ( z`V|4oQzF>R%z2&8e^*#Hvy;LRg5I#cII`=)9aR}vlaIl!IHfdF6V1H227;8NfIer1REoHMdCdkAzI2? zHi-)?G>HP#mt@Q+x9aCEP>Q#28n2J{yRWGZ65y4}&8SB>-ijJ@@ba%s`^P=Uq=i1C zm0>fTGrvT1-6A=~mCKTyv96j|us`kE>%O=kz5@Kb#!h9;hc?0{u@7!|S;EdMZn;?i;do-zmW@Uj^SKcU!~4Z!OGQ ztuE^m6^LG=N zl7CkkO`cv3dsm;O=s=ttwZ%}~7PO*E?)C3D1yJ9EST53ZDwJF2%%FKle`%Rt2%nr| znutM{(^y)o^rJKE{;ou2!_ej@l^_3iQ?oF)=np0n=k->3Eu;ljv%d(6BEdcRwdMlY z!v+01&;?<{<0~aXcHWJFG{iZZIYbs{xxsXgB^&DFBVqSlovNvzv+_PEAB&hR8|CuA zjCKX}qx&&mEtdi(=6>LAeOUy$xe~IhcwzbS!8arc888f|^7~G*lBtBFVh`SR0<^+S z*SZ8^-e2duTEVvpPQ=(QE!cK274Tip^N)s<)x-}AG1iGQKkWF^b@v<{^;Yn|3#6Zh zgIn>bPK1R*cS2Uj514VMVZj=ymRnt0nt$@B_?R_nQjyufee|d|G>%tg3-O}kzhx6w zATZEjDpdWvOdBAPnpCNlKZjH-KCqn1!Vk(?(!6$D7pCV}w%RfreMGf3n-D#Jc*8Pd z%nIhcdrt=^wJ(oVd?)7M>9>*|*wGMryA%_Day!gwXYtpdH?i!rDpuJkGo}od=Aj6u zXhfnHAGwZ5R_u%vU*#`XHiuoj&~qHEJpOW;oJ}zn5gqcvRzG(@tF21?-%z1u9~|0{ zU(|HhzQZGS;~a9cULmtVt@2AreYtGzAm-yE3*W<{NUP56)pgXI;I#+xrSsgKl>j-? zP>D)ZcL-{eOKU>@VM$ZTN(`6W^{fPJOdg-X#rN@iNg^7RuF%HBf<01!@hNdk2)~DUD9){=Yrf`iv-MPB;??`B@8L zzGi%eB$383ya{lcqR5nc%0xiPD3Q&|eU3LG5_ORiEbwH+>LDwPH0Aw8{R5p2UCV|V8Y4@u~K5Mz+3z;BW1Fa3#Cu-8$Xm%MF%|I26X?WM?h}F891QE zPjoPew_PE!vvFu(djLLO%-vQ`T+Bv-<>QT~nh|le;ls$whkdbsf&G+9eZjuzbZSGy z6G-$kN3BSG__Au&g#V5CX^GrJHo?J>!EyPcSeYI<)nvtb(W21{{0u1E7hmUl5E}^j^ zg3BM1q1r9!DM-WjW6X)ezM6)53x2i}ooY_~Z@iRgUZ|mx)DA4^%r<_?GvXfnl$RN` zi8t)tVgJcXRCfkaq%o|bk7>RkGf35Gh(b2=6${sbiEy_aNhT zcU8#SVqHkIxGb6XGT&8z&+ffHw+}!NI36dx!$E9}=6;Om^0+HE*?ZuV!cb~*QemOT zi1iTA1SyrJ9lKF8`V8XP|L5fE@^W~QCv+LlklD<`j9(DMRb6Gr)$me%ST}|{S$Puts!K0qkEl*LUq~(Ss?SC0%fXujX6!t?j zArREn6Iyo6h}*OIVcJxm_ch9Zmb5Z?>FqEDgPA9UQ2YtbO61#{Cs2{qaDIhhRI%AA zl;;7~jwW&W%KJK=b;4y5Nfy))IG>iu;)!{-(hTn&X^!5B_n$`I z0G8rQBwH-(ZLoBZs`r{M3gccL?4QRI<(`6lPpnP1NX^^X=~up7 z^DIgaDxH74Ytk`#R|xwh*m%IRN4rdOAPEbNGgF^}g^fT&N?0~1HA4hUlIn-6M-fD? zW{@kW`I(kZ%WSvd9I8{co!I(3LvEQqh3c=PktII%vtHg7Yo!B*XvWT=jRbv18~aI{ z^@iu?GM3<^%1Qa^rmOcSixH5Yxs^*>CVXiTp*r>b-9LOHBFxt`^W@LH_4{Hx=-Ap1 zl35H=n-dKIiai%S6b(~Ro;Gh273w^i z8-M=l-vx~lYwWG|3b6DP+Lffv77Tj;Hw3S1wkdxz@Dtol+Vk4z)f|BS3#?Ty= zgCP=tPn-n-haNJ!=zCA-RX`zXC5AOb>q5o!6xhfI*-7W{5$!>&?VMg*{|Qd}%=)iGZ&y(1 zI4${g8p=4Ct9!)@sMQ9~R5ftfYBZFENHk*|VbpYKz?#i3Z~V#hb!GOU6ZDkoPQE(VG5?3&x1SE_1&i6rJ<iSl>5gio#CgU^$YF1J>%%Kz4SqpN&n9Vp+#>)q+op*=#{3{&5jqJ`5jtz zDwmqx_lLT#sE?%B;mAcOptIebWa+uuDKlF3I5ZgM^~R%Ueq2${*rb!bn~*t8 z+K{pI82S_V+a)bl`;|vE)yx_HF^We4|H}-H+y%>Ppe7{TQh$ILX{f*1oLCkz3mszY zk}9YO!+x49XJou}yLjyw1fm|f43b*c1DjtwLw4DoRX;kLtYtZ#Fhn%CndsB(I*6U- zb^i&1H^5N?gu=*_!z`kkt>a$UWzSyyOa!{dsJ3~{W(9L(l`^WzAxQk21$s0 zWak4gy826*{;#JXw)(+VUz3s;%S$@@@AOthL;c1j(-PywtF-xO?KK#VjCr^(^l~kB z@Xau=NdSb97GLW;Mh`nR9K2TKZ%x`KBDs2W50goX`nq9fy!>t~JO)hj&olnG-zo{O z#~F&sMqZWgtOOloco2!a7^w^BXx@l_iz>73Lu<-VxmWfB_a7mF0`4L9&9v{!L|@N^ zMQ4{&eG_C5^#xBgbPaWlWbDJ{zDMPO^+RTy&H4yQVuYlp6r_eF%)^aaHao+kO{z}@ zesg(!e7jd`Fwd15yo`u&EvqTzxVeb57;RflV3emwhU-F|s0VR$WaiZNyR${ZA>&NqvrR(csj36wDGLQ7Gx|dQdInN#?zxvohPtA$4@m!7Vj7k_B z|G8JApH#p*_tUGy`O9c8&85mo3db|EJ&xS;8$jB~447qk$Eo=`nZ{XB;AOUH{yWOa zVU1ATUw6OGd8^m%wNzD3{YTPembo>bs)j`5GyLwn_#@V{Lg;Oe3xxcXkzO0gvLS5G z2%tQi&($5Dz*Ul;xF~={_Q@_ge~QxhIOugA`jk4@W@bIyU9OU1&3Gx7deQenDjZpC zQ?It8@_opn|HBUbD)*0pD8~#WRNrGQC`Qe4st50bpJ?;48VTKqgDi|z#Im%}&cSB_ z8!5mzUk#EXHPfPeX{J?N({h&0#2uHVyl4czJdEt>35lqQCHdE^mvA?{RZn6-4dh~=1%is<+0*_BN8Y)AUgU6)=~ zid68`5Ww!u!uY5c&HsIVJ>zW9y|HLH`q>#f0Fi_VV!G~L#Rc!;CI0OXDu#clX8YUD zQbU_+8Bf4_#-rjLmHj^{K9}Yt!DuKSF8>)K3;!h4OoT0vI6Sai?#qh;3-e13z3FG} zY=RZ_B@0NE*bpZpU7<^rN~ z1?b3jSFni)720~XdH~@}gGuxtW_KEgc*<2IFw4=ZIJ=!bb)T5P=s3p62}l)~j7R)? zA)SCMUI~iP^JPCpxJ907e>TjBj7sy#<-WkEu&Cj?z$i_-J|Ak&hzXk7*%DfRg0xpr zkF}kb4t^Z%rbYWQN0y9G%C&Koc-zpAUH7PO{JY)4x3P-$J3jlNlch#xybN0)(Z#V; zIdQsT=MT%)NY$KoQ(MTNy%lK_{8u-QQ&?3)(&@V^?d@Vkz0~@<#&@OeM+Wn}UKVHE zbH1~q!r)tvTT(Hhix0mESbIEL^o^K4MQ3q09tL_XU(PSzu{e44>ko)NNT>CTG}#*l zw8p)Y+C~l{4%VB54e(|6Db}@Z4Vo^Xj08e&57ppaQSqP(K^gdq9<%-m8?EFhE07l~ zuJDvWhC)NU6E}2jb_UjW@$uvB-1h0WgEZ^V0C6ds%ny0qm2XeO9&^iH{0yREgV_U% zf~{_ppfq`_m>kzb z*-Lr+6i8JV4i7`bZ`yiJKwE%sUK)U{z%K!Uh>h%v7vWNCk$d-UB1_N5-TcYXL7u%8{PA2PZ_J;e?@hNEa0=B+8e7|FC7!}7NELXyY0Vl$h&d9H6u)K zl}_peWDDuey&eXg8$VX&KnBOhd~6Sv=qMHIj=E@soUi&;=zjLnFzd~BWES)TCczw-Z zy7*LJTNO|*XERDT(X`x>@6#2u*nw9h9B?cOx|#F^QI=Qjpu2>cRqv&nv4DO!Q`V98 zCgAr31U0Ty&(zbshAXUgIkI+wSM2vLp>ez!1;G3c} z`p*F6jTN>2<@XGJFfXjqHFUu$GhAW4_(z9^{K-v~&*00nao~Zj0yfm&&}Dy+FR0mY zeCDI#ta~^VBR8Mm^k)sD1QuZ1Kwf?V^!KV6-Y7P8D{qEl{Y+Ji7U}^EFN}ICirg#+?pm*UNK?()H4ITicJr4du@SG#_YQu%iI^=@(xP-e$9#&IGEl z{vvsH3yTbCwtNuk=x|Kcd6``cQCZ~R`SD{S6xt%4QHJ=-%v|C*t8LLqD9*`#gL*}E zJaKz_{HBl>oEcwtrZ_c4YG?dnQ!%6T}5mDF|6{s z<`N4t(q*YLzZ^LyH^#}2!~?deu3tt-zFYK&l3U|}=YA5b_()iaLBgQci#N}j?dz>N zCpk{lrtg>|XJY~$IBR@T;`l=15kB}`LTM`Uhg{GU%fu)2VIfu^3JPmcFz5Pg*)jd3k^Ip3!IKin<9Zl`;xud`Q61a3&nQ_xm z>k+&fAxskw)dD=z>SZ%#AF{NCo7&16kKcI#gN=!vy>_eB4c?QqXdBwZMN!y;X5=uS ze71A|=MGnV?C%$ux(5c*f{3>WqSvK+W2M8D=w)>N28sG#IGE zF90SUBM3U;SNQN$n&G$Dw5`WcCq=4wpFvUvZmNoygD*h8PBsiF^aJFwT-4C+wc zC#HbUhbKTb{VINkfQEb$SM<$;3%8xI@%GpWg%<`yf+y52WmVZ4f6DR^ zg$9L=@y%xN&IIk;Vy%ADg1^GuTSs<=w2L!gIaNjUpFHgi^IVf2JezyOLZ3X%xZJSw zv@THQ2a}xWi{ZxxgV34L?&YoH zGi0+H7e$JHSkirrnLHShIPck5#?*Y~R>D^9(m!c=PxBcotJIGGW)_DufYO>_$A!Ib zDN_XST20duoO^Jky*_KY{Rlj`7jYk8dOa=q9%rJif$LSnd#1T1QA`h!|Ib~ZJz;o{ z&3YPC)~I4D&@A%l9=*|6=?k0=GZ1MZ*|LY}l-C@gJw4odxv56q!{cr^3}_GpCC8ry z);k4HnO_mk4+Fbyx$#wT$XqMu^ip0$RAzuu!4py2w#ghTNJI>zluw&al7#u}*O4SK zw)OkP5A8&Q?(~p>@uGhoE!XK(%qzGITaxraN@CI&fmth%LcU?dk}v@sxTy;SJ(S=N zf%!o@>0_ln;LnF~)#nTOlU%_N;Q;sf#1bjuR+xOZ`Gx754hw#CH(=MXlAR^?&$JSo z9-OH#qZzy3FHwq3em&iOQm?JS3?M2~2&e(uh!OwWGR`ThS3pq0+THbmP>wF;W%+h) zDmB%NZxSKZ$mT-O9Pe?!l0Vmdy!ariok+eSe(h3tu(2W@;Il;yIz<=cB;_UhT!yQ5nCjNN6|g)xJFCPAh;b*Y=?mWkMHlYqOew2glQm566;4DP zJ=Hf%u1sMhj6Qx8icqTao`{e*9Qe$%cG>*+uYlz0cnGtZcSDGw;Y;PFIX1fLJw41l zi2wEe4ct~V{xC&q#Z^FwuX(tnp909XXxqeWqw4=u(3X8wK${XrhSZEd*sy6&B_d3m zJtw%|a3(eCAbRF&&$@cNdxN^Tq z2%RN)MovYVxP}zr4Btyk1o`25q-$T(-PMkwvctCk2P^`>9Aas*1U(dTT54R{PRJLJ zD1t1lt^&CqMwTS<=hV+tBrhkBvJ3a28v`YNz=b$D*iu$XWw~)DIRkydxB2T8w?asJ z-9}m&pt=5!%`w$^`r~?FT^Z!&y@*D*JOa}0^QcAx!0=!BC3~?F*f}h}U|WO3;1&+3 zf*Jojg`sCwL8|He)lHq3%&7sLj~>H{&xhW6+$<_U7c6~mjE*BS$R9hu4|===%r7qn z^h;c{=a(&B7IdrOdOzEl&>8%`%WI-M#wI`@cznI-Tc&PbsKn2PZhE<3RjBi!KD1sU z6uiHD2CaIU5C}!ML2peqC^Dyl&iPO?RV7X+SZ_q z&Rk->ngQBo?>zRXEK7Zuf(mB;rC883zgWy$hci#H$kW^~@5b@$_maQ#ve3?mvPy%{ zv^e#n=x*6&)vjQ9;nn-XyQ(^^FdqohR=VC!&X>n+n!u@a>c96vHhpL zfcQZ_@M^zie(l#s0dPd$hxhl|LkG1#@9Qs)<2aI2jsAW6>uMn7E(0g$1W8%E^m6`k zgv~2LyaQ5mWz+=U6997`g1Ksxg{liyMTJrdvmYX55Z?hEcOGhkWQSXsbyztZL9Sb= zk}T7YzT{8~Rwf^-tuW#+fO8{d*icOULy5{vPk_^SS}N$#_@5E}t$R@f?T1!Oq7sV= z#3&Q>BEY@x;;?Vnuir_L#l17mGr8(zMcP|mwNWrJk63s=XTUfD@EyHY;@7&Qp1*)R z7=>mc_hz$fZ85>Qd?kj@4ERh`QX_=_fVX-`vS9EE7Sk(y^8b9YObo6Lfq;@{q#&p@ z2v>2-U?{sejY;S*%8f(8;1sC%)a|^HJd+H1eb>;xjg}AS?JwvlOWJ<7Jc5HoRI6$wihlqr}&Zo$aG&-bL-RE0gzQb;8xOGd-t0BBBB7?ff_qhWO^0A zPK^%B1Yq6ayrzEL>Gh=VCOym+po%-Hq$fYRgacIJNZa`+?asR~&(^R0KTiz{F z8r}cO!Km2|Xox9Nj?o?ry*}8})wdjA7otJPX-5JZGx>c#n*wN6rh0y-;yl zyy8vs`GNLY;Pu8j9=&tYG{2O2e04U!mi+~I71d6v%)KnkRVRjI5o?n^Tb}{?Vn!QL zP*{O>Z(Mp!!WBkzf%C*KDre`CV_FI2VGiN7U8f9zs2zGOywWqj<{Sb0Kr2VD z(*OCZv#%3XHDrgl4(^QlDV5q^Q9Bep*|v+7_}cV^{THPYr^$Ki^2(Qwa{f0GZksjRaV3cm7YfUs16ac2)lIR`U<~REdAc z=ILGNOde3lpihRyO5_$d6i50NUNU`$y;4^)e{P>gLen|CNS1MEtrezi9JdJiw(zJC zPK`&h<8PFLeu|ATXbfrTJ6PoMGy%u30`?`)0V-gh-qYB|=Z784Js2FXJm|z|Mw}NL7_?X&1v(2~T3kgd(iOA!j{(EJ@45=63-WagP1EAhy z_fl^iKT!;;F@I%%w%}}c;Y|j!FonmLO4yknRF0`5juoc#t0O- z=n;W2D+B)Kg6~V(aoK!d>V!12Vp*+h1%2_J=N>xCeK99d7n0!CqOivBzy>+4`Y2TH zsjI7kalr6P-riCl{#b)tT>3Zd!9+VmFo`}7EdlSrnSyu?RZA+cjJ>+O8eF@8X0_;H zdQ>CekkL45lpaE#aig_~1Pz(cy^D>_46gx^XSw`_ESLKN3;3P}ll9=(Z+x?th~qh( zXp>qCx6Q26(K>G`H~+2Gl-p{5WZh$f(3xKy7jJ|gr}8yRKN7pyFY44gGa(+`8Z>H9 zC8|SVjL$gDomvgY`B;SRN;khf&G^S}IeO<;*E7p{;$$yGbjPZ%{$vsxYYTX_s+aOH zVTbQAUiWQa{tHeo#t0g2=Gy*@(e03EWEc2Qy)5OK+*F9zgoz#tr`5v8YNk>Q^*n?v zEOFS4@5&6%x-^!cTURoZyv<|vZ@+q_xub7!Mx=)Raacm46^$8Eu6Rgdi>(0AdCIEJ zXP<@c(M8RI z|NEy_X-PvQIPg`txrrjl?yoxth6$dV)Fuvq@CeU9bzFU#xc;i9fy;aT{iUlZ9K(BX zOc4`7-Aa%j{nO3j8>U%+4A~CP;z4j)R(dDfdc_*x_@+5ycZ9jgULU~dy#gf#>&(qx`5h~cCzMtHn zk)b!jh)&>ptDZ`R|Ek;*f*FDwO5*kqYxy~n@>mzjXNsVzMp3$ehjX^v609i3B2S-I zs#YGyL;tfwm+p@cIsxth`sEoK4Tv}Td?2RkV6i)8DZfj}s=s(H-~&%eXi1g?gK6k{ z0k@h7GrWiq$)Eoo`J^rtB;J&k++n+iZ?x9PS63JGDOY{m(RHIP*3ca0 z1G*#u`IdK0FWoAwgB@P9SbN=9Y6Ng*mtie^-W}#RUXwAt4HS0SNK(Z-k+t$>JZk}Z z)f8OYTJ_mY zMK{GyD@gAkTNw3&-bBXS8YO}->&$=mS#hY2l*i%k{=5=i2HJN&YP~y`A}{gFUgd!} zMIhB&{CalSd-~Y_9)P=cB*u5uhL=Ny|BS?ZWd`3AgGu2K(M}|kbPJ_4$!W{KcOO|E ziOa%>{YP5g(d%x$Q}xO)Ns`!aDt_&d;W=q&rWh*7xox{V)G_npIYyZ{V9+A-MOnG{^O~JzDuBn%)ZwR!uT%Ei&&+<4I zP)V6$Jzl;(ht{n$d$<1SWC>?T=65C1H5nut@NhD!nrH*;B96WZ0EtkksHZ5buc#0` zBIfR;K%dU$yo_{wa=DeaE)k2!gkR-66S}qGQRw+uN9%JO&9|N!!S+=U%uRY#k~7l1 zaZUfsdExv@s3tWUV|jOnSNxjxGWRJCk2*KP#d$gIE#^O1LWNPVY|iERE?Xk?i4wCW zSa?+E*d)!qX}pQAN;PD56Rw^+Aw+8YE|jq*1GT^-fikW?qg;+~VU-bYe50W*j7Cq40To2w!YUOqPy z^UnZemtP<|tnvm>?qY)I-nPZPg-^rz1SmeCeph$mKWt{@OwD{E$z94n)!b7Fy8H~S z3qytM9=jGc*OEmy0nNQo%b#&&af5Fng|I>>&T-V^u=?(7Umfv|?ysyF)>8o^e7f&% zfX*o(`bhuZabk;o4Bd+KK`ip-d!4133ecVyJ&(V960tsKoRQKuQ%~Tke;Wh&AXSOR zlds&#MS4H-hGs!1Z8YinFSu>>JGivOJ3ZdfN!9aOXsPBETIgPS4O4#^J&MkYO!H1Y zPrb}pE3_(>$w^09fWdL7Hd~sm^J8b5)(UqVs7{n2NlpjntTHL@XJ0Xj z#uLSlpCwj#YBwKn)Ey=mtW7lBo2g-%U3bStr#Ee_9i(gaqyDY0g^{NuuJ2f4shh5a z#I=-QV<~*Sj}r5@jfAqC9|%6w-zfhw*xB)Zq=e3?xANG6@5Nk&`Y2vp=pL%>v8OwaZ|r@P89ew)&_-kZr7O-aQ|htc`P8v0t>= ztP+5CWG`f&6$r8cuzX1x72f*s=s=}gt*mOjo_JKah_e&;Tje^Gs(9leWKV;zf zc;ER)({bV8>L^PxVo3Q1h;I>)W3*w(n(-X}F0BQ9L$YP;%6elFD`>x_JMpZ9Ti<@g|i`@>Vl+0pc0K6rY#&rG%FXzy8`;^YtyZWK}=+YD2g|s6(i4sG%mTzb`(@aI$hn zq%-Quo^YEt&}PwXI)1)EC~jFiS*80)2*00ABJ{{MF*#)$Im{LP589$ZpIobvVK~AT zMoD! zSEY;mc#Sv*Tk|UL|D1yFsOHJ^G>7aWvO&uleR2QYFlEGL0ZjSR=Dwb=Ir1Z2OvrQB}f8psk>shxoKB*T9qF4+x>WU(E2EO7Db=qa@2QsM_#k<3Ek8 znn+rG{#m1RSsC=pQf@n&H^pt@1!`)eVU}rX6R69TD(9 z#J(6JfUc-JRNj1apaaMrmY6Q&C>H&~%9w%4)4FG~!8E{FcJu=s;Ogk0rTtUXk9!$3Ez8E&a26PVMvXRUD=lO;3gm`vFvG}7$lU9u} z7K!nGaIY=fv zvEyt~VIYchpbos0PV8#E=ilebiTWv29i$$J_j41Co>*JXk;y*7h=>p8%fy6%ZpK=B zzhEZ;V|U%PWLbmVVIW|`*KfsYQko*s5(TFIEh#54f^mRtlwzNh@v{mEB1I#=Ee z%2y%4tWKvf8GV}tLcDQozT8-7#a3YCK(%oBii&*E{M&fy0$2$2&3EgoQ}k zM7hcH#3Ub3`roY*Zy;te85e=|00-xSv+8y$Co%%{gdM#xMR& zV(U*LZeW1Gci+Q#P+*#p1`FKWN_#q0pVR+_1`8BkjFk(?X-lbAz*pg^#Qnvs>OsBo zG>|p?)w9D^fmjbEayPerLivV-{*D*;vi5OJT&Fkl+to_!k#)(y035g`+}C2Klcx7Q zAFk{RN6msxD6B#4WYmJJLs5Pzdb#>dMkpwejhh3N@Hzc{`#ERTKp18veq@`sAX?l0eTQE6`Siq? z*FS`&uk{$b?xO91^JF{W`u=8OU)rU?@fZg8FEOXn!S616g9;;AeZXgmRLU@TL$97l znGRKRl{_`un`;ZHRDc?JCro=q%;6OL#neBMOtYov1I23s{pPXO|E;MDk*3%+289mv zr3Zz#wYmwGNHkw_*nd(4tpe>IN&qlhIf1$CrP0@F_P^rK97|coR96Nt7dae*Z-y|21wu z7zRt)$}tIxl~jG>X7@YU8jUEq5+P6sc#RRr7JJ;9$MV@GaVtP^RlMyB$BPhE@_J85 zQ@hPYUNqS6gwJZ?cMu3RLj(CBX@pHU!^2Dx(S@UVFI-8X|B|UL6kwoDGnnTg%;bje z&I1-#KT^TVjaI9KW1QYIkrWxeoU-BPtFV?5mC|*dnK02o)n$mmVwX1SC*I5G zCZ4$fn-Vo30O1p=6UAQOp5^nJT;@Pn5YDP#REc7q9xC8G;&T)#vgro*HScIk(sjyj>pBY`EB z!N?xNw4H}5y{(2eYg z{ckP(7$?U^#CW)$X~;D;R4N$cKjE=5v=+ao=i2B@Y^X-BYs&$v>v79n3icE;_q<^{ zgVhO@C|imz^W+v$8TVGGHI9i)xk`VWwI!Z5iA0YXoTC#!4U5Xj9Qvv%vFQJY(fQt6 zkCq8>`qI<)SyQF!`@Bi@&?gF$m`BoARfTo5tR@6}sBa>(_RXGvI~dLrGVYIgV!*5V zuw$9T>c2C2Jjec9#FF~i`#9m|@qAc7Q$5Iid|x1^`NAb5u2ln^(sYy;?i|LYsPUzE)qRHvLI)A6!?6fiOXwpri6yZxs?jV1Im3W2VN026aY62GTBDy-{6&X` zh}O-{x}GZ>sEcXgNB7HrVwn@_20V5}({pPrk$ z-}=D7Io~e`DMGZ?X0M6f!oN)^7$t!6lQpmJD_ZL5(e{9%Z1h5B*fK9(H2WF7TTZs@hJ2#9zh(QvlHTW z+vT7lygZBw74v?wz%dTgVHW-pq`dDNd4OH+1};rgA)?f;J;cl_Sl>o|i(|9r?fXol zu=$Ikht@C}B}IOmXtq|*tBXwjUj|#Bm(eO$0flTZa>6{7Db874^9VMF>`k1GnJnTwoAW*J=6!AXg+G_MjCQ{SJTOUiUsoQH@UaJ1+`92^k`R z-TM5tIIt)0^$R%_Iz@a#@7R0Kf`$hGlI@)0)qiwL+>g-1Q1RDGi6v0m@vVHRc3}N8 zz=5TMmwWLwf{qD1u3o!B0wY%7+QOVk^-J(E1FmTA=tXf@{i?qw@%K=6 z&zYv*brx#bm!PXoUsq+)V_&Tep^zS##E*3Tq&%}1&&_v?Dn7$2-iv#tRYZq(GyWy7Dc3(~(9Ycx{}8sYr$6f3;DtK3Kr~$EL!*yxoR_O^ zm;| zqVGM}iF;Cz*9rFggJd+DDPUqxG!*2iWI#q%DNO&X4{d00-Op4?#f7)xUEDHVTJ7AN zzF$cgfC*H#tq;kQ2_(9P^W=aqSE!Pf^mp~_%Qq>S9jMFB|+x)BA zYsB8vRaRKpe7wCZgdOV-^o&wFY$rZvyrXRn&o=rmKuo*AmKbDFI^yI7dk$Yo*MD&| zdi`+K`DR^C{Jq=T`pN&8A5-0J2_d*mk0Xw+UUrQ|$cw|czQf?J+sscw3$9Vc`dEnq zI}E7J?CW=gDkuVpFJ`2~Ij}NK^#OGTIxL~MBw#H@V!0?fde~9-P~>gvn!;g{-91rR z2#JHy%ljlgi}gr3$ds2JqE00WUl1$WEY^%6ivi^IBomsh@^6U*E=sSz1uGUr;is2w=`9&N~iw$VS&@HWHZo@ zIBIiH4zp%FM9$~+Ds4>d_TTX~E6kLA8Bcnb#$U4aXxcqOW>u#$dd|ZYZU1#L=yGgP zTCBAB3)i0Y6pIB+f2p*5A+K8~|D*Ct1h`ME2+7+i}v>{(76Orvv<+2`t4s@RP& ze??_$G(~82zvEE`cvPw<04gSfvz-&oqc;isS)|V5hl}!;}rZbtWZj=xE*Ym9oBvi&Ee-2D=}Bf_|$J?LL!T^owQm?#XYUR~G~HvYk%IJ5bV^rWU*a!j7aggE)|=+&G zq2ewZ8s5N3VZ%G@C}Zat0_7U3SpTabU{?2ZgH^vSvVXE%8WMi_4TS5VNzVV?crS|0 zynBYBI~DI2%=X7Qo)F@uz)IOYbI)H5m%gnT7h#e@McqK^In}QMJ$zMmS05gyz3%I^ zqKE1-^i8Y$YAlv+@v%yzI+pllq_y}tgD{Omrzk0ao^ToGUQ!Lh1_aiPnSZqcQliPC+Hv_&NW-;q=H=P<+WIR7p%ps%s zl)+uJ)`D)6$Ma*wq5miKNZdXXs%EIh%+6@9NSs3aPo$r)P|55u8S;vYOkr<4RmBjt zMUjsKb|1-@f#z-4jq007tNhalYw8f-y;zjm4{J-2J?{ow|A2+Z-BoK%@-4oM0l0LG z$6o~rHitt6r}7I*G|zk=d!^(vWYKJu-fM&~m~H9iZu7r6@Hm_fQl;C~07FCqr;e@k zi@os={5$Px{H1xN9~&dh)5BVof7hsemHDL|b0KHLN+9%Ga$@0=01VWW;OZ~726GLL zR&^sm`XF0z{BXMCTs6qR^HL~6X-f7>^SNE^#paT=ZZEcQFI$!PkJBt`3~e)PRS=2C zB#Z!PPLU*z=Sj&<(X?+bzTo}6G!tX}4dje@>8D^T0Hb33rixV{xY7t2_9gc&2P!Wj za3=9MYwEb5#{$2mVd@P9VlZjUCPmFa^IH81xMt4#nL7+I%=m6;*Dm#)&^T;pZL0QI z&BcQhz}xw?#xYo0*n7L8s8k}-E$}J{p5T%?|4EQrfR1>Uv#2Pd>!@gQ-ra7_8IgVz zuF5!ErrhF-YfC6mrdmZ@Wzl$>n)vRwD4!rW_3vc!&mAABdtJtEx!UO)tLX|)52>oO z{27*Gc(#_ffq2e>BlWxlWcEfC%kc%7<*8sTztI@q*0hBP?tm@DW~vWSmQFf+^^w5l zt)%PEF8}FtiMqD^0uHmMS#ps=3#1x%Nqrcpq#QnzlEA|h$d3M;4`Jb4`=}A0`V2v? zgj~fuU8)Z@R;Sw*&tD%rs?#Qq2Rf(Ol{9E*Xkye9&Q@6xi#UT3UdhCsv&EjKMNerV zs9A>>r8)9+M;uY=h5PY43jQFDs4>o$b1u(S^L|dpTXTKoj8%7m-)uGxeq#FPFn&!~ zCeeK-Jia;(!9A~jjRI8AcdvGmXpki9ZHQz^Aq_q&j z1^x94f^H3z2?}{>_HHY0Mk=&XrA9uPyMzZC+#@H>g_kmiz4E)hnalAH&y&kgF`Xo4 zN;KErf+lu?bza817FWAK|Txben)Ykou1^iz@NgDk)=A)^spp z1q=-qoe=@dtgG0_f}M;aS|HXI3Xr(HE@&b?R?9)KU!Lv9zstjv$W7(HFW}C4FJ9iZ zDJ;zc>?aM#f~X5tlQrgNh6lhV@vW(1zp?8arG9XxQAwI4`v;KZM--P1lLtLI6y0B% zT$OrXSu+P0i5Mv?iHJ>4LqQOC8FLZzND0_0fts(s_jojPE6mgF1OeXZr{&){T^!^f zz+LE(E0l4|19U}f(cSuR*e{%ldk{!KnPPCVU2l}SBK%Mm_FdeMUXbd+n|Ct>|LFIG z_j7lQ#w6*f8yJl;B$>cop@RRPgI?xF>bA*ap96q!pQIIMCfLRbh}eTz(q~bB7u5*m zn$6&la`#pF5ADLicp! zv1J~*eE&-odMZDxa)8-Vcw~6OAQ$ErJPH-*hEQ)N0D$3&p^JxALno-)8wky}2Z*%upji_K9DV7MPe9p3f^*nEpb?p!I{6Vf>i1 zX!;kGbeRPG@W^jwb>E8z4bvAgQBzs`qc#R?oi@$QUo{sVUH-llcpaU`fIqX{kCkKJU(4E5|TQgPART!rla78!)0Kcla=h_LPm zVquF{o!qkqe5Jw>J(z;OJD2U&fiLJgPN$d)`GjZLTNsHQ^TKTGBjf6Akh7Xpd=cJl8VCNuu$$h*3*!vF^EI-GZuEHr_*~>F(1Pul+TP{Tk zDm_&eE8le*ka7I`Xldnkd>Rz?)KEl8dFCD7i_apK64?xQwk)at@>otqDN`cQlSF`? zd-#%jKmFIl67;zz@km3kbwWdd2mUm9xyD$h%=*kVG z6B_j`Zew@SI)%T=V5Z+!X_2Hn#6|0{spQp*0GOQ{S=g7g;-x=Qi-8j4+YN^Ujw7#F zlA~$%qa!_Ddfi+sq%z`6`s+s)?Qr%?t!6?!yegm-td2ZVCzwXnucAtNhC*;OllC(m60O_qu@3xf4BUa^Hng30lkreiK<@s&7@bN#LGnKKOYe5w%dDa_-#*YFydY|tO* zL6MEy6P};y$8BBUv7uo2etG$q)F@|Y0fOxnWx+|eJUhz={iyHElGqP!;SfGngm0^{9!*GK_kAF)veWA$Wi0TS5md`-f4dHqXA#_uK+tjXxGWrl+#ANzdrk@ukbCpRc8$ zx<I>t9DX~KT+9j-8j1YX@bAP3L$uTSpO1!IR|%dv^R;JgwKgNeBf`IiOOR{X z8z@!#fOj#p#XrkayG}QVkMA%bO`YhYlO2<3heiKpK#{i)PIh0}9Yw{pts?;sUndUS`TUuW~=YqeiV&Bs&80c#(2E2$yYT zv0nfd--$+Gvrw=4@r#n5DjYi|E`T@(zG;rad+-oo?L_?Fg_w1pkEc+m36fDBgL|eV zG~Ff$d5?wVeB>Wd3K`lVQ-0o>4NS|2jT+2XU`yg{#mhA?-o55zILffNx{Y#9!@9;Y zdxJG9JZ$vpSH1BpdlQ5avGf>Aa#7O#grlp%M*od)_MqR$9(>TfFHYXopEu%)mL<$y z;Ag-ywm3|qVMMXnyEg2-p>PKyYL?6QSbn5WaV+&Jzlit+sN|L#-*U)(Intiv(&itr zH?`WAY%-B!#AkK;J}~fALx2kP^izwoR?Ay5Z=fFaRY&YZ+LriZE_zm}O~?r%#uUW^ z7chk+nYBe}e!Strtx?d^h zLTN8HeFrW4%Jq}Cx_W(4fW7*p>&2_i0MEW>IcAivV7KrYs+HwSm6Eg&o%}0t#U=%w zq*qkNM{id+2Ag{7X2{FCnUCRXy}duzG`eGI-DnR1ca}q?M(lhv{@Jv|zu~GJVh@)IK$navm9N18FL+q2+UpJ>YLFt!g^kc8F2jqWhq#QoI+{ zT=>b6i zJRvB9E4^5T|7LzA%L?%R5hcYj_y&C4TtgrA8GKkAK`*pH?Xgz`|LJF~Rb~ErQ(w1v||v z08hd<3ms$ey(Rm6Jp_*~--kyQqL?bwzs%vP|J?hC)qd+BP zQt05MiwD*w4r!!|f6*UiZEKRPYVoBU=16q1J8#yY=-T=A`ZH6olSJU$8UAy4x)dqg zEXlZs(Jzy)6(?{1iS?8vVzLm#o=lhtSiD%a7x%OKSLf)Q{!Gee>D}`ER=h=Yt59b< zE351zNx;iU()+&=@;0+&viN5p)roZv=S-?u;BscoSxp;gP?d#d`Stbn=(odemTAW7 z^lWw5pY>G?srxDm(#?8Ub(`N@U{G0AJ=*D>k8aF*0v`{4gLpu<8;p_K&aRBg1smXSY_R>q%9cxJPc0lM0T6PGSHrP z@3&iau8v1Fn^ng5Z}gheluYeHT0peIW*dyrv>NT>mx3~`nvJ6$P^aci!9kv5&(dvv z)Fg#|N061D>j7ajr)5JcF3o=tUPik*wsEGlo;@l}lmhYSDB20r1F z-ihO-LmK}<x33tH0ydVu5sxoK5^iitB*`Z`V!+>Go``(NH8X;_23q&&DCu0hh6m zQy^PIQ_O>$O?U-vy4A7D*3>|yCu#_f%IkCra2MT6<%!hOxE3(=JZryYur1HYuA?^qF7NGi8j* zh1V5HE7qM7)BRGqBlPnt9Rg)^o(|mwmyNzc(G9PBg7hb)zfh_Q`ZyW-63rFqc%j$n zwgM}v@kDJP7%EO#MI%4^_(bMIugfUPuXNY-{X?@}I?Gvbq!?dnW@-dNUXsqT14D;w zmt4g`I=8iWtC7)eMoH70{y zrhlH4Ob};;wRpKvPe7kIB3v+gx9MW{>2O%88!OO051C4#KA1;N^4!dX#b2>1P^;YZ z%vNohaOoiul_&}9J58j-BpTwfPcK0WD+Yg!8esfXM=CVTld*2QD-WhR64E| zpH4S%<7X1`vjlyoxj%g?X|9fO8*!Ed{t;hVB0(L@WqW%!I*?AEOF;yc+2``TlT4(9 z{X=iXsL?NNIi>#G>6Q2c{aoezYG7ORIy@>sVS_bt%(_%RzAPrLQ4{v}d=Wz0V(vBo zx3*`CEUu2fv|83(?umCzNR_o=tLdlV67HvCDs`TqTry1mRBQbMGF$ttZ&wdSZ)idT zL$1`DZalS5%uH=mnxGSw6ryjAPyQ0?;@8viVmwYxo<)Hob#Ig)9uJP9vSG-d4dp3) zA4CrzzzQXCCe;fD)ivq}n<#!)q+Ws85<^3!Jz=1}iv9A7Gr@DTZuay%argTpj<7M7 z*<)vpW>P{b(X$aizSt?mm-Q5icG*78-#8|Re@`p*S}Scg6@!F99KhMmZi@v|)BP@$ zo`+p7qPbZcS7lvgd(ZWSom=CgsH;+cw&DxTsoV$F+BqOi6vB^cK!tS`R9eYA5;{kw zpzngFSk}n-KE+1h$h~YodY&5$xrM)K!ZPf14`2OMRUC)Tl9N{4tKk4dii5;+6*6o1 zBIcNWi##BCcguu=Iahl&kka5sA33CH$xqdbG&u}Z{`liE;*XR8KwHtDmN9|<+>*f; zSP@P!n#8wd5uiXsNm_8>j#!J_7g{TdTJv&iS@og9xtffMpMpv_j~2mhv@^G=^UtY? zPj%)NUk^PTcr^L>N^BNXxaTjQ-Ca4ek%q$%@a%aDW$~+{`2}{#Cq|osfeZYjE_~_| zG}rnRJO;n*ow2t8_@v_tV|`EYA`6PN8y)ttc>)z-*)lp z_&bhQYwP1?-32sVKaW|uE+gi-2|9MTd2Ft^H)f0}VebmlO#6%H*$azmzc>?@mZX1W zR^khAJ~V}5Wa02HO7h~?qVW*%ObEi36;OwTjN3x&lZtUZy+b#aRasR)elgru9M2f4 zAV$)s$k11^oh=6*Y1n3bzmKx%osv$c9b)258BfCDbMe&?OEjMymL9yu)&(;0BmbS| zrb!qV5VwF@NcDnk%bjCMTxB)ZVnw>EBRFmFqudg$ z>4tPT5A}uqx@3t69HFX7e^@&zkaWjy!=>*#o-7qfc!qD3iMhzr+>L`XtlXY=uNf#D za)~mY?Yy7cUwXFuEMG4(dZwXWeg(v%)F7>sWObH3=&P(PVD+^0N)?<(vOc?pA$;@8 zsFHtvEcNdD5!HM$W1ZSzl)LhnH;{0YgS3kZ>ha^zGs$aDbn>5tD~GG|p7KMfbF*VT z8cGCYFqc)19&Tzg$&HrpHDaCf1&(^7pzR-+J8vCg>d3An2h<_UV)HX$pUq$;0F(Q_b2McS5+$ z`X=hKYWZ9;Cz3TjZxPD)@)MXJ*%3&z1upP9(5cZv;M^jOmmsVx}v!|8LIPjx(*W zh(n)QJ39TL?5n}DKdZGyEStNctK^{#3*_)fzqre!21r_z7ffujqn%~2g6(J2aF!g4 zyBQEtab_#wT&)aLCz0Xr24TWoLlFYw9f^iH-Z>#EtV@(VJ*^Xe%mUMMxcR&owFYxS z^hs&1rzUEB3v<`YweNH$@YkSFLGB*?pDd--nq{`ff`XbGth8*5dqal{rC9!3o7$%D zg-V^sm_1j$@04f;8 z63H}y7l!R*2ea_U^~#m{yN9z{VBvh5)~S!rd?uIb$Hb}r$W;H&NzP511%IhYo`~iw z*$DnoMm{w3a0eT00qUFI`?-~OJ#*T=D7(4<$-uC#P&;7`9?*i9MtJLX>f_1s2P16k z8gKJK-V2bkB}pdghN`GquDQd$xeQ@phc(AqVm-C`Ma5s!RDP@iR|!9!zDJcmQuGmR zo;itww(;}ORBd-zeSk{VM1MP$FAp2#^7xm8HDfGu06-QVr^x5aQPO>SP2r61$nOze!%j|{p+?(HNeQQ{o#R6hLVJP<%0ktgvWTfxXIl{xrZ+( zi;dy;p{z4L4DJzasyRGeD9U?ZY!Pi{zjonAyf`n4 zgl59vQFVkeM=f)~QH?QR(~bw5Hj}JH#$Ek-a9P`TT-dhWF%@_s-DC^^p{em}7n~4O zE1lbHZa<1h_|4S^AD&Z^x()MgbyVRIv5c9jY`O)3%oQ+4u=gDBMG2WvuZN9gJ~ACQ zDZ^pdUVz7E(;JQ-v;O6o=zvz6$7=*ClQNtzsF_^_FUy$b1C`AUJ?r#+Hv3%VF4QNL zGDebBMGoS?X$P_^e#-IqPbCeW6`Ge_+bBU3oFZQ+M-x_8Y6KNeZ+)sO-! zk)zy=?W^<1E60vU7J?_6Wd_)zeY{*+6q#Ep!&o?@ETlgBf6l@0G~N#VkY*}kq2B6Gjug{PinG`3-RZ*#L$vhs) zki;j1SbC}bMt}ddmNDKy;RkT)lZu@EM-K(wgN{fx*Ydh*gNbKkONG-S@ajwDFdPO6 zv+`CvheIj;?~jSqYcfOVe_Q~zy9fNWJTBbviB{>uHodK=JW8jznYQJJ!{z9TY9?78 zd+^BtPrmluM?$u^A&-TD8-e{w8ia_Z6OQS!$gqX^u7C8rhC2#pF4)kFt8lS!XzuVl zoi;m<88qj8VwkqGTwx_!P}lePIyA0yYGsA=Ftz0Gyy}Epx+iP_z|sJF{wn(%ow?9_ z0ei;T;C6Y?nR+&B6_P7_LD{r_hb+qI)+E*USxjH_>J7_O%jLmno{F#ru0Dteo9o~9 zdv?P2qcgUKSjO206hmVw-*sum!-gXQHxiO|yMkJ5N@w9u z;%Kz;CW@!!>P#i&TjE+TzAMXgaT3?>`7IsVW3sE{uY_j|C~%XwqSQAof_`FLF+6;G zkZzXV*PD~+ox0e>GF!G;UIqK(xm227c$!{`G9C}PMBBMRYl1!RdfQYG{5gA6%9z~+{LYFq>!xv6H5QH z_dI4rktoA6DB<#y<-U;r`+)zuMP4vqvpS6&!O8J(7!T2xNRH@JhIM9lx94eS_WaDF ziA8;}Ez9QgsB>j^^5BN1#buwGHi2JuBTI@;PSE=8p5Kze2vC@iGeZv0*Q7Kwjmp1O zLi$ZUOlT;-kij%>x($>0FiK!?t{0tN`ZN;O0E6nrhc2lujIK4E_aWsOV-qM~KM_(6 z_E_Elx^{SROpZNSR@V2Dw9po6Vnv2uKO64NhO@K%T^N6o)bh7ph{=1|8q2RrLZ?Mo zVWFSno5|kAwn-Q257>v&xi}Q&8?%ZaFT-s)To`3|v?e>Mmo%`k?LzO$xBVxIr6#kV z3I1x>O)CvoKy$pJ$3*E^vvQlfp8fc3eymKoEew7y(?YWX#b_-W7!}#z88ZI4ToZX@ zYwS!uUZoLFehjWzM-EmjHtOLr&fA^{&-*Z_$83L3g&Ft%x_?`wN3P4)0U(>c1SSLm zaew8kg6^l76}Fw9PIW?`ViLT4A6Mp=je9;|dIWjY85T(XKK4?#toD9l{^>dH2v6-#;J**&NwU$6R*ttTr)_&%Rt;56~ z^n?tBqFQM=dI3ly=Jxch_&ug`L6{J5 zQqs1W^HcDy$V1{$!-Kh@u#~-3z`5)D`m|ea{@M37gTi|nytaVO@3`QJe&%@Y;NsZ? zE;cX9k?gv` znwen2NJp_4fEi!d*wzuNo?LjfaU3~sJY`q`D87D|3|R>vQ|8sE$6P^JE}tHZZ($;* z4Pc4v>gTN%RSfVWgi7Xs*>%Rg@gC*Tc*m7u>j`!~)Z-lcg{NAyQ%2>t`E${tly7?_ zW?LHV2de0?LxalSI`uk@Q*~=+VQi)0#0bSaISvh>E$eB)Lw)tTE0UT3z3LC%>tSCi z-9(UUFBFby(~FJDTZ^@r{&B`v&Gvs@ErBOd?e&)Z*7Qx$Il-Cl+B{dD(8P?}c4F}7 z)%wcEr@R3Eh3YT1=q~QGo9`k`_8b`Cx9jL0acb&PlRk-N6HVi)uoKhTq}H&8Yj@vz z_UC1Ver&48)T@DXm*}qL501ZWBRF#qkx)fg0!rBeU8;~u!GA$J4gdW?{o+CDIh}*_ zI0GJu2diVn0P@vvAi4N!P=Udz+ZF3yEWQ6{9Pz9crME@rBOf0xRq*!On?1M>~ZySPwj1JwGA^Vny%h z-JQ-J_2ZOyO6EfL)5RW`KmgkiNXrS0It-BOE_Fl*Aj7x|uC68+C+t~IqgJH-iS2xR z7O~5;LL7g8=x(+83?jeLjl91n6<_e>b@AHBQE%b9g-2gioV1OZ|yNx)kYF zEBcXtXdUNI=LLPCdF7)6*iFhfaB|Oij!b0ATnNJPE8Bh3A)F&oZmH=n0%koy1)J%c zdGfX8LVRv|0_9t6EB{*z+6hP^y#&a!Q!F;jLAGtnT8Nkb|9Y`C)64q)LNcY3n0!|{ z2rp`N?~{9Xy} zDl)i$Id-kYu6%9kG3C`An1-+6Hwv*SUd^vKc1`=+XGiSiraD#-&sAz%vi8S3tO{gb zE+Nuravt|e+!<2_^|b2R+Rau;9?jDveCOpNOg&wPJ@z@A<4@aFx<1}_Bm9AoS=4t< z)OU>rn8x8Ex|SItUQp#BuoC>2gTs1u0{^<{4@EvU@AIB@m^>zE^1k*fTnQI zUyVq@L{Nh|C+aPz=1G83&t`A0ZI}ZnU`@qxC=buWnxZ!dIGPmkm2HUXg+y6& zl{UVVP3=m;Q%oJaxhYQT&q2`Xnu~pJAKpePmvm=YMeO)Z7Ptxj&0$I9Z(B1rvCRMq z*kln%aUe>kWK8ElkJ*?(!D6$W-`%OUdF;U#YqVshs+P{Kht)IhIbHy$^$I3hWMzuu z_iQ_MyCou__bS4OgGA6gHTtEZRmTCQXImCGv(B}o{Ij#-l$=P-oOWIHtV-R&5j1v+ zg-I9b;>pfW;}P^gGWeS>-mFStS+9-Dbg?;OWR*>_=D6^$U#O1aG#Z4T2!<{Qex00w+U@q$2xT+&F}DZET<) z>WHKjZ7N@odL9frHHDr3?-Z-TXg6I<3IqLxg}O8OX){(N*#iRuUe@}oe9a$H`O!E} z2IaybFV$u-n+%(mx@YI#CXboP(A3VcC!&+{RugZnxkkTt3A%%5=vOPo-=65Xi{pUm zgR_7nTLu}I*1WyZZWK+=V2p2%w1`l3Q<@ZS)q@Q(#AyKJV!I-@HECFy8`_)=^loXC zY7@udM#uWp6zW?YxZd+{M0m0eCd4!C(MLZ)@SBBh$bea;^MsrIrUjcg$@zF(JGH}8 zmW@w|nqZJ45`qc=q|*gHjR)mEm+h2>HnMBhk$T(Q4f|3r_8JaNF^*d}uhXjH*@lYu zdsz-%vEgY81l@MkK&3)>I3sBpmfsV_yqBfcqU#dZDb^)yn3~K-TnGLPml>17{B9TO zgTeG}U0;bWzAgq!-0{WB4U!H%0;$9S#hRCk@m5Kwfx~Yzzs^93bZxhnSFpoYvecv5 zH5-=h%uD(V#;*#O@9dbU(Rg@z8DktWOx!JfR??S8lVxJk3q(|#i~VlTlT3(iLi-Q_ zT3jI^S=U-qUc_hB?MMG=ZpFin%X7l0E|qbmzaL%J z1Mr>j0)HoT=oX|-hs+2K8DnWx^l0(VZ+|wKN8SjyM@>; z1>_*qz{jT1<&8RGoLBp{cuy9Iy-)q`7V-N@%US$Tr9gv=oZmy?Snukd9FvJYBWeu> zWMwBZX3AF{H7PdFdEjeL!}zPqEgu!LZdFNe3~DFy7koD?hHJyudpJK}9JMUg?pbXRE|;*6W`YrV~x`r!0c@W@m0Wx75w=0ar)5o7JYKMiE=$dD5q! z(~hMdkNltQ#8|w~dA=QuH{tv`{LRqihtALS;V*eAEP5JUNlfKEP20j@&mJ+0=IUv3 z_-OYo!Bm3Fqt7_Y!;!T5SnMd$Pu!M$?!2*QxlRKp=dGC9o3`=2=_|ZJl@R9wC^PNH0lET;b6ojtaaC zu#t2zc0M%n+QDG$Y$;Nn;!9$)jkcf4iZ4g2*MOf{BL~4*`N76C9Of0rITw|t!ZShP zfr=W0co#2Ljw%ae(fQ<0v=}&~s1f2YKH|$D;Nfs9eY`+Fhc!joW$Ns2ji->vt>5vK z;3B;X{JfO0C=#FUX9BnT8{RaUrZfF1lKU@iE)V^>Wf>zvtTjs+xq~asZF|PI|OFEN~VGj2qRm~SL z5zVo3&P6L@59^AI zP#GNPMP-?81Z{h`l~*su279cYX#^R3>Xk*7Kg;R&T{C!GKX;_rtz%tRb)?)Vs9BO? ztWs-Qepc>?3Rp5ly)Z|8M}^P6b$u_mImtdm1#bz#jg<`hvE2}PbVtZMjf)-i({G|+ zR{r?Q<&x=E+HQPug++JxUA(Tgx3y@4XI0)&Pjo1lrE|M9HMUyAr2ACw7W0HzAGR2z z=jj)e9(E(X3hDi2n!7c7cyAm!O@{nw9}Qq zsqnbp@M=@Le}+)8s;!GUSI2GPV%{QG+ctAl0jCxECJ`1rYu{T&as*t-S}2&m3maB zLew~3^AnFv)-M>OG^$(0OT7uuvZ%$;bBR}YB5VF*|GUVt!Dp#C^qI+1ALGV7p6lbE zsa%Cn9_v>tvz^FbXi;(xMKt3z z3hW&2R#Hmk*&aV_x)Es8l1G!e_6yj3f-Y@VkH!AMaa|UK952Ul=!s&loE{V3cLyoQ z2~Mm&YFzE^Xnq+YOGPtN$Cd9)VCE7jCW$yQe}k1p*X6WKR53UWd)h1GXzfWFY?jgI zxhtk?e*7iLNGY)UG36Y4=j&q53RvQwUQT7(6D~0mc`*#5WaR2P$xY8-_IW^EUrd&3 zQ_nJkL!paave~%Nn>OLS__XCH13DU~U7{hQPDkY(osa2osnw5KcOWD?4ET*)@kPNo zJmNBx>W7)HY4E!YspEM91N)Otcp7IvYJg>`fE>ZRlxD8eh;-fg9>VTH?{4{?GnnazYi zKhC*m$KrE0fP!*iUtB*@90t3_W3AECPv8;fOPv^@;~maoi5F4kS2x>bFYj z`|^H%>ozNC|EHjHct~KnF4@@5t9O-SBjZ6V?n2D`pqj;=zj@=&ui(@G;3U_&lO=7O zmq@Lsx;IqED56*o5CG*^0-6l~MDg_JUORrIGZw72IAK8)?>)bKvm`s&UWt;~>~G6wKu}OgSX23c&fIQ_;3C)nZzFWB z0h0KpzQJ8~*!}fGudq|2l>cNoEPJT=-jV4h7NK-ve=5HYH*6o*zleWV`QZ;L| zHY$69BOiNdAjDr6>388}uS*p*ad05**J>|>ngHfp)sV@X34Xsia_mhUgaPij-;KIt z+l9u>)s&kti9L~7$OEqH2S^%zx1)8N-urJ~pfZ(0_Paubto9izz5f$IwW58(`~3@0 z;Pc1I?r%OVB|p#=%y9kjY+HXUx8FK~wB}|;@mVG_!*)>kP}paM__};YS*Rs(34c>z zf~FZ6_4J=n;*~R5D5h3n_iA9ry~bX2k8EEKTUZibbRlo6*FUNx2AGH>F=HSr-w6~* zZ7Pvf!p>foAk3nUAprqS#r25j9Ki*~-8#*!FyXTOAdAwSi=%|Iqp1%xgo43K1YQT9 zg(DVcS7RkI`!P_Hjs(Qm7Hz?giQb;fcoFV$A($H;opaR2kIu^1oUFFL1X9$9Fnm(F z;})Sa688G8^5sA0w2I95>R)Oe9ann?_y6Z|ge90|mk$NX5Hh)NgED*(pvhlaMEBp zDVt0;$Ltf?!8|f#@5smQ(O1(S&A?QZ!mvf=Q3n<0W~wKbLWlFC^C4+SN6VZqgy-c# zOk%h1I^ScApnZW9F4ut|X5LBo6K!%V3sf8MEh>ykm`t`SVMmlIr{JcTk3AXJo<^D2 zhQ(>*8VK=up`3eqm=st{X_hA2(S3Kty!EbhME5t$r`yg6H{$2;5MNY?J&;jN53;Ze zC<_grq811jx-rEM_O^H+Bq`iZQi#YQLpqt2LwmM6dr;LokW|PVCwQS8b_QLM z3hVRaF)Ps)x>`iVW96@g2S;U;RecwKhLAG5O*#)P|PNe+46~;pQ6x;W%`l0TDb zCN13j|A(@_jEb@g+kjya1r=pPR7x080jZ%BWPqWhO9=r24T6 zX(We6LP8k28+`ZN&-1MB-}kO}xt71Ex%R&HKF{Mk;#5pOH2KczPbue}y}LRyN>W?L z19v6!yqB2psIM<2YE&!noP%3Xb8nUZ-#_6@%@?bAU`)Tkn_rBp2HAUfN)3S@?u( zs?r1f=N{vm?2mhCipk*27(eR3{R4_tc8JJcgmuO68?)w3S3pkZ1!x3iRP}Ot2<_Y9 zxw>8n6MVo~i~fweI}bnOIfyz8v#Sd%JiX52j;hVjN8w|HaTm8Wo_v5@VUXn+JDj+!f&a9S_MGCO$)r4C z26Fs?ozaUa0J``lTN%v;QeBGUf1Tyl%&b`P!JG?RUG|v5gsq87>zP;c118Cu~ z1mlYx5VDi;6(^%VH4R?G#NGVW;w=F;hAU9-?GS^#Q)Qbq-l-kqUJVW@R6+Tme5qmc zhqmb*{~{uT@DvrL3317pXmyOnQDIQ7KSX|HU-Kh}fwnW(TbF#jT%Q#0uT65=Xtpk~ z4HD?X3SEOOqCJ5>-V!k!nZ#J(Yxoa#lfC{NUV#KLD-Zu{ciHvMU2CtqC9Dd+D%QSv ze3>{}-~oY~w+C4tbq{XaOuEm4Wc83?3qmZ8#qAr2%->^bJCXvc>i@X=O9^0pDF`4- zSO<{^&5FYjQXNGh1qxe#5?xIN?p9jhvYqq2Mi;xUK#v+G4hK2FZTSWwQLD{slf-32 zRuGjn5kWR&=c`=9O9sOh79|Nf{P{9JY6BRfdvZY!Vb1G5 z>qn~CMD$+F3lv9O1eoQQ5Cslaav^Ow%eZFpy!+^vCiVu(`k^>HI1pLg3CJbx*kUIh@j!^ZRVE)e^a%$e#0BEw8bptIi;U_2>e zsU`r5dA3>ipJycl-({c@_{T%^`6op5_Z8M>V-fdIfjM*`GNRipl#YZvZO0wK<>jId zuI$#;Dhqn{o_g#|o$9aW{fb9k0_;brV}}vEM`s^b{+nB=|0~26ZSWwvR~E+Gk1$Rj zz>|n_Ec*a4{KvmG6KE&2N-1#ya;DsmU#Vv=;E${yw#6#QCY#eK(1`Mk8r@_a%?eRT zHl6>wv@R)&3FKfFwG(=ioL)5fUw+lC(hm?;f!(OH{+<`ZqBqM!r6k(J=&fkkBDUK{ z=UPJ+1sac)Br_nR2LzSkaV93_OA+b=1aqGEzc1%><9Rb_D;8r0Y61;>jbohy!bC_5 zFd+6`?LKF~9E}PaY`r^Oui8BCEkmT`-<04F<^sd%+z3`FBuKwV1PF;pGYR}w|NC5` zKtj&Y4oDkQng-^d2`aQ7bmUg{*YDJN>lq={oO2`aE-~K8^wqVdrl@Iv9-HZu_(PK|+TU{z|V2B{ySjcBnQHYFZ!%~Krqc}0UtN7 z5delZ_j@+;4g{(?Nk>%w9GdcOvgSVJIv<(xtv^MU4M^LcBKmLU?%17nk|o{c4r%QXkc!{+nVE-#{Kei-i+wm*D57mVilO= z&@=Gr?|gaCF|(U|7$-U*Yi&mu#0<=75zkQ56jDw``Vhe*@8%j4Awx zQ)-_B@6d*CrkF`>><+k$^Qw7M&~vz)I}Js;_RUwb8CQXMOEeca;j;grDFh*iqtxq< z`hEMJNfR7#(m=Vnw+46tUqknd`?7m`T7c-j<>-TaR%?Bcai2l z?ZQap!hA4j7v9yPh{Ec*8@TOoLoyuqr&L%-ZLKL#FSyWt%qc5VtF5j5WtXenn3rz9 z{@#*A<5(HQZvWD%Q~y_j0KGcRd-vC+$$|&iy!n+6Dly7zd(NfP4VpH1XJt%3niTU$y4)VRoG9PIQWVNgu575*~EjKL*~5Z-iU#H7id zRrq0ohcWSgt_>aoNp1RQK`MGSog_ymn^iMG(-2OR5J|2(GLk@C9n;v#`uvM&GfTsi zT;b;3?=lppxm`Xzd`pi6k(YX3kN6LRIApr?z?59m1*($y@JBiag9==o1Z4;i$tRwH z?ZYpL8%X==zeiwmpKS|x9$4?nFbCx@JXA*@hi&!$2P$KYsh@eaBTR6Ih}$Xch&1i& zKKhj|3p4{~>aVj;=kP|2ffFhGF8VQz5h5nX9TT7X5tC_N9bIMHcri=tmz9ru*7SG! z=IC92mk3J-bG|^5@pu*xn5W?XiJjWqSjd%`J4Wldg$noJ#7vO!#bacU*PELEm*;^No-&J2^$sOB!DlX<9_;R*PWjW$<80`9 z`ao~qUeULcakL=0n2{1gJU;Q)ZG3*<=dTFNI^;BK?=R$z%aqeM#T1W>d%AIt1(eaS z$b;V%C5@8nGwL-1-hGKq#+(5th(O9CnP0+k*&;`&cx|UWNzq-BrwP(&JAgXOR#f$( zwMR6OjgnyTK&OR*^b7^qX&k?LDeXN_D&hFKcoI}H(){Bll)EyIeQp~mY;w`^FSk|z z7%1U5`*{9UC%YtQOuGNCG1=4zI`(Qm3fU%h_i!(LRLNNP=;Gn9!9Cyzh$z*Uo>D2U ziq`T<`OVx%Zd94JhB!hRfzyFZ`xurRn^n|+!6?QX(Fzh`MiQp~M3~e4sBk9aU3LIy zwC)(8mtvEw+~pllcsgafcvha14UEFFK80tW;Qo-BlAVuX0;6Ft7Ii z$&TT*;^%y{A96%#EDR@ek`CWw!*?j)FsO>?dHFFXYt+&S^K6q{*bMFC$0+U(ar>}- z(;IBlk^8?RVk@Z2^gs@@Eq*0Ez)R>><I|v6qW+QNUz%f?$$#AaH5;ZkGb~k|W&UwCPwOBEG&Ok5CEj2|R$7Cg;ph-oNFbd&H(l~svsd}6xtCt>N7=Zh0uMtRjN;n6lP8t&mO&OVW9CD|xag9`akIqu z92p2-G3!5%lC8g6bPXJY+YQE%j21o*d+~F5`=s7 zq&BbY6zPu98mcma33tXJM5QA-BJE%!$@&SrROb=UlwVbwW#J`dC5PiKhtX_=wmjlD zi_<>JMUtFOq;{#RjT{F<*OKW}by!S7A17?`z9Lh`^?Og7;TC|mi&Dnk{n1TUNV0OI zNVDInX`e-6r#nzyy5mh~tY}w#m=kqtF}mSv;&~2@L>FPziY5V(vjJuh9L;{pWWX8@hJHQ`xu53N4Ve(ao}m3lADz&T^h&L3LA(|sN8EE6F26Vk zZ%Ni1KHO6BiZjP!PW;}Civ@>@&K_l4Uv6-@I9^K3d2o&U_QzQW%Z}EhAIa?l^PU8z z!{1Kf$Hd!(bsOIRdud{R!7HKnWdb|n#`{}^gRKqS{2gTbl=p?Eg z_xp2eQdvhW!)_rCOs938>JX4XAR|LWbI`&66(dNj$d*qo`+v!=-GzO9UTezD=eQuN zUGL^#T(o&~Wa40PKYqkDi{i2L9t{3PcvbgqT8C>-U_w1>L+SUE3Hkk{5s_A`>=dA) z?3Hiu)B^0zEAs?Hnbt6ijPdH&+#fZV8Oz0a$F4O(G?rMUOnIUzAYWb4ejN8tA)rJ0B|aT|96+|F!CA3%B+uAr;}iiW`nyWA0uMp#DDVZ(%KJ#~1H{H;H%Z zy6&r}@s|r$OUD*fVj>#oI%ccGBf2x+P1d^{6Q#|#(>KjZjwn3?qcu`sL3lS> zJo!QJa@_1sn?8X9&`t71gw`E)nSOwrnXP+TFaWCSPzl|VBqBGaqU*Eho%LDb%#+cx zxLIO?vY}<+*rb2W=GuB4Z%3J?ku_tt{`F2T-pe;N_1&}LRg#l`?+r0iH`~S5ENWkK z<$k^JRui=|CTzdEYrVTyhD@wk_m)u9mt_GBzOzkCO?KM2qx4&XC4dTW>voG2Li@de6on1n67ls1H zm`jo3WmSyjn_Un4^n*%1adKB@)P8mwb_`D3tRrO6mMz zsy(oL`m#^Mkk9Hl`t{W{#qYL{KasF-sCk#47dqB{O<{GMv$C1UI!R!_^^N5rvW6&P zhpXstO1GYA3(P+f@Pe{lM6=nXhH^a7>{=eW2(|oY1^&@p`Bxg)01*qd4K30_N9ePg zYD}8^Da#pbG-@6Y!b*Z)OUj zp~$m4<=>gPAn?tAS-Mc-KKu9dV7;E&i^*(~nR%vay==Erw;^K6kY#iF zo|Bz%?&A-)TuS9?MB8Fyikp>r7LI{!iZao&KwMm(xh1WLN4XpTsqU_ZJO4o)yUU$J z)YGRAuzCVm;t%yGmMaY986=syYEo%8m3q=G|Cye*f^^;t8f^E2yl+bx!Mtz9e>rtb zkFJA>J`}}&I}+H}miM^?6GklTT-~G}7ud+~H~EcL9()sz5$1>dM$KT+R2fAr){`v@ zrFjyvKv2iy!1-JNJv?mnF~RJczle6nSxK6&}H?Gyd?^Kj?HaR_|1KgMQ0+C6MbK zaH=T;y1`qhF2;l8OYXHOm;iZe_ox5vyXLj4X zHWowzP%df0Tb+ztP*7e5dkKIZ7If8Y;ltPQ72n3-S z#;q;Vv}DSZP0P3vukxJBGe1k${59nEDR&IAZatGUi^K#7t6*Go?EdeqG73CaVt23Q z!K!w3rAL>t*+^hfnMZQ_>saK8zJ%ALOY&T|KSyFcDscSsqf>V{h>=z?*!ALV9bqgH z;}UVyHn&)>80EKu71Zx^nOVk%aACDBw!?ioR`QCb`?BS&8*RJN1Cv7t(?TO;_y0VU zzwB64$`?DK)v{|+n+m22IfqQZz0jO8BShJ1&SoUX_S(9&$>Zkzq%wb?PzyB=hP}=bu*jIcAHfg)Tgv#eAz?!y=|%<*J6yIBj8$N5DA9A7S-*uj zv+{qVVt9My8j(l)|b5#0S#4l_!h-HCSRG)MB8NiE-MRDqihXg&*RdR%PtBY zk!9!efvXQ-zJpbVQ#O;#3M3ndqXT0Q5v#3_umGZ2M*kZRmKG(K+eP36rKPQBWpCsXYL z`~9s&;;UVl#BySP7qkBJ=46TeJ^FUTY?}T2E(01-LQY8gn7Xz%@GNx?Ovf5`?}_;Q z7ES@s!ek17_8oT1_SU^zCo4O@`PD(N=W)VJ3Nf*pk;ldRYHPXa?~fVJhfrIcrN9>+ z-H%nt9-B0r9IHMJRuO#;84DY>3kPGGZ1MLCl3o7K_S5J*s3C+Z4h#+mQ*+dI3Ca8Sm>0dRP~xcML>#F^M8zhcsQ%>MvljW{ zsM}Pp{;@u-`I~HEwiod1-mj|z>c5^SaKBW$IqE2-)^t@7=kp=v`VHaff8I;eGoHJj z$NQ2zH$9UeVdj6UdXhlU=;m)eb2Hsa?LA@MCbP)5no3aj1>%gd!<^A)J4DL}Pgq@L zsFGbIks8A?$}b#JjQ4#@qHPi?hv^b>-B4_Y`qaBU4DP)W>ZVm`9q*QRhn_;q!~m=+#Z## zJ(0-nFFqs?(FE}p^2ABpw3|>)LFgrIYPDbSaqVYDlB7D#pl@1jmPhx^NJQ92PjpBHY%X9_6^Dexl>taKbIL%C) zE!=;6845MT5mnqQ?VyhA{rmH1>}Za%+qw7iEcicpr5|r(TIm?tJ1P@f)oDV{jkh_F zT_+(IF8{jpP}dwyK8X5g)%9Y%Tnz#WIV6+1xcH>_MY{cxWXDyZmYD1Nax`QMX~w!> z&W}VS@ne=zPoI7#^}tS)?)pL5z6;RvqipnCN<2o(Un*Ma$wPHGaN#e};q2IgU832t z*rLhWdJ8h^gQii^4)@gEs|Z9>wy}{lb>xGiWo0=2Nl61i#-AP6{PPx4_>%Af2vhQC zak=OkTQfq!YuLytf(DLHmUpncsViPQZEqY(5^!0NvRiZ*e0wImi z^JSSmkaYL*XqK_jZi%>ypqs$ml{@M^2bq!gJ+^>VzK(EGGOy_kG&t9hAkOQ#lFp-W zVTn3|BxJ5P7jf8Xj8MpB84a>ZhCYkOMoYJY6cvO%xqe}uP z?68R1`l6fPJ)oYjDxZa~0n0$lM;L;7bn69vfA zb+zRY9XpPxXL>3E({5<{g@;mXsycFTBiI__$F{2B#6i-Q73x?eei1~`qkB2B6)GO6 zLWD0^{1JB;mE?-s%65G^Hx{T!aG%S5>+Vq4p zzwB7gspok*fPw$T-RIDH$WX2CwLd&mpd;|M)FjAFi@jYu_o^kG?t1a~II?Mx#rRui zwe|mfCa{ZQ#J`IKHZYIxxjhUgCrave6T>K1eS8f8g196tI*HHF1v}swt7OI7Vc61A z(#~MDXAISx)IeMu8JDyskb@7G@tzBQ=Mwx0_c;xm;gYn@1E7sbmz21=-t<%UC|xo| zM#>OP+S01Mu6I^KhCfWEW_yT_@@KyNmV1kJ zuBB~jzk32f&&Z=!>0aI!J60LLP}wM0+bD`XNIH!Ezmu^a4_*e7j4od}axL>+9Nxr4 z2zpw7%_g9yH=7tHN)xHrW=ff{yFak#WeV21;->XMYXaoz)u3zVj}zs|RZlMI2q!}4 zOC5&S^NFcS|7RiY*JHcy5#GZ>YVFm)0wL4-`bD0to~+ud%<;V>9q!VY!|m8zv4dOt zM7hxZXk)Mp=GGoavHJ6aNh3>|vDtUbaK^35YVt5sd7kCDj?Pcv4N9bn9%$j0%o!77 zYs12^k|=N76OTmj;0=5+UBRU~rq$sK)V9%OHy!>4Z^H7>c ztY~M#swgODuy|(q{fpK7vX2k!XpA|p<`2(V&gTw)DYrJ2oMPH=yTsToc<;NKQbDxG zSgiVfb|B^I<~$Xxkh5Z}P4Y>8iDb$7I!`B(U#yo8-VolHL|SV19rEhjx9|ZwF|(jC zuB_MWamGX*D~a9%!J4g-D!i{;QDi`ei8@_kL&B0{AS7cqdN;Jk08`dk%n66yxN$S? zB6VefvGSq1?PKOQp}iQJVu$h8p@I(zT3>_JGbdP}sK(KzQT}e{D;_Bxiu@(c?Jay1 zwCpb#XeFhv+a^PFucTqCJIo^UJEXZOJz?FB49i`-xeVV;4ZnTrpc%>Ik8`vi zBU+{>zP)9~yGuAifEUkmQifl~3&dT#jty?rK7hU)^p#xeCs8Ufv1u|){we}gyD$PH zt5b$_M7VsWfbWOwY2xNCoFdMgDg(#GFKK#VRnOjFrUCBH(Bj1|APB+S}@ zN$(npzV!5dT-l72*xrYfye{d~P>=7`gynhE+Bi(e($ zuli$}pc2Pq>Eyd4wW2X;K3bBCsk9|xio$KCks5tB>ETgrXU7HdIjO0sF?;%Mjas`z za{9Z?A2-@w%CHGR8*IhRXw+`%tWoQAd6?AnCESPCC}(^6GeCxp_ylbHV0LAs@ERo& z)Xu|Ch zZ_Cb=dvhq@Uz0P;bYO{wu6i#t9Bs$JZ2C(iAVnhf_qlAAy6D>ew5~%@F|elyc7_&< zt{_bHgc$d#G3ojvx!jCC?HUrJDEoJL-BdHw*_G|(&Fw7D3VV_#H|TJtu^9c~?S$uw zifg0{ZmGcH`nSSF_y7HgM-x10K#<@2{GNelB3cd;dDovZAL1tIE{oM4k582O#3t}cOzrgx4$L@NuEO;h4G)FZ)vt07Wf5?rT zgkc#S#MlG_2gXt0K6xWzNXH@JwjwFDBq=T~QjD`Y49Q`u-X)q*8$Hy<_SSBdIFDEF zvEJ{+QDk&W7P=HJqfqmSaOfqUjcm^TMVkXLFa+{dVQ5(q3ryaQCW?G8hJ;J3TlwK1 zJbPDmD3T%`%ApR;`2Q`0MPkKnvopirMKYs3E#owx3W-*AmuJdfo&BLfRYu_QQ$SaR zmbboKC+LlMF6XADi9bPkpV552t%@Pn*P=z=lC4&0I={TY3IyPld{_6Uj~`|vljR6O z;@K3td-!00+ESYS?Th?I+A4Vnnb%qCSjD1SL>)4k( zV5djN*w~4*qe){z=W_+h z!yFl?O8&b_lvfT%4}l2)scOq^LHB1?=@k#jRbT@b7FWp|=dUa6TGrX&-e$&?5t0!} z^t`Bylo^`3Qo2kNiSFT7$4FK}w!1^d4#w8Jki7glG{Z3IzBuGq!Wz;&QeV1acpN_$ zw>G?46UH%0kyr%ijVEBb{0&IyXP#w6(L-i)Fv;mc8`T-CS<7yh+-AcA&VUDZvMkU9 zdcRs3E6I?Bqg9N23R7f+kjwqer%YF=9z3>6s`zS2UzhKkxdmwjZ-Z@D9IQ@wA8Rx8 zXI|&GLhXKNXRjGuE{<_B;Am0G+SB>~0jEhU2(_fjFjs_ID}fhNjw@qgWew?|c(87< zo%pO#HT7pvIvJjs_Mb4^7u5~ z8u{JZvg-pZISIAB&4*X?hI!J|JjjjhhM_|(+n3k8cEm7hHoi)2GrL--LMEQ-IkVw_ z+qB*7h-@!vjV3f?`Q|meZ^t0sH}fRJmVv$#4Uv8L*Uf=VR`Pk6#mJcUnK6p6+08^q zc){tuUt;nFJouAU8g!B=_8@f4ymTP#B!`u(*3EIJwY@Ks@3>~obiwhvKCBMOn@bP6 z$WCIkas?5;c3lSC#kyX`#B-q9QzdhhG)3a@f%mGOs$dztY@p@`m5CNP1~XnG+i3Ym0mT9yg?v%gJyS{xBh3c|B9P?pd&z zI_j;W^W8f>;=2gWq!$U&iit9kQVmQg4NEv0BZIrQ4XR_EtwzfgdfJ7#wq(>UO1H`t zYDKfNMT_0L#W{@$Md*sgz&O48!dE1qJoV>l6{yQTh{0#;B?!CoD#dZ9;hi+A#6-A!!}VmR+wU)=5%YUWvk<2duAQTa zVd88j)mAeqM}1c^#Lm~$rbOHFbbxO_T%qPMgQ%JKI-hi!Au1;cXzI8?)rM3Ib0zgL3AcoWq63eo6s z&rxz7FQcQz-_nwCOuxf)7OAB^CepOYG{ENcYu}W@yvMtofNqN!nZgW5nU`LS*}Al< z-fP149ZwU4^%xFnBbfE!;mnEy!ug{Eu21QId?s7M2`4D}%NsDG(k3b-Nq-ve?R*Hv zUfn5IhzXd*Zj1sDkh0HJZsVW&7`d1R;Yf;d`W6&Q7 zE7<)C%?@$={#&{WURvI5N~u-( zm4D-_(T;=T$JzN8!-^~3r{#LdW~ui(tI*k*LhXVMy4s&N8T;_RX0-P`^CEMO#(ZxJ zQNsRlY#Xn92{KKmbzUZzL$w^I)^$d`?hfUU(dXnVtPkhxNH>m8GFOiezeUMLn$L%) z8SgdKv5}bgTgr!*SjhclYCOpIzw0W1H&GXiUF0m>B_>TU_}A&kS#n%E_qV`Ywe=lp z&Df|Ea=|>m$v4AZcSrw;J=3vWBMgsvkw%^*xpMyD7Btc0!{n-b!KeC(L?+t`FRwMV z_PsB$&z0{t*wHzUp+Y=6d2@fYf4&|~JQBYbYQ0oiz|UyoG#-!qZxwm)@ps|9b$enx ziQvUe>RzclR|Z_jJD)!@W3s<09c zeO|-xy-Uvf+G--w!Md{@0&#bC6zsH-jXr9wNJ6@3s}?|e&6Ns`Gh>V+H~1iOB@PSx z->;vx@sI6DUUdhi>33(mn62`KCu!B}*xcEW+cwTX>oo$*qgaB3H#AJD^KJcDK{1YW zw_X%}yd)k73ju|E>Mk*?Mw!&4q4V==o8hQCdMLs1t&$47@d9scDM!cv9|8`(oHBtF zCgj|0?+!v*%R&1Uf_lm`nkNYniRu;JRfGf0{BretSe~rTTrm48kC8#^;y++&En%%u z2asrVFR*DSk(!fIZQL)g8?eBjneVs`iD9}>VFA|u16bqsuzPsmHQ_BaapyTRLO|b| zHshn-^^Cx;)i)c5^E5+RQpum3H7vEz-^gxpS!-WcpJe~JKSccde#$~f?`YJDU;V^4 zCbQ>+jRA$uxWVf3Pqd8Y?;n0M6M5AwwnVDyh$ipwh`g0Ck;}?dd*oR9$Jh$j-eHO~ z)xMu$jzW%gxide5=(?=L{NdeLnmC*>=V=i9$3!dYra9p}Dqnl_`mON((~12kI5jCy zac7tXO2^_ZC-l4W1~o&-SOxuFBnP+@5nEK{zSdW@4qw7f`I$y6fE>xIP?f|2_B9MmPo! zv9$W?PYnf)wOUbV(U-IAm@_eTWq3Sn`=Qf zXNq`|G^-wl(AzI6dCU%GfxfPZ2{O!6`lUxXU?q|1)9k8M+4evVsOR)78$y-MOCg$n)LIhYlz&$hA4Kk@$Y08KM4&8)Smhq(^W>|Y_3 z&j9k2{y6N#2e|Xf%c(k7D)a-{y0y}f;!|MiE=TCRBY%N*z${XUpF-{H!*^^<_w;^6 zCtAy-90y7t4IuWD#O`+3otGxYgaSHex~fs*aJ+@S6aoSOLe$1$8T= zjYRHM_aQWsSxn`}lasN47DXB^q=7_nYp-fiPgQj+a#e$F_FKRT^>~{ZMsmOBo5a?B z#rV;(I_N5375dT`zVU#CVa{tM^E=a?o1EC0b^KhjiPl6K>^;vNG2eg#uht=jxp!yA z#yL9pN1p*tP25?N)=A%vcCvtD^6%X zDS9*uv4!kr=QEm&hg~b*nyC|bk#BJq&Ym>_8V*@sCiv{HQG~l$1Ta2adHZ1a>U#fc zJ4ZTgBXCik+}$R!UV!rL{8Z_kPy2pmI240gkC2#i4Bmg;&EtS%HO-Gx&-2KOUYJib zGEi#`4oW+**Z0b!n2{qO24q2tKg{NFq6XzBL=Z+rNSp(Pyh2*D8op8v#TI=#Keyb#8AO{rpz0$4OvFD4z z+<0|5<|jqAem%<4F@H`&s}2Mvt;>R+ghp5e{%X9~=i<3aS`8pm3t)+V&xV@Y@X|UU zX&RZd1hFK`g7lKKi}O>mI=tRAXvso@B=Xt zt)OFOKO-7I)to5n`m>#GqiH8+^=p3}0J1)X2ggkoMD*-c2Z6j>A|*o@a&d*R!#Pd3 z;d5I*yUWPeKq~E{@ZMP9U#%UAdT})C|0#@zerEAj9{&8^Ex9|=;vGvLH#V`X$G43V zZ`6DlE)=?2VeP}<+}74T81qULdKwW|vQFNrq4K67NUL#9e{gNHl!#eyYhc{k*Rnn5 z{_=#M$&YrJGzPTKaJqYm`UkPQO_^#oaS`>kSNVl#v_G4Zh#oaVS{iig24g*ytVlHs z>}yj~Z_Gln&ZNeziW=Bzc(X+_;qHN)*P{I`TZ~GV^{@|HNJL>6AXwSC>0^s<@GYW` ztZKN)H5bi968T74-kL0`;;QZ`=5+pnJf~5U{2D(`@~eNCP9 z$nA<3iUr{sfQ*Z_l@f^pdv7un@r+V0CM}fBe7R>d!IEWztF$)k1vjuTirH zkdFTCZ360!eDy2gd5Fisn%v=xPh&B`O#$C7dQs9b8D`M<6*Ca+Q*Mywg+D$ao?9ed zBW^s3ysUP*t5rSjlCSz&g-p47#s-R_vKgUx8yhlK*)j{Zp!@Ts;RT^RD$D z(F4(@+M&sEXi)0+^6?ue?(Px__c>4NRX2MIPfmX*{Bl1d$bH;;rHQu9aa!s{0#BY` zirc)xU6(SRaIc76^%m|D|9n2yKJ23L54@=%VV?lg4nwf(33&kqV98?_E1HdW&`>wu z@aGRNzyKs9_I-cN4|`$c%UN+Yfc_TyY|phS(L;Qp>a`P9md=kkb;cu}Y}Z0o-0zT0 zY*_l-s7|&V(y&u^0=Nt%UEW)7!~p^8#+FDNKK?j1rahtlTY*0##&4zF6skj$m;%a2 z92{-{N5)piw$Q?;^pLOB+KHbMAl3(Q7jBgQOWgf?K1)2vEBdJoHMPevGtN}OwW z(!oR`*O z4bJD_OeO$_PydPgb88lm3=(@0r`C*;r`yuIK;py!hxUJc=pS|iDNFEaGD={oz>XUD zpaBY1oGmcGGv_ZJ@KNQImQGVmlK6gDZ}NhZG{RLvyiPLA=IH~`O^>&9!*Ceue0y6? zj6v@C9+Q+;A+$?AZ6o}uZw=%eg*Xgx27JL8;)HL4HP52daCPvyeI+lw}|bR^9%bF&8`{z^=4ex zb^7aC>a>oEKlg^zRDvv$kEplH6~K=$d`UWS&432^#&F{4m_&dx1Gg8Y8>rJ-9*x2d zUYw93JEy|c<;TZX8*0*V#E%8GZeB`x-63KKE*~`Z=`(NrA@Hja9X?BCighMGkUkW_ z>|urLCC&jSHEWU+$Wr<9g+E3R#Mi( zJ`94={V3s}r>Zc@CC5g>`=y^&Ll4&w%ge9;ZQ+8z;NI!`b%fFGQ$qky7J8CIB1XbX z@OoIq5&n+M(5n(_JdSg~o{N#={+BC?qs}yi8Il3ykJ4~N^qk9XVsiuG*pC~Jx7-7v zlmd2db(Z{p0qcZ_`dy-b zY)`ojYipDoaCEdn*}Y?0B_1jKZzkK?$&V)dBC6Rcc5eBt=DhJL_+$x<qs@{?iD}-xX+&fAvO2 zEhC91FFv+7jc32t(Ra>#uR~a$|EA&Bn)ceCt0xB!tp^R)or&F`OQC+)0)yy8YZ)Ab z6pWJAgbA-&SgEg8o8~-Ln3Oz!(O+HYrkzuDaQE)rauK5^neCP1KBrFrLQTC=_u1{o#4%sum`Yit=&g^lee-XR&&LFKG`R4B@?hQv7 zPcTh4M!bNJgGBK+oi*-&8`b)w&@J`znb2naqP!yUfyqlNe=kJK_E z1eTYde%{#lQAp8s97vlEFY0MKtS8C+y_l%F+11T!ST=yCj&kVN~ImbZ9{4z60BF1HWXs2S*=l%DFNuB0{Kw8m=kOJ-@-gx3vuv_-d%v`bH47KDJ$G~>A` zQc}GQ+(xB<8t^9Yy&11o4!vFhGcYRT=d4@04gpNUO9#;8;bqWCLk>@G;4*q zqe@CSKmWlvJFL57dvWM(e+4}&WG5I($)_NMI!CQuD=GW>h=hB54COVKaIJtV+Y6f+ z{N*bJ5O6aRh$xuW5Gpd7_6TGA+{zwoM%|q-PXQCqTxhJ9wW+l?Zz(#wA>?g40fmE$ zg26>0N4L?Q;tFVi9Ft3q=l=A5yiN(s3}ES?YQLfV1_>t99gG3}@#e{Lgtesy_Ko)} zs2$Obz-fw2(5EdNT4Zwwpd)F5U&`2{{S^&wjc^;8P-?~zyGwCQzU!#b5N9~Szbua@kH_l1I}68xvEy#pc-L}QDTj1lW^bO(!zG%;B0N|y zPVdOSnm24ddB^HXoJYhv5$j1W4c>bUClg#2o(ukF!YuM&`;M2IZt?pY^xE!^8(Vdb zBMi8+geT@Y1`j?kAjNT%PRP#>6wI_2RmXBr zS`lk8$2*hg|HCd?8$Hov1?5^Tc?b7N!JAss~53 zXk8kL?UlT;_p^YwjJ`438~;)>YQZ%$m4f*50J@BQ>S_o>cKox5gVnXo8JY~P<&$9g zZ$m_-_xp#oKg@rcfBjXH@>pT;u@kRz)rlHw)t2ISyI*W{8akbi#*EyAKaaz7D)S!=oR%n#;CHYtP0{Ud zVoCYwU)gA=H}uY!5-U2+W|WOz8V*zA?5`m1{1~nmsvNz#hU91CZ&>46@{_|%a5Mhb z*7KI$oLLH@WEljh#q8hgk?kc|xC{rV>Bw z6DWjcek&fAFE(8-SduJOMSM+$k8fX#nLTknB;A{FpbXUxm6PSNrCKr6tJ8I~*D~-M zkr|eut$>XbdihMmU01thj3CyH{o*f+b_QU3pOfj!YF8+Z(%xW%yNkgL3d;t^bH?^c zfi{O1XWJa~@7n3?5U-CvoehNKoOLX2e0EW2mPh~d=xh0EYxxVp0+Z)z>deiBkX^n8 z_iOu0k6F#4N$jUo9s4mgvDz=#BAu?89ef!|8=&N*iNiFI-dXD%N0fh053ymmJcWf( zo}~1f9zLaj{x!65OS7|eqCs2mK6|%%DKe%ixn$YOt?@JEa46|BycH#8-CB7rP{*5{ zLqJvT?vpSNd)!dF08)^SO`y`j0y;zBN9{z>=acdJ6wJdAR;LG54NQ)?q+?wN{~wFL zK(FBs6d%GdqueKNp6#B1^xvDz!g8P)a8Lbvt>d=AG4=sv)Id@H)=o~XbD7K zJZueL0uY#tZsBhcl~XPn+uqEcV`6L4ZY%m?w*wO4KCqtTyLtrTB?k?*EyFtw#ZY!s zG3h$^PvzE~@0cMypM=gTo7w#mlvg_WQm%-jWoA9j0S_R92treClLNxap*rtZF`E+= z0z}Pi`J}_Q0(wKWR~+%uU$PDj@7#F6Le<1cckN*JgHps5XT)rcoq^v&+d7flm0mW! zA?d6_I%vFoml53hEqJ&h?RLQ%eHz@itLM{TYLzA9%Q`+~nRFN*dnq`K39Jc?g7|@D z%>&|Nqr6rf;oS*{CXY{&xYqAY#%;RZ*hmX0-#Mm)fFOo{Onc%AbmBGG^(V@A|P6G~Z&M_Zi5S=~O2_J$GYrb#5htDo7jsLv&lHZ&v>lz$ z?7|y$8;QAv5D4JyF}9{V#K^87<#5~cQZ53YHY+)5%CnOv5>QQ%& zmoccVb01KREC)V_L4X0^?)t&yy{6OvB=f2vlrUMMN8%XVkOkFVU_fM5o>82VAX@Dd z;CY$cQ_j|GRBay2)cY*=%5Hu!s%SxD29AoYTk~$b&9;0w)YVL%q$ockh$VEYK zIPs=hj-#d-H(Yp9@Z@&vb?v;$j+Pd|jhj7QsUHG*A=UFR&ggw!cC`uvy@%-S1?%Sa zkt}RX_kRumgr(xRUCkF<)oVjS&B!T@%FTv8gqNP#UfQS(TW;(qe|Q!Le?h*^?S=zE zx4$kn3>g%k>LMJX(XPTW0UI3d;++~)38HQ5r^uD_FMn(3&qVisO4=A?nck+laMq2^ zqJLHUa5OwBA}pssV)4QkY%&3+ zFQfgz$R$G1`Jc5+ST8?9G|d^YvbVoovTI+|!<(-V8o8}QyCVcPt*A?vjCdDW4gOd)2X&FIYI>+rddPx^|tGH!k*?o zoQq~&seiO!tOmVE&+w2PB30*}aod%_H$9G^+RMztl>ovSb6T0Vp8mtKe2u5Qwb`2~ z0#ywXAYQgburfW+n8km4RNRc#SmJ2vphT4v6UFT!Y9d<~2A6bZwaGQ1Z|rVz6p3oP{Bp%vd7=OTp5%PuliZyn4rS-n2SV1L5~aBA%88)z9;D6B zHys9v-EEmRx=S*fKglE=e|F}$2zLWXNM&|7+g~u0JB%ORTIL*0oH3Rk4KAq<*00_EE;K zhQ7?EImv#ZVcuc?66zAe+{5-w_G1$8TYUJ<@fh&Z{yo$SOur( zIs>z38ymg%dPO|=p`5ow>IsOO2#GPnH9XLFN_&9Xh+5$w zv8CDjhK=t=>l}Og^H}A=E=}Kv-joMv_*xCfP^~s!w|}?xlC1k03x+QsNnpyU;wiIM z8V@A-0h!J4xuv_(nZGveQ5%~|4su>3Rx?yim4@!N4eD49Ar3nE9a1cX#A2Pn!yZBl zX}!BRH(YERS-0Q{{eZ&D9)TjO^~jqC1@chLp@<#3?wZPdnz6as7Gk2vr&_r!Y z6uj|0CCqyk-)t=;0sGp?+_HjdIsV*;uK!wm^kzl#AWsfCo(Z(s<0lgn=tg7%Fqni< zu85y9*V7Ij#Vwfj&QX`P#6MsHSBneKlWFWRv}S&zxc54v&)-e45~BmaE7Jg?=BS*R zs-CnH3gt~ktCfyGuj+=&O6R_Q8?GsgJg&Mtqx9hd!MW>cZi_D+ONshH7f?+p84qeP z^kYoG*o%4EQ)X4iquLCfqg`T!LWjpg_ca1mlO-*8sfQES3_QC^A1tl{RaHgBvVXVl z`Wh&*_0tU=J*%0`ip~z}8Qb%0u|}-KJ+=p>zJL2)j0h;32_+&3K9AHLf~wrF+dsu? zo^P}>l=&I2Xbn7{VSz)I3@}zFW5|k^aEnxY3;egChE-<C->t8S3rMO*x_}CbX@5sne<7{n5{%*kb z-9yyasl7dCq4u3*Z2#z^X0trbWN?WKJ7Gk3HG^dJjtFhrMv6fR2V-};Z5RUCEIE=Api-ma)QbFfpzIs$9X`@aoek`FV=S$Ej-Ixjp+uLcy1lYah4 zlo0s1mMWj{gev@j>%)OKjDftM_A!IOay1uG&TTGPaXo=M0NPMEC z?-#!ui(dzxv9G*Q+j_%2&i`XJJJP8K$ShdFXHvL2A-aAc(ONdJRgQH|Nb|J?8^Y-yqQ9(ZkG{ z?*dtHJt5BHEtPM@#yfbRy5)KyMUOO5thk20j*u_=$I?27Ox~AVpVmxT1JE)C1&g$>bV*ze4>qLinvOj#3JCbCc`)uElgUm!9 z(QGWG=aPTVr-4qz9MiUT3c`c|n~dn3KtwEPlPL(AIR%rWep^F0S8=4JUUYbp=9c>qC|`*oXA8kDl(H z+5ccCh*?J#>>jdK&_8ty^%N#)2IfKN*ut)@w8<`?^X}dH1u)?s)7zRqI?^fly!OnOrF&vt~b4LmWCE_CC z()$v3NEHf0cBiPCJV$butkaxm>ajq8F*cl9fQE|}?%t#}M&#GSagb}7z5NHRZBgqO z5-F1u8ROG5>9Z%2M=SG%y_D0EjW-6zNn+*k`IIhP*88M|;vLt)mV^IE24!a#J1^Yr ze}ir4=AFkx#l3m&vvaM5FZ|c2`7h={VWulap>@&S)^*PU$J|?naFSVCn}eThCprid z&BAvoH6t8HU|LR7wR2T&J8<6;=d$vf;DdN!*77a!JAHYh^z0H@!g0|oCF{@X{-0JG z%j1J}4Pw!42^_BL?pIB@P@e(3Wf};~(_b1M`&XFXmSuzMQB$ih)VoA@>8qiSOiE8Q#gw1vFjy2Q%t%hnx>5c*mIrwXo@$XZ4A# zTmYG;zJoIPP+d~b?VIM73DX{quqt~nOv^fxfXa3Vc#u^_>hft|+2?dYF4{-M$A5(q zyK$Gpe&ZcE6(QI}`ipQ6EW>oH~=ur>vBSlnjC$+a*i%!`d7T1Qe;H+RT~%VV}H zAdv!OGYRgW2I{_UEHDXLF5pihyG~p1$+FV%xaGa;Lk&z)0vqXK}AjFj2*86c^SDb+AC#ccK z1J#4rfle)P)_ARdotEG^y$cx<2SMv40AloZv+KXBu|%~Fla>Ysj~Eiry#!(g4)5tU zDffZoC{}wwXk(&!8^R0d)UO0?rfcJ1Z?#qZr4YZ*%X(oN1aTg<2s&RN3;4^kCrr0E zANwdv%&IN4pqsLt4icyhjEf}|lg>@`GJHJDqVct(q?fbdgXIm=AcH}=ns@ot?c(QQK zQu^#_T_L9w%3X@n>8LZoT3k5kUq3IH8yBMKsZ8WwSJhIzCa>;T*1y|7rS-r!jFO~1 z%h+)n&07IRe9~t)Cx-~~#|2qWj@<+g; z05Z*g1)R`)TMouAc&ms4Os!Tu_-Xy0h%>lHr0%^(qU-<5eEX`?TE7lk_aHlc;`g^w z>rRH_@jhQQVp)gt711qB07v!w$!s&JB*0C3PeIFZYlrB)DyaJPbe>g{|4qmo$#Di2 zUekJopHRp{0lQ}5wfs5DNQ&6k6qD?0dCRyAz9?gR^Tmn!zvm}|Kmw#qy!E#-BRN-m z3&*M@{;lX)w+Ai_e){bG;b)jRS;gCZ+t)?ObdR*Uy)Znk$JHk!G4Pd%l=DHP-?rKN zhSA{*?K)Z&S)V4}t4|vv+Kz(>3vRW$VFGx)kRD#F)Nxx7uJgk}RzaBd|L*-J=@Mpt z_HKE;G1KaO~9huYlW)bRhwzbAk zsCp?VlR?&QMV!^Y9##$B4B-1U9zFl%Tz4<)$8YqoYu|wD^=SHnZ_umx&}^ z;V(IP-<3aBS3R}K)$)EM_|i0WJwxNKNWYjXdUvtrm79XT&}r*7cgsi+zZz<7%)@wJ z7;~yOE?Qq{d>}L=tzibE6LI^Y?=-2K?RCR#5;2F&of(zRq=ioEOG*8^*4#fw@i8*+ zl*4iI-TFBG%1*9o>nyq1Qlgx1hfGZKaVa=g=>g#DOF%hH?TqEq1IsFNRu?P$?~S2JBC@}iT-w>s;PIClMb?8b8q=t?x(?hj{5=E zO%3>9O$R$diH+8XizFT_Sh=4!<4v#s`hG8jjsZbRu)NXO5yR7Z_u|2r6(j~K?U3AW z6~0Ggv@W@&x<>3LJiN@4z!Kr0s806hPJ4ZZD=Cjxf8uu{W;$JkL=N=O=K?MtECRT4 zHUM1eb|8nWLRUk=ro;k$lHopH;hqEAXWN#Z&9+{Csw(-KEK~uTY0I$Ke=uAwwn9Ut z)1E_#H_a;!XH@eJ2yM9w=aVbFKZS83U|e&#V&$DWH9Z@Vu^cTcM7O4uCd?q}#)!yRcSL8^pnYxswU|BrV#ICf@ouD~$Vm?Di-bSahUG}qcIei&zZp;yeH|p-Fxh&3=T}y|y2`Wgs!uW2 ztiMXtP^j(xJ#cqrg4h)Sb>_AdTNQa_!XI+iRYVsHje$DXAS=$?*It-pvRJFqx0`E zf215(Jedz-TZS|{B)PNgs%XS@6j|ihD@f!Q>kui8_ z4HPaAoDjLSKWEKk&K&VzcT<<60Ur7=kF6fJ4*PfAFixJufHfeZ10OSo<{A_M{T>K` z-v=7UnU*6o(XaY4{*%vvu@_M#ut?%0=LqyvVr>5Eq+1>Sz~vgg+1oABAQ<(RsD@0V zB-A?8Eb|U1`A1RugU}{?E7^M@7iO*&=vZI9>1_c?5kKz?zmv-&1>%k-tI1cGQPFp# zGmJNqtHPOu(t(e46p<&!8np{5so~mJ(1qxYDbGl9!xAjf3)tVe4lJ@BbU`sHw`-)* zcP%@^3<|{4c1cG$F%2@GFSLj0nWQnFysxPj+(w)#10&SQ#J4rXfkrD|a1XC4J0f~@ z;s0&A6VQr6WM<>)Z3$@JyM<+hZ--z;-)cLc+cI`7>as5u%P%Iows_f8t2fV>MWEgX z%n-}D8yX9C9#sz0K^%wgqBDf5ueQvXfF1N4w3E}SXI{%!x(NP)e5v5AA~zv)t_MS~ zzgp{V%t-HQ@I@?-CCn>kOMv$fyNPkO)jT-RSr3V4ltJQ1=Y7^E2j`?;!d>cUvwU9O zHhYDQuAnz70-Z^LUg=Q| zMy}<}r*FOOCI)wU{<_;uUV2+-_2S)B_)ry}TfX%wIYtB0$Ws!}QM_X%@h>w2%k zSj6kyg4@W`d`tG1?z0M9EHu>G4=XIVKg^4)ODjRF9_&*`u9rS~Z1W;XS+uosn04?| zf|tH-i%vk%T2c7tF3h@{d!El14#GTX*L{Lg@Ygvo?SA1^2isd$6l%9BC1BiyG+E!Z zoDA}7?O0B2IrT!6HvrRw%5k0J+eZMzet3wA#JYh z1{&8QqYl2)QXQqKg#4_k-xsnZBWU6K{LXg~w((%ZmE=$%9GvX6zGS}F%mLG2PRqTq zz4g6js&FB@NoCw*xZCyUEyY)3#g=m+Vv~6#1Hb)W`u2|pT2ab!P}V+(T1Ic-ne;|y zcaOUa>#xIZRA1g|YIfK<-R-0P1}c3f1QkE9wTDT zVv!;G+cbjJh^XaDpr=XpI7s3kY|y7sw)Z4^@`ki?^Yt3=14Gkpk>bk#n1zepRKfty*#m z^wxc}%pRd?SsLh4YNKqzsy!=uC{3n$aoy@8t0;rSqPkw~3Tzx%irf}|`C|{wF3=qjTpUCO>~a$y-5-w^@te?Ra?NeRll2jpunyQp>C`Ym+l~JmlVz z(oR=pXybwh?X?Dl%?w!S2c9MXBbsaw&ekw-jFT zp0)ds@49wdTO0Wu^hD?%`pekJ&o6&Y9_$LMekr{3d;=I?szkJmblyGs*|TcAoG>d@ z&aQ78BND4&pQQV;k7h-_^5>_-jF)shIUO;)F(5CfQdMt}8eaC*>S4+~dqsAP*!Uk# z9<@bVJ!YSgv1_U{6qWodcVg5{Or4UilwhJ)^PkrZr#?CPP+H$FQ{r|^`0Nnwh?7Dc z6E#^SZfz}kof5&2HM@xmX67HnV637?)$@&fkm`u4Qqj`ipe2}T6?IolP&_;&-eXAy zv=Furn7PtR5G;r z(2$eMY`uS3@Cmi-jd`(5F1?;&q4rknBeZ*JAUP-dm`$yHos;DeFRRIy>0ya&}1EHlB$SBJ&~i z4gF2RDbSwt`}(H~jXmP9@u%!HY7acb$s+q%U(;S)5?vv8991}8%J?3lB*^-8Etb;s zAP&@dd)4Em?aN-%-sRx)ui_7o^ZE^R7EFt>aK?%<|4DyZ@~>7GW-TwB5`D^{yE>|i zJQ*8M_@kpV_^;V}-!HMYGzBtqf*nNRDcW~-!hiF|NOj{aazBRQu z>w75!I=?Eq@pkJ1<%YC#QP@cy(GE~6NH#x~5Jl(LOlYMy9TmI4z(ckz4Lvl%{H2uX z^CSBpVj--iksbw_j%HJoJK@(uv5&71OpZVRgYgt~Gwq>&^%GRepRL#p6&{nmbjVG>HzjcIH*(*x z-9d{zefHaDFf^D;+3ad>wx^4_>bITH;P~#{R6~n?OE^SfVZJatP zd)~t!1(DnGPZ*&%@yEAtK9nQ9RpU?8BxdLX{Dh){(n&Xvd5fP#N#C1!O; zIFZ)CG5j;)9X{YL*PUlKNV0A<2YN;zNLi*|Z}u5B92Fac{twFx# zX&wHG@)rw}EVlL=Zl_~LV!oc7S7)j{hb{UN4vasznpe1Sir`YTD9~QB@4!pr{^KV| zMLtLgdG+DSL`D7*s!@Y~X||o3lfWMI_~H_sjT1Dip|$@vJZ96t^NwJkx7ulsx+WSm z>&O73b`p6LT`YL+m`Y_=NouO*y*$8Lyu~{*%Q?pQ{E&~vN?x% zkGrJnt##LDM!OQCVzjvc*Y7_I{lA8^XxGkfFa!7E+eX~GmQ!gH+I19eR_WaOBixlc z?u6?$gm9vrO74*=baVY#@JESg-nR!@+-w1io!07l@)OW zrJx|FjRzei!Q6lX_G#t8IX$_oTLWEq?38nA+r@sKWv&Z|?wwji6o*AQ(@E>Pl6e8U zV@X;wg~G!sKFxOqGL8pJfpZ~2W1IgP_B}J}Pxmn9r&@1Iv zgU?DRvr=W~lT;R~P(ri5D|2OVin@^N;kdCczv`$dv(Bbn;xbZv1?(Ntour%8S>cUI z@5OJGMXXojNv~mZIf`kiAE^W%eJ;V?kG7oYr=s{u8)4p9f4%7mS5KoG0u}}gVo&Bv z&Oi+3^#dps3|hZ8U{b!jT9&hT$~uJK^h@0knK9W7a?g1gVt9UEw%!Z6Z|IyHj_2i>rGe_fHL-sYZpeUZNGu`_4;8O!-b1{oPAM`&R0 zr76A6!!Nh{e>>jEqF2pUIM+t}qZZN8dSCI{3_eZx$Twy({aXY1)bpeIN3G}|7$j(} zb(Q{T{{-G7gbp`PT#9z~#Q5odT)A&mp??}4gdZ-?loR%vPTbQ~i>mUNvMWM!4qMP z-Dh^pv(>SC-e*m>g?1a8+g%mOKN*t_Pl7{c#*Ptlx${W7*H#IYiiX(UD6ykIF_d|< zR0`-VUZyOg?`VP3KuX7e-%Zku5P|*Q3Ti?mAAa|E1zUA@hzn{{6YO6MKcR5U{;gDt z3ZyI{JkI@@tCubL2WwO9d$)6GujUHbM7T8G|B>L@Ccqa7M~N}BzV~Bk0Ck+}*glGO z4xFk79;DTru=#+1^Oq~u{jD~va4W)`Jxq?J{faz6DWZ=92XXOn;gHOF5U>8pGEs|C zUp6Tv467yYPk-^gktrM1qMu;>35{$-*t=MeWiR&6_vbu#J%wKT)GmaaN-**~nYUyg{4)~O2QQ0!NsV?!yGL|NW94+* zfLlqk)q0V~%6d9gDX@h(gIugj+xIcqp;1Dw9@kB3R@iNpmZorNnl9i9pr@&(Y*p?f zt{~G@w?hllKPSQw$IU(*uvO=oeZRkle&s+ycBkUa<~9MI*aRnuP`hX=FaE`K83|gU zqw$aTg-v*|a?RpNv^nm)4F~A$XKYw_aD3a~T|L>sH;B5B$rpt5@a6YUDhTCraqr6e z?_>#kt(EM&*FchLJr#YQRbiCUWOGl6=-pNomYI%gOCJ69QY+L!1oD~6N8onD>WPTW~!((|Ca?Fty!}z(ca4+r2K?B+{SuB2jKRcgv^(B%Fz)|s_+NDP`NUZPByqS8Dw)l$h3E~c#$+k!O)H9XiYZye!u}y(t@VbG5AxA6}&_4wq#ZlJ7QU&tG zXRT~@$n$6+J7VIbgJyGHMs;>eb6c)}kB9n2yr*@H+f}N$hxUnFl@P?g>@4v?wR%q+{4INR)9fh~|G+Ae}kAoR|i zwtI#L+0iYUy_LOC$~z$I@D_yrKEa`Q1khlz8|qG9aA1=cSxk*T1ttjAW@e*}=iLTece7)-8bw zZ@5Z~)2eP)0oo~XAf+DQ54h^G^@`lSzsZd|msoHcjB`7O`-;1;dRF|%?C2I}O)}5c zTQB$JlyyfPO+-=3G;Iaur=|)8h+Go(_yIpz)9aMXIAI`Nj~C!G;Z?iJ4w+w|R^DTQ z^|@XkJCYzPG-_;DYaQj|l_Il{^Z1TP%I*01=}V4V_OB|PA=jIdm1o@<8-ij!KI625 zAD?ZDKrx7r@@XV{{^BlU3j2Z9p;@PH)q|^eGUd5W@ml+!Wt4yS6E!}+y#aNBug|wg zIJUMWz*Q4!*GD)8BA)&@XSuBpEWc`>esw{H;{&03r^Q%5qu(JDrO56ep;=1XXuLY( zuk$w$#9V;Xuj|c$ujH&LLm|*w)*lM#PYRyiWUf|ir~GxGEXVaa$_r^iXy(cgnLqeW zxj(1QJ3(r)qyWI2mcaG8#M+VCUVn{ix+S=1FbQm(A$lS{HKZ=eWnC6T|PZ=j>p^5`)I62BHD?^G2I z4zi^IhYpf?@k$qz`3F+m)SviaE^5`TS&pHm_Iv7Fu;|wKPTAmx=9M0)LG)ZZHtb}h zth&-$6^83NZFLj?w))s&%hG zM1#h{VqaQG6Ibg_TUI%x(N*1btu45u)A>>03Ga=m?k#y{@P{R*zk%M@mz?{8#5dyS zy&tuxusRcbA&SA?>Qm}X+I0;r^6_4qZ{5>qhk6bJ`ZFBr+ZPVXIIGATwd>X2Xund( zL%<%X%;yQV@n&))#e<7b)e*8}^sg-tByF{!Ek|SG3nDuEnEMP2&FinJVZ*O7oNqaC zJs3%RhmA~T!D(yNyVtbTufSVxu;S{UQl02NdNA7dzVk^)gf=v`v}I=>sT>9E?_8L- zYVIU18z02HTh!jAK6`Ms@>NDeZS8)I`U9b)~$tR~}pBF!%GTuUf@KRu4N&sAy1h>P8z1JD0U zXa0?V+t`ZrG|)tI|9U|~N*!c1@Q~B!2b&j#ok&L|ix3%W;LBd%R}MPLC*8{vyqTaq z2kbsfyUtcUiFC>e>SH{=Yo9RIL*P_1H*u!%z#EseAhbxm!-vIBe}p$woSBxb`*Fdp z3S0coAu5iGsfr7Dz?%VFjV>r>XrMQHy&v)}LsvAOi{?-X;}eX<__ZAxEJc5>qi-kO zQleRU7T5q0FJ3qiI0%HS%$^91@ND~Bt%4ldMt83(zT4cczFhoxlCSxsfZ_URoSC?p zaodxF&hFx=&y+Cs;h8HT18poaTm5R7OAAAo=KlJ#|7fsOXcUBRy|C+mqzuJCvP2RN z!sB9v81u@;1K+!K&Zo8SF(rt?^wQn{q3oqyz!NkP^4q!*O_0VLzVs#1^nX3)PD$a?<0PD;mq`vVIW(^y+c z2>6^IShBprH2C!r3dY-gbXngxM+*q3wGM<8QYW4dTdqp%D8UyGrd%Jbj25LB#gb9$ z&z)b^yY*~EJh@#Qz9^T)iCuE%bqo%HrOGZuSO2Nx@4uJRZ5G`9NC9#B3#1So&2@EuY z0lx`f8(*&&EnY}T#H64CCwUyV`-7o-TY(%V-|S)RrBE)q?K(A7t(;iJ1BX{Mg?)UF zG!F}NC*NQH#MZo64oR2}ivfQFfH0^L<3 zUt!^Hz#=FRI@DO@bSG6dK8Gly0yJn5ZV}yTi)2m_Vki#C-GM}Z=^xd*O5}q~mX~BP z{f~tp7B-suLGNxxEpt$}GPfIqXglsaUMLhV9&cH~%mZ~Dyv6*30$?1(nX&@lt-KBF z)rR1&sT6r{Dfy%MSmj{KrG%6t5R%Qj`tsSQ=iqp~3$j2p1dF32?*hHE&xCD$LCZ0l z(Ha9}#RE9+;Sn5nbz1^wreDnnof08g+oBLoj|40me5ttk@E%a7(o&551N?fqzI8P|2dwCrZ#(tJ zbl$zv*sH>~ZizCu{2m(rc&cYMrliSPcx*KpFIlLCt*T~wc(s_w_*8uux21E{F?H7@ z{kCzTF)vQw`6X_*prNFR5B5U^5rSpoq_~1G{@|Wb!}e;FCOjFG{vr0#0ogc)JK=35p?&n|^=2w{@rn zh12k);gw{7@h-?5C4G|O`G-|ZIUw=Q%XdcpoZ-1-Xqm@h%BuztoD0ZA%}}BK@f`7_hHwzU{J8eFACV68GFD%-W;Q1yD&1ka#^A<+ zYCY)+(ez*8_5=Wq@P`V5l;3W0fex2A2I}n4p*~CDo@~^rQ^{T%>=)z5hSX zA}Y>Z!eqj$cCxw5um$Q-<8ZLkAiecQ60d7Z9?Vol*_PkDVv>ZJFv<6s^BNZF@6<>6 z-WE0i4J*=E`K@8GJf9p$Myyy(wf};Y1?%{)Q9emA`{MC$a|sxI{Y19W(U7+T0Dfp&UKz0hB>8d6{o|HGjDj+kr$JWY*q-R8?A6APbp0Sn(H;?Y zow#N3+gn#NlC82WofZc}VB{FZGoyAT+=Y9TFfL-S(4BF__QQ>N#rD_v+L{3&+O%Bz z0kl_`S|(r3_$0wpL2C>~jP>i{oyRx)x3y<`M(sT5)?fSgt3QOcMD@?N2mr1xr4k9uNN^`bI)k|G4$)wR=@H$MM-&-2?`sWbgr(A}$dpof3( zrrwx_7re?SvjoKWN@&5%LVOk1Y)IeAe@&FfJeh)ZC!X!)&(@L8JU2e{N@WSc0$*Ct=Jg;hwYk|G5Ej;@MT+*qgdXpo+3s(9SYPvv!W9;E96Guo!pM!wkXgvl<1I zfHr+O;wBu7Ajv3|Wgt-cEXE@*otRSc-okT%sYL368XQ$M?XH~tx&qo*?Tl~vNHYsW zrS?0`H4L{!>h|7^A+#tDsE{q8^yNT@7f#PQ^Y{D^_-!Fq-PVhnX%Qu;OrnH^HiW3& z%#FunseZ4yyrkm~Jv9*B*Bvc1YrPfHOe?Di=r)e2dfInYZ*Z>I431UT>`7nNqk8^` z@GVq7YSK%VO9zr&saA0)WFTKb5L8~>t0-!%uP(00l`JrN@i9B;ymZCpDe$R^EtlvuNvd2Ed z3LlJtHgijE=4iz>;au-6VeFH&CyM7LX$az#U+U8%L31Zqrg?0E1AxMJ_KrFp!3w*-RW`=G z>h$mVAhwKhzgA9zL9synIN`voQOK6itH1=69lUF&JbXm3;ZFiUWQp-=l$qx!@C=M0 ze8^cnn_dojB4uX~Zkh#W0Y#i0JiI#V4F}V)OYgpon(AE-uKT-Ro$yEN6LatW;Q-|z zJj=ZL?w(QGyY|@#DzU_z0y8>^#W&koSK+`h*I$3KS1_k#@3lNr2NO}Im4&r- z)aavwa)Q=Vd|kLXEcMzP6-G5?3Xsw4OP@{^G zAPOWV?7blA5ieDX`7Wl&MqCWetBm;kW%S}`nuA$~JIq3l18Nf6`v?22Kve}J}oe!or zeXIB_3*OqM+c7fNa7m$z^uFKGOl#M*`TH6BD;;N%qFTrNBa_STZ{YoDi~7;TXI0Gt zewn|hH?z%tdHB2g*+hl*QO%EUM>BlwvEu>V^eb-Gk@PDm@jhWzF>EGDwgbNe-AapU z+_)!~Fcw1?R*lZxOD|(Jzd)Uij@v%0 zj~EG7-X{*b_zgx+Q;GllwZ#(?!xQT|?X0;~n{ZNa6fdgF3+L|^uMo_LO+t~jm$sHI z`$Ss>Wf_@@fiWNaIwxk!YAw{=0lp+7qNvQRQy+2mluW{=Hxu;v>-go*_6C`>kT}t1d$N3UN%|Sf^mzK=Z*7>;7kQ^^JsdI`nqRFmfuZ~B2@*{}l|0{dnbzFuI4$&UuKkQY0m;cjOP0fjwxVI{{-Rwwt4;S}`cZVgk-yx%W#t z)z&Ho)N+b?%(JQArXUqCzhOi6mrAk1+8^XVRq6|p!Ubm^S{I>F6zDVbp4?0>lg<2l}TO)@J0*Ceuz5PUCq@0()Tnji;22C6_>d`-+#>!#I z5QZl*RlGZJI6tE5O`pgY7EK?*NYU1EnUl}?o8UN&vC{e${Uskw99dKpgKj)Jh{6=tM4VRjZla#Fbv@M z^naBrkdk|@e6~c(bG?q&_4J{Xo$};<_2P;(2`8-i)8|p!u_L;j&qL$E;05y*x%<{W zsavEKzKXbWhZ$TNZtK=u(O6lv4YT9T2xnqY82PZf@+71OGG@)ISt+HEge!=^fKln~ zwWcJ1M7M@5i`IxVA}ju4dhwZ_T#Sed4F5JXMQ0;dLO>tqbfE-~S34 zQe)pP*g;(_J_ndQC^dzl-}Oat4n*8356cRS#0Yi z!!b4IatG~9j9wdxv$W(hEjZd0eT~y-GoP)E*qs%Q4grVzb5c(2WR9yixn7NELsJXo z)xM0nT&syW1H6Y}MigDO{0acBuGlv8&M?J_jgMnMRX8qj?q~vdz?@O_{`MGDzSjLo zl$5ZaflWA1Mp-N}OD3Xo1ZVF_i@J;jYm1>z$?J{b-(r19x zN@*RXoG$18_r-H1Npa0hV0B;fCQ{DqOEdvqS$Y{vwFu1H1T(7_()o*tZ-hAkg<13O z{qP?W*ILre)>*t=ne(!>W+hCP$@qDf1iTWaz=W$42!3SBDp@E{f4NctDBzbPBzjZ9 z#)qW^dP8pN$W}nsj5h134g_Wmp~D!WNR-*o$CQG6cxPhO7{Gd zh~R$l2k79hy3;U6a!EXoxG(R0@a2AUF((#SH9l(JUAPj1!Q)9iR8&;-o>tfzWR)XY z{{e;c&tt(^It`EDNB0Ec84+!jeAt%trjoXjMg7g$+VC^si4Haitkmc0Zj*TxMV`Y} z;p|VdQGK3ntKk6D2PF(ymcD9zTR{%s!?LMmNEEECz3t-3^9N!C!UW0`#u{7DtF8JW zaVG*>(ECW$W;5(JqoG>l=Y7A|5{Dto%syxjgsDEB?UF#c0oc2w5D`lX=e#8H7QmK?t%90pTq%0Am218_tvC9&J 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