home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / Schedule / At.php
PHP Script  |  2001-01-09  |  8KB  |  280 lines

  1. <?php
  2. /* vim: set ts=4 sw=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Colin Viebrock <colin@easydns.com>                          |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: At.php,v 1.3 2001/01/09 21:12:34 cmv Exp $
  20. //
  21. // Interface to the UNIX "at" program
  22.  
  23. /**
  24. * Class to interface to the UNIX "at" program
  25. *
  26. * @author Colin Viebrock <colin@easydns.com>
  27. */
  28.  
  29. require_once 'PEAR.php';
  30.  
  31. class Schedule_At extends PEAR {
  32.  
  33.     var $AT_PROG    = '/usr/bin/at';
  34.  
  35.     var $error      = false;
  36.     var $runtime    = false;
  37.     var $job        = false;
  38.  
  39.     var $lastexec   = '';
  40.  
  41.  
  42.     /**
  43.     * Constructor: instantiates the class.
  44.     *
  45.     * @access public
  46.     *
  47.     */
  48.     function Schedule_At()
  49.     {
  50.     $this->PEAR();
  51.         $this->_reset();
  52.     }
  53.  
  54.  
  55.     /**
  56.     * Adds an at command
  57.     *    This makes an "at" job, where $cmd is the shell command to run
  58.     *    and $timespec describes when the function should run.  See the
  59.     *    at man page for a description of the spec.
  60.     *
  61.     *    $queue is an optional 1 character string [a-zA-Z] that can define
  62.     *    which queue to put the job in.
  63.     *
  64.     *    If $mail is set, then an email will be sent when the job runs,
  65.     *    even if the job doesn't output anything.  The mail gets sent to
  66.     *    the user running the script (probably the webserver, i.e.
  67.     *    nobody@localhost).
  68.     *
  69.     *    The add() method returns false on error (in which case, check
  70.     *    $at->error for the message), or the job number on success.
  71.     *    On succes, $at->runtime is also set with the timestamp corresponding
  72.     *    to when the job will run.
  73.     *
  74.     * @param $cmd        shell command
  75.     * @param $timespec   time when command should run, formatted accoring to the spec for at
  76.     * @param $queue      optional at queue specifier
  77.     * @param $mail       optional flag to specify whether to send email
  78.     *
  79.     * @access public
  80.     *
  81.     */
  82.     function add($cmd, $timespec, $queue = false, $mail = false )
  83.     {
  84.  
  85.         $this->_reset();
  86.  
  87.         if ($queue && !preg_match('/^[a-zA-Z]{1,1}$/', $queue) ) {
  88.             $this->error = new Schedule_At_Error('Invalid queue specification');
  89.             return $this->error;
  90.         }
  91.  
  92.         $cmd = escapeShellCmd($cmd);
  93.  
  94.         $exec = sprintf("echo \"%s\" | %s %s %s %s 2>&1",
  95.             addslashes($cmd),
  96.             $this->AT_PROG,
  97.             ($queue ? '-q '.$queue : ''),
  98.             ($mail ? '-m' : ''),
  99.             $timespec
  100.         );
  101.  
  102.         $result = $this->_doexec($exec);
  103.  
  104.         if (preg_match('/garbled time/i', $result) ) {
  105.             $this->error = new Schedule_At_Error('Garbled time');
  106.             return $this->error;
  107.         }
  108.  
  109.         if (preg_match('/job (\d+) at (.*)/i', $result, $m) ) {
  110.             $this->runtime = $this->_parsedate($m[2]);
  111.             $this->job = $m[1];
  112.             return $this->job;
  113.         } else {
  114.             $this->error = new Schedule_At_Error('Exec Error: '.$result);
  115.             return $this->error;
  116.         }
  117.  
  118.     }
  119.  
  120.  
  121.     /**
  122.     * Shows commands in the at queue
  123.     *
  124.     *    This returns an array listing all queued jobs.  The array's keys
  125.     *    are the job numbers, and each entry is itself an associative array
  126.     *    listing the runtime (timestamp) and queue (char).
  127.     *
  128.     *    You can optionally provide a queue character to only list the jobs
  129.     *    in that queue.
  130.     *
  131.     * @param $queue        optional queue specifier
  132.     *
  133.     * @access public
  134.     *
  135.     */
  136.     function show($queue = false)
  137.     {
  138.  
  139.         $this->_reset();
  140.  
  141.         if ($queue && !preg_match('/^[a-zA-Z]{1,1}$/', $queue) ) {
  142.             $this->error = new Schedule_At_Error('Invalid queue specification');
  143.             return $this->error;
  144.         }
  145.  
  146.         $exec = sprintf("%s -l %s",
  147.             $this->AT_PROG,
  148.             ($queue ? '-q '.$queue : '')
  149.         );
  150.  
  151.         $result = $this->_doexec($exec);
  152.         $lines = explode("\n", $result);
  153.  
  154.         $return = array();
  155.  
  156.         foreach($lines as $line) {
  157.             if (trim($line)) {
  158.                 list($job, $day, $time, $queue) = preg_split('/\s+/', trim($line) );
  159.                 $return[$job] = array(
  160.                     'runtime'    => $this->_parsedate($day.' '.$time),
  161.                     'queue'        => $queue
  162.                 );
  163.             }
  164.         }
  165.  
  166.         return $return;
  167.  
  168.     }
  169.  
  170.  
  171.     /**
  172.     * Remove job from the at queue
  173.     *
  174.     *    This removes jobs from the queue.  Returns false if the job doesn't
  175.     *    exist or on failure, or true on success.
  176.     *
  177.     * @param $job        job to remove
  178.     *
  179.     * @access public
  180.     *
  181.     */
  182.     function remove($job = false)
  183.     {
  184.         $this->_reset();
  185.  
  186.         if (!$job) {
  187.             $this->error = new Schedule_At_Error('No job specified');
  188.             return $this->error;
  189.         }
  190.  
  191.         $queue = $this->show();
  192.  
  193.         if (!isset($queue[$job]) ) {
  194.             $this->error = new Schedule_At_Error('Job ' . $job . ' does not exist');
  195.             return $this->error;
  196.         }
  197.  
  198.         $exec = sprintf("%s -d %s",
  199.             $this->AT_PROG,
  200.             $job
  201.         );
  202.  
  203.         $this->_doexec($exec);
  204.  
  205.         /* this is required since the shell command doesn't return anything on success */
  206.  
  207.         $queue = $this->show();
  208.         return !isset($queue[$job]);
  209.  
  210.     }
  211.  
  212.  
  213.     /**
  214.     * PRIVATE: Reset class
  215.     *
  216.     *
  217.     * @access private
  218.     *
  219.     */
  220.     function _reset()
  221.     {
  222.         $this->error      = false;
  223.         $this->runtime    = false;
  224.         $this->job        = false;
  225.         $this->lastexec   = '';
  226.     }
  227.  
  228.  
  229.     /**
  230.     * PRIVATE: Parse date string returned from shell command
  231.     *
  232.     * @param $str    date string to parse
  233.     *
  234.     * @access private
  235.     *
  236.     */
  237.     function _parsedate($str)
  238.     {
  239.         if (preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/i', $str, $m) ) {
  240.             return mktime($m[4], $m[5], 0, $m[2], $m[3], $m[1]);
  241.         } else {
  242.             return false;
  243.         }
  244.     }
  245.  
  246.  
  247.     /**
  248.     * PRIVATE: Run a shell command
  249.     *
  250.     * @param $cmd    command to run
  251.     *
  252.     * @access private
  253.     *
  254.     */
  255.     function _doexec($cmd)
  256.     {
  257.         $this->lastexec = $cmd;
  258.         return `$cmd`;
  259.     }
  260.  
  261. }
  262.  
  263.  
  264.  
  265. class Schedule_At_Error extends PEAR_Error
  266. {
  267.     var $classname             = 'Schedule_At_Error';
  268.     var $error_message_prepend = 'Error in Schedule_At';
  269.                                         
  270.     function Schedule_At_Error ($message, $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE)
  271.     {
  272.         $this->PEAR_Error ($message, $code, $mode, $level);
  273.     }
  274.  
  275. }        
  276.                 
  277.  
  278. ?>
  279.  
  280.