You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cron.php 3.9KB

11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
11 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. /**
  3. * ownCloud
  4. *
  5. * @author Jakob Sack
  6. * @copyright 2012 Jakob Sack owncloud@jakobsack.de
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  10. * License as published by the Free Software Foundation; either
  11. * version 3 of the License, or any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public
  19. * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. // Unfortunately we need this class for shutdown function
  23. class TemporaryCronClass {
  24. public static $sent = false;
  25. public static $lockfile = "";
  26. public static $keeplock = false;
  27. }
  28. // We use this function to handle (unexpected) shutdowns
  29. function handleUnexpectedShutdown() {
  30. // Delete lockfile
  31. if (!TemporaryCronClass::$keeplock && file_exists(TemporaryCronClass::$lockfile)) {
  32. unlink(TemporaryCronClass::$lockfile);
  33. }
  34. // Say goodbye if the app did not shutdown properly
  35. if (!TemporaryCronClass::$sent) {
  36. if (OC::$CLI) {
  37. echo 'Unexpected error!' . PHP_EOL;
  38. } else {
  39. OC_JSON::error(array('data' => array('message' => 'Unexpected error!')));
  40. }
  41. }
  42. }
  43. try {
  44. require_once 'lib/base.php';
  45. if (\OCP\Util::needUpgrade()) {
  46. \OCP\Util::writeLog('cron', 'Update required, skipping cron', \OCP\Util::DEBUG);
  47. exit();
  48. }
  49. // load all apps to get all api routes properly setup
  50. OC_App::loadApps();
  51. \OC::$server->getSession()->close();
  52. // initialize a dummy memory session
  53. \OC::$server->setSession(new \OC\Session\Memory(''));
  54. $logger = \OC_Log::$object;
  55. // Don't do anything if ownCloud has not been installed
  56. if (!OC_Config::getValue('installed', false)) {
  57. exit(0);
  58. }
  59. // Handle unexpected errors
  60. register_shutdown_function('handleUnexpectedShutdown');
  61. \OC::$server->getTempManager()->cleanOld();
  62. // Exit if background jobs are disabled!
  63. $appmode = OC_BackgroundJob::getExecutionType();
  64. if ($appmode == 'none') {
  65. TemporaryCronClass::$sent = true;
  66. if (OC::$CLI) {
  67. echo 'Background Jobs are disabled!' . PHP_EOL;
  68. } else {
  69. OC_JSON::error(array('data' => array('message' => 'Background jobs disabled!')));
  70. }
  71. exit(1);
  72. }
  73. if (OC::$CLI) {
  74. // Create lock file first
  75. TemporaryCronClass::$lockfile = OC_Config::getValue("datadirectory", OC::$SERVERROOT . '/data') . '/cron.lock';
  76. // We call ownCloud from the CLI (aka cron)
  77. if ($appmode != 'cron') {
  78. // Use cron in future!
  79. OC_BackgroundJob::setExecutionType('cron');
  80. }
  81. // check if backgroundjobs is still running
  82. if (file_exists(TemporaryCronClass::$lockfile)) {
  83. TemporaryCronClass::$keeplock = true;
  84. TemporaryCronClass::$sent = true;
  85. echo "Another instance of cron.php is still running!" . PHP_EOL;
  86. exit(1);
  87. }
  88. // Create a lock file
  89. touch(TemporaryCronClass::$lockfile);
  90. // Work
  91. $jobList = \OC::$server->getJobList();
  92. $jobs = $jobList->getAll();
  93. foreach ($jobs as $job) {
  94. $job->execute($jobList, $logger);
  95. }
  96. } else {
  97. // We call cron.php from some website
  98. if ($appmode == 'cron') {
  99. // Cron is cron :-P
  100. OC_JSON::error(array('data' => array('message' => 'Backgroundjobs are using system cron!')));
  101. } else {
  102. // Work and success :-)
  103. $jobList = \OC::$server->getJobList();
  104. $job = $jobList->getNext();
  105. if ($job != null) {
  106. $job->execute($jobList, $logger);
  107. $jobList->setLastJob($job);
  108. }
  109. OC_JSON::success();
  110. }
  111. }
  112. // done!
  113. TemporaryCronClass::$sent = true;
  114. // Log the successful cron execution
  115. if (\OC::$server->getConfig()->getSystemValue('cron_log', true)) {
  116. \OC::$server->getAppConfig()->setValue('core', 'lastcron', time());
  117. }
  118. exit();
  119. } catch (Exception $ex) {
  120. \OCP\Util::writeLog('cron', $ex->getMessage(), \OCP\Util::FATAL);
  121. }