├── .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 --------------------------------------------------------------------------------