[Модуль] Backup (backup)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Anton_V
Сообщения: 27
Зарегистрирован: Пн апр 30, 2018 10:15 pm
Откуда: Уфа
Благодарил (а): 7 раз
Поблагодарили: 5 раз

Re: [Модуль] Backup (backup)

Сообщение Anton_V » Вс окт 27, 2019 10:38 pm

Всем доброго времени суток.
Сегодня копался в модуле, а точнее в передачи через FTP. в результате наткнулся на следующие ошибки.
1. Если FTP сервер поднят на винде средствами IIS (у меня windows 10), то не отображается список файлов архивов.
2. Если бекап создается достаточно долго ( в моем случае это мин 10-15), то загрузка на FTP не происходит, падает в ошибку на строке такой- то(номер не скажу не помню, но если смотреть то она выглядит так:

Код: Выделить всё

if (ftp_chdir($this->conn_id, $this->path) == false)

это в функции uploadBackup.
3. Если даже и приходит загрузка файла на FTP (не полное копирование, время работы копирования 1-2 мин) то они приходят битые.

А теперь ответ на два вопроса - Кто виноват и что делать в сложившейся ситуации.
1. у меня сложилось такое впечатление что IIS отображает файлы не совсем так как это делает тот же VSFTPD (никсы) и как следствие, при чтение списка файлов с сервера FTP формируется не правильный массив имен файлов в функции getList. Следовательно пришлось поправить не много эту функцию. сразу говорю что дату и время создания файла беру из его имени. а сама функция у меня получилась следующая:

Код: Выделить всё

public function getList()
    {
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
        return $files;
    }
если вы заливаете на FTP сервер поднятый на никсах, то скорее всего будет работать функция разработчика модуля. (не проверял).

2. Эта ошибка связана с тем, что соединение с FTP сервером создается в момент начала резервирования, т.е. все то время пока происходит копирование файлов во временную папку, выгрузка дампов БД и сжатие всего этого, соединение с FTP остается открытым. и как следствие может быть разорвано сервером по тайм-ауту (что и происходило у меня). от сюда и появляющаяся непонятная ошибка на функцию которая в принципе не может дать такой ответ. лечится это путем установки соединения только в момент выполнения каких-то действий на сервере, например загрузка файлов на сервер, получение списка, удаление и т.д.
в результате пришлось добавить в класс фтп еще 1 функцию ftpConnect() и вызывать ее в при выполнение каких-либо действий на FTP сервере.
полный файл касса работы с фтп сервером ниже.

3. связано это с тем что файлы передаются в кодировки ASCII (точно не разбирался но похоже, что что-то криво перекодируется). так вот для исправления этого достаточно поменять режим передачи файла на фтп сервер в строке

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_ASCII)) {
с FTP_ASCII на FTP_BINARY. в результате получится

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_BINARY)) { 

Все выше описанное относится к файлу %WWW DIRECTORY%/modules/backup/provider/ftp.php
ну и как обещал полный код этого файла

Код: Выделить всё

<?php
require_once("IProvider.php");

class FtpBackup implements IProvider
{
    public $error;
    public $supportUpload = 1;
    
    function __construct($ftp_server, $login, $password, $path, $logger)
    {
        $this->path = $path;
        $this->ftp_server = $ftp_server;
        $this->logger = $logger;
        $this->login=$login;
		$this->password=$password;
		
    }
	
	function ftpConnect()
	{
		$this->conn_id = ftp_connect($this->ftp_server);
        $this->login_result = ftp_login($this->conn_id, $this->login, $this->password);
        if (!$this->login_result) {
            $this->logger->log('Error autorization');
            $this->error='Error autorization';
        }		
	}
    
    public function getFreeSpace()
    {
        return -1;
    }
    
    public function getList()
    {
		$this->ftpConnect();
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
		ftp_close($this->conn_id);
        return $files;
    }
    
    public function uploadBackup($file, $backup)

    {
	$this->ftpConnect();
        if ($this->error) return;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }


        if (!ftp_put($this->conn_id, $this->path.$backup, $file, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        }
		ftp_close($this->conn_id);		

    }
    
    public function deleteBackup($backup)
    {
        $this->ftpConnect();
		if ($this->error) return;
        
        $filename = $backup;
        echo $filename;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_delete($this->conn_id, $filename)) {
            $this->logger->log('Delete failed:'. $filename);
            $this->error='Delete failed:'. $filename;
        }
		ftp_close($this->conn_id);
    }
	
    public function downloadBackup($backup, $file)
    {
		$this->ftpConnect();
        if ($this->error) return;
        $filename = $backup;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_get($this->conn_id, $file, $this->path."/".$backup, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        } 
		ftp_close($this->conn_id);
    }
	
}

Аватара пользователя
71Gavrik71
Сообщения: 54
Зарегистрирован: Сб май 21, 2016 2:04 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: [Модуль] Backup (backup)

Сообщение 71Gavrik71 » Пн окт 28, 2019 5:36 pm

Подскажите недолекому), какие галочки ставить в бэкапе, а то при выборе по умолчанию бэкап почти по 100 метров.
Какие позиции что бы сделать такой же бэкап как штатная система.
За ранее благодарю.
Logrus
Сообщения: 2084
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: [Модуль] Backup (backup)

Сообщение Logrus » Пн окт 28, 2019 6:30 pm

Снимок.PNG
Снимок.PNG (26.51 КБ) 3657 просмотров
бд и один файл, в бд все что нужно есть, файлы любых версий на гите (т.ч. нет никакого смысла их гонять туда-сюда)
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
71Gavrik71
Сообщения: 54
Зарегистрирован: Сб май 21, 2016 2:04 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: [Модуль] Backup (backup)

Сообщение 71Gavrik71 » Пн окт 28, 2019 6:44 pm

Просто по умолчанию 100метров бекап а штатный 17 и все восстанавливает) Благодарю попробую)
Аватара пользователя
andrey040670
Сообщения: 459
Зарегистрирован: Пн июл 31, 2017 10:00 pm
Благодарил (а): 161 раз
Поблагодарили: 85 раз

Re: [Модуль] Backup (backup)

Сообщение andrey040670 » Пн окт 28, 2019 10:14 pm

Logrus писал(а):
Пн окт 28, 2019 6:30 pm
бд и один файл, в бд все что нужно есть, файлы любых версий на гите (т.ч. нет никакого смысла их гонять туда-сюда)
А как на счёт /templates_alt/ , /modules/ , /3rdparty/, графика к сценам, да и многое другое, чего уже не будет (или потребует времени на до установку и правку) в стандартном дистрибьютиве мд?
Мой бэкап 54МБ, но я его могу гонять на двух системах (одна в подписи, другая малина (резерв)) + на винде с небольшой корректировкой, и поверьте, это экономит уйму времени, которого вечно не хватает.
А вот config.php совершенно не обязательно, его привести в нужный вид одна минута, так как я бэкап использую на разных системах, то соответственно я его не архивирую.
Последний раз редактировалось andrey040670 Пн окт 28, 2019 10:43 pm, всего редактировалось 2 раза.
MJD alfa: Khadas VIM1 Ubuntu 18.04.2 LTS bionic Linux 4.9.40 #2 SMP PREEMPT Tue Oct 30 15:47:54 CST 2018 aarch64 GNU/Linux
MJD alfa: Rpi 3B Debian 11 (bullseye) Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux
Аватара пользователя
Eraser
Сообщения: 1085
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 14 раз
Поблагодарили: 869 раз
Контактная информация:

Re: [Модуль] Backup (backup)

Сообщение Eraser » Пн окт 28, 2019 10:16 pm

