phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] CVS: phpgwapi/inc class.asyncservice.inc.php, 1.2, 1


From: Ralf Becker <address@hidden>
Subject: [Phpgroupware-cvs] CVS: phpgwapi/inc class.asyncservice.inc.php, 1.2, 1.3 class.common.inc.php, 1.212, 1.213
Date: Mon, 21 Jul 2003 14:20:47 -0400

Update of /cvsroot/phpgroupware/phpgwapi/inc
In directory subversions:/tmp/cvs-serv13603/inc

Modified Files:
        class.asyncservice.inc.php class.common.inc.php 
Log Message:
- added update from version 0.9.14.004-6 (security-fixes) and 0.9.14.508 
(asyncservice)
- merged asyncservices from .16

Index: class.asyncservice.inc.php
===================================================================
RCS file: /cvsroot/phpgroupware/phpgwapi/inc/class.asyncservice.inc.php,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** class.asyncservice.inc.php  27 Apr 2003 23:19:24 -0000      1.2
--- class.asyncservice.inc.php  21 Jul 2003 18:20:45 -0000      1.3
***************
*** 8,26 ****
        * http://www.phpgroupware.org/                                          
   *
        * 
------------------------------------------------------------------------ *
!       * This library is free software; you can redistribute it and/or modify 
it  *
!       * under the terms of the GNU Lesser General Public License as published 
by *
!       * the Free Software Foundation; either version 2.1 of the License,      
   *
!       * or any later version.                                                 
   *
!       * This library is distributed in the hope that it will be useful, but   
   *
!       * WITHOUT ANY WARRANTY; without even the implied warranty of            
   *
!       * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  
   *
!       * See the GNU Lesser General Public License for more details.           
   *
!       * You should have received a copy of the GNU Lesser General Public 
License *
!       * along with this library; if not, write to the Free Software 
Foundation,  *
!       * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA         
   *
        
\**************************************************************************/
  
        /* $Id$ */
  
        class asyncservice
        {
--- 8,26 ----
        * http://www.phpgroupware.org/                                          
   *
        * 
------------------------------------------------------------------------ *
!       *  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 
the   *
!       *  Free Software Foundation; either version 2 of the License, or (at 
your  *
!       *  option) any later version.                                           
   *
        
\**************************************************************************/
  
        /* $Id$ */
  
+       /*!
+       @class asyncservice
+       @author Ralf Becker
+       @copyright GPL - GNU General Public License
+       @abstract The class implements a general phpGW service to execute 
callbacks at a given time.
+       @discussion see http://www.phpgroupware.org/wiki/TimedAsyncServices
+       */
        class asyncservice
        {
***************
*** 32,36 ****
                        'install'   => True,
                        'installed' => True,
!                       'test'      => True
                );
                var $php = '';
--- 32,36 ----
                        'install'   => True,
                        'installed' => True,
!                       'last_check_run' => True
                );
                var $php = '';
***************
*** 38,64 ****
                var $db;
                var $db_table = 'phpgw_async';
                
                function asyncservice()
                {
                        $this->db = $GLOBALS['phpgw']->db;
                }
  
                /*!
                @function set_timer
!               @abstract calculates the next run of the timer and puts that 
with the rest of the data in the db
!               @syntax set_timer($times,$id,$method,$data)
!               @param $times unix timestamp or 
array('min','hour','dow','day','month','year') with execution time. \
!                       Repeated events are possible to shedule by setting the 
array only partly, eg. \
!                       array('day' => 1) for first day in each month 0am or 
array('min' => '* /5', 'hour' => '9-17') \
                        for every 5mins in the time from 9am to 5pm.
!               @param $id unique id to cancel the request later, if necessary. 
Should be in a form like \
                        eg. '<app><id>X' where id is the internal id of app and 
X might indicate the action.
!               @param $method Method to be called via 
ExecMethod($method,$data). $method has the form \
                        '<app>.<class>.<public function>'.
!               @param $data This data is passed back when the method is 
called. It might simply be an \
                        integer id, but it can also be a complete array.
!               @Returns False if $id already exists, else True 
                */
!               function set_timer($times,$id,$method,$data)
                {
                        if (empty($id) || empty($method) || $this->read($id) || 
--- 38,74 ----
                var $db;
                var $db_table = 'phpgw_async';
+               var $debug = 0;
                
+               /*!
+               @function asyncservice
+               @abstract constructor of the class
+               */
                function asyncservice()
                {
                        $this->db = $GLOBALS['phpgw']->db;
+                               
+                       $this->cronline = PHPGW_SERVER_ROOT . 
'/phpgwapi/cron/asyncservices.php '.$GLOBALS['phpgw_info']['user']['domain'];
+                       
+                       $this->only_fallback = substr(php_uname(), 0, 7) == 
"Windows";  // atm cron-jobs dont work on win
                }
  
                /*!
                @function set_timer
!               @abstract calculates the next run of the timer and puts that 
with the rest of the data in the db for later execution.
!               @syntax set_timer($times,$id,$method,$data,$account_id=False)
!               @param $times unix timestamp or 
array('min','hour','dow','day','month','year') with execution time. 
!                       Repeated events are possible to shedule by setting the 
array only partly, eg. 
!                       array('day' => 1) for first day in each month 0am or 
array('min' => '* /5', 'hour' => '9-17') 
                        for every 5mins in the time from 9am to 5pm.
!               @param $id unique id to cancel the request later, if necessary. 
Should be in a form like 
                        eg. '<app><id>X' where id is the internal id of app and 
X might indicate the action.
!               @param $method Method to be called via 
ExecMethod($method,$data). $method has the form 
                        '<app>.<class>.<public function>'.
!               @param $data This data is passed back when the method is 
called. It might simply be an 
                        integer id, but it can also be a complete array.
!               @param $account_id account_id, under which the methode should 
be called or False for the actual user
!               @result False if $id already exists, else True  
                */
!               function set_timer($times,$id,$method,$data,$account_id=False)
                {
                        if (empty($id) || empty($method) || $this->read($id) || 
***************
*** 67,70 ****
--- 77,84 ----
                                return False;
                        }
+                       if ($account_id === False)
+                       {
+                               $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                       }
                        $job = array(
                                'id'     => $id,
***************
*** 72,76 ****
                                'times'  => $times,
                                'method' => $method,
!                               'data'   => $data
                        );
                        $this->write($job);
--- 86,91 ----
                                'times'  => $times,
                                'method' => $method,
!                               'data'   => $data,
!                               'account_id' => $account_id
                        );
                        $this->write($job);
***************
*** 81,95 ****
                /*!
                @function next_run
!               @abstract calculates the next execution time for $time
!               @syntax next_run($time)
!               @param $times unix timestamp or 
array('year'=>$year,'month'=>$month,'dow'=>$dow,'day'=>$day,'hour'=>$hour,'min'=>$min)
 \
!                       with execution time. Repeated execution is possible to 
shedule by setting the array only partly, \
!                       eg. array('day' => 1) for first day in each month 0am 
or array('min' => '/5', 'hour' => '9-17') \
!                       for every 5mins in the time from 9am to 5pm. All not 
set units before the smallest one set, \
                        are taken into account as every possible value, all 
after as the smallest possible value. 
!               @returns a unix timestamp of the next execution time or False 
if no more executions
                */
                function next_run($times,$debug=False)
                {
                        $now = time();
                        
--- 96,116 ----
                /*!
                @function next_run
!               @abstract calculates the next execution time for $times
!               @syntax next_run($times)
!               @param $times unix timestamp or 
array('year'=>$year,'month'=>$month,'dow'=>$dow,'day'=>$day,'hour'=>$hour,'min'=>$min)
!                       with execution time. Repeated execution is possible to 
shedule by setting the array only partly, 
!                       eg. array('day' => 1) for first day in each month 0am 
or array('min' => '/5', 'hour' => '9-17') 
!                       for every 5mins in the time from 9am to 5pm. All not 
set units before the smallest one set, 
                        are taken into account as every possible value, all 
after as the smallest possible value. 
!               @param $debug if True some debug-messages about syntax-errors 
in $times are echoed
!               @result a unix timestamp of the next execution time or False if 
no more executions
                */
                function next_run($times,$debug=False)
                {
+                       if ($this->debug)
+                       {
+                               echo "<p>next_run("; print_r($times); 
",'$debug')</p>\n";
+                               $debug = True;  // enable syntax-error messages 
too
+                       }
                        $now = time();
                        
***************
*** 155,159 ****
                        {
                                ++$n;
!                               //echo "<p>$u: isset(times[$u]="; 
print_r($times[$u]); echo ")=".(isset($times[$u])?'True':'False')."</p>\n";
                                if (isset($times[$u]))
                                {
--- 176,180 ----
                        {
                                ++$n;
!                               if ($this->debug) { echo "<p>n=$n, $u: 
isset(times[$u]="; print_r($times[$u]); echo 
")=".(isset($times[$u])?'True':'False')."</p>\n"; }
                                if (isset($times[$u]))
                                {
***************
*** 181,184 ****
--- 202,207 ----
                                                else
                                                {
+                                                       if ($t == '*') $t = 
'*/1';
+ 
                                                        list($one,$inc) = $arr 
= explode('/',$t);
                                                        
***************
*** 215,219 ****
                                        }
                                }
!                               elseif ($n < $last_set)         // => empty 
gets enumerated
                                {
                                        for ($i = $min_unit[$u]; $i <= 
$max_unit[$u]; ++$i)
--- 238,242 ----
                                        }
                                }
!                               elseif ($n < $last_set || $u == 'dow')  // 
before last value set (or dow) => empty gets enumerated
                                {
                                        for ($i = $min_unit[$u]; $i <= 
$max_unit[$u]; ++$i)
***************
*** 222,231 ****
                                        }
                                }
!                               else                                            
// => empty is min-value
                                {
                                        $times[$u][$min_unit[$u]] = True;
                                }
                        }
!                       //echo "enumerated times=<pre>"; print_r($times); echo 
"</pre>\n";
                        
                        // now we have the times enumerated, lets find the 
first not expired one
--- 245,254 ----
                                        }
                                }
!                               else    // => after last value set => empty is 
min-value
                                {
                                        $times[$u][$min_unit[$u]] = True;
                                }
                        }
!                       if ($this->debug) { echo "enumerated times=<pre>"; 
print_r($times); echo "</pre>\n"; }
                        
                        // now we have the times enumerated, lets find the 
first not expired one
***************
*** 234,241 ****
                        while (!isset($found['min']))
                        {
-                               $found = array();
                                $future = False;
  
-                               $n = 0;
                                foreach($units as $u => $date_pattern)
                                {
--- 257,262 ----
***************
*** 243,246 ****
--- 264,273 ----
                                                
intval(date($date_pattern,mktime(12,0,0,$found['month'],$found['day'],$found['year'])));
  
+                                       if (isset($found[$u]))
+                                       {
+                                               $future = $future || $found[$u] 
> $unit_now;
+                                               if ($this->debug) echo "--> 
already have a $u = ".$found[$u].", future='$future'<br>\n";
+                                               continue;       // already set
+                                       }
                                        foreach($times[$u] as $unit_value => 
$nul)
                                        {
***************
*** 268,286 ****
                                        {
                                                $next = array_keys($units);
!                                               
!                                               if (!isset($next[$n-1]))
                                                {
!                                                       //echo "<p>Nothing 
found, exiting !!!</p>\n";
                                                        return False;           
                                        
                                                }
!                                               $next = $next[$n-1];
                                                $over = $found[$next];
!                                               //echo "<p>Have to try the next 
$next, $u's are over for $next=$over !!!</p>\n";
                                                break;
                                        }
-                                       $n++;
                                }
                        }
!                       //echo "<p>next="; print_r($found); echo "</p>\n";
                        return 
mktime($found['hour'],$found['min'],0,$found['month'],$found['day'],$found['year']);
                }
--- 295,313 ----
                                        {
                                                $next = array_keys($units);
!                                               if 
(!isset($next[count($found)-1]))
                                                {
!                                                       if ($this->debug) echo 
"<p>Nothing found, exiting !!!</p>\n";
                                                        return False;           
                                        
                                                }
!                                               $next = $next[count($found)-1];
                                                $over = $found[$next];
!                                               unset($found[$next]);
!                                               if ($this->debug) echo "<p>Have 
to try the next $next, $u's are over for $next=$over !!!</p>\n";
                                                break;
                                        }
                                }
                        }
