You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

552 lines
19 KiB

<?php
/**
* @param BackupInfo $bkp
* @param $erroDef
*
* @return array
*/
function GetErroBkp(BackupInfo $bkp, $erroDef) {
$msg = $msgreal = null;
if (isset($bkp)) {
$msg = $bkp->GetMessage();
$msgreal = $bkp->GetRealMessage();
}
$erros = error_get_last();
$msg = $msg ? $msg : "Erro ao realizar o backup!";
$msgreal = $msgreal ? $msgreal : $erroDef;
$msgreal .= " Sys: " . $erros["message"];
return array("msg" => $msg, "real" => $msgreal);
}
function ServidorAtivo() {
$data = time();
$filename = "/tmp/backup_server.reg";
$dataFile = file_exists($filename) ? file_get_contents($filename) : $data;
return ($data - $dataFile) < TEMPO_EXPIRA;
}
function RegServidor() {
$filename = "/tmp/backup_server.reg";
$handle = fopen($filename, "w");
fwrite($handle, time());
fclose($handle);
}
function GetConfiguracoes($isManual = false) {
global $tpId, $horaAtual;
$query = GetQueryBkp($isManual);
$result = pg_query($query);
if (!$result) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel selecionar as configura<EFBFBD><EFBFBD>es no banco: $query", __FUNCTION__);
}
$return = array();
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$cfg_id = $dados["cfg_id"];
/*
* Qdo bkp manual ? poss<EFBFBD>vel indicar o tipo(audio, configuracaoes, etc) pela linha de comando.
*/
if ($isManual && $tpId) {
$dados["tp_id"] = $tpId;
}
$return[$cfg_id]['config'] = $dados;
/*
* Horario de agendamento do bakcup.
*/
$agd = explode(';', $dados["qt_agenda"]);
$return[$cfg_id]['agenda'] = $isManual ? array($horaAtual) : $agd;
$email = explode(';', $dados["cfg_email"]);
$return[$cfg_id]['email'] = $email;
//b.dst_host, b.dst_porta, b.dst_user_anonimo, b.dst_user, b.dst_senha, dst_diretorio
$return[$cfg_id]['destino'] = array
(
"proto" => $dados["prt_id"],
"host" => $dados["dst_host"],
"port" => $dados["dst_porta"],
"anon" => $dados["dst_user_anonimo"],
"user" => $dados["dst_user"],
"pass" => $dados["dst_senha"],
"dir" => $dados["dst_diretorio"],
"timeout" => 15
);
}
return $return;
}
function GetQueryBkp($isManual = 0) {
//case when(b.prt_id = 4)then b.dst_diretorio_local else b.dst_diretorio_remoto end as dst_diretorio
// $param = $isManual ? " and a.cfg_id = 0 " : " and a.cfg_status <> 9 ";
$param = " and a.cfg_status <> 9 ";
return "SELECT a.cfg_id, a.cfg_descricao, a.cfg_deleta_antigo, a.cfg_email, a.tp_id, a.frq_id, a.qt_id, f.qt_agenda,
b.prt_id, b.dst_host, b.dst_porta, b.dst_user_anonimo, b.dst_user, b.dst_senha, b.dst_diretorio_remoto AS dst_diretorio
FROM pbx_backup_configuracao a, pbx_backup_destino b, pbx_backup_protocolo c, pbx_backup_tipo d,
pbx_backup_frequencia e, pbx_backup_frequencia_qtde f
WHERE b.dst_id = a.dst_id
AND c.prt_id = b.prt_id
AND d.tp_id = a.tp_id
AND e.frq_id = a.frq_id
AND f.qt_id = a.qt_id" . $param;
}
function VerificaBkpReg($cfg_id, $data, $hora) {
global $isManual, $debug;
if ($isManual || $debug) {
// return true;
}
$query = "select count(*) from pbx_backup where cfg_id = '$cfg_id' and bkp_data = '$data' and bkp_hora = '$hora' and bkp_status = 0";
$result = pg_query($query);
if (!$result) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel verificar o registro do backup: $query", __FUNCTION__, ErrorGetLast());
}
$row = pg_fetch_row($result);
return !$row[0];
}
function RegistraBkp($db, $bkpInfo, $bkpFile, $erros = array()) {
global $configDestinoUid;
try {
$regErro = count($erros);
$result = pg_query($db, 'begin');
$query = "INSERT INTO pbx_backup(cfg_id, tp_id, bkp_arquivo, bkp_tamanho, bkp_data, bkp_hora, bkp_minuto, bkp_status,bkp_log, bkp_log_erro) VALUES(%s,%s,%s,%s,%s,%s,'0',%s,%s,%s)";
$query = sprintf($query, QuotedStr($bkpInfo["cfg_id"]), QuotedStr($bkpInfo["tp_id"]), QuotedStr($bkpInfo["dir"]), QuotedStr($bkpInfo['size_bkp']), QuotedStr($bkpInfo["data"]), QuotedStr($bkpInfo["hora"]), ($regErro ? "'1'" : "'0'"), ($regErro ? QuotedStr($erros['msg']) : "null"), ($regErro ? QuotedStr($erros['real']) : "null"));
$result = pg_query($db, $query);
if (!$result) {
Excpt("Erro ao registrar os arquivos do backup", __FUNCTION__, "Cmd-> " . $query . "Erro->" .
ErrorGetLast());
}
if (!$regErro) {
$result = false;
$bkp_id = GetCurrVal('pbx_backup');
if (!$bkp_id) {
Excpt(sprintf("N<EFBFBD>o foi possivel recuperar o id do backup: %s Data: %s Hora: %s", $bkpInfo["cfg_descricao"], $bkpInfo["data"], $bkpInfo["hora"]), __FUNCTION__);
}
foreach ($bkpFile as $userField => $arFils) {
$query = "INSERT INTO pbx_backup_arquivos(cfg_id, bkp_id, arq_nome, arq_size, arq_destino, uniqueid,arq_hash)VALUES(%s,%s,%s,%s,%s,%s,%s)\n";
$uniqueId = isset($configDestinoUid[$userField]) ? $configDestinoUid[$userField] : "null";
$query = sprintf($query, QuotedStr($bkpInfo["cfg_id"]), QuotedStr($bkp_id), QuotedStr($arFils["origem"]), QuotedStr($arFils["size"]), QuotedStr($arFils["destino"]), QuotedStr($uniqueId), QuotedStr($arFils["hash"]));
$result = pg_query($db, $query);
if (!$result) {
break;
}
}
if (!$result) {
Excpt("Erro ao registrar os arquivos do backup", __FUNCTION__, "Cmd-> " . $query . "Erro->" .
ErrorGetLast());
}
}
if ($result) {
$result = pg_query($db, 'commit');
}
if (!$result) {
Excpt("N<EFBFBD>o foi possivel concluir a transa??o!", __FUNCTION__, "Cmd-> " . $query . "Erro->" .
ErrorGetLast());
}
logBkp(sprintf("O backup: %s foi registrado com sucesso!", $bkpInfo["cfg_descricao"]), true, false);
} catch (Exception $e) {
@pg_query($db, 'rollback');
logBkp($e->getMessage(), true, false);
}
}
function GetBkpFiles($cfg_id, $hora, $type, BackupConfig $bkpConfig) {
global $configDestinoUid, $dataAtualBD;
$isManual = $bkpConfig->isManual;
$dataManual = $bkpConfig->data;
$listFiles = array();
$base_bkp = $isManual ? BACKUP_PATH_BASE_MANUAL : BACKUP_PATH_BASE;
if (!file_exists($base_bkp)) {
$cmd = "mkdir -p $base_bkp";
system($cmd);
if (!file_exists($base_bkp)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel criar o diret<EFBFBD>rio base! Msg: $cmd", __FUNCTION__);
}
}
$baseLocalAudio = BACKUP_PATH_AUDIO;
$fileSqlDados = sprintf("bkp_dados_%s_%s_%s.sql", $cfg_id, $hora, Date('dmY_H'));
$fileDadosComp = sprintf("bkp_dados_%s_%s_%s.tar.gz", $cfg_id, $hora, Date('dmY_H'));
$fileConfig = sprintf("bkp_config_%s_%s_%s.tar.gz", $cfg_id, $hora, Date('dmY_H'));
$cmdTarConfig = sprintf("tar -czf %s%s /etc/asterisk/* /etc/dahdi/* /var/lib/asterisk/*", $base_bkp, $fileConfig);
$cmdDatabase = sprintf("pg_dump pbx > %s%s", $base_bkp, $fileSqlDados);
$cmdTarDatabase = sprintf("tar -czf %s%s -C %s %s", $base_bkp, $fileDadosComp, $base_bkp, $fileSqlDados);
if ($type == BKP_TIPO_AUDIO) {
if ($isManual) {
$dataAtualBD = $dataManual;
}
$query = "select userfield, uniqueid from pbx_bilhetes a where data_bilhete = '$dataAtualBD'\n";
if ($bkpConfig->isDiferencial) {
$query .= "and not exists(select '' from pbx_backup_arquivos where uniqueid = a.uniqueid and cfg_id = '$cfg_id')\n";
}
$query .= "and coalesce(trim(userfield), '') <> ''\n";
$result = pg_query($query);
if (!$result) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel listar os arquivos de backup", __FUNCTION__);
}
if (!pg_num_rows($result)) {
logBkp("N<EFBFBD>o existem arquivos para realizar o backup.");
return false;
}
while ($row = pg_fetch_row($result)) {
if (file_exists($baseLocalAudio . $row[0])) {
$listFiles[$row[0]] = $baseLocalAudio . $row[0];
$configDestinoUid[$row[0]] = $row[1];
}
}
} else {
if (($type == BKP_TIPO_CONFIG_DADOS) || ($type == BKP_TIPO_DADOS)) {
/*
* Dump da base de dados.
*/
$ret = '';
//system($cmdDatabase, $ret);
$ret = ExecutaComando($cmdDatabase);
$arquivoSqlBackup = $base_bkp . $fileSqlDados;
if (!file_exists($arquivoSqlBackup)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel fazer o dump da base de dados! Msg: $ret cmd: $cmdDatabase", __FUNCTION__);
}
/*
* Compacta o dump.
*/
$ret = '';
system($cmdTarDatabase, $ret);
$arquivoSqlComp = $base_bkp . $fileDadosComp;
if (!file_exists($arquivoSqlComp)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel compactar o dump da base de dados! Msg: $ret", __FUNCTION__);
}
$hash = hash_file("sha1", $arquivoSqlComp);
$listFiles[$fileDadosComp] = array('file' => $arquivoSqlComp, 'hash' => $hash);
/*
* Exclui o dump sql.
*/
@unlink($arquivoSqlBackup);
}
if (($type == BKP_TIPO_CONFIG_DADOS) || ($type == BKP_TIPO_CONFIG)) {
/*
* Compacta os arquivos de configura??o.
*/
$ret = '';
system($cmdTarConfig, $ret);
$arquivoConfigBackup = $base_bkp . $fileConfig;
if (!file_exists($arquivoConfigBackup)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel compactar os aquivos de configura<EFBFBD><EFBFBD>o! Msg: $ret", __FUNCTION__);
}
$hash = hash_file("sha1", $arquivoConfigBackup);
$listFiles[$fileConfig] = array('file' => $arquivoConfigBackup, 'hash' => $hash);
}
}
return $listFiles;
}
function ApagaBkp($db) {
$nomeFile = '';
/*
* Armazena os backups apagados.
*/
$bkp = array();
$query = " SELECT a.arq_nome, c.cfg_descricao, b.bkp_data, c.tp_id, b.bkp_id
FROM pbx_backup_arquivos a, pbx_backup b, pbx_backup_configuracao c
WHERE b.bkp_id = a.bkp_id
AND c.cfg_id = b.cfg_id
AND b.bkp_status = 2
AND c.tp_id <> 1";
$result = pg_query($db, $query);
if (!$result) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel listar os arquivos a serem excluidos!", __FUNCTION__);
}
while ($dados = pg_fetch_array($result)) {
$nomeFile = trim($dados["arq_nome"]);
@unlink($nomeFile);
$bkp[$dados["bkp_id"]] = 1;
}
$erroMsg = array();
foreach ($bkp as $key => $value) {
$query = "update pbx_backup set bkp_status = '3' where bkp_id = '$key'";
$result = pg_query($db, $query);
if (!$result) {
$erro = error_get_last();
$erroMsg[] = ($query . "Erro: " . $erro["message"] . "\n");
}
}
if ($erroMsg) {
Excpt(implode($erroMsg), __FUNCTION__);
}
}
function ApagaBkpTmp($db) {
$nomeFile = '';
/*
* Armazena os backups apagados.
*/
$bkp = array();
$query = "SELECT a.arq_nome, c.cfg_descricao, b.bkp_data, c.tp_id, b.bkp_id
FROM pbx_backup_arquivos a, pbx_backup b, pbx_backup_configuracao c
WHERE b.bkp_id = a.bkp_id
AND c.cfg_id = b.cfg_id
AND b.bkp_status NOT IN(2,3)
AND c.tp_id <> 1
AND (now()::DATE - b.bkp_data) >= c.cfg_deleta_antigo
AND c.cfg_deleta_antigo > 0";
$result = pg_query($db, $query);
if (!$result) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel listar os arquivos a serem excluidos!", __FUNCTION__);
}
while ($dados = pg_fetch_array($result)) {
$nomeFile = trim($dados["arq_nome"]);
if (file_exists($nomeFile)) {
@unlink($nomeFile);
}
$bkp[$dados["bkp_id"]] = 1;
}
$erroMsg = array();
foreach ($bkp as $key => $value) {
$query = "update pbx_backup set bkp_status = '4' where bkp_id = '$key'";
$result = pg_query($db, $query);
if (!$result) {
$erro = error_get_last();
$erroMsg[] = ($query . "Erro: " . $erro["message"] . "\n");
}
}
if ($erroMsg) {
Excpt(implode($erroMsg), __FUNCTION__);
}
}
function GetDataServer($soma = 0, $fmt = '') {
$data = new CalcDataHora();
if ($soma) {
$data->somaDia($soma);
}
return $data->getData($fmt);
}
function GetDataHoraServer($soma = 0, $fmt = '') {
$data = new CalcDataHora();
if ($soma) {
$data->somaDia($soma);
}
return $data->getDataHora($fmt);
}
function GetParamEmail($db) {
$query = "SELECT wkf_smtp, wkf_smtp_port, wkf_smtp_user, wkf_smtp_senha FROM pbx_workflow_parametros";
$result = @pg_query($db, $query);
$row = pg_fetch_array($result);
return $row;
}
function EnviaEmail($db, $bkpInfo, $alerta = false) {
global $wkfParam, $isManual;
if ($isManual) {
return true;
}
$query = sprintf("SELECT cfg_email FROM pbx_backup_configuracao WHERE cfg_id = '%s'", $bkpInfo['cfg_id']);
$result = pg_query($db, $query);
if (!pg_num_rows($result)) {
Excpt("N<EFBFBD>o existem emails configurados para este backup!", __FUNCTION__);
}
$row = pg_fetch_row($result);
$mail = trim($row[0]);
if (!$mail) {
Excpt("N<EFBFBD>o existem emails configurados para este backup!", __FUNCTION__);
}
$emails = preg_split('/[\,,;]/', $mail);
if (!$wkfParam) {
$wkfParam = GetParamEmail($db);
}
$body = GetBody($db, $bkpInfo, $alerta);
if (!$body) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel carregar o corpo do email!", __FUNCTION__);
}
$dataEnvio = date('d/m/Y');
foreach ($emails as $email) {
$emailNome = '';
/*
* Carrega parametros para o array:
* $wkfParam[ wkf_smtp,
* wkf_smtp_user, wkf_smtp_senha, wkf_smtp_port, wkf_smtp_requer_aut]
*/
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = $wkfParam["wkf_smtp"];
$mail->Port = $wkfParam["wkf_smtp_port"];
$mail->SMTPAuth = $wkfParam["wkf_smtp_user"] != "";
if ($mail->SMTPAuth) {
/*
* Autentica??o smtp
*/
$mail->Username = $wkfParam["wkf_smtp_user"];
$mail->Password = $wkfParam["wkf_smtp_senha"];
}
$mail->From = $wkfParam["wkf_smtp_user"];
$mail->FromName = "Backup Simples IP";
if (!empty($emailNome)) {
$mail->AddAddress($email, $emailNome);
} else {
$mail->AddAddress($email);
}
$mail->AddCC($wkfParam["wkf_smtp_user"], 'WorkFlow');
$mail->IsHTML(true);
$mail->CharSet = 'iso-8859-1';
$mail->Subject = "Registro de Backup";
/*
* Adciona imagens do html
*/
$mail->AddEmbeddedImage("/var/www/html/aplicativo/img/miniLogo.gif", "miniLogo");
$mail->Body = $body;
$mail->AltBody = $body;
$enviado = $mail->Send();
$mail->ClearAllRecipients();
$erro = $mail->ErrorInfo;
if (!$enviado) {
$msg = "Email: $email n?o pode ser enviado Data Envio: $dataEnvio!";
Excpt($msg, "EnviaEmail", $erro);
}
$msg = "Email: $email enviado com sucesso! Data Envio: $dataEnvio\n";
logBkp($msg);
}
return true;
}
function GetBody($db, $bkpInfo, $alerta) {
global $origem;
$filename = "/var/lib/asterisk/scripts/backup/backup.htm";
$arq = file_get_contents($filename);
/*
* Verifica se conseguiu carregar o arquivo para compor a mensagem html a ser enviada.
*/
if (empty($arq)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel carregar o template do email!", __FUNCTION__);
};
$query = sprintf("SELECT a.cfg_descricao, b.dst_nome, b.dst_host, b.dst_diretorio_remoto, c.prt_descricao, d.tp_desc,
b.prt_id
FROM pbx_backup_configuracao a, pbx_backup_destino b, pbx_backup_protocolo c, pbx_backup_tipo d
WHERE b.dst_id = a.dst_id
AND c.prt_id = b.prt_id
AND d.tp_id = a.tp_id
AND a.cfg_id = '%s'", $bkpInfo['cfg_id']);
$result = @pg_query($db, $query);
/*
* Verifica se a consulta foi executada com sucesso.
*/
if (!$result) {
Excpt("Erro carregar as informa??es de configura??o do backup! Cmd: $query", __FUNCTION__, ErrorGetLast());
};
/*
* Verifica se existem informa??es sobre o backup informado.
*/
if (!pg_num_rows($result)) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel carregar as informa??es de configura??o! Cmd: $query", __FUNCTION__);
};
$row = pg_fetch_array($result);
$info = array();
$info["origem"] = $origem;
$info["cfg_descricao"] = $row["cfg_descricao"];
$info["data"] = $bkpInfo["data"];
$info["hora"] = $bkpInfo["hora"];
$info["prt_descricao"] = $row["prt_descricao"];
$info["dst_descricao"] = ($row["prt_id"] == PROTO_LOCAL) ? "Local" : sprintf("[%s][%s][%s]", $row["dst_nome"], $row["dst_host"], $row["dst_diretorio_remoto"]);
$info["bkp_tamanho"] = $bkpInfo["bkp_tamanho"] . "(b)";
$info["tp_desc"] = $row["tp_desc"];
$msg = trim($bkpInfo["log"]);
if (!$msg) {
$msg = trim($bkpInfo["realLog"]);
}
if ($alerta) {
if (!$msg) {
$info["msg"] = "Erro ao realizar o backup!";
} else {
$info["msg"] = "Erro: $msg";
}
} else {
$info["msg"] = "Backup conclu?do com sucesso!";
}
foreach ($info as $key => $value) {
$arq = str_replace('{' . $key . '}', $value, $arq);
}
return $arq;
}
function ExecutaComando($comando) {
$query = "SELECT usuario_servidor, senha_servidor, porta_servidor FROM pbx_conf_padrao";
$result = pg_query($query);
$dados = pg_fetch_array($result);
$usuario_servidor = $dados['usuario_servidor'];
$senha_servidor = $dados['senha_servidor'];
$porta_servidor = $dados['porta_servidor'];
//endereco do servidor onde ser? executado o comando
$ssh = new Net_SSH2('127.0.0.1', $porta_servidor);
if (!$ssh->login($usuario_servidor, $senha_servidor)) {
return false;
}
logBkp("Iniciando dump da base de dados");
return $ssh->exec($comando);
}