From 89534c805a9fe52755bdbbbfa599b39ea7018876 Mon Sep 17 00:00:00 2001 From: Frank Wall Date: Wed, 3 Mar 2021 16:17:48 +0100 Subject: [PATCH] add pre-defined cron jobs to maintenance page --- net/haproxy/pkg-descr | 1 + .../HAProxy/Api/MaintenanceController.php | 104 +++++++++++++++++- .../HAProxy/MaintenanceController.php | 1 + .../HAProxy/forms/maintenanceCronjobs.xml | 46 ++++++++ .../app/models/OPNsense/HAProxy/HAProxy.xml | 76 +++++++++++++ .../views/OPNsense/HAProxy/maintenance.volt | 84 +++++++++++++- 6 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/maintenanceCronjobs.xml diff --git a/net/haproxy/pkg-descr b/net/haproxy/pkg-descr index 4fc52805d..4e83fe306 100644 --- a/net/haproxy/pkg-descr +++ b/net/haproxy/pkg-descr @@ -23,6 +23,7 @@ Added: * add support for server templates (#1975) * add support for additional resolver options (#1975) * add support for resolve-prefer option (#1975) +* add pre-defined cron jobs to maintenance page Fixed: * prevent service outage by aborting "Apply" when configtest fails diff --git a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/Api/MaintenanceController.php b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/Api/MaintenanceController.php index c727e6017..1aac6f4ec 100644 --- a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/Api/MaintenanceController.php +++ b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/Api/MaintenanceController.php @@ -31,16 +31,21 @@ namespace OPNsense\HAProxy\Api; -use OPNsense\Base\ApiControllerBase; +use OPNsense\Base\ApiMutableModelControllerBase; use OPNsense\Core\Backend; +use OPNsense\Core\Config; +use OPNsense\Cron\Cron; use OPNsense\HAProxy\HAProxy; /** * Class MaintenanceController * @package OPNsense\HAProxy */ -class MaintenanceController extends ApiControllerBase +class MaintenanceController extends ApiMutableModelControllerBase { + protected static $internalModelName = 'haproxy'; + protected static $internalModelClass = '\OPNsense\HAProxy\HAProxy'; + /** * jQuery bootstrap certificates diff list * @return array|mixed @@ -268,4 +273,99 @@ class MaintenanceController extends ApiControllerBase ]; } + /** + * create new cron job or return already available one + * @return array status action + */ + public function fetchCronIntegrationAction() + { + $result = array("result" => "no change"); + + if ($this->request->isPost()) { + $mdlHaproxy = $this->getModel(); + $backend = new Backend(); + + // Define possible cron jobs with their configd actions + $cronjobs = array( + 'syncCerts' => 'cert_sync_bulk', + 'updateOcsp' => 'update_ocsp', + 'reloadService' => 'reload', + 'restartService' => 'restart', + ); + + // Iterate over all possible cron jobs + foreach ($cronjobs as $cron => $cron_action) { + + // Name of the item that holds the cron UUID + $cron_ref = "${cron}Cron"; + + // Check if the cron job is enabled or disabled + if ((string)$mdlHaproxy->maintenance->cronjobs->$cron == "1") { + // Check if a cron job already exists + if ((string)$mdlHaproxy->maintenance->cronjobs->$cron_ref == "") { + + // Create new cron job + $mdlCron = new Cron(); + // NOTE: Only configd actions are valid commands for cronjobs + // and they *must* provide a description that is not empty. + $cron_uuid = $mdlCron->newDailyJob( + "HAProxy", + "haproxy ${cron_action}", + "Added by HAProxy plugin", + "*", + "1" + ); + $mdlHaproxy->maintenance->cronjobs->$cron_ref = $cron_uuid; + + // Save updated configuration. + if ($mdlCron->performValidation()->count() == 0) { + $mdlCron->serializeToConfig(); + // save data to config, do not validate because the current in memory model doesn't know about the + // cron item just created. + $mdlHaproxy->serializeToConfig($validateFullModel = false, $disable_validation = true); + Config::getInstance()->save(); + // Refresh the crontab + $backend->configdRun('template reload OPNsense/Cron'); + // (res)start daemon + $backend->configdRun("cron restart"); + $this->getLogger()->error("HAProxy: successfully created cron job $cron ($cron_uuid)"); + $result['result'] = "new"; + $result['uuid'] = $cron_uuid; + } else { + $this->getLogger()->error("HAProxy: unable to create cron job $cron"); + $result['result'] = "unable to add cron"; + } + } + } else { + // Check if a cron job exists + if ((string)$mdlHaproxy->maintenance->cronjobs->$cron_ref != "") { + + // Clean existin entry + $cron_uuid = (string)$mdlHaproxy->maintenance->cronjobs->$cron_ref; + $mdlHaproxy->maintenance->cronjobs->$cron_ref = ""; + + // Delete the cronjob item + $mdlCron = new Cron(); + if ($mdlCron->jobs->job->del($cron_uuid)) { + // If item is removed, serialize to config and save + $mdlCron->serializeToConfig(); + $mdlHaproxy->serializeToConfig($validateFullModel = false, $disable_validation = true); + Config::getInstance()->save(); + // Regenerate the crontab + $backend->configdRun('template reload OPNsense/Cron'); + // (res)start daemon + $backend->configdRun("cron restart"); + $this->getLogger()->error("HAProxy: successfully deleted cron job $cron ($cron_uuid)"); + $result['result'] = "deleted"; + } else { + $this->getLogger()->error("HAProxy: unable to delete cron job $cron ($cron_uuid)"); + $result['result'] = "unable to delete cron"; + } + } + } + } + } + + return $result; + } } diff --git a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/MaintenanceController.php b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/MaintenanceController.php index d5a073cc7..92ef3a051 100644 --- a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/MaintenanceController.php +++ b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/MaintenanceController.php @@ -41,5 +41,6 @@ class MaintenanceController extends \OPNsense\Base\IndexController { // choose template $this->view->pick('OPNsense/HAProxy/maintenance'); + $this->view->maintenanceCronjobsForm = $this->getForm("maintenanceCronjobs"); } } diff --git a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/maintenanceCronjobs.xml b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/maintenanceCronjobs.xml new file mode 100644 index 000000000..f9c4edf83 --- /dev/null +++ b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/maintenanceCronjobs.xml @@ -0,0 +1,46 @@ +
+ + + header + + + + haproxy.maintenance.cronjobs.syncCerts + + checkbox + Automation instead of this cron job.]]> + + + + header + + + + haproxy.maintenance.cronjobs.updateOcsp + + checkbox + HAProxy service settings.]]> + + + + header + + + + haproxy.maintenance.cronjobs.reloadService + + checkbox + + + + + header + + + + haproxy.maintenance.cronjobs.restartService + + checkbox + + +
diff --git a/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml b/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml index e889fb8f9..8c172b6cf 100644 --- a/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml +++ b/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml @@ -2815,5 +2815,81 @@ + + + + 0 + N + + + + + OPNsense.Cron.Cron + jobs.job + description + + /HAProxy/ + + + + Related cron not found. + N + + + 0 + N + + + + + OPNsense.Cron.Cron + jobs.job + description + + /HAProxy/ + + + + Related cron not found. + N + + + 0 + N + + + + + OPNsense.Cron.Cron + jobs.job + description + + /HAProxy/ + + + + Related cron not found. + N + + + 0 + N + + + + + OPNsense.Cron.Cron + jobs.job + description + + /HAProxy/ + + + + Related cron not found. + N + + + diff --git a/net/haproxy/src/opnsense/mvc/app/views/OPNsense/HAProxy/maintenance.volt b/net/haproxy/src/opnsense/mvc/app/views/OPNsense/HAProxy/maintenance.volt index 7934afc06..159a67159 100644 --- a/net/haproxy/src/opnsense/mvc/app/views/OPNsense/HAProxy/maintenance.volt +++ b/net/haproxy/src/opnsense/mvc/app/views/OPNsense/HAProxy/maintenance.volt @@ -28,6 +28,72 @@ POSSIBILITY OF SUCH DAMAGE. #}
@@ -514,6 +581,21 @@ POSSIBILITY OF SUCH DAMAGE.
+ +
+
+ {{ partial("layout_partials/base_form",['fields':maintenanceCronjobsForm,'id':'frm_cronjobs'])}} +
+
+ +
+
+
+ {{ lang._('%sNOTE:%s When enabling multiple cron jobs, please adjust them so that they do not run at the same time. Check the %scron settings page%s for more cron job details and additional customization options.') | format('', '', '', '') }} +
+
+
+
{{ partial("layout_partials/base_dialog_processing") }}