From 7dddca927c39de3a70d0eeca94e10206d3c296e9 Mon Sep 17 00:00:00 2001 From: Alphaeus Mote Date: Mon, 28 Apr 2025 19:35:20 -0400 Subject: [PATCH] Reorganize project structure to separate solution from module --- .gitignore | 8 +- Module/Install-PSProxmox.ps1 | 32 +++ Module/LICENSE | 21 ++ PSProxmox.psd1 => Module/PSProxmox.psd1 | 3 +- Module/README.md | 193 ++++++++++++++++++ PSProxmox.zip | Bin 47426 -> 0 bytes .../Client}/ProxmoxApiClient.cs | 0 .../Cmdlets}/ClearProxmoxIPPoolCmdlet.cs | 0 .../Cmdlets}/ConnectProxmoxServerCmdlet.cs | 0 .../Cmdlets}/DisconnectProxmoxServerCmdlet.cs | 0 .../Cmdlets}/GetProxmoxClusterBackupCmdlet.cs | 0 .../Cmdlets}/GetProxmoxClusterCmdlet.cs | 0 .../Cmdlets}/GetProxmoxIPPoolCmdlet.cs | 0 .../Cmdlets}/GetProxmoxNetworkCmdlet.cs | 0 .../Cmdlets}/GetProxmoxNodeCmdlet.cs | 0 .../Cmdlets}/GetProxmoxRoleCmdlet.cs | 0 .../Cmdlets}/GetProxmoxSDNVnetCmdlet.cs | 0 .../Cmdlets}/GetProxmoxSDNZoneCmdlet.cs | 0 .../Cmdlets}/GetProxmoxStorageCmdlet.cs | 0 .../Cmdlets}/GetProxmoxUserCmdlet.cs | 0 .../Cmdlets}/GetProxmoxVMCmdlet.cs | 0 .../Cmdlets}/GetProxmoxVMTemplateCmdlet.cs | 0 .../Cmdlets}/JoinProxmoxClusterCmdlet.cs | 0 .../Cmdlets}/LeaveProxmoxClusterCmdlet.cs | 0 .../Cmdlets}/NewProxmoxClusterBackupCmdlet.cs | 0 .../Cmdlets}/NewProxmoxIPPoolCmdlet.cs | 0 .../Cmdlets}/NewProxmoxNetworkCmdlet.cs | 0 .../Cmdlets}/NewProxmoxRoleCmdlet.cs | 0 .../Cmdlets}/NewProxmoxSDNVnetCmdlet.cs | 0 .../Cmdlets}/NewProxmoxSDNZoneCmdlet.cs | 0 .../Cmdlets}/NewProxmoxStorageCmdlet.cs | 0 .../Cmdlets}/NewProxmoxUserCmdlet.cs | 0 .../Cmdlets}/NewProxmoxVMBuilderCmdlet.cs | 0 .../Cmdlets}/NewProxmoxVMCmdlet.cs | 0 .../NewProxmoxVMFromTemplateCmdlet.cs | 0 .../Cmdlets}/NewProxmoxVMTemplateCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxNetworkCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxRoleCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxSDNVnetCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxSDNZoneCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxStorageCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxUserCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxVMCmdlet.cs | 0 .../Cmdlets}/RemoveProxmoxVMTemplateCmdlet.cs | 0 .../Cmdlets}/RestartProxmoxVMCmdlet.cs | 0 .../RestoreProxmoxClusterBackupCmdlet.cs | 0 .../Cmdlets}/StartProxmoxVMCmdlet.cs | 0 .../Cmdlets}/StopProxmoxVMCmdlet.cs | 0 {IPAM => PSProxmox/IPAM}/IPAMManager.cs | 0 .../Models}/ProxmoxCluster.cs | 0 .../Models}/ProxmoxClusterBackup.cs | 0 .../Models}/ProxmoxConnectionInfo.cs | 0 {Models => PSProxmox/Models}/ProxmoxIPPool.cs | 0 .../Models}/ProxmoxNetwork.cs | 0 {Models => PSProxmox/Models}/ProxmoxNode.cs | 0 .../Models}/ProxmoxResponse.cs | 0 {Models => PSProxmox/Models}/ProxmoxRole.cs | 0 .../Models}/ProxmoxSDNVnet.cs | 0 .../Models}/ProxmoxSDNZone.cs | 0 .../Models}/ProxmoxStorage.cs | 0 {Models => PSProxmox/Models}/ProxmoxTicket.cs | 0 {Models => PSProxmox/Models}/ProxmoxUser.cs | 0 {Models => PSProxmox/Models}/ProxmoxVM.cs | 0 .../Models}/ProxmoxVMBuilder.cs | 0 .../Models}/ProxmoxVMTemplate.cs | 0 .../PSProxmox.Main.csproj | 6 +- .../PSProxmox.Main.sln | 0 .../PSProxmox.csproj | 0 .../Session}/ProxmoxConnection.cs | 0 .../Session}/ProxmoxSession.cs | 0 .../Templates}/TemplateManager.cs | 0 .../Utilities}/JsonUtility.cs | 0 build.ps1 | 47 +++++ 73 files changed, 306 insertions(+), 4 deletions(-) create mode 100644 Module/Install-PSProxmox.ps1 create mode 100644 Module/LICENSE rename PSProxmox.psd1 => Module/PSProxmox.psd1 (98%) create mode 100644 Module/README.md delete mode 100644 PSProxmox.zip rename {Client => PSProxmox/Client}/ProxmoxApiClient.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/ClearProxmoxIPPoolCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/ConnectProxmoxServerCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/DisconnectProxmoxServerCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxClusterBackupCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxClusterCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxIPPoolCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxNetworkCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxNodeCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxRoleCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxSDNVnetCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxSDNZoneCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxStorageCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxUserCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxVMCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/GetProxmoxVMTemplateCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/JoinProxmoxClusterCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/LeaveProxmoxClusterCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxClusterBackupCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxIPPoolCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxNetworkCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxRoleCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxSDNVnetCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxSDNZoneCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxStorageCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxUserCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxVMBuilderCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxVMCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxVMFromTemplateCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/NewProxmoxVMTemplateCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxNetworkCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxRoleCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxSDNVnetCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxSDNZoneCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxStorageCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxUserCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxVMCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RemoveProxmoxVMTemplateCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RestartProxmoxVMCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/RestoreProxmoxClusterBackupCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/StartProxmoxVMCmdlet.cs (100%) rename {Cmdlets => PSProxmox/Cmdlets}/StopProxmoxVMCmdlet.cs (100%) rename {IPAM => PSProxmox/IPAM}/IPAMManager.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxCluster.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxClusterBackup.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxConnectionInfo.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxIPPool.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxNetwork.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxNode.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxResponse.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxRole.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxSDNVnet.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxSDNZone.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxStorage.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxTicket.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxUser.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxVM.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxVMBuilder.cs (100%) rename {Models => PSProxmox/Models}/ProxmoxVMTemplate.cs (100%) rename PSProxmox.Main.csproj => PSProxmox/PSProxmox.Main.csproj (95%) rename PSProxmox.Main.sln => PSProxmox/PSProxmox.Main.sln (100%) rename PSProxmox.csproj => PSProxmox/PSProxmox.csproj (100%) rename {Session => PSProxmox/Session}/ProxmoxConnection.cs (100%) rename {Session => PSProxmox/Session}/ProxmoxSession.cs (100%) rename {Templates => PSProxmox/Templates}/TemplateManager.cs (100%) rename {Utilities => PSProxmox/Utilities}/JsonUtility.cs (100%) create mode 100644 build.ps1 diff --git a/.gitignore b/.gitignore index 6716e14..533ab53 100644 --- a/.gitignore +++ b/.gitignore @@ -34,8 +34,8 @@ x86/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ -[Bb]in/ -[Oo]bj/ +PSProxmox/[Bb]in/ +PSProxmox/[Oo]bj/ [Ll]og/ [Ll]ogs/ @@ -46,6 +46,10 @@ bld/ *.tar.gz *.tgz +# Module bin folder (except the DLL) +Module/bin/* +!Module/bin/PSProxmox.dll + # PowerShell module artifacts *.psm1 *.psd1.meta diff --git a/Module/Install-PSProxmox.ps1 b/Module/Install-PSProxmox.ps1 new file mode 100644 index 0000000..7bccb95 --- /dev/null +++ b/Module/Install-PSProxmox.ps1 @@ -0,0 +1,32 @@ +# Install-PSProxmox.ps1 +# This script installs the PSProxmox module to the user's PowerShell modules directory + +# Define the module name +$moduleName = "PSProxmox" + +# Define the destination path +$modulePath = "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\$moduleName" +if ($PSVersionTable.PSEdition -eq "Core") { + $modulePath = "$env:USERPROFILE\Documents\PowerShell\Modules\$moduleName" +} + +# Create the module directory if it doesn't exist +if (-not (Test-Path -Path $modulePath)) { + New-Item -Path $modulePath -ItemType Directory -Force | Out-Null + Write-Host "Created module directory: $modulePath" +} + +# Create the bin directory if it doesn't exist +if (-not (Test-Path -Path "$modulePath\bin")) { + New-Item -Path "$modulePath\bin" -ItemType Directory -Force | Out-Null + Write-Host "Created bin directory: $modulePath\bin" +} + +# Copy the module files +Copy-Item -Path "$PSScriptRoot\PSProxmox.psd1" -Destination $modulePath -Force +Copy-Item -Path "$PSScriptRoot\bin\PSProxmox.dll" -Destination "$modulePath\bin" -Force +Copy-Item -Path "$PSScriptRoot\LICENSE" -Destination $modulePath -Force +Copy-Item -Path "$PSScriptRoot\README.md" -Destination $modulePath -Force + +Write-Host "PSProxmox module has been installed to $modulePath" +Write-Host "You can now import the module using: Import-Module $moduleName" diff --git a/Module/LICENSE b/Module/LICENSE new file mode 100644 index 0000000..6fb1a0a --- /dev/null +++ b/Module/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 freedbygrace + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PSProxmox.psd1 b/Module/PSProxmox.psd1 similarity index 98% rename from PSProxmox.psd1 rename to Module/PSProxmox.psd1 index e8d5dad..64f293f 100644 --- a/PSProxmox.psd1 +++ b/Module/PSProxmox.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSProxmox.dll' - ModuleVersion = '2023.04.28.1324' + ModuleVersion = '2025.04.28.1934' GUID = 'd24f0894-3d0c-4ef1-a41e-b273c3db86ad' Author = 'PSProxmox Team' CompanyName = 'PSProxmox' @@ -87,3 +87,4 @@ } } } + diff --git a/Module/README.md b/Module/README.md new file mode 100644 index 0000000..f72c555 --- /dev/null +++ b/Module/README.md @@ -0,0 +1,193 @@ +# PSProxmox + +PSProxmox is a PowerShell module for managing Proxmox VE clusters. It provides a comprehensive set of cmdlets for managing virtual machines, storage, networks, users, roles, and more. + +## Installation + +```powershell +# Install from PowerShell Gallery +Install-Module -Name PSProxmox -Scope CurrentUser +``` + +## Getting Started + +### Connecting to a Proxmox VE Server + +```powershell +# Connect using username and password +$securePassword = ConvertTo-SecureString "password" -AsPlainText -Force +$connection = Connect-ProxmoxServer -Server "proxmox.example.com" -Username "root" -Password $securePassword -Realm "pam" + +# Connect using a credential object +$credential = Get-Credential +$connection = Connect-ProxmoxServer -Server "proxmox.example.com" -Credential $credential -Realm "pam" +``` + +### Managing Virtual Machines + +```powershell +# Get all VMs +$vms = Get-ProxmoxVM -Connection $connection + +# Get a specific VM +$vm = Get-ProxmoxVM -Connection $connection -VMID 100 + +# Create a new VM +$vm = New-ProxmoxVM -Connection $connection -Node "pve1" -Name "test-vm" -Memory 2048 -Cores 2 -DiskSize 32 -Start + +# Create a new VM using the builder pattern +$builder = New-ProxmoxVMBuilder -Name "web-server" +$builder.WithMemory(4096) + .WithCores(2) + .WithDisk(50, "local-lvm") + .WithNetwork("virtio", "vmbr0") + .WithIPConfig("192.168.1.10/24", "192.168.1.1") + .WithStart($true) + +$vm = New-ProxmoxVM -Connection $connection -Node "pve1" -Builder $builder + +# Start, stop, and restart VMs +Start-ProxmoxVM -Connection $connection -Node "pve1" -VMID 100 +Stop-ProxmoxVM -Connection $connection -Node "pve1" -VMID 100 +Restart-ProxmoxVM -Connection $connection -Node "pve1" -VMID 100 + +# Remove a VM +Remove-ProxmoxVM -Connection $connection -Node "pve1" -VMID 100 -Confirm:$false +``` + +### Managing Templates + +```powershell +# Create a template from an existing VM +$template = New-ProxmoxVMTemplate -Connection $connection -VMID 100 -Name "Ubuntu-Template" -Description "Ubuntu 20.04 Template" + +# Get all templates +$templates = Get-ProxmoxVMTemplate + +# Create a VM from a template +$vm = New-ProxmoxVMFromTemplate -Connection $connection -Node "pve1" -TemplateName "Ubuntu-Template" -Name "web01" -Start + +# Create multiple VMs from a template +$vms = New-ProxmoxVMFromTemplate -Connection $connection -Node "pve1" -TemplateName "Ubuntu-Template" -Prefix "web" -Count 3 -Start +``` + +### Managing Storage + +```powershell +# Get all storage +$storage = Get-ProxmoxStorage -Connection $connection + +# Get storage on a specific node +$storage = Get-ProxmoxStorage -Connection $connection -Node "pve1" + +# Create a new storage +$storage = New-ProxmoxStorage -Connection $connection -Name "backup" -Type "dir" -Path "/mnt/backup" -Content "backup,iso" + +# Remove a storage +Remove-ProxmoxStorage -Connection $connection -Name "backup" -Confirm:$false +``` + +### Managing Networks + +```powershell +# Get all network interfaces on a node +$networks = Get-ProxmoxNetwork -Connection $connection -Node "pve1" + +# Create a new bridge interface +$network = New-ProxmoxNetwork -Connection $connection -Node "pve1" -Interface "vmbr1" -Type "bridge" -BridgePorts "eth1" -Method "static" -Address "192.168.2.1" -Netmask "255.255.255.0" -Autostart + +# Remove a network interface +Remove-ProxmoxNetwork -Connection $connection -Node "pve1" -Interface "vmbr1" -Confirm:$false +``` + +### Managing Users and Roles + +```powershell +# Get all users +$users = Get-ProxmoxUser -Connection $connection + +# Create a new user +$securePassword = ConvertTo-SecureString "password" -AsPlainText -Force +$user = New-ProxmoxUser -Connection $connection -Username "john" -Realm "pam" -Password $securePassword -FirstName "John" -LastName "Doe" -Email "john.doe@example.com" + +# Remove a user +Remove-ProxmoxUser -Connection $connection -UserID "john@pam" -Confirm:$false + +# Get all roles +$roles = Get-ProxmoxRole -Connection $connection + +# Create a new role +$role = New-ProxmoxRole -Connection $connection -RoleID "Developer" -Privileges "VM.Allocate", "VM.Config.Disk", "VM.Config.CPU", "VM.PowerMgmt" + +# Remove a role +Remove-ProxmoxRole -Connection $connection -RoleID "Developer" -Confirm:$false +``` + +### Managing SDN + +```powershell +# Get all SDN zones +$zones = Get-ProxmoxSDNZone -Connection $connection + +# Create a new SDN zone +$zone = New-ProxmoxSDNZone -Connection $connection -Zone "zone1" -Type "vlan" -Bridge "vmbr0" + +# Remove an SDN zone +Remove-ProxmoxSDNZone -Connection $connection -Zone "zone1" -Confirm:$false + +# Get all SDN VNets +$vnets = Get-ProxmoxSDNVnet -Connection $connection + +# Create a new SDN VNet +$vnet = New-ProxmoxSDNVnet -Connection $connection -VNet "vnet1" -Zone "zone1" -IPv4 "192.168.1.0/24" -Gateway "192.168.1.1" + +# Remove an SDN VNet +Remove-ProxmoxSDNVnet -Connection $connection -VNet "vnet1" -Confirm:$false +``` + +### Managing Clusters + +```powershell +# Get cluster information +$cluster = Get-ProxmoxCluster -Connection $connection + +# Join a node to a cluster +$securePassword = ConvertTo-SecureString "password" -AsPlainText -Force +Join-ProxmoxCluster -Connection $connection -ClusterName "cluster1" -HostName "pve1" -Password $securePassword + +# Leave a cluster +Leave-ProxmoxCluster -Connection $connection -Force + +# Create a cluster backup +$backup = New-ProxmoxClusterBackup -Connection $connection -Compress -Wait + +# Restore a cluster backup +Restore-ProxmoxClusterBackup -Connection $connection -BackupID "vzdump-cluster-2023_04_28-12_00_00.vma.lzo" -Force -Wait +``` + +### Managing IP Addresses + +```powershell +# Create a new IP pool +$pool = New-ProxmoxIPPool -Name "Production" -CIDR "192.168.1.0/24" -ExcludeIPs "192.168.1.1", "192.168.1.254" + +# Get all IP pools +$pools = Get-ProxmoxIPPool + +# Get a specific IP pool +$pool = Get-ProxmoxIPPool -Name "Production" + +# Clear an IP pool +Clear-ProxmoxIPPool -Name "Production" +``` + +## Disconnecting + +```powershell +# Disconnect from the server +Disconnect-ProxmoxServer -Connection $connection +``` + +## License + +This project is licensed under the MIT License - see the LICENSE file for details. diff --git a/PSProxmox.zip b/PSProxmox.zip deleted file mode 100644 index 0b6ec9d12c6b08df32c065208bb2a06d4092e23d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47426 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

