diff --git a/src/PSOPNSenseAPI/Cmdlets/DisconnectOPNSenseTailscaleCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/DisconnectOPNSenseTailscaleCmdlet.cs
index dd22be5..974b06e 100644
--- a/src/PSOPNSenseAPI/Cmdlets/DisconnectOPNSenseTailscaleCmdlet.cs
+++ b/src/PSOPNSenseAPI/Cmdlets/DisconnectOPNSenseTailscaleCmdlet.cs
@@ -27,61 +27,74 @@ namespace PSOPNSenseAPI.Cmdlets
///
/// Processes the cmdlet
///
- protected override void ProcessRecord()
+ protected override void ProcessRecordInternal()
{
- try
+ var tailscaleService = new TailscaleService(ApiClient, Logger);
+
+ // Check if the plugin is installed
+ var isInstalled = ExecuteAsyncTask(() => tailscaleService.IsPluginInstalledAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null)
{
- var tailscaleService = new TailscaleService(ApiClient, Logger);
-
- // Check if the plugin is installed
- var isInstalledTask = Task.Run(async () => await tailscaleService.IsPluginInstalledAsync());
- var isInstalled = isInstalledTask.GetAwaiter().GetResult();
-
- if (!isInstalled)
- {
- WriteWarning("Tailscale plugin is not installed on the OPNSense firewall.");
- return;
- }
-
- // Get current status
- var statusTask = Task.Run(async () => await tailscaleService.GetStatusAsync());
- var status = statusTask.GetAwaiter().GetResult();
-
- if (!status.Running)
- {
- WriteWarning("Tailscale service is not running.");
- return;
- }
-
- if (!Force.IsPresent && !ShouldProcess("OPNSense firewall", "Disconnect from Tailscale network"))
- {
- return;
- }
-
- // Disconnect from Tailscale
- WriteVerbose("Disconnecting from Tailscale network...");
- var disconnectTask = Task.Run(async () => await tailscaleService.DisconnectAsync());
- var disconnectResult = disconnectTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Tailscale disconnection status: {disconnectResult.Status}");
-
- // Get updated status
- statusTask = Task.Run(async () => await tailscaleService.GetStatusAsync());
- status = statusTask.GetAwaiter().GetResult();
-
- // Create result object
- var result = new PSObject();
- result.Properties.Add(new PSNoteProperty("Status", status.Status));
- result.Properties.Add(new PSNoteProperty("Running", status.Running));
- result.Properties.Add(new PSNoteProperty("Enabled", status.Enabled));
- result.Properties.Add(new PSNoteProperty("DisconnectionStatus", disconnectResult.Status));
-
- WriteObject(result);
+ return;
}
- catch (Exception ex)
+
+ if (!isInstalled)
{
- HandleException(ex);
+ WriteWarning("Tailscale plugin is not installed on the OPNSense firewall.");
+ return;
}
+
+ // Get current status
+ var status = ExecuteAsyncTask(() => tailscaleService.GetStatusAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || status == null)
+ {
+ return;
+ }
+
+ if (!status.Running)
+ {
+ WriteWarning("Tailscale service is not running.");
+ return;
+ }
+
+ if (!Force.IsPresent && !ShouldProcess("OPNSense firewall", "Disconnect from Tailscale network"))
+ {
+ return;
+ }
+
+ // Disconnect from Tailscale
+ WriteVerbose("Disconnecting from Tailscale network...");
+ var disconnectResult = ExecuteAsyncTask(() => tailscaleService.DisconnectAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || disconnectResult == null)
+ {
+ return;
+ }
+
+ WriteVerbose($"Tailscale disconnection status: {disconnectResult.Status}");
+
+ // Get updated status
+ status = ExecuteAsyncTask(() => tailscaleService.GetStatusAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || status == null)
+ {
+ return;
+ }
+
+ // Create result object
+ var result = new PSObject();
+ result.Properties.Add(new PSNoteProperty("Status", status.Status));
+ result.Properties.Add(new PSNoteProperty("Running", status.Running));
+ result.Properties.Add(new PSNoteProperty("Enabled", status.Enabled));
+ result.Properties.Add(new PSNoteProperty("DisconnectionStatus", disconnectResult.Status));
+
+ WriteObject(result);
}
}
}
diff --git a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseInterfaceCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseInterfaceCmdlet.cs
index 92a2099..0345a43 100644
--- a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseInterfaceCmdlet.cs
+++ b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseInterfaceCmdlet.cs
@@ -33,28 +33,35 @@ namespace PSOPNSenseAPI.Cmdlets
///
/// Processes the cmdlet
///
- protected override void ProcessRecord()
+ protected override void ProcessRecordInternal()
{
- try
- {
- var interfaceService = new InterfaceService(ApiClient, Logger);
+ var interfaceService = new InterfaceService(ApiClient, Logger);
- if (ParameterSetName == "ByName")
- {
- var task = Task.Run(async () => await interfaceService.GetInterfaceDetailAsync(Name));
- var result = task.GetAwaiter().GetResult();
- WriteObject(result.Interface);
- }
- else
- {
- var task = Task.Run(async () => await interfaceService.GetInterfacesAsync());
- var result = task.GetAwaiter().GetResult();
- WriteObject(result.Interfaces, true);
- }
- }
- catch (Exception ex)
+ if (ParameterSetName == "ByName")
{
- HandleException(ex);
+ // Use our safe execution method
+ var result = ExecuteAsyncTask(() => interfaceService.GetInterfaceDetailAsync(Name));
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || result == null)
+ {
+ return;
+ }
+
+ WriteObject(result.Interface);
+ }
+ else
+ {
+ // Use our safe execution method
+ var result = ExecuteAsyncTask(() => interfaceService.GetInterfacesAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || result == null)
+ {
+ return;
+ }
+
+ WriteObject(result.Interfaces, true);
}
}
}
diff --git a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseDNSOverrideCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseDNSOverrideCmdlet.cs
index 9b55da8..7aa3331 100644
--- a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseDNSOverrideCmdlet.cs
+++ b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseDNSOverrideCmdlet.cs
@@ -60,41 +60,46 @@ namespace PSOPNSenseAPI.Cmdlets
///
/// Processes the cmdlet
///
- protected override void ProcessRecord()
+ protected override void ProcessRecordInternal()
{
- try
+ var dnsService = new DNSService(ApiClient, Logger);
+
+ var dnsOverride = new DNSOverrideConfig
{
- var dnsService = new DNSService(ApiClient, Logger);
+ Hostname = Hostname,
+ Domain = Domain,
+ IpAddress = IpAddress,
+ Description = Description,
+ Enabled = Enabled.IsPresent ? "1" : "0"
+ };
- var dnsOverride = new DNSOverrideConfig
+ // Use our safe execution method
+ var createResult = ExecuteAsyncTask(() => dnsService.CreateDNSOverrideAsync(dnsOverride));
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || createResult == null)
+ {
+ return;
+ }
+
+ WriteVerbose($"Created DNS override with UUID {createResult.Uuid}");
+
+ // Apply the changes if requested
+ if (Apply.IsPresent)
+ {
+ // Use our safe execution method
+ var applyResult = ExecuteAsyncTask(() => dnsService.ApplyDNSChangesAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || applyResult == null)
{
- Hostname = Hostname,
- Domain = Domain,
- IpAddress = IpAddress,
- Description = Description,
- Enabled = Enabled.IsPresent ? "1" : "0"
- };
-
- var createTask = Task.Run(async () => await dnsService.CreateDNSOverrideAsync(dnsOverride));
- var createResult = createTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Created DNS override with UUID {createResult.Uuid}");
-
- // Apply the changes if requested
- if (Apply.IsPresent)
- {
- var applyTask = Task.Run(async () => await dnsService.ApplyDNSChangesAsync());
- var applyResult = applyTask.GetAwaiter().GetResult();
-
- WriteVerbose($"DNS changes applied: {applyResult.Status}");
+ return;
}
- WriteObject(createResult.Uuid);
- }
- catch (Exception ex)
- {
- HandleException(ex);
+ WriteVerbose($"DNS changes applied: {applyResult.Status}");
}
+
+ WriteObject(createResult.Uuid);
}
}
}
diff --git a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseRouteCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseRouteCmdlet.cs
index 5be8585..13485ee 100644
--- a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseRouteCmdlet.cs
+++ b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseRouteCmdlet.cs
@@ -53,40 +53,45 @@ namespace PSOPNSenseAPI.Cmdlets
///
/// Processes the cmdlet
///
- protected override void ProcessRecord()
+ protected override void ProcessRecordInternal()
{
- try
+ var routeService = new RouteService(ApiClient, Logger);
+
+ var route = new RouteConfig
{
- var routeService = new RouteService(ApiClient, Logger);
+ Network = Network,
+ Gateway = Gateway,
+ Description = Description,
+ Disabled = Disabled.IsPresent ? "1" : "0"
+ };
- var route = new RouteConfig
+ // Use our safe execution method
+ var createResult = ExecuteAsyncTask(() => routeService.CreateRouteAsync(route));
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || createResult == null)
+ {
+ return;
+ }
+
+ WriteVerbose($"Created route with UUID {createResult.Uuid}");
+
+ // Apply changes if requested
+ if (Apply.IsPresent)
+ {
+ // Use our safe execution method
+ var applyResult = ExecuteAsyncTask(() => routeService.ApplyRouteChangesAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || applyResult == null)
{
- Network = Network,
- Gateway = Gateway,
- Description = Description,
- Disabled = Disabled.IsPresent ? "1" : "0"
- };
-
- var createTask = Task.Run(async () => await routeService.CreateRouteAsync(route));
- var createResult = createTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Created route with UUID {createResult.Uuid}");
-
- // Apply changes if requested
- if (Apply.IsPresent)
- {
- var applyTask = Task.Run(async () => await routeService.ApplyRouteChangesAsync());
- var applyResult = applyTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Route changes applied: {applyResult.Status}");
+ return;
}
- WriteObject(createResult.Uuid);
- }
- catch (Exception ex)
- {
- HandleException(ex);
+ WriteVerbose($"Route changes applied: {applyResult.Status}");
}
+
+ WriteObject(createResult.Uuid);
}
}
}
diff --git a/src/PSOPNSenseAPI/Cmdlets/RemoveOPNSenseCronJobCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/RemoveOPNSenseCronJobCmdlet.cs
index cfdc5b3..c59ef6a 100644
--- a/src/PSOPNSenseAPI/Cmdlets/RemoveOPNSenseCronJobCmdlet.cs
+++ b/src/PSOPNSenseAPI/Cmdlets/RemoveOPNSenseCronJobCmdlet.cs
@@ -45,44 +45,56 @@ namespace PSOPNSenseAPI.Cmdlets
///
/// Processes the cmdlet
///
- protected override void ProcessRecord()
+ protected override void ProcessRecordInternal()
{
- try
+ var cronService = new CronService(ApiClient, Logger);
+
+ // Get the job details for the confirmation message
+ var jobResult = ExecuteAsyncTask(() => cronService.GetJobAsync(Uuid));
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || jobResult == null)
{
- var cronService = new CronService(ApiClient, Logger);
+ return;
+ }
- // Get the job details for the confirmation message
- var getTask = Task.Run(async () => await cronService.GetJobAsync(Uuid));
- var job = getTask.GetAwaiter().GetResult().Job;
+ var job = jobResult.Job;
- string confirmMessage = $"Cron job: {job.Description}";
- if (!string.IsNullOrEmpty(job.Command))
- {
- confirmMessage += $" ({job.Command})";
- }
+ string confirmMessage = $"Cron job: {job.Description}";
+ if (!string.IsNullOrEmpty(job.Command))
+ {
+ confirmMessage += $" ({job.Command})";
+ }
- if (!Force.IsPresent && !ShouldProcess(confirmMessage, "Remove"))
+ if (!Force.IsPresent && !ShouldProcess(confirmMessage, "Remove"))
+ {
+ return;
+ }
+
+ // Use our safe execution method
+ var deleteResult = ExecuteAsyncTask(() => cronService.DeleteJobAsync(Uuid));
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || deleteResult == null)
+ {
+ return;
+ }
+
+ WriteVerbose($"Cron job {Uuid} removed: {deleteResult.Result}");
+
+ // Apply the changes if requested
+ if (Apply.IsPresent)
+ {
+ // Use our safe execution method
+ var applyResult = ExecuteAsyncTask(() => cronService.ApplyChangesAsync());
+
+ // Only continue if no exception occurred
+ if (ProcessingException != null || applyResult == null)
{
return;
}
- var deleteTask = Task.Run(async () => await cronService.DeleteJobAsync(Uuid));
- var deleteResult = deleteTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Cron job {Uuid} removed: {deleteResult.Result}");
-
- // Apply the changes if requested
- if (Apply.IsPresent)
- {
- var applyTask = Task.Run(async () => await cronService.ApplyChangesAsync());
- var applyResult = applyTask.GetAwaiter().GetResult();
-
- WriteVerbose($"Cron changes applied: {applyResult.Status}");
- }
- }
- catch (Exception ex)
- {
- HandleException(ex);
+ WriteVerbose($"Cron changes applied: {applyResult.Status}");
}
}
}
diff --git a/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1 b/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1
index 096df98..0496d47 100644
--- a/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1
+++ b/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1
@@ -3,7 +3,7 @@
RootModule = 'lib\PSOPNSenseAPI.dll'
# Version number of this module.
- ModuleVersion = '2025.04.15.1245'
+ ModuleVersion = '2025.04.15.1249'
# Supported PSEditions
CompatiblePSEditions = @('Desktop', 'Core')