Anton_V писал(а):
Вс окт 27, 2019 10:38 pm
Всем доброго времени суток.
Сегодня копался в модуле, а точнее в передачи через FTP. в результате наткнулся на следующие ошибки.
1. Если FTP сервер поднят на винде средствами IIS (у меня windows 10), то не отображается список файлов архивов.
2. Если бекап создается достаточно долго ( в моем случае это мин 10-15), то загрузка на FTP не происходит, падает в ошибку на строке такой- то(номер не скажу не помню, но если смотреть то она выглядит так:

Код: Выделить всё

if (ftp_chdir($this->conn_id, $this->path) == false)

это в функции uploadBackup.
3. Если даже и приходит загрузка файла на FTP (не полное копирование, время работы копирования 1-2 мин) то они приходят битые.

А теперь ответ на два вопроса - Кто виноват и что делать в сложившейся ситуации.
1. у меня сложилось такое впечатление что IIS отображает файлы не совсем так как это делает тот же VSFTPD (никсы) и как следствие, при чтение списка файлов с сервера FTP формируется не правильный массив имен файлов в функции getList. Следовательно пришлось поправить не много эту функцию. сразу говорю что дату и время создания файла беру из его имени. а сама функция у меня получилась следующая:

Код: Выделить всё

public function getList()
    {
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
        return $files;
    }
если вы заливаете на FTP сервер поднятый на никсах, то скорее всего будет работать функция разработчика модуля. (не проверял).

2. Эта ошибка связана с тем, что соединение с FTP сервером создается в момент начала резервирования, т.е. все то время пока происходит копирование файлов во временную папку, выгрузка дампов БД и сжатие всего этого, соединение с FTP остается открытым. и как следствие может быть разорвано сервером по тайм-ауту (что и происходило у меня). от сюда и появляющаяся непонятная ошибка на функцию которая в принципе не может дать такой ответ. лечится это путем установки соединения только в момент выполнения каких-то действий на сервере, например загрузка файлов на сервер, получение списка, удаление и т.д.
в результате пришлось добавить в класс фтп еще 1 функцию ftpConnect() и вызывать ее в при выполнение каких-либо действий на FTP сервере.
полный файл касса работы с фтп сервером ниже.

3. связано это с тем что файлы передаются в кодировки ASCII (точно не разбирался но похоже, что что-то криво перекодируется). так вот для исправления этого достаточно поменять режим передачи файла на фтп сервер в строке

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_ASCII)) {
с FTP_ASCII на FTP_BINARY. в результате получится

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_BINARY)) { 

Все выше описанное относится к файлу %WWW DIRECTORY%/modules/backup/provider/ftp.php
ну и как обещал полный код этого файла

Код: Выделить всё

<?php
require_once("IProvider.php");

class FtpBackup implements IProvider
{
    public $error;
    public $supportUpload = 1;
    
    function __construct($ftp_server, $login, $password, $path, $logger)
    {
        $this->path = $path;
        $this->ftp_server = $ftp_server;
        $this->logger = $logger;
        $this->login=$login;
		$this->password=$password;
		
    }
	
	function ftpConnect()
	{
		$this->conn_id = ftp_connect($this->ftp_server);
        $this->login_result = ftp_login($this->conn_id, $this->login, $this->password);
        if (!$this->login_result) {
            $this->logger->log('Error autorization');
            $this->error='Error autorization';
        }		
	}
    
    public function getFreeSpace()
    {
        return -1;
    }
    
    public function getList()
    {
		$this->ftpConnect();
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
		ftp_close($this->conn_id);
        return $files;
    }
    
    public function uploadBackup($file, $backup)

    {
	$this->ftpConnect();
        if ($this->error) return;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }


        if (!ftp_put($this->conn_id, $this->path.$backup, $file, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        }
		ftp_close($this->conn_id);		

    }
    
    public function deleteBackup($backup)
    {
        $this->ftpConnect();
		if ($this->error) return;
        
        $filename = $backup;
        echo $filename;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_delete($this->conn_id, $filename)) {
            $this->logger->log('Delete failed:'. $filename);
            $this->error='Delete failed:'. $filename;
        }
		ftp_close($this->conn_id);
    }
	
    public function downloadBackup($backup, $file)
    {
		$this->ftpConnect();
        if ($this->error) return;
        $filename = $backup;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_get($this->conn_id, $file, $this->path."/".$backup, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        } 
		ftp_close($this->conn_id);
    }
	
}

залил обновление, проверяйте
Connect ---- Telegram
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
Anton_V
Сообщения: 27
Зарегистрирован: Пн апр 30, 2018 10:15 pm
Откуда: Уфа
Благодарил (а): 7 раз
Поблагодарили: 5 раз

Re: [Модуль] Backup (backup)

Сообщение Anton_V » Пн окт 28, 2019 10:41 pm

Eraser писал(а):
Пн окт 28, 2019 10:16 pm
Anton_V писал(а):
Вс окт 27, 2019 10:38 pm
Всем доброго времени суток.
Сегодня копался в модуле, а точнее в передачи через FTP. в результате наткнулся на следующие ошибки.
1. Если FTP сервер поднят на винде средствами IIS (у меня windows 10), то не отображается список файлов архивов.
2. Если бекап создается достаточно долго ( в моем случае это мин 10-15), то загрузка на FTP не происходит, падает в ошибку на строке такой- то(номер не скажу не помню, но если смотреть то она выглядит так:

Код: Выделить всё

if (ftp_chdir($this->conn_id, $this->path) == false)

это в функции uploadBackup.
3. Если даже и приходит загрузка файла на FTP (не полное копирование, время работы копирования 1-2 мин) то они приходят битые.

А теперь ответ на два вопроса - Кто виноват и что делать в сложившейся ситуации.
1. у меня сложилось такое впечатление что IIS отображает файлы не совсем так как это делает тот же VSFTPD (никсы) и как следствие, при чтение списка файлов с сервера FTP формируется не правильный массив имен файлов в функции getList. Следовательно пришлось поправить не много эту функцию. сразу говорю что дату и время создания файла беру из его имени. а сама функция у меня получилась следующая:

Код: Выделить всё

public function getList()
    {
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
        return $files;
    }
если вы заливаете на FTP сервер поднятый на никсах, то скорее всего будет работать функция разработчика модуля. (не проверял).

2. Эта ошибка связана с тем, что соединение с FTP сервером создается в момент начала резервирования, т.е. все то время пока происходит копирование файлов во временную папку, выгрузка дампов БД и сжатие всего этого, соединение с FTP остается открытым. и как следствие может быть разорвано сервером по тайм-ауту (что и происходило у меня). от сюда и появляющаяся непонятная ошибка на функцию которая в принципе не может дать такой ответ. лечится это путем установки соединения только в момент выполнения каких-то действий на сервере, например загрузка файлов на сервер, получение списка, удаление и т.д.
в результате пришлось добавить в класс фтп еще 1 функцию ftpConnect() и вызывать ее в при выполнение каких-либо действий на FTP сервере.
полный файл касса работы с фтп сервером ниже.

3. связано это с тем что файлы передаются в кодировки ASCII (точно не разбирался но похоже, что что-то криво перекодируется). так вот для исправления этого достаточно поменять режим передачи файла на фтп сервер в строке

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_ASCII)) {
с FTP_ASCII на FTP_BINARY. в результате получится

Код: Выделить всё

 if (!ftp_put($this->conn_id, $this->path."".$backup, $file, FTP_BINARY)) { 

Все выше описанное относится к файлу %WWW DIRECTORY%/modules/backup/provider/ftp.php
ну и как обещал полный код этого файла

Код: Выделить всё

<?php
require_once("IProvider.php");

class FtpBackup implements IProvider
{
    public $error;
    public $supportUpload = 1;
    
    function __construct($ftp_server, $login, $password, $path, $logger)
    {
        $this->path = $path;
        $this->ftp_server = $ftp_server;
        $this->logger = $logger;
        $this->login=$login;
		$this->password=$password;
		
    }
	
	function ftpConnect()
	{
		$this->conn_id = ftp_connect($this->ftp_server);
        $this->login_result = ftp_login($this->conn_id, $this->login, $this->password);
        if (!$this->login_result) {
            $this->logger->log('Error autorization');
            $this->error='Error autorization';
        }		
	}
    
    public function getFreeSpace()
    {
        return -1;
    }
    
    public function getList()
    {
		$this->ftpConnect();
        if ($this->error) return;
        $pattern = IsWindowsOS() ? 'tar' : 'tgz';
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        $list = ftp_rawlist($this->conn_id, $this->path);
        $files = array();
        foreach ($list as $current) {
            $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY);
            if ($split[0] != "total") {
                if ($split[0]{0} === "d") continue;
                if (!strpos($split[3],$pattern)) continue;
                $file = array();
                $file["NAME"] = $split[3];
		$time=substr($split[3],15,2).':'.substr($split[3],17,2);
                $month = substr($split[3],11,2);
                $day = substr($split[3],13,2);
		$year=substr($split[3],7,4);
                if (strpos($time, ':'))
                    $timestamp = strtotime($day . "-" . $month. "-". $year. " ". $time);
                else
                    $timestamp = strtotime($day. "-". $month ."-". $year . " 00:00");
                $date = date('d-m-Y H:i',  $timestamp);
                $file["CREATED"] = $date;
                $file["SIZE"] = $split[2];
                $file["URL"] = "ftp://".$this->ftp_server."$this->path".$file["NAME"];
                $files[] = $file;
            }
        }
		ftp_close($this->conn_id);
        return $files;
    }
    
    public function uploadBackup($file, $backup)

    {
	$this->ftpConnect();
        if ($this->error) return;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }


        if (!ftp_put($this->conn_id, $this->path.$backup, $file, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        }
		ftp_close($this->conn_id);		

    }
    
    public function deleteBackup($backup)
    {
        $this->ftpConnect();
		if ($this->error) return;
        
        $filename = $backup;
        echo $filename;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_delete($this->conn_id, $filename)) {
            $this->logger->log('Delete failed:'. $filename);
            $this->error='Delete failed:'. $filename;
        }
		ftp_close($this->conn_id);
    }
	
    public function downloadBackup($backup, $file)
    {
		$this->ftpConnect();
        if ($this->error) return;
        $filename = $backup;
        if (ftp_chdir($this->conn_id, $this->path) == false) {
            $this->logger->log('Change dir failed:'. $this->path);
            $this->error='Change dir failed:'. $this->path;
            return;
        }
        if (!ftp_get($this->conn_id, $file, $this->path."/".$backup, FTP_BINARY)) {
            $this->logger->log('Upload failed:'. $this->path.$backup);
            $this->error='Upload failed:'. $this->path.$backup;
        } 
		ftp_close($this->conn_id);
    }
	
}