!                       if ($this->debug) { echo "<p>next="; print_r($found); 
echo "</p>\n"; }
! 
                        return 
mktime($found['hour'],$found['min'],0,$found['month'],$found['day'],$found['year']);
                }
***************
*** 291,295 ****
                @syntax cancel_timer($id)
                @param $id has to be the one used to set it.
!               @returns True if the timer exists and is not expired.
                */
                function cancel_timer($id)
--- 318,322 ----
                @syntax cancel_timer($id)
                @param $id has to be the one used to set it.
!               @result True if the timer exists and is not expired.
                */
                function cancel_timer($id)
***************
*** 299,325 ****
  
                /*!
                @function check_run
                @abstract checks if there are any jobs ready to run (timer 
expired) and executes them
                */
!               function check_run()
                {
!                       if (!($jobs = $this->read()))
                        {
!                               return False;
                        }
!                       foreach($jobs as $id => $job)
                        {
!                               ExecMethod($job['method'],$job['data']);
!                               
!                               if ($job['next'] = 
$this->next_run($job['times']))
!                               {
!                                       $this->write($job,True);
!                               }
!                               else    // no further runs
                                {
!                                       $this->delete($job['id']);
                                }
                        }
!                       return count($jobs);
                }
  
--- 326,452 ----
  
                /*!
+               @function last_check_run
+               @abstract checks when the last check_run was run or set the 
run-semaphore if $semaphore == True 
+               @param $semaphore if False only check, if true try to 
set/release the semaphore
+               @param $release if $semaphore == True, tells if we should set 
or release the semaphore
+               @result if !$set array('start' => $start,'end' => $end) with 
timestamps of last check_run start and end,  \
+                       !$end means check_run is just running. If $set returns 
True if it was able to get the semaphore, else False
+               */
+               function 
last_check_run($semaphore=False,$release=False,$run_by='')
+               {
+                       //echo 
"<p>last_check_run(semaphore=".($semaphore?'True':'False').",release=".($release?'True':'False').")</p>\n";
+                       if ($semaphore)
+                       {
+                               $this->db->lock($this->db_table,'write');       
// this will block til we get exclusive access to the table
+ 
+                               set_time_limit(0);              // dont stop 
for an execution-time-limit
+                               ignore_user_abort(True);
+                       }
+                       if ($exists = $this->read('##last-check-run##'))
+                       {
+                               list(,$last_run) = each($exists);
+                       }
+                       //echo "last_run (from db)=<pre>"; print_r($last_run); 
echo "</pre>\n";
+ 
+                       if (!$semaphore)
+                       {
+                               return $last_run['data'];
+                       }
+                       elseif (!$release && !$last_run['data']['end'] && 
$last_run['data']['start'] > time()-600)
+                       {
+                               // already one instance running (started not 
more then 10min ago, else we ignore it)
+ 
+                               $this->db->unlock();    // unlock the table 
again
+ 
+                               //echo "<p>An other instance is running 
!!!</p>\n";
+                               return False;
+                       }
+                       // no other instance runs ==> we should run
+                       //
+                       if ($release)
+                       {
+                               $last_run['data']['end'] = time();
+                       }
+                       else
+                       {
+                               $last_run = array(
+                                       'id'     => '##last-check-run##',
+                                       'next'   => 0,
+                                       'times'  => array(),
+                                       'method' => 'none',
+                                       'data'   => array(
+                                               'run_by'=> $run_by,
+                                               'start' => time(),
+                                               'end'   => 0
+                                       )
+                               );
+                       }
+                       //echo "last_run=<pre>"; print_r($last_run); echo 
"</pre>\n";
+                       $this->write($last_run,!!$exits);
+                       
+                       $this->db->unlock();
+ 
+                       return True;
+               }
+ 
+               /*!
                @function check_run
                @abstract checks if there are any jobs ready to run (timer 
expired) and executes them
                */
