From 5895e9abd24a1a3fd7740d3759ddeac94ae1f28a Mon Sep 17 00:00:00 2001 From: Clint Branham Date: Sun, 22 Mar 2026 08:15:13 -0500 Subject: [PATCH] fix(firewall): use nullable int for VmId parameter Changed VmId from int to int? across all 18 firewall cmdlets. The parameter is conditionally required (only when Level is Vm or Container) so using a non-nullable int with 0 as sentinel was fragile. Now checks !VmId.HasValue instead of VmId == 0, and passes the nullable directly to service methods. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Cmdlets/Firewall/GetPveFirewallAliasCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/GetPveFirewallGroupCmdlet.cs | 2 +- .../Cmdlets/Firewall/GetPveFirewallIpSetCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/GetPveFirewallIpSetEntryCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/GetPveFirewallOptionsCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/GetPveFirewallRefCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/GetPveFirewallRuleCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/NewPveFirewallAliasCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/NewPveFirewallGroupCmdlet.cs | 2 +- .../Cmdlets/Firewall/NewPveFirewallIpSetCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/NewPveFirewallIpSetEntryCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/NewPveFirewallRuleCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/RemovePveFirewallAliasCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/RemovePveFirewallGroupCmdlet.cs | 2 +- .../Cmdlets/Firewall/RemovePveFirewallIpSetCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/RemovePveFirewallIpSetEntryCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/RemovePveFirewallRuleCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/SetPveFirewallAliasCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/SetPveFirewallIpSetEntryCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/SetPveFirewallOptionsCmdlet.cs | 8 ++++---- .../Cmdlets/Firewall/SetPveFirewallRuleCmdlet.cs | 8 ++++---- 21 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallAliasCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallAliasCmdlet.cs index 8275a0e..8b81f87 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallAliasCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallAliasCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallAlias")] [OutputType(typeof(PveFirewallAlias))] - public class GetPveFirewallAliasCmdlet : PveCmdletBase + public sealed class GetPveFirewallAliasCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = false, HelpMessage = "Optional alias name to filter by.")] public string? Name { get; set; } @@ -40,7 +40,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -51,7 +51,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting firewall aliases at level '{level}'..."); var aliases = service.GetAliases(session, level, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallGroupCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallGroupCmdlet.cs index 3128d93..cf65456 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallGroupCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallGroupCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallGroup")] [OutputType(typeof(PveFirewallGroup), typeof(PveFirewallRule))] - public class GetPveFirewallGroupCmdlet : PveCmdletBase + public sealed class GetPveFirewallGroupCmdlet : PveCmdletBase { [Parameter(Mandatory = false, Position = 0, HelpMessage = "The security group name. If specified, returns rules within the group.")] public string? Group { get; set; } diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetCmdlet.cs index f1ac250..402bd7e 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallIpSet")] [OutputType(typeof(PveFirewallIpSet))] - public class GetPveFirewallIpSetCmdlet : PveCmdletBase + public sealed class GetPveFirewallIpSetCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = false, HelpMessage = "Optional IP set name to filter by.")] public string? Name { get; set; } @@ -40,7 +40,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -51,7 +51,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting firewall IP sets at level '{level}'..."); var ipSets = service.GetIpSets(session, level, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetEntryCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetEntryCmdlet.cs index 822449b..5193e24 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetEntryCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallIpSetEntryCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallIpSetEntry")] [OutputType(typeof(PveFirewallIpSetEntry))] - public class GetPveFirewallIpSetEntryCmdlet : PveCmdletBase + public sealed class GetPveFirewallIpSetEntryCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name.")] public string Name { get; set; } = string.Empty; @@ -39,7 +39,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -50,7 +50,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting entries for IP set '{Name}' at level '{level}'..."); var entries = service.GetIpSetEntries(session, level, Name, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallOptionsCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallOptionsCmdlet.cs index f2b91fb..bb01744 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallOptionsCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallOptionsCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallOptions")] [OutputType(typeof(PveFirewallOptions))] - public class GetPveFirewallOptionsCmdlet : PveCmdletBase + public sealed class GetPveFirewallOptionsCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } protected override void ProcessRecord() { @@ -36,7 +36,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -47,7 +47,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting firewall options at level '{level}'..."); var options = service.GetOptions(session, level, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRefCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRefCmdlet.cs index ce5b87f..e67fc0e 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRefCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRefCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallRef")] [OutputType(typeof(PveFirewallRef))] - public class GetPveFirewallRefCmdlet : PveCmdletBase + public sealed class GetPveFirewallRefCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = false, HelpMessage = "Optional type filter for references.")] public string? Type { get; set; } @@ -39,7 +39,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -50,7 +50,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting firewall references at level '{level}'..."); var refs = service.GetRefs(session, level, Type, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRuleCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRuleCmdlet.cs index 76e5ad6..6babe06 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRuleCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/GetPveFirewallRuleCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Get, "PveFirewallRule")] [OutputType(typeof(PveFirewallRule))] - public class GetPveFirewallRuleCmdlet : PveCmdletBase + public sealed class GetPveFirewallRuleCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = false, HelpMessage = "Optional rule position to filter by.")] public int? Position { get; set; } @@ -40,7 +40,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -51,7 +51,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Getting firewall rules at level '{level}'..."); var rules = service.GetRules(session, level, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallAliasCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallAliasCmdlet.cs index 1ca6fc8..e8515e3 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallAliasCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallAliasCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.New, "PveFirewallAlias", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class NewPveFirewallAliasCmdlet : PveCmdletBase + public sealed class NewPveFirewallAliasCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The alias name.")] public string Name { get; set; } = string.Empty; @@ -45,7 +45,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -59,7 +59,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Creating firewall alias '{Name}' at level '{level}'..."); service.CreateAlias(session, level, Name, Cidr, Comment, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallGroupCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallGroupCmdlet.cs index 1f68ba4..47d76ff 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallGroupCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallGroupCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.New, "PveFirewallGroup", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class NewPveFirewallGroupCmdlet : PveCmdletBase + public sealed class NewPveFirewallGroupCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The security group name.")] public string Group { get; set; } = string.Empty; diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetCmdlet.cs index a11c282..789a3c3 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.New, "PveFirewallIpSet", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class NewPveFirewallIpSetCmdlet : PveCmdletBase + public sealed class NewPveFirewallIpSetCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name.")] public string Name { get; set; } = string.Empty; @@ -42,7 +42,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -56,7 +56,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Creating firewall IP set '{Name}' at level '{level}'..."); service.CreateIpSet(session, level, Name, Comment, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetEntryCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetEntryCmdlet.cs index 19dba6b..eafacf6 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetEntryCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallIpSetEntryCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.New, "PveFirewallIpSetEntry", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class NewPveFirewallIpSetEntryCmdlet : PveCmdletBase + public sealed class NewPveFirewallIpSetEntryCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name.")] public string Name { get; set; } = string.Empty; @@ -48,7 +48,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -62,7 +62,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Adding entry '{Cidr}' to IP set '{Name}' at level '{level}'..."); service.AddIpSetEntry(session, level, Name, Cidr, NoMatch.IsPresent, Comment, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallRuleCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallRuleCmdlet.cs index 94c1bf2..203881f 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallRuleCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/NewPveFirewallRuleCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.New, "PveFirewallRule", SupportsShouldProcess = true)] [OutputType(typeof(PveFirewallRule))] - public class NewPveFirewallRuleCmdlet : PveCmdletBase + public sealed class NewPveFirewallRuleCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The rule type: in, out, or group.")] [ValidateSet("in", "out", "group")] @@ -75,7 +75,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -89,7 +89,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; var config = new Dictionary { diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallAliasCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallAliasCmdlet.cs index 6ddc16d..4281744 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallAliasCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallAliasCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Remove, "PveFirewallAlias", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] [OutputType(typeof(void))] - public class RemovePveFirewallAliasCmdlet : PveCmdletBase + public sealed class RemovePveFirewallAliasCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The alias name to remove.")] public string Name { get; set; } = string.Empty; @@ -39,7 +39,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -53,7 +53,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Removing firewall alias '{Name}' at level '{level}'..."); service.RemoveAlias(session, level, Name, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallGroupCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallGroupCmdlet.cs index 2e24dc2..9b0413f 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallGroupCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallGroupCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Remove, "PveFirewallGroup", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] [OutputType(typeof(void))] - public class RemovePveFirewallGroupCmdlet : PveCmdletBase + public sealed class RemovePveFirewallGroupCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The security group name to remove.")] public string Group { get; set; } = string.Empty; diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetCmdlet.cs index a7ae1e3..9e55d1c 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Remove, "PveFirewallIpSet", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] [OutputType(typeof(void))] - public class RemovePveFirewallIpSetCmdlet : PveCmdletBase + public sealed class RemovePveFirewallIpSetCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name to remove.")] public string Name { get; set; } = string.Empty; @@ -39,7 +39,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -53,7 +53,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Removing firewall IP set '{Name}' at level '{level}'..."); service.RemoveIpSet(session, level, Name, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetEntryCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetEntryCmdlet.cs index 97da0c6..7b1735a 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetEntryCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallIpSetEntryCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Remove, "PveFirewallIpSetEntry", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] [OutputType(typeof(void))] - public class RemovePveFirewallIpSetEntryCmdlet : PveCmdletBase + public sealed class RemovePveFirewallIpSetEntryCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name.")] public string Name { get; set; } = string.Empty; @@ -42,7 +42,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -56,7 +56,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Removing entry '{Cidr}' from IP set '{Name}' at level '{level}'..."); service.RemoveIpSetEntry(session, level, Name, Cidr, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallRuleCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallRuleCmdlet.cs index 5888161..6114f11 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallRuleCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/RemovePveFirewallRuleCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Remove, "PveFirewallRule", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] [OutputType(typeof(void))] - public class RemovePveFirewallRuleCmdlet : PveCmdletBase + public sealed class RemovePveFirewallRuleCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The rule position to remove.")] public int Position { get; set; } @@ -39,7 +39,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -53,7 +53,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Removing firewall rule at position {Position} ({level})..."); service.RemoveRule(session, level, Position, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallAliasCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallAliasCmdlet.cs index 3eea70e..d2766f1 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallAliasCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallAliasCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Set, "PveFirewallAlias", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class SetPveFirewallAliasCmdlet : PveCmdletBase + public sealed class SetPveFirewallAliasCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The alias name to update.")] public string Name { get; set; } = string.Empty; @@ -45,7 +45,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -59,7 +59,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; WriteVerbose($"Updating firewall alias '{Name}' at level '{level}'..."); service.UpdateAlias(session, level, Name, Cidr, Comment, Node, vmid); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallIpSetEntryCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallIpSetEntryCmdlet.cs index d178cc7..49eb4be 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallIpSetEntryCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallIpSetEntryCmdlet.cs @@ -7,7 +7,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Set, "PveFirewallIpSetEntry", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class SetPveFirewallIpSetEntryCmdlet : PveCmdletBase + public sealed class SetPveFirewallIpSetEntryCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -18,7 +18,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The IP set name.")] public string Name { get; set; } = string.Empty; @@ -48,7 +48,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -62,7 +62,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; bool? nomatch = NoMatch.IsPresent ? true : (bool?)null; WriteVerbose($"Updating entry '{Cidr}' in IP set '{Name}' at level '{level}'..."); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallOptionsCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallOptionsCmdlet.cs index 46ae7d7..36fa255 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallOptionsCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallOptionsCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Set, "PveFirewallOptions", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class SetPveFirewallOptionsCmdlet : PveCmdletBase + public sealed class SetPveFirewallOptionsCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = false, HelpMessage = "Enable or disable the firewall.")] public SwitchParameter Enable { get; set; } @@ -66,7 +66,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -80,7 +80,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; var config = new Dictionary(); diff --git a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallRuleCmdlet.cs b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallRuleCmdlet.cs index e65bd81..9383e48 100644 --- a/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallRuleCmdlet.cs +++ b/src/PSProxmoxVE/Cmdlets/Firewall/SetPveFirewallRuleCmdlet.cs @@ -8,7 +8,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall { [Cmdlet(VerbsCommon.Set, "PveFirewallRule", SupportsShouldProcess = true)] [OutputType(typeof(void))] - public class SetPveFirewallRuleCmdlet : PveCmdletBase + public sealed class SetPveFirewallRuleCmdlet : PveCmdletBase { [Parameter(Mandatory = true, Position = 0, HelpMessage = "The firewall level: Cluster, Node, Vm, or Container.")] [ValidateSet("Cluster", "Node", "Vm", "Container")] @@ -19,7 +19,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall [Parameter(Mandatory = false, HelpMessage = "The VM/Container ID. Required when Level is Vm or Container.")] [ValidateRange(100, 999999999)] - public int VmId { get; set; } + public int? VmId { get; set; } [Parameter(Mandatory = true, HelpMessage = "The rule position to update.")] public int Position { get; set; } @@ -78,7 +78,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall if (string.Equals(level, "Vm", StringComparison.OrdinalIgnoreCase) || string.Equals(level, "Container", StringComparison.OrdinalIgnoreCase)) { - if (VmId == 0) + if (!VmId.HasValue) { ThrowTerminatingError(new ErrorRecord( new PSArgumentException("VmId is required when Level is Vm or Container."), @@ -92,7 +92,7 @@ namespace PSProxmoxVE.Cmdlets.Firewall var session = GetSession(); var service = new FirewallService(); - int? vmid = VmId > 0 ? VmId : (int?)null; + var vmid = VmId; var config = new Dictionary();