New: Switch cron module to status stable. Thanks to everybody to test

this new module and debug it.
This commit is contained in:
Laurent Destailleur 2013-06-23 22:21:21 +02:00
parent 949565dde4
commit ec2e3db450
9 changed files with 216 additions and 136 deletions

View File

@ -19,14 +19,15 @@ For users:
- New: Add object_hour as substitution tag for opendocument generation.
- New: Add option MEMBER_PAYONLINE_SENDEMAIL to send email when paypal or paybox payment is done.
- New: Implement same rule for return value of all command line scripts (0 when success, <>0 if error).
- New: Clone product/service composition
- New: [ task #926 ] Add extrafield feature on order lines
- New: [ task #927 ] Add extrafield feature on Proposal lines
- New: [ task #928 ] Add extrafield feature on invoice lines
- New: Add option ADHERENT_LOGIN_NOT_REQUIRED
- New: Clone product/service composition.
- New: [ task #926 ] Add extrafield feature on order lines.
- New: [ task #927 ] Add extrafield feature on Proposal lines.
- New: [ task #928 ] Add extrafield feature on invoice lines.
- New: Add option ADHERENT_LOGIN_NOT_REQUIRED.
- New: Add a cron module.
For translators:
- Normalized sort order of all languages files with english ref file.
- Normalized sort order of all languages files with english reference files.
For developers:
- New: DolGraph can build graph with three lines.

View File

@ -22,6 +22,7 @@
* \ingroup cron
*/
/**
* Return array of tabs to used on pages to setup cron module.
*
@ -74,3 +75,53 @@ function cron_prepare_head($object)
return $head;
}
/**
* Show information with URLs to launch jobs
*
* @return int 0
*/
function dol_print_cron_urls()
{
global $conf, $langs, $user;
global $dolibarr_main_url_root;
// Define $urlwithroot
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
// Cron launch
print '<u>'.$langs->trans("URLToLaunchCronJobs").':</u><br>';
$url=$urlwithroot.'/public/cron/cron_run_jobs.php'.(empty($conf->global->CRON_KEY)?'':'?securitykey='.$conf->global->CRON_KEY.'&').'userlogin='.$user->login;
print img_picto('','object_globe.png').' <a href="'.$url.'" target="_blank">'.$url."</a><br>\n";
print ' '.$langs->trans("OrToLaunchASpecificJob").'<br>';
$url=$urlwithroot.'/public/cron/cron_run_jobs.php'.(empty($conf->global->CRON_KEY)?'':'?securitykey='.$conf->global->CRON_KEY.'&').'userlogin='.$user->login.'&id=cronjobid';
print img_picto('','object_globe.png').' <a href="'.$url.'" target="_blank">'.$url."</a><br>\n";
print '<br>';
print '<u>'.$langs->trans("FileToLaunchCronJobs").':</u><br>';
$file='/scripts/cron/cron_run_jobs.php'.' '.(empty($conf->global->CRON_KEY)?'securitykey':''.$conf->global->CRON_KEY.'').' '.$user->login.' [cronjobid]';
print '<textarea rows="'.ROWS_2.'" cols="120">..'.$file."</textarea><br>\n";
print '<br>';
// Add note
$linuxlike=1;
if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
print $langs->trans("Note").': ';
if ($linuxlike)
{
print $langs->trans("CronExplainHowToRunUnix");
}
else
{
print $langs->trans("CronExplainHowToRunWin");
}
return 0;
}

View File

@ -48,7 +48,7 @@ class modCron extends DolibarrModules
// Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module)
$this->name = preg_replace('/^mod/i','',get_class($this));
$this->description = "Enable the Dolibarr cron service";
$this->version = 'experimental'; // 'experimental' or 'dolibarr' or version
$this->version = 'dolibarr'; // 'experimental' or 'dolibarr' or version
// Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase)
$this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
// Where to store the module in setup page (0=common,1=interface,2=others,3=very specific)

View File

@ -107,39 +107,7 @@ dol_fiche_end();
print '<br><br>';
// Define $urlwithroot
$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
// Cron launch
print '<u>'.$langs->trans("URLToLaunchCronJobs").':</u><br>';
$url=$urlwithroot.'/public/cron/cron_run_jobs.php'.(empty($conf->global->CRON_KEY)?'':'?securitykey='.$conf->global->CRON_KEY.'&').'userlogin='.$user->login;
print img_picto('','object_globe.png').' <a href="'.$url.'" target="_blank">'.$url."</a><br>\n";
print ' '.$langs->trans("OrToLaunchASpecificJob").'<br>';
$url=$urlwithroot.'/public/cron/cron_run_jobs.php'.(empty($conf->global->CRON_KEY)?'':'?securitykey='.$conf->global->CRON_KEY.'&').'userlogin='.$user->login.'&id=cronjobid';
print img_picto('','object_globe.png').' <a href="'.$url.'" target="_blank">'.$url."</a><br>\n";
print '<br>';
$linuxlike=1;
if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
print '<br>';
print '<u>'.$langs->trans("FileToLaunchCronJobs").':</u><br>';
$file='/scripts/cron/cron_run_jobs.php'.' '.(empty($conf->global->CRON_KEY)?'securitykey':''.$conf->global->CRON_KEY.'').' '.$user->login.' [cronjobid]';
print '<textarea rows="'.ROWS_2.'" cols="120">..'.$file."</textarea><br>\n";
print '<br>';
print $langs->trans("Note").': ';
if ($linuxlike) {
print $langs->trans("CronExplainHowToRunUnix");
} else {
print $langs->trans("CronExplainHowToRunWin");
}
dol_print_cron_urls();
print '<br>';

View File

@ -1,6 +1,7 @@
<?php
/* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
* Copyright (C) 2013 Florian Henry <florian.henry@open-concpt.pro>
* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -43,55 +44,66 @@ $confirm=GETPOST('confirm','alpha');
$cancel=GETPOST('cancel');
$object = new Cronjob($db);
if (!empty($id)) {
if (!empty($id))
{
$result=$object->fetch($id);
if ($result < 0) {
if ($result < 0)
{
setEventMessage($object->error,'errors');
}
}
if(!empty($cancel)) {
if (!empty($id)) {
if(!empty($cancel))
{
if (!empty($id))
{
$action='';
}else {
Header("Location: ".dol_buildpath('/cron/cron/list.php',1).'?status=1');
}
else
{
Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=1');
exit;
}
}
// Delete jobs
if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->cron->delete){
if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->cron->delete)
{
$result = $object->delete($user);
if ($result < 0) {
if ($result < 0)
{
setEventMessage($object->error,'errors');
$action='edit';
}else {
Header("Location: ".dol_buildpath('/cron/cron/list.php',1).'?status=1');
}
else
{
Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=1');
exit;
}
}
// Execute jobs
if ($action == 'confirm_execute' && $confirm == "yes" && $user->rights->cron->execute){
if ($action == 'confirm_execute' && $confirm == "yes" && $user->rights->cron->execute)
{
$result=$object->run_jobs($user->login);
if ($result < 0) {
if ($result < 0)
{
setEventMessage($object->error,'errors');
$action='';
}else {
}
else
{
if ($object->lastresult > 0) setEventMessage($langs->trans("JobFinished"),'warnings');
else setEventMessage($langs->trans("JobFinished"),'mesgs');
$action='';
}
}
if ($action=='add') {
if ($action=='add')
{
$object->jobtype=GETPOST('jobtype','alpha');
$object->label=GETPOST('label','alpha');
$object->command=GETPOST('command','alpha');
@ -123,7 +135,8 @@ if ($action=='add') {
}
// Save parameters
if ($action=='update') {
if ($action=='update')
{
$object->id=$id;
$object->jobtype=GETPOST('jobtype');
$object->label=GETPOST('label');
@ -155,7 +168,8 @@ if ($action=='update') {
}
}
if ($action=='activate') {
if ($action=='activate')
{
$object->status=1;
//Ajout de la tache cron
@ -172,7 +186,8 @@ if ($action=='activate') {
}
}
if ($action=='inactive') {
if ($action=='inactive')
{
$object->status=0;
//Ajout de la tache cron
$result = $object->update($user);
@ -199,7 +214,7 @@ llxHeader('',$langs->trans("CronAdd"));
if ($action=='edit' || empty($action) || $action=='delete' || $action=='execute')
{
$head=cron_prepare_head($object);
dol_fiche_head($head, 'card', $langs->trans("CronTask"), 0, 'bill');
print dol_get_fiche_head($head, 'card', $langs->trans("CronTask"), 0, 'bill');
}
elseif ($action=='create')
{
@ -441,16 +456,12 @@ if (($action=="create") || ($action=="edit"))
print "</td>";
print "</tr>\n";
print '</table>';
print '<tr><td colspan="2" align="center">';
print "<input type=\"submit\" name=\"save\" class=\"button\" value=\"".$langs->trans("Save")."\">";
print "<input type=\"submit\" name=\"cancel\" class=\"button\" value=\"".$langs->trans("Cancel")."\">";
print "</td>";
print "<td>";
print "</td>";
print "</tr>\n";
print '</table>';
print '<div align="center"><br>';
print '<input type="submit" name="save" class="button" value="'.$langs->trans("Save").'">';
print '<input type="submit" name="cancel" class="button" value="'.$langs->trans("Cancel").'">';
print "</center>";
print "</form>\n";
@ -608,5 +619,8 @@ if (($action=="create") || ($action=="edit"))
print '<br><br></div>';
}
llxFooter();
$db->close();
llxFooter();
?>

View File

@ -25,8 +25,6 @@
require '../main.inc.php';
require_once(DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php");
// librairie jobs
require_once DOL_DOCUMENT_ROOT."/cron/class/cronjob.class.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/cron.lib.php';
@ -99,6 +97,8 @@ if ($action == 'confirm_execute' && $confirm == "yes" && $user->rights->cron->ex
setEventMessage($object->error,'errors');
}
header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-1'); // Make a call to avoid to run twice job when using back
exit;
}
@ -141,8 +141,8 @@ if ($result < 0) {
print "<br><br>";
if (count($object->lines)>0) {
if (count($object->lines)>0)
{
print '<table class="noborder">';
print '<tr class="liste_titre">';
$arg_url='&page='.$page.'&status='.$status.'&search_label='.$search_label;
@ -156,7 +156,7 @@ if (count($object->lines)>0) {
print_liste_field_titre($langs->trans("CronNbRun"),$_SERVEUR['PHP_SELF'],"t.nbrun","",$arg_url,'',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("CronLastResult"),$_SERVEUR['PHP_SELF'],"t.lastresult","",$arg_url,'',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("CronLastOutput"),$_SERVEUR['PHP_SELF'],"t.lastoutput","",$arg_url,'',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("Active"),$_SERVEUR['PHP_SELF'],"t.status","",$arg_url,'align="center"',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("Enabled"),$_SERVEUR['PHP_SELF'],"t.status","",$arg_url,'align="center"',$sortfield,$sortorder);
print '<td></td>';
print '</tr>';
@ -303,6 +303,10 @@ print '</div>';
print '<br>';
dol_print_cron_urls();
llxFooter();
$db->close();

View File

@ -21,12 +21,12 @@ Permission23104 = Execute Scheduled task
#
# Admin
#
CronSetup= Configuration Scheduled task management
CronSetup= Scheduled job management setup
URLToLaunchCronJobs=URL to launch cron jobs
OrToLaunchASpecificJob=Or to launch a specific job
KeyForCronAccess=Security key for URL to launch cron jobs
FileToLaunchCronJobs=Command to launch cron jobs
CronExplainHowToRunUnix=On Unix environement you should use crontab to run Command line each minutes
FileToLaunchCronJobs=Command line to launch cron jobs
CronExplainHowToRunUnix=On Unix environment you should use crontab to run Command line each minutes
CronExplainHowToRunWin=On Microsoft(tm) Windows environement you can use Scheduled task tools to run Command line each minutes
@ -48,15 +48,15 @@ CronListOfCronJobs=List of scheduled jobs
CronCommand=Command
CronList= Job list
CronDelete= Delete cron jobs
CronConfirmDelete= Are you sure to delete this cron jobs ?
CronExecute=Launch task
CronConfirmDelete= Are you sure you want to delete this cron job ?
CronExecute=Launch job
CronConfirmExecute= Are you sure to execute this job now
CronInfo= Jobs allow to execute task that have been planned
CronWaitingJobs=Wainting jobs
CronTask=Task
CronTask=Job
CronNone= None
CronDtStart=Start date
CronDtEnd=End fin
CronDtEnd=End date
CronDtNextLaunch=Next execution
CronDtLastLaunch=Last execution
CronFrequency=Frequancy
@ -65,12 +65,14 @@ CronMethod=Method
CronModule=Module
CronAction=Action
CronStatus=Status
CronStatusActive=Active
CronStatusInactive=Inactive
CronStatusActive=Enabled
CronStatusInactive=Disabled
CronNoJobs=No jobs registered
CronPriority=Priority
CronLabel=Description
CronNbRun=Nb. launch
CronEach=Every
JobFinished=Job launched and finished
#
#Page card
@ -84,12 +86,12 @@ CronSaveSucess=Save succesfully
CronNote=Comment
CronFieldMandatory=Fields %s is mandatory
CronErrEndDateStartDt=End date cannot be before start date
CronStatusActiveBtn=Active
CronStatusInactiveBtn=Inactive
CronTaskInactive=This task is inactive
CronStatusActiveBtn=Enable
CronStatusInactiveBtn=Disable
CronTaskInactive=This job is disabled
CronDtLastResult=Last result date
CronId=Id
CronClassFile=Classes (file name)
CronClassFile=Classes (filename.class.php)
CronModuleHelp=Name of Dolibarr module directory (also work with external Dolibarr module). <BR> For exemple to fetch method of Dolibarr Product object /htdocs/<u>product</u>/class/product.class.php, the value of module is <i>product</i>
CronClassFileHelp=The file name to load. <BR> For exemple to fetch method of Dolibarr Product object /htdocs/product/class/<u>product.class.php</u>, the value of class file name is <i>product.class.php</i>
CronObjectHelp=The object name to load. <BR> For exemple to fetch method of Dolibarr Product object /htdocs/product/class/product.class.php, the value of class file name is <i>Product</i>

View File

@ -1,7 +1,7 @@
# Dolibarr language file - en_US - cron
CHARSET=UTF-8
Module2310Name=Cron
Module2310Desc=Gestion des tâches programmées
Module2310Desc=Gestion des travaux programmées
#
# About page
@ -13,20 +13,20 @@ CronAboutPage = Page à propos de Cron
#
# Right
#
Permission23101 = Voir la tâche planifiée
Permission23102 = Créer/modifier la tâche planifiée
Permission23103 = Supprimer la tâche planifiée
Permission23104 = Lancer la tâche planifiée
Permission23101 = Voir les travaux planifiés
Permission23102 = Créer/modifier des travaux planifiés
Permission23103 = Supprimer un travail planifiée
Permission23104 = Lancer un travail planifié
#
# Admin
#
CronSetup= Page de configuration du module - Gestion des tâches planifiées
URLToLaunchCronJobs=URL pour lancer les travaux cron
OrToLaunchASpecificJob=Ou pour lancer un travail spécifique
KeyForCronAccess=Clé de sécurité pour l'URL de lancement des travaux cron
FileToLaunchCronJobs=Commande pour lancer les travaux cron
CronExplainHowToRunUnix=Sur un environnement Unix vous devez utiliser crontab pour exécuter une commande toute les minutes
CronSetup= Page de configuration du module - Gestion des travaux planifiées
URLToLaunchCronJobs=URL pour lancer les travaux planifiés actifs
OrToLaunchASpecificJob=Ou pour lancer un travail planifié spécifique
KeyForCronAccess=Clé de sécurité pour l'URL de lancement des travaux planifiés
FileToLaunchCronJobs=Commande pour lancer les travaux planifiés actifs
CronExplainHowToRunUnix=Sur un environnement Unix vous pouvez utiliser 'crontab' pour exécuter une commande toute les minutes
CronExplainHowToRunWin=Sur un environement Microsoft(tm) Windows vous pouvez utiliser le planificateur de tâche pour lancer une commande toute les minutes
@ -71,6 +71,8 @@ CronNoJobs=Aucun travail enregistré
CronPriority=Priorité
CronLabel=Description
CronNbRun=Nb. exec.
CronEach=Tous les
JobFinished=Tache lancée et terminée
#
#Page card

View File

@ -1,6 +1,7 @@
<?php
/* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
* Copyright (C) 2013 Florian Henry <forian.henry@open-cocnept.pro
* Copyright (C) 2013 Florian Henry <forian.henry@open-cocnept.pro>
* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -40,9 +41,20 @@ if (! $res) die("Include of master.inc.php fails");
// librarie jobs
dol_include_once("/cron/class/cronjob.class.php");
global $langs, $conf;
// Language Management
$langs->load("admin");
$langs->load("cron");
/*
* View
*/
// Check the key, avoid that a stranger starts cron
$key = $_GET['securitykey'];
if (empty($key)) {
@ -55,80 +67,101 @@ if($key != $conf->global->CRON_KEY)
exit;
}
// Check the key, avoid that a stranger starts cron
$userlogin = $_GET['userlogin'];
if (empty($userlogin)) {
$userlogin = GETPOST('userlogin');
if (empty($userlogin))
{
echo 'userlogin is require';
exit;
}
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
$user=new User($db);
$result=$user->fetch('',$userlogin);
if ($result<0) {
if ($result < 0)
{
echo "User Error:".$user->error;
dol_syslog("cron_run_jobs.php:: User Error:".$user->error, LOG_ERR);
dol_syslog("cron_run_jobs.php:: User Error:".$user->error, LOG_WARNING);
exit;
}else {
if (empty($user->id)) {
}
else
{
if (empty($user->id))
{
echo " User user login:".$userlogin." do not exists";
dol_syslog(" User user login:".$userlogin." do not exists", LOG_ERR);
dol_syslog(" User user login:".$userlogin." do not exists", LOG_WARNING);
exit;
}
}
$id = $_GET['id'];
// Language Management
$langs->load("admin");
$langs->load("cron@cron");
$id = GETPOST('id');
// create a jobs object
$object = new Cronjob($db);
$filter=array();
if (empty($id)) {
if (! empty($id))
{
if (! is_numeric($id))
{
echo "Error: Bad value for parameter job id";
dol_syslog("cron_run_jobs.php Bad value for parameter job id", LOG_WARNING);
exit;
}
$filter=array();
$filter['t.rowid']=$id;
}
$result = $object->fetch_all('DESC','t.rowid', 0, 0, 1, $filter);
if ($result<0) {
echo "Error:".$cronjob->error;
dol_syslog("cron_run_jobs.php:: fetch Error".$cronjob->error, LOG_ERR);
if ($result<0)
{
echo "Error: ".$cronjob->error;
dol_syslog("cron_run_jobs.php fetch Error".$cronjob->error, LOG_WARNING);
exit;
}
// current date
$now=dol_now();
$nbofjobs=count($object->lines);
$nbofjobslaunchedok=0;
$nbofjobslaunchedko=0;
if(is_array($object->lines) && (count($object->lines)>0)){
if (is_array($object->lines) && (count($object->lines)>0))
{
// Loop over job
foreach($object->lines as $line){
dol_syslog("cron_run_jobs.php:: fetch cronjobid:".$line->id, LOG_ERR);
foreach($object->lines as $line)
{
dol_syslog("cron_run_jobs.php fetch cronjobid: ".$line->id, LOG_WARNING);
//If date_next_jobs is less of current dat, execute the program, and store the execution time of the next execution in database
if ((($line->datenextrun <= $now) && $line->dateend < $now)
|| ((empty($line->datenextrun)) && (empty($line->dateend)))){
|| ((empty($line->datenextrun)) && (empty($line->dateend))))
{
dol_syslog("cron_run_jobs.php:: torun line->datenextrun:".dol_print_date($line->datenextrun,'dayhourtext')." line->dateend:".dol_print_date($line->dateend,'dayhourtext')." now:".dol_print_date($now,'dayhourtext'), LOG_ERR);
dol_syslog("cron_run_jobs.php:: torun line->datenextrun:".dol_print_date($line->datenextrun,'dayhourtext')." line->dateend:".dol_print_date($line->dateend,'dayhourtext')." now:".dol_print_date($now,'dayhourtext'));
$cronjob=new Cronjob($db);
$result=$cronjob->fetch($line->id);
if ($result<0) {
if ($result<0)
{
echo "Error:".$cronjob->error;
dol_syslog("cron_run_jobs.php:: fetch Error".$cronjob->error, LOG_ERR);
exit;
}
// execute methode
// Execut job
$result=$cronjob->run_jobs($userlogin);
if ($result<0) {
if ($result<0)
{
echo "Error:".$cronjob->error;
dol_syslog("cron_run_jobs.php:: run_jobs Error".$cronjob->error, LOG_ERR);
exit;
$nbofjobslaunchedko++;
}
else
{
$nbofjobslaunchedok++;
}
// we re-program the next execution and stores the last execution time for this job
// We re-program the next execution and stores the last execution time for this job
$result=$cronjob->reprogram_jobs($userlogin);
if ($result<0) {
if ($result<0)
{
echo "Error:".$cronjob->error;
dol_syslog("cron_run_jobs.php:: reprogram_jobs Error".$cronjob->error, LOG_ERR);
exit;
@ -136,7 +169,12 @@ if(is_array($object->lines) && (count($object->lines)>0)){
}
}
echo "OK";
} else {
echo "No Jobs to run";
echo "Result: ".($nbofjobs)." jobs - ".($nbofjobslaunchedok+$nbofjobslaunchedko)." launched = ".$nbofjobslaunchedok." OK + ".$nbofjobslaunchedko." KO";
}
else
{
echo "No active jobs found";
}
$db->close();
?>