Contribuição: Sistema de backup PHP
Bom dia amigos, depois de fazer vários testes com vários tipos de scripts, resolvi fazer o meu próprio sistema de download, ele conecta tanto via telnet como api, gera o backup, e depois faz o download do arquivo pra uma pasta específica...
Banco onde ficam os dados dos mikrotiks (ip/usuario/senha/etc...):
Código :
# --------------------------------------------------------
#
# Estrutura da tabela `contratosNAS`
#
CREATE TABLE `contratosNAS` (
`id` int(11) NOT NULL auto_increment,
`idNAS` int(11) NOT NULL,
`descricao` varchar(255) NOT NULL,
`identificacao` varchar(255) default NULL,
`ip` varchar(255) NOT NULL,
`usuario` varchar(255) NOT NULL,
`senha` varchar(255) NOT NULL,
`porta_web` varchar(255) NOT NULL,
`porta_api` varchar(255) NOT NULL,
`conexao` varchar(255) NOT NULL,
`tipo` varchar(255) NOT NULL,
`backup` int(11) default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
script php:
Código :
?php
echo "########## Início do backup: ".date("d/m/Y H:m:s")." ##########\n\n";
function dateDiff($sDataInicial, $sDataFinal){
$sDataI = explode("-", $sDataInicial);
$sDataF = explode("-", $sDataFinal);
$nDataInicial = mktime(0, 0, 0, $sDataI[1], $sDataI[0], $sDataI[2]);
$nDataFinal = mktime(0, 0, 0, $sDataF[1], $sDataF[0], $sDataF[2]);
return ($nDataInicial > $nDataFinal) ?
floor(($nDataInicial - $nDataFinal)/86400) : floor(($nDataFinal - $nDataInicial)/86400);
}
$host = "localhost";
$login_bd = "login";
$senha_bd = "senha";
$db = "banco";
$con = mysql_connect($host, $login_bd, $senha_bd) or print mysql_error();
mysql_select_db($db, $con) or print mysql_error();
require ('classeAPI.php');
require ('PHPTelnet.php');
// pegas NAS
$sqlMik = mysql_query("select ip,conexao,usuario,senha from contratosNAS where backup = '1'");
if(mysql_affected_rows($con)){
while($linha = mysql_fetch_array($sqlMik)){
// variáveis
$ip = $linha['ip'];
$usuario = $linha['usuario'];
$senha = $linha['senha'];
$arquivo = "Mikrotik - ".$linha['ip']." - ".date("d-m-Y - H:i")."";
if($linha['conexao'] == "api"){
//Gerar Backup usando API
$API = new routeros_api();
$API->debug = false;
if ($API->connect($ip, $usuario, $senha)){
$API->write('/system/backup/save',false);
$API->write('=name=Backup.backup');
$API->read();
$API->disconnect();
}
// conexão ftp
if ($conecta = ftp_connect($ip)){
// login
if(ftp_login($conecta, $usuario, $senha)){
// faz download e salva o arquivo
if (ftp_get($conecta, "dados/".$arquivo.".backup","Backup.backup", FTP_BINARY")){
}else{
die("Problemas com Backup, verificar !!!");
}
// fecha conexão ftp
ftp_close($conecta);
}else{
echo "Nao foi possível efetuar o login no NAS: ".$ip."";
}
}else{
echo "Sem conexão FTP ao NAS: ".$ip."";
}
}
if($linha['conexao'] == "telnet"){
//Gerar Backup usando TELNET
$telnet = new PHPTelnet();
$resultado = $telnet->Connect($ip, $usuario, $senha);
switch ($resultado){
case 0:
$telnet->DoCommand('/system backup save name=Backup', $resultado);
break;
}
$telnet->Disconnect();
sleep(1);
// conexão ftp
if ($conecta = ftp_connect($ip)){
// login
if(ftp_login($conecta, $usuario, $senha)){
// faz download e salva o arquivo
if (ftp_get($conecta, "dados/".$arquivo.".backup","Backup.backup", FTP_BINARY")){
}else{
die("Problemas com Backup, verificar !!!");
}
// fecha conexão ftp
ftp_close($conecta);
}else{
echo "Nao foi possível efetuar o login no NAS: ".$ip."";
}
}else{
echo "Sem conexão FTP ao NAS: ".$ip."";
}
}
echo date("d/m/Y H:m:s")." - Backup efetuado: ".$ip."\n";
sleep(1);
}
}
// fecha conexão sql
mysql_close($con);
//excluir arquivos antigos (maiores que 20 dias)
// path da sua pasta de origem
$pasta = "dados/";
//abre o diretorio
if(!$open = @opendir($pasta)) die('O diretório não é valido\n!');
echo "\n";
while(($nomearq = readdir($open)) !== false) {
if($nomearq == "." or $nomearq == "..") continue;
$explode = explode(" - ",$nomearq);
$dataArquivo = $explode[2];
$dataHoje = date("d-m-Y");
$contaDias = dateDiff($dataHoje,$dataArquivo);
if ($contaDias >= 20){
$linkArquivo = "$pasta"."$nomearq";
unlink($linkArquivo);
echo "Arquivo excluído: ".$nomearq."\n";
}
}
echo "\n########## Fim do backup: ".date("d/m/Y H:m:s")." ##########\n\n";
?>
podem agendar o arquivo pra executar todo dia, ou como quiserem:
Código :
#Backup Mikrotik
00 04 * * * pegaBackupMikrotik.php > /dev/null 2>&1
isso ae galera, não sou expert em programação, portanto pode ter algum erro ae, mas está funcionando certinho aqui, se alguem quiser modificar fique a vontade...só nao esqueça dos créditos...ehehhehe...abraços...t+
Corrigindo: lembrar de ativar a porta API e a porta Telnet, nos servidores que vc queira pegar o backup, e um dica, se observarem ele faz o backup apenas dos servidores que estão com o campo "backup" em 1, se estiver 0 passa direto e dar permissão de leitura e escrita na pasta backup pro usuario que vai executar o scritp,´acho q se rodar pela web, tem ser o usuário do apache, se rodar agendado acho q pro root, nao tenho ctz, e uma dica, criem um arquivo .htaccess pra proteger a pasta onde fica tudo isso ae, o script e os backups... :)...Funciona em qq versão do MIK...ok..flws