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) <noreply@anthropic.com>
This commit is contained in:
Clint Branham
2026-03-22 08:15:13 -05:00
parent 77849062ab
commit 5895e9abd2
21 changed files with 75 additions and 75 deletions
@@ -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);
@@ -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; }
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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;
@@ -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);
@@ -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);
@@ -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<string, string>
{
@@ -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);
@@ -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;
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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}'...");
@@ -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<string, string>();
@@ -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<string, string>();