uq$?a0Cw|E)*CWVvSGxn)19DIQ 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 bUmjgi2Kvj - + + + + + diff --git a/PSProxmox.Main.sln b/PSProxmox/PSProxmox.Main.sln similarity index 100% rename from PSProxmox.Main.sln rename to PSProxmox/PSProxmox.Main.sln diff --git a/PSProxmox.csproj b/PSProxmox/PSProxmox.csproj similarity index 100% rename from PSProxmox.csproj rename to PSProxmox/PSProxmox.csproj diff --git a/Session/ProxmoxConnection.cs b/PSProxmox/Session/ProxmoxConnection.cs similarity index 100% rename from Session/ProxmoxConnection.cs rename to PSProxmox/Session/ProxmoxConnection.cs diff --git a/Session/ProxmoxSession.cs b/PSProxmox/Session/ProxmoxSession.cs similarity index 100% rename from Session/ProxmoxSession.cs rename to PSProxmox/Session/ProxmoxSession.cs diff --git a/Templates/TemplateManager.cs b/PSProxmox/Templates/TemplateManager.cs similarity index 100% rename from Templates/TemplateManager.cs rename to PSProxmox/Templates/TemplateManager.cs diff --git a/Utilities/JsonUtility.cs b/PSProxmox/Utilities/JsonUtility.cs similarity index 100% rename from Utilities/JsonUtility.cs rename to PSProxmox/Utilities/JsonUtility.cs diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..18cf184 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,47 @@ +# build.ps1 +# This script builds the PSProxmox module and creates a release package + +# Set the version based on the current date and time +$version = Get-Date -Format "yyyy.MM.dd.HHmm" +Write-Host "Building PSProxmox version $version" + +# Update the module version in the PSD1 file +$psd1Path = ".\Module\PSProxmox.psd1" +$psd1Content = Get-Content -Path $psd1Path -Raw +$psd1Content = $psd1Content -replace "ModuleVersion = '.*'", "ModuleVersion = '$version'" +Set-Content -Path $psd1Path -Value $psd1Content + +# Build the solution +Write-Host "Building solution..." +dotnet build .\PSProxmox\PSProxmox.Main.csproj -c Release + +# Create the release directory +$releaseDir = ".\Release\$version" +if (-not (Test-Path -Path $releaseDir)) { + New-Item -Path $releaseDir -ItemType Directory -Force | Out-Null + Write-Host "Created release directory: $releaseDir" +} + +# Copy the module files to the release directory +Copy-Item -Path .\Module\PSProxmox.psd1 -Destination $releaseDir -Force +Copy-Item -Path .\Module\bin\PSProxmox.dll -Destination $releaseDir -Force +Copy-Item -Path .\Module\LICENSE -Destination $releaseDir -Force +Copy-Item -Path .\Module\README.md -Destination $releaseDir -Force +Copy-Item -Path .\Module\Install-PSProxmox.ps1 -Destination $releaseDir -Force + +# Create a bin directory in the release directory +$releaseBinDir = "$releaseDir\bin" +if (-not (Test-Path -Path $releaseBinDir)) { + New-Item -Path $releaseBinDir -ItemType Directory -Force | Out-Null + Write-Host "Created bin directory: $releaseBinDir" +} + +# Copy the DLL to the bin directory +Copy-Item -Path .\Module\bin\PSProxmox.dll -Destination $releaseBinDir -Force + +# Create a ZIP file of the release +$zipPath = ".\Release\PSProxmox-$version.zip" +Compress-Archive -Path $releaseDir\* -DestinationPath $zipPath -Force +Write-Host "Created release package: $zipPath" + +Write-Host "Build completed successfully!"