!               function check_run($run_by='')
                {
!                       flush();
!                       
!                       if (!$this->last_check_run(True,False,$run_by))
                        {
!                               return False;   // cant obtain semaphore
                        }
!                       if ($jobs = $this->read())
                        {
!                               foreach($jobs as $id => $job)
                                {
!                                       // checking / setting up phpgw_info/user
!                                       //
!                                       if 
($GLOBALS['phpgw_info']['user']['account_id'] != $job['account_id'])
!                                       {
!                                               $domain = 
$GLOBALS['phpgw_info']['user']['domain'];
!                                               $lang   = 
$GLOBALS['phpgw_info']['user']['preferences']['common']['lang'];
!                                               
unset($GLOBALS['phpgw_info']['user']);
! 
!                                               if 
($GLOBALS['phpgw']->session->account_id = $job['account_id'])
!                                               {
!                                                       
$GLOBALS['phpgw']->session->account_lid = 
$GLOBALS['phpgw']->accounts->id2name($job['account_id']);
!                                                       
$GLOBALS['phpgw']->session->account_domain = $domain;
!                                                       
$GLOBALS['phpgw']->session->read_repositories(False,False);
!                                                       
$GLOBALS['phpgw_info']['user']  = $GLOBALS['phpgw']->session->user;
!                                                       
!                                                       if ($lang != 
$GLOBALS['phpgw_info']['user']['preferences']['common']['lang'])
!                                                       {
!                                                               
unset($GLOBALS['lang']);
!                                                       }
!                                               }
!                                               else
!                                               {
!                                                       
$GLOBALS['phpgw_info']['user']['domain'] = $domain;
!                                               }
!                                       }
!                                       list($app) = 
explode('.',$job['method']);
!                                       
$GLOBALS['phpgw']->translation->add_app($app);
! 
!                                       ExecMethod($job['method'],$job['data']);
! 
!                                       if ($job['next'] = 
$this->next_run($job['times']))
!                                       {
!                                               $this->write($job,True);
!                                       }
!                                       else    // no further runs
!                                       {
!                                               $this->delete($job['id']);
!                                       }
                                }
                        }
!                       $this->last_check_run(True,True,$run_by);       // 
release semaphore
! 
!                       return $jobs ? count($jobs) : False;
                }
  
***************
*** 330,334 ****
                @param $id =0 reads all expired rows / jobs ready to run\
                        != 0 reads all rows/jobs matching $id (sql-wildcards 
'%' and '_' can be used)
!               @returns db-rows / jobs as array or False if no matches
                */
                function read($id=0)
--- 457,461 ----
                @param $id =0 reads all expired rows / jobs ready to run\
                        != 0 reads all rows/jobs matching $id (sql-wildcards 
'%' and '_' can be used)
!               @result db-rows / jobs as array or False if no matches
                */
                function read($id=0)
***************
*** 337,345 ****
                        if (strpos($id,'%') !== False || strpos($id,'_') !== 
False)
                        {
!                               $where = "id LIKE '$id'";
                        }
                        elseif (!$id)
                        {
!                               $where = 'next<='.time();
                        }
                        else
--- 464,472 ----
                        if (strpos($id,'%') !== False || strpos($id,'_') !== 
False)
                        {
!                               $where = "id LIKE '$id' AND 
id!='##last-check-run##'";
                        }
                        elseif (!$id)
                        {
!                               $where = 'next<='.time()." AND 
id!='##last-check-run##'";
                        }
                        else
***************
*** 359,364 ****
                                        'times'  => 
unserialize($this->db->f('times')),
                                        'method' => $this->db->f('method'),
!                                       'data'   => 
unserialize($this->db->f('data'))
                                );
                        }
                        if (!count($jobs))
--- 486,493 ----
                                        'times'  => 
unserialize($this->db->f('times')),
                                        'method' => $this->db->f('method'),
!                                       'data'   => 
unserialize($this->db->f('data')),
!                                       'account_id'   => 
$this->db->f('account_id')
                                );
+                               //echo "job id='$id'<pre>"; 
print_r($jobs[$id]); echo "</pre>\n";
                        }
                        if (!count($jobs))
***************
*** 380,393 ****
                        $job['times'] = 
$this->db->db_addslashes(serialize($job['times']));
                        $job['data']  = 
$this->db->db_addslashes(serialize($job['data']));
  
                        if ($exists || $this->read($job['id']))
                        {
                                $this->db->query("UPDATE $this->db_table SET 
next=$job[next],times='$job[times]',".
!                                       
"method='$job[method]',data='$job[data]' WHERE 
id='$job[id]'",__FILE__,__LINE__);
                        }
                        else
                        {
!                               $this->db->query("INSERT INTO $this->db_table 
(id,next,times,method,data) VALUES ".
!                                       
"('$job[id]',$job[next],'$job[times]','$job[method]','$job[data]')",__FILE__,__LINE__);
                        }
                }
--- 509,524 ----
                        $job['times'] = 
$this->db->db_addslashes(serialize($job['times']));
                        $job['data']  = 
$this->db->db_addslashes(serialize($job['data']));
+                       $job['next']  = intval($job['next']);
+                       $job['account_id']  = intval($job['account_id']);
  
                        if ($exists || $this->read($job['id']))
                        {
                                $this->db->query("UPDATE $this->db_table SET 
next=$job[next],times='$job[times]',".
!                                       
"method='$job[method]',data='$job[data]',account_id=$job[account_id] WHERE 
id='$job[id]'",__LINE__,__FILE__);
                        }
                        else
                        {
!                               $this->db->query("INSERT INTO $this->db_table 
(id,next,times,method,data,account_id) VALUES ".
!                                       
"('$job[id]',$job[next],'$job[times]','$job[method]','$job[data]',$job[account_id])",__LINE__,__FILE__);
                        }
                }
***************
*** 396,400 ****
                @function delete
                @abstract delete db-row / job with $id
!               @returns False if $id not found else True
                */
                function delete($id)
--- 527,531 ----
                @function delete
                @abstract delete db-row / job with $id
!               @result False if $id not found else True
                */
                function delete($id)
***************
*** 420,424 ****
                        else
                        {
!                               $binarys = array('php' => 
'/usr/bin/php','crontab' => '/usr/bin/crontab');
                                foreach ($binarys as $name => $path)
                                {
--- 551,559 ----
                        else
                        {
!                               $binarys = array(
!                                       'php'  => '/usr/bin/php',
!                                       'php4' => '/usr/bin/php4',              
// this is for debian
!                                       'crontab' => '/usr/bin/crontab'
!                               );
                                foreach ($binarys as $name => $path)
                                {
***************
*** 436,441 ****
--- 571,584 ----
                                                }
                                        }
+                                       if (!is_executable($this->$name))
+                                       {
+                                               $this->$name = $name;   // 
hopefully its in the path
+                                       }
                                        //echo "<p>$name = 
'".$this->$name."'</p>\n";
                                }
+                               if ($this->php4[0] == '/')      // we found a 
php4 binary
+                               {
+                                       $this->php = $this->php4;
+                               }
                        }
                
***************
*** 446,477 ****
                @abstract checks if phpgwapi/cron/asyncservices.php is 
installed as cron-job
                @syntax installed()
!               @returns the times asyncservices are run (normaly 'min'=>'* 
/5') or False if not installed
!               @note Not implemented for Windows at the moment, always returns 
False
                */
                function installed()
                {
!                       if (substr(php_uname(), 0, 7) == "Windows") {
!                               False;
                        }
                        $this->find_binarys();
! 
                        $times = False;
                        if (($crontab = popen('/bin/sh -c "'.$this->crontab.' 
-l" 2>&1','r')) !== False)
                        {
                                while ($line = fgets($crontab,256))
                                {
!                                       if ($line[0] != '#' && 
strstr($line,'asyncservices.php'))
                                        {
-                                               $time = explode(' ',$line);
                                                $cron_units = 
array('min','hour','day','month','dow');
                                                foreach($cron_units as $n => $u)
                                                {
!                                                       if ($time[$n] != '*')
!                                                       {
!                                                               $times[$u] = 
$time[$n];
!                                                       }
                                                }
                                                $times['cronline'] = $line;
!                                               break;
                                        }
                                }
--- 589,636 ----
                @abstract checks if phpgwapi/cron/asyncservices.php is 
installed as cron-job
                @syntax installed()
!               @result the times asyncservices are run (normaly 'min'=>'* /5') 
or False if not installed or 0 if crontab not found
!               @note Not implemented for Windows at the moment, always returns 0
                */
                function installed()
                {
!                       if ($this->only_fallback) {
!                               return 0;
                        }
                        $this->find_binarys();
!                       
!                       if (!is_executable($this->crontab))
!                       {
!                               //echo "<p>Error: $this->crontab not found 
!!!</p>";
!                               return 0;
!                       }
                        $times = False;
+                       $this->other_cronlines = array();
                        if (($crontab = popen('/bin/sh -c "'.$this->crontab.' 
-l" 2>&1','r')) !== False)
                        {
                                while ($line = fgets($crontab,256))
                                {
!                                       if ($this->debug) echo 'line '.++$n.": 
$line<br>\n";
!                                       $parts = split(' ',$line,6);
! 
!                                       if ($line[0] == '#' || count($parts) < 
6 || ($parts[5][0] != '/' && substr($parts[5],0,3) != 'php')) 
!                                       {
!                                               // ignore comments
!                                               if ($line[0] != '#')
!                                               {
!                                                       $times['error'] .= 
$line;
!                                               }
!                                       } 
!                                       elseif (strstr($line,$this->cronline) 
!== False)
                                        {
                                                $cron_units = 
array('min','hour','day','month','dow');
                                                foreach($cron_units as $n => $u)
                                                {
!                                                       $times[$u] = $parts[$n];
                                                }
                                                $times['cronline'] = $line;
!                                       }
!                                       else
!                                       {
!                                               $this->other_cronlines[] = 
$line;
                                        }
                                }
***************
*** 486,498 ****
                @syntax install($times)
                @param $times array with keys 'min','hour','day','month','dow', 
not set is equal to '*'
!               @returns the times asyncservices are run or False if they are 
not installed
!               @note Not implemented for Windows at the moment, always dies 
with an error-message
                */
                function install($times)
                {
!                       if (substr(php_uname(), 0, 7) == "Windows") {
!                               die ("Sorry, no automatic on Windows at the 
moment !!!\n");
                        }
!                       $this->find_binarys();
  
                        if (($crontab = popen('/bin/sh -c "'.$this->crontab.' 
-" 2>&1','w')) !== False)
--- 645,657 ----
                @syntax install($times)
                @param $times array with keys 'min','hour','day','month','dow', 
not set is equal to '*'
!               @result the times asyncservices are run or False if they are 
not installed or 0 if crontab not found
!               @note Not implemented for Windows at the moment, always returns 0
                */
                function install($times)
                {
!                       if ($this->only_fallback) {
!                               return 0;
                        }
!                       $this->installed();     // find other installed 
cronlines
  
                        if (($crontab = popen('/bin/sh -c "'.$this->crontab.' 
-" 2>&1','w')) !== False)
***************
*** 503,622 ****
                                        $cronline .= (isset($times[$cu]) ? 
$times[$cu] : '*') . ' ';
                                }
!                               $cronline .= $this->php.' -q 
'.PHPGW_SERVER_ROOT . '/phpgwapi/cron/asyncservices.php'."\n";
                                //echo "<p>Installing: '$cronline'</p>\n";
                                fwrite($crontab,$cronline);
                                @pclose($crontab);
                        }
-                       else
-                       {
-                               //echo "<p>Error: /usr/bin/crontab not found 
!!!</p>";
-                               return False;
-                       }
                        return $this->installed();
                }
-               
-               function test($data)
-               {
-                       echo "asyncservice::test: data =\n";
- 
-                       print_r($data);
-               }
-       }
- 
- if (!isset($GLOBALS['phpgw_info']))
- {     
-       $GLOBALS['phpgw_info']['flags'] = array(
-               'currentapp' => 'login'
-       );
-       include('../../header.inc.php');
- 
-       $async = new asyncservice;
-       $units = array(
-               'year'  => 'Year',
-               'month' => 'Month',
-               'day'   => 'Day',
-               'dow'   => 'Day of week',
-               'hour'  => 'Hour',
-               'min'   => 'Minute'
-       );
-       
-       if ($_POST['send'] || $_POST['test'] || $_POST['cancel'] || 
$_POST['install'])
-       {
-               $times = array();
-               foreach($units as $u => $ulabel)
-               {
-                       if (!empty($_POST[$u]))
-                       {
-                               $times[$u] = $_POST[$u];
-                       }
-               }
-               $next = $async->next_run($times,True);
-               
-               echo "<p>async::next_run(";print_r($times);echo")=".($next === 
False ? 'False':"'$next'=".date('D(w) d.m.Y H:i',$next))."</p>\n";
-               
-               if ($_POST['test'])
-               {
-                       if 
(!$async->set_timer($times,'test','phpgwapi.asyncservice.test','Hello 
World!!!'))
-                       {
-                               echo "<p>Error setting timer, maybe there's one 
already running !!!</p>\n";
-                       }
-               }
-               if ($_POST['cancel'])
-               {
-                       if (!$async->cancel_timer('test'))
-                       {
-                               echo "<p>Error canceling timer, maybe there's 
none set !!!</p>\n";
-                       }
-               }
-               if ($_POST['install'])
-               {
-                       if ($install = $async->install($times))
-                       {
-                               echo "<p>Installing: 
'$install[cronline]'</p>\n";
-                       }
-                       else
-                       {
-                               echo "<p>Error: $async->crontab not found or 
other error !!!</p>";
-                       }
-               }
-       }
-       echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">'."\n";
-       foreach ($units as $u => $ulabel)
-       {
-               echo "$ulabel: <input name=\"$u\" value=\"$times[$u]\" size=5> 
&nbsp;\n";
-       }
-       echo "<input type=\"submit\" name=\"send\" value=\"Calculate next 
run\">\n";
-       echo "<input type=\"submit\" name=\"test\" value=\"Start TestJob!\">\n";
-       echo "<input type=\"submit\" name=\"cancel\" value=\"Cancel 
TestJob!\">\n";
-       echo "<p><b>crontab:</b> \n";
- 
-       if ($installed = $async->installed())
-       {
-               echo "$installed[cronline]</p>";
-       }
-       else
-       {
-               echo "$async->crontab not found or asyncservices not installed 
!!!</p>";
-       }
-       echo "<input type=\"submit\" name=\"install\" value=\"Install 
crontab\">\n";
-       
-       echo "<p><b>jobs:</b></p>\n";
-       if ($jobs = $async->read('%'))
-       {
-               echo "<table border=1>\n<tr>\n<th>Id</th><th>Next 
run</th><th>Times</th><th>Method</th><th>Data</th></tr>\n";
-               foreach($jobs as $job)
-               {
-                       echo "<tr>\n<td>$job[id]</td><td>".date('Y/m/d 
H:i',$job['next'])."</td><td>";
-                       print_r($job['times']); 
-                       echo "</td><td>$job[method]</td><td>"; 
-                       print_r($job['data']); 
-                       echo "</td></tr>\n"; 
-               }
-               echo "</table>\n";
-       }
-       else
-       {
-               echo "<p>No jobs in the database !!!</p>\n";
        }
-       echo "</form>\n";
- }
--- 662,676 ----
                                        $cronline .= (isset($times[$cu]) ? 
$times[$cu] : '*') . ' ';
                                }
!                               $cronline .= $this->php.' -q 
'.$this->cronline."\n";
                                //echo "<p>Installing: '$cronline'</p>\n";
                                fwrite($crontab,$cronline);
+                               
+                               foreach ($this->other_cronlines as $cronline)
+                               {
+                                       fwrite($crontab,$cronline);             
// preserv the other lines
+                               }
                                @pclose($crontab);
                        }
                        return $this->installed();
                }
        }

Index: class.common.inc.php
===================================================================
RCS file: /cvsroot/phpgroupware/phpgwapi/inc/class.common.inc.php,v
retrieving revision 1.212
retrieving revision 1.213
diff -C2 -r1.212 -r1.213
*** class.common.inc.php        21 May 2003 22:58:43 -0000      1.212
--- class.common.inc.php        21 Jul 2003 18:20:45 -0000      1.213
***************
*** 1662,1665 ****
--- 1662,1671 ----
                                        $GLOBALS['phpgw']->xslttpl->pp();
                                }
+                               // call the asyncservice check_run function if 
it is not explicitly set to cron-only
+                               //
+                               if 
(!$GLOBALS['phpgw_info']['server']['asyncservice'])  // is default
+                               {
+                                       
ExecMethod('phpgwapi.asyncservice.check_run','fallback');
+                               }
                                $GLOBALS['phpgw']->db->disconnect();
  





reply via email to

[Prev in Thread] Current Thread [Next in Thread]