Automoatizar backup no pfSense

Publicado por Daniel Barcelini em 26/04/2011

[ Hits: 18.500 ]

 


Automoatizar backup no pfSense



Bom, vou postar um pequeno script, quase que na verdade um comando que fiz para realizar backup do meus servidores pfSense, pois antes tinha que entrar 1 a 1 para realizar, a ideia é fazer que o wget realize esse backup automático após inseri-lo no cron de outra máquina, ou seja, o wget faz o que faríamos manualmente ele conecta no endereço do pfSense, vai na página de backup e efetua um post solicitando nesse caso um backup total e gera um arquivo xml com as configurações do pfSense.

wget --output-document="/diretorio/config-gwx-$(date +%F-%X).xml" --http-user='adm' --http- passwd='xxx' --no-check-certificate --post-data "backuparea=&Submit=download" https://192.169.2.2/diag_backup.php

Vamos a uma breve explicação
  • --output-document - diretório e nome do arquivo onde vai ser gravado o arquivo xml com o backup.
  • --http-user - usuário para autenticar no pfsense.
  • --http-passwd - senha do usuário do pfsense.
  • --no-check-certificate - para não checar o certificado pois não disponho de uma CA para validar o certificado.
  • --post-data - os dados que são para ele passar junto a url do pfsense, nesse caso ele passa o backuparea como null, ou seja, backup total do pfsense, ele tem outras opção que poderiam ser passadas como "aliases","shaper", "filter", "nat", "pptpd", "ipsec", "captiveportal", "installedpackages", "interfaces", "dhcpd", "syslog", "system", passando alguma dessas opções ele realiza somente backup dessa parte.
  • https://192.169.2.2/diag_backup.php - e esse eh o endereço onde se escreve 192.169.2.2 seria o endereço do seu servidor.

P.S.: No arquivo a ser salvo ele ira gerar um arquivo com a data no formato AA/MM/DD-HH:MM:SS devido ao comando $(date +%F-%X).

Para automatizar:

# crontab -e

E adicione no final, para realizar o backup todo dia as 18:00 horas:

0 18 * * * /diretório/wget.sh

No meu caso como optei para colocar em um arquivo e dentro contém senha, trabalhei também a questão de segurança deixando acesso somente para o root ao arquivo.

# chmod 700 /diretório/wget.sh

No meu exemplo, o arquivo que criei com o comando foi o wget.sh contendo como abaixo:

#!/bin/bash

wget --output-document="/diretorio/config-gwx-$(date +%F-%X).xml" --http-user='adm' --http- passwd='xxx' --no-check-certificate --post-data "backuparea=&Submit=download" https://192.169.2.2/diag_backup.php

A ideia dessa dica foi simplesmente divulgar uma necessidade que tinha, e consegui resolver dessa forma, deve se ter outras formas e pode-se também aumentar a complexidade do comando para atender melhor as necessidades de cada um.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Grep - Procurando por conteúdo em arquivos

Acompanhando o (bash) shell script - debug

Selecionando registros de um arquivo texto com o awk

Lógica booleana com o test

Backup em fita DLT: Selecionando diretórios através de arquivos de parâmetros

  

Comentários
[1] Comentário enviado por pakitao em 25/05/2012 - 17:56h

Boa tarde, essa parte de backup da configuração é mesmo mto chata no pfsense. Vou testar aki e digo se funcionou.

Att,

[2] Comentário enviado por pakitao em 23/07/2012 - 12:27h

Bom comigo não funcionou, quando vou fazer o teste pra verificar a funcionalidade do script, aparentemente ele baixa algum arquivo, aparece isso:
http://img811.imageshack.us/img811/1040/print01mi.png

Porém quando vou acessar o diretório onde ele deveria salvar os arquivos aparecem os arquivos baixados manualmente, e mais esses com nomeação estranhas:
http://img259.imageshack.us/img259/1787/print02.png

O que pode ser?

Segue o script:
#!/bin/bash
wget --output-document="/mnt/arquivos/ti/Backup-Firewall/config-firewall.coren-$(date +%F-%X).xml" --http-user="admin" --http-passwd="xxxx" --no-check-certificate --post-data "backuparea=&Submit=download" http://172.16.10.1/diag_backup.php

Este é o conteúdo dos arquivos que ele baixou, aparentemente é nada mais, nada menos, que a tela de login.

Detalhe, meu pfsense é a versão 2.0.1


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html>
<head>
<script type="text/javascript" src="/javascript/scriptaculous/prototype.js"></script>
<script type="text/javascript" src="/javascript/scriptaculous/scriptaculous.js"></script>
<script>document.observe('dom:loaded', function() { $('usernamefld').focus(); });</script>

<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="shortcut icon" href="/themes/pfsense_ng/images/icons/favicon.ico" />
<link rel="stylesheet" type="text/css" href="/themes/pfsense_ng/login.css" media="all" />
<script type="text/javascript">
<!--
function page_load() {}
function clearError() {
if($('inputerrors'))
$('inputerrors').innerHTML='';
}

var input_errors = '';
Event.observe(window, 'load', init, false);

var noAjaxOnSubmit = false;

function init() {
if($('submit') && ! noAjaxOnSubmit) {
// debugging helper
//alert('adding observe event for submit button');

Event.observe("submit", "click", submit_form, false);
$('submit').onclick = function() {return false;};
var to_insert = "<div style='visibility:hidden' id='loading' name='loading'><img src='/themes/pfsense_ng/images/misc/loader.gif' \/><\/div>";
new Insertion.Before('submit', to_insert);
}
}

function submit_form(e){
// debugging helper
//alert(Form.serialize($('iform')));

if($('inputerrors'))
$('inputerrors').innerHTML = '<center><b><i>Loading...</i></b></center>';

/* dsh: Introduced because pkg_edit tries to set some hidden fields
* if executing submit's onclick event. The click gets deleted
* by Ajax. Hence using onkeydown instead.
*/
if($('submit') && $('submit').onkeydown)
$('submit').onkeydown();
if($('submit'))
$('submit').style.visibility = 'hidden';
if($('cancelbutton'))
$('cancelbutton').style.visibility = 'hidden';
$('loading').style.visibility = 'visible';
// submit the form using Ajax
}

function formSubmitted(resp) {
var responseText = resp.responseText;

// debugging helper
// alert(responseText);

if(responseText.indexOf('html') > 0) {
/* somehow we have been fed an html page! */
//alert('Somehow we have been fed an html page! Forwarding to /.');
document.location.href = '/';
}

eval(responseText);
}

/* this function will be called if an HTTP error will be triggered */
function formFailure(resp) {
showajaxmessage(resp.responseText);
if($('submit'))
$('submit').style.visibility = 'visible';
if($('cancelbutton'))
$('cancelbutton').style.visibility = 'visible';
if($('loading'))
$('loading').style.visibility = 'hidden';

}

function showajaxmessage(message) {
var message_html;

if (message == '') {
NiftyCheck();
Rounded("div#redbox","all","#FFF","#990000","smooth");
Rounded("td#blackbox","all","#FFF","#000000","smooth");

if($('submit'))
$('submit').style.visibility = 'visible';
if($('cancelbutton'))
$('cancelbutton').style.visibility = 'visible';
if($('loading'))
$('loading').style.visibility = 'hidden';

return;
}

message_html = '<table height="32" width="100%"><tr><td>';
message_html += '<div style="background-color:#990000" id="redbox">';
message_html += '<table width="100%"><tr><td width="8%">';
message_html += '<img style="vertical-align:center" src="/themes/pfsense_ng/images/icons/icon_exclam.gif" width="28" height="32" \/>';
message_html += '<\/td><td width="70%"><font color="white">';
message_html += '<b>' + message + '<\/b><\/font><\/td>';

if(message.indexOf('apply') > 0) {
message_html += '<td>';
message_html += '<input name="apply" type="submit" class="formbtn" id="apply" value="Apply changes" \/>';
message_html += '<\/td>';
}

message_html += '<\/tr><\/table><\/div><\/td><\/table><br \/>';
$('inputerrors').innerHTML = message_html;

NiftyCheck();
Rounded("div#redbox","all","#FFF","#990000","smooth");
Rounded("td#blackbox","all","#FFF","#000000","smooth");

if($('submit'))
$('submit').style.visibility = 'visible';
if($('cancelbutton'))
$('cancelbutton').style.visibility = 'visible';
if($('loading'))
$('loading').style.visibility = 'hidden';
if($('inputerrors'))
window.scrollTo(0, 0);
}
//-->
</script>
<script type="text/javascript" src="/themes/pfsense_ng/javascript/niftyjsCode.js"></script>
</head>
<body onload="page_load()">
<div id="login">
<form id="iform" name="login_iform" method="post" action="/diag_backup.php">
<h1></h1>
<div id="inputerrors"></div>
<p>
<span style="text-align:left">
Username:<br>
<input onclick="clearError();" onchange="clearError();" id="usernamefld" type="text" name="usernamefld" class="formfld user" tabindex="1" />
</span>
</p>
<br>
<p>
<span style="text-align:left">
Password: <br>
<input onclick="clearError();" onchange="clearError();" id="passwordfld" type="password" name="passwordfld" class="formfld pwd" tabindex="2" />
</span>
</p>
<br>
<p>
<span style="text-align:center; font-weight: normal ; font-style: italic">
Enter username and password to login. </span>
</p>
<p>
<span style="text-align:center">
<input type="submit" name="login" class="formbtn" value="Login" tabindex="3" />
</span>
</P>
</form>
</div>
</body>
</html>

