diff --git a/ajax/add.php b/ajax/add.php index 5bfee78a573cbdfe32d0228b7306571cd4d9cd05..1fe0f1b202bfa7a62c312b1e21734c15d74fa855 100644 --- a/ajax/add.php +++ b/ajax/add.php @@ -11,7 +11,6 @@ * @param String $dayOfWeek * @param string $params */ - QUI::$Ajax->registerFunction( 'package_quiqqer_cron_ajax_add', function ($cron, $min, $hour, $day, $month, $dayOfWeek, $params) { diff --git a/ajax/cronservice/getStatus.php b/ajax/cronservice/getStatus.php new file mode 100644 index 0000000000000000000000000000000000000000..8c5d208f2c87d22b72cc8484b85f0340ceb6f0b2 --- /dev/null +++ b/ajax/cronservice/getStatus.php @@ -0,0 +1,17 @@ +<?php + +/** + * Gets the current Status for this instance + * + * @return string - Returns the status + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_cron_ajax_cronservice_getStatus', + function () { + $CronService = new \QUI\Cron\CronService(); + + return $CronService->getStatus(); + }, + array(), + '' +); diff --git a/ajax/cronservice/revokeRegistration.php b/ajax/cronservice/revokeRegistration.php new file mode 100644 index 0000000000000000000000000000000000000000..99f6f6270fac8d83cfb003452d8802256b726f52 --- /dev/null +++ b/ajax/cronservice/revokeRegistration.php @@ -0,0 +1,15 @@ +<?php + +/** + * Revokes a registration on the cronservice server. + * + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_cron_ajax_cronservice_revokeRegistration', + function () { + $CronService = new \QUI\Cron\CronService(); + $CronService->revokeRegistration(); + }, + array(), + '' +); diff --git a/ajax/cronservice/sendRegistration.php b/ajax/cronservice/sendRegistration.php new file mode 100644 index 0000000000000000000000000000000000000000..91ab2b7beff5aad76790d095c97ec7dc2fcff51f --- /dev/null +++ b/ajax/cronservice/sendRegistration.php @@ -0,0 +1,16 @@ +<?php + +/** + * Sends a registration to the cronservice server. + * + * + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_cron_ajax_cronservice_sendRegistration', + function ($email) { + $CronService = new \QUI\Cron\CronService(); + $CronService->register($email); + }, + array('email'), + '' +); diff --git a/ajax/delete.php b/ajax/delete.php index 9c852f526d1663497124936023c0b1fb7acabd4f..69719319dcdab8fb54dcbd283308209897941c94 100644 --- a/ajax/delete.php +++ b/ajax/delete.php @@ -5,7 +5,6 @@ * * @param string $ids - json array */ - QUI::$Ajax->registerFunction( 'package_quiqqer_cron_ajax_delete', function ($ids) { diff --git a/ajax/edit.php b/ajax/edit.php index 42b80ba344e3f1337543a3a1856f5dbe2fd67817..f1dd0ac01ba3b4407b0d0071a5d0213cd3d2ac4f 100644 --- a/ajax/edit.php +++ b/ajax/edit.php @@ -1,7 +1,7 @@ <?php /** - * Add a cron to the cron list + * Edit a cron * * @param String $cronId * @param String $cron @@ -12,7 +12,6 @@ * @param String $dayOfWeek * @param String $params */ - QUI::$Ajax->registerFunction( 'package_quiqqer_cron_ajax_edit', function ($cronId, $cron, $min, $hour, $day, $month, $dayOfWeek, $params) { diff --git a/ajax/execute.php b/ajax/execute.php index 7988fa931e524b0455d28886c3c763a9e08f55d7..eb0d3443bd2d2eefa1487431eb4b53a724cc4119 100644 --- a/ajax/execute.php +++ b/ajax/execute.php @@ -3,14 +3,12 @@ /** * Execute the cron list */ - QUI::$Ajax->registerFunction( 'package_quiqqer_cron_ajax_execute', function () { try { $Manager = new QUI\Cron\Manager(); $Manager->execute(); - } catch (QUI\Exception $Exception) { QUI\System\Log::addError( 'package_quiqqer_cron_ajax_execute() :: ' . $Exception->getMessage() diff --git a/ajax/getList.php b/ajax/getList.php index fd9a9524bf0f0a3ebc088e09c6b36326db7182f9..0154af918700661b26169c3fc9c336104b8dfea6 100644 --- a/ajax/getList.php +++ b/ajax/getList.php @@ -5,7 +5,6 @@ * * @return array */ - QUI::$Ajax->registerFunction( 'package_quiqqer_cron_ajax_getList', function () { diff --git a/ajax/history/get.php b/ajax/history/get.php index 21ee5dbe8341060c3650b8e8a666b794b99b3394..3661893ab5d6df5d0a7f798a855441d61a351ef3 100644 --- a/ajax/history/get.php +++ b/ajax/history/get.php @@ -13,8 +13,8 @@ QUI::$Ajax->registerFunction( $params = json_decode($params, true); return array( - 'page' => (int)$params['page'], - 'data' => $CronManager->getHistoryList($params), + 'page' => (int)$params['page'], + 'data' => $CronManager->getHistoryList($params), 'total' => $CronManager->getHistoryCount() ); }, diff --git a/bin/CronServiceWindow.css b/bin/CronServiceWindow.css new file mode 100644 index 0000000000000000000000000000000000000000..07e20ae99496e3f9c3c4cb35cefa298f442cad16 --- /dev/null +++ b/bin/CronServiceWindow.css @@ -0,0 +1,82 @@ + +.quiqqer-cron-cronservicewindow-btn-openRegistration { + margin : 30px auto 0 auto; + float : right; +} + +.quiqqer-cron-cronserviceWindow h2 { + font-weight : normal; + margin-bottom : 10px; +} + +.quiqqer-cron-cronservicewindow-title { + padding-bottom : 10px; + text-align : center; +} + +.quiqqer-cron-cronservicewindow-title span { + clear : both; + display : block; +} + +.quiqqer-cron-cronservicewindow-title .fa { + font-size : 60px; +} + +.quiqqer-cron-cronservicewindow-section { + margin : 15px auto; +} + +.quiqqer-cron-cronservicewindow-buttons { + text-align : center; + margin-top : 40px; + width : 100%; +} + +.quiqqer-cron-cronservicewindow-stat-title { + font-weight : bold; +} + +.quiqqer-cron-cronservice-table-stats { + width : 100%; +} + +.quiqqer-cron-cronservice-table-stats td { + width : 50%; +} + +.quiqqer-cron-cronservicewindow-stat-negative { + color : red; +} + +.quiqqer-cron-cronservicewindow-stat-positive { + color : green; +} + +/* Registration Sheet */ + +.quiqqer-cron-cronservicewindow-registration { + padding : 20px; +} + +.quiqqer-cron-cronservicewindow-registration-title { + border-bottom : 1px solid #eee; + padding-bottom : 10px; +} + +.quiqqer-cron-cronservicewindow-registration-lbl-email { + font-weight : bold; + padding : 2px; + width : 100%; +} + +.quiqqer-cron-cronservicewindow-registration-txt-email { + width : 100%; + margin-top : 6px; +} + +.quiqqer-cron-cronservicewindow-btn-register { + margin-top : 20px; + float : right; +} + diff --git a/bin/CronServiceWindow.html b/bin/CronServiceWindow.html new file mode 100644 index 0000000000000000000000000000000000000000..3d276447969a0f2ce8bfa438ff145abb26ecc9db --- /dev/null +++ b/bin/CronServiceWindow.html @@ -0,0 +1,56 @@ +<h1 class="quiqqer-cron-cronservicewindow-title"> + <span class="fa fa-cloud"></span> + <span>{{cron_window_cronservice_content_title}}</span> +</h1> + +<div class="quiqqer-cron-cronservicewindow-section"> + <h2>{{cron_window_cronservice_content_about_title}}</h2> + <p> + {{cron_window_cronservice_content_about_text}} + </p> +</div> + +<div class="quiqqer-cron-cronservicewindow-section"> + <h2>{{cron_window_cronservice_content_status_title}}</h2> + + {{cron_window_cronservice_content_status_text}} + + <table class="quiqqer-cron-cronservice-table-stats"> + <tr> + <td> + <span class="quiqqer-cron-cronservicewindow-stat-title"> + {{cron_window_cronservice_content_register_lbl_stats_status}} + </span> + </td> + <td> + <span class="{{#active}}quiqqer-cron-cronservicewindow-stat-positive{{/active}}{{^active}}quiqqer-cron-cronservicewindow-stat-negative{{/active}}"> + {{statusText}} + </span> + </td> + </tr> + {{#registered}} + <tr> + <td> + <span class="quiqqer-cron-cronservicewindow-stat-title"> + {{cron_window_cronservice_content_register_lbl_stats_errors}} + </span> + </td> + <td> + {{statusErrors}} + </td> + </tr> + <tr> + <td> + <span class="quiqqer-cron-cronservicewindow-stat-title"> + {{cron_window_cronservice_content_register_lbl_stats_lastExecution}} + </span> + </td> + <td> + {{statusLastExecution}} + </td> + </tr> + {{/registered}} + </table> +</div> + +<div class="quiqqer-cron-cronservicewindow-buttons"></div> \ No newline at end of file diff --git a/bin/CronServiceWindow.js b/bin/CronServiceWindow.js new file mode 100644 index 0000000000000000000000000000000000000000..0a10bbcdac6fe0cd84e3904bcf77aaf1e87c99e1 --- /dev/null +++ b/bin/CronServiceWindow.js @@ -0,0 +1,220 @@ +/** + * + */ +define('package/quiqqer/cron/bin/CronServiceWindow', [ + + 'qui/QUI', + 'qui/controls/windows/Popup', + 'qui/controls/buttons/Button', + 'Mustache', + 'Locale', + 'Ajax', + 'qui/controls/desktop/panels/Sheet', + + 'text!package/quiqqer/cron/bin/CronServiceWindow.html', + 'text!package/quiqqer/cron/bin/CronServiceWindowRegistration.html', + 'css!package/quiqqer/cron/bin/CronServiceWindow.css' + +], function (QUI, QUIPopup, QUIButton, Mustache, QUILocale, QUIAjax, QUISheets, template, registrationTemplate) { + "use strict"; + + var lg = 'quiqqer/cron'; + + return new Class({ + + Extends: QUIPopup, + Type : 'package/quiqqer/cron/bin/CronServiceWindow', + + Binds: [ + '$onSubmit', + '$onOpen', + 'showRegistration' + ], + + options: { + title : QUILocale.get(lg, 'cron.window.cronservice.title'), + icon : 'fa fa-cloud', + maxWidth : 400, + maxHeight: 600, + autoclose: false, + buttons : false + }, + + initialize: function (options) { + this.parent(options); + + this.registered = false; + + this.addEvents({ + onOpen: this.$onOpen + }); + }, + + $onOpen: function () { + var Content = this.getContent(); + + Content.set('html', ''); + Content.addClass('quiqqer-cron-cronserviceWindow'); + + this.refresh(); + }, + + /** + * refresh + */ + refresh: function () { + var self = this, + Content = this.getContent(); + + this.Loader.show(); + + QUIAjax.get('package_quiqqer_cron_ajax_cronservice_getStatus', function (result) { + var status = result; + + var statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.unregistered'); + if (status['status'] == 1) { + statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.registered'); + } + if (status['status'] == 2) { + statusText = QUILocale.get(lg, 'cron.window.cronservice.status.text.inactive'); + } + + + Content.set('html', Mustache.render(template, { + cron_window_cronservice_content_title : QUILocale.get(lg, 'cron.window.cronservice.content.title'), + cron_window_cronservice_content_about_title : QUILocale.get(lg, 'cron.window.cronservice.content.about.title'), + cron_window_cronservice_content_about_text : QUILocale.get(lg, 'cron.window.cronservice.content.about.text'), + cron_window_cronservice_content_status_title : QUILocale.get(lg, 'cron.window.cronservice.content.status.title'), + cron_window_cronservice_content_status_text : QUILocale.get(lg, 'cron.window.cronservice.content.status.text'), + cron_window_cronservice_content_btn_unregister : QUILocale.get(lg, 'cron.window.cronservice.content.register.btn.unregister'), + cron_window_cronservice_content_btn_register : QUILocale.get(lg, 'cron.window.cronservice.content.btn.register'), + cron_window_cronservice_content_register_lbl_stats_status : QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.status'), + cron_window_cronservice_content_register_lbl_stats_errors : QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.errors'), + cron_window_cronservice_content_register_lbl_stats_lastExecution: QUILocale.get(lg, 'cron.window.cronservice.content.register.lbl.stats.lastExecution'), + statusText : statusText, + status : status['status'], + statusErrors : status['current_failures'], //== 0 ? "0": status['errors'].toString(), + statusLastExecution : status['last_execution'], + registered : (status['status'] != 0), + active : (status['status'] == 1), + inactive : (status['status'] == 2) + })); + + self.registered = (status['status'] != 0); + + var Buttons = Content.getElement('.quiqqer-cron-cronservicewindow-buttons'); + + // get the button text : register or unregister + var btnText = QUILocale.get(lg, 'cron.window.cronservice.content.btn.register'); + if (self.registered) { + btnText = QUILocale.get(lg, 'cron.window.cronservice.content.btn.unregister'); + } + + new QUIButton({ + text : btnText, + textimage: 'fa fa-arrow-right', + events : { + onClick: function (Button) { + if (!self.registered) { + self.showRegistration(); + return; + } + Button.setAttribute('text', QUILocale.get('quiqqer/cron', 'cron.window.cronservice.content.btn.unregister.confirm')); + if (Button.getAttribute('clickcnt') == 1) { + self.unregister().then(function () { + self.refresh(); + }); + } + Button.setAttribute('clickcnt', 1); + } + }, + styles : { + 'float': 'none', + margin : '0 auto', + width : 200 + } + }).inject(Buttons); + + + self.Loader.hide(); + }, { + 'package': lg, + 'onError': function () { + self.Loader.hide(); + } + }); + }, + + /** + * Opens the registration sheet + */ + showRegistration: function () { + var self = this; + + new QUISheets({ + header : true, + icon : 'fa fa-cloud', + title : QUILocale.get(lg, 'cron.window.cronservice.title'), + buttons: false, + events : { + onOpen: function (Sheet) { + var Content = Sheet.getContent(); + + Content.set('html', Mustache.render(registrationTemplate, { + cron_window_cronservice_registration_title : QUILocale.get(lg, 'cron.window.cronservice.registration.title'), + cron_window_cronservice_content_register_txt_email_title : QUILocale.get(lg, 'cron.window.cronservice.content.register.txt.email.title'), + cron_window_cronservice_content_register_placeholder_email: QUILocale.get(lg, 'cron.window.cronservice.content.register.placeholder.email'), + cron_window_cronservice_content_btn_register : QUILocale.get(lg, 'cron.window.cronservice.registration.title') + })); + + var Email = Content.getElement('.quiqqer-cron-cronservicewindow-registration-txt-email'); + + Content.getElement('.quiqqer-cron-cronservicewindow-btn-register').addEvent('click', function () { + self.Loader.show(); + self.register(Email.value).then(function () { + self.refresh(); + Sheet.destroy(); + }).catch(function () { + self.Loader.hide(); + }); + }); + }, + + onClose: function (Sheet) { + Sheet.destroy(); + } + } + }).inject(this.$Elm).show(); + }, + + /** + * Register a email to the cron service + * + * @param {String} email + * @returns {Promise} + */ + register: function (email) { + return new Promise(function (resolve, reject) { + QUIAjax.post('package_quiqqer_cron_ajax_cronservice_sendRegistration', resolve, { + 'package': lg, + 'email' : email, + onError : reject + }); + }); + }, + + /** + * Unregister a email to the cron service + * + * @returns {Promise} + */ + unregister: function () { + return new Promise(function (resolve, reject) { + QUIAjax.get('package_quiqqer_cron_ajax_cronservice_revokeRegistration', resolve, { + 'package': lg, + onError : reject + }); + }); + } + }); +}); diff --git a/bin/CronServiceWindowRegistration.html b/bin/CronServiceWindowRegistration.html new file mode 100644 index 0000000000000000000000000000000000000000..1382e6ab701e0b9fd646fa87f3adccadd4d49bd0 --- /dev/null +++ b/bin/CronServiceWindowRegistration.html @@ -0,0 +1,25 @@ +<div class="quiqqer-cron-cronservicewindow-registration"> + <h1 class="quiqqer-cron-cronservicewindow-registration-title"> + {{cron_window_cronservice_registration_title}} + </h1> + <form action="" method="POST"> + <label + class="quiqqer-cron-cronservicewindow-registration-lbl-email" + for="quiqqer-cron-cronservicewindow-registration-txt-email" + > + {{cron_window_cronservice_content_register_txt_email_title}} + </label> + <input + id="quiqqer-cron-cronservicewindow-registration-txt-email" + type="text" + name="email" + required="required" + placeholder="{{cron_window_cronservice_content_register_placeholder_email}}" + class="quiqqer-cron-cronservicewindow-registration-txt-email" + /> + <div class="quiqqer-cron-cronservicewindow-btn-register qui-button"> + <span class="fa fa-check"></span> + <span>{{cron_window_cronservice_content_btn_register}}</span> + </div> + </form> +</div> \ No newline at end of file diff --git a/bin/CronWindow.js b/bin/CronWindow.js index 3d7dc78965823102e27ca7cab35b0108349dd873..e2a33146744c071724d77bfe89472f47fb10b9e5 100644 --- a/bin/CronWindow.js +++ b/bin/CronWindow.js @@ -32,7 +32,7 @@ define('package/quiqqer/cron/bin/CronWindow', [ options: { title : QUILocale.get('quiqqer/cron', 'cron.window.add.cron.title'), - icon : 'icon-time', + icon : 'fa fa-clock-o', maxWidth : 750, maxHeight: 500, @@ -40,11 +40,11 @@ define('package/quiqqer/cron/bin/CronWindow', [ cancel_button : { text : QUILocale.get('quiqqer/system', 'cancel'), - textimage : 'icon-remove fa fa-remove' + textimage : 'fa fa-remove' }, ok_button : { text : QUILocale.get('quiqqer/system', 'ok'), - textimage : 'icon-ok fa fa-check' + textimage : 'fa fa-check' } }, diff --git a/bin/History.js b/bin/History.js index 676d34e2bf77d40aee95e935dcb47ca8faebfe76..e82aed978d47fb5b6afff6dcddd120070065bb3d 100644 --- a/bin/History.js +++ b/bin/History.js @@ -43,7 +43,7 @@ define('package/quiqqer/cron/bin/History', [ options: { title: 'Cron-History', - icon : 'icon-long-arrow-right' + icon : 'fa fa-long-arrow-right' }, initialize: function (options) { diff --git a/bin/Manager.js b/bin/Manager.js index 2394285da1d51c56eae42e13fc7191565211a7e9..b7ddb5bb1fec560ca9f0f67a5c9912fe3b836b63 100644 --- a/bin/Manager.js +++ b/bin/Manager.js @@ -41,7 +41,7 @@ define('package/quiqqer/cron/bin/Manager', [ options: { title: 'Cron-Manager', - icon : 'icon-time' + icon : 'fa fa-clock-o' }, initialize: function (options) { @@ -81,7 +81,7 @@ define('package/quiqqer/cron/bin/Manager', [ for (var i = 0, len = result.length; i < len; i++) { result[i].status = { title : QUILocale.get(lg, 'cron.panel.manager.btn.toggle'), - icon : result[i].active == 1 ? 'icon-ok' : 'icon-remove', + icon : result[i].active == 1 ? 'fa fa-check' : 'fa fa-remove', cronId: result[i].id, events: { onClick: toggleCron @@ -91,7 +91,7 @@ define('package/quiqqer/cron/bin/Manager', [ result[i].play = { name : 'cron-play-button-' + result[i].id, title : QUILocale.get(lg, 'cron.panel.manager.btn.execute'), - icon : 'icon-play', + icon : 'fa fa-play', cronId: result[i].id, events: { onClick: execCron @@ -120,7 +120,7 @@ define('package/quiqqer/cron/bin/Manager', [ new QUIButton({ name : 'add', text : QUILocale.get(lg, 'cron.panel.manager.btn.add'), - textimage: 'icon-plus', + textimage: 'fa fa-plus', events : { onClick: function () { self.openAddCronWindow(); @@ -135,7 +135,7 @@ define('package/quiqqer/cron/bin/Manager', [ new QUIButton({ name : 'edit', text : QUILocale.get(lg, 'cron.panel.manager.btn.edit'), - textimage: 'icon-pencil', + textimage: 'fa fa-edit', events : { onClick: function () { self.editMarkedCron(); @@ -148,7 +148,7 @@ define('package/quiqqer/cron/bin/Manager', [ new QUIButton({ name : 'delete', text : QUILocale.get(lg, 'cron.panel.manager.btn.delete'), - textimage: 'icon-trash', + textimage: 'fa fa-trash', events : { onClick: function () { self.deleteMarkedCrons(); @@ -163,7 +163,7 @@ define('package/quiqqer/cron/bin/Manager', [ new QUIButton({ name : 'history', text : QUILocale.get(lg, 'cron.panel.manager.btn.history'), - textimage: 'icon-long-arrow-right', + textimage: 'fa fa-long-arrow-right', events : { onClick: function () { self.showHistory(); @@ -176,6 +176,21 @@ define('package/quiqqer/cron/bin/Manager', [ this.getButtons('delete').disable(); + this.addButton(new QUIButtonSeperator()); + this.addButton( + new QUIButton({ + name : 'cronservice', + text : QUILocale.get(lg, 'cron.panel.manager.btn.cronservice.register'), + textimage: 'fa fa-cloud', + events : { + onClick: function () { + self.registerCronservice(); + } + } + }) + ); + + var Content = this.getContent(), Container = new Element('div', { @@ -322,7 +337,7 @@ define('package/quiqqer/cron/bin/Manager', [ }); new QUIConfirm({ - icon : 'icon-remove', + icon : 'fa fa-remove', title : QUILocale.get(lg, 'cron.window.delete.cron.title'), text : QUILocale.get(lg, 'cron.window.delete.cron.text'), information: QUILocale.get(lg, 'cron.window.delete.cron.information', { @@ -442,12 +457,12 @@ define('package/quiqqer/cron/bin/Manager', [ } for (i = 0, len = buttons.length; i < len; i++) { - buttons[i].setAttribute('icon', 'icon-refresh icon-spin'); + buttons[i].setAttribute('icon', 'fa fa-spinner fa-spin'); } Ajax.post('package_quiqqer_cron_ajax_cron_executeCron', function () { for (i = 0, len = buttons.length; i < len; i++) { - buttons[i].setAttribute('icon', 'icon-play'); + buttons[i].setAttribute('icon', 'fa fa-play'); } }, { @@ -465,6 +480,16 @@ define('package/quiqqer/cron/bin/Manager', [ require(['package/quiqqer/cron/bin/History'], function (Panel) { new Panel().inject(self.getParent()); }); + }, + + /** + * Opens the Cronservice registration + */ + registerCronservice: function () { + require(['package/quiqqer/cron/bin/CronServiceWindow'], function (CronServiceWindow) { + var csWindow = new CronServiceWindow(); + csWindow.open(); + }); } }); }); \ No newline at end of file diff --git a/bin/cron.php b/bin/cron.php new file mode 100644 index 0000000000000000000000000000000000000000..f1058b1debc51c05e1244a05e8df04a23241ad1a --- /dev/null +++ b/bin/cron.php @@ -0,0 +1,53 @@ +<?php + +/** + * External execution + */ + +define('QUIQQER_SYSTEM', true); +require dirname(dirname(dirname(dirname(__FILE__)))) . "/header.php"; + +use \Symfony\Component\HttpFoundation\Response; + +$Cron = new QUI\Cron\Manager(); +$Response = QUI::getGlobalResponse(); + + +try { + if (!QUI::getUserBySession()->getId() + && isset($_GET['username']) + && isset($_GET['password']) + && isset($_GET['login']) + ) { + $User = QUI::getUsers()->login( + $_GET['username'], + $_GET['password'] + ); + + if ($User->getId()) { + QUI::getSession()->set('uid', $User->getId()); + + QUI\Permissions\Permission::setUser($User); + } + } +} catch (QUI\Exception $Exception) { + $Response->setStatusCode(Response::HTTP_FORBIDDEN); + $Response->send(); + exit; +} + +try { + $Cron->execute(); + + $Response->setStatusCode(Response::HTTP_OK); + $Response->send(); +} catch (QUI\Exception $Exception) { + QUI\System\Log::addAlert($Exception->getMessage(), array( + 'type' => 'cron execution' + )); + + $Response->setStatusCode(Response::HTTP_SERVICE_UNAVAILABLE); + $Response->send(); +} + +exit; diff --git a/composer.json b/composer.json index be9e7736c065b0713a5589181357fbabd1692e42..779bd180dc831050dab1e2da66a6ec9006d08029 100644 --- a/composer.json +++ b/composer.json @@ -1,29 +1 @@ -{ - "name" : "quiqqer/cron", - "type" : "quiqqer-module", - "description" : "Provided currency calculation and a automtatic cron to get the Euro foreign exchange reference rates.", - "version" : "dev-master", - "license" : "GPL-2.0+", - - "authors" : [{ - "name": "Henning Leutz", - "email": "leutz@pcsg.de", - "homepage": "http://www.pcsg.de", - "role": "Developer" - }], - - "support" : { - "email" : "support@pcsg.de" - }, - - "require": { - "quiqqer/quiqqer" : "*@dev", - "mtdowling/cron-expression": "1.0.*" - }, - - "autoload": { - "psr-0" : { - "QUI" : "src/" - } - } -} +{"name":"quiqqer\/cron","type":"quiqqer-module","description":"Provided currency calculation and a automtatic cron to get the Euro foreign exchange reference rates.","version":"dev-master","license":"GPL-2.0+","authors":[{"name":"Henning Leutz","email":"leutz@pcsg.de","homepage":"http:\/\/www.pcsg.de","role":"Developer"}],"support":{"email":"support@pcsg.de"},"require":{"quiqqer\/quiqqer":"*@dev","quiqqer\/utils":">=1.4|dev-dev","mtdowling\/cron-expression":"1.0.*"},"autoload":{"psr-0":{"QUI":"src\/"}}} \ No newline at end of file diff --git a/cron.xml b/cron.xml index 94031212a4cc6e8c1809de5e6fc8cfc04849fe70..c315c5c209ee21f1497631f94eafa7a982895a97 100644 --- a/cron.xml +++ b/cron.xml @@ -5,6 +5,11 @@ <description>Ordner für temporäre Daten leeren</description> </cron> + <cron exec="\QUI\Cron\QuiqqerCrons::clearSessions"> + <title>Sessions säubern</title> + <description>Löscht unnötige / abgelaufene Session Dateien</description> + </cron> + <cron exec="\QUI\Cron\QuiqqerCrons::clearCache"> <title>Cache leeren</title> <description>Kompletten Cache leeren</description> @@ -13,8 +18,10 @@ <cron exec="\QUI\Cron\QuiqqerCrons::clearAdminMediaCache"> <title>Media Cache der Administration leeren</title> <description> - Leert die Cachebilder von der Administration.<br /> - Dies sind zum Beispiel die Vorschaubilder in der Administration.<br /> + Leert die Cachebilder von der Administration. + <br/> + Dies sind zum Beispiel die Vorschaubilder in der Administration. + <br/> Der öffentliche Mediacache wird nicht geleert </description> </cron> @@ -32,8 +39,8 @@ Durchsucht das Projekt und aktiviert oder deaktiviert Seiten je nach Veröffentlichungsdatum. </description> <params> - <param name="project" type="string" /> - <param name="lang" type="string" /> + <param name="project" type="string"/> + <param name="lang" type="string"/> </params> </cron> diff --git a/database.xml b/database.xml index 1e8c91341a462c5f974751df2853ce38daa3a448..daf288184fad34e5dcd36c622ea3ebdc234fba8e 100644 --- a/database.xml +++ b/database.xml @@ -21,6 +21,12 @@ <field type="INT( 11 ) NOT NULL">uid</field> <field type="DATETIME NULL">lastexec</field> </table> + + <table name="cron_cronservice"> + <field type="INT( 3 ) NOT NULL">cronid</field> + <field type="INT( 11 ) NOT NULL">uid</field> + <field type="DATETIME NULL">lastexec</field> + </table> </global> </database> diff --git a/events.xml b/events.xml index bd16d5686cbbcb241f0e474cdcab7fb3ed11fc04..863282f650c031b69128eba0817018e7926d6e13 100644 --- a/events.xml +++ b/events.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <events> - <event on="onAdminLoad" fire="\QUI\Cron\EventHandler::onAdminLoad" /> - <event on="onAdminLoadFooter" fire="\QUI\Cron\EventHandler::adminLoadFooter" /> + <event on="onAdminLoad" fire="\QUI\Cron\EventHandler::onAdminLoad"/> + <event on="onAdminLoadFooter" fire="\QUI\Cron\EventHandler::adminLoadFooter"/> + <event on="onPackageSetup" fire="\QUI\Cron\EventHandler::onPackageSetup"/> </events> \ No newline at end of file diff --git a/locale.xml b/locale.xml index 98b78cfcb35b85a1df737d2acf40d0ae2dc09ee2..a479c7efb574af5ba8ee6623e62e881c3d24d00b 100644 --- a/locale.xml +++ b/locale.xml @@ -1,16 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> <locales> + <groups name="quiqqer/cron" datatype="php,js"> + <locale name="message.cron.admin.info.24h"> + <de><![CDATA[In den letzten 24 Stunden wurden keine geplanten Aufgaben ausgeführt. + Unter Umständen sind die geplanten Aufgaben fehlerhaft.]]></de> + <en><![CDATA[In the past 24 hours no cron was running. + It is possible that the Crons will not run properly.]]></en> + </locale> + </groups> <groups name="quiqqer/cron" datatype="php"> <locale name="message.cron.succesful.executed"> <de><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt]]></de> <en><![CDATA[The Cron ran successfully]]></en> </locale> - <locale name="message.cron.admin.info.24h"> - <de><![CDATA[In den letzten 24 Stunden wurde keine geplante Aufgabe ausgeführt. - Unter Umständen sind die geplanten Augaben fehlerhaft.]]></de> - <en><![CDATA[In the past 24 hours no cron was running. - It is possible that the Crons will not run properly.]]></en> - </locale> <locale name="message.cron.succesful.added"> <de><![CDATA[Aufgabe erfolgreich hinzugefügt]]></de> <en><![CDATA[Cron added successfully]]></en> @@ -29,8 +31,8 @@ </locale> <locale name="settings.title"> - <de><![CDATA[Cron Einstellungen]]></de> - <en><![CDATA[Cron settings]]></en> + <de><![CDATA[Cron / Wiederkehrende Aufgaben]]></de> + <en><![CDATA[Cron / Recurring tasks]]></en> </locale> <locale name="settings.cron.title"> <de><![CDATA[Allgemeine Einstellungen]]></de> @@ -58,6 +60,22 @@ <de><![CDATA[Der Administrator bekommt eine Nachricht wenn die Crons die letzten 24h nicht liefen.]]></de> <en><![CDATA[The administrator receives a message when the Cron did not run the last 24 hours]]></en> </locale> + <locale name="exception.registration.empty.domain"> + <de><![CDATA[Es muss eine Domain angegeben sein]]></de> + <en><![CDATA[Domain can not be empty]]></en> + </locale> + <locale name="exception.registration.empty.email"> + <de><![CDATA[Es muss eine Email angegeben sein.]]></de> + <en><![CDATA[An email must be given.]]></en> + </locale> + <locale name="exception.registration.empty.packageDir"> + <de><![CDATA[Konnte den "package" Pfad nicht auslesen!]]></de> + <en><![CDATA[Could not parse the "package" folder path.]]></en> + </locale> + <locale name="cron.window.cronservice.status.text.last_execution.never"> + <de><![CDATA[Nie]]></de> + <en><![CDATA[Never]]></en> + </locale> </groups> <groups name="quiqqer/cron" datatype="js"> <locale name="cron.id"> @@ -146,10 +164,111 @@ <de><![CDATA[Aufgabenverlauf]]></de> <en><![CDATA[Cron history]]></en> </locale> + <locale name="cron.panel.manager.btn.cronservice.register"> + <de><![CDATA[Cronservice]]></de> + <en><![CDATA[Cronservice]]></en> + </locale> + + <locale name="cron.window.cronservice.title"> + <de><![CDATA[Cronservice]]></de> + <en><![CDATA[Cronservice]]></en> + </locale> + <locale name="cron.window.cronservice.btn.cancel"> + <de><![CDATA[Abbrechen]]></de> + <en><![CDATA[Cancel]]></en> + </locale> + <locale name="cron.window.cronservice.btn.register"> + <de><![CDATA[Registrieren]]></de> + <en><![CDATA[Register]]></en> + </locale> + <locale name="cron.window.cronservice.content.title"> + <de><![CDATA[Cronservice]]></de> + <en><![CDATA[Cronservice]]></en> + </locale> + <locale name="cron.window.cronservice.content.about.title"> + <de><![CDATA[Was ist das?]]></de> + <en><![CDATA[About]]></en> + </locale> + <locale name="cron.window.cronservice.content.about.text"> + <de><![CDATA[Der QUIQQER Cronservice ermöglicht es Crons auf Systemen auszuführen, die nativ keine Crons ausführen können. +Realisiert wird dies durch einen Server, an dem sich QUIQQER-SYteme anmelden können, welcher wiederrum regelmäßig die Crons der angemeldeten Systeme anstoßt. +Dies kann vorallem auf Shared-Hostings von großem Nutzen sein.]]></de> + <en><![CDATA[The QUIQQER cronservice enables systems withou native cronfunctionality to execute the QUIQQER crons anyway. +This is works with an external server on which QUIQQER systems can register themselves. This server will start the scheduled crons of all registered QUIQQER systems regularely. +]]></en> + </locale> + <locale name="cron.window.cronservice.content.status.title"> + <de><![CDATA[Status]]></de> + <en><![CDATA[State]]></en> + </locale> + <locale name="cron.window.cronservice.content.status.text"> + <de><![CDATA[Hier können Sie den Status Ihrer Registrierung verfolgen :]]></de> + <en><![CDATA[You can check the state of your registration here :]]></en> + </locale> + <locale name="cron.window.cronservice.content.btn.register"> + <de><![CDATA[Registrieren]]></de> + <en><![CDATA[Register]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.title"> + <de><![CDATA[Registrieren]]></de> + <en><![CDATA[Register]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.placeholder.email"> + <de><![CDATA[Email]]></de> + <en><![CDATA[Email]]></en> + </locale> + <locale name="cron.window.cronservice.registration.title"> + <de><![CDATA[Registration]]></de> + <en><![CDATA[Registration]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.txt.email.title"> + <de><![CDATA[Email]]></de> + <en><![CDATA[Email]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.btn.register"> + <de><![CDATA[Registrieren]]></de> + <en><![CDATA[Register]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.btn.unregister"> + <de><![CDATA[Abmelden]]></de> + <en><![CDATA[Unregister]]></en> + </locale> + <locale name="cron.window.cronservice.status.text.inactive"> + <de><![CDATA[Inaktiv]]></de> + <en><![CDATA[Inactive]]></en> + </locale> + <locale name="cron.window.cronservice.status.text.registered"> + <de><![CDATA[Aktiv]]></de> + <en><![CDATA[Active]]></en> + </locale> + <locale name="cron.window.cronservice.status.text.unregistered"> + <de><![CDATA[Nicht registriert]]></de> + <en><![CDATA[Not registered]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.lbl.stats.status"> + <de><![CDATA[Status: ]]></de> + <en><![CDATA[Status: ]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.lbl.stats.errors"> + <de><![CDATA[Fehlerzahl: ]]></de> + <en><![CDATA[Errorcount: ]]></en> + </locale> + <locale name="cron.window.cronservice.content.register.lbl.stats.lastExecution"> + <de><![CDATA[Letzte Ausführung: ]]></de> + <en><![CDATA[Last execution: ]]></en> + </locale> + <locale name="cron.window.cronservice.content.btn.unregister.confirm"> + <de><![CDATA[Sind Sie sicher?]]></de> + <en><![CDATA[Are you sure?]]></en> + </locale> + <locale name="cron.window.cronservice.content.btn.unregister"> + <de><![CDATA[Registrierung entfernen]]></de> + <en><![CDATA[Unregister]]></en> + </locale> <locale name="permission.quiqqer.cron._header"> <de><![CDATA[Aufgaben / Tasks]]></de> - <en><![CDATA[Ttasks]]></en> + <en><![CDATA[Tasks]]></en> </locale> <locale name="permission.quiqqer.cron.execute"> <de><![CDATA[Darf Aufgaben / Tasks ausführen.]]></de> @@ -175,6 +294,5 @@ <de><![CDATA[Darf Aufgaben / Tasks deaktivieren.]]></de> <en><![CDATA[Can deactivate tasks.]]></en> </locale> - </groups> </locales> \ No newline at end of file diff --git a/menu.xml b/menu.xml index 99e711399fa40fa0c036228120175e4268525ddb..f317d42deb0c0be35ea431214f926bbe1b320371 100644 --- a/menu.xml +++ b/menu.xml @@ -2,7 +2,7 @@ <menu> <item parent="/extras/" name="crons" - icon="icon-time" + icon="fa fa-clock-o" > Crons </item> @@ -10,7 +10,7 @@ <item parent="/extras/crons/" name="manager" require="package/quiqqer/cron/bin/Manager" - icon="icon-time" + icon="fa fa-clock-o" > Cron-Manager </item> @@ -18,7 +18,7 @@ <item parent="/extras/crons/" name="history" require="package/quiqqer/cron/bin/History" - icon="icon-long-arrow-right" + icon="fa fa-long-arrow-right" > Cron-History </item> diff --git a/settings.xml b/settings.xml index 7a4c4999dcd511c22d1fd1be3fe8d307c9fd5095..c4dc553962bf46969b8f4a69417636657115b4aa 100644 --- a/settings.xml +++ b/settings.xml @@ -20,7 +20,7 @@ <locale group="quiqqer/cron" var="settings.title" /> </title> <params> - <icon>icon-time</icon> + <icon>fa fa-clock-o</icon> </params> <categories> @@ -28,7 +28,7 @@ <text> <locale group="quiqqer/cron" var="settings.title" /> </text> - <icon>icon-time</icon> + <icon>fa fa-clock-o</icon> <settings title="settings" name="settings"> <title> diff --git a/src/QUI/Cron/CronService.php b/src/QUI/Cron/CronService.php new file mode 100644 index 0000000000000000000000000000000000000000..1d3c0ae39fb7fe9764d2f192dba8e6d7a44ab84a --- /dev/null +++ b/src/QUI/Cron/CronService.php @@ -0,0 +1,260 @@ +<?php + +namespace QUI\Cron; + +use QUI; +use QUI\System\Log; + +class CronService +{ + + const CRONSERVICE_URL = "https://cron.quiqqer.com"; + + private $domain; + private $https; + private $packageDir; + + /** + * CronService constructor. + */ + public function __construct() + { + $host = QUI::$Conf->get("globals", "host"); + $cms_dir = QUI::$Conf->get("globals", "cms_dir"); + $opt_dir = QUI::$Conf->get("globals", "opt_dir"); + $url_dir = QUI::$Conf->get("globals", "url_dir"); + + // VHost Domain + $vhost = QUI::getProjectManager()->getStandard()->getVHost(true, true); + + // Check if https should be used. + if (substr($vhost, 0, 8) == 'https://') { + $this->https = true; + } + + $this->domain = str_replace("https://", "", $vhost); + + // Read the domain from the config file if no vhost could be detected. + if (empty($vhost)) { + // Parse Domain and protocol + if (strpos($host, "https://") !== false) { + $this->https = true; + $this->domain = str_replace("https://", "", $host); + } elseif (strpos($host, "http://") !== false) { + $this->https = false; + $this->domain = str_replace("http://", "", $host); + } else { + $this->https = false; + $this->domain = $host; + } + } + + + // Parse Package dir + $this->packageDir = $url_dir . str_replace($cms_dir, "", $opt_dir); + } + + /** + * Will register this quiqqer instance. + * + * @param $email - Email used for communication. Must be valid. + */ + public function register($email) + { + $this->sendRegistrationRequest($this->domain, $email, $this->packageDir, $this->https); + } + + /** + * Gets the status of the given domain. + * + * Returnformat : + * array( + * 'status' => 0, (0=unregistered; 1=active; 2=inactive) + * 'current_failures' => int, + * 'total_failures' => int, + * 'last_execution' => string (mysql dateformat | Localized 'never') + * ) + * + * @return mixed + */ + public function getStatus() + { + $status = $this->makeServerAjaxCall('package_pcsg_cronservice_ajax_getStatus', array( + 'domain' => $this->domain + )); + + if (empty($status['last_execution'])) { + $status['last_execution'] = QUI::getLocale()->get( + 'quiqqer/cron', + 'cron.window.cronservice.status.text.last_execution.never' + ); + } + + return $status; + } + + /** + * Revoked the registration for this quiqqer instance + */ + public function revokeRegistration() + { + $token = $this->readRevokeToken(); + + $this->makeServerAjaxCall('package_pcsg_cronservice_ajax_revokeRegistration', array( + 'domain' => $this->domain, + 'token' => $token + )); + } + + /** + * Sends an ajax request to the cronservice server. + * + * @param $domain - The domain to be registered. Example : example.org + * @param $email - The Email that should be used for communication. + * @param $packageDir - The package url dir + * @param $https - wether or not http secure should be used to call the cron.php + * @throws Exception + */ + private function sendRegistrationRequest($domain, $email, $packageDir, $https) + { + if (empty($domain)) { + throw new Exception(array("quiqqer/cron", "exception.registration.empty.domain")); + } + + if (empty($email)) { + throw new Exception(array("quiqqer/cron", "exception.registration.empty.email")); + } + + if (empty($packageDir)) { + throw new Exception(array("quiqqer/cron", "exception.registration.empty.packageDir")); + } + + + $url = self::CRONSERVICE_URL . "/admin/ajax.php?" . + "_rf=" . urlencode("[\"package_pcsg_cronservice_ajax_register\"]") . + "&package=" . urlencode("pcsg/cronservice") . + "&lang=" . QUI::getUserBySession()->getLang() . + "&domain=" . urlencode($domain) . + "&email=" . urlencode($email) . + "&packageDir=" . urlencode($packageDir) . + "&https=" . ($https ? "1" : "0") . + "&user=" . QUI::getUserBySession()->getName(); + + + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_URL => $url, + CURLOPT_USERAGENT => 'QUIQQER' + )); + + $response = curl_exec($curl); + $response = substr($response, 9, -10); + $data = json_decode($response, true); + if (json_last_error() != JSON_ERROR_NONE) { + Log::addDebug($response); + throw new Exception(json_last_error_msg()); + } + + if (!isset($data['package_pcsg_cronservice_ajax_register']['result'])) { + throw new Exception("Something went wrong!"); + } + + $data = $data['package_pcsg_cronservice_ajax_register']['result']; + if (!isset($data['status']) || $data['status'] != 1) { + Log::addDebug($response); + Log::writeRecursive($data); + if (isset($data['message'])) { + throw new Exception($data['message']); + } + + throw new Exception("Something went wrong!"); + } + + + $revokeCode = $data['revokeCode']; + $this->saveRevokeToken($revokeCode); + + curl_close($curl); + } + + /** + * Calls the given ajax function on the Cronservice server and returns its output + * @param $function - Ajax function name + * @param $params - Params to pass + * @return mixed + * @throws QUI\Exception + */ + private function makeServerAjaxCall($function, $params) + { + $url = self::CRONSERVICE_URL . "/admin/ajax.php?" . + "_rf=" . urlencode('["' . $function . '"]') . + "&package=" . urlencode("pcsg/cronservice") . + "&lang=" . QUI::getUserBySession()->getLang(); + + foreach ($params as $param => $value) { + $url .= '&' . $param . '=' . urlencode($value); + } + + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_URL => $url, + CURLOPT_USERAGENT => 'QUIQQER' + )); + + $response = curl_exec($curl); + + curl_close($curl); + + // Process raw ajax response + $response = substr($response, 9, -10); + $response = json_decode($response, true); + + + if (isset($response[$function]['Exception'])) { + throw new QUI\Exception($response[$function]['Exception']['message']); + } + + return $response[$function]['result']; + } + + /** + * Saves the revoke token into a file + * @param $token + */ + private function saveRevokeToken($token) + { + $varDir = QUI::getPackage('quiqqer/cron')->getVarDir() . '/cronservice'; + $fileName = $varDir . '/.revoketoken'; + + if (!is_dir($varDir)) { + mkdir($varDir, 0700, true); + } + + file_put_contents($fileName, $token); + } + + /** + * Reads the revoke token from the filesystem + * @return string + * @throws Exception + */ + private function readRevokeToken() + { + $varDir = QUI::getPackage('quiqqer/cron')->getVarDir() . '/cronservice'; + $fileName = $varDir . '/.revoketoken'; + + if (!file_exists($fileName)) { + throw new Exception("Tokenfile not present"); + } + + $token = file_get_contents($fileName); + + if ($token === false) { + throw new Exception("Could not read tokenfile."); + } + + return $token; + } +} diff --git a/src/QUI/Cron/EventHandler.php b/src/QUI/Cron/EventHandler.php index f61eed9c6145fbdf856143c1bcbb87c5f3d8e7a0..ef6f2fb8999cbff5f980f79883fe316bbea0814b 100644 --- a/src/QUI/Cron/EventHandler.php +++ b/src/QUI/Cron/EventHandler.php @@ -15,6 +15,35 @@ use QUI; */ class EventHandler { + /** + * event: onPackageSetup + * + * @param QUI\Package\Package $Package + */ + public static function onPackageSetup(QUI\Package\Package $Package) + { + if ($Package->getName() === 'quiqqer/cron') { + self::checkCronTable(); + } + } + + /** + * Checks if the table cron is correct + * + * @return void + */ + protected static function checkCronTable() + { + $categoryColumn = QUI::getDataBase()->table()->getColumn('cron', 'title'); + + if ($categoryColumn['Type'] === 'varchar(1000)') { + return; + } + + $Stmnt = QUI::getDataBase()->getPDO()->prepare("ALTER TABLE cron MODIFY `title` VARCHAR(1000)"); + $Stmnt->execute(); + } + /** * event : on admin header loaded */ @@ -45,7 +74,7 @@ class EventHandler // check last cron execution $CronManager = new Manager(); $result = $CronManager->getHistoryList(array( - 'page' => 1, + 'page' => 1, 'perPage' => 1 )); @@ -97,7 +126,7 @@ class EventHandler { QUI::getMessagesHandler()->sendAttention( QUI::getUserBySession(), - QUI::getLocale()->get('quiqqer/cron', 'message.cron.admin.info.24h') + QUI::getUserBySession()->getLocale()->get('quiqqer/cron', 'message.cron.admin.info.24h') ); } } diff --git a/src/QUI/Cron/Exception.php b/src/QUI/Cron/Exception.php new file mode 100644 index 0000000000000000000000000000000000000000..e185f57b189361eba8fe3d037ef9c16537cd40c8 --- /dev/null +++ b/src/QUI/Cron/Exception.php @@ -0,0 +1,10 @@ +<?php + +namespace QUI\Cron; + +use QUI; + +class Exception extends QUI\Exception +{ + +} diff --git a/src/QUI/Cron/Manager.php b/src/QUI/Cron/Manager.php index f247899b31c4d85c14e72ded7735339ad1b1ffdb..1bb9fb3166452f4764e4e093950b32e690051b24 100644 --- a/src/QUI/Cron/Manager.php +++ b/src/QUI/Cron/Manager.php @@ -7,7 +7,7 @@ namespace QUI\Cron; use QUI; -use QUI\Rights\Permission; +use QUI\Permissions\Permission; use Cron\CronExpression; /** @@ -51,7 +51,7 @@ class Manager $params = array(); } - QUI::getDataBase()->insert($this->Table(), array( + QUI::getDataBase()->insert($this->table(), array( 'active' => 1, 'exec' => $cronData['exec'], 'title' => $cronData['title'], @@ -111,12 +111,11 @@ class Manager CronExpression::factory( "$min $hour $day $month $dayOfWeek" ); - } catch (\Exception $Exception) { throw new QUI\Exception($Exception->getMessage()); } - QUI::getDataBase()->update($this->Table(), array( + QUI::getDataBase()->update($this->table(), array( 'exec' => $cronData['exec'], 'title' => $cronData['title'], 'min' => $min, @@ -147,7 +146,7 @@ class Manager Permission::checkPermission('quiqqer.cron.deactivate'); QUI::getDataBase()->update( - $this->Table(), + $this->table(), array('active' => 1), array('id' => (int)$cronId) ); @@ -163,7 +162,7 @@ class Manager Permission::checkPermission('quiqqer.cron.activate'); QUI::getDataBase()->update( - $this->Table(), + $this->table(), array('active' => 0), array('id' => (int)$cronId) ); @@ -188,7 +187,7 @@ class Manager return; } - $DataBase->delete($this->Table(), array( + $DataBase->delete($this->table(), array( 'id' => $id )); } @@ -237,7 +236,6 @@ class Manager // execute cron try { $this->executeCron($entry['id']); - } catch (\Exception $Exception) { $message = print_r($entry, true); $message .= "\n" . $Exception->getMessage(); @@ -299,7 +297,7 @@ class Manager QUI::getDataBase()->update( - self::Table(), + self::table(), array('lastexec' => date('Y-m-d H:i:s')), array('id' => $cronId) ); @@ -346,7 +344,7 @@ class Manager public function getCronById($cronId) { $result = QUI::getDataBase()->fetch(array( - 'from' => $this->Table(), + 'from' => $this->table(), 'where' => array( 'id' => (int)$cronId ), @@ -406,7 +404,7 @@ class Manager )); $dataOfCron = QUI::getDataBase()->fetch(array( - 'from' => $this->Table() + 'from' => $this->table() )); $Users = QUI::getUsers(); @@ -418,7 +416,6 @@ class Manager $crons[$cronData['id']] = $cronData; } - foreach ($data as $entry) { $entry['cronTitle'] = ''; $entry['username'] = ''; @@ -429,7 +426,6 @@ class Manager try { $entry['username'] = $Users->get($entry['uid'])->getName(); - } catch (QUI\Exception $Exception) { } @@ -462,10 +458,29 @@ class Manager public function getList() { return QUI::getDataBase()->fetch(array( - 'from' => self::Table() + 'from' => self::table() )); } + /** + * Checks if a specific cron is already set up + * + * @param string $cron - cron title + * @return bool + */ + public function isCronSetUp($cron) + { + $list = $this->getList(); + + foreach ($list as $entry) { + if ($entry['title'] == $cron) { + return true; + } + } + + return false; + } + /** * Exist the cron? * @@ -487,7 +502,7 @@ class Manager * * @return string */ - public static function TABLE() + public static function table() { return QUI_DB_PRFX . 'cron'; } @@ -515,7 +530,7 @@ class Manager return array(); } - $Dom = QUI\Utils\XML::getDomFromXml($file); + $Dom = QUI\Utils\Text\XML::getDomFromXml($file); $crons = $Dom->getElementsByTagName('crons'); if (!$crons || !$crons->length) { diff --git a/src/QUI/Cron/QuiqqerCrons.php b/src/QUI/Cron/QuiqqerCrons.php index 83737ea762bbf23f7090e99ed9d7f8198cb97931..bce951b44ec24662965b4b06d0bef23abc162b4f 100644 --- a/src/QUI/Cron/QuiqqerCrons.php +++ b/src/QUI/Cron/QuiqqerCrons.php @@ -48,6 +48,34 @@ class QuiqqerCrons QUI\Utils\System\File::unlink(VAR_DIR . 'cache/admin/media/'); } + /** + * delete all unwanted / unneeded sessions + */ + public static function clearSessions() + { + // clear nativ session storage + $sessionDir = VAR_DIR . 'sessions/'; + + if (!is_dir($sessionDir)) { + return; + } + + $sessionFiles = QUI\Utils\System\File::readDir($sessionDir); + $maxtime = 1400; + + if (QUI::conf('session', 'max_life_time')) { + $maxtime = (int)QUI::conf('session', 'max_life_time'); + } + + foreach ($sessionFiles as $sessionFile) { + $fmtime = filemtime($sessionDir . $sessionFile); + + if ($fmtime + $maxtime < time()) { + unlink($sessionDir . $sessionFile); + } + } + } + /** * Check project sites release dates * Activate or deactivate sites @@ -104,7 +132,6 @@ class QuiqqerCrons $Site->deactivate(); $deactivate[] = (int)$entry['id']; - } catch (QUI\Exception $Exception) { QUI\System\Log::writeException($Exception); } @@ -138,7 +165,6 @@ class QuiqqerCrons $Site->activate(); $activate[] = (int)$entry['id']; - } catch (QUI\Exception $Exception) { QUI\System\Log::writeException($Exception); }