Posts com Tags unix

Mensagens Diarias com o Fortune

Hoje vou falar sobre o Fortune, mas o que seria o fortune?  De acordo com o Man Page ” print a random, hopefully interesting, adage”  Imprimir algo interessante ao acaso, não sei se está é melhor tradução mas já deu para entender o que o texto quis dizer.

Ele é baseado nos biscoitos da sorte chineses (fortune cookies em inglês),  quando configurado pode mostrar uma mensagem de sua base de consulta ao fazer o login no terminal ou mesmo ao carregar o sistema operacional.

Para rodar o programa, caso ele esteja instalado claro,  basta chamar o comando:

$fortune
Você não precisa ser o melhor. Basta procurar fazer bem aquilo que faz, sem esperar recompensa ou castigo, simplesmente pelo prazer de fazer bem-feito, que se esgota no ato de fazer

--Adib Jatene

No meu caso instalei uma base de língua portuguesa e recebi como mensagem esta acima, minha máquina roda ubuntu e o fortune já estava instalado sendo assim para instalar a base de mensagens brasileira basta usar este comando:

$ sudo aptitude install fortune  fortune-mod fortunes-br

Para usar somente mensagens em português você pode indicar qual será a base de consulta ao chamar o programa.

$ fortune brasil
O trabalho e a perdicao das classes bebedoras.
-- Mike Romanoff

Como trabalho com alguns colegas que estão meio estressados pensei em colocar algumas mensagens estimulantes e divertidas nos servidores da empresa, então fiz uma pesquisa para encontrar o fortune para FreeBSD.

No FreeBSD encontrei o fortune instalado por padrão então bastava procurar por bases motivantes e divertidas 😛

No repositorio  do BSD ( www.freebsd.org/ports/ ) encontrei algumas  como futurama, Bíblia Sagrada encontrei também em outras linguas como Russa e Italiana . Com as bases instaladas agora basta fazer aparecer quando o individuo logar por ssh/terminal criando um script shell

Quando fui editar o arquivo ~/.profile do FreeBSD já existia uma entrada para chamar o fortune.

#Padrão do BSD
[ -x /usr/games/fortune ] && /usr/games/fortune freebsd-tips

Ou de pode ser desta maneira também

if [ -a /usr/games/fortune ]; then
   echo " "
   /usr/games/fortune freebsd-tips
   echo " "
fi

Ótimo agora tenho como chamar o fortune passando como argumento uma base de dados. E você também pode criar sua própria base na comunidade viva o linux tem um post sobre isso explicando a criação e os argumentos que pode ser usados http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/ além é claro do man page http://linux.die.net/man/6/fortune.

Prontinho tudo instalado e funcionando.
Não posso me despedir sem mandar essa mensagem que recebi do fortune.

$ fortune -m 'win' brasil | less
P. Se o windows 98 fosse concessionária, que carro venderia?
R. BUG, é claro!!!
%
O windows 98 é o maior e mais mal feito vírus conhecido.
%
Se o seu windows não der problema, reclame com a Microsoft!
%
O windows não é ruim, esperem só ele ficar pronto...
%
Como transformar um Pentium em XT? Digite "win".
%
Chernobyl usava windows 95 para monitorar seus reatores.
%

heheheheh não foi eu quem disse nada disso foi os autores da base do fortunes hhehehehheheh

*Fontes
http://linux.die.net/man/6/fortune
http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/
http://www.freebsd.org/cgi/ports.cgi?query=fortune&stype=all&sektion=all

Tags: , , ,

Acertando a Hora *Unix – ntpdate

Essa vai ser uma dica rápida. Como acertar a hora em sistemas *Unix (Linux, Freebsd, OpenBSD, etc).
Usuários Ubuntu precisam ter o programa instalado.

sudo aptitude install ntpdate

Acertando a hora

Vamos sincronizar a hora de nosso sistema com algum servidor público espalhado pelo mundo, no meu caso vou utilizar o da usp.

sudo ntpdate ntp.usp.br

Isso já é o suficiente para acertar o horário da sua máquina.

Vamos um pouco mais a fundo agora.

Eu tenho que garantir que meus servidores estão com a hora sincronizada, para tanto vou fazer essa essa atualização todos os dias 🙂 e para ficar ainda mais seguro vou fazer em 2 servidores diferentes 🙂 🙂

Segue o script para fazer essa atualização em uma máquina FreeBSD.

#!/usr/local/bin/bash
ntpdate=`which ntpdate`

#Lista de servers ntpdate espalhados pelo mundo pode-se adicionar quantos quiser separados por espaço
SERVERS="ntp.pool.org ntp.usp.br"

for server in $SERVERS
do 
   $ntpdate $server
done   

Esse script deve ser salvo e precisa estar com permissão de execução ( chmod +x atualizaHora.sh ) após isso foi enviado para a pasta /usr/local/etc/periodic/daily onde será executado todos os dias.

Esse procedimento poderia ser feito pelo crontab também, mas ao preferi coloca-lo nesta pasta pois ela já é chamada via crontab do root.

Complementando a informação a porta de entrada e saida do NTPDATE é a 123 isso mesmo 123, sendo assim essa porta deve estar aberta no firewall da máquina que se deseja sincronizar.

Outros servers ntpdate

  • time.windows.com
  • time.apple.com
  • ntp.ufrj.br
  • ntp.ubuntu.com

Pronto hora ajustada, então é hora de partir.
Abraços.

Tags: , , ,

O Zen do Python

A alguns dias descobri uma coisa bem interessante no python.  Ao fazer o import dele mesmo ele mostra alguns principios que foram criados por  Tim Peters.

Seguindo a risca esses principios dificilmente seu projeto vai dar errado 😛

Como os encontro?

Em sua linha de comando (estou assumindo que  você esta em algum Unix e que tenha python instalado) digite:

$ python

Neste momento você estará entrando no shell interativo do python depois é só fazer o import.

 import this

O resultado você visualiza abaixo

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Vou colocar também uma livre tradução que encontrei na internet e que cito o autor abaixo.

Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o bastante para se quebrar as regras.
Embora a simplicidade supere o purismo.
Erros nunca deveriam passar silenciosamente.
A menos que explicitamente silenciados.
Ao encarar a ambiguidade, recuse a tentação de adivinhar.
Deveria haver uma – e preferencialmente apenas uma – maneira óbvia de se fazer isto.
Embora aquela maneira possa não ser óbvia à primeira vista se você não for holandês.
Agora é melhor que nunca.
Embora nunca, seja muitas vezes melhor que pra já.
Se a implementação é difícil de explicar, é uma má idéia.
Se a implementação é fácil de explicar, pode ser uma boa idéia.
Namespaces são uma idéia estupenda – vamos fazer mais deles!

fonte da tradução

Básicamente são boas maneiras para se trabalhar com python.

Algumas coisas que senti falta e que vou acrescer ao texto

Marretas não são bem vindas, mas são necessárias.
O pior código é aquele que não existe, esse não dá dinheiro

Bem acho que é isso que tinha a dizer hoje.

Fui ….

Fontes:

http://www.python.org/dev/peps/pep-0020/

http://pipeless.blogspot.com/2008/09/o-zen-de-python.html

Tags: , ,

Postgresql – Backup de todas as base de dados

postgresql

Motivado por esse post ( http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro ) resolvi fazer algumas adaptações para atender as minhas especificações.

Eu preciso ter backup do servidor inteiro mais não necessáriamente preciso retornar todas as bases para o novo servidor novamente, por esse motivo fiz o meu próprio script para resolver esse problema.

Utilizando a linguagem python associada aos aplicativos do postgresql montei esta rotina.

#!/usr/bin/env python
#! -*- coding:utf8 -*-
########################################################
#  Script para fazer o pg_dump de todos os
#   bancos da máquina em que ele for executado
#  Valdinei dos Santos
#  valdineidossantos(at)gmail.com.br
#  27 Julho de 2009
########################################################
#Importando o getstatusoutput responsavel por executar os comandos do sistema operacional
from commands import getstatusoutput
from datetime import datetime
from os import path

#config
psql="/usr/bin/psql"
pg_dump="/usr/bin/pg_dump"
user="pguser-vale"
host="valdineidossantos.com"
repository = "/media/backup/databases/"

#Functions
def getAllDatabases(psql, user, host):
    print "\nRecuperando as bases de dados do servidor %s" % host
    command = "%s -U %s -h %s -l" % (psql, user, host)
    status, output = getstatusoutput ( command )
    if int(status) == 0:
       #return lista de servidores
       return stringToListServers( output )
    else:
        return [[],] 

def stringToListServers( databaseString ):
    print "\nFormatando a string"
    temp_pieces = databaseString.split("\n")
    dataBases = []
    for i in temp_pieces[3:]:
        try:
            pieces = i.split("|")
            owner  = pieces[1].strip()
            dbName = pieces[0].strip()
            encode = pieces[2].strip()
            data   = [dbName, encode, owner]
            if data:
                dataBases.append ( data )
        except Exception, e:
            continue
            #print e.__doc__
    return dataBases

#Init
if __name__ == '__main__':

    allDataBases =  getAllDatabases(psql, user, host)

    day = datetime.now().strftime("%Y%m%d")
    for database, encode, owner in allDataBases:
        #name Example databasename-20092707.dump
        dumpName = "%s-%s.dump" % (database, day)    

        #/dev/null/databasename-20092707.dump
        file = path.join(repository, dumpName)

        command = "%s -U %s -h %s -E %s  -f %s -i -Fc %s " % (pg_dump, user, host, encode, file, database)

        status, output = getstatusoutput( command)

        if int(status) > 0:
            print "Erro no backup da database %s\n %s" % (database, output)

Após esse script finalizado teremos no diretorio que foi setado no config “repository” todos os bancos de dados disponiveis no servidor.
Para voltar novamente com a base dados para o novo servidor rodamos o comando.

pg_restore -d |nome da base dados| -Fc |caminho/nome do arquivo dump|

Temos algumas outras opções em shell script  mas preferi usar  o python  🙂
Python

Tags: , , ,

Wifi em linha de comando

O ubuntu tem inúmeros programas para fazer a conexão wifi em notebooks. Mas eu queria saber como fazer na mão em linha de comando.

Após  procurar um pouco na Internet, ou seja no google consegui algumas informações que vou passar aqui no blog.
Em primeiro lugar vamos encontrar as redes disponiveis para conexão. Inclusive as dos vizinhos então usem com moderação esta dica.

Digite :

iwlist scan

Neste momento será retornado as redes disponiveis.
Exemplo de saida do programa iwlist:

lo        Interface doesn't support scanning.

eth0      Interface doesn't support scanning.

eth1      Scan completed :
Cell 01 - Address: 00:30:65:05:E6:04
ESSID:"minha_rede"
Protocol:IEEE 802.11b
Mode:Master
Channel:1
Frequency:2.412 GHz (Channel 1)
Encryption key:on
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
Quality=64/100  Signal level=-62 dBm
Extra: Last beacon: 4156ms ago

Explicando a interface lo é a da própria máquina, a interface eth0 é da rede cabeada e não poderá ser feito o scan de redes sem fio por ela. A que realmente importa é a eth1 pois é minha rede sem fios.
Foi encontrada a rede de nome minha_rede e existem uma senha habilitada para a mesma.
Agora que a rede foi detectada vamos ao passo dois que é associar ela a sua interface, neste momento você vai precisar da senha de administrador do computador.

Digite:

sudo iwconfig eth1 essid "minha_rede" key s:sua_senha_da_rede

Neste momento você esta fazendo a associação da rede “minha_rede” a sua interface de rede eth1 utilizando uma senha baseada em ASCII sua_senha_da_rede que contem 12 caracteres.

Algumas observações até esse ponto. No meu caso minha interface de rede ligada é a eth1, mas podem ser outros dependendo do fabricante. Poderiam ser também wlan0, ath0 dentre outras.
Segundo ponto é que minha rede utiliza senha para acesso, essa senha é baseada em ASCII mas não é um padrão podem haver outros.

Agora para finalizar caso sua máquina trabalhe com DHCP (ip dinâmico) você terá de conseguir seu ip novo com um comando.

Digite:

sudo dhclient eth1

Neste momento você receberá um ip e já pode se conectar a rede local e caso essa rede tenha acesso a internet pode navegar.

Para maiores informações e eu aconselho que seja feito a leitura do manual 🙂

Digite:

man iwconfig

Obrigado Joe Rabelo pelos testes na sua máquina.

Tags: , , , ,

tar e rm alguns segredos…

Hoje vamos falar um pouco sobre backup e sobre uma curiosidade do comando rm.
Eu precisa criar um pacote compactado com os arquivos fontes de um aplicativo da empresa onde trabalho. Mas neste pacote não poderiam ir os arquivos de trabalho do sistema como PDF, Imagens, XML e etc.
Para fazer a compactação geramente utilizo o tar pois ele é de simples entendimento e largamente utilizado por pessoas que utilizam UNIX.
A sintaxe básica é:

tar  arquivo_saida arquivo_entrada1 arquivo_entrada_n

Assim como utilizei a flag –exclude no rsync posso utilizar no tar também.
Então para resolver meu problema foi simples digitei.

tar -vczf arquivosFontes.tar.gz /home/valdinei/ --exclude /home/valdinei/userFiles

Onde as opções são definidas da seguinte forma:

-v mostrar as saidas na tela
-c criação de arquivo
-z tipo de compactação
-f arquivo

Resolvido o problema com este comando, mas fazendo os testes para descobrir como o comando funcionava foram sendo criados arquivo lixo em meu ambiente de teste. Este arquivos eram os –exclude, –exclude= e coisas do tipo pois fiz muitas tentativas 🙂

Para apagarmos apagarmos arquivos é so utilizar o comando rm <arquivo>, sendo este um arquivo com um nome normal.
Neste caso meu arquivo não tinha um nome normal.

Digite no seu console

touch --test.

Depois

 rm --test

para ver o que acontece…. nada vai dar um erro.

Tem um explicação logica para isso, quando chamamos um comando é utlizado uma nova shell para executa-la e como o sinal (–) é utlizado para a passagem de paramentros da um erro pois agora este sinal pertence ao nome do arquivo.

Sem se extender mais sobre o assunto vamos a solução:

rm -- --test

Pronto apagamos o arquivo. Porque?
Bem agora definimos que o comando vai ser executado pelo shell que estamos utilizando.

Espero ter ajudado pois isso me salvou hoje criando um arquivo limpo e deixando minha máquina sem arquivos com nomes bizarros.

Abraços
Dinei.

Tags: , , , , ,

Utilizando Rsync

Nesta manhã tive que fazer a sincronia entre dois servidores.
Primeira coisa que me veio a cabeça foi fazer o bom e velho scp. Vamos com calma, que bicho é esse?
Para fazer copia de arquivos em máquinas UnixLike (linux, BSD, Mac, Solaris, etc). O comando é simples:

cp url_arquivo_origem/nome_arquivo_origem url_arquivo_destino/arquivo_destino.

Isso pode ser feito através da rede também utilizando o comando scp, definição da Wikipedia.

“Secure Copy ou SCP é um meio seguro para transferir arquivos entre um host local e um remoto ou entre dois hosts remotos, usando o protocolo SSH.
O termo SCP pode ao mesmo tempo referir-se ao Protocolo SCP ou ao Programa SCP.”

Bem isso era o que eu precisava para sincronizar meus servidores com um detalhe que era crucial, existem arquivo do tipo .pdf que são pesados e desnecessários para minha
sincronia.

Procurando um pouco na internet encontrei uma segunda forma que seria o RSYNC que faz quase a mesma coisa com a diferença de você passar o caminho e ele se
virar para verificar as diferenças.
Definição da Wikipedia:
rsync é um utilitário para sincronização de arquivos e diretórios entre duas localidades diferentes enquanto minimiza a transferência de dados.

Sua sinatxe:

 rsync -Cravzp /home/valdinei/arquivos/ /var/backups/arquivos/

ou

rsync -Cravzp /home/valdinei/arquivos /var/backups/

Do primeiro modo será sincronizado dos os arquivos que se encontram dentro da pasta arquivos no meu home para a pasta arquivos que se encontra dentro de backups

Da segunda forma estarei sincronizando a pasta arquivo com a pasta backup, como assim? Caso exista a pasta arquivos dentro de backup ele vai buscar o conteudo que esta na pasta
arquivos na minha home e colocará as diferenças dentro da pasta arquivos na pasta backup.
E se caso a pasta arquivos não existir dentro da pasta backup será criada com todo o conteúdo.

Isso me faz exatamente o que o scp faz :). Agora vem que eu precisava o rsync permite que você exclua certo tipos de arquivos que contenham uma cadeia de caracteres
especifico.

Então para resolver meu problema fiz a sincronia desta forma:

rsync -avz /home/valdinei/arquivos /var/backups/ --exclude *.pdf*

E para fazer entre maquinas destintas na rede seria assim:

rsync -avz -e ssh  valdinei@host1:/home/valdinei/arquivos /home/valdinei/arquivos --exclude *.pdf* --exclude *.PDF*

As opções são:

-a  Enviar Todos os Arquivos
-v Mostrar todas as mensagens
-z Enviar de mod compactado.
-e ssh  Utilizando o tunelamento de ssh

Agora fazendo pela rede.
Acho que isso é tudo por hoje.
Dinei.

Tags: , , ,