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...

Sunday, April 20, 2008

DragonFlyBSD - Instalação de pacotes

Hoje começei a brincar com o DragonflyBSD, e até agora estou gostando, vários detalhes facilitados comparado a outros BSDs.

Mas depois de instalar e ao tentar usar o pkg_search, tive o seguinte erro:


No pkgsrc(7) tree found. Fetching pkg_summary(5) file.
fetch: http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/i386//All/pkg_summary.bz2: Not Found
fetch: http://pkgbox.dragonflybsd.org/packages/DragonFly-1.10.1/i386//All/pkg_summary.bz2: Not Found
Unable to fetch pkg_summary(5) file.


Tentei abrir estas URLs no browser mas também sem sucesso, então comecei a fuçar e descobri este site:

http://www.pkgsrc-box.org/

Que tem os packages do DragonflyBSD, então fuçando neste site descobri que aqui tem a lista dos packages:

http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/

E também o precioso pkg_summary.bz2:

http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/All/pkg_summary.bz2

E da versão 1.12 estão aqui:

http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/All/

Boa, mas agora como configurar para usar estas URLs em vez das que vem por default?! Procurei e procurei no /etc e nada, então resolvi arriscar e fiz:


vi /usr/bin/pkg_search


Boas notícias é um script mesmo e logo nas primeiras linhas estava a string com as preciosas URLs, é preciso dar permissões de escrita no arquivo:


chmod u+w /usr/bin/pkg_search


Mudei as linhas do PKGSRCBOX1 e do PKGSRCBOX2 para:


PKGSRCBOX1=http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/
PKGSRCBOX2=http://www.pkgsrc-box.org/packages/stable/DragonFly-1.10/


Depois foi só usar o pkg_search, o qual funcionou perfeitamente.


pkg_search nano


Para usar o pkg_add precisei passar a url completa do arquivo, as dependências são instaladas automaticamente se estiverem na mesma URL base:


pkg_add http://pkgbox.dragonflybsd.org/packages/DragonFly-1.12/stable/All/nano-2.0.7.tgz

Tuesday, April 8, 2008

LVM vs Mount

Se por acaso ao tentar montar uma partição no Linux e der com o seguinte erro:

mount: unknown filesystem type 'LVM2_member'

O problema é que as partições do disco foram registradas na LVM.

Minha distribuição é o OpenSuse 10.3, mas em princípio esta solução servirá para qualquer Linux.

Podemos ver a estrutura LVM com o comando:

# /sbin/pvs

PV VG Fmt Attr PSize PFree
/dev/sdb1 system lvm2 a- 5,86G 5,86G


Para mais detalhes:

# /sbin/pvscan

PV /dev/sdb1 VG system lvm2 [5,86 GB / 5,86 GB free]
Total: 1 [5,86 GB] / in use: 1 [5,86 GB] / in no VG: 0 [0 ]


Precisamos do VG Name, mais detalhes ainda:

# /sbin/pvdisplay /dev/sdb1

--- Physical volume ---
PV Name /dev/sdb1
VG Name system
PV Size 5,86 GB / not usable 3,73 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 1499
Free PE 1499
Allocated PE 0
PV UUID lPwtfx-5ocj-eXah-gqcX-1bCd-kcod-YN96is


Com o VG Name que no meu caso é "system".

Podemos agora remover o Volume Group:

# vgremove system

Volume group "system" successfully removed


Se voltar a fazer o pvs, pvscan ou pvdisplay, verificamos que o disco já não tem o VG Name (Volume Group Name).

Falta remover definitivamente a partição da LVM, com o seguinte comando:

# pvremove /dev/sdb1

Labels on physical volume "/dev/sdb1" successfully wiped


Se tentar montar a partição agora não vai ser possível, vai dar sempre esta mensagem, mesmo definindo o type:

# mount /dev/sdb1 /mnt/hd1

mount: you must specify the filesystem type


Então é preciso fazer um reboot, para que os dispositivos dos discos sejam recarregados:

# reboot

Depois do reboot verifique com o pvs, pvscan ou pvdisplay, para ter a certeza que a partição já não esta registrada.

Agora só falta montar a partição normalmente:

# mount /dev/sdb1 /mnt/hd1

Para mais informações veja a documentação:
http://tldp.org/HOWTO/LVM-HOWTO/

E para saber para que serve a LVM e mais informções:
http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)

Friday, March 28, 2008

Que tal uma sintaxe em Portugues?


IMPORTANTE: O conteúdo deste post é sempre atualizado para a última versão do CajuScript.


Exemplo de uma sintaxe em Português usando o CajuScript.

Faça o download do CajuScript.

Na mesma pasta em que esta o jar do CajuScript crie o arquivo "carregaSintaxePortugues.cj", com o seguinte conteúdo:

[CODE]
$java.util.regex

syntaxPT = org.cajuscript.Syntax()
syntaxPT.setIf(Pattern.compile("^[\\s+s|s]e\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))
syntaxPT.setElseIf(Pattern.compile("^[\\s+o|o]u\s+se\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))
syntaxPT.setElse(Pattern.compile("^[\\s+o|o]u\\s+senao\\s+fa[z\\s+|z]$"))
syntaxPT.setIfEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))
syntaxPT.setLoop(Pattern.compile("^[\\s+e|e]nquanto\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))
syntaxPT.setLoopEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))
syntaxPT.setTry(Pattern.compile("^[\\s+t|t]enta\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))
syntaxPT.setTryCatch(Pattern.compile("^[\\s+p|p]ega\\s+o\\s+err[o\\s+|o]$"))
syntaxPT.setTryFinally(Pattern.compile("^[\\s+f|f]inalment[e\\s+|e]$"))
syntaxPT.setTryEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))
syntaxPT.setFunction(Pattern.compile("^[\\s+f|f]uncao\\s*([\\s+|[\\s*\\(]].+)\\s*faz"))
syntaxPT.setFunctionEnd(Pattern.compile("^[\\s+f|f]i[m\\s+|m]$"))
syntaxPT.setNull(Pattern.compile("nulo"))
syntaxPT.setReturn(Pattern.compile("retorna"))
syntaxPT.setImport(Pattern.compile("importa\\s+"))
syntaxPT.setRootContext(Pattern.compile("raiz\\."))
syntaxPT.setContinue(Pattern.compile("continua"))
syntaxPT.setBreak(Pattern.compile("para"))
syntaxPT.setOperatorOr(Pattern.compile("[\\s+|)\\s*]ou[\\s+|(\\s*]"))
syntaxPT.setOperatorAnd(Pattern.compile("[\\s+|)\\s*]e[\\s+|(\\s*]"))

org.cajuscript.CajuScript.addGlobalSyntax("PT", syntaxPT)

$"exemploSintaxePortugues.cj"
[/CODE]

E também o arquivo "exemploSintaxePortugues.cj", com o seguinte conteúdo:

[CODE]
caju.syntax: PT

importa java.lang

// IF = SE
x = 10
se x < 10 e x > 0 faz
System.out.println("X menor que 10!")
ou se x > 10 e x ! 10 faz
System.out.println("X maior que 10!")
ou se x = 10 ou x ! 0 faz
System.out.println("X igual 10!")
ou senao faz
System.out.println("X menor que 1!")
fim

// LOOP = ENQUANTO
x = 0
enquanto x < 100 e x >= 0 faz
System.out.println(x)
x += 1
se x = 10 faz
para
ou senao faz
continua
fim
fim

// FUNCTION = FUNCAO
x = 5
funcao addWithX(v1, v2) faz
retorna raiz.x + v1 + v2
fim
x = addWithX(10, 20)
System.out.println("X = "+ x)

// TRY/CATCH = TENTA/PEGA
tenta e faz
"".substring(0, -1)
pega o erro
System.out.println("Erro: "+ e.getMessage())
finalmente
System.out.println("Finalmente...")
fim

System.out.println("\n\nSyntax em portugues executada com sucesso!\n")

Thread.sleep(10000)
[/CODE]

Agora é só executar com o comando:

[CODE]
java -jar cajuscript.jar carregaSintaxePortugues.cj
[/CODE]

Pronto! :P

Não convêm usar acentos na sintaxe, por que pode dar alguns problemas de encoding ao transportar o arquivo por vários sistemas operacionais, como do linux para o windows. Mas quem não arrisca não petisca.

Toda sugestão é bem vinda.

Saturday, February 23, 2008

Apache 2.2 - Modules

No Apache 2.2 resolveram mudar os nomes dos modulos, o que tem dado alguma dor de cabeça...

Lista da mudanças nos nomes dos modulos.

Se tiver o seguinte erro:

[CODE]

Starting httpd: httpd: Syntax error on line 170 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_access.so into server: /etc/httpd/modules/mod_access.so: cannot open shared object file: No such file or directory

[/CODE]

Segue a lista dos modulos corrigido:

[CODE]
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule asis_module modules/mod_asis.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule imagemap_module modules/mod_imagemap.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
[/CODE]

Fiz isto no CentOS 5.1, mas deve ajudar na configuração em outras distribuições.

Wednesday, February 13, 2008

Anaconda? Sucuri? Ou história de pescador?

Acho que toda gente já deve ter recebido algum e-mail falando sobre esta cobrinha:

E acompanha um texto do gênero:

[CODE]

Anaconda...
Sucuri em Barra do Piraí - RJ
VEJAM SÓ O TAMANHO DA
"BOQUINHA" DA CRIANÇA.


Acreditem, esta sucuri morreu eletrocutada na cerca elétrica
que separa a empresa Thyssen, em Barra do Piraí - RJ, de uma
fazenda vizinha.
O acontecimento parou a fábrica, e o dia inteiro
foi o maior entra e sai de biólogos do Rio e São Paulo,
para analisarem a cena que se tornou motivo de
preocupação para todos.

Será preciso rever conceitos sobre acampar e passar a noite às
margens de represa pescando.
Reparem no formato de sua barriga, que ela estava bem alimentada.
Segundo a turma da segurança da Thyssen e o pessoal da prefeitura
de Barra do Piraí, os órgãos responsáveis estão assustados,
pois este animal, segundo os especialistas, só vive na Amazônia e Pantanal.
É, os especialistas também se enganam.

[/CODE]

Como já tinha recebebido vários e-mails com estas imagens, e desta vez me chamou a atenção no título dizer "Anaconda" e no texto dizer "Sucuri", eu pensava que Anaconda e Sucuri fossem espécies diferentes, mas o wikipedia diz que Sucuri é uma espécie de Anaconda:
http://pt.wikipedia.org/wiki/Anaconda

Ok, boa, aprendi qualquer coisa, agora e o resto?

Joguei no Google: "sucuri morreu eletrocutada" e também "anaconda morreu eletrocutada"...

Aparece varios links, e comecei a ver o que diziam:

...cerca elétrica que separa a
empresa Thyssen, em Barra do Piraí - RJ...

Há foi daqui que o e-mail veio. -.-

...Fábrica da Votorantim em Resende (RJ), de uma fazenda vizinha próxima ao Rio Paraíba do Sul...
Opa afinal foi em Resende no Rio de Janeiro, só que na fábrica Votorantim! -.^

...Siderúrgica Thyssen, de Barra do Piraí (PR)...
Não não, foi na Siderúrgica Thyssen e foi na barra do Piraí mesmo... só que fica no Pará!?!?! o.O

E eu garanto que estas fotos foram tiradas lá me casa, num domingo de manhã quando faltou a luz fui no quintal e vi lá a cobra na cerca elétrica, tinha acabado de comer o meu cão, o problema é saber como ela conseguio entrar e depois não conseguio sair, e coitadinho do meu cão Fubá... :P

Mais um daqueles e-mails com informação bem informativa! As fotos impressionam, mas o texto... vai na volta até foi na Bolívia ou EUA...