├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── change_request.yml
│ └── config.yml
├── PULL_REQUEST_TEMPLATE.md
├── dependabot.yml
└── workflows
│ ├── PSScriptAnalyzer.yml
│ ├── PSScriptAnalyzerSettings.psd1
│ ├── Release.yml
│ └── codeql.yml
├── .gitignore
├── .vscode
└── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── Samples
├── BackupInfastructure.webp
├── Backup_Repository.webp
├── Backup_SOBR.webp
└── VBR_Backup_Proxy_with_Debug.webp
├── Src
├── Private
│ ├── Get-DiagBackupServer.ps1
│ ├── Get-DiagBackupToCloudConnect.ps1
│ ├── Get-DiagBackupToFileProxy.ps1
│ ├── Get-DiagBackupToHvProxy.ps1
│ ├── Get-DiagBackupToProtectedGroup.ps1
│ ├── Get-DiagBackupToRepo.ps1
│ ├── Get-DiagBackupToSobr.ps1
│ ├── Get-DiagBackupToTape.ps1
│ ├── Get-DiagBackupToViProxy.ps1
│ ├── Get-DiagBackupToWanAccel.ps1
│ ├── Get-VbrBackupArchObjRepoInfo.ps1
│ ├── Get-VbrBackupCCBackupStorageInfo.ps1
│ ├── Get-VbrBackupCCPerTenantInfo.ps1
│ ├── Get-VbrBackupCCReplicaResourcesInfo.ps1
│ ├── Get-VbrBackupCGPoolInfo.ps1
│ ├── Get-VbrBackupCGServerInfo.ps1
│ ├── Get-VbrBackupEntraIDInfo.ps1
│ ├── Get-VbrBackupHyperVClusterInfo.ps1
│ ├── Get-VbrBackupHyperVStandAloneInfo.ps1
│ ├── Get-VbrBackupObjectRepoInfo.ps1
│ ├── Get-VbrBackupProtectedGroupInfo.ps1
│ ├── Get-VbrBackupProxyInfo.ps1
│ ├── Get-VbrBackupRepoInfo.ps1
│ ├── Get-VbrBackupServerInfo.ps1
│ ├── Get-VbrBackupSobrInfo.ps1
│ ├── Get-VbrBackupTapeDrivesInfo.ps1
│ ├── Get-VbrBackupTapeLibraryInfo.ps1
│ ├── Get-VbrBackupTapeServerInfo.ps1
│ ├── Get-VbrBackupWanAccelInfo.ps1
│ ├── Get-VbrBackupvSphereInfo.ps1
│ ├── Get-VbrBackupvSphereStandAloneInfo.ps1
│ ├── Get-VbrDiagramObjects.ps1
│ ├── Get-VbrInfraDiagram.ps1
│ ├── Get-VbrRequiredModule.ps1
│ ├── Get-VbrServerConnection.ps1
│ ├── Images.ps1
│ └── SharedUtilsFunctions.ps1
└── Public
│ └── New-VeeamDiagram.ps1
├── Todo
├── Veeam.Diagrammer.psd1
├── Veeam.Diagrammer.psm1
└── icons
├── ADFolder.png
├── AHV_host.png
├── AWS S3.png
├── AWS.png
├── Antivirus.png
├── Application.png
├── Automation.png
├── Azure Blob.png
├── Azure.png
├── Backup Browser.png
├── Backup_file.png
├── BidirectionalArrow.png
├── BlankFiller.png
├── CDP.png
├── CSV_Computers.png
├── Cloud.png
├── Cloud_Repository.png
├── Command Line.png
├── Controller.png
├── DR plan.png
├── Data Volume.png
├── Data file.png
├── Data_Mover.png
├── Data_Volume.png
├── Data_volume_snapshot.png
├── Database.png
├── Database_server.png
├── Datacenter.png
├── Datalabs.png
├── Datastore.png
├── Datastore_33__full.png
├── Datastore_66__full.png
├── Datastore_empty.png
├── Deduplicating Storage.png
├── Deduplicating_Storage.png
├── Deduplication.png
├── Domain Controller.png
├── ESXi-Hyper-V host.png
├── ESXi-Hyper-V-AHV host.png
├── ESXi_Hyper-V_AHV_host.png
├── ESXi_Hyper-V_host.png
├── ESXi_host.png
├── Encryption Key.png
├── Enterprise (business).png
├── Exchange objects.png
├── Exchange_server.png
├── FLR helper appliance.png
├── FLR_helper_appliance.png
├── Failover.png
├── File browser.png
├── File.png
├── Firewall.png
├── Folder.png
├── Globe.png
├── HDD.png
├── Hardware_controller.png
├── Hyper-V_host.png
├── IBM_Object_Storage.png
├── IndividualPCFolder.png
├── Instant VM recovery.png
├── Interface - Console.png
├── Key.png
├── Laptop.png
├── Letter.png
├── License file.png
├── Linux.png
├── Linux_Repository.png
├── Linux_VM.png
├── Linux_server.png
├── Logo_Database.png
├── Logo_SOBR.png
├── Magnifying Glass.png
├── ManualFolder.png
├── Metadata file.png
├── Microsoft Active Directory.png
├── Microsoft Exchange.png
├── Microsoft Office.png
├── Microsoft OneDrive.png
├── Microsoft Outlook.png
├── Microsoft SCOM.png
├── Microsoft SQL.png
├── Microsoft SharePoint.png
├── Microsoft Teams.png
├── Microsoft Windows.png
├── Microsoft_Entra_ID.png
├── Microsoft_SCVMM.png
├── Microsoft_SQL_DB.png
├── Monitor.png
├── Monitoring Console.png
├── Mount_Server.png
├── NAS backup.png
├── NAS.png
├── Network Proxy.png
├── Network_card.png
├── Number eight.png
├── Number five.png
├── Number four.png
├── Number nine.png
├── Number one.png
├── Number seven.png
├── Number six.png
├── Number three.png
├── Number two.png
├── Nutanix.png
├── ONE_server.png
├── Object_Storage.png
├── Object_Storage_support.png
├── On-demand Sandbox.png
├── OpenVPN.png
├── Oracle DB.png
├── Oracle RMAN.png
├── Physical switch.png
├── PostGre_SQL_DB.png
├── PowerShell.png
├── Proxy_Server.png
├── RAM.png
├── RESTful API.png
├── Report.png
├── Repository_Server.png
├── Restore.png
├── Role.png
├── S3-compatible.png
├── SAP BRtools.png
├── SAP HANA DB.png
├── SAP HANA.png
├── SMB (business).png
├── SQL_server.png
├── Scale_out_Backup_Repository.png
├── Scheduled backups.png
├── Search_server.png
├── Server Cluster.png
├── Server.png
├── Server_Cluster.png
├── Server_Nutanix.png
├── Server_Stack.png
├── Server_with_Veeam_Agent.png
├── Service-Application.png
├── SharePoint_server.png
├── Shared_folder.png
├── Storage.png
├── Storage_NetApp.png
├── Storage_Snapshot.png
├── Storage_Stack.png
├── Storage_with_snapshot.png
├── SureBackup.png
├── SureReplica.png
├── Table.png
├── Tag.png
├── Tape encrypted.png
├── Tape recording.png
├── Tape writing device.png
├── Tape.png
├── Tape_Drive.png
├── Tape_Library.png
├── Tape_Media_Pool.png
├── Tape_Server.png
├── Task list.png
├── Transport_Service.png
├── User Group.png
├── User.png
├── VAO_server.png
├── VAS_server.png
├── VBEM_server.png
├── VBO_Repository.png
├── VBO_server.png
├── VBR console.png
├── VBR_Repository.png
├── VBR_server.png
├── VBR_server_old.png
├── VM_with_a_snapshot.png
├── VMware vCloud Director.png
├── VMware vSAN.png
├── VMware vSwitch.png
├── VMware_vSphere.png
├── VPN.png
├── VPN_server.png
├── VSPC_server.png
├── Veeam Cloud Mobility.png
├── Veeam Sapphire.png
├── Veeam_Agent_for_IBM_AIX.png
├── Veeam_Agent_for_Linux.png
├── Veeam_Agent_for_Oracle_Solaris.png
├── Veeam_Agent_for_Windows.png
├── Veeam_Agents.png
├── Veeam_Availability_Orchestrator.png
├── Veeam_Availability_Suite.png
├── Veeam_Backup_Enterprise_Manager.png
├── Veeam_Backup___Replication.png
├── Veeam_Backup_for_Office_365.png
├── Veeam_Cloud_Connect.png
├── Veeam_Explorer_for_Active_Directory.png
├── Veeam_Explorer_for_Exchange.png
├── Veeam_Explorer_for_OneDrive.png
├── Veeam_MP.png
├── Veeam_ONE.png
├── Veeam_ONE_Reporter.png
├── Veeam_PN.png
├── Veeam_Proxy.png
├── Veeam_Repository.png
├── Veeam_Service_Provider_Console.png
├── Veeam_Service_Provider_Server.png
├── Veeam_logo.png
├── Veeam_logo_new.png
├── Virtual_Machine.png
├── Virtual_host.png
├── WAN_accelerator.png
├── Web console.png
├── Windows Repository.png
├── Windows_Repository.png
├── Windows_VM.png
├── Windows_server.png
├── Workstation.png
├── no_icon.png
├── vCenter_server.png
├── vCloud_Director_server.png
└── verified_recoverability.png
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: Bug Report
2 | description: File a bug report
3 | title: "[BUG]"
4 | labels: ["bug"]
5 | assignees:
6 | - rebelinux
7 | body:
8 | - type: textarea
9 | id: bug-description
10 | attributes:
11 | label: Bug description
12 | description: >-
13 | Please provide a clear and concise description of the bug.
14 | validations:
15 | required: true
16 | - type: textarea
17 | id: output-log-generation
18 | attributes:
19 | label: Log Generation
20 | description: >-
21 | Please provide the Output.log as described in [Run cmdlet with debugging options](https://github.com/rebelinux/Veeam.Diagrammer/wiki/Run-cmdlet-with-debugging-options). Attach the file in the text area.
22 | placeholder: |-
23 | Drag & drop the file in the Here.
24 | validations:
25 | required: true
26 | - type: textarea
27 | id: steps-to-reproduce
28 | attributes:
29 | label: Steps to reproduce
30 | description: >-
31 | Please provide a detailed list of steps to reproduce the bug.
32 | placeholder: |-
33 | 1. ....
34 | 2. ....
35 | 3. ....
36 | validations:
37 | required: true
38 | - type: textarea
39 | id: screenshots
40 | attributes:
41 | label: Screenshots
42 | description: >-
43 | Please attach any screenshots to help explain the problem. Please ensure that you obscure any sensitive information.
44 | placeholder: |-
45 | Drag and drop screenshots here.
46 | - type: textarea
47 | id: operating-system
48 | attributes:
49 | label: Operating System
50 | description: Please provide information about the operating system are you using.
51 | placeholder: macOS Big Sur, Windows 10, Ubuntu 20.04 LTS
52 | validations:
53 | required: true
54 | - type: textarea
55 | id: powershell-version
56 | attributes:
57 | label: PowerShell Version
58 | description: Please provide information about the PowerShell version you are using. Please provide the output from the following PowerShell command `$PSVersionTable`.
59 | placeholder: $PSVersionTable
60 | validations:
61 | required: true
62 | - type: textarea
63 | id: powershell-modules
64 | attributes:
65 | label: PowerShell Modules
66 | description: Please provide information about the PowerShell modules are you using. Please provide the output from the following PowerShell command `Get-Module -ListAvailable @("Veeam.Diagrammer";"PSGraph") | Select Name, Version`
67 | placeholder: Get-Module -ListAvailable @("Veeam.Diagrammer";"PSGraph") | Select Name, Version
68 | validations:
69 | required: true
70 | - type: checkboxes
71 | id: checklist
72 | attributes:
73 | label: Before submitting
74 | description: >-
75 | Please ensure your bug report fulfills all of the following requirements.
76 | If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
77 | options:
78 | - label: >-
79 | I have read and followed the [bug reporting guidelines](https://github.com/rebelinux/Veeam.Diagrammer/blob/dev/CONTRIBUTING.md).
80 | required: true
81 | - label: >-
82 | I have read [the documentation](https://github.com/rebelinux/Veeam.Diagrammer/blob/dev/README.md),
83 | and referred to the [known issues](https://github.com/rebelinux/Veeam.Diagrammer/?tab=readme-ov-file#x-known-issues) before submitting this bug report.
84 | required: true
85 | - label: >-
86 | I have checked for previously opened & closed [issues](https://github.com/rebelinux/Veeam.Diagrammer/issues) before submitting this bug report.
87 | required: true
88 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/change_request.yml:
--------------------------------------------------------------------------------
1 | name: Change Request
2 | description: Request a new change or an improvement
3 | title: "[Feature Request]"
4 | labels: ["change request"]
5 | assignees:
6 | - rebelinux
7 | body:
8 | - type: textarea
9 | id: description
10 | attributes:
11 | label: Description
12 | description: >-
13 | Please provide a detailed description of your idea so that the project maintainers and contributors can fully understand what change, change, or improvement you are proposing.
14 | validations:
15 | required: true
16 | - type: textarea
17 | id: additional-context
18 | attributes:
19 | label: Additional Context
20 | description: This field is optional. You may provide additional context for the idea you wish to propose. You may wish to include links to any related [issues](https://github.com/rebelinux/Veeam.Diagrammer/issues) or other relevant information.
21 | - type: checkboxes
22 | id: checklist
23 | attributes:
24 | label: Before submitting
25 | description: >-
26 | Please ensure your change request fulfills all of the following requirements.
27 | If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
28 | options:
29 | - label: >-
30 | I have read [the documentation](https://github.com/rebelinux/Veeam.Diagrammer/blob/dev/README.md),
31 | and referred to the [known issues](https://github.com/rebelinux/Veeam.Diagrammer/?tab=readme-ov-file#x-known-issues) before submitting this change request.
32 | required: true
33 | - label: >-
34 | I have checked for previously opened & closed [issues](https://github.com/rebelinux/Veeam.Diagrammer/issues) before submitting this change request.
35 | required: true
36 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ## Description
4 |
5 |
6 | ## Related Issue
7 |
8 |
9 |
10 |
11 |
12 | ## Motivation and Context
13 |
14 |
15 | ## How Has This Been Tested?
16 |
17 |
18 |
19 |
20 | ## Screenshots (if appropriate):
21 |
22 | ## Types of changes
23 |
24 | - [ ] Bug fix (non-breaking change which fixes an issue)
25 | - [ ] New feature (non-breaking change which adds functionality)
26 | - [ ] Breaking change (fix or feature that would cause existing functionality to change)
27 |
28 | ## Checklist:
29 |
30 |
31 | - [ ] My code follows the code style of this project.
32 | - [ ] My change requires a change to the documentation.
33 | - [ ] I have updated the documentation accordingly.
34 | - [ ] I have read the [**CONTRIBUTING**](/CONTRIBUTING.md) document.
35 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "github-actions" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "weekly"
12 |
--------------------------------------------------------------------------------
/.github/workflows/PSScriptAnalyzer.yml:
--------------------------------------------------------------------------------
1 | name: PSScriptAnalyzer
2 | on: [push, pull_request]
3 | jobs:
4 | lint:
5 | name: Run PSScriptAnalyzer
6 | runs-on: ubuntu-latest
7 | steps:
8 | - uses: actions/checkout@v4
9 | - name: lint
10 | uses: devblackops/github-action-psscriptanalyzer@master
11 | with:
12 | sendComment: true
13 | failOnErrors: true
14 | failOnWarnings: false
15 | failOnInfos: false
16 | repoToken: ${{ secrets.GITHUB_TOKEN }}
17 | settingsPath: .github/workflows/PSScriptAnalyzerSettings.psd1
18 |
--------------------------------------------------------------------------------
/.github/workflows/PSScriptAnalyzerSettings.psd1:
--------------------------------------------------------------------------------
1 | @{
2 | ExcludeRules = @(
3 | 'PSUseBOMForUnicodeEncodedFile',
4 | 'PSUseToExportFieldsInManifest',
5 | 'PSAvoidGlobalVars',
6 | 'PSAvoidUsingPlainTextForPassword',
7 | 'PSAvoidUsingUsernameAndPasswordParams'
8 | 'PSAvoidUsingConvertToSecureStringWithPlainText'
9 | 'PSAvoidUsingWriteHost'
10 | )
11 | }
12 |
--------------------------------------------------------------------------------
/.github/workflows/Release.yml:
--------------------------------------------------------------------------------
1 | name: Publish PowerShell Module
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | jobs:
8 | publish-to-gallery:
9 | runs-on: windows-2019
10 | steps:
11 | - uses: actions/checkout@v4
12 | - name: Set PSRepository to Trusted for PowerShell Gallery
13 | shell: pwsh
14 | run: |
15 | Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
16 | - name: Install PSGraph module
17 | shell: pwsh
18 | run: |
19 | Install-Module -Name PSGraph -Repository PSGallery -Force
20 | - name: Install Diagrammer.Core module
21 | shell: pwsh
22 | run: |
23 | Install-Module -Name Diagrammer.Core -Repository PSGallery -Force
24 | - name: Test Module Manifest
25 | shell: pwsh
26 | run: |
27 | Test-ModuleManifest .\Veeam.Diagrammer.psd1
28 | - name: Publish module to PowerShell Gallery
29 | shell: pwsh
30 | run: |
31 | Publish-Module -Path ./ -NuGetApiKey ${{ secrets.PSGALLERY_API_KEY }} -Verbose
32 |
--------------------------------------------------------------------------------
/.github/workflows/codeql.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | #
6 | # https://github.com/microsoft/action-psscriptanalyzer
7 | # For more information on PSScriptAnalyzer in general, see
8 | # https://github.com/PowerShell/PSScriptAnalyzer
9 |
10 | name: CodeQL
11 |
12 | on:
13 | push:
14 | branches: [ "dev" ]
15 | pull_request:
16 | branches: [ "dev" ]
17 |
18 | permissions:
19 | contents: read
20 |
21 | jobs:
22 | build:
23 | permissions:
24 | contents: read # for actions/checkout to fetch code
25 | security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
26 | actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
27 | name: PSScriptAnalyzer
28 | runs-on: ubuntu-latest
29 | steps:
30 | - uses: actions/checkout@v4
31 |
32 | - name: Run PSScriptAnalyzer
33 | uses: microsoft/psscriptanalyzer-action@v1.1
34 | with:
35 | # Check https://github.com/microsoft/action-psscriptanalyzer for more info about the options.
36 | # The below set up runs PSScriptAnalyzer to your entire repository and runs some basic security rules.
37 | path: .\
38 | recurse: true
39 | # Include your own basic security rules. Removing this option will run all the rules
40 | excludeRule: '"PSAvoidUsingPlainTextForPassword", "PSAvoidUsingUsernameAndPasswordParams", "PSAvoidUsingConvertToSecureStringWithPlainText"'
41 | output: results.sarif
42 |
43 | # Upload the SARIF file generated in the previous step
44 | - name: Upload SARIF results file
45 | uses: github/codeql-action/upload-sarif@v3
46 | with:
47 | sarif_file: results.sarif
48 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | debug.log
2 | .gitignore
3 | # Created by https://www.toptal.com/developers/gitignore/api/powershell
4 | # Edit at https://www.toptal.com/developers/gitignore?templates=powershell
5 |
6 | ### PowerShell ###
7 | # Exclude packaged modules
8 | *.zip
9 |
10 | # End of https://www.toptal.com/developers/gitignore/api/powershell
11 |
12 | ### vscode ###
13 | .vscode/tasks.json
14 | .vscode/launch.json
15 | .vscode/extensions.json
16 | *.code-workspace
17 |
18 | # End of https://www.toptal.com/developers/gitignore/api/hugo,vscode
19 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "powershell.codeFormatting.preset": "Custom",
3 | "powershell.codeFormatting.useCorrectCasing": true,
4 | "powershell.codeFormatting.autoCorrectAliases": true,
5 | "powershell.codeFormatting.whitespaceBeforeOpenBrace": true,
6 | "powershell.codeFormatting.whitespaceBeforeOpenParen": true,
7 | "powershell.codeFormatting.whitespaceAroundOperator": true,
8 | "powershell.codeFormatting.whitespaceAfterSeparator": true,
9 | "powershell.codeFormatting.addWhitespaceAroundPipe": true,
10 | "powershell.codeFormatting.ignoreOneLineBlock": true,
11 | "powershell.codeFormatting.newLineAfterCloseBrace": false,
12 | "powershell.codeFormatting.newLineAfterOpenBrace": true,
13 | "powershell.codeFormatting.openBraceOnSameLine": true,
14 | "powershell.codeFormatting.alignPropertyValuePairs": false,
15 | "powershell.codeFolding.enable": true,
16 | "powershell.scriptAnalysis.enable": true,
17 | "powershell.scriptAnalysis.settingsPath": ".github/workflows/PSScriptAnalyzerSettings.psd1",
18 | "editor.tabSize": 4,
19 | "editor.insertSpaces": true,
20 | "editor.detectIndentation": false,
21 | "editor.rulers": [
22 | 115
23 | ],
24 | "files.trimTrailingWhitespace": true
25 | }
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to this project
2 |
3 | Please take a moment to review this document in order to make the contribution
4 | process easy and effective for everyone involved.
5 |
6 | Following these guidelines helps to communicate that you respect the time of
7 | the developers managing and developing this open source project. In return,
8 | they should reciprocate that respect in addressing your issue or assessing
9 | patches and features.
10 |
11 |
12 | ## Using the issue tracker
13 |
14 | The issue tracker is the preferred channel for [bug reports](#bugs),
15 | [features requests](#features) and [submitting pull
16 | requests](#pull-requests), but please respect the following restrictions:
17 |
18 | * Please **do not** use the issue tracker for personal support requests (use
19 | [Stack Overflow](http://stackoverflow.com) or Veeam Forum).
20 |
21 | * Please **do not** derail or troll issues. Keep the discussion on topic and
22 | respect the opinions of others.
23 |
24 |
25 |
26 | ## Bug reports
27 |
28 | A bug is a _demonstrable problem_ that is caused by the code in the repository.
29 | Good bug reports are extremely helpful - thank you!
30 |
31 | Guidelines for bug reports:
32 |
33 | 1. **Use the GitHub issue search** — check if the issue has already been
34 | reported.
35 |
36 | 2. **Check if the issue has been fixed** — try to reproduce it using the
37 | latest `master` or development branch in the repository.
38 |
39 | 3. **Isolate the problem** — create a [reduced test
40 | case](http://css-tricks.com/reduced-test-cases/) and a live example.
41 |
42 | A good bug report shouldn't leave others needing to chase you up for more
43 | information. Please try to be as detailed as possible in your report. What is
44 | your environment? What steps will reproduce the issue? What browser(s) and OS
45 | experience the problem? What would you expect to be the outcome? All these
46 | details will help people to fix any potential bugs.
47 |
48 | Example:
49 |
50 | > Short and descriptive example bug report title
51 | >
52 | > A summary of the issue and the browser/OS environment in which it occurs. If
53 | > suitable, include the steps required to reproduce the bug.
54 | >
55 | > 1. This is the first step
56 | > 2. This is the second step
57 | > 3. Further steps, etc.
58 | >
59 | > `` - a link to the reduced test case
60 | >
61 | > Any other information you want to share that is relevant to the issue being
62 | > reported. This might include the lines of code that you have identified as
63 | > causing the bug, and potential solutions (and your opinions on their
64 | > merits).
65 |
66 |
67 |
68 | ## Feature requests
69 |
70 | Feature requests are welcome. But take a moment to find out whether your idea
71 | fits with the scope and aims of the project. It's up to *you* to make a strong
72 | case to convince the project's developers of the merits of this feature. Please
73 | provide as much detail and context as possible.
74 |
75 |
76 |
77 | ## Pull requests
78 |
79 | Good pull requests - patches, improvements, new features - are a fantastic
80 | help. They should remain focused in scope and avoid containing unrelated
81 | commits.
82 |
83 | **Please ask first** before embarking on any significant pull request (e.g.
84 | implementing features, refactoring code, porting to a different language),
85 | otherwise you risk spending a lot of time working on something that the
86 | project's developers might not want to merge into the project.
87 |
88 | Please adhere to the coding conventions used throughout a project (indentation,
89 | accurate comments, etc.) and any other requirements (such as test coverage).
90 |
91 | Follow this process if you'd like your work considered for inclusion in the
92 | project:
93 |
94 | 1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
95 | and configure the remotes:
96 |
97 | ```bash
98 | # Clone your fork of the repo into the current directory
99 | git clone https://github.com//
100 | # Navigate to the newly cloned directory
101 | cd
102 | # Assign the original repo to a remote called "upstream"
103 | git remote add upstream https://github.com//
104 | ```
105 |
106 | 2. If you cloned a while ago, get the latest changes from upstream:
107 |
108 | ```bash
109 | git checkout
110 | git pull upstream
111 | ```
112 |
113 | 3. Create a new topic branch (off the main project development branch) to
114 | contain your feature, change, or fix:
115 |
116 | ```bash
117 | git checkout -b
118 | ```
119 |
120 | 4. Commit your changes in logical chunks. Please adhere to these [git commit
121 | message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
122 | or your code is unlikely be merged into the main project. Use Git's
123 | [interactive rebase](https://help.github.com/articles/interactive-rebase)
124 | feature to tidy up your commits before making them public.
125 |
126 | 5. Locally merge (or rebase) the upstream development branch into your topic branch:
127 |
128 | ```bash
129 | git pull [--rebase] upstream
130 | ```
131 |
132 | 6. Push your topic branch up to your fork:
133 |
134 | ```bash
135 | git push origin
136 | ```
137 |
138 | 7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
139 | with a clear title and description.
140 |
141 | **IMPORTANT**: By submitting a patch, you agree to allow the project owner to
142 | license your work under the same license as that used by the project.
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Jonathan Colon
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Samples/BackupInfastructure.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/Samples/BackupInfastructure.webp
--------------------------------------------------------------------------------
/Samples/Backup_Repository.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/Samples/Backup_Repository.webp
--------------------------------------------------------------------------------
/Samples/Backup_SOBR.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/Samples/Backup_SOBR.webp
--------------------------------------------------------------------------------
/Samples/VBR_Backup_Proxy_with_Debug.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/Samples/VBR_Backup_Proxy_with_Debug.webp
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupServer.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupServer {
2 | <#
3 | .SYNOPSIS
4 | Function to build Backup Server object.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param()
18 |
19 | process {
20 | try {
21 |
22 | $BackupServerInfoArray = @()
23 |
24 | if (( -Not $DatabaseServerInfo.Name ) -and ( -Not $EMServerInfo.Name ) -and ($BackupServerInfo.Name)) {
25 | Write-Verbose -Message "Collecting Backup Server Information."
26 |
27 | $BackupServerInfoArray += $BackupServerInfo.Label
28 | } elseif (($DatabaseServerInfo.Name -ne $BackupServerInfo.Name) -and ($EMServerInfo.Name -ne $BackupServerInfo.Name )) {
29 | Write-Verbose -Message "Collecting Backup Server, Database Server and Enterprise Manager Information."
30 |
31 | $BackupServerInfoArray += $EMServerInfo.Label
32 | $BackupServerInfoArray += $BackupServerInfo.Spacer
33 | $BackupServerInfoArray += $BackupServerInfo.Label
34 | $BackupServerInfoArray += $BackupServerInfo.Spacer
35 | $BackupServerInfoArray += $DatabaseServerInfo.Label
36 | } elseif (($DatabaseServerInfo.Name -ne $BackupServerInfo.Name) -and (-Not $EMServerInfo)) {
37 | Write-Verbose -Message "Not Enterprise Manager Found: Collecting Backup Server and Database server Information."
38 |
39 | $BackupServerInfoArray += $BackupServerInfo.Label
40 | $BackupServerInfoArray += $BackupServerInfo.Spacer
41 | $BackupServerInfoArray += $DatabaseServerInfo.Label
42 | } elseif (($EMServerInfo.Name -eq $BackupServerInfo.Name) -and ($DatabaseServerInfo.Name -eq $BackupServerInfo.Name)) {
43 | Write-Verbose -Message "Database and Enterprise Manager server collocated with Backup Server: Collecting Backup Server and Enterprise Manager Information."
44 |
45 | $BackupServerInfoArray += $BackupServerInfo.Label
46 | } elseif (($EMServerInfo.Name -eq $BackupServerInfo.Name) -and ($DatabaseServerInfo.Name -ne $BackupServerInfo.Name)) {
47 | Write-Verbose -Message "Enterprise Maneger server colocated with Backup Server: Collecting Backup Server and Enterprise Manager Information."
48 |
49 | $BackupServerInfoArray += $BackupServerInfo.Label
50 | $BackupServerInfoArray += $BackupServerInfo.Spacer
51 | $BackupServerInfoArray += $DatabaseServerInfo.Label
52 | } elseif ($EMServerInfo -and ($DatabaseServerInfo.Name -eq $BackupServerInfo.Name)) {
53 | Write-Verbose -Message "Database server colocated with Backup Server: Collecting Backup Server and Enterprise Manager Information."
54 |
55 | $BackupServerInfoArray += $EMServerInfo.Label
56 | $BackupServerInfoArray += $BackupServerInfo.Spacer
57 | $BackupServerInfoArray += $BackupServerInfo.Label
58 | } else {
59 | Write-Verbose -Message "Collecting Backup Server Information."
60 | $BackupServerInfoArray += $BackupServerInfo.Label
61 | }
62 |
63 |
64 | if ($BackupServerInfoArray) {
65 |
66 | $columnSize = $BackupServerInfoArray.Count
67 |
68 | $BackupServerInfoSubGraph = (Add-DiaHTMLSubGraph -CellSpacing 4 -ImagesObj $Images -TableArray $BackupServerInfoArray -Align 'Center' -IconDebug $IconDebug -Label 'Backup Server' -LabelPos "top" -fontColor $BackupServerFontColor -fontSize 26 -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "0" -columnSize $columnSize)
69 |
70 | Node -Name BackupServers -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $BackupServerInfoSubGraph -Align 'Right' -IconDebug $IconDebug -Label 'Management' -LabelPos "down" -fontColor $Fontcolor -fontSize 14 -TableStyle "rounded" -TableBorderColor $Edgecolor -TableBorder "2" -columnSize 1); style = 'filled,rounded'; shape = 'plain'; fillColor = $BackupServerBGColor; fontsize = 14; fontname = "Segoe Ui" }
71 |
72 | } else {
73 | throw "No Backup Server Information Found."
74 | }
75 |
76 | } catch {
77 | Write-Verbose -Message $_.Exception.Message
78 | }
79 | }
80 | end {}
81 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToCloudConnect.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToCloudConnect {
2 | <#
3 | .SYNOPSIS
4 | Function to build Backup Server to Cloud Connect diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | # Cloud Connect Graphviz Cluster
27 | $CloudConnectInfraArray = @()
28 |
29 | if ($CGServerInfo = Get-VbrBackupCGServerInfo) {
30 | if ($CGServerInfo.Name.Count -eq 1) {
31 | $CGServerNodeColumnSize = 1
32 | } elseif ($ColumnSize) {
33 | $CGServerNodeColumnSize = $ColumnSize
34 | } else {
35 | $CGServerNodeColumnSize = $CGServerInfo.Name.Count
36 | }
37 | try {
38 | $CGServerNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CGServerInfo.Name -Align "Center" -iconType "VBR_Cloud_Connect_Gateway" -columnSize $CGServerNodeColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CGServerInfo.AditionalInfo -Subgraph -SubgraphIconType "VBR_Service_Providers_Server" -SubgraphLabel "Gateway Servers" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18
39 |
40 | $CloudConnectInfraArray += $CGServerNode
41 | # $CloudConnectInfraArray += $BlankFiller
42 | } catch {
43 | Write-Verbose "Error: Unable to create CloudGateway server Objects. Disabling the section"
44 | Write-Debug "Error Message: $($_.Exception.Message)"
45 | }
46 | if ($CGPoolInfo = Get-VbrBackupCGPoolInfo) {
47 | try {
48 | $CGPoolNode = foreach ($CGPool in $CGPoolInfo) {
49 | if ($CGPoolInfo.CloudGateways) {
50 | if ($CGPoolInfo.CloudGateways.count -le 5) {
51 | $CGPoolInfocolumnSize = $CGPoolInfo.CloudGateways.count
52 | } elseif ($ColumnSize) {
53 | $CGPoolInfocolumnSize = $ColumnSize
54 | } else {
55 | $CGPoolInfocolumnSize = 5
56 | }
57 | Add-DiaHTMLTable -ImagesObj $Images -Rows $CGPool.CloudGateways.Name.split(".")[0] -Align 'Center' -ColumnSize $CGPoolInfocolumnSize -IconDebug $IconDebug -Subgraph -SubgraphIconType "VBR_Cloud_Connect_Gateway" -SubgraphLabel $CGPool.Name -SubgraphLabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -NoFontBold -FontSize 18
58 | } else {
59 | Add-DiaHTMLTable -ImagesObj $Images -Rows 'No Cloud Gateway Server' -Align 'Center' -ColumnSize 1 -IconDebug $IconDebug -Subgraph -SubgraphIconType "VBR_Cloud_Connect_Gateway" -SubgraphLabel $CGPool.Name -SubgraphLabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -NoFontBold -FontSize 18
60 | }
61 | }
62 | } catch {
63 | Write-Verbose "Error: Unable to create CGPoolInfo Objects. Disabling the section"
64 | Write-Debug "Error Message: $($_.Exception.Message)"
65 | }
66 | try {
67 | if ($CGPoolNode) {
68 | if ($CGPoolNode.count -le 5) {
69 | $CGPoolNodecolumnSize = $CGPoolNode.count
70 | } elseif ($ColumnSize) {
71 | $CGPoolNodecolumnSize = $ColumnSize
72 | } else {
73 | $CGPoolNodecolumnSize = 5
74 | }
75 | $CGPoolNodesSubGraph += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CGPoolNode -Align 'Center' -IconDebug $IconDebug -Label 'Gateway Pools' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $CGPoolNodecolumnSize -fontSize 22 -IconType "VBR_Cloud_Connect_Gateway_Pools"
76 |
77 | $CloudConnectInfraArray += $CGPoolNodesSubGraph
78 | # $CloudConnectInfraArray += $BlankFiller
79 | }
80 | } catch {
81 | Write-Verbose "Error: Unable to create CGPoolInfo SubGraph Objects. Disabling the section"
82 | Write-Debug "Error Message: $($_.Exception.Message)"
83 | }
84 | }
85 |
86 | if ($CCBSInfo = Get-VbrBackupCCBackupStorageInfo) {
87 | if ($CCBSInfo.Name.count -le 5) {
88 | $CCBSInfocolumnSize = $CCBSInfo.Name.count
89 | } elseif ($ColumnSize) {
90 | $CCBSInfocolumnSize = $ColumnSize
91 | } else {
92 | $CCBSInfocolumnSize = 5
93 | }
94 | try {
95 | $CCBSNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCBSInfo.Name -Align "Center" -iconType $CCBSInfo.IconType -columnSize $CCBSInfocolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCBSInfo.AditionalInfo -Subgraph -SubgraphIconType "VBR_Repository" -SubgraphLabel "Backup Storage" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18
96 |
97 | $CloudConnectInfraArray += $CCBSNode
98 | # $CloudConnectInfraArray += $BlankFiller
99 | } catch {
100 | Write-Verbose "Error: Unable to create CCBSNode Objects. Disabling the section"
101 | Write-Debug "Error Message: $($_.Exception.Message)"
102 | }
103 | }
104 | if ($CCRRInfo = Get-VbrBackupCCReplicaResourcesInfo) {
105 | if ($CCRRInfo.Name.count -le 5) {
106 | $CCRRInfocolumnSize = $CCRRInfo.Name.count
107 | } elseif ($ColumnSize) {
108 | $CCRRInfocolumnSize = $ColumnSize
109 | } else {
110 | $CCRRInfocolumnSize = 5
111 | }
112 | try {
113 | $CCRRNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCRRInfo.Name -Align "Center" -iconType "VBR_Hardware_Resources" -columnSize $CCRRInfocolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCRRInfo.AditionalInfo -Subgraph -SubgraphIconType "VBR_Hardware_Resources" -SubgraphLabel "Replica Resources" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18
114 |
115 | $CloudConnectInfraArray += $CCRRNode
116 | # $CloudConnectInfraArray += $BlankFiller
117 | } catch {
118 | Write-Verbose "Error: Unable to create CCRRNode Objects. Disabling the section"
119 | Write-Debug "Error Message: $($_.Exception.Message)"
120 | }
121 | }
122 | }
123 | if ($CGServerInfo -and $CGServerNode) {
124 | if ($CloudConnectInfraArray.count -le 5) {
125 | $CGServerSubGraphcolumnSize = $CloudConnectInfraArray.count
126 | } elseif ($ColumnSize) {
127 | $CGServerSubGraphcolumnSize = $ColumnSize
128 | } else {
129 | $CGServerSubGraphcolumnSize = 4
130 | }
131 | try {
132 | $CGServerSubGraph = Node -Name "CloudConnectInfra" -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectInfraArray -Align 'Center' -IconDebug $IconDebug -IconType 'VBR_Cloud_Connect' -Label 'Cloud Connect Infrastructure' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $CGServerSubGraphcolumnSize -fontSize 24); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
133 | } catch {
134 | Write-Verbose "Error: Unable to create CloudConnectInfra SubGraph Objects. Disabling the section"
135 | Write-Debug "Error Message: $($_.Exception.Message)"
136 | }
137 |
138 | if ($CGServerSubGraph) {
139 | $CGServerSubGraph
140 | Edge BackupServers -To CloudConnectInfra @{minlen = 3; }
141 | }
142 | }
143 | }
144 | end {}
145 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToFileProxy.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToFileProxy {
2 | <#
3 | .SYNOPSIS
4 | Function to build Backup Server to Proxy diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | try {
27 | $FileBackupProxy = Get-VbrBackupProxyInfo -Type 'nas'
28 | if ($BackupServerInfo) {
29 | if ($FileBackupProxy) {
30 |
31 | if ($FileBackupProxy.Name.Count -le 1) {
32 | $FileBackupProxyColumnSize = 1
33 | } elseif ($ColumnSize) {
34 | $FileBackupProxyColumnSize = $ColumnSize
35 | } else {
36 | $FileBackupProxyColumnSize = $FileBackupProxy.Name.Count
37 | }
38 |
39 | Node FileProxies @{Label = (Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject ($FileBackupProxy | ForEach-Object { $_.Name.split('.')[0] }) -Align "Center" -iconType "VBR_Proxy_Server" -columnSize $FileBackupProxyColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $FileBackupProxy.AditionalInfo -Subgraph -SubgraphIconType "VBR_Proxy" -SubgraphLabel "File Backup Proxies" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 18 -SubgraphLabelFontsize 26); shape = 'plain'; fontsize = 14; fontname = "Segoe Ui" }
40 |
41 | Edge -From BackupServers -To FileProxies @{minlen = 3 }
42 |
43 | }
44 | }
45 | } catch {
46 | Write-Verbose -Message $_.Exception.Message
47 | }
48 | }
49 | end {}
50 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToHvProxy.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToHvProxy {
2 | <#
3 | .SYNOPSIS
4 | Function to build Backup Server to Proxy diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | try {
27 | $HyperVBackupProxy = Get-VbrBackupProxyInfo -Type 'hyperv'
28 | if ($HyperVBackupProxy) {
29 |
30 | if ($HyperVBackupProxy.Name.Count -eq 1) {
31 | $HyperVBackupProxyColumnSize = 1
32 | } elseif ($ColumnSize) {
33 | $HyperVBackupProxyColumnSize = $ColumnSize
34 | } else {
35 | $HyperVBackupProxyColumnSize = $HyperVBackupProxy.Name.Count
36 | }
37 |
38 | Node HvProxies @{Label = (Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject ($HyperVBackupProxy | ForEach-Object { $_.Name.split('.')[0] }) -Align "Center" -iconType "VBR_Proxy_Server" -columnSize $HyperVBackupProxyColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $HyperVBackupProxy.AditionalInfo -Subgraph -SubgraphIconType "VBR_HyperV" -SubgraphLabel "Hyper-V Backup Proxies" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 18 -SubgraphLabelFontsize 22); shape = 'plain'; fontsize = 18; fontname = "Segoe Ui" }
39 |
40 | Edge BackupServers -To HvProxies @{minlen = 3 }
41 | }
42 |
43 | # Hyper-V Graphviz Cluster
44 | if ($vSphereObj = Get-VbrBackupHyperVClusterInfo | Sort-Object) {
45 | $VivCenterNodes = @()
46 | $VivCenterNodesAll = @()
47 | foreach ($vCenter in $vSphereObj) {
48 | $vCenterNodeArray = @()
49 | $ViClustersNodes = @()
50 | $vCenterNodeArray += $vCenter.Label
51 |
52 | try {
53 | if ($vCenter.Childs.Name.Count -eq 1) {
54 | $HyperVBackupProxyColumnSize = 1
55 | } elseif ($ColumnSize) {
56 | $HyperVBackupProxyColumnSize = $ColumnSize
57 | } else {
58 | $HyperVBackupProxyColumnSize = $vCenter.Childs.Name.Count
59 | }
60 |
61 | $ViClustersChildsNodes = Add-DiaHTMLTable -ImagesObj $Images -Rows $vCenter.Childs.Name -Align 'Center' -ColumnSize $HyperVBackupProxyColumnSize -IconDebug $IconDebug -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -NoFontBold -FontSize 18
62 |
63 | } catch {
64 | Write-Verbose "Error: Unable to create Hyper-V Hosts table Objects. Disabling the section"
65 | Write-Debug "Error Message: $($_.Exception.Message)"
66 | }
67 | try {
68 | if ($ViClustersChildsNodes) {
69 | if ($ViClustersChildsNodes.Count -eq 1) {
70 | $ViClustersNodesColumnSize = 1
71 | } elseif ($ColumnSize) {
72 | $ViClustersNodesColumnSize = $ColumnSize
73 | } else {
74 | $ViClustersNodesColumnSize = $ViClustersChildsNodes.Count
75 | }
76 | $ViClustersNodes += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $ViClustersChildsNodes -Align 'Center' -IconDebug $IconDebug -Label 'Hosts' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $ViClustersNodesColumnSize -fontSize 18
77 | $vCenterNodeArray += $ViClustersNodes
78 | }
79 | } catch {
80 | Write-Verbose "Error: Unable to create Hyper-V Hosts Objects. Disabling the section"
81 | Write-Debug "Error Message: $($_.Exception.Message)"
82 | }
83 | try {
84 | if ($vCenterNodeArray) {
85 | $VivCenterNodes += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $vCenterNodeArray -Align 'Center' -IconDebug $IconDebug -Label 'Cluster Servers' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 20
86 | }
87 | } catch {
88 | Write-Verbose "Error: Unable to create Hyper-V Cluster Objects. Disabling the section"
89 | Write-Debug "Error Message: $($_.Exception.Message)"
90 | }
91 | }
92 |
93 | try {
94 | if ($vCenterNodeArray) {
95 | if ($VivCenterNodes.Count -eq 1) {
96 | $VivCenterNodesAllColumnSize = 1
97 | } elseif ($ColumnSize) {
98 | $VivCenterNodesAllColumnSize = $ColumnSize
99 | } else {
100 | $VivCenterNodesAllColumnSize = $VivCenterNodes.Count
101 | }
102 | $VivCenterNodesAll += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $VivCenterNodes -Align 'Center' -IconDebug $IconDebug -Label 'Hyper-V Clusters' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $VivCenterNodesAllColumnSize -fontSize 22
103 | }
104 | } catch {
105 | Write-Verbose "Error: Unable to create Hyper-V Cluster Objects. Disabling the section"
106 | Write-Debug "Error Message: $($_.Exception.Message)"
107 | }
108 | }
109 |
110 | if ($HyperVServerObj = Get-VbrBackupHyperVStandAloneInfo | Sort-Object) {
111 |
112 | if ($HyperVServerObj.Name.Count -eq 1) {
113 | $HyperVServerObjColumnSize = 1
114 | } elseif ($ColumnSize) {
115 | $HyperVServerObjColumnSize = $ColumnSize
116 | } else {
117 | $HyperVServerObjColumnSize = $HyperVServerObj.Name.Count
118 | }
119 |
120 | try {
121 |
122 | $ViStandAloneNodes = (Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject ($HyperVServerObj | ForEach-Object { $_.Name.split('.')[0] }) -Align "Center" -iconType "VBR_HyperV_Server" -columnSize $HyperVServerObjColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $HyperVServerObj.AditionalInfo -Subgraph -SubgraphLabel " " -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1")
123 | } catch {
124 | Write-Verbose "Error: Unable to create Hyper-V StandAlone Hosts Table. Disabling the section"
125 | Write-Debug "Error Message: $($_.Exception.Message)"
126 | }
127 |
128 | if ($ViStandAloneNodes) {
129 | try {
130 | $VivCenterNodesAll += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $ViStandAloneNodes -Align 'Center' -IconDebug $IconDebug -Label 'Hyper-V StandAlone Hosts' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 22
131 | } catch {
132 | Write-Verbose "Error: Unable to create Hyper-V StandAlone Objects. Disabling the section"
133 | Write-Debug "Error Message: $($_.Exception.Message)"
134 | }
135 | }
136 | }
137 |
138 | if ($VivCenterNodesAll) {
139 |
140 | if ($Dir -eq 'LR') {
141 | try {
142 | $ViClustersSubgraphNode = Node -Name "HvCluster" -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $VivCenterNodesAll -Align 'Center' -IconDebug $IconDebug -IconType 'VBR_HyperV' -Label 'Microsoft Hyper-V Infrastructure' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 24); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
143 | } catch {
144 | Write-Verbose "Error: Unable to create HvCluster Objects. Disabling the section"
145 | Write-Debug "Error Message: $($_.Exception.Message)"
146 | }
147 | } else {
148 | try {
149 | $ViClustersSubgraphNode = Node -Name "HvCluster" -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $VivCenterNodesAll -Align 'Center' -IconDebug $IconDebug -IconType 'VBR_HyperV' -Label 'Microsoft Hyper-V Infrastructure' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 24); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
150 | } catch {
151 | Write-Verbose "Error: Unable to create HvCluster Objects. Disabling the section"
152 | Write-Debug "Error Message: $($_.Exception.Message)"
153 | }
154 | }
155 |
156 | if ($ViClustersSubgraphNode) {
157 | $ViClustersSubgraphNode
158 | if ($HyperVBackupProxy) {
159 | Edge HvProxies -To HvCluster @{minlen = 2 }
160 | } else {
161 | Edge BackupServers -To HvCluster @{minlen = 3 }
162 | }
163 | }
164 | }
165 | } catch {
166 | Write-Verbose -Message $_.Exception.Message
167 | }
168 | }
169 | end {}
170 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToSobr.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToSobr {
2 | <#
3 | .SYNOPSIS
4 | Function to build a Backup Server to Repository diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | try {
27 | $SobrRepo = Get-VbrBackupSobrInfo
28 |
29 | if ($SobrRepo) {
30 | if ($SobrRepo) {
31 | $SOBRArray = @()
32 | foreach ($SOBROBJ in $SobrRepo) {
33 |
34 | $SOBRExtentNodesArray = @()
35 | $SOBRNodesArray = @()
36 |
37 | $SOBROBJNode = $SOBROBJ.Label
38 |
39 | if ($SOBROBJNode) {
40 | $SOBRNodesArray += $SOBROBJNode
41 | }
42 |
43 | if ($SOBROBJ.Performance) {
44 | if ($SOBROBJ.Performance.Name.Count -eq 1) {
45 | $SOBRPerfColumnSize = 1
46 | } elseif ($ColumnSize) {
47 | $SOBRPerfColumnSize = $ColumnSize
48 | } else {
49 | $SOBRPerfColumnSize = $SOBROBJ.Performance.Name.Count
50 | }
51 | try {
52 | $Performance = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $SOBROBJ.Performance.Name -Align "Center" -iconType $SOBROBJ.Performance.IconType -columnSize $SOBRPerfColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $SOBROBJ.Performance.AditionalInfo -Subgraph -SubgraphLabel "Performance Extent" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 14
53 | } catch {
54 | Write-Verbose "Error: Unable to create SOBR Performance Objects. Disabling the section"
55 | Write-Debug "Error Message: $($_.Exception.Message)"
56 | }
57 |
58 | if ($Performance) {
59 | $SOBRExtentNodesArray += $Performance
60 | }
61 | }
62 | if ($SOBROBJ.Capacity) {
63 | if ($SOBROBJ.Capacity.Name.Count -eq 1) {
64 | $SOBRCapColumnSize = 1
65 | } elseif ($ColumnSize) {
66 | $SOBRCapColumnSize = $ColumnSize
67 | } else {
68 | $SOBRCapColumnSize = $SOBROBJ.Capacity.Name.Count
69 | }
70 | try {
71 | $Capacity = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $SOBROBJ.Capacity.Name -Align "Center" -iconType $SOBROBJ.Capacity.IconType -columnSize $SOBRCapColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $SOBROBJ.Capacity.AditionalInfo -Subgraph -SubgraphLabel "Capacity Extent" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 14
72 | } catch {
73 | Write-Verbose "Error: Unable to create SOBR Capacity Objects. Disabling the section"
74 | Write-Debug "Error Message: $($_.Exception.Message)"
75 | }
76 |
77 | if ($Capacity) {
78 | $SOBRExtentNodesArray += $Capacity
79 | }
80 | }
81 | if ($SOBROBJ.Archive) {
82 | if ($SOBROBJ.Archive.Name.Count -eq 1) {
83 | $SOBRCArchColumnSize = 1
84 | } elseif ($ColumnSize) {
85 | $SOBRCArchColumnSize = $ColumnSize
86 | } else {
87 | $SOBRCArchColumnSize = $SOBROBJ.Archive.Name.Count
88 | }
89 | try {
90 | $Archive = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $SOBROBJ.Archive.Name -Align "Center" -iconType $SOBROBJ.Archive.IconType -columnSize $SOBRCArchColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $SOBROBJ.Archive.AditionalInfo -Subgraph -SubgraphLabel "Archive Extent" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 14
91 |
92 | } catch {
93 | Write-Verbose "Error: Unable to create SOBR Archive Objects. Disabling the section"
94 | Write-Debug "Error Message: $($_.Exception.Message)"
95 | }
96 |
97 | if ($Archive) {
98 | $SOBRExtentNodesArray += $Archive
99 | }
100 | }
101 |
102 | try {
103 | $SOBRExtentSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $SOBRExtentNodesArray -Align 'Center' -IconDebug $IconDebug -Label 'Extents' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 3 -fontSize 18
104 | } catch {
105 | Write-Verbose "Error: Unable to create SOBR Extents SubGraph Objects. Disabling the section"
106 | Write-Debug "Error Message: $($_.Exception.Message)"
107 | }
108 |
109 | if ($SOBRExtentSubgraphNode) {
110 | $SOBRNodesArray += $SOBRExtentSubgraphNode
111 | }
112 |
113 | try {
114 | $SOBRSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $SOBRNodesArray -Align 'Center' -IconDebug $IconDebug -Label $SOBROBJ.Name -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 20
115 | } catch {
116 | Write-Verbose "Error: Unable to create SOBR SubGraph Nodes Objects. Disabling the section"
117 | Write-Debug "Error Message: $($_.Exception.Message)"
118 | }
119 |
120 | if ($SOBRSubgraphNode) {
121 | $SOBRArray += $SOBRSubgraphNode
122 | }
123 | }
124 |
125 | if ($Dir -eq 'LR') {
126 | if ($SOBRArray.Count -eq 1) {
127 | $SOBRCSubGraphColumnSize = 1
128 | } elseif ($ColumnSize) {
129 | $SOBRCSubGraphColumnSize = $ColumnSize
130 | } else {
131 | $SOBRCSubGraphColumnSize = $SOBRArray.Count
132 | }
133 | try {
134 | $SOBRSubgraph = Node -Name SOBRRepo -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $SOBRArray -Align 'Center' -IconDebug $IconDebug -Label 'SOBR Repositories' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $SOBRCSubGraphColumnSize -fontSize 22); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
135 | } catch {
136 | Write-Verbose "Error: Unable to create SubGraph Objects. Disabling the section"
137 | Write-Debug "Error Message: $($_.Exception.Message)"
138 | }
139 | } else {
140 | if ($SOBRArray.Count -eq 1) {
141 | $SOBRCSubGraphColumnSize = 1
142 | } elseif ($ColumnSize) {
143 | $SOBRCSubGraphColumnSize = $ColumnSize
144 | } else {
145 | $SOBRCSubGraphColumnSize = $SOBRArray.Count
146 | }
147 | try {
148 | $SOBRSubgraph = Node -Name SOBRRepo -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $SOBRArray -Align 'Center' -IconDebug $IconDebug -Label 'SOBR Repositories' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $SOBRCSubGraphColumnSize -fontSize 22); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
149 | } catch {
150 | Write-Verbose "Error: Unable to create SubGraph Objects. Disabling the section"
151 | Write-Debug "Error Message: $($_.Exception.Message)"
152 | }
153 | }
154 |
155 | if ($SOBRSubgraph) {
156 | $SOBRSubgraph
157 | }
158 |
159 | Edge -From BackupServers -To SOBRRepo @{minlen = 3 }
160 |
161 | }
162 | }
163 | } catch {
164 | Write-Verbose -Message $_.Exception.Message
165 | }
166 | }
167 | end {}
168 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToTape.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToTape {
2 | <#
3 | .SYNOPSIS
4 | Function to build a Backup Server to Repository diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | try {
27 | $BackupTapeServers = Get-VbrBackupTapeServerInfo
28 | $BackupTapeLibrary = Get-VbrBackupTapeLibraryInfo
29 | $BackupTapeDrives = Get-VbrBackupTapeDrivesInfo
30 |
31 | if ($BackupServerInfo) {
32 | if ($BackupTapeServers) {
33 | $TapeArray = @()
34 | foreach ($TSOBJ in ($BackupTapeServers | Sort-Object -Property Name)) {
35 | $TapeNodesArray = @()
36 |
37 | $TapeServerNode = $TSOBJ.Label
38 |
39 | if ($BackupTapeLibrary) {
40 | $BKPTLOBJ = ($BackupTapeLibrary | Where-Object { $_.TapeServerId -eq $TSOBJ.Id } | Sort-Object -Property Name)
41 | foreach ($TSLibraryOBJ in $BKPTLOBJ) {
42 |
43 | $TapeLibraryNodesArray = @()
44 | $TapeLibrarySubArrayTable = @()
45 |
46 | $TapeLibraryOBJNode = $TSLibraryOBJ.Label
47 |
48 | if ($TapeLibraryOBJNode) {
49 | $TapeLibraryNodesArray += $TapeLibraryOBJNode
50 | }
51 |
52 | if ($BackupTapeDrives) {
53 |
54 | $TapeLibraryDrives = ($BackupTapeDrives | Where-Object { $_.LibraryId -eq $TSLibraryOBJ.Id } | Sort-Object -Property Name)
55 |
56 | try {
57 | if ($TapeLibraryDrives.Name.Count -eq 1) {
58 | $TapeLibraryDriveColumnSize = 1
59 | } elseif ($ColumnSize) {
60 | $TapeLibraryDriveColumnSize = $ColumnSize
61 | } else {
62 | $TapeLibraryDriveColumnSize = $TapeLibraryDrives.Name.Count
63 | }
64 | $TapeLibraryDrivesNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $TapeLibraryDrives.Name -Align "Center" -iconType "VBR_Tape_Drive" -columnSize $TapeLibraryDriveColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $TapeLibraryDrives.AditionalInfo -Subgraph -SubgraphLabel "Tape Drives" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 18
65 |
66 | } catch {
67 | Write-Verbose "Error: Unable to create Tape Library Drives Objects. Disabling the section"
68 | Write-Debug "Error Message: $($_.Exception.Message)"
69 | }
70 |
71 | if ($TapeLibraryDrivesNode) {
72 | $TapeLibraryNodesArray += $TapeLibraryDrivesNode
73 | }
74 | }
75 |
76 | try {
77 | $TapeLibrarySubgraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $TapeLibraryNodesArray -Align 'Center' -IconDebug $IconDebug -Label "Tape Library" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 24
78 | } catch {
79 | Write-Verbose "Error: Unable to create Tape Library SubGraph Objects. Disabling the section"
80 | Write-Debug "Error Message: $($_.Exception.Message)"
81 | }
82 |
83 | if ($TapeLibrarySubgraph) {
84 | $TapeNodesArray += $TapeLibrarySubgraph
85 | }
86 | }
87 | }
88 |
89 | try {
90 | if ($TapeNodesArray -eq 1) {
91 | $TapeLibraryColumnSize = 1
92 | } elseif ($ColumnSize) {
93 | $TapeLibraryColumnSize = $ColumnSize
94 | } else {
95 | $TapeLibraryColumnSize = $TapeNodesArray.Count
96 | }
97 | $TapeLibrarySubgraphArray = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $TapeNodesArray -Align 'Center' -IconDebug $IconDebug -Label " " -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "0" -columnSize $TapeLibraryColumnSize
98 | } catch {
99 | Write-Verbose "Error: Unable to create Tape Library SubGraph Array Objects. Disabling the section"
100 | Write-Debug "Error Message: $($_.Exception.Message)"
101 | }
102 |
103 | if ($TapeServerNode) {
104 | $TapeLibrarySubArrayTable += $TapeServerNode
105 | }
106 |
107 | if ($TapeLibrarySubgraphArray) {
108 | $TapeLibrarySubArrayTable += $TapeLibrarySubgraphArray
109 | }
110 |
111 | try {
112 | $TapeServerSubgraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $TapeLibrarySubArrayTable -Align 'Center' -IconDebug $IconDebug -Label $TSOBJ.Name -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 24
113 | } catch {
114 | Write-Verbose "Error: Unable to create Tape Server SubGraph Objects. Disabling the section"
115 | Write-Debug "Error Message: $($_.Exception.Message)"
116 | }
117 |
118 | if ($TapeServerSubgraph) {
119 | $TapeArray += $TapeServerSubgraph
120 | }
121 | }
122 | try {
123 | if ($TapeArray -eq 1) {
124 | $TapeServerColumnSize = 1
125 | } elseif ($ColumnSize) {
126 | $TapeServerColumnSize = $ColumnSize
127 | } else {
128 | $TapeServerColumnSize = $TapeArray.Count
129 | }
130 | $TapeSubgraph = Node -Name Tape -Attributes @{Label = (Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $TapeArray -Align 'Center' -IconDebug $IconDebug -Label 'Tape Servers' -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $TapeServerColumnSize -fontSize 26); shape = 'plain'; fillColor = 'transparent'; fontsize = 14; fontname = "Segoe Ui" }
131 | } catch {
132 | Write-Verbose "Error: Unable to create Tape SubGraph Objects. Disabling the section"
133 | Write-Debug "Error Message: $($_.Exception.Message)"
134 | }
135 | if ($TapeSubgraph) {
136 | $TapeSubgraph
137 | Edge -From BackupServers -To Tape @{minlen = 3 }
138 | }
139 | }
140 | }
141 | } catch {
142 | Write-Verbose -Message $_.Exception.Message
143 | }
144 | }
145 | end {}
146 | }
--------------------------------------------------------------------------------
/Src/Private/Get-DiagBackupToWanAccel.ps1:
--------------------------------------------------------------------------------
1 | function Get-DiagBackupToWanAccel {
2 | <#
3 | .SYNOPSIS
4 | Function to build Backup Server to Wan Accelerator diagram.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 |
22 | begin {
23 | }
24 |
25 | process {
26 | try {
27 | $WanAccel = Get-VbrBackupWanAccelInfo
28 | if ($BackupServerInfo) {
29 | if ($WanAccel) {
30 |
31 | if ($WanAccel.Name.Count -eq 1) {
32 | $WanAccelColumnSize = 1
33 | } elseif ($ColumnSize) {
34 | $WanAccelColumnSize = $ColumnSize
35 | } else {
36 | $WanAccelColumnSize = $WanAccel.Name.Count
37 | }
38 |
39 | Node WanAccelServer @{Label = (Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject ($WanAccel | ForEach-Object { $_.Name.split('.')[0] }) -Align "Center" -iconType "VBR_Wan_Accel" -columnSize $WanAccelColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo ($WanAccel.AditionalInfo ) -Subgraph -SubgraphIconType "VBR_Wan_Accel" -SubgraphLabel "Wan Accelerators" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -fontColor $Fontcolor -TableBorderColor $Edgecolor -TableBorder "1" -fontSize 18 -SubgraphLabelFontsize 22); shape = 'plain'; fontsize = 14; fontname = "Segoe Ui" }
40 |
41 | Edge BackupServers -To WanAccelServer @{minlen = 3; }
42 | }
43 | }
44 | } catch {
45 | Write-Verbose -Message $_.Exception.Message
46 | }
47 | }
48 | end {}
49 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupArchObjRepoInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupArchObjRepoInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication archive object storage repository information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting Archive Object Storage Repository information from $($VBRServer.Name)."
24 | try {
25 | $ArchObjStorages = Get-VBRArchiveObjectStorageRepository
26 | $ArchObjStorageInfo = @()
27 | if ($ArchObjStorages) {
28 | foreach ($ArchObjStorage in $ArchObjStorages) {
29 |
30 | if ($ArchObjStorage.AmazonS3Folder) {
31 | $Folder = $ArchObjStorage.AmazonS3Folder
32 | $Container = 'N/A'
33 | } elseif ($ArchObjStorage.AzureBlobFolder) {
34 | $Folder = $ArchObjStorage.AzureBlobFolder.Name
35 | $Container = $ArchObjStorage.AzureBlobFolder.Container
36 | } else { $Folder = 'Unknown' }
37 |
38 | $Rows = @{
39 | Type = $ArchObjStorage.ArchiveType
40 | Folder = $Folder
41 | Gateway = & {
42 | if (-Not $ArchObjStorage.UseGatewayServer) {
43 | Switch ($ArchObjStorage.GatewayMode) {
44 | 'Gateway' {
45 | switch (($ArchObjStorage.GatewayServer | Measure-Object).count) {
46 | 0 { "Disable" }
47 | 1 { $ArchObjStorage.GatewayServer.Name.Split('.')[0] }
48 | Default { 'Automatic' }
49 | }
50 | }
51 | 'Direct' { 'Direct' }
52 | default { 'Unknown' }
53 | }
54 | } else {
55 | switch (($ArchObjStorage.GatewayServer | Measure-Object).count) {
56 | 0 { "Disable" }
57 | 1 { $ArchObjStorage.GatewayServer.Name.Split('.')[0] }
58 | Default { 'Automatic' }
59 | }
60 | }
61 | }
62 | Container = $Container
63 | }
64 |
65 | $TempObjStorageInfo = [PSCustomObject]@{
66 | Name = "$($ArchObjStorage.Name) "
67 | Label = Add-DiaNodeIcon -Name $($ArchObjStorage.Name) -IconType "VBR_Cloud_Repository" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
68 | AditionalInfo = $Rows
69 | }
70 | $ArchObjStorageInfo += $TempObjStorageInfo
71 | }
72 | }
73 |
74 | return $ArchObjStorageInfo
75 | } catch {
76 | Write-Verbose -Message $_.Exception.Message
77 | }
78 | }
79 | end {}
80 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupCCBackupStorageInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupCCBackupStorageInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication cloud connect backup storage information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Cloud Connect Backup Storage information from $($VBRServer.Name)."
23 | try {
24 |
25 | $BackupCCBKStorageInfo = @()
26 |
27 | if ($CloudObjects = (Get-VBRCloudTenant).Resources | Sort-Object -Property Name) {
28 | foreach ($CloudObject in ($CloudObjects.Repository | Sort-Object -Property Name -Unique)) {
29 |
30 | $Type = Get-IconType -String $CloudObject.Type
31 |
32 | $AditionalInfo = [PSCustomObject] [ordered] @{
33 | Type = $CloudObject.Type
34 | Path = Switch ([string]::IsNullOrEmpty($CloudObject.FriendlyPath)) {
35 | $true { 'Unknown' }
36 | $false { $CloudObject.FriendlyPath }
37 | default { '--' }
38 | }
39 | 'Total Space' = ConvertTo-FileSizeString -Size $CloudObject.GetContainer().CachedTotalSpace.InBytesAsUInt64
40 | 'Free Space' = ConvertTo-FileSizeString -Size $CloudObject.GetContainer().CachedFreeSpace.InBytesAsUInt64
41 | }
42 |
43 | $TempBackupCCBKStorageInfo = [PSCustomObject]@{
44 | Name = $CloudObject.Name
45 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $CloudObject.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType $Type -Align "Center" -AditionalInfo $AditionalInfo -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
46 | Id = $CloudObject.Id
47 | AditionalInfo = $AditionalInfo
48 | IconType = $Type
49 | }
50 |
51 | $BackupCCBKStorageInfo += $TempBackupCCBKStorageInfo
52 | }
53 | }
54 |
55 | return $BackupCCBKStorageInfo
56 | } catch {
57 | Write-Verbose -Message $_.Exception.Message
58 | }
59 | }
60 | end {}
61 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupCCPerTenantInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupCCPerTenantInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication Cloud Connect per Tenant information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Cloud Connect per Tenant information from $($VBRServer.Name)."
23 | try {
24 |
25 | $BackupCGPoolsInfo = @()
26 | if ($CloudObjects = Get-VBRCloudGatewayPool | Sort-Object -Property Name) {
27 | foreach ($CloudObject in $CloudObjects) {
28 |
29 | $TempBackupCGPoolsInfo = [PSCustomObject]@{
30 | Name = $CloudObject.Name
31 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $CloudObject.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Tape_Server' -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
32 | Id = $CloudObject.Id
33 | CloudGateways = $CloudObject.CloudGateways
34 | }
35 |
36 | $BackupCGPoolsInfo += $TempBackupCGPoolsInfo
37 | }
38 | }
39 |
40 | return $BackupCGPoolsInfo
41 | } catch {
42 | Write-Verbose -Message $_.Exception.Message
43 | }
44 | }
45 | end {}
46 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupCCReplicaResourcesInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupCCReplicaResourcesInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication cloud connect replica resources information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Cloud Connect Replica Resources information from $($VBRServer.Name)."
23 | try {
24 |
25 | $BackupCCReplicaResourcesInfo = @()
26 |
27 | if ($CloudObjects = Get-VBRCloudHardwarePlan | Sort-Object -Property Name) {
28 | foreach ($CloudObject in $CloudObjects) {
29 |
30 | $AditionalInfo = [PSCustomObject] [ordered] @{
31 | CPU = Switch ([string]::IsNullOrEmpty($CloudObject.CPU)) {
32 | $true { 'Unlimited' }
33 | $false { "$([math]::Round($CloudObject.CPU / 1000, 1)) Ghz" }
34 | default { '--' }
35 | }
36 | Memory = Switch ([string]::IsNullOrEmpty($CloudObject.Memory)) {
37 | $true { 'Unlimited' }
38 | $false { ConvertTo-FileSizeString -Size (Convert-Size -From MB -To Bytes -Value $CloudObject.Memory) -RoundUnits $Options.RoundUnits }
39 | default { '--' }
40 | }
41 | Storage = ConvertTo-FileSizeString -Size (Convert-Size -From GB -To Bytes -Value ($CloudObject.Datastore.Quota | Measure-Object -Sum).Sum) -RoundUnits 2
42 | Network = $CloudObject.NumberOfNetWithInternet + $CloudObject.NumberOfNetWithoutInternet
43 | # Subscribers = ($CloudObject.SubscribedTenantId).count
44 | # Host = $CloudObject.Host.Name.split(".")[0]
45 | Platform = $CloudObject.Platform
46 | }
47 |
48 | $TempBackupCCReplicaResourcesInfo = [PSCustomObject]@{
49 | Name = $CloudObject.Name
50 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $CloudObject.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType "VBR_Hardware_Resources" -Align "Center" -AditionalInfo $AditionalInfo -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
51 | Id = $CloudObject.Id
52 | AditionalInfo = $AditionalInfo
53 | }
54 |
55 | $BackupCCReplicaResourcesInfo += $TempBackupCCReplicaResourcesInfo
56 | }
57 | }
58 |
59 | return $BackupCCReplicaResourcesInfo
60 | } catch {
61 | Write-Verbose -Message $_.Exception.Message
62 | }
63 | }
64 | end {}
65 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupCGPoolInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupCGPoolInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication cloud gateway pool information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Cloud Gateway Pool information from $($VBRServer.Name)."
23 | try {
24 |
25 | $BackupCGPoolsInfo = @()
26 | if ($CloudObjects = Get-VBRCloudGatewayPool | Sort-Object -Property Name) {
27 | foreach ($CloudObject in $CloudObjects) {
28 |
29 | $TempBackupCGPoolsInfo = [PSCustomObject]@{
30 | Name = $CloudObject.Name
31 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $CloudObject.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Cloud_Connect_Gateway' -Align "Center" -AditionalInfo $AditionalInfo -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
32 | Id = $CloudObject.Id
33 | CloudGateways = $CloudObject.CloudGateways
34 | }
35 |
36 | $BackupCGPoolsInfo += $TempBackupCGPoolsInfo
37 | }
38 | }
39 |
40 | return $BackupCGPoolsInfo
41 | } catch {
42 | Write-Verbose -Message $_.Exception.Message
43 | }
44 | }
45 | end {}
46 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupCGServerInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupCGServerInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication cloud gateway servers information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Cloud Gateway Servers information from $($VBRServer.Name)."
23 | try {
24 |
25 | $BackupCGServersInfo = @()
26 | if ($CloudObjects = Get-VBRCloudGateway | Sort-Object -Property Name) {
27 | foreach ($CloudObject in $CloudObjects) {
28 |
29 | $AditionalInfo = [PSCustomObject] [ordered] @{
30 | IP = $CloudObject.IpAddress
31 | 'Network Mode' = $CloudObject.NetworkMode
32 | 'Incoming Port' = $CloudObject.IncomingPort
33 | 'NAT Port' = $CloudObject.NATPort
34 | State = Switch ($CloudObject.Enabled) {
35 | 'True' { 'Enabled' }
36 | 'False' { 'Disabled' }
37 | }
38 | }
39 |
40 |
41 | $TempBackupCGServersInfo = [PSCustomObject]@{
42 | Name = $CloudObject.Name
43 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $CloudObject.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Cloud_Connect_Gateway' -Align "Center" -AditionalInfo $AditionalInfo -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
44 | Id = $CloudObject.Id
45 | AditionalInfo = $AditionalInfo
46 | }
47 |
48 | $BackupCGServersInfo += $TempBackupCGServersInfo
49 | }
50 | }
51 |
52 | return $BackupCGServersInfo
53 | } catch {
54 | Write-Verbose -Message $_.Exception.Message
55 | }
56 | }
57 | end {}
58 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupEntraIDInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupEntraIDInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication entra id information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting Entra ID information from $($VBRServer.Name)."
24 | try {
25 | $EntraIDs = Get-VBREntraIDTenant
26 | $EntraIDInfo = @()
27 | if ($EntraIDs) {
28 | foreach ($EntraID in $EntraIDs) {
29 |
30 | $Rows = @{
31 | Region = $EntraID.Region
32 | CacheRepository = $EntraID.CacheRepository.Name
33 | }
34 |
35 | $TempEntraIDInfo = [PSCustomObject]@{
36 | Name = $EntraID.Name.toUpper()
37 | Label = Add-DiaNodeIcon -Name "$($EntraID.Name.toUpper())" -IconType "VBR_Microsoft_Entra_ID" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
38 | AditionalInfo = $Rows
39 | }
40 | $EntraIDInfo += $TempEntraIDInfo
41 | }
42 | }
43 |
44 | return $EntraIDInfo
45 | } catch {
46 | Write-Verbose -Message $_.Exception.Message
47 | }
48 | }
49 | end {}
50 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupHyperVClusterInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupHyperVClusterInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication hyperv hypervisor information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting HyperV HyperVisor information from $($VBRServer.Name)."
24 | try {
25 | $HyObjs = Get-VBRServer | Where-Object { $_.Type -eq 'HvCluster' }
26 | $HyObjsInfo = @()
27 | if ($HyObjs) {
28 | foreach ($HyObj in $HyObjs) {
29 | try {
30 | $HvHosts = Get-VBRServer | Where-Object { $_.Type -eq 'HvServer' -and $_.ParentId -match $HyObj.Id }
31 | $Rows = @{
32 | IP = Get-NodeIP -Hostname $HyObj.Info.DnsName
33 | }
34 |
35 | $TempHyObjsInfo = [PSCustomObject]@{
36 | Name = $HyObj.Info.HostInstanceIdV2
37 | Label = Add-DiaNodeIcon -Name $HyObj.Name -IconType "VBR_HyperV_Cluster" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
38 | AditionalInfo = $Rows
39 | Childs = & {
40 | foreach ($HvHost in $HvHosts) {
41 | $Rows = @{
42 | IP = Get-NodeIP -Hostname $HvHost.Info.DnsName
43 | Version = $HvHost.Info.HvVersion
44 | }
45 | [PSCustomObject]@{
46 | Name = $HvHost.Name
47 | Label = Add-DiaNodeIcon -Name $HvHost.Name -IconType "VBR_HyperV_Server" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
48 | AditionalInfo = $Rows
49 | }
50 | }
51 | }
52 | }
53 | $HyObjsInfo += $TempHyObjsInfo
54 | } catch {
55 | Write-Verbose -Message $_.Exception.Message
56 | }
57 | }
58 | }
59 |
60 | return $HyObjsInfo
61 | } catch {
62 | Write-Verbose -Message $_.Exception.Message
63 | }
64 | }
65 | end {}
66 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupHyperVStandAloneInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupHyperVStandAloneInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication hyperv hypervisor information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting HyperV HyperVisor information from $($VBRServer.Name)."
24 | try {
25 | $HyObjs = Get-VBRServer | Where-Object { $_.Type -eq 'HvServer' -and $_.Parentid -eq '00000000-0000-0000-0000-000000000000'}
26 | $HyObjsInfo = @()
27 | if ($HyObjs) {
28 | foreach ($HyObj in $HyObjs) {
29 | try {
30 | $Rows = @{
31 | IP = Get-NodeIP -Hostname $HyObj.Info.DnsName
32 | Version = switch ([string]::IsNullOrEmpty($HyObj.Info.Info)) {
33 | $true { 'Unknown' }
34 | $false { $HyObj.Info.Info.Split('()')[1].split('build:')[0] }
35 | Default { 'Unknown' }
36 | }
37 | }
38 |
39 | $TempHyObjsInfo = [PSCustomObject]@{
40 | Name = $HyObj.Name
41 | Label = Add-DiaNodeIcon -Name $HyObj.Name -IconType "VBR_HyperV_Server" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
42 | AditionalInfo = $Rows
43 | }
44 | $HyObjsInfo += $TempHyObjsInfo
45 | } catch {
46 | Write-Verbose -Message $_.Exception.Message
47 | }
48 | }
49 | }
50 |
51 | return $HyObjsInfo
52 | } catch {
53 | Write-Verbose -Message $_.Exception.Message
54 | }
55 | }
56 | end {}
57 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupObjectRepoInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupObjectRepoInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication object storage repository information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting Object Storage Repository information from $($VBRServer.Name)."
24 | try {
25 | $ObjStorages = Get-VBRObjectStorageRepository
26 | $ObjStorageInfo = @()
27 | if ($ObjStorages) {
28 | foreach ($ObjStorage in $ObjStorages) {
29 |
30 | if ($ObjStorage.AmazonS3Folder) {
31 | $Folder = $ObjStorage.AmazonS3Folder
32 | } elseif ($ObjStorage.AzureBlobFolder) {
33 | $Folder = $ObjStorage.AzureBlobFolder
34 | } else { $Folder = 'Unknown' }
35 |
36 | $Rows = @{
37 | Type = $ObjStorage.Type
38 | Folder = $Folder
39 | Gateway = & {
40 | if (-Not $ObjStorage.UseGatewayServer) {
41 | Switch ($ObjStorage.ConnectionType) {
42 | 'Gateway' {
43 | switch (($ObjStorage.GatewayServer | Measure-Object).count) {
44 | 0 { "Disable" }
45 | 1 { $ObjStorage.GatewayServer.Name.Split('.')[0] }
46 | Default { 'Automatic' }
47 | }
48 | }
49 | 'Direct' { 'Direct' }
50 | default { 'Unknown' }
51 | }
52 | } else {
53 | switch (($ObjStorage.GatewayServer | Measure-Object).count) {
54 | 0 { "Disable" }
55 | 1 { $ObjStorage.GatewayServer.Name.Split('.')[0] }
56 | Default { 'Automatic' }
57 | }
58 | }
59 | }
60 | }
61 |
62 | $TempObjStorageInfo = [PSCustomObject]@{
63 | Name = "$($ObjStorage.Name) "
64 | Label = Add-DiaNodeIcon -Name $($ObjStorage.Name) -IconType "VBR_Cloud_Repository" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
65 | AditionalInfo = $Rows
66 | }
67 | $ObjStorageInfo += $TempObjStorageInfo
68 | }
69 | }
70 |
71 | return $ObjStorageInfo
72 | } catch {
73 | Write-Verbose -Message $_.Exception.Message
74 | }
75 | }
76 | end {}
77 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupProtectedGroupInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupProtectedGroupInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication protected group information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Protected Group information from $($VBRServer.Name)."
23 | try {
24 | [Array]$ProtectedGroups = Get-VBRProtectionGroup
25 |
26 | $ProtectedGroupInfo = @()
27 | if ($ProtectedGroups) {
28 | foreach ($ProtectedGroup in $ProtectedGroups) {
29 |
30 | $Rows = @{
31 | 'Type' = $ProtectedGroup.Type
32 | 'Status' = Switch ($ProtectedGroup.Enabled) {
33 | $true { 'Enabled' }
34 | $false { 'Disabled' }
35 | default { 'Unknown' }
36 | }
37 | 'Schedule' = $ProtectedGroup.ScheduleOptions.PolicyType
38 | }
39 |
40 | $Type = Get-IconType -String $ProtectedGroup.Container.Type
41 |
42 | $TempProtectedGroupInfo = [PSCustomObject]@{
43 | Name = "$((Remove-SpecialChar -String $ProtectedGroup.Name -SpecialChars '\').toUpper()) "
44 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $ProtectedGroup.Name -SpecialChars '\').toUpper())" -IconType $Type -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
45 | Container = $ProtectedGroup.Container.Type
46 | Object = $ProtectedGroup
47 | }
48 |
49 | $ProtectedGroupInfo += $TempProtectedGroupInfo
50 | }
51 | }
52 |
53 | return $ProtectedGroupInfo
54 | } catch {
55 | Write-Verbose -Message $_.Exception.Message
56 | }
57 | }
58 | end {}
59 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupProxyInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupProxyInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication backup proxy information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 |
19 | Param
20 | (
21 | # Backup Proxy Type
22 | [ValidateSet('vmware', 'hyperv', 'nas')]
23 | [string] $Type
24 |
25 | )
26 | process {
27 | Write-Verbose -Message "Collecting Backup Proxy information from $($VBRServer.Name)."
28 | try {
29 | $BPType = switch ($Type) {
30 | 'vmware' { Get-VBRViProxy }
31 | 'hyperv' { Get-VBRHvProxy }
32 | 'nas' { Get-VBRNASProxyServer }
33 |
34 | }
35 | $BackupProxies = $BPType
36 | $BackupProxyInfo = @()
37 | if ($BackupProxies) {
38 | foreach ($BackupProxy in $BackupProxies) {
39 |
40 | # $Role = Get-RoleType -String $Type
41 |
42 | $Hostname = Switch ($Type) {
43 | 'vmware' { $BackupProxy.Host.Name }
44 | 'hyperv' { $BackupProxy.Host.Name }
45 | 'nas' { $BackupProxy.Server.Name }
46 | }
47 |
48 | $Status = Switch ($Type) {
49 | 'vmware' {
50 | Switch ($BackupProxy.isDisabled) {
51 | $false { 'Enabled' }
52 | $true { 'Disabled' }
53 | }
54 | }
55 | 'hyperv' {
56 | Switch ($BackupProxy.isDisabled) {
57 | $false { 'Enabled' }
58 | $true { 'Disabled' }
59 | }
60 | }
61 | 'nas' {
62 | Switch ($BackupProxy.IsEnabled) {
63 | $false { 'Disabled' }
64 | $true { 'Enabled' }
65 | }
66 | }
67 | }
68 |
69 | $BPRows = [ordered]@{
70 | IP = Get-NodeIP -HostName $Hostname
71 | Status = $Status
72 | Type = Switch ($Type) {
73 | 'vmware' { $BackupProxy.Host.Type }
74 | 'hyperv' {
75 | Switch ($BackupProxy.Info.Type) {
76 | 'HvOffhost' { "Off-Host Backup" }
77 | 'HvOnhost' { "On-Host Backup" }
78 | }
79 | }
80 | 'nas' { "File Backup" }
81 | }
82 | Concurrent_Tasks = Switch ($Type) {
83 | 'vmware' { $BackupProxy.MaxTasksCount }
84 | 'hyperv' { $BackupProxy.MaxTasksCount }
85 | 'nas' { $BackupProxy.ConcurrentTaskNumber }
86 | }
87 | }
88 |
89 | $IconType = Switch ($Type) {
90 | 'vmware' { "VBR_Proxy_Server" }
91 | 'hyperv' { "VBR_Proxy_Server" }
92 | 'nas' { "VBR_AGENT_Server" }
93 | }
94 |
95 | $TempBackupProxyInfo = [PSCustomObject]@{
96 | Name = "$($Hostname.toUpper().split(".")[0]) "
97 | Label = Add-DiaNodeIcon -Name "$($Hostname.toUpper().split(".")[0])" -IconType $IconType -Align "Center" -Rows $BPRows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
98 | AditionalInfo = $BPRows
99 | }
100 |
101 | $BackupProxyInfo += $TempBackupProxyInfo
102 | }
103 | }
104 |
105 | return $BackupProxyInfo
106 | } catch {
107 | Write-Verbose -Message $_.Exception.Message
108 | }
109 | }
110 | end {}
111 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupRepoInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupRepoInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication backup repository information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Backup Repository information from $($VBRServer.Name)."
23 | try {
24 | [Array]$BackupRepos = Get-VBRBackupRepository
25 | [Array]$ScaleOuts = Get-VBRBackupRepository -ScaleOut
26 | $ViBackupProxy = Get-VBRViProxy
27 | $HvBackupProxy = Get-VBRHvProxy
28 |
29 | if ($ScaleOuts) {
30 | $Extents = Get-VBRRepositoryExtent -Repository $ScaleOuts
31 | $BackupRepos += $Extents.Repository
32 | }
33 | $BackupRepoInfo = @()
34 | if ($BackupRepos) {
35 | foreach ($BackupRepo in $BackupRepos) {
36 |
37 | $Role = Get-RoleType -String $BackupRepo.Type
38 |
39 | $Rows = @{}
40 |
41 | if ($Role -like '*Local' -or $Role -like '*Hardened' -or $Role -like 'Cloud') {
42 | $Rows.add('Server', $BackupRepo.Host.Name.Split('.')[0])
43 | $Rows.add('Path', $BackupRepo.FriendlyPath)
44 | $Rows.add('Total-Space', (ConvertTo-FileSizeString -Size $BackupRepo.GetContainer().CachedTotalSpace.InBytesAsUInt64))
45 | $Rows.add('Used-Space', (ConvertTo-FileSizeString -Size ($BackupRepo).GetContainer().CachedFreeSpace.InBytesAsUInt64))
46 | } elseif ($Role -like 'Dedup*') {
47 | $Rows.add('DedupType', $BackupRepo.TypeDisplay)
48 | $Rows.add('Total-Space', (ConvertTo-FileSizeString -Size ($BackupRepo).GetContainer().CachedTotalSpace.InBytesAsUInt64))
49 | $Rows.add('Used-Space', (ConvertTo-FileSizeString -Size ($BackupRepo).GetContainer().CachedFreeSpace.InBytesAsUInt64))
50 | } elseif ($Role -like '*Share') {
51 | $Rows.add('Path', $BackupRepo.FriendlyPath)
52 | $Rows.add('Total-Space', (ConvertTo-FileSizeString -Size ($BackupRepo).GetContainer().CachedTotalSpace.InBytesAsUInt64))
53 | $Rows.add('Used-Space', (ConvertTo-FileSizeString -Size ($BackupRepo).GetContainer().CachedFreeSpace.InBytesAsUInt64))
54 | } else {
55 | $Rows.add('Server', 'Uknown')
56 | $Rows.add('Path', 'Uknown')
57 | $Rows.add('Total-Space', "0 B")
58 | $Rows.add('Used-Space', "0 B")
59 | }
60 |
61 | if (($Role -ne 'Dedup Appliances') -and ($Role -ne 'SAN') -and ($Role -notlike '*Share') -and ($BackupRepo.Host.Name -in $ViBackupProxy.Host.Name -or $BackupRepo.Host.Name -in $HvBackupProxy.Host.Name)) {
62 | $BackupType = 'Proxy'
63 | } else { $BackupType = $BackupRepo.Type }
64 |
65 | $Type = Get-IconType -String $BackupType
66 |
67 | $TempBackupRepoInfo = [PSCustomObject]@{
68 | Name = "$((Remove-SpecialChar -String $BackupRepo.Name -SpecialChars '\').toUpper()) "
69 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $BackupRepo.Name -SpecialChars '\').toUpper())" -IconType $Type -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
70 | Role = $Role
71 | AditionalInfo = $Rows
72 | }
73 |
74 | $BackupRepoInfo += $TempBackupRepoInfo
75 | }
76 | }
77 |
78 | return $BackupRepoInfo
79 | } catch {
80 | Write-Verbose -Message $_.Exception.Message
81 | }
82 | }
83 | end {}
84 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupServerInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupServerInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication server information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 |
20 | )
21 | process {
22 | try {
23 | $PssSession = try { New-PSSession $VBRServer.Name -Credential $Credential -Authentication Negotiate -ErrorAction Stop -Name 'PSSBackupServerDiagram'} catch {
24 | Write-Error "Veeam.Diagrammer: New-PSSession: Unable to connect to $($VBRServer.Name), WinRM disabled or not configured."
25 | }
26 | Write-Verbose -Message "Collecting Backup Server information from $($VBRServer.Name)."
27 |
28 | if ($PssSession) {
29 | $VeeamInfo = Invoke-Command -Session $PssSession -ErrorAction SilentlyContinue -ScriptBlock {
30 | $VeeamVersion = Get-ChildItem -Recurse HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -match 'Veeam Backup & Replication Server' } | Select-Object -Property DisplayVersion
31 | $VeeamDBFlavor = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations'
32 | $VeeamDBInfo12 = Get-ItemProperty -Path "HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication\DatabaseConfigurations\$($VeeamDBFlavor.SqlActiveConfiguration)"
33 | $VeeamDBInfo11 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Veeam\Veeam Backup and Replication'
34 | return [PSCustomObject]@{
35 | Version = $VeeamVersion.DisplayVersion
36 | DBFlavor = $VeeamDBFlavor
37 | DBInfo12 = $VeeamDBInfo12
38 | DBInfo11 = $VeeamDBInfo11
39 | }
40 | }
41 | }
42 |
43 | $VeeamDBInfo = if ($VeeamInfo.DBInfo11.SqlServerName) {
44 | $VeeamInfo.DBInfo11.SqlServerName
45 | } elseif ($VeeamInfo.DBInfo12.SqlServerName) {
46 | $VeeamInfo.DBInfo12.SqlServerName
47 | } elseif ($VeeamInfo.DBInfo12.SqlHostName) {
48 | Switch ($VeeamInfo.DBInfo12.SqlHostName) {
49 | 'localhost' { $VBRServer.Name }
50 | default { $VeeamInfo.DBInfo12.SqlHostName }
51 | }
52 | } else {
53 | $VBRServer.Name
54 | }
55 |
56 | if ($VBRServer) {
57 | $Roles = if ($VeeamDBInfo -eq $VBRServer.Name) { 'Backup and Database' } else { 'Backup Server' }
58 | $DBType = $VeeamInfo.DBFlavor.SqlActiveConfiguration
59 |
60 | $Rows = [ordered]@{
61 | Role = $Roles
62 | IP = Get-NodeIP -Hostname $VBRServer.Name
63 | }
64 |
65 | if ($VeeamInfo.Version) {
66 | $Rows.add('Version', $VeeamInfo.Version)
67 | }
68 |
69 | if ($DBType) {
70 | $Rows.add('Database Type', $DBType)
71 | }
72 |
73 | $Rows = [PSCustomObject]$Rows
74 |
75 | $script:BackupServerInfo = [PSCustomObject]@{
76 | Name = $VBRServer.Name.split(".")[0]
77 | Label = Add-DiaNodeIcon -Name "$($VBRServer.Name.split(".")[0])" -IconType "VBR_Server" -Align "Center" -RowsOrdered $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
78 | Spacer = Add-DiaNodeIcon -Name " " -IconType "VBR_Bid_Arrow" -Align "Center" -ImagesObj $Images -IconDebug $IconDebug
79 | }
80 | }
81 |
82 | $DatabaseServer = $VeeamDBInfo
83 | if ($DatabaseServer) {
84 | $DBPort = if ($VeeamInfo.DBFlavor.SqlActiveConfiguration -eq "PostgreSql") { "$($VeeamInfo.DBInfo12.SqlHostPort)/TCP" } else { "1433/TCP" }
85 | $DatabaseServerIP = Get-NodeIP -Hostname $DatabaseServer
86 |
87 | $Rows = [ordered] @{
88 | IP = $DatabaseServerIP
89 | Role = 'Database Server'
90 | }
91 |
92 | if ($VeeamInfo.DBInfo12.SqlInstanceName) {
93 | $Rows.add('Instance', $VeeamInfo.DBInfo12.SqlInstanceName)
94 | }
95 |
96 | if ($VeeamInfo.DBInfo12.SqlDatabaseName) {
97 | $Rows.add('Database', $VeeamInfo.DBInfo12.SqlDatabaseName)
98 | }
99 |
100 | $Rows.add('DB Port', $DBPort)
101 |
102 |
103 | $Rows = [PSCustomObject]$Rows
104 |
105 | $DBIconType = if ($VeeamInfo.DBFlavor.SqlActiveConfiguration -eq "PostgreSql") { "VBR_Server_DB_PG" } else { "VBR_Server_DB" }
106 |
107 | $script:DatabaseServerInfo = [PSCustomObject]@{
108 | Name = $DatabaseServer.split(".")[0]
109 | Label = Add-DiaNodeIcon -Name "$($DatabaseServer.split(".")[0])" -IconType $DBIconType -Align "Center" -RowsOrdered $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
110 | DBPort = $DBPort
111 | }
112 | }
113 |
114 | $EMServer = [Veeam.Backup.Core.SBackupOptions]::GetEnterpriseServerInfo()
115 | if ($EMServer.ServerName) {
116 | $EMServerIP = Get-NodeIP -Hostname $EMServer.ServerName
117 |
118 | $Rows = @{
119 | Role = 'Enterprise Manager Server'
120 | IP = $EMServerIP
121 | }
122 |
123 | $script:EMServerInfo = [PSCustomObject]@{
124 | Name = $EMServer.ServerName.split(".")[0]
125 | Label = Add-DiaNodeIcon -Name "$($EMServer.ServerName.split(".")[0])" -IconType "VBR_Server_EM" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -FontSize 18
126 | }
127 | }
128 | } catch {
129 | Write-Verbose -Message $_.Exception.Message
130 | }
131 | }
132 | end {
133 | if ($PssSession) {
134 | Remove-PSSession $PssSession
135 | }
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupSobrInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupSobrInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication scale-out backup repository information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting Scale-Out Backup Repository information from $($VBRServer.Name)."
24 | try {
25 | $Sobrs = Get-VBRBackupRepository -ScaleOut
26 | $SobrInfo = @()
27 | if ($Sobrs) {
28 | foreach ($Sobr in $Sobrs) {
29 | $SobrRows = @{
30 | 'Placement Policy' = $Sobr.PolicyType
31 | 'Encryption Enabled' = ConvertTo-TextYN $Sobr.EncryptionEnabled
32 | }
33 |
34 | if ($Sobr.EncryptionEnabled) {
35 | $SobrRows.add('Encryption Key', $Sobr.EncryptionKey.Description)
36 | }
37 |
38 | $SobrsExtents = @()
39 |
40 | foreach ($Extent in $Sobr.Extent) {
41 |
42 | $PerformanceRows = @{
43 | 'Path' = $Extent.Repository.FriendlyPath
44 | 'Total Space' = ConvertTo-FileSizeString -Size $Extent.Repository.GetContainer().CachedTotalSpace.InBytesAsUInt64
45 | 'Used Space' = ConvertTo-FileSizeString -Size $Extent.Repository.GetContainer().CachedFreeSpace.InBytesAsUInt64
46 | }
47 |
48 | $SobrsExtents += [ordered]@{
49 | Name = Remove-SpecialChar -String $Extent.Name -SpecialChars '\'
50 | IconType = Get-IconType -String $Extent.Repository.Type
51 | AditionalInfo = $PerformanceRows
52 | }
53 | }
54 |
55 | $SobrsCapacityExtents = @()
56 |
57 | foreach ($CapacityExtent in $Sobr.CapacityExtents) {
58 | if ($CapacityExtent.Repository.AmazonS3Folder) {
59 | $CapacityFolder = $CapacityExtent.Repository.AmazonS3Folder
60 | } elseif ($CapacityExtent.Repository.AzureBlobFolder) {
61 | $CapacityFolder = $CapacityExtent.Repository.AzureBlobFolder
62 | }
63 |
64 | $CapacityRows = @{
65 | Type = $CapacityExtent.Repository.Type
66 | Folder = "/$($CapacityFolder)"
67 | Gateway = & {
68 | if (-Not $CapacityExtent.Repository.UseGatewayServer) {
69 | Switch ($CapacityExtent.Repository.ConnectionType) {
70 | 'Gateway' {
71 | switch (($CapacityExtent.Repository.GatewayServer | Measure-Object).count) {
72 | 0 { "Disable" }
73 | 1 { $CapacityExtent.Repository.GatewayServer.Name.Split('.')[0] }
74 | Default { 'Automatic' }
75 | }
76 | }
77 | 'Direct' { 'Direct' }
78 | default { 'Unknown' }
79 | }
80 | } else {
81 | switch (($CapacityExtent.Repository.GatewayServer | Measure-Object).count) {
82 | 0 { "Disable" }
83 | 1 { $CapacityExtent.Repository.GatewayServer.Name.Split('.')[0] }
84 | Default { 'Automatic' }
85 | }
86 | }
87 | }
88 | }
89 |
90 | $SobrsCapacityExtents += [ordered]@{
91 | Name = Remove-SpecialChar -String $CapacityExtent.Repository.Name -SpecialChars '\'
92 | IconType = Get-IconType -String $CapacityExtent.Repository.Type
93 | AditionalInfo = $CapacityRows
94 | }
95 | }
96 |
97 | if ($Sobr.ArchiveExtent.Repository.AzureBlobFolder) {
98 | $ArchiveFolder = $Sobr.ArchiveExtent.Repository.AzureBlobFolder
99 | } else { $ArchiveFolder = 'Unknown' }
100 |
101 | $ArchiveRows = [ordered]@{
102 | Type = $Sobr.ArchiveExtent.Repository.ArchiveType
103 | Gateway = & {
104 | if (-Not $Sobr.ArchiveExtent.Repository.UseGatewayServer) {
105 | Switch ($Sobr.ArchiveExtent.Repository.GatewayMode) {
106 | 'Gateway' {
107 | switch (($Sobr.ArchiveExtent.Repository.GatewayServer | Measure-Object).count) {
108 | 0 { "Disable" }
109 | 1 { $Sobr.ArchiveExtent.Repository.GatewayServer.Name.Split('.')[0] }
110 | Default { 'Automatic' }
111 | }
112 | }
113 | 'Direct' { 'Direct' }
114 | default { 'Unknown' }
115 | }
116 | } else {
117 | switch (($Sobr.ArchiveExtent.Repository.GatewayServer | Measure-Object).count) {
118 | 0 { "Disable" }
119 | 1 { $Sobr.ArchiveExtent.Repository.GatewayServer.Name.Split('.')[0] }
120 | Default { 'Automatic' }
121 | }
122 | }
123 | }
124 | }
125 |
126 | if ($Sobr.ArchiveExtent.Repository.AzureBlobFolder) {
127 | $ArchiveRows.add('Folder', "/$($ArchiveFolder.Name)")
128 | $ArchiveRows.add('Container', $($ArchiveFolder.Container))
129 | }
130 |
131 | $TempSobrInfo = [PSCustomObject]@{
132 | Name = "$($Sobr.Name.toUpper())"
133 | Label = Add-DiaNodeIcon -Name "$($Sobr.Name)" -IconType "VBR_SOBR_Repo" -Align "Center" -Rows $SobrRows -ImagesObj $Images -IconDebug $IconDebug -FontSize 16
134 |
135 | Capacity = $SobrsCapacityExtents
136 |
137 | Archive = $Sobr.ArchiveExtent.Repository | Select-Object -Property @{Name = 'Name'; Expression = { Remove-SpecialChar -String $_.Name -SpecialChars '\' } }, @{Name = 'AditionalInfo'; Expression = { $ArchiveRows } }, @{Name = 'IconType'; Expression = { Get-IconType -String $_.ArchiveType } }
138 |
139 | Performance = $SobrsExtents
140 | }
141 | $SobrInfo += $TempSobrInfo
142 | }
143 | }
144 |
145 | return $SobrInfo
146 | } catch {
147 | Write-Verbose -Message $_.Exception.Message
148 | }
149 | }
150 | end {}
151 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupTapeDrivesInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupTapeDrivesInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication tape drives information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | [string] $TapeLibrary
20 | )
21 |
22 | process {
23 | Write-Verbose -Message "Collecting Tape Drives information from $($VBRServer.Name)."
24 | try {
25 |
26 | if ($TapeLibrary) {
27 | $TapeDrives = Get-VBRTapeDrive -Library $TapeLibrary
28 | } Else { $TapeDrives = Get-VBRTapeDrive }
29 |
30 | $BackupTapeDriveInfo = @()
31 | if ($TapeDrives) {
32 | foreach ($TapeDrive in $TapeDrives) {
33 |
34 | $Rows = [ordered ]@{
35 | # Role = 'Tape Drive'
36 | 'Serial#' = $TapeDrive.SerialNumber
37 | Model = $TapeDrive.Model
38 | 'Drive ID' = $TapeDrive.Name
39 | }
40 |
41 |
42 | $TempBackupTapeDriveInfo = [PSCustomObject]@{
43 | Name = $TapeDrive.Name
44 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String ("Drive $($TapeDrive.Address + 1)").split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Tape_Drive' -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
45 | LibraryId = $TapeDrive.LibraryId
46 | Id = $TapeDrive.Id
47 | AditionalInfo = $Rows
48 | }
49 |
50 | $BackupTapeDriveInfo += $TempBackupTapeDriveInfo
51 | }
52 | }
53 |
54 | return $BackupTapeDriveInfo
55 | } catch {
56 | Write-Verbose -Message $_.Exception.Message
57 | }
58 | }
59 | end {}
60 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupTapeLibraryInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupTapeLibraryInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication tape libraries information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | [string] $TapeServer
20 | )
21 |
22 | process {
23 | Write-Verbose -Message "Collecting Tape Library information from $($VBRServer.Name)."
24 | try {
25 |
26 | if ($TapeServer) {
27 | $TapeLibraries = Get-VBRTapeLibrary -TapeServer $TapeServer
28 | } Else { $TapeLibraries = Get-VBRTapeLibrary }
29 |
30 | $BackupTapelibraryInfo = @()
31 | if ($TapeLibraries) {
32 | foreach ($TapeLibrary in $TapeLibraries) {
33 |
34 | $Rows = [ordered ]@{
35 | Role = 'Tape Library'
36 | State = $TapeLibrary.State
37 | Type = $TapeLibrary.Type
38 | }
39 |
40 |
41 | $TempBackupTapelibraryInfo = [PSCustomObject]@{
42 | Name = "$((Remove-SpecialChar -String $TapeLibrary.Name -SpecialChars '\').toUpper())_$(Get-Random)"
43 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $TapeLibrary.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Tape_Library' -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
44 | TapeServerId = $TapeLibrary.TapeServerId
45 | Id = $TapeLibrary.Id
46 | }
47 |
48 | $BackupTapelibraryInfo += $TempBackupTapelibraryInfo
49 | }
50 | }
51 |
52 | return $BackupTapelibraryInfo
53 | } catch {
54 | Write-Verbose -Message $_.Exception.Message
55 | }
56 | }
57 | end {}
58 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupTapeServerInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupTapeServerInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication tape servers information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param (
19 | )
20 |
21 | process {
22 | Write-Verbose -Message "Collecting Tape Servers information from $($VBRServer.Name)."
23 | try {
24 |
25 | $TapeServers = Get-VBRTapeServer
26 |
27 | $BackupTapeServersInfo = @()
28 | if ($TapeServers) {
29 | foreach ($TapeServer in $TapeServers) {
30 |
31 | $Rows = @{
32 | IP = Get-NodeIP -HostName $TapeServer.Name
33 | Role = 'Tape Server'
34 | State = Switch ($TapeServer.IsAvailable) {
35 | 'True' { 'Available' }
36 | 'False' { 'Unavailable' }
37 | }
38 | }
39 |
40 |
41 | $TempBackupTapeServersInfo = [PSCustomObject]@{
42 | Name = $TapeServer.Name
43 | Label = Add-DiaNodeIcon -Name "$((Remove-SpecialChar -String $TapeServer.Name.split(".")[0] -SpecialChars '\').toUpper())" -IconType 'VBR_Tape_Server' -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
44 | Id = $TapeServer.Id
45 | }
46 |
47 | $BackupTapeServersInfo += $TempBackupTapeServersInfo
48 | }
49 | }
50 |
51 | return $BackupTapeServersInfo
52 | } catch {
53 | Write-Verbose -Message $_.Exception.Message
54 | }
55 | }
56 | end {}
57 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupWanAccelInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupWanAccelInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication wan accelerator information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting Wan Accelerator information from $($VBRServer.Name)."
24 | try {
25 | $WANACCELS = Get-VBRWANAccelerator
26 | $WANACCELInfo = @()
27 | if ($WANACCELS) {
28 | foreach ($WANACCEL in $WANACCELS) {
29 |
30 | $Rows = @{
31 | # Role = 'Wan Accelerator'
32 | IP = Get-NodeIP -Hostname $WANACCEL.Name
33 | TrafficPort = "$($WANAccel.GetWaTrafficPort())/TCP"
34 | }
35 |
36 | if ($WANAccel.FindWaHostComp().Options.CachePath) {
37 | $Rows.add('Cache Path', $WANAccel.FindWaHostComp().Options.CachePath)
38 | $Rows.add('Cache Size', "$($WANAccel.FindWaHostComp().Options.MaxCacheSize) $($WANAccel.FindWaHostComp().Options.SizeUnit)")
39 | }
40 |
41 |
42 | $TempWANACCELInfo = [PSCustomObject]@{
43 | Name = "$($WANACCEL.Name.toUpper().split(".")[0]) ";
44 | Label = Add-DiaNodeIcon -Name "$($WANACCEL.Name.toUpper().split(".")[0])" -IconType "VBR_Wan_Accel" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
45 | AditionalInfo = $Rows
46 | }
47 | $WANACCELInfo += $TempWANACCELInfo
48 | }
49 | }
50 |
51 | return $WANACCELInfo
52 | } catch {
53 | Write-Verbose -Message $_.Exception.Message
54 | }
55 | }
56 | end {}
57 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupvSphereInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupvSphereInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication vsphere hypervisor information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting vSphere HyperVisor information from $($VBRServer.Name)."
24 | try {
25 | $HyObjs = Get-VBRServer | Where-Object { $_.Type -eq 'VC' }
26 | $HyObjsInfo = @()
27 | if ($HyObjs) {
28 | foreach ($HyObj in $HyObjs) {
29 | try {
30 | $ESXis = try { Find-VBRViEntity -Server $HyObj | Where-Object { ($_.type -eq "esx") } } catch {
31 | Write-Verbose -Message $_.Exception.Message
32 | }
33 | $Rows = @{
34 | IP = Get-NodeIP -Hostname $HyObj.Info.DnsName
35 | Version = $HyObj.Info.ViVersion
36 | }
37 |
38 | $TempHyObjsInfo = [PSCustomObject]@{
39 | Name = $HyObj.Name
40 | Label = Add-DiaNodeIcon -Name $HyObj.Name -IconType "VBR_vCenter_Server" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
41 | AditionalInfo = $Rows
42 | Childs = & {
43 | $VIClusters = try {
44 | (Find-VBRViEntity -Server $HyObj | Where-Object { ($_.type -eq "cluster") })
45 | } catch {
46 | Write-Verbose -Message $_.Exception.Message
47 | }
48 | foreach ($Cluster in $VIClusters) {
49 | [PSCustomObject]@{
50 | Name = $Cluster.Name
51 | Label = Add-DiaNodeIcon -Name $Cluster.Name -IconType "VBR_vSphere_Cluster" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
52 | EsxiHost = foreach ($Esxi in $ESXis | Where-Object { $_.path -match $Cluster.Name }) {
53 | $Rows = @{
54 | IP = Get-NodeIP -Hostname $Esxi.Info.DnsName
55 | Version = $Esxi.Info.ViVersion
56 | }
57 | [PSCustomObject]@{
58 | Name = $Esxi.Name
59 | Label = Add-DiaNodeIcon -Name $Esxi.Name -IconType "VBR_ESXi_Server" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug -fontSize 18
60 | AditionalInfo = $Rows
61 | }
62 | }
63 | }
64 | }
65 | }
66 | }
67 | $HyObjsInfo += $TempHyObjsInfo
68 | } catch {
69 | Write-Verbose -Message $_.Exception.Message
70 | }
71 | }
72 | }
73 |
74 | return $HyObjsInfo
75 | } catch {
76 | Write-Verbose -Message $_.Exception.Message
77 | }
78 | }
79 | end {}
80 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrBackupvSphereStandAloneInfo.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrBackupvSphereStandAloneInfo {
2 | <#
3 | .SYNOPSIS
4 | Function to extract veeam backup & replication vsphere Hypervisor information.
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.30
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 | [OutputType([System.Object[]])]
17 |
18 | Param
19 | (
20 |
21 | )
22 | process {
23 | Write-Verbose -Message "Collecting vSphere HyperVisor information from $($VBRServer.Name)."
24 | try {
25 | $ViObjs = Get-VBRServer | Where-Object { $_.Type -eq 'ESXi' -and $_.Parentid -eq '00000000-0000-0000-0000-000000000000' }
26 | $ViObjsInfo = @()
27 | if ($ViObjs) {
28 | foreach ($ViObj in $ViObjs) {
29 | try {
30 | $Rows = @{
31 | IP = Get-NodeIP -Hostname $ViObj.Info.DnsName
32 | Version = switch ([string]::IsNullOrEmpty($ViObj.Info.ViVersion)) {
33 | $true { 'Unknown' }
34 | $false { $ViObj.Info.ViVersion }
35 | Default { 'Unknown' }
36 | }
37 | }
38 |
39 | $TempViObjsInfo = [PSCustomObject]@{
40 | Name = $ViObj.Name
41 | Label = Add-DiaNodeIcon -Name $ViObj.Name -IconType "VBR_ESXi_Server" -Align "Center" -Rows $Rows -ImagesObj $Images -IconDebug $IconDebug
42 | AditionalInfo = $Rows
43 | }
44 | $ViObjsInfo += $TempViObjsInfo
45 | } catch {
46 | Write-Verbose -Message $_.Exception.Message
47 | }
48 | }
49 | }
50 |
51 | return $ViObjsInfo
52 | } catch {
53 | Write-Verbose -Message $_.Exception.Message
54 | }
55 | }
56 | end {}
57 | }
--------------------------------------------------------------------------------
/Src/Private/Get-VbrRequiredModule.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrRequiredModule {
2 | <#
3 | .SYNOPSIS
4 | Function to check if the required version of Veeam.Backup.PowerShell is installed
5 | .DESCRIPTION
6 | Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
7 | .NOTES
8 | Version: 0.6.24
9 | Author: Jonathan Colon
10 | Twitter: @jcolonfzenpr
11 | Github: rebelinux
12 | .LINK
13 | https://github.com/rebelinux/Veeam.Diagrammer
14 | #>
15 | [CmdletBinding()]
16 |
17 | Param
18 | (
19 | [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
20 | [ValidateNotNullOrEmpty()]
21 | [String]
22 | $Name,
23 |
24 | [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
25 | [ValidateNotNullOrEmpty()]
26 | [String]
27 | $Version
28 | )
29 | process {
30 | #region: Start Load VEEAM Snapin / Module
31 | # Loading Module or PSSnapin
32 | # Make sure PSModulePath includes Veeam Console
33 | $MyModulePath = "C:\Program Files\Veeam\Backup and Replication\Console\"
34 | if (-not (Get-Module -ListAvailable -Name Veeam.Backup.PowerShell)) {
35 | $env:PSModulePath = $env:PSModulePath + "$([System.IO.Path]::PathSeparator)$MyModulePath"
36 | }
37 |
38 | try {
39 | Write-Verbose -Message "Trying to import Veeam B&R modules."
40 | Import-Module -Name Veeam.Backup.PowerShell -ErrorAction Stop -WarningAction SilentlyContinue -Verbose:$false
41 | } catch {
42 | Write-Verbose -Message "Failed to load Veeam Modules, trying SnapIn."
43 | try {
44 | Add-PSSnapin -Name VeeamPSSnapIn -ErrorAction Stop | Out-Null
45 | } catch {
46 | throw "Failed to load VeeamPSSnapIn and no Modules found"
47 | }
48 | }
49 |
50 | $Module = Get-Module -Name Veeam.Backup.PowerShell
51 | if ($Module) {
52 | $VbrVersion = $Module.Version.ToString()
53 | Write-Verbose -Message "Using Veeam Powershell module version $($VbrVersion)."
54 | } else {
55 | $VbrVersion = (Get-PSSnapin VeeamPSSnapin -ErrorAction SilentlyContinue).PSVersion.ToString()
56 | Write-Verbose -Message "Using Veeam SnapIn version $($VbrVersion)."
57 | }
58 |
59 | # Check if the required version of the specified module is installed
60 | $RequiredModule = Get-Module -ListAvailable -Name $Name | Sort-Object -Property Version -Descending | Select-Object -First 1
61 | if (-not $RequiredModule) {
62 | throw "$Name $Version or higher is required to run the Veeam VBR As Built Report. Install the Veeam Backup & Replication console that provides the required modules."
63 | }
64 |
65 | $ModuleVersion = [version]$RequiredModule.Version
66 | if ([version]$ModuleVersion -lt [version]$Version) {
67 | throw "$Name $Version or higher is required to run the Veeam.Diagrammer. Update the Veeam Backup & Replication console that provides the required modules."
68 | }
69 | }
70 | end {}
71 | }
72 |
--------------------------------------------------------------------------------
/Src/Private/Get-VbrServerConnection.ps1:
--------------------------------------------------------------------------------
1 | function Get-VbrServerConnection {
2 | <#
3 | .SYNOPSIS
4 | Establishes a connection to a Veeam Backup & Replication (B&R) Server.
5 |
6 | .DESCRIPTION
7 | This function is used by the Veeam.Diagrammer to connect to a Veeam B&R Server.
8 | It builds a diagram of the Veeam VBR configuration in various formats such as PDF, PNG, and SVG using Psgraph.
9 | The function checks for an existing connection to the Veeam server and reuses it if available.
10 | If no connection exists or the existing connection is to a different server, it establishes a new connection.
11 |
12 | .PARAMETER Port
13 | The TCP Port of the target Veeam Backup Server.
14 |
15 | .NOTES
16 | Version: 0.6.19
17 | Author: Jonathan Colon
18 | Twitter: @jcolonfzenpr
19 | GitHub: rebelinux
20 | Credits: Iain Brighton (@iainbrighton) - PScribo module
21 |
22 | .LINK
23 | https://github.com/rebelinux/Veeam.Diagrammer
24 |
25 | .EXAMPLE
26 | PS> Get-VbrServerConnection -Port 9392
27 | Establishes a connection to the Veeam Backup Server on port 9392.
28 |
29 | .EXAMPLE
30 | PS> Get-VbrServerConnection -Port 9392 -Verbose
31 | Establishes a connection to the Veeam Backup Server on port 9392 with verbose output.
32 | #>
33 | [CmdletBinding()]
34 | param (
35 | [Parameter(
36 | Position = 0,
37 | Mandatory = $true,
38 | HelpMessage = 'TCP Port of target Veeam Backup Server'
39 | )]
40 | [string]$Port
41 | )
42 |
43 | begin {
44 | Write-Verbose -Message "Establishing initial connection to Backup Server."
45 | }
46 |
47 | process {
48 | Write-Verbose -Message "Looking for existing Veeam server connection."
49 | $OpenConnection = (Get-VBRServerSession).Server
50 |
51 | if ($OpenConnection -eq $System) {
52 | Write-Verbose -Message "Existing Veeam server connection found."
53 | } else {
54 | if ($null -ne $OpenConnection) {
55 | Write-Verbose -Message "Disconnecting from current Veeam server connection."
56 | Disconnect-VBRServer
57 | }
58 |
59 | Write-Verbose -Message "Connecting to $System with provided credentials."
60 | try {
61 | Connect-VBRServer -Server $System -Credential $Credential -Port $Port
62 | } catch {
63 | Write-Verbose -Message $_.Exception.Message
64 | Throw "Failed to connect to Veeam Backup Server Host $($System):$($Port) with username $($Credential.USERNAME)"
65 | }
66 | }
67 |
68 | Write-Verbose -Message "Validating connection to $System."
69 | $NewConnection = (Get-VBRServerSession).Server
70 | if ($null -eq $NewConnection) {
71 | Throw "Failed to connect to Veeam Backup Server Host $($System):$($Port) with username $($Credential.USERNAME)"
72 | } else {
73 | Write-Verbose -Message "Successfully connected to $($System):$($Port) Backup Server."
74 | }
75 | }
76 |
77 | end {}
78 | }
79 |
--------------------------------------------------------------------------------
/Src/Private/Images.ps1:
--------------------------------------------------------------------------------
1 | $script:Images = @{
2 | "VBR_Server" = "VBR_server.png"
3 | "VBR_Repository" = "VBR_Repository.png"
4 | "VBR_Veeam_Repository" = "Veeam_Repository.png"
5 | "VBR_NAS" = "NAS.png"
6 | "VBR_Deduplicating_Storage" = "Deduplication.png"
7 | "VBR_Linux_Repository" = "Linux_Repository.png"
8 | "VBR_Windows_Repository" = "Windows_Repository.png"
9 | "VBR_Cloud_Repository" = "Cloud_Repository.png"
10 | "VBR_Cloud_Connect" = "Veeam_Cloud_Connect.png"
11 | "VBR_Cloud_Connect_Gateway" = "VSPC_server.png"
12 | "VBR_Cloud_Connect_Gateway_Pools" = "Folder.png"
13 | "VBR_Object_Repository" = "Object_Storage.png"
14 | "VBR_Object" = "Object_Storage_support.png"
15 | "VBR_Amazon_S3_Compatible" = "S3-compatible.png"
16 | "VBR_Amazon_S3" = "AWS S3.png"
17 | "VBR_Azure_Blob" = "Azure Blob.png"
18 | "VBR_Server_DB" = "Microsoft_SQL_DB.png"
19 | "VBR_Proxy" = "Veeam_Proxy.png"
20 | "VBR_Proxy_Server" = "Proxy_Server.png"
21 | "VBR_Wan_Accel" = "WAN_accelerator.png"
22 | "VBR_SOBR" = "Logo_SOBR.png"
23 | "VBR_SOBR_Repo" = "Scale_out_Backup_Repository.png"
24 | "VBR_LOGO" = "Veeam_logo_new.png"
25 | "VBR_No_Icon" = "no_icon.png"
26 | "VBR_Blank_Filler" = "BlankFiller.png"
27 | 'VBR_Storage_NetApp' = "Storage_NetApp.png"
28 | 'VBR_vCenter_Server' = 'vCenter_server.png'
29 | 'VBR_ESXi_Server' = 'ESXi_host.png'
30 | 'VBR_HyperV_Server' = 'Hyper-V_host.png'
31 | 'VBR_Server_EM' = 'Veeam_Backup_Enterprise_Manager.png'
32 | 'VBR_Tape_Server' = 'Tape_Server.png'
33 | 'VBR_Tape_Library' = 'Tape_Library.png'
34 | 'VBR_Tape_Drive' = 'Tape_Drive.png'
35 | 'VBR_Tape_Vaults' = 'Tape encrypted.png'
36 | "VBR_Server_DB_PG" = "PostGre_SQL_DB.png"
37 | "VBR_LOGO_Footer" = "verified_recoverability.png"
38 | "VBR_AGENT_Container" = "Folder.png"
39 | "VBR_AGENT_AD" = "Server.png"
40 | "VBR_AGENT_MC" = "Task list.png"
41 | "VBR_AGENT_IC" = "Workstation.png"
42 | "VBR_AGENT_CSV" = "CSV_Computers.png"
43 | "VBR_AGENT_AD_Logo" = "Microsoft Active Directory.png"
44 | "VBR_AGENT_CSV_Logo" = "File.png"
45 | "VBR_AGENT_Server" = "Server_with_Veeam_Agent.png"
46 | "VBR_vSphere" = "VMware_vSphere.png"
47 | "VBR_HyperV" = "Microsoft_SCVMM.png"
48 | "VBR_Tape" = "Tape.png"
49 | "VBR_Service_Providers" = "Veeam_Service_Provider_Console.png"
50 | "VBR_Service_Providers_Server" = "Veeam_Service_Provider_Server.png"
51 | "VBR_NetApp" = "Storage_with_snapshot.png"
52 | "VBR_Dell" = "Storage_with_snapshot.png"
53 | "VBR_SAN" = "Storage_Stack.png"
54 | "VBR_Virtual_Lab" = "Virtual_host.png"
55 | "VBR_SureBackup" = "SureBackup.png"
56 | "VBR_Application_Groups" = "Service-Application.png"
57 | "VBR_vSphere_Cluster" = "Server_Cluster.png"
58 | "VBR_HyperV_Cluster" = "Server_Cluster.png"
59 | "VBR_Microsoft_Entra_ID" = "Microsoft_Entra_ID.png"
60 | "VBR_Bid_Arrow" = "BidirectionalArrow.png"
61 | "VBR_Hardware_Resources" = "Hardware_controller.png"
62 | }
--------------------------------------------------------------------------------
/Src/Private/SharedUtilsFunctions.ps1:
--------------------------------------------------------------------------------
1 | function Get-IconType {
2 | <#
3 | .SYNOPSIS
4 | Translates repository type to icon type object for Veeam.Diagrammer.
5 |
6 | .DESCRIPTION
7 | The Get-IconType function takes a repository type as input and returns the corresponding icon type object.
8 | This is used by Veeam.Diagrammer to map different repository types to their respective icons.
9 |
10 | .PARAMETER String
11 | The repository type as a string. Possible values include:
12 | - LinuxLocal
13 | - Hardened
14 | - LinuxHardened
15 | - WinLocal
16 | - Cloud
17 | - GoogleCloudStorage
18 | - AmazonS3Compatible
19 | - AmazonS3Glacier
20 | - AmazonS3
21 | - AzureArchive
22 | - AzureBlob
23 | - DDBoost
24 | - HPStoreOnceIntegration
25 | - ExaGrid
26 | - SanSnapshotOnly
27 | - Proxy
28 | - ProxyServer
29 | - ESXi
30 | - HyperVHost
31 | - ManuallyDeployed
32 | - IndividualComputers
33 | - ActiveDirectory
34 | - CSV
35 | - CifsShare
36 | - Nfs
37 | - Netapp
38 | - Dell
39 | - VirtualLab
40 | - ApplicationGroups
41 |
42 | .EXAMPLE
43 | PS C:\> Get-IconType -String 'LinuxLocal'
44 | VBR_Linux_Repository
45 |
46 | This example translates the 'LinuxLocal' repository type to its corresponding icon type 'VBR_Linux_Repository'.
47 |
48 | .LINK
49 | https://github.com/jocolon/Veeam.Diagrammer
50 | #>
51 | param(
52 | [string]$String
53 | )
54 |
55 | $IconType = Switch ($String) {
56 | 'LinuxLocal' { 'VBR_Linux_Repository' }
57 | 'Hardened' { 'VBR_Linux_Repository' }
58 | 'LinuxHardened' { 'VBR_Linux_Repository' }
59 | 'WinLocal' { 'VBR_Windows_Repository' }
60 | 'Cloud' { 'VBR_Cloud_Repository' }
61 | 'GoogleCloudStorage' { 'VBR_Amazon_S3_Compatible' }
62 | 'AmazonS3Compatible' { 'VBR_Amazon_S3_Compatible' }
63 | 'AmazonS3Glacier' { 'VBR_Amazon_S3_Compatible' }
64 | 'AmazonS3' { 'VBR_Amazon_S3' }
65 | 'AzureArchive' { 'VBR_Azure_Blob' }
66 | 'AzureBlob' { 'VBR_Azure_Blob' }
67 | 'DDBoost' { 'VBR_Deduplicating_Storage' }
68 | 'HPStoreOnceIntegration' { 'VBR_Deduplicating_Storage' }
69 | 'ExaGrid' { 'VBR_Deduplicating_Storage' }
70 | 'SanSnapshotOnly' { 'VBR_Storage_NetApp' }
71 | 'Proxy' { 'VBR_Repository' }
72 | 'ProxyServer' { 'VBR_Proxy_Server' }
73 | 'ESXi' { 'VBR_ESXi_Server' }
74 | 'HyperVHost' { 'Hyper-V_host' }
75 | 'ManuallyDeployed' { 'VBR_AGENT_MC' }
76 | 'IndividualComputers' { 'VBR_AGENT_IC' }
77 | 'ActiveDirectory' { 'VBR_AGENT_AD' }
78 | 'CSV' { 'VBR_AGENT_CSV' }
79 | 'CifsShare' { 'VBR_NAS' }
80 | 'Nfs' { 'VBR_NAS' }
81 | 'Netapp' { 'VBR_NetApp' }
82 | 'Dell' { 'VBR_Dell' }
83 | 'VirtualLab' { 'VBR_Virtual_Lab' }
84 | 'ApplicationGroups' { 'VBR_Application_Groups' }
85 | 'ExtendableRepository' { 'VBR_SOBR_Repo' }
86 | default { 'VBR_No_Icon' }
87 | }
88 |
89 | return $IconType
90 | }
91 |
92 | function Get-RoleType {
93 | <#
94 | .SYNOPSIS
95 | Translates a role type string to a function type object.
96 |
97 | .DESCRIPTION
98 | The Get-RoleType function takes a string input representing a role type and translates it into a more descriptive function type object. This is used by Veeam.Diagrammer to provide meaningful role descriptions.
99 |
100 | .PARAMETER String
101 | The role type string to be translated. Possible values include:
102 | - LinuxLocal
103 | - LinuxHardened
104 | - WinLocal
105 | - DDBoost
106 | - HPStoreOnceIntegration
107 | - ExaGrid
108 | - InfiniGuard
109 | - Cloud
110 | - SanSnapshotOnly
111 | - vmware
112 | - hyperv
113 | - agent
114 | - nas
115 | - CifsShare
116 | - Nfs
117 |
118 | .RETURNS
119 | A string representing the translated function type object. Possible return values include:
120 | - Linux Local
121 | - Linux Hardened
122 | - Windows Local
123 | - Dedup Appliances
124 | - Cloud
125 | - SAN
126 | - VMware Backup Proxy
127 | - HyperV Backup Proxy
128 | - Agent and Files Backup Proxy
129 | - NAS Backup Proxy
130 | - SMB Share
131 | - NFS Share
132 | - Unknown
133 |
134 | .NOTES
135 | Version: 0.6.5
136 | Author: Jonathan Colon
137 |
138 | .EXAMPLE
139 | PS C:\> Get-RoleType -String 'LinuxLocal'
140 | Linux Local
141 |
142 | PS C:\> Get-RoleType -String 'vmware'
143 | VMware Backup Proxy
144 |
145 | .LINK
146 | https://github.com/veeam/veeam-diagrammer
147 | #>
148 |
149 | param(
150 | [string]$String
151 | )
152 |
153 | $RoleType = Switch ($String) {
154 | 'LinuxLocal' { 'Linux Local' }
155 | 'LinuxHardened' { 'Linux Hardened' }
156 | 'WinLocal' { 'Windows Local' }
157 | 'DDBoost' { 'Dedup Appliances' }
158 | 'HPStoreOnceIntegration' { 'Dedup Appliances' }
159 | 'ExaGrid' { 'Dedup Appliances' }
160 | 'InfiniGuard' { 'Dedup Appliances' }
161 | 'Cloud' { 'Cloud' }
162 | 'SanSnapshotOnly' { 'SAN' }
163 | "vmware" { 'VMware Backup Proxy' }
164 | "hyperv" { 'HyperV Backup Proxy' }
165 | "agent" { 'Agent and Files Backup Proxy' }
166 | "nas" { 'NAS Backup Proxy' }
167 | "CifsShare" { 'SMB Share' }
168 | 'Nfs' { 'NFS Share' }
169 | default { 'Unknown' }
170 | }
171 | return $RoleType
172 | }
173 | function ConvertTo-TextYN {
174 | <#
175 | .SYNOPSIS
176 | Converts a boolean string representation to "Yes" or "No".
177 |
178 | .DESCRIPTION
179 | This function is used to convert boolean string values ("True" or "False") to their corresponding
180 | textual representations ("Yes" or "No"). If the input is an empty string, a space, or null, it returns "--".
181 | Any other input is returned as-is.
182 |
183 | .PARAMETER TEXT
184 | The string value to be converted. It can be "True", "False", an empty string, a space, or null.
185 |
186 | .OUTPUTS
187 | [String] The converted string value.
188 |
189 | .NOTES
190 | Version: 0.3.0
191 | Author: LEE DAILEY
192 |
193 | .EXAMPLE
194 | PS C:\> ConvertTo-TextYN -TEXT "True"
195 | Yes
196 |
197 | PS C:\> ConvertTo-TextYN -TEXT "False"
198 | No
199 |
200 | PS C:\> ConvertTo-TextYN -TEXT ""
201 | --
202 |
203 | PS C:\> ConvertTo-TextYN -TEXT " "
204 | --
205 |
206 | PS C:\> ConvertTo-TextYN -TEXT $Null
207 | --
208 |
209 | PS C:\> ConvertTo-TextYN -TEXT "Maybe"
210 | Maybe
211 |
212 | .LINK
213 | https://github.com/rebelinux/Veeam.Diagrammer
214 | #>
215 | [OutputType([String])]
216 | Param (
217 | [Parameter (
218 | Position = 0,
219 | Mandatory)]
220 | [AllowEmptyString()]
221 | [string] $TEXT
222 | )
223 |
224 | switch ($TEXT) {
225 | "" { "--"; break }
226 | " " { "--"; break }
227 | $Null { "--"; break }
228 | "True" { "Yes"; break }
229 | "False" { "No"; break }
230 | default { $TEXT }
231 | }
232 | } # end
233 |
234 | function ConvertTo-FileSizeString {
235 | <#
236 | .SYNOPSIS
237 | Used by As Built Report to convert bytes automatically to GB or TB based on size.
238 | .DESCRIPTION
239 | .NOTES
240 | Version: 0.1.0
241 | Author: Jonathan Colon
242 | .EXAMPLE
243 | .LINK
244 | #>
245 | [CmdletBinding()]
246 | [OutputType([String])]
247 | Param
248 | (
249 | [Parameter (
250 | Position = 0,
251 | Mandatory)]
252 | [int64] $Size,
253 | [Parameter(
254 | Position = 1,
255 | Mandatory = $false,
256 | HelpMessage = 'Please provide the source space unit'
257 | )]
258 | [ValidateSet('MB', 'GB', 'TB', 'PB')]
259 | [string] $SourceSpaceUnit,
260 | [Parameter(
261 | Position = 2,
262 | Mandatory = $false,
263 | HelpMessage = 'Please provide the space unit to output'
264 | )]
265 | [ValidateSet('MB', 'GB', 'TB', 'PB')]
266 | [string] $TargetSpaceUnit,
267 | [Parameter(
268 | Position = 3,
269 | Mandatory = $false,
270 | HelpMessage = 'Please provide the value to round the storage unit'
271 | )]
272 | [int] $RoundUnits = 0
273 | )
274 |
275 | if ($SourceSpaceUnit) {
276 | return "$([math]::Round(($Size * $("1" + $SourceSpaceUnit) / $("1" + $TargetSpaceUnit)), $RoundUnits)) $TargetSpaceUnit"
277 | } else {
278 | $Unit = Switch ($Size) {
279 | { $Size -gt 1PB } { 'PB' ; Break }
280 | { $Size -gt 1TB } { 'TB' ; Break }
281 | { $Size -gt 1GB } { 'GB' ; Break }
282 | { $Size -gt 1Mb } { 'MB' ; Break }
283 | Default { 'KB' }
284 | }
285 | return "$([math]::Round(($Size / $("1" + $Unit)), $RoundUnits)) $Unit"
286 | }
287 | } # end
288 |
289 | function Convert-Size {
290 | [cmdletbinding()]
291 | param(
292 | [validateset("Bytes", "KB", "MB", "GB", "TB")]
293 | [string]$From,
294 | [validateset("Bytes", "KB", "MB", "GB", "TB")]
295 | [string]$To,
296 | [Parameter(Mandatory = $true)]
297 | [double]$Value,
298 | [int]$Precision = 4
299 | )
300 | switch ($From) {
301 | "Bytes" { $value = $Value }
302 | "KB" { $value = $Value * 1024 }
303 | "MB" { $value = $Value * 1024 * 1024 }
304 | "GB" { $value = $Value * 1024 * 1024 * 1024 }
305 | "TB" { $value = $Value * 1024 * 1024 * 1024 * 1024 }
306 | }
307 |
308 | switch ($To) {
309 | "Bytes" { return $value }
310 | "KB" { $Value = $Value / 1KB }
311 | "MB" { $Value = $Value / 1MB }
312 | "GB" { $Value = $Value / 1GB }
313 | "TB" { $Value = $Value / 1TB }
314 |
315 | }
316 |
317 | return [Math]::Round($value, $Precision, [MidPointRounding]::AwayFromZero)
318 | }
--------------------------------------------------------------------------------
/Todo:
--------------------------------------------------------------------------------
1 | [x] Calculate Node count to assign the correct column size to the html table
2 | [x] Add Cloud Connect resources to the Infrastructure diagram
3 | [x] Create a Cloud Connect Diagram
4 | [] Test DPI option
5 | [] Create a Per Tenant Cloud Connect Diagram showing the resources used by it
6 | [] Backup Storage
7 | [] Resources Usage
8 | [] Etc...
9 | Tenant
10 | |
11 | |
12 | Cloud GateWay Pool
13 | |
14 | |
15 | Cloud Gateway
16 | |
17 | |
18 | Cloud Repository (Backup Resources)
19 | |
20 | |
21 | Replica Resources (Hardware Plan)
22 | |
23 | |
24 | Network Extension
--------------------------------------------------------------------------------
/Veeam.Diagrammer.psd1:
--------------------------------------------------------------------------------
1 | #
2 | # Module manifest for module 'Veeam.Diagrammer'
3 | #
4 | # Generated by: Jonathan Colon
5 | #
6 | # Generated on: 6/11/2022
7 | #
8 |
9 | @{
10 |
11 | # Script module or binary module file associated with this manifest.
12 | RootModule = 'Veeam.Diagrammer.psm1'
13 |
14 | # Version number of this module.
15 | ModuleVersion = '0.6.30'
16 |
17 | # Supported PSEditions
18 | # CompatiblePSEditions = @()
19 |
20 | # ID used to uniquely identify this module
21 | GUID = 'fb8ba2f3-1a28-4d1e-a2ab-04a9a96cd751'
22 |
23 | # Author of this module
24 | Author = 'Jonathan Colon'
25 |
26 | # Company or vendor of this module
27 | CompanyName = 'Zen PR Solutions'
28 |
29 | # Copyright statement for this module
30 | Copyright = '(c) 2025 Jonathan Colon. All rights reserved.'
31 |
32 | # Description of the functionality provided by this module
33 | Description = 'A PowerShell module to generate an Veeam Backup & Replication infrastructure diagram'
34 |
35 | # Minimum version of the PowerShell engine required by this module
36 | # PowerShellVersion = ''
37 |
38 | # Name of the PowerShell host required by this module
39 | # PowerShellHostName = ''
40 |
41 | # Minimum version of the PowerShell host required by this module
42 | # PowerShellHostVersion = ''
43 |
44 | # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
45 | # DotNetFrameworkVersion = ''
46 |
47 | # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
48 | # ClrVersion = ''
49 |
50 | # Processor architecture (None, X86, Amd64) required by this module
51 | # ProcessorArchitecture = ''
52 |
53 | # Modules that must be imported into the global environment prior to importing this module
54 | RequiredModules = @(
55 | @{
56 | ModuleName = 'PSGraph';
57 | ModuleVersion = '2.1.38.27';
58 | },
59 | @{
60 | ModuleName = 'Diagrammer.Core';
61 | ModuleVersion = '0.2.27';
62 | }
63 | )
64 |
65 | # Assemblies that must be loaded prior to importing this module
66 | # RequiredAssemblies = @()
67 |
68 | # Script files (.ps1) that are run in the caller's environment prior to importing this module.
69 | # ScriptsToProcess = @()
70 |
71 | # Type files (.ps1xml) to be loaded when importing this module
72 | # TypesToProcess = @()
73 |
74 | # Format files (.ps1xml) to be loaded when importing this module
75 | # FormatsToProcess = @()
76 |
77 | # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
78 | # NestedModules = @()
79 |
80 | # 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.
81 | FunctionsToExport = 'New-VeeamDiagram'
82 |
83 | # 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.
84 | # CmdletsToExport = '*'
85 |
86 | # Variables to export from this module
87 | # VariablesToExport = '*'
88 |
89 | # 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.
90 | # AliasesToExport = '*'
91 |
92 | # DSC resources to export from this module
93 | # DscResourcesToExport = @()
94 |
95 | # List of all modules packaged with this module
96 | # ModuleList = @()
97 |
98 | # List of all files packaged with this module
99 | # FileList = @()
100 |
101 | # 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.
102 | PrivateData = @{
103 |
104 | PSData = @{
105 |
106 | # Tags applied to this module. These help with module discovery in online galleries.
107 | Tags = @('Graphviz', 'Veeam', 'Diagram', 'Documentation', 'Windows', 'PSEdition_Desktop', 'PSEdition_Core')
108 |
109 | # A URL to the license for this module.
110 | LicenseUri = 'https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/dev/LICENSE'
111 |
112 | # A URL to the main website for this project.
113 | ProjectUri = 'https://github.com/rebelinux/Veeam.Diagrammer'
114 |
115 | # A URL to an icon representing this module.
116 | IconUri = 'https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/dev/icons/verified_recoverability.png'
117 |
118 | # ReleaseNotes of this module
119 | ReleaseNotes = 'https://github.com/rebelinux/Veeam.Diagrammer/blob/master/CHANGELOG.md'
120 |
121 | } # End of PSData hashtable
122 |
123 | } # End of PrivateData hashtable
124 |
125 | # HelpInfo URI of this module
126 | # HelpInfoURI = ''
127 |
128 | # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
129 | # DefaultCommandPrefix = ''
130 |
131 | }
132 |
133 |
--------------------------------------------------------------------------------
/Veeam.Diagrammer.psm1:
--------------------------------------------------------------------------------
1 | # Get public function definition files and dot source them
2 | $Public = @(Get-ChildItem -Path $PSScriptRoot\Src\Public\*.ps1)
3 | $Private = @(Get-ChildItem -Path $PSScriptRoot\Src\Private\*.ps1)
4 |
5 | foreach ($Module in @($Public + $Private)) {
6 | try {
7 | . $Module.FullName
8 | } catch {
9 | Write-Error -Message "Failed to import function $($Module.FullName): $_"
10 | }
11 | }
12 |
13 | Export-ModuleMember -Function $Public.BaseName
14 | Export-ModuleMember -Function $Private.BaseName
--------------------------------------------------------------------------------
/icons/ADFolder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ADFolder.png
--------------------------------------------------------------------------------
/icons/AHV_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/AHV_host.png
--------------------------------------------------------------------------------
/icons/AWS S3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/AWS S3.png
--------------------------------------------------------------------------------
/icons/AWS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/AWS.png
--------------------------------------------------------------------------------
/icons/Antivirus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Antivirus.png
--------------------------------------------------------------------------------
/icons/Application.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Application.png
--------------------------------------------------------------------------------
/icons/Automation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Automation.png
--------------------------------------------------------------------------------
/icons/Azure Blob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Azure Blob.png
--------------------------------------------------------------------------------
/icons/Azure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Azure.png
--------------------------------------------------------------------------------
/icons/Backup Browser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Backup Browser.png
--------------------------------------------------------------------------------
/icons/Backup_file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Backup_file.png
--------------------------------------------------------------------------------
/icons/BidirectionalArrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/BidirectionalArrow.png
--------------------------------------------------------------------------------
/icons/BlankFiller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/BlankFiller.png
--------------------------------------------------------------------------------
/icons/CDP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/CDP.png
--------------------------------------------------------------------------------
/icons/CSV_Computers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/CSV_Computers.png
--------------------------------------------------------------------------------
/icons/Cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Cloud.png
--------------------------------------------------------------------------------
/icons/Cloud_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Cloud_Repository.png
--------------------------------------------------------------------------------
/icons/Command Line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Command Line.png
--------------------------------------------------------------------------------
/icons/Controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Controller.png
--------------------------------------------------------------------------------
/icons/DR plan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/DR plan.png
--------------------------------------------------------------------------------
/icons/Data Volume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Data Volume.png
--------------------------------------------------------------------------------
/icons/Data file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Data file.png
--------------------------------------------------------------------------------
/icons/Data_Mover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Data_Mover.png
--------------------------------------------------------------------------------
/icons/Data_Volume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Data_Volume.png
--------------------------------------------------------------------------------
/icons/Data_volume_snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Data_volume_snapshot.png
--------------------------------------------------------------------------------
/icons/Database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Database.png
--------------------------------------------------------------------------------
/icons/Database_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Database_server.png
--------------------------------------------------------------------------------
/icons/Datacenter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datacenter.png
--------------------------------------------------------------------------------
/icons/Datalabs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datalabs.png
--------------------------------------------------------------------------------
/icons/Datastore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datastore.png
--------------------------------------------------------------------------------
/icons/Datastore_33__full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datastore_33__full.png
--------------------------------------------------------------------------------
/icons/Datastore_66__full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datastore_66__full.png
--------------------------------------------------------------------------------
/icons/Datastore_empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Datastore_empty.png
--------------------------------------------------------------------------------
/icons/Deduplicating Storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Deduplicating Storage.png
--------------------------------------------------------------------------------
/icons/Deduplicating_Storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Deduplicating_Storage.png
--------------------------------------------------------------------------------
/icons/Deduplication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Deduplication.png
--------------------------------------------------------------------------------
/icons/Domain Controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Domain Controller.png
--------------------------------------------------------------------------------
/icons/ESXi-Hyper-V host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ESXi-Hyper-V host.png
--------------------------------------------------------------------------------
/icons/ESXi-Hyper-V-AHV host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ESXi-Hyper-V-AHV host.png
--------------------------------------------------------------------------------
/icons/ESXi_Hyper-V_AHV_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ESXi_Hyper-V_AHV_host.png
--------------------------------------------------------------------------------
/icons/ESXi_Hyper-V_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ESXi_Hyper-V_host.png
--------------------------------------------------------------------------------
/icons/ESXi_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ESXi_host.png
--------------------------------------------------------------------------------
/icons/Encryption Key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Encryption Key.png
--------------------------------------------------------------------------------
/icons/Enterprise (business).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Enterprise (business).png
--------------------------------------------------------------------------------
/icons/Exchange objects.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Exchange objects.png
--------------------------------------------------------------------------------
/icons/Exchange_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Exchange_server.png
--------------------------------------------------------------------------------
/icons/FLR helper appliance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/FLR helper appliance.png
--------------------------------------------------------------------------------
/icons/FLR_helper_appliance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/FLR_helper_appliance.png
--------------------------------------------------------------------------------
/icons/Failover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Failover.png
--------------------------------------------------------------------------------
/icons/File browser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/File browser.png
--------------------------------------------------------------------------------
/icons/File.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/File.png
--------------------------------------------------------------------------------
/icons/Firewall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Firewall.png
--------------------------------------------------------------------------------
/icons/Folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Folder.png
--------------------------------------------------------------------------------
/icons/Globe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Globe.png
--------------------------------------------------------------------------------
/icons/HDD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/HDD.png
--------------------------------------------------------------------------------
/icons/Hardware_controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Hardware_controller.png
--------------------------------------------------------------------------------
/icons/Hyper-V_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Hyper-V_host.png
--------------------------------------------------------------------------------
/icons/IBM_Object_Storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/IBM_Object_Storage.png
--------------------------------------------------------------------------------
/icons/IndividualPCFolder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/IndividualPCFolder.png
--------------------------------------------------------------------------------
/icons/Instant VM recovery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Instant VM recovery.png
--------------------------------------------------------------------------------
/icons/Interface - Console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Interface - Console.png
--------------------------------------------------------------------------------
/icons/Key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Key.png
--------------------------------------------------------------------------------
/icons/Laptop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Laptop.png
--------------------------------------------------------------------------------
/icons/Letter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Letter.png
--------------------------------------------------------------------------------
/icons/License file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/License file.png
--------------------------------------------------------------------------------
/icons/Linux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Linux.png
--------------------------------------------------------------------------------
/icons/Linux_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Linux_Repository.png
--------------------------------------------------------------------------------
/icons/Linux_VM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Linux_VM.png
--------------------------------------------------------------------------------
/icons/Linux_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Linux_server.png
--------------------------------------------------------------------------------
/icons/Logo_Database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Logo_Database.png
--------------------------------------------------------------------------------
/icons/Logo_SOBR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Logo_SOBR.png
--------------------------------------------------------------------------------
/icons/Magnifying Glass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Magnifying Glass.png
--------------------------------------------------------------------------------
/icons/ManualFolder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ManualFolder.png
--------------------------------------------------------------------------------
/icons/Metadata file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Metadata file.png
--------------------------------------------------------------------------------
/icons/Microsoft Active Directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Active Directory.png
--------------------------------------------------------------------------------
/icons/Microsoft Exchange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Exchange.png
--------------------------------------------------------------------------------
/icons/Microsoft Office.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Office.png
--------------------------------------------------------------------------------
/icons/Microsoft OneDrive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft OneDrive.png
--------------------------------------------------------------------------------
/icons/Microsoft Outlook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Outlook.png
--------------------------------------------------------------------------------
/icons/Microsoft SCOM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft SCOM.png
--------------------------------------------------------------------------------
/icons/Microsoft SQL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft SQL.png
--------------------------------------------------------------------------------
/icons/Microsoft SharePoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft SharePoint.png
--------------------------------------------------------------------------------
/icons/Microsoft Teams.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Teams.png
--------------------------------------------------------------------------------
/icons/Microsoft Windows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft Windows.png
--------------------------------------------------------------------------------
/icons/Microsoft_Entra_ID.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft_Entra_ID.png
--------------------------------------------------------------------------------
/icons/Microsoft_SCVMM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft_SCVMM.png
--------------------------------------------------------------------------------
/icons/Microsoft_SQL_DB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Microsoft_SQL_DB.png
--------------------------------------------------------------------------------
/icons/Monitor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Monitor.png
--------------------------------------------------------------------------------
/icons/Monitoring Console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Monitoring Console.png
--------------------------------------------------------------------------------
/icons/Mount_Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Mount_Server.png
--------------------------------------------------------------------------------
/icons/NAS backup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/NAS backup.png
--------------------------------------------------------------------------------
/icons/NAS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/NAS.png
--------------------------------------------------------------------------------
/icons/Network Proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Network Proxy.png
--------------------------------------------------------------------------------
/icons/Network_card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Network_card.png
--------------------------------------------------------------------------------
/icons/Number eight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number eight.png
--------------------------------------------------------------------------------
/icons/Number five.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number five.png
--------------------------------------------------------------------------------
/icons/Number four.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number four.png
--------------------------------------------------------------------------------
/icons/Number nine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number nine.png
--------------------------------------------------------------------------------
/icons/Number one.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number one.png
--------------------------------------------------------------------------------
/icons/Number seven.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number seven.png
--------------------------------------------------------------------------------
/icons/Number six.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number six.png
--------------------------------------------------------------------------------
/icons/Number three.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number three.png
--------------------------------------------------------------------------------
/icons/Number two.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Number two.png
--------------------------------------------------------------------------------
/icons/Nutanix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Nutanix.png
--------------------------------------------------------------------------------
/icons/ONE_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/ONE_server.png
--------------------------------------------------------------------------------
/icons/Object_Storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Object_Storage.png
--------------------------------------------------------------------------------
/icons/Object_Storage_support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Object_Storage_support.png
--------------------------------------------------------------------------------
/icons/On-demand Sandbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/On-demand Sandbox.png
--------------------------------------------------------------------------------
/icons/OpenVPN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/OpenVPN.png
--------------------------------------------------------------------------------
/icons/Oracle DB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Oracle DB.png
--------------------------------------------------------------------------------
/icons/Oracle RMAN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Oracle RMAN.png
--------------------------------------------------------------------------------
/icons/Physical switch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Physical switch.png
--------------------------------------------------------------------------------
/icons/PostGre_SQL_DB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/PostGre_SQL_DB.png
--------------------------------------------------------------------------------
/icons/PowerShell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/PowerShell.png
--------------------------------------------------------------------------------
/icons/Proxy_Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Proxy_Server.png
--------------------------------------------------------------------------------
/icons/RAM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/RAM.png
--------------------------------------------------------------------------------
/icons/RESTful API.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/RESTful API.png
--------------------------------------------------------------------------------
/icons/Report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Report.png
--------------------------------------------------------------------------------
/icons/Repository_Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Repository_Server.png
--------------------------------------------------------------------------------
/icons/Restore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Restore.png
--------------------------------------------------------------------------------
/icons/Role.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Role.png
--------------------------------------------------------------------------------
/icons/S3-compatible.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/S3-compatible.png
--------------------------------------------------------------------------------
/icons/SAP BRtools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SAP BRtools.png
--------------------------------------------------------------------------------
/icons/SAP HANA DB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SAP HANA DB.png
--------------------------------------------------------------------------------
/icons/SAP HANA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SAP HANA.png
--------------------------------------------------------------------------------
/icons/SMB (business).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SMB (business).png
--------------------------------------------------------------------------------
/icons/SQL_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SQL_server.png
--------------------------------------------------------------------------------
/icons/Scale_out_Backup_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Scale_out_Backup_Repository.png
--------------------------------------------------------------------------------
/icons/Scheduled backups.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Scheduled backups.png
--------------------------------------------------------------------------------
/icons/Search_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Search_server.png
--------------------------------------------------------------------------------
/icons/Server Cluster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server Cluster.png
--------------------------------------------------------------------------------
/icons/Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server.png
--------------------------------------------------------------------------------
/icons/Server_Cluster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server_Cluster.png
--------------------------------------------------------------------------------
/icons/Server_Nutanix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server_Nutanix.png
--------------------------------------------------------------------------------
/icons/Server_Stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server_Stack.png
--------------------------------------------------------------------------------
/icons/Server_with_Veeam_Agent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Server_with_Veeam_Agent.png
--------------------------------------------------------------------------------
/icons/Service-Application.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Service-Application.png
--------------------------------------------------------------------------------
/icons/SharePoint_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SharePoint_server.png
--------------------------------------------------------------------------------
/icons/Shared_folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Shared_folder.png
--------------------------------------------------------------------------------
/icons/Storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Storage.png
--------------------------------------------------------------------------------
/icons/Storage_NetApp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Storage_NetApp.png
--------------------------------------------------------------------------------
/icons/Storage_Snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Storage_Snapshot.png
--------------------------------------------------------------------------------
/icons/Storage_Stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Storage_Stack.png
--------------------------------------------------------------------------------
/icons/Storage_with_snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Storage_with_snapshot.png
--------------------------------------------------------------------------------
/icons/SureBackup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SureBackup.png
--------------------------------------------------------------------------------
/icons/SureReplica.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/SureReplica.png
--------------------------------------------------------------------------------
/icons/Table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Table.png
--------------------------------------------------------------------------------
/icons/Tag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tag.png
--------------------------------------------------------------------------------
/icons/Tape encrypted.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape encrypted.png
--------------------------------------------------------------------------------
/icons/Tape recording.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape recording.png
--------------------------------------------------------------------------------
/icons/Tape writing device.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape writing device.png
--------------------------------------------------------------------------------
/icons/Tape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape.png
--------------------------------------------------------------------------------
/icons/Tape_Drive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape_Drive.png
--------------------------------------------------------------------------------
/icons/Tape_Library.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape_Library.png
--------------------------------------------------------------------------------
/icons/Tape_Media_Pool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape_Media_Pool.png
--------------------------------------------------------------------------------
/icons/Tape_Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Tape_Server.png
--------------------------------------------------------------------------------
/icons/Task list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Task list.png
--------------------------------------------------------------------------------
/icons/Transport_Service.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Transport_Service.png
--------------------------------------------------------------------------------
/icons/User Group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/User Group.png
--------------------------------------------------------------------------------
/icons/User.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/User.png
--------------------------------------------------------------------------------
/icons/VAO_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VAO_server.png
--------------------------------------------------------------------------------
/icons/VAS_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VAS_server.png
--------------------------------------------------------------------------------
/icons/VBEM_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBEM_server.png
--------------------------------------------------------------------------------
/icons/VBO_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBO_Repository.png
--------------------------------------------------------------------------------
/icons/VBO_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBO_server.png
--------------------------------------------------------------------------------
/icons/VBR console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBR console.png
--------------------------------------------------------------------------------
/icons/VBR_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBR_Repository.png
--------------------------------------------------------------------------------
/icons/VBR_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBR_server.png
--------------------------------------------------------------------------------
/icons/VBR_server_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VBR_server_old.png
--------------------------------------------------------------------------------
/icons/VM_with_a_snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VM_with_a_snapshot.png
--------------------------------------------------------------------------------
/icons/VMware vCloud Director.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VMware vCloud Director.png
--------------------------------------------------------------------------------
/icons/VMware vSAN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VMware vSAN.png
--------------------------------------------------------------------------------
/icons/VMware vSwitch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VMware vSwitch.png
--------------------------------------------------------------------------------
/icons/VMware_vSphere.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VMware_vSphere.png
--------------------------------------------------------------------------------
/icons/VPN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VPN.png
--------------------------------------------------------------------------------
/icons/VPN_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VPN_server.png
--------------------------------------------------------------------------------
/icons/VSPC_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/VSPC_server.png
--------------------------------------------------------------------------------
/icons/Veeam Cloud Mobility.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam Cloud Mobility.png
--------------------------------------------------------------------------------
/icons/Veeam Sapphire.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam Sapphire.png
--------------------------------------------------------------------------------
/icons/Veeam_Agent_for_IBM_AIX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Agent_for_IBM_AIX.png
--------------------------------------------------------------------------------
/icons/Veeam_Agent_for_Linux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Agent_for_Linux.png
--------------------------------------------------------------------------------
/icons/Veeam_Agent_for_Oracle_Solaris.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Agent_for_Oracle_Solaris.png
--------------------------------------------------------------------------------
/icons/Veeam_Agent_for_Windows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Agent_for_Windows.png
--------------------------------------------------------------------------------
/icons/Veeam_Agents.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Agents.png
--------------------------------------------------------------------------------
/icons/Veeam_Availability_Orchestrator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Availability_Orchestrator.png
--------------------------------------------------------------------------------
/icons/Veeam_Availability_Suite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Availability_Suite.png
--------------------------------------------------------------------------------
/icons/Veeam_Backup_Enterprise_Manager.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Backup_Enterprise_Manager.png
--------------------------------------------------------------------------------
/icons/Veeam_Backup___Replication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Backup___Replication.png
--------------------------------------------------------------------------------
/icons/Veeam_Backup_for_Office_365.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Backup_for_Office_365.png
--------------------------------------------------------------------------------
/icons/Veeam_Cloud_Connect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Cloud_Connect.png
--------------------------------------------------------------------------------
/icons/Veeam_Explorer_for_Active_Directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Explorer_for_Active_Directory.png
--------------------------------------------------------------------------------
/icons/Veeam_Explorer_for_Exchange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Explorer_for_Exchange.png
--------------------------------------------------------------------------------
/icons/Veeam_Explorer_for_OneDrive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Explorer_for_OneDrive.png
--------------------------------------------------------------------------------
/icons/Veeam_MP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_MP.png
--------------------------------------------------------------------------------
/icons/Veeam_ONE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_ONE.png
--------------------------------------------------------------------------------
/icons/Veeam_ONE_Reporter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_ONE_Reporter.png
--------------------------------------------------------------------------------
/icons/Veeam_PN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_PN.png
--------------------------------------------------------------------------------
/icons/Veeam_Proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Proxy.png
--------------------------------------------------------------------------------
/icons/Veeam_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Repository.png
--------------------------------------------------------------------------------
/icons/Veeam_Service_Provider_Console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Service_Provider_Console.png
--------------------------------------------------------------------------------
/icons/Veeam_Service_Provider_Server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_Service_Provider_Server.png
--------------------------------------------------------------------------------
/icons/Veeam_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_logo.png
--------------------------------------------------------------------------------
/icons/Veeam_logo_new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Veeam_logo_new.png
--------------------------------------------------------------------------------
/icons/Virtual_Machine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Virtual_Machine.png
--------------------------------------------------------------------------------
/icons/Virtual_host.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Virtual_host.png
--------------------------------------------------------------------------------
/icons/WAN_accelerator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/WAN_accelerator.png
--------------------------------------------------------------------------------
/icons/Web console.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Web console.png
--------------------------------------------------------------------------------
/icons/Windows Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Windows Repository.png
--------------------------------------------------------------------------------
/icons/Windows_Repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Windows_Repository.png
--------------------------------------------------------------------------------
/icons/Windows_VM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Windows_VM.png
--------------------------------------------------------------------------------
/icons/Windows_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Windows_server.png
--------------------------------------------------------------------------------
/icons/Workstation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/Workstation.png
--------------------------------------------------------------------------------
/icons/no_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/no_icon.png
--------------------------------------------------------------------------------
/icons/vCenter_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/vCenter_server.png
--------------------------------------------------------------------------------
/icons/vCloud_Director_server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/vCloud_Director_server.png
--------------------------------------------------------------------------------
/icons/verified_recoverability.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebelinux/Veeam.Diagrammer/d67a10a27cabb0543633b890ee35cdd3de757009/icons/verified_recoverability.png
--------------------------------------------------------------------------------