summaryrefslogtreecommitdiffstats
path: root/app/models/repository
Commit message (Expand)AuthorAgeFilesLines
* Merged r22746 from trunk to 5.0-stable (#40043).Marius Balteanu2024-02-276-6/+6
* Update copyright year to 2023 (#38141).Go MAEDA2023-01-016-6/+6
* Update copyright year in source files to 2022 (#36379).Go MAEDA2022-01-026-6/+6
* Update copyright year in source files to 2021 (#33069).Go MAEDA2021-03-256-6/+6
* fix source indent of app/models/repository/cvs.rbToshi MARUYAMA2020-11-261-18/+22
* add empty line after guard clause to app/models/repository/bazaar.rbToshi MARUYAMA2020-10-271-0/+1
* add empty line after guard clause to app/models/repository/mercurial.rbToshi MARUYAMA2020-09-171-0/+6
* remove spaces inside {} of app/models/repository/mercurial.rbToshi MARUYAMA2020-09-121-1/+1
* fix source indent of app/models/repository/git.rbToshi MARUYAMA2020-09-121-9/+10
* remove spaces inside {} of app/models/repository/git.rbToshi MARUYAMA2020-07-211-2/+2
* use a normal unless-statement over a modifier clause in a multiline statement...Toshi MARUYAMA2020-07-091-14/+16
* Update copyright year in source files to 2020 (#33069).Go MAEDA2020-03-036-6/+6
* cleanup: rubocop: fix Style/MultilineIfModifier in app/models/repository/subv...Toshi MARUYAMA2019-11-231-12/+15
* cleanup: rubocop: fix Layout/EmptyLineAfterGuardClause in app/models/reposito...Toshi MARUYAMA2019-11-231-0/+1
* cleanup: rubocop: fix Layout/SpaceAfterComma in app/models/repository/git.rbToshi MARUYAMA2019-11-231-1/+1
* cleanup: rubocop: fix Layout/EmptyLineAfterGuardClause in app/models/reposito...Toshi MARUYAMA2019-11-221-0/+4
* cleanup: rubocop: fix Layout/SpaceInsideParens in app/models/repository/mercu...Toshi MARUYAMA2019-11-081-1/+1
* cleanup: rubocop: fix Style/MethodCallWithoutArgsParentheses in app/models/re...Toshi MARUYAMA2019-11-081-3/+3
* cleanup: rubocop: fix Layout/AlignArguments in app/models/repository/cvs.rbToshi MARUYAMA2019-11-081-2/+3
* code cleanup: rubocop: fix Style/ParenthesesAroundCondition in app/models/rep...Toshi MARUYAMA2019-09-241-1/+1
* code cleanup: rubocop: fix Layout/SpaceInsideRangeLiteral in app/models/repos...Toshi MARUYAMA2019-09-241-1/+1
* code cleanup: rubocop: fix Style/CommentedKeyword in app/models/repository/cv...Toshi MARUYAMA2019-09-201-1/+1
* Update copyright year.Go MAEDA2019-05-256-6/+6
* Don't rescue Exception class (#31387).Go MAEDA2019-05-251-1/+1
* Use Regexp#match? to reduce allocations of MatchData object (#28940).Go MAEDA2019-03-271-1/+1
* Support frozen_string_literal in app/**/*.rb (#26561).Go MAEDA2019-03-176-8/+8
* Add "frozen_string_literal: false" for all files (#26561).Go MAEDA2019-03-156-0/+12
* Use find_by instead of where.first to remove unnecessary sorting (#26747).Go MAEDA2018-10-062-3/+3
* Drop Darcs support (#26391).Jean-Philippe Lang2017-07-251-114/+0
* Merged rails-5.1 branch (#23630).Jean-Philippe Lang2017-07-235-5/+0
* Update copyright.Jean-Philippe Lang2017-06-257-7/+7
* spelling fixes (#25495)Toshi MARUYAMA2017-04-021-2/+2
* Use exists? instead of count (#24839).Jean-Philippe Lang2017-01-161-1/+1
* Adds accessors for report_last_commit.Jean-Philippe Lang2016-10-041-5/+7
* Updates copyright for 2016.Jean-Philippe Lang2016-03-137-7/+7
* Don't validate the repository when updating/clearing extra info (#19400).Jean-Philippe Lang2015-03-201-2/+2
* Code cleanup.Jean-Philippe Lang2015-03-081-0/+6
* fix code indent at app/models/repository/cvs.rbToshi MARUYAMA2015-01-181-1/+1
* use "where" instead of find_by_ at Repository::Cvs classToshi MARUYAMA2015-01-181-3/+3
* revert r13901Toshi MARUYAMA2015-01-181-10/+3
* workaround unit cvs test failure on sqlite3Toshi MARUYAMA2015-01-181-3/+10
* Copyright update.Jean-Philippe Lang2015-01-117-7/+7
* Adds configuration settings to limit valid repository path (#1415).Jean-Philippe Lang2014-11-081-0/+8
* Merged rails-4.1 branch (#14534).Jean-Philippe Lang2014-10-224-5/+6
* fix typo of app/models/repository/mercurial.rbToshi MARUYAMA2014-05-031-1/+1
* fix typo of app/models/repository/cvs.rbToshi MARUYAMA2014-05-031-1/+1
* replace tabs to spaces at app/models/repository/cvs.rbToshi MARUYAMA2014-04-151-3/+3
* fix source indent of Repository::Cvs modelToshi MARUYAMA2014-02-131-1/+1
* scm: mercurial: insert long id to DB unless existing id in DB is not short id...Toshi MARUYAMA2014-02-021-2/+8
* scm: mercurial: switch short or long id of entry by existing value in DB (#14...Toshi MARUYAMA2014-02-021-2/+15
6/stable29 Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/cron.php
blob: fd7d2040f1b1fe3762aedba02eb4af8b6c12b5d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<?php
/**
 * @copyright Copyright (c) 2016, ownCloud, Inc.
 *
 * @author Artem Sidorenko <artem@posteo.de>
 * @author Christopher Schäpers <kondou@ts.unde.re>
 * @author Christoph Wurst <christoph@winzerhof-wurst.at>
 * @author Damjan Georgievski <gdamjan@gmail.com>
 * @author Daniel Kesselberg <mail@danielkesselberg.de>
 * @author Jakob Sack <mail@jakobsack.de>
 * @author Joas Schilling <coding@schilljs.com>
 * @author Jörn Friedrich Dreyer <jfd@butonic.de>
 * @author Ko- <k.stoffelen@cs.ru.nl>
 * @author Michael Kuhn <michael@ikkoku.de>
 * @author Morris Jobke <hey@morrisjobke.de>
 * @author Oliver Kohl D.Sc. <oliver@kohl.bz>
 * @author Robin Appelman <robin@icewind.nl>
 * @author Roeland Jago Douma <roeland@famdouma.nl>
 * @author Steffen Lindner <mail@steffen-lindner.de>
 * @author Thomas Müller <thomas.mueller@tmit.eu>
 * @author Vincent Petry <pvince81@owncloud.com>
 *
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program. If not, see <http://www.gnu.org/licenses/>
 *
 */

require_once __DIR__ . '/lib/versioncheck.php';

try {
	require_once __DIR__ . '/lib/base.php';

	if (\OCP\Util::needUpgrade()) {
		\OC::$server->getLogger()->debug('Update required, skipping cron', ['app' => 'cron']);
		exit;
	}
	if ((bool) \OC::$server->getSystemConfig()->getValue('maintenance', false)) {
		\OC::$server->getLogger()->debug('We are in maintenance mode, skipping cron', ['app' => 'cron']);
		exit;
	}

	// load all apps to get all api routes properly setup
	OC_App::loadApps();

	\OC::$server->getSession()->close();

	// initialize a dummy memory session
	$session = new \OC\Session\Memory('');
	$cryptoWrapper = \OC::$server->getSessionCryptoWrapper();
	$session = $cryptoWrapper->wrapSession($session);
	\OC::$server->setSession($session);

	$logger = \OC::$server->getLogger();
	$config = \OC::$server->getConfig();

	// Don't do anything if Nextcloud has not been installed
	if (!$config->getSystemValue('installed', false)) {
		exit(0);
	}

	\OC::$server->getTempManager()->cleanOld();

	// Exit if background jobs are disabled!
	$appMode = $config->getAppValue('core', 'backgroundjobs_mode', 'ajax');
	if ($appMode === 'none') {
		if (OC::$CLI) {
			echo 'Background Jobs are disabled!' . PHP_EOL;
		} else {
			OC_JSON::error(['data' => ['message' => 'Background jobs disabled!']]);
		}
		exit(1);
	}

	if (OC::$CLI) {
		// set to run indefinitely if needed
		if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
			@set_time_limit(0);
		}

		// the cron job must be executed with the right user
		if (!function_exists('posix_getuid')) {
			echo "The posix extensions are required - see http://php.net/manual/en/book.posix.php" . PHP_EOL;
			exit(1);
		}

		$user = posix_getpwuid(posix_getuid());
		$configUser = posix_getpwuid(fileowner(OC::$configDir . 'config.php'));
		if ($user['name'] !== $configUser['name']) {
			echo "Console has to be executed with the user that owns the file config/config.php" . PHP_EOL;
			echo "Current user: " . $user['name'] . PHP_EOL;
			echo "Owner of config.php: " . $configUser['name'] . PHP_EOL;
			exit(1);
		}

		// We call Nextcloud from the CLI (aka cron)
		if ($appMode !== 'cron') {
			$config->setAppValue('core', 'backgroundjobs_mode', 'cron');
		}

		// Work
		$jobList = \OC::$server->getJobList();

		// We only ask for jobs for 14 minutes, because after 5 minutes the next
		// system cron task should spawn and we want to have at most three
		// cron jobs running in parallel.
		$endTime = time() + 14 * 60;

		$executedJobs = [];
		while ($job = $jobList->getNext()) {
			if (isset($executedJobs[$job->getId()])) {
				$jobList->unlockJob($job);
				break;
			}

			$job->execute($jobList, $logger);
			// clean up after unclean jobs
			\OC_Util::tearDownFS();

			$jobList->setLastJob($job);
			$executedJobs[$job->getId()] = true;
			unset($job);

			if (time() > $endTime) {
				break;
			}
		}
	} else {
		// We call cron.php from some website
		if ($appMode === 'cron') {
			// Cron is cron :-P
			OC_JSON::error(['data' => ['message' => 'Backgroundjobs are using system cron!']]);
		} else {
			// Work and success :-)
			$jobList = \OC::$server->getJobList();
			$job = $jobList->getNext();
			if ($job != null) {
				$job->execute($jobList, $logger);
				$jobList->setLastJob($job);
			}
			OC_JSON::success();
		}
	}

	// Log the successful cron execution
	$config->setAppValue('core', 'lastcron', time());
	exit();
} catch (Exception $ex) {
	\OC::$server->getLogger()->logException($ex, ['app' => 'cron']);
} catch (Error $ex) {
	\OC::$server->getLogger()->logException($ex, ['app' => 'cron']);
}