Last active
March 27, 2024 10:10
-
-
Save dnikonov/9a364bd13d39ae71f7b3da708f35c166 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
global $_SERVER; | |
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/.."); | |
// cron | |
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php demo"; | |
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php clear"; | |
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php"; | |
// exit; | |
// почта для уведомлений | |
define("EMAIL", "[email protected]"); | |
// как получить токен указано в статье - https://habr.com/ru/articles/749156/ | |
define("TOKEN", ""); | |
// домен | |
define("DOMEN", idn_to_utf8(basename($_SERVER["DOCUMENT_ROOT"]))); | |
// путь к папке с бэкапом на сервере | |
define("PATH", $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup"); | |
// путь на Ядиске | |
define("PATH_YA", "/backup/".DOMEN); | |
// имя папки на Ядиске | |
define("DIR", DOMEN."_".date("Ymd")); | |
// маска имен файлов в битриксе - он обрезает домен до 20 символов и убирает кириллические домены | |
define("FILES_BITRIX", (mb_strlen(preg_replace("/[^a-z]/iu", "", DOMEN)) ? mb_substr(DOMEN, 0, 20)."_" : "").date("Ymd")); | |
// количество хранимых бэкапов | |
define("COUNT", 10); | |
// обращение к апи | |
function getUrl($url, $options=[]) { | |
$ch = curl_init($url); | |
if (in_array("PUT", $options)) { | |
curl_setopt($ch, CURLOPT_PUT, true); | |
} | |
if (in_array("UPLOAD", $options)) { | |
curl_setopt($ch, CURLOPT_UPLOAD, true); | |
} | |
if (in_array("DELETE", $options)) { | |
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); | |
} | |
if (array_key_exists("INFILESIZE", $options)) { | |
curl_setopt($ch, CURLOPT_INFILESIZE, $options["INFILESIZE"]); | |
} | |
if (array_key_exists("INFILE", $options)) { | |
curl_setopt($ch, CURLOPT_INFILE, $options["INFILE"]); | |
} | |
if (in_array("AUTH", $options)) { | |
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth ".TOKEN)); | |
} | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_HEADER, false); | |
$res = curl_exec($ch); | |
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); | |
curl_close($ch); | |
$res = @json_decode($res, true); | |
$result = ["http_code" => $http_code, "res" => $res]; | |
return $result; | |
} | |
// если команда на создание тестовых папок | |
if (!empty($argv[1]) && $argv[1] == "demo") { | |
echo "<pre>"; | |
print_r("Добавление тестовых директорий"); | |
echo "</pre>"; | |
// тестовые директории | |
$dirs = []; | |
for ($i=1; $i <= 10; $i++) { | |
$dirs[] = DOMEN.date("Ym").str_pad($i, 2, "0", STR_PAD_LEFT); | |
} | |
// создаем тестовые директории | |
foreach ($dirs as $key => $value) { | |
// создаем директорию | |
$url = "https://cloud-api.yandex.net/v1/disk/resources/?path=".urlencode(PATH_YA."/".$value); | |
$request = getUrl($url, ["AUTH", "PUT"]); | |
if (in_array($request["http_code"], [201, 202, 204])) { | |
echo "<pre>"; | |
echo "Успешно создано - ".PATH_YA."/".$value; | |
echo "</pre>"; | |
} | |
} | |
exit; | |
} | |
// если команда на удаление всех бэкапов | |
if (!empty($argv[1]) && $argv[1] == "clear") { | |
echo "<pre>"; | |
print_r("Удаление всех бэкапов"); | |
echo "</pre>"; | |
// получаем список с диска | |
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA)."&fields=_embedded.items.name,_embedded.items.type&limit=100"; | |
$request = getUrl($url, ["AUTH"]); | |
echo "<pre>"; | |
print_r($request["res"]); | |
echo "</pre>"; | |
// если есть файлы/папки на диске | |
if (!empty($request["res"]["_embedded"]["items"])) { | |
// полная очистка папки | |
foreach ($request["res"]["_embedded"]["items"] as $key => $value) { | |
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA."/".$value["name"])."&permanently=true"; | |
$request = getUrl($url, ["AUTH", "DELETE"]); | |
if (in_array($request["http_code"], [201, 202, 204])) { | |
echo "<pre>"; | |
echo "Успешно удалено - ".PATH_YA."/".$value["name"]; | |
echo "</pre>"; | |
} | |
} | |
} | |
exit; | |
} | |
// результат | |
$result = [0,0]; | |
// переносим бэкап | |
foreach (glob(PATH."/".FILES_BITRIX."_*") as $file) { | |
// если первый проход | |
if (array_sum($result) == 0) { | |
// удаляем старые бэкапы | |
echo "<pre>"; | |
print_r("Удаление старых бэкапов"); | |
echo "</pre>"; | |
// получаем список папок с диска | |
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA)."&fields=_embedded.items.name,_embedded.items.type&limit=100"; | |
$request = getUrl($url, ["AUTH"]); | |
echo "<pre>"; | |
print_r($request["res"]); | |
echo "</pre>"; | |
// удаляем старые бэкапы | |
if (!empty($request["res"]["_embedded"]["items"]) && count($request["res"]["_embedded"]["items"]) > (COUNT - 1)) { | |
$old = array_slice($request["res"]["_embedded"]["items"], 0, count($request["res"]["_embedded"]["items"]) - (COUNT - 1)); | |
foreach ($old as $key => $value) { | |
// удаляем папку | |
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA."/".$value["name"])."&permanently=true"; | |
$request = getUrl($url, ["AUTH", "DELETE"]); | |
if (in_array($request["http_code"], [201, 202, 204])) { | |
echo "<pre>"; | |
echo "Успешно удалено - ".PATH_YA."/".$value["name"]; | |
echo "</pre>"; | |
} | |
} | |
} | |
echo "<pre>"; | |
print_r("Создание директории на Ядиске"); | |
echo "</pre>"; | |
// создаем директорию | |
$url = "https://cloud-api.yandex.net/v1/disk/resources/?path=".urlencode(PATH_YA."/".DIR); | |
$request = getUrl($url, ["AUTH", "PUT"]); | |
if (in_array($request["http_code"], [201, 202, 204])) { | |
echo "<pre>"; | |
echo "Успешно создано - ".PATH_YA."/".DIR; | |
echo "</pre>"; | |
} | |
} | |
// запрашиваем url для загрузки | |
$url = "https://cloud-api.yandex.net/v1/disk/resources/upload?path=".urlencode(PATH_YA."/".DIR."/".basename($file)); | |
$request = getUrl($url, ["AUTH"]); | |
// если ошибки нет, то отправляем файл на полученный URL | |
if (empty($request["res"]["error"])) { | |
$fp = fopen($file, "r"); | |
$url = $request["res"]["href"]; | |
$request = getUrl($url, ["PUT", "UPLOAD", "INFILESIZE" => filesize($file), "INFILE" => $fp]); | |
if (in_array($request["http_code"], [201])) { | |
echo "File ".basename($file)." uploaded<br>"; | |
$result[0]++; | |
} else { | |
$result[1]++; | |
echo "File ".basename($file)." error - ".$http_code."<br>"; | |
} | |
fclose($fp); | |
} | |
} | |
// если бэкап не был отправлен | |
if (array_sum($result) == 0) { | |
mail(EMAIL, DOMEN." backup yandex", "Отсутствует резервная копия сайта."); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment