Skip to content
Code-Schnipsel Gruppen Projekte
Commit 732d9b10 erstellt von Henning Leutz's avatar Henning Leutz :martial_arts_uniform:
Dateien durchsuchen

fix: conflict solved

Übergeordnete 9e953378 4a6796ce
No related branches found
No related tags found
Keine zugehörigen Merge Requests gefunden
<?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
<?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
......@@ -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>
......
......@@ -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>
......
<?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;
}
}
......@@ -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')
);
}
}
<?php
namespace QUI\Cron;
use QUI;
class Exception extends QUI\Exception
{
}
......@@ -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) {
......
......@@ -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);
}
......
0% oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren