summaryrefslogtreecommitdiffstats
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']);
}
cấu hình email có vẻ đúng.", "Email could not be sent. Check your mail server log" : "Email không thể gửi được. Kiểm tra nhật ký máy chủ email của bạn", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Một vấn đề xảy ra trong khi gửi email. Vui lòng sửa lại cài đặt của bạn. (Lỗi: %s)", "Users" : "Người dùng", "Invalid mail address" : "Địa chỉ email không hợp lệ", "Settings saved" : "Cấu hình đã được lưu", "Unable to change full name" : "Họ và tên không thể thay đổi ", "Unable to change email address" : "Không thể thay đổi địa chỉ email", "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Để xác minh tài khoản Twitter của bạn, hãy đăng tweet sau đây trên Twitter (vui lòng đảm bảo đăng nó mà không có bất kỳ ngắt dòng nào):", "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Để xác minh trang web của bạn, hãy lưu trữ nội dung sau trong web-root của bạn tại '.well-known/CloudIdVerificationCode.txt' (vui lòng đảm bảo rằng văn bản hoàn chỉnh nằm trong một dòng):", "%1$s changed your password on %2$s." : "%1$s đã thay đổi mật khẩu của bạn trên %2$s", "Your password on %s was changed." : "Mật khẩu của bạn trên %s đã được thay đổi.", "Your password on %s was reset by an administrator." : "Mật khẩu của bạn trên %s đã được quản trị viên đặt lại.", "Password for %1$s changed on %2$s" : "Mật khẩu cho %1$s đã thay đổi trên %2$s", "Password changed for %s" : "Mật khẩu đã thay đổi cho %s", "If you did not request this, please contact an administrator." : "Nếu bạn không yêu cầu điều này, xin vui lòng liên hệ với quản trị viên.", "Your email address on %s was changed." : "Địa chỉ email của bạn trên %s đã được thay đổi.", "Your email address on %s was changed by an administrator." : "Địa chỉ email của bạn trên %s đã được thay đổi bởi quản trị viên.", "Email address for %1$s changed on %2$s" : "Địa chỉ email cho %1$s đã được thay đổi trên %2$s", "Email address changed for %s" : "Địa chỉ email đã được thay đổi cho %s", "The new email address is %s" : "Địa chỉ email mới là %s", "Your %s account was created" : "Tài khoản %s của bạn đã được tạo", "Welcome aboard" : "Chào mừng bạn", "Welcome aboard %s" : "Chào mừng bạn %s", "Welcome to your %s account, you can add, protect, and share your data." : "Chào mừng bạn đến với tài khoản %s của bạn, bạn có thể thêm, bảo vệ và chia sẻ dữ liệu của mình.", "Your username is: %s" : "Tên người dùng của bạn là : %s", "Set your password" : "Đặt mật khẩu của bạn", "Go to %s" : "Đi tới %s", "Install Client" : "Cài đặt máy khách", "Logged in user must be a subadmin" : "Người dùng đã đăng nhập phải là một subadmin", "Settings" : "Cài đặt", "Personal" : "Cá nhân", "Additional settings" : "Cài đặt bổ sung", "Overview" : "Tổng quan", "Basic settings" : "Thiết lập cơ bản", "Sharing" : "Chia sẻ", "Calendar" : "Lịch", "Personal info" : "Thông tin cá nhân", "Email server" : "Máy chủ mail", "Security & setup warnings" : "Bảo mật và thiết lập cảnh báo", "Background jobs" : "Các công việc trong nền", "Create" : "Tạo mới", "Change" : "Chỉnh sửa", "Delete" : "Xóa", "Unlimited" : "Không giới hạn", "Verifying" : "Đang xác minh", "None" : "Không gì cả", "Enforce two-factor authentication" : "Thực thi xác thực hai yếu tố", "Limit to groups" : "Giới hạn nhóm", "Enforcement of two-factor authentication can be set for certain groups only." : "Việc thực thi xác thực hai yếu tố chỉ có thể được đặt cho một số nhóm nhất định.", "Enforced groups" : "Các nhóm thực thi", "Excluded groups" : "Các nhóm bị loại trừ", "When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Khi các nhóm được chọn / loại trừ, họ sử dụng logic sau để xác định xem người dùng có thực thi 2FA hay không: Nếu không có nhóm nào được chọn, 2FA được bật cho mọi người trừ các thành viên của các nhóm bị loại trừ. Nếu các nhóm được chọn, 2FA được bật cho tất cả các thành viên trong số này. Nếu người dùng ở cả hai nhóm được chọn và bị loại trừ, quyền được chọn sẽ được ưu tiên và 2FA được thi hành.", "Save changes" : "Lưu thay đổi", "All" : "Tất cả", "Limit app usage to groups" : "Giới hạn sử dụng ứng dụng cho các nhóm", "No results" : "Không có kết quả", "Update to {version}" : "Cập nhật tới {version}", "Remove" : "Xóa", "Disable" : "Tắt", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Ứng dụng này không có phiên bản Nextcloud tối thiểu được chỉ định. Đây sẽ là một lỗi trong tương lai.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Ứng dụng này không có phiên bản Nextcloud tối đa được chỉ định. Đây sẽ là một lỗi trong tương lai.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ứng dụng này không thể được cài đặt vì các điều kiện phụ thuộc sau không được đáp ứng:", "View in store" : "Xem tại cửa hàng", "Visit website" : "Truy cập trang web", "Report a bug" : "Báo cáo lỗi", "Admin documentation" : "Tài liệu quản trị", "Developer documentation" : "Tài liệu dành cho nhà phát triển", "This app is supported via your current Nextcloud subscription." : "Ứng dụng này được hỗ trợ thông qua thuê bao Nextcloud hiện tại của bạn.", "Supported" : "Đã hỗ trợ", "Featured" : "Tính năng được trang bị", "Update to {update}" : "Cập nhật tới {update}", "Results from other categories" : "Kết quả từ các danh mục khác", "No apps found for your version" : "Không tìm thấy ứng dụng nào cho phiên bản của bạn", "Disable all" : "Vô hiệu hóa tất cả", "Enable all" : "Kích hoạt tất cả", "Marked for remote wipe" : "Đánh dấu để xóa từ xa", "Device settings" : "Cài đặt thiết bị", "Allow filesystem access" : "Cho phép truy cập file hệ thống", "Rename" : "Đổi tên", "Revoke" : "Thu hồi", "Wipe device" : "Xóa thiết bị", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome cho Android", "This session" : "Phiên này", "Device" : "Thiết bị", "Last activity" : "Hoạt động cuối", "Devices & sessions" : "Thiết bị và phiên truy cập", "Web, desktop and mobile clients currently logged in to your account." : "Web, máy tính để bàn và máy khách di động hiện đang đăng nhập vào tài khoản của bạn.", "Do you really want to wipe your data from this device?" : "Bạn có thực sự muốn xóa dữ liệu của bạn khỏi thiết bị này?", "Confirm wipe" : "Xác nhận xóa", "Error while creating device token" : "Lỗi trong khi tạo mã thông báo thiết bị", "Error while updating device token scope" : "Lỗi trong khi cập nhật phạm vi mã thông báo thiết bị", "Error while updating device token name" : "Lỗi trong khi cập nhật tên mã thông báo thiết bị", "Error while deleting the token" : "Lỗi trong khi xóa mã thông báo", "Error while wiping the device with the token" : "Lỗi trong khi xóa thiết bị bằng mã thông báo", "App name" : "Tên ứng dụng", "Create new app password" : "Tạo ứng dụng mật khẩu mới", "Use the credentials below to configure your app or device." : "Sử dụng thông tin đăng nhập dưới đây để định cấu hình ứng dụng hoặc thiết bị của bạn.", "For security reasons this password will only be shown once." : "Vì lý do bảo mật, mật khẩu này sẽ chỉ được hiển thị một lần.", "Username" : "Tên đăng nhập", "Password" : "Mật khẩu", "Done" : "Hoàn thành", "Show QR code for mobile apps" : "Hiển thị mã QR cho ứng dụng di động", "Copied!" : "Đã sao chép!", "Copy" : "Sao chép", "Could not copy app password. Please copy it manually." : "Không thể sao chép ứng dụng mật khẩu. Vui lòng sao chép thủ công.", "Enable" : "Bật", "Server-side encryption" : "Mã hoá phía máy chủ", "Enable server-side encryption" : "Kích hoạt mã hoá phía máy chủ", "This is the final warning: Do you really want to enable encryption?" : "Cảnh báo lần cuối: Bạn có thực sự muốn kích hoạt tính năng mã hoá?", "Remove group" : "Xóa nhóm", "You are about to remove the group {group}. The users will NOT be deleted." : "Bạn sắp xóa nhóm {group}. Người dùng sẽ KHÔNG bị xóa.", "Please confirm the group removal " : "Vui lòng xác nhận xóa nhóm", "Current password" : "Mật khẩu cũ", "New password" : "Mật khẩu mới", "Change password" : "Đổi mật khẩu", "Cancel" : "Hủy", "Details" : "Thông tin", "Your email address" : "Email của bạn", "No email address set" : "Chưa thiết lập địa chỉ email", "Language" : "Ngôn ngữ", "Help translate" : "Hỗ trợ dịch thuật", "No language set" : "Không có ngôn ngữ", "Add" : "Thêm", "Default language" : "Ngôn ngữ mặc định", "Common languages" : "Ngôn ngữ thông dụng", "Password change is disabled because the master key is disabled" : "Thay đổi mật khẩu bị vô hiệu hóa vì khóa chính bị vô hiệu hóa", "New user" : "Người dùng mới", "Display name" : "Tên hiển thị", "Email" : "Email", "Quota" : "Hạn ngạch", "Avatar" : "Hình đại diện", "Group admin for" : "Quản trị viên nhóm", "User backend" : "Trang cài đặt người dùng", "Storage location" : "Khu vực lưu trữ", "Last login" : "Lần đăng nhập cuối", "You do not have permissions to see the details of this user" : "Bạn không có quyền xem chi tiết của người dùng này", "Set user as admin for" : "Đặt người dùng làm quản trị viên cho", "Select user quota" : "Chọn hạn ngạch người dùng", "{size} used" : "{size} đã sử dụng", "Delete user" : "Xóa người dùng", "Wipe all devices" : "Xóa sạch tất cả các thiết bị", "Disable user" : "Vô hiệu hóa người dùng", "Enable user" : "Kích hoạt người dùng", "Resend welcome email" : "Gửi lại email chào mừng", "Welcome mail sent!" : "Thư chào mừng đã được gửi!", "Edit" : "Chỉnh sửa", "Visibility" : "Hiển thị", "Show user backend" : "Hiển thị cài đặt người dùng", "Show storage path" : "Hiển thị đường dẫn lưu trữ", "Show last login" : "Hiển thị lần cuối đăng nhập", "Send email" : "Gửi email", "Default quota" : "Hạn ngạch mặc định", "Select default quota" : "Chọn hạn ngạch mặc định", "Your apps" : "Ứng dụng của bạn", "Changelog" : "Sổ cập nhập thay đổi", "Add group" : "Thêm nhóm", "Active users" : "Người dùng hoạt động", "Disabled users" : "Người dùng đã bị vô hiệu hóa", "Not saved" : "Chưa được lưu", "Sending…" : "Đang gửi...", "Email sent" : "Email đã được gửi", "Location" : "Vị trí", "Profile picture" : "Ảnh đại diện", "About" : "Giới thiệu", "Full name" : "Tên đầy đủ", "Phone number" : "Số điện thoại", "Twitter" : "Twitter", "Website" : "Website", "Active apps" : "Ứng dụng kích hoạt", "Disabled apps" : "Ứng dụng vô hiệu hóa", "Updates" : "Cập nhật", "App bundles" : "Gói ứng dụng", "Featured apps" : "Các ứng dụng đề xuất", "Hide" : "Ẩn", "Download and enable" : "Tải xuống và kích hoạt", "Enable untested app" : "Bật ứng dụng chưa được kiểm tra", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Ứng dụng này không được đánh dấu là tương thích với phiên bản Nextcloud của bạn. Nếu bạn tiếp tục, bạn vẫn có thể cài đặt ứng dụng. Lưu ý rằng ứng dụng có thể không hoạt động như mong đợi.", "Never" : "Không bao giờ", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Ứng dụng đã được kích hoạt nhưng cần được cập nhật. Bạn sẽ được chuyển hướng đến trang cập nhật sau 5 giây.", "Documentation" : "Tài liệu", "Forum" : "Diễn đàn", "Login" : "Đăng nhập", "Open documentation" : "Mở tài liệu", "Encryption" : "Mã hóa", "From address" : "Từ địa chỉ", "Server address" : "Địa chỉ máy chủ", "Port" : "Cổng", "Authentication" : "Xác thực", "Authentication required" : "Cần phải được xác thực", "Credentials" : "Giấy chứng nhận", "SMTP Password" : "Mật khẩu SMTP", "Save" : "Lưu", "All checks passed." : "Tất cả các kiểm tra đã thoả điều kiện", "Version" : "Phiên bản", "Allow apps to use the Share API" : "Cho phép các ứng dụng sử dụng chia sẻ API", "Enforce expiration date" : "Buộc có ngày hết hạn", "Allow public uploads" : "Cho phép upload công cộng", "Allow resharing" : "Cho phép chia sẻ lại", "Allow sharing with groups" : "Cho phép chia sẻ với các nhóm", "You created app password \"{token}\"" : "Bạn đã tạo ứng dụng mật khẩu \"{token}\"", "png or jpg, max. 20 MB" : "png hoặc jpg, tối đa 20 MB", "Will be autogenerated" : "Sẽ được tạo tự động", "Add a new user" : "Thêm người dùng mới", "No users in here" : "Không có người dùng nào tại đây", "Default quota:" : "Hạn ngạch mặc định:", "Show Languages" : "Hiển thị ngôn ngữ", "Authentication method" : "Phương thức xác thực" }, "nplurals=1; plural=0;");