|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
|
|
|
* To change this template file, choose Tools | Templates
|
|
|
|
|
* and open the template in the editor.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Description of BackupUSB
|
|
|
|
|
*
|
|
|
|
|
* @author Victor
|
|
|
|
|
*
|
|
|
|
|
* -> findmnt | grep -i '/dev/sd'
|
|
|
|
|
* -> vim /etc/fstab
|
|
|
|
|
* -> /dev/sdb1 /mnt/USB vfat user,noauto,rw 0 0
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
final class BackupUSB extends AbstractLocalLan {
|
|
|
|
|
|
|
|
|
|
protected $_diretorioUsbLocal = "/mnt/USB/";
|
|
|
|
|
protected $_usbMounted = false;
|
|
|
|
|
|
|
|
|
|
public function __destruct() {
|
|
|
|
|
|
|
|
|
|
if ($this->_usbMounted) {
|
|
|
|
|
$this->Debug("Desmontando unidade USB em {$this->_diretorioUsbLocal}...");
|
|
|
|
|
$cmd = sprintf("umount -f %s", $this->_diretorioUsbLocal);
|
|
|
|
|
$umount = ssh2_exec($this->_handler, $cmd);
|
|
|
|
|
if (!$umount) {
|
|
|
|
|
$this->Error("Imposs<EFBFBD>vel desmontar a unidade USB em {$this->_diretorioUsbLocal}.");
|
|
|
|
|
} else {
|
|
|
|
|
$this->Debug("Unidade USB em {$this->_diretorioUsbLocal} desmontada com sucesso.");
|
|
|
|
|
}
|
|
|
|
|
ssh2_exec($this->_handler, "exit");
|
|
|
|
|
$this->Debug(self::$BACKUP_FINALIZADO);
|
|
|
|
|
} else {
|
|
|
|
|
$this->Debug("Nenhuma unidade USB foi montada");
|
|
|
|
|
}
|
|
|
|
|
$this->Debug(self::$BACKUP_FINALIZADO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Conecta ao servidor de destino do backup
|
|
|
|
|
*
|
|
|
|
|
* @param BackupInfo $backup
|
|
|
|
|
*
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
function Connect(BackupInfo $backup) {
|
|
|
|
|
$this->backup = $backup;
|
|
|
|
|
|
|
|
|
|
$sshConectado = $this->ConectaSSH();
|
|
|
|
|
if (!$sshConectado) {
|
|
|
|
|
$this->backup->hasError = true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!file_exists($this->_diretorioUsbLocal)) {
|
|
|
|
|
$cmd = "mkdir -p {$this->_diretorioUsbLocal}";
|
|
|
|
|
$result = null;
|
|
|
|
|
|
|
|
|
|
$cmdStatus = ssh2_exec($this->_handler, $cmd);
|
|
|
|
|
|
|
|
|
|
if (!$cmdStatus) {
|
|
|
|
|
$this->Error("N<EFBFBD>o foi poss<EFBFBD>vel criar o diret<EFBFBD>rio {$this->_diretorioUsbLocal}!");
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!is_readable($this->_diretorioUsbLocal)) {
|
|
|
|
|
$this->Error("Sem permiss<EFBFBD>o de leitura para o diret<EFBFBD>rio {$this->_diretorioUsbLocal}");
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
if (!is_writable($this->_diretorioUsbLocal)) {
|
|
|
|
|
$this->Error("Sem permiss<EFBFBD>o de escrita para o diret<EFBFBD>rio {$this->_diretorioUsbLocal}");
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// monta a unidade usb
|
|
|
|
|
$mountCmd = "mount /dev/sdb1 2>&1";
|
|
|
|
|
$stream = ssh2_exec($this->_handler, $mountCmd);
|
|
|
|
|
if (!$stream) {
|
|
|
|
|
$this->backup->hasError = true;
|
|
|
|
|
$this->Error("N<EFBFBD>o foi poss<EFBFBD>vel montar a unidade usb {$this->_diretorioUsbLocal}!");
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
|
|
|
|
|
stream_set_blocking($stream, true);
|
|
|
|
|
$output = utf8_decode(stream_get_contents($stream));
|
|
|
|
|
$error = stream_get_contents($errorStream);
|
|
|
|
|
if (!empty($output)) {
|
|
|
|
|
if (StringClass::ContemTexto($output, "n<EFBFBD>o existe") ||
|
|
|
|
|
StringClass::ContemTexto($output, "mount: can't find") ||
|
|
|
|
|
StringClass::ContemTexto($output, "already mounted")) {
|
|
|
|
|
$error = str_replace("\n", "", $output);
|
|
|
|
|
} else {
|
|
|
|
|
$this->Debug($output);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!empty($error)) {
|
|
|
|
|
$this->Error($error);
|
|
|
|
|
fclose($stream);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$this->_usbMounted = !$this->backup->hasError;
|
|
|
|
|
|
|
|
|
|
fclose($stream);
|
|
|
|
|
|
|
|
|
|
return !$this->backup->hasError;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function Upload(array $dadosArquivo, $remoteFile) {
|
|
|
|
|
$localFile = $dadosArquivo['file'];
|
|
|
|
|
$hash = $dadosArquivo['hash'];
|
|
|
|
|
$remoteFilePath = sprintf("%s%s", $this->_diretorioUsbLocal, $remoteFile);
|
|
|
|
|
$cmd = sprintf("cp -u %s %s", $localFile, $remoteFilePath);
|
|
|
|
|
|
|
|
|
|
$stream = ssh2_exec($this->_handler, $cmd);
|
|
|
|
|
|
|
|
|
|
if (!$stream) {
|
|
|
|
|
$this->Error("N<EFBFBD>o foi poss<EFBFBD>vel executar o comando [{$cmd}]");
|
|
|
|
|
}
|
|
|
|
|
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
|
|
|
|
|
stream_set_blocking($stream, true);
|
|
|
|
|
$output = stream_get_contents($stream);
|
|
|
|
|
if (!empty($output)) {
|
|
|
|
|
$this->Debug($output);
|
|
|
|
|
}
|
|
|
|
|
$error = stream_get_contents($errorStream);
|
|
|
|
|
if (!empty($error)) {
|
|
|
|
|
$this->Error($error);
|
|
|
|
|
fclose($stream);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
fclose($stream);
|
|
|
|
|
|
|
|
|
|
if (!file_exists($remoteFilePath)) {
|
|
|
|
|
$this->Error("N<EFBFBD>o foi poss<EFBFBD>vel gravar o arquivo na unidade USB!");
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$this->Debug("Backup copiado para '{$remoteFilePath}'");
|
|
|
|
|
$this->unlink($localFile);
|
|
|
|
|
|
|
|
|
|
return $this->CheckHash($hash, $remoteFilePath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|