root/dev/mods/ajcron/init.php @ 491

Revision 366, 7.1 KB (checked in by exi, 12 years ago)

Fixed apiuser to not enable xajax on all pages
Added a html tweak for opera on killsummarytables
Reworked ajcron::getNextRun(), it didnt work on values greater than 60 minutes
Now no xajax code is inserted when board is in IGB mode

Line 
1<?php
2
3// make sure we are only running if xajax is enabled
4event::register('mod_xajax_initialised', 'ajcron::run');
5
6class ajcron
7{
8    function run()
9    {
10        global $xajax;
11        if (isset($xajax))
12        {
13            if (get_class($xajax) == 'xajax')
14            {
15                // we're good to go, set up our asynchronous callback
16                $xajax->registerFunction(array('ajcron', 'ajcron', 'xajax_req'));
17
18                // fastest way to check wether we have to run or not
19                if (config::get('ajcron_nextrun') < time())
20                {
21                    // we need to run
22                    mod_xajax::xajax();
23                    $xajax->configure('waitCursor', false);
24                    event::register('page_assembleheader', 'ajcron::insertHTML');
25                }
26            }
27        }
28    }
29
30    function insertHTML($page)
31    {
32        $page->addBody('<script type="text/javascript" charset="UTF-8">
33            var myLocalCallback = xajax.callback.create(400, 1000);
34            myLocalCallback.onExpiration = function(req) { xajax.abortRequest(req); }
35            xajax.call(\'xajax_req\', {callback: myLocalCallback});</script>');
36    }
37
38    function getNextRunDisplay()
39    {
40        $nextrun = config::get('ajcron_nextrun');
41        if ($nextrun == 0)
42        {
43            return 'never';
44        }
45        else
46        {
47            return date('Y-m-d H:i:s', $nextrun);
48        }
49    }
50
51    function resetNextRunCheckbox()
52    {
53        if (config::get('ajcron_resetNextRun'))
54        {
55            config::set('ajcron_resetNextRun', 0);
56            config::set('ajcron_nextrun', time());
57        }
58        if (config::get('ajcron_resetRunning'))
59        {
60            config::set('ajcron_resetRunning', 0);
61            config::set('ajcron_running', array());
62        }
63    }
64
65    function getNextRun($intervall)
66    {
67        $time = time();
68
69        if (strstr($intervall, ':'))
70        {
71            $nextrun = strtotime($intervall);
72            if ($nextrun < $time)
73            {
74                $nextrun = strtotime('tomorrow '.$intervall);
75            }
76        }
77        elseif (strstr($intervall, '/'))
78        {
79            $int = substr($intervall, 1);
80
81            // seconds till interval has passed (counts from 0 to int)
82            $seconds_passed = $time % ($int*60);
83
84            // reverse, how many seconds are left til 0
85            $seconds_to_go = ($int*60) - $seconds_passed;
86
87            // just add to current time and we have the next intervall
88            $nextrun = $time + $seconds_to_go;
89        }
90        return $nextrun;
91    }
92
93    function parseJobs()
94    {
95        $jobs = array();
96        $arr = explode("\n", config::get('ajcron_jobs'));
97        $i = 0;
98        foreach ($arr as $job)
99        {
100            if (!trim($job))
101            {
102                continue;
103            }
104            $tmp = preg_split("/".chr(32)."/", trim($job), -1, PREG_SPLIT_NO_EMPTY);
105            $nextrun = ajcron::getNextRun($tmp[0]);
106            $jobs[$i++] = array('id' => md5(trim($job)), 'nextrun' => $nextrun, 'name' => $tmp[2],  'url' => $tmp[1]);
107        }
108
109        return $jobs;
110    }
111
112    function getRuntable()
113    {
114        $output = '';
115        // load up our crontasks
116        $jobs = ajcron::parseJobs();
117        $state = config::get('ajcron_running');
118
119        foreach ($jobs as $job)
120        {
121            if (isset($state[$job['id']]))
122            {
123                $running = 'running';
124            }
125            else
126            {
127                $running = 'not running';
128            }
129
130            if (empty($job['name']))
131            {
132                $name = '-None found-';
133            }
134            else
135            {
136                $name = $job['name'];
137            }
138            $output .= '<b>Name:</b> '.$name.' <b>URL:</b> '.$job['url'].' <b>Nextrun:</b> '.date('Y-m-d H:i:s', $job['nextrun']).'<br/>';
139            $output .= '&nbsp;&nbsp;&nbsp;<b>State:</b> '.$running.' <b>ID: </b>'.$job['id'].'<br/><br/>';
140        }
141
142        return $output;
143    }
144
145    function getNextRuntime()
146    {
147        // calculate and set new runtime
148        $jobs = ajcron::parseJobs();
149        $sorttable = array();
150        // see which one should be started now
151        foreach ($jobs as $job)
152        {
153            $sorttable[$job['id']] = $job['nextrun'];
154        }
155        asort($sorttable);
156        config::set('ajcron_nextrun', $sorttable[key($sorttable)]);
157    }
158
159    function xajax_req()
160    {
161        // if the xajax call gets aborted, ignore that
162        @ignore_user_abort(true);
163        @set_time_limit(0);
164
165        $state = config::get('ajcron_running');
166        if (!is_array($state))
167        {
168            $state = array();
169            config::set('ajcron_running', $state);
170        }
171
172        // check for blocking
173        if (config::get('ajcron_blocking'))
174        {
175            // if there is already something running, give up
176            if (count($state) >= 1)
177            {
178                return;
179            }
180        }
181
182        // load up our crontasks
183        $jobs = ajcron::parseJobs();
184
185        // if there are no jobs just quit
186        if (!count($jobs))
187        {
188            return;
189        }
190
191        // see which one should be started now
192        $sorttable = array();
193        foreach ($jobs as $job)
194        {
195            $sorttable[$job['id']] = $job['nextrun'];
196        }
197        asort($sorttable);
198
199        foreach ($sorttable as $id => $nextrun)
200        {
201            // this bypasses already running jobs
202            if (isset($state[$id]))
203            {
204                continue;
205            }
206            break;
207        }
208
209        if (!$id)
210        {
211            // no id found we could run as all are running
212            return;
213        }
214
215        // set current id to running
216        $state[$id] = 'running';
217        $currentJob = null;
218        config::set('ajcron_running', $state);
219        foreach ($jobs as $job)
220        {
221            if ($job['id'] == $id)
222            {
223                $currentJob = $job;
224            }
225        }
226
227        // run the job (finally)
228        include_once('common/includes/class.http.php');
229        $http = new http_request($currentJob['url']);
230        $http->set_timeout(120);
231        $data = $http->get_content();
232
233        // job done, clean up
234        // we need to refresh our variable to prevent overwriting of
235        // other running jobs
236        $db = new DBQuery(true);
237        $db->execute('select * from kb3_config where cfg_site=\''.KB_SITE.'\' and cfg_key=\'ajcron_running\'');
238        $row = $db->getRow();
239        $state = unserialize($row['cfg_value']);
240        unset($state[$id]);
241        config::set('ajcron_running', $state);
242
243        // calculate when next to insert ajax
244        ajcron::getNextRuntime();
245
246        // testfun!
247        $objResponse = new xajaxResponse();
248        #$objResponse->Assign("header", "innerHTML", nl2br(var_export($sorttable[key($sorttable)], true)));
249        #sleep(15);
250        return $objResponse;
251    }
252}
Note: See TracBrowser for help on using the browser.