Friday, May 9, 2008

Backup

A alguns anos fiz um sistema de backups em ShellScript e hoje configurei ele num servidor novo, e reparei como ele tem sido útil e tem resultado muito bem, resolvi partilhar.

Criar as pastas:

# mkdir /backup
# mkdir /backup/log


Criar os seguintes arquivos:

# touch /backup/backup
# touch /backup/backup.start
# touch /backup/backup.end
# touch /backup/directory
# touch /backup/run


Dar permissões de execução:

# chmod +x /backup/backup
# chmod +x /backup/backup.start
# chmod +x /backup/backup.end
# chmod +x /backup/run


Os backups diários serão guardados dentro da pasta /backup/daily. E os mensais sempre no dia 1 serão guardados dentro da pasta /backup/monthly. Não é preciso criar estas pastas, elas são criadas automaticamente.

Colar este conteúdo no arquivo /backup/backup:

#!/bin/bash
echo ""
echo -e "\e[40;32;1m Backup \e[0m"
echo ""
echo -e "\e[44;33;1m Start \e[0m"
echo ""
dir1="/backup"
dir2=$1
echo -ne "\e[34;1mcomand.begin\e[0m \e[32mstart\e[0m \e[30;5m...\e[0m"
$dir1/backup.start
echo -e "\e[31;1m end \e[0m"
echo ""
dateDay=`date "+%d"`
dateMonth=`date "+%m"`
dateYear=`date "+%Y"`
folder1=$dir1/daily/$dateDay
folder2=$dir2/daily/$dateDay
echo -ne "\e[34;1mWork Folder\e[0m $folder1 \e[32mstart\e[0m \e[30;5m...\e[0m"
rm -dfr $folder1
mkdir -p $folder1
echo -e "\e[31;1m end \e[0m"
echo ""
if [[ $dir2 != "" ]]; then
echo -ne "\e[34;1mWork Folder\e[0m $folder2 \e[32mstart\e[0m \e[30;5m...\e[0m"
rm -dfr $folder2
mkdir -p $folder2
echo -e "\e[31;1m end \e[0m"
echo ""
fi
echo -e "\e[40;31;1m BACKUP: directory \e[0m"
echo " |"
_x=0
_to=""
for i in `cat /backup/directory`; do
if [ $_x = 0 ]; then
_to=$folder1/$i.tar.gz
echo -ne " | $i \e[32mstart\e[0m \e[30;5m...\e[0m"
_x=1
else
tar -czPf $_to $i
if [[ $dir2 != "" ]]; then
cp -rf $_to $folder2
fi
echo -e "\e[31;1m end \e[0m"
_x=0
fi
done
echo " |____________________________________________________"
echo ""
echo -ne "\e[34;1mcomand.end\e[0m \e[32mstart\e[0m \e[30;5m...\e[0m"
$dir1/backup.end $folder1
echo -e "\e[31;1m end \e[0m"
if [ $dateDay = 01 ]; then
folderMonthly1=$dir1/monthly/$dateYear.$dateMonth.$dateDay
echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly1 \e[32mstart\e[0m \e[30;5m...\e[0m"
mkdir -p $folderMonthly1
cp -rf $folder1 $folderMonthly1
echo -e "\e[31;1m end \e[0m"
if [[ $dir2 != "" ]]; then
folderMonthly2=$dir2/monthly/$dateYear.$dateMonth.$dateDay
echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly2 \e[32mstart\e[0m \e[30;5m...\e[0m"
mkdir -p $folderMonthly2
cp -rf $folder2 $folderMonthly2
fi
echo ""
fi
echo ""
echo -e "\e[44;33;1m End \e[0m"
echo ""
echo -e "\e[40;32;1m by eduveks \e[0m"
echo ""


O arquivo /backup/run é o que inicia o backup e grava o output no arquivo de log, colocar o seguinte conteúdo:


#!/bin/bash
logFileName=`date "+%Y-%m-%d_%H-%M-%S"`
/backup/backup "/mnt/backupmirror" > /backup/log/$logFileName


Atenção ao "/mnt/backupmirror/backup", esta opção é para fazer uma cópia do backup para outra pasta, no meu caso sempre uso um servidor secundário para ter um espelho do backup original, e esta pasta é uma pasta montada remotamente ao outro servidor.

Os arquivos /backup/backup.start e /backup/backup.end, servem para poder colocar comandos para serem executados antes e depois do backup respectivamente, por exemplo para fazer o mount e o umount de uma partilha remota, preparando o cenário da cópia secundária. Ou ainda para parar serviços e reinicia-los no fim, por exemplo para o MySql antes de começar o backup e no fim voltar a inicializa-lo. Gravar nestes arquivos o conteúdo:


#!/bin/bash


Finalmente o arquivo /backup/directory serve para dizer as pastas que deverá ser feito backup, adicionar aqui o nome que vai ter o arquivo.tar.gz e qual a pasta que vai ser armazenada neste arquivo, no seguinte formato:


DB_NAME     /var/lib/mysql/DB_NAME
USER1       /home/USER1


Depois de tudo afinado vamos executar o backup, assim podemos ver o output:

# /backup/backup


Se tudo correu bem, o backup deverá estar em:

# /backup/daily/01/DB_NAME.tar.gz
# /backup/daily/01/USER1.tar.gz


Onde o "01" é o número do dia do mês atual.

Assim a cada dia haverá uma pasta com os backups deste dia, e no dia 1 de cada mês, o backup deste dia estará em:

# /backup/monthly/2008.05.01/01/DB_NAME.tar.gz
# /backup/monthly/2008.05.01/01/USER1.tar.gz


E executar o backup passando uma pasta para ser o espelho do backup:

# /backup/backup /tmp


Poderá reparar que também dentro do /tmp passará a ter o conteúdo do backup.

Feito o teste, voltar a ver como esta o /backup/run, verificar se esta tudo certo, e testa-lo:

# /backup/run


Dentro da pasta /backup/log deverá ter o log do backup:

# cd /backup/log
# ls
# cat 2008-05-01_11-51-53


Agora só falta configurar no crond para executar o backup, criar um arquivo no /etc/cron.daily/backup, com o seguinte conteúdo:


#!/bin/sh
/backup/run


Pronto, agora o backup irá ser executado todos os dias, e assim temos uma solução bem simples e prática para fazer backups...

Wednesday, May 7, 2008

Ubuntu 8.04 vs RaLink RT2561/RT61

Após uma longa batalha, finalmente posso desfrutar do prazer do wireless :P

Tentei durante alguns dias configurar a rede wireless, por duas vezes consegui, mas não ficou bom, e depois parou de funcionar.

O problema era que conseguia conectar, e até o ping funcionava mas muitooo lento, com 200ms, e as vezes não funcionava, e depois por mais que insistisse o DNS não funcionava e não consegui que algum site abrisse, mesmo o site do router, então começei a fazer buscas frenéticas atrás da solução, medidas de desespero.

Para começar verifique o modelo da tua placa:

$ lspci | grep RaLink
02:09.0 Network controller: RaLink RT2561/RT61 rev B 802.11g

Primeiro tentei desta forma, utilizando os drivers do Windows:

http://i-eat-noobs.blogspot.com/2007/08/get-wireless-working-in-ubuntu-704.html

http://www.ralinktech.com/ralink/Home/Support/Windows.html

Usei o PCI/mPCI/CB(RT256x/RT266x), mas como diz a descrição ao lado, vem o drive da RT61 para o Windows Vista, mesmo assim tentei, o cabextract, e o unshield e ainda com o wine, não consegui pegar o arquivo .inf que o ndiswrapper pede, por motivos de força maior deste jeito a coisa não vai e tive que ir atrás de outra solução.

Mais pesquisas, e descobri que muitos já tiveram este problema e indicavam que tinha a ver com o Driver mesmo:

http://ubuntuforums.org/showthread.php?t=550351

Além de muitos outros...

Então encontrei esta dica para instalar o driver para Linux oficial da RaLink:

http://ubuntuforums.org/showthread.php?p=4867439

http://www.ralinktech.com/ralink/Home/Support/Linux.html

Usei o RT2501PCI/mPCI/CB(RT61:RT2561/RT2561S/RT2661), a instalação não foi bem como diz na dica, foi quase, cosegui instalar e configurar, mas não consegui de nenhuma forma que funcionasse, ficou bem mais rápido as mensagens do ping mas sempre sem sucesso, e também o nm-applet não reconheceu mais o wireless, reparei que por mais que tentasse alterar a configuração da conexão, no iwconfig ficava sempre igual, nenhuma configuração era alterada. Comecei a ver que estava sem saída de novo...

Resolvi rever os passos, e se olhar melhorar para este link:

http://www.ralinktech.com/ralink/Home/Support/Linux.html

Tem lá em baixo... "The rt2x00 Open Source Project"... rt2x00 que porcaria é esta, resolvi clicar, tudo que precisava para ter esperança:

This project is a development effort to provide free, stable and feature rich Linux drivers for
wireless 802.11b/g/i cards based on the following Ralink chipsets: rt2400, rt2500, rt2570,
rt61 and rt73.


Em downloads fiz o download do "Last beta release: v1.1.0-b2", mas como tenho muita sorte, ao tentar compilar deu erro na compilação...

Agora só falta a última chama de esperança, o "CVS hourly tarball: rt61-CVS", o que correu muito bem, e mais simples impossível.

Fazer o download:

http://rt2x00.serialmonkey.com/rt61-cvs-daily.tar.gz

Extrair:
$ tar -xzf rt61-cvs-daily.tar.gz

No meu caso foi:
$ cd rt61-cvs-2008050721/Module

Dá para ver que o projeto não esta abandonado.

Compilar e instalar, com a conta do root:
# make && make install

Caso de erro na compilação deve ser que falta instalar o source da versão do kernel que esta sendo usado, ter atenção a isto, é preciso ter a source do kernel instalada.

Feito isto falta registrar o novo module:
# echo "rt61" >> /etc/modules

Também pode tentar um "modprobe rt61", mas convém fazer um: Reboot!

O nm-applet reconheceu o wireless, consegui conectar facilmente, logo de primeira a internet funcionou, e vim fazer este post com tudo fresquinho na cabeça, são agora 4:50 da manhã e seja o que Deus quiser amanhã no trabalho, ou melhor hoje :P

Usei a configuração manual, que na automática pediu a senha 2 vezes e ai cancelei e fui tentar no manual e funcionou muito bem com WEP (ASCII).

Também fui testar alguns sites mais pesado, e reparei que ficou muito mais rápido que no outro notebook com windows... muito rápido mesmo, demorou, custou, mas valeu a pena.

Próximo é passo configurar com WPA em vez de WEP...