+ Responder ao Tópico



  1. #1

    Padrão 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
    Última edição por Mr_Dom; 03-08-2009 às 08:17.

  2. #2

    Padrão

    Muito bom, é isto que está faltando ultimamente no Fórum, novas idéias!!! Parabéns pela iniciativa, vamos testar.