diff --git a/src/PSOPNSenseAPI/Cmdlets/EnableOPNSenseCronJobCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/EnableOPNSenseCronJobCmdlet.cs index b52c043..fbcf9d8 100644 --- a/src/PSOPNSenseAPI/Cmdlets/EnableOPNSenseCronJobCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/EnableOPNSenseCronJobCmdlet.cs @@ -34,29 +34,34 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try + var cronService = new CronService(ApiClient, Logger); + + // Use our safe execution method + var result = ExecuteAsyncTask(() => cronService.ToggleJobAsync(Uuid, true)); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) { - var cronService = new CronService(ApiClient, Logger); - - var task = Task.Run(async () => await cronService.ToggleJobAsync(Uuid, true)); - var result = task.GetAwaiter().GetResult(); - - WriteVerbose($"Cron job {Uuid} enabled: {result.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}"); - } + return; } - catch (Exception ex) + + WriteVerbose($"Cron job {Uuid} enabled: {result.Result}"); + + // Apply the changes if requested + if (Apply.IsPresent) { - HandleException(ex); + // Use our safe execution method + var applyResult = ExecuteAsyncTask(() => cronService.ApplyChangesAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || applyResult == null) + { + return; + } + + WriteVerbose($"Cron changes applied: {applyResult.Status}"); } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseCronJobCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseCronJobCmdlet.cs index f36e7c6..17e56e0 100644 --- a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseCronJobCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseCronJobCmdlet.cs @@ -33,28 +33,35 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try - { - var cronService = new CronService(ApiClient, Logger); + var cronService = new CronService(ApiClient, Logger); - if (ParameterSetName == "ByUuid") - { - var task = Task.Run(async () => await cronService.GetJobAsync(Uuid)); - var result = task.GetAwaiter().GetResult(); - WriteObject(result.Job); - } - else - { - var task = Task.Run(async () => await cronService.GetJobsAsync()); - var result = task.GetAwaiter().GetResult(); - WriteObject(result.Rows, true); - } - } - catch (Exception ex) + if (ParameterSetName == "ByUuid") { - HandleException(ex); + // Use our safe execution method + var result = ExecuteAsyncTask(() => cronService.GetJobAsync(Uuid)); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) + { + return; + } + + WriteObject(result.Job); + } + else + { + // Use our safe execution method + var result = ExecuteAsyncTask(() => cronService.GetJobsAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) + { + return; + } + + WriteObject(result.Rows, true); } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseUserCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseUserCmdlet.cs index 35cb2b9..3f1695c 100644 --- a/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseUserCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/GetOPNSenseUserCmdlet.cs @@ -33,28 +33,35 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try - { - var userService = new UserService(ApiClient, Logger); + var userService = new UserService(ApiClient, Logger); - if (ParameterSetName == "ByUuid") - { - var task = Task.Run(async () => await userService.GetUserAsync(Uuid)); - var result = task.GetAwaiter().GetResult(); - WriteObject(result.User); - } - else - { - var task = Task.Run(async () => await userService.GetUsersAsync()); - var result = task.GetAwaiter().GetResult(); - WriteObject(result.Rows, true); - } - } - catch (Exception ex) + if (ParameterSetName == "ByUuid") { - HandleException(ex); + // Use our safe execution method + var result = ExecuteAsyncTask(() => userService.GetUserAsync(Uuid)); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) + { + return; + } + + WriteObject(result.User); + } + else + { + // Use our safe execution method + var result = ExecuteAsyncTask(() => userService.GetUsersAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) + { + return; + } + + WriteObject(result.Rows, true); } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseGatewayCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseGatewayCmdlet.cs index 35a37cd..d20ebda 100644 --- a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseGatewayCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseGatewayCmdlet.cs @@ -103,47 +103,52 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try + var gatewayService = new GatewayService(ApiClient, Logger); + + var gateway = new GatewayConfig { - var gatewayService = new GatewayService(ApiClient, Logger); + Name = Name, + Interface = Interface, + IpAddress = IpAddress, + MonitorIp = MonitorIp ?? IpAddress, + Description = Description, + IsDefault = Default.IsPresent ? "1" : "0", + Disabled = Disabled.IsPresent ? "1" : "0", + Weight = Weight?.ToString() ?? "1", + IpProtocol = IpProtocol, + MonitorDisable = DisableMonitoring.IsPresent ? "1" : "0", + ForceDown = ForceDown.IsPresent ? "1" : "0" + }; - var gateway = new GatewayConfig + // Use our safe execution method + var createResult = ExecuteAsyncTask(() => gatewayService.CreateGatewayAsync(gateway)); + + // Only continue if no exception occurred + if (ProcessingException != null || createResult == null) + { + return; + } + + WriteVerbose($"Created gateway with UUID {createResult.Uuid}"); + + // Apply changes if requested + if (Apply.IsPresent) + { + // Use our safe execution method + var applyResult = ExecuteAsyncTask(() => gatewayService.ApplyGatewayChangesAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || applyResult == null) { - Name = Name, - Interface = Interface, - IpAddress = IpAddress, - MonitorIp = MonitorIp ?? IpAddress, - Description = Description, - IsDefault = Default.IsPresent ? "1" : "0", - Disabled = Disabled.IsPresent ? "1" : "0", - Weight = Weight?.ToString() ?? "1", - IpProtocol = IpProtocol, - MonitorDisable = DisableMonitoring.IsPresent ? "1" : "0", - ForceDown = ForceDown.IsPresent ? "1" : "0" - }; - - var createTask = Task.Run(async () => await gatewayService.CreateGatewayAsync(gateway)); - var createResult = createTask.GetAwaiter().GetResult(); - - WriteVerbose($"Created gateway with UUID {createResult.Uuid}"); - - // Apply changes if requested - if (Apply.IsPresent) - { - var applyTask = Task.Run(async () => await gatewayService.ApplyGatewayChangesAsync()); - var applyResult = applyTask.GetAwaiter().GetResult(); - - WriteVerbose($"Gateway changes applied: {applyResult.Status}"); + return; } - WriteObject(createResult.Uuid); - } - catch (Exception ex) - { - HandleException(ex); + WriteVerbose($"Gateway changes applied: {applyResult.Status}"); } + + WriteObject(createResult.Uuid); } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseUserCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseUserCmdlet.cs index 656bf9d..f5b0a18 100644 --- a/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseUserCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/NewOPNSenseUserCmdlet.cs @@ -66,33 +66,32 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try + var userService = new UserService(ApiClient, Logger); + + var user = new UserConfig { - var userService = new UserService(ApiClient, Logger); + Username = Username, + Password = Password, + FullName = FullName, + Email = Email, + Disabled = Disabled.IsPresent ? "1" : "0", + Groups = Groups != null ? new List(Groups) : new List(), + Authorizations = Authorizations != null ? new List(Authorizations) : new List() + }; - var user = new UserConfig - { - Username = Username, - Password = Password, - FullName = FullName, - Email = Email, - Disabled = Disabled.IsPresent ? "1" : "0", - Groups = Groups != null ? new List(Groups) : new List(), - Authorizations = Authorizations != null ? new List(Authorizations) : new List() - }; + // Use our safe execution method + var result = ExecuteAsyncTask(() => userService.CreateUserAsync(user)); - var task = Task.Run(async () => await userService.CreateUserAsync(user)); - var result = task.GetAwaiter().GetResult(); - - WriteVerbose($"Created user with UUID {result.Uuid}"); - WriteObject(result.Uuid); - } - catch (Exception ex) + // Only continue if no exception occurred + if (ProcessingException != null || result == null) { - HandleException(ex); + return; } + + WriteVerbose($"Created user with UUID {result.Uuid}"); + WriteObject(result.Uuid); } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/UpdateOPNSenseFirmwareCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/UpdateOPNSenseFirmwareCmdlet.cs index 58ded89..317baad 100644 --- a/src/PSOPNSenseAPI/Cmdlets/UpdateOPNSenseFirmwareCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/UpdateOPNSenseFirmwareCmdlet.cs @@ -47,67 +47,69 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try + if (!ShouldProcess("OPNSense firewall", "Update firmware")) { - if (!ShouldProcess("OPNSense firewall", "Update firmware")) - { - return; - } - - var firmwareService = new FirmwareService(ApiClient, Logger); - - var task = Task.Run(async () => await firmwareService.UpdateAsync()); - var result = task.GetAwaiter().GetResult(); - - WriteVerbose($"Firmware update initiated: {result.Status}"); - WriteObject($"Firmware update initiated: {result.Status}"); - - if (Wait.IsPresent) - { - WriteVerbose($"Waiting for firmware update to complete (timeout: {Timeout} seconds, interval: {Interval} seconds)"); - WriteObject("Waiting for firmware update to complete..."); - - DateTime startTime = DateTime.Now; - bool completed = false; - - while (DateTime.Now - startTime < TimeSpan.FromSeconds(Timeout)) - { - var statusTask = Task.Run(async () => await firmwareService.GetStatusAsync()); - var statusResult = statusTask.GetAwaiter().GetResult(); - - if (statusResult.Status == "done") - { - WriteVerbose("Firmware update completed successfully"); - WriteObject("Firmware update completed successfully"); - completed = true; - break; - } - else if (statusResult.Status == "error") - { - WriteError(new ErrorRecord( - new Exception($"Firmware update failed: {statusResult.Log}"), - "FirmwareUpdateFailed", - ErrorCategory.InvalidOperation, - null)); - completed = true; - break; - } - - WriteVerbose($"Firmware update status: {statusResult.Status}"); - Thread.Sleep(Interval * 1000); - } - - if (!completed) - { - WriteWarning($"Timed out waiting for firmware update to complete after {Timeout} seconds"); - } - } + return; } - catch (Exception ex) + + var firmwareService = new FirmwareService(ApiClient, Logger); + + // Use our safe execution method + var result = ExecuteAsyncTask(() => firmwareService.UpdateAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) { - HandleException(ex); + return; + } + + WriteVerbose($"Firmware update initiated: {result.Status}"); + WriteObject($"Firmware update initiated: {result.Status}"); + + if (Wait.IsPresent) + { + WriteVerbose($"Waiting for firmware update to complete (timeout: {Timeout} seconds, interval: {Interval} seconds)"); + WriteObject("Waiting for firmware update to complete..."); + + DateTime startTime = DateTime.Now; + bool completed = false; + + while (DateTime.Now - startTime < TimeSpan.FromSeconds(Timeout)) + { + // Use our safe execution method + var statusResult = ExecuteAsyncTask(() => firmwareService.GetStatusAsync()); + + // Break if an exception occurred + if (ProcessingException != null || statusResult == null) + { + break; + } + + if (statusResult.Status == "done") + { + WriteVerbose("Firmware update completed successfully"); + WriteObject("Firmware update completed successfully"); + completed = true; + break; + } + else if (statusResult.Status == "error") + { + // Store the exception to be processed in ProcessRecord + ProcessingException = new Exception($"Firmware update failed: {statusResult.Log}"); + completed = true; + break; + } + + WriteVerbose($"Firmware update status: {statusResult.Status}"); + Thread.Sleep(Interval * 1000); + } + + if (!completed && ProcessingException == null) + { + WriteWarning($"Timed out waiting for firmware update to complete after {Timeout} seconds"); + } } } } diff --git a/src/PSOPNSenseAPI/Cmdlets/UpgradeOPNSenseFirmwareCmdlet.cs b/src/PSOPNSenseAPI/Cmdlets/UpgradeOPNSenseFirmwareCmdlet.cs index 5b02747..2919b1c 100644 --- a/src/PSOPNSenseAPI/Cmdlets/UpgradeOPNSenseFirmwareCmdlet.cs +++ b/src/PSOPNSenseAPI/Cmdlets/UpgradeOPNSenseFirmwareCmdlet.cs @@ -54,76 +54,82 @@ namespace PSOPNSenseAPI.Cmdlets /// /// Processes the cmdlet /// - protected override void ProcessRecord() + protected override void ProcessRecordInternal() { - try + if (!Force.IsPresent && !ShouldProcess("OPNSense firewall", "Upgrade firmware")) { - if (!Force.IsPresent && !ShouldProcess("OPNSense firewall", "Upgrade firmware")) - { - return; - } - - var firmwareService = new FirmwareService(ApiClient, Logger); - - var task = Task.Run(async () => await firmwareService.UpgradeAsync()); - var result = task.GetAwaiter().GetResult(); - - WriteVerbose($"Firmware upgrade initiated: {result.Status}"); - WriteObject($"Firmware upgrade initiated: {result.Status}"); - - if (Wait.IsPresent) - { - WriteVerbose($"Waiting for firmware upgrade to complete (timeout: {Timeout} seconds, interval: {Interval} seconds)"); - WriteObject("Waiting for firmware upgrade to complete..."); - - DateTime startTime = DateTime.Now; - bool completed = false; - - while (DateTime.Now - startTime < TimeSpan.FromSeconds(Timeout)) - { - try - { - var statusTask = Task.Run(async () => await firmwareService.GetStatusAsync()); - var statusResult = statusTask.GetAwaiter().GetResult(); - - if (statusResult.Status == "done") - { - WriteVerbose("Firmware upgrade completed successfully"); - WriteObject("Firmware upgrade completed successfully"); - completed = true; - break; - } - else if (statusResult.Status == "error") - { - WriteError(new ErrorRecord( - new Exception($"Firmware upgrade failed: {statusResult.Log}"), - "FirmwareUpgradeFailed", - ErrorCategory.InvalidOperation, - null)); - completed = true; - break; - } - - WriteVerbose($"Firmware upgrade status: {statusResult.Status}"); - } - catch (Exception ex) - { - // The firewall might be rebooting, so we'll ignore errors during the wait - WriteVerbose($"Error checking status (firewall might be rebooting): {ex.Message}"); - } - - Thread.Sleep(Interval * 1000); - } - - if (!completed) - { - WriteWarning($"Timed out waiting for firmware upgrade to complete after {Timeout} seconds"); - } - } + return; } - catch (Exception ex) + + var firmwareService = new FirmwareService(ApiClient, Logger); + + // Use our safe execution method + var result = ExecuteAsyncTask(() => firmwareService.UpgradeAsync()); + + // Only continue if no exception occurred + if (ProcessingException != null || result == null) { - HandleException(ex); + return; + } + + WriteVerbose($"Firmware upgrade initiated: {result.Status}"); + WriteObject($"Firmware upgrade initiated: {result.Status}"); + + if (Wait.IsPresent) + { + WriteVerbose($"Waiting for firmware upgrade to complete (timeout: {Timeout} seconds, interval: {Interval} seconds)"); + WriteObject("Waiting for firmware upgrade to complete..."); + + DateTime startTime = DateTime.Now; + bool completed = false; + + while (DateTime.Now - startTime < TimeSpan.FromSeconds(Timeout)) + { + try + { + // Use our safe execution method + var statusResult = ExecuteAsyncTask(() => firmwareService.GetStatusAsync()); + + // Skip this iteration if an exception occurred + if (ProcessingException != null || statusResult == null) + { + // Clear the exception since we're ignoring it during the wait + ProcessingException = null; + WriteVerbose("Error checking status (firewall might be rebooting)"); + Thread.Sleep(Interval * 1000); + continue; + } + + if (statusResult.Status == "done") + { + WriteVerbose("Firmware upgrade completed successfully"); + WriteObject("Firmware upgrade completed successfully"); + completed = true; + break; + } + else if (statusResult.Status == "error") + { + // Store the exception to be processed in ProcessRecord + ProcessingException = new Exception($"Firmware upgrade failed: {statusResult.Log}"); + completed = true; + break; + } + + WriteVerbose($"Firmware upgrade status: {statusResult.Status}"); + } + catch (Exception ex) + { + // The firewall might be rebooting, so we'll ignore errors during the wait + WriteVerbose($"Error checking status (firewall might be rebooting): {ex.Message}"); + } + + Thread.Sleep(Interval * 1000); + } + + if (!completed && ProcessingException == null) + { + WriteWarning($"Timed out waiting for firmware upgrade to complete after {Timeout} seconds"); + } } } } diff --git a/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1 b/src/PSOPNSenseAPI/PSOPNSenseAPI.psd1 index 875175e..4d7dcf9 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.1228' + ModuleVersion = '2025.04.15.1234' # Supported PSEditions CompatiblePSEditions = @('Desktop', 'Core')