залил обновление, проверяйте
Да все работает. спасибо
Anton_V
Сообщения: 27
Зарегистрирован: Пн апр 30, 2018 10:15 pm
Откуда: Уфа
Благодарил (а): 7 раз
Поблагодарили: 5 раз

Re: [Модуль] Backup (backup)

Сообщение Anton_V » Пн окт 28, 2019 11:00 pm

71Gavrik71 писал(а):
Пн окт 28, 2019 6:44 pm
Просто по умолчанию 100метров бекап а штатный 17 и все восстанавливает) Благодарю попробую)
ну скажем так, штатный далеко не все восстанавливает. а базу данных и основные файлы системы. которые и так после установки будут. а вот если у тебя будет полный бекап и у тебя, не дай бог слетит система, то ты восстановишь ее не более чем за час. так что сам думай сукономить 83 метра и потратить несколько дней а восстановление или перенакатить систему с нуля и развернуть бекап.
к тому же встроенные бекапы не защищают от падения диска/флешки и тд. и тп.
поэтому настоятельно рекомендую сливать бекап во внешнее хранилище
Logrus
Сообщения: 2084
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: [Модуль] Backup (backup)

Сообщение Logrus » Пн окт 28, 2019 11:27 pm

andrey040670 писал(а):
Пн окт 28, 2019 10:14 pm
Logrus писал(а):
Пн окт 28, 2019 6:30 pm
бд и один файл, в бд все что нужно есть, файлы любых версий на гите (т.ч. нет никакого смысла их гонять туда-сюда)
А как на счёт /templates_alt/ , /modules/ , /3rdparty/, графика к сценам, да и многое другое, чего уже не будет (или потребует времени на до установку и правку) в стандартном дистрибьютиве мд?
Мой бэкап 54МБ, но я его могу гонять на двух системах (одна в подписи, другая малина (резерв)) + на винде с небольшой корректировкой, и поверьте, это экономит уйму времени, которого вечно не хватает.
А вот config.php совершенно не обязательно, его привести в нужный вид одна минута, так как я бэкап использую на разных системах, то соответственно я его не архивирую.
т.к. у меня много что изменено, все это есть отдельно (после каждого обновления мдм приходится менять) и даже более того снят образ (5 минут накатить, поменять флешку и восстановить актуальную бд), а config.php как пример выбора одного файла
мой бекап 200 кб и что? этого полностью достаточно, залить на я.диск несколько секунд :)

п.с. по поводу файла ранее без него не работало
п.п.с. по поводу полных бекапов всех файлов, о сколько проблем пользователи таскают из раза в раз :lol:
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
andrey040670
Сообщения: 459
Зарегистрирован: Пн июл 31, 2017 10:00 pm
Благодарил (а): 161 раз
Поблагодарили: 85 раз

Re: [Модуль] Backup (backup)

Сообщение andrey040670 » Пн окт 28, 2019 11:57 pm

Logrus писал(а):
Пн окт 28, 2019 11:27 pm
т.к. у меня много что изменено
А у меня изменено и добавлено, что ни как не затрагивает обновление МД, и зачем мне искать себе трудности? Мне при переустановке, миграции шаманить всё заново? Боже упаси, у меня нет столько времени, желания и памяти. Минус один этого модуля, что есть возможность архивировать только корневые папки и файлы и приходиться класть в архив много лишнего.
А общий бэкапп всей системы раз в месяц естественно тоже делаю.
Logrus писал(а):
Пн окт 28, 2019 11:27 pm
п.п.с. по поводу полных бекапов всех файлов, о сколько проблем пользователи таскают из раза в раз :lol:
Ну, а здесь всё просто. При обновлении МД или модулей всегда есть ссылка на гит, и мы говорим о суточном резервировании, вряд ли вы сможете обновить упавшую систему :D
Logrus писал(а):
Пн окт 28, 2019 11:27 pm
п.с. по поводу файла ранее без него не работало
Всегда работало, как уже писал ранее, он мне не нужен и может принести некоторое неудобство при миграции на другое устройство.
Последний раз редактировалось andrey040670 Вт окт 29, 2019 12:15 am, всего редактировалось 1 раз.
MJD alfa: Khadas VIM1 Ubuntu 18.04.2 LTS bionic Linux 4.9.40 #2 SMP PREEMPT Tue Oct 30 15:47:54 CST 2018 aarch64 GNU/Linux
MJD alfa: Rpi 3B Debian 11 (bullseye) Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux
Ответить