[3] Comentário enviado por langhinoni em 25/01/2013 - 10:13h

Fala Galera,

Segue o código funcionando, só alterar os parâmetros de usuário e senha e o IP do firewall.


wget -qO/dev/null --keep-session-cookies --save-cookies cookies.txt --post-data 'login=Login&usernamefld=LOGIN&passwordfld=SENHA' --no-check-certificate http://IPFIREWALL/diag_backup.php
wget --keep-session-cookies --load-cookies cookies.txt --post-data 'Submit=download&donotbackuprrd=yes' http://IPFIREWALL/diag_backup.php --no-check-certificate -O BKP-PFSENSE-`date +%d-%m-%Y`.xml

Att. Lucas

[4] Comentário enviado por mckatoo em 06/07/2013 - 12:40h

Olá. Gostaria de saber como indicar somente uma área para fazer backup, como por exemplo a 'aliases', e não um backup full do sistema.

Obrigado,

Milton Carlos Katoo.

[5] Comentário enviado por Tacioandrade em 11/11/2013 - 15:55h


[3] Comentário enviado por langhinoni em 25/01/2013 - 10:13h:

Fala Galera,

Segue o código funcionando, só alterar os parâmetros de usuário e senha e o IP do firewall.


wget -qO/dev/null --keep-session-cookies --save-cookies cookies.txt --post-data 'login=Login&usernamefld=LOGIN&passwordfld=SENHA' --no-check-certificate http://IPFIREWALL/diag_backup.php
wget --keep-session-cookies --load-cookies cookies.txt --post-data 'Submit=download&donotbackuprrd=yes' http://IPFIREWALL/diag_backup.php --no-check-certificate -O BKP-PFSENSE-`date +%d-%m-%Y`.xml

Att. Lucas


Cara o seu não estava funcionando, porem descobri o porque, no lugar de http://IPFIREWALL coloquei https://IPFIREWALL e funcionou 100%.

#!/bin/bash
wget -qO/dev/null --keep-session-cookies --save-cookies cookies.txt --post-data 'login=Login&usernamefld=admin&passwordfld=SENHA' --no-check-certificate https://192.168.1.1/diag_backup.php
wget --keep-session-cookies --load-cookies cookies.txt --post-data 'Submit=download&donotbackuprrd=yes' https://192.168.1.1/diag_backup.php --no-check-certificate -O PfSense-`date +%d-%m-%Y`.xml

Boa sorte para todo mundo que for usar esse script. =D

[6] Comentário enviado por FeredirDur em 14/09/2015 - 14:08h


Olá meu script ficou assim:

echo "Iniciando o Backup"

wget --output-document="/root/bkp_pfsense/bkp_pfsense_adm/config-fw-adm-$(date +%Y-%m-%d).xml" --http-user='admin' --http-passwd='xxxxx' --no-check-certificate --post-data "backuparea=&Submit=download" https://10.246.1.254:50025/diag_backup.php


Porém na hora de executar acontece esse erro (Unable to establish SSl connection) e ele gera o arquivo .xml vazio.
http://prntscr.com/8gafp3

Sabem qual pode ser o problema?
Obrigado

[7] Comentário enviado por lucastavarestga em 01/02/2016 - 10:34h

Pessoal,

Também utilizo um script parecido.

Notei que a partir da versão 2.2.6 do Pfsense, parou de puxar meus backups de XML, segue o link com as modificações:

https://doc.pfsense.org/index.php/Remote_Config_Backup

Um abraço a todos, espero ter contribuído.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts