Um pouco de sed e regex, excluindo várias ocorrencias de um mesmo arquivo

February 19th, 2010 No Comments   Postado em Bash, Linux

Recentemente, administrando remotamente (via ssh) um servidor linux, surgiu a necessidade de excluir várias ocorrencias de um mesmo arquivo em várias  árvores de diretórios, um amigo que se diz “Admin de infra” e  que detesta linha de comando, pois administra servidores Windows (obviamente via GUI) que acompanhava minha batalha fez a seguinte observação:  “Tá vendo? é por isto que eu não gosto da linha de comando, isto seria fácil em um sistema desktop, no windows, por exemplo, bastaria fazer uma busca em todo o disco, selecionar tudo e excluir, já na sua amada linha de comando é preciso ficar planejando um comando. Realmente eu não tinha de imediato o comando na mente, seria preciso um tempo para “compor” um comando, mas imediatamente me veio a mente a vantagem de se construir um comando desta natureza para te-lo como ferramenta e fiz o seguinte questionamento ao meu amigo: “E se voce precisasse fazer uma limpeza deste tipo todos os dias? ou 1 vez por semana?” Ele concordou que realmente isto as vezes é necessário (como por exemplo os malditos arquivos Thumbs.db que o windows gera quando a opção armazenar miniaturas está em on nas opções de pasta), neste contexto ter um ou um conjunto de comandos é bem mais vantajoso pois é só criar um script e coloca-lo no crontab (agendador de tarefas) em 10 ou 15 minutos encontrei a solução e algumas horas depois encontrei várias versões, para escrever este texto escolhi, propositalmente  a mais complexa somente para ter um pretexto para brincar com o sed e as expresressões regulares.

Suponha que se tenha uma pasta chamada testes no seguinte caminho:
srv/www/htdocs/testes/

Digamos que este diretório seja uma cópia de trabalho de um projeto svn, mas desejamos empacota-la (compactar) e distribuir os fontes, e por um motivo qualquer,  não podemos utilizar o svn para fazer um export, de qualquer forma não faz muito sentido enviar as pastas de controle .svn, então seria interessante exclui-las, primeiro vamos, com o comando find, verificar onde estão as pastas .svn, por mera curiosidade:

# find /srv/www/htdocs/testes -name .svn
/srv/www/htdocs/testes/scripts/.svn
/srv/www/htdocs/testes/api/.svn
/srv/www/htdocs/testes/include/client/.svn
/srv/www/htdocs/testes/include/pear/Mail/.svn
/srv/www/htdocs/testes/include/pear/Net/.svn
/srv/www/htdocs/testes/include/pear/Auth/.svn
/srv/www/htdocs/testes/include/pear/Auth/SASL/.svn
/srv/www/htdocs/testes/include/pear/.svn
/srv/www/htdocs/testes/include/pear/PEAR/.svn
/srv/www/htdocs/testes/include/staff/.svn
/srv/www/htdocs/testes/include/.svn
/srv/www/htdocs/testes/styles/.svn
/srv/www/htdocs/testes/scp/js/.svn
/srv/www/htdocs/testes/scp/.svn
/srv/www/htdocs/testes/scp/css/.svn
/srv/www/htdocs/testes/scp/images/icons/.svn
/srv/www/htdocs/testes/scp/images/.svn
/srv/www/htdocs/testes/.svn
/srv/www/htdocs/testes/setup/.svn
/srv/www/htdocs/testes/setup/inc/.svn
/srv/www/htdocs/testes/setup/images/.svn
/srv/www/htdocs/testes/images/captcha/.svn
/srv/www/htdocs/testes/images/icons/.svn
/srv/www/htdocs/testes/images/.svn

Agora vamos apagar todas estas pastas, aproveitando do próprio comando find:
# find /srv/www/htdocs/testes -name .svn | sed -e ‘s/\/srv/rm -rf \/srv/g’ > clearsvn.sh | chmod 770 clearsvn.sh;./clearsvn.sh

Prontinho, um outro find não encontraria mais nenhuma pasta chamada .svn, mas aí meu amigo falou “Cê tá brincando né? e quem entende esta macorranada aí a não ser os malucos do linux?”, Cazzo, eu disse a ele, um “admin de infra” não pode fugir deste tipo de codigo, o que você vai fazer com o powershell dos novos servidores da MS? e então passei a explicar a *assustadora* linha do comando:

Primeiro é preciso entender que na verdade são 2 segmentos (ou 2 linhas) de comandos, o primeiro vai até o ; (ponto e vírgula) e está dividido em 3 comandos separados pelo | (pipe), o pipe, em essencia, faz a comunicação entre processos ou como diz o guia foca de uma forma mais didática: “envia a saida de um comando para a entrada do comando seguinte”, vamos ver cada comando do primeiro seguimento:

# find /srv/www/htdocs/testes -name .svn |
Como mostrado no inicio deste texto, este comando apenas lista (neste caso na tela) os arquivos encontrados com o nome .svn, mais detalhes sobre este comando no guia foca. Lembrando que como o comando inclue um pipe, o resultado dele servirá como entrada para o proximo comando após o mesmo.

sed -e ‘s/\/srv/rm -rf \/srv/g’
O Comando sed (comando?), na verdade o sed não é propriamente um comando mas sim um editor, como diz o verde, “ Um editor de textos não interativo”, então: o sed neste contexto apenas faz substituições em cada linha que o comando find envia para ele,  ele substitui em cada início de linha fornecida pelo find a expressão /srv pela expressão rm -rf /srv , ou seja, ele acrescentou o comando rm seguido das opcoes -rf em cada linha, para explicar como o sed faz a substituição vamos supor que tenhamos um aquivo chamado arquivo.txt com o seguinte conteúdo:

Ontem eu não trabalhei, para hoje descansar.

Vamos substituir a expressão “não trabalhei” por “trabalhei muito”, para isto usamos o sed com a seguinte sintaxe:

sed -i ‘s/não trabalhei/trabalhei muito/g’ arquivo.txt

O conteúdo do arquivo seria alterado para:

Ontem eu trabalhei muito, para hoje descansar.

Veja que no meu comando original eu utilizei -e (para expressão) enquanto no exemplo acima foi utilizado -i, a explicação é simples, no primeiro caso o comando faz a alteração nas linhas que o comando find envia para o sed enquanto no segundo o sed faz a substituição de forma interativa, diretamente no arquivo.

Caramba, se a substituição é tão simples no sed então para o que serve aquelas barras invertidas no comando original? Ah sim! o problema está no fato de que o sed usa a / (um meta caracter) para separar a expressão a ser substituida pela expressão a substituir e, naquele caso, tinhamos que substituir uma expressão que começava extamente com uma /, tinhamos que substituir: /srv por rm -rf /srv, isto literalmente ficaria assim:

sed -e ‘//srv/rm -rf /srv/g’
Nossa, isto sim é confuso, como o sed ‘saberia’ qual das barras seria o meta caracter? na verdade a expressão dentro das aspas não passa de uma expressão regular,  então para resolver o problema é só utilizar  scape, ou seja, quando vc quer incluir uma barra em uma das bordas (inicio ou fim) da expressão basta “escapa-la” com uma barra invertida, veja que o comando sed -e ‘s/\/srv/rm -rf \/srv/g’ não escapa a barra logo após o srv, isto ocorre porque esta barra não ‘confunde’ o sed pois ela não está imediatamente antes ou após as barras que fazem parte do comando (o meta caracter).

> clearsvn.sh |
Este comando envia a saída (que seria enviada para a tela) para um arquivo chamado clearsvn.sh e usa o pipe para que seja processado o proximo comando, embora não envie nada para ele.

chmod 770 clearsvn.sh;
Este comando faz com o que arquivo gerado pelo comando anterior (clearsvn.sh) torne-se um executável, o ponto e vírgula encerra o segmento, funciona como um enter na linha de comando.

./clearsvn.sh
Finalmete o arquivo gerado é executado pelo comando acima.

Pô mas este monte de barra invertida realmente tornou a sequência de comandos bem macarrônica, não daria para ser mais simples? claro que daria, mas para que simplificar se podemos complicar? heim, heim? Brincadeirinha, a intenção foi mesmo mostrar o conceito do scape, a tal barra invertida, a solução para a simplificação seria a inserção ao invés da substituição, para isto fariamos:

find /srv/www/htdocs/testes -name .svn | sed -e ‘s/^/rm -rf /’ > clearsvn.sh | chmod 770 clearsvn.sh;./clearsvn.sh
Ficou menos macarronico? sei não! Se você conhece bem as expressões regulares (se não conhece e conseguiu chegar até aqui neste texto então está na hora de conhecer, aqui pode ser um bom lugar para começar) sim, para quem conhece regex é fácil entender a parte do sed agora, de qualquer forma para conhedores deste tema o comando anterior também não seria problema, vamos tentar explicar esta nova versão do sed:

sed -e ‘s/^/rm -rf /’
o s continua tendo a função de substituição, mas agora o ^ (Circunflexo) indica que a substituição será no inicio da linha como não existe nada após o circunflexo a expressão após a segunda barra acaba sendo inserida. Para deixar um pouco mais claro vamos usar esta forma de comando para inserirmos algo no início do arquivo “arquivo.txt” do exemplo anterior:

sed -i ‘s/^Ante/’
Isto faria com que o arquivo ficasse com o seguinte conteúdo:

AnteOntem eu trabalhei muito, para hoje descansar.

Ok, Isto é tudo? daria para melhorar ainda mais o conjunto de comandos? Claro, como o shel do linux é muito rico, é bem provável que para cada pessoa acostumada com a linha de comando que se apresentasse este problema, uma solução diferente seria encontrada, mas sem alterar em nada o comando e somente olhando para o resultado final podemos perceber que além de excluir as pastas .svn (atendendo ao nosso objetivo principal) a solução deixa, digamos… Um rastro, uma “sujeira”, que é o arquivo cleansvn.sh, então resta-nos acesecentar um comando para elimina-lo, eis a versão final:

# find /srv/www/htdocs/testes -name .svn | sed -e ‘s/^/rm -rf /’ > clearsvn.sh | chmod 770 clearsvn.sh;./clearsvn.sh;rm -rf clearsvn.sh

Considerações finais
Como disse no inicio do texto, esta é a solução mais complexa (ou mais macarronica) que encontrei, participando de grupos de discussões e foruns na rede, apresentaram-me solucoes com 1/3  do tamanho desta apresentada aqui, mas como já afirmei, escolhi esta apenas como pretexto para brincar um pouco com o sed e as expressões regulares, as outras soluções talvez possam vir a ser objeto de um outro texto.



Tags: , ,

Instalando o FirebirdSS-2.1.3 no Opensuse 11.1

January 2nd, 2010 No Comments   Postado em Firebird, Linux, Opensuse

Recentemente instalei o Opensuse 11.1 para poder ter mais uma opção de servidor com uma versão mais atualizada do kernel, o primeiro problema que encontrei foi a instalação do vmware e logo em seguida a instalação do Firebird Super Server, como relato em minha pagina about, a função principal deste espaço é registrar coisas deste tipo para que, em uma necessidade futura, possa ser fácil recuperar, uma espécie de repositório, por outro lado, é provavel que possa ser útil a alguem que esteja iniciando neste maravilhoso SO, então descrevo abaixo os passos para a instalação do FB no OpenSuse 11.1:

1- Baixar o rpm da pagina: http://www.firebirdsql.org/index.php?op=files&id=engine_213, no meu caso que uso um core 2 duo, o arquivo que baixei foi: FirebirdSS-2.1.3.18185-0.i686.rpm

2 – Instalar com um duplo clique, o yast será acionado e voce deverá informar a senha do root, provavelmente voce receberá uma mensagem de erro parecida com:

Dependencia não resolvida : libstdc++.so.5

3 – Se voce não recebeu a mensagem acima, o FB foi instalado com sucesso, simples assim, agora só falta mudar a senha (Veja o passo 6), se não vá para o passo seguinte.

4 – O proximo passo é descobrir em que pacote este arquivo se encontra, depois de uma rápida pesquisa descobri que está no pacote com o nome: libstdc++33, agora poderiamos utilizar o yast  para descobrir o nome exato do pacote e instala-lo,  mas que tal connhecer um aplicativo muito util da linha de comandos? então vamos usar o zypper, primeiro vamos descobrir o nome do pacote que devemos instalar, para isto usaremos o comando zypper, veja a saida após o cmando:

$ zypper search libstdc++

Carregando os dados do repositório…
Lendo os pacotes instalados…

| Nome                      | Resumo                                                                           | Tipo
+———–+————————————————+————
| libstdc++33           | The standard C++ shared library                                     | pacote
| libstdc++33-devel | Include Files and Libraries mandatory for Development  | pacote
| libstdc++33-doc   | Documentation for the GNU C++ standard library           | pacote

Agora vamos instalar com zypper install, veja abaixo:

# zypper install libstdc++33
Carregando os dados do repositório…
Lendo os pacotes instalados…
Resolvendo as dependencias de pacote…

O seguinte pacote NOVO será instalado:
libstdc++33

Tamanho total do download: 200,0 K. Após a operação, 732,0 K adicionais serão utilizados.
Continuar? [SIM/não]:

Para instalar, tecle enter para a questão acima. e voce obtera a saida abaixo:

Obtendo pacote libstdc++33-3.3.3-7.5.i586 (1/1), 200,0 K (732,0 K descomprimido)
Instalando: libstdc++33-3.3.3-7.5 [concluí­do]

5 – Volte ao passo 2 e o FB deverá ser instalado.

6 – Mude a senha, para isto consulte meu artigo:
Alterando a senha do FB no windows e no Linux

Isto é tudo!

Links relacionados:
Instalando o Firebird 2.1 no CentOS 5.3


Tags: , ,

PhpMyAdmin atualizado no CentOS 5.3

September 20th, 2009 No Comments   Postado em Linux

Considerações Iniciais:
Muitos dos softwares open source de qualidade tem um ritmo de desenvolvimento que a maioria das distribuições não conseguem acompanhar para deixa-los sempre atualizados em seus pacotes, e isto é compreensível, visto que as distribuições tem centenas (milhares?) de softwares para “empacotar”, com isto em mente, sempre que posso e tenho tempo eu prefiro primeiro buscar a versão atual na fonte do desenvolvedor e comparar com a versão empacotada da distribuição antes de instalar, no caso do phpmyadmin, encontrei, em abril de 2009 o rpm de março de 2008 em http://dag.wieers.com/rpm/packages/phpmyadmin/, enquanto no site dos desenvolvedores http://sourceforge.net/project/showfiles.php?group_id=23067 já havia disponível a versão de Março de 2009, ou seja, 12 meses de diferença.

Pré requisitos:
Para saber se voce  já tem os pré requisitos instalados consulte o artigo:  http://www.cosmoverbal.net/linux/centos-saber-se-um-software-esta-ou-nao-instalado Como o phpmyadmin é um utilitário para administrar bancos MySQL, obviamente voce precisará dele (o servidor mysql) instalado, então vamos instala-lo, caso voce já não o tenha:

# yum install mysql-server

Além disto será preciso também as extensões php-mysql e mb-string, assim como o mysql, o PHP é um software que o CentOS sempre mantem atualizado, vamos instala-lo, também,  via yum:

# yum install php
# yum install php-mbstring

Agora precisamos incializar o daemon do Mysql, para isto, digite:

# /etc/init.d/mysqld start

Note que o comando acima inicializa o servidor Mysql mas somente enquanto a sessão estiver aberta, para inicializa-lo todas as vezes que o sistema operacional for recarregado (no boot) execute o comando: system-config-services e assinale o serviço mysql.

Baixando e Instalando:
Bem,  a primeira coisa a fazer é, obviamente, baixar o pacote no site sourceforge.net, citado acima, escolher a versão mais recente, geralmente o primeiro da lista, no meu caso era a 2.11.9.5, clicando na versão voce deverá ser direcionado para outra página contendo vários pacotes em vários formatos, eu prefiro sempre o compactado em .tar.bz2 que geralmente é o que tem melhor eficiencia na compactação, quando baixei, o pacote era este: phpMyAdmin-2.11.9.5-all-languages.tar.bz2, após baixar o arquivo mova ou copie-o para um diretório de sua preferencia, eu sempre o faço para /usr/src quando o projeto precisa ser compilado, como neste caso eu já sei que é um projeto em PHP prefiro coloca-lo na pasta onde ele vai ficar permanentemente, projetos php são aplicações web que serão chamadas pelo browser então vamos coloca-lo no diretorio indicado na diretiva DocumentRoot do arquivo de configuração do apache em /etc/httpd/conf/httpd.conf, no CentOS 5.3 o default é  “/var/www/html” então,  logado como root, vamos mover o arquivo para esta pasta:

# mv /diretorio/phpMyAdmin-2.11.9.5-all-languages.tar.bz2 /usr/src

Agora vamos descompacta-lo com o comando:

# tar -xjf phpmyadmin-2.11.9.5-all-languages.tar.bz2

O comando acima descompacta o arquivo para dentro do diretório: phpMyAdmin-2.11.9.5-all-languages, vamos mudar este nome para simplesmente phpmyadmin, com o comando:

# mv phpMyAdmin-2.11.9.5-all-languages phpmyadmin

Ok, está instalado, se voce abrir o browse e digitar o endereço: http://localhost/phpmyadmin/ vai acessa-lo, normalmente, role até o final da página e veja se aparece um quadro amarelo com bordas vermelhas com o seguinte aviso:

O seu arquivo de configuração contém configurações (root sem senha) que correspondem à conta privilegiada padrão do MySQL. O servidor MySQL rodando com esse padrão estará aberto a invasões, você realmente deveria corrigir este furo de segurança.

Se apareceu este aviso, vamos mudar a senha do root do Mysql com o comando:

# mysqladmin -u root password novasenha

Ok, Agora é só apontar o browse para http://servidor/phpmyadmin e teriamos o aplicativo funcionando mas provavelmente voce recebeu a mensagem:

Erro
O arquivo de configuração agora precisa de uma frase secreta com senha (blowfish_secret).

Isto porque a senha do root foi alterada, agora precisamos alterar o tipo de autenticação no arquivo de configuração do phpmyadmin.

Configuranado:
Para configurar a aplicação vamos criar um novo arquivo com o nome config.inc.php no diretorio onde o phpmyadmin foi instalado, neste contexto os comandos seriam:

# vim /var/www/html/phpmyadmin/config.inc.php

Ao editar o arquivo digite o seguinte conteúdo:

<?php
/* Servers configuration */
$i = 0;

/* Server localhost (http) [1] */
$i++;
$cfg['Servers'][$i]['host'] = ‘localhost’;
$cfg['Servers'][$i]['extension'] = ‘mysql’;
$cfg['Servers'][$i]['port'] = ’3306′;
$cfg['Servers'][$i]['connect_type'] = ‘tcp’;
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = ‘http’;

?>

Pronto, phpmyadmin instalado, agora é só apontar seu browse preferido para localhost.


Tags:

Instalando o nginx no CentOS 5.3 através do Yum

September 5th, 2009 No Comments   Postado em Linux

Sobre o nginx:
Servidor de http, imap/pop3 e proxy reverso de  alta perfomance, gratuito e livre criado por um virtuoso programador russo chamado Igor Sysoev, pronuncia-se EngineX, há quem o considere como ” mais robusto servidor web da atualidade” (http://www.vivaolinux.com.br/artigo/Nginx-Poderoso-servidor-WEB-para-Linux).

Wiki em portugues/Brasil: http://wiki.nginx.org/NginxPtBr

Repositórios no CentOS:
Muitos aplicativos estão disponíveis nos repositórios do CentOS mas não temos conhecimento disto ou, na maioria das instalações, nem temos os repositórios instalados, pois até a versão 5.3 a instalação só adiciona os repositórios da distribuição.

* base: mirror.centos-br.org
* updates: mirror.centos-br.org
* addons: mirror.centos-br.org
* extras: mirror.centos-br.org

Extra Packages for Enterprise Linux:
EPEL (Extra Packages for Enterprise Linux) é um repositório desenvolvido pela comunidade Fedora para prover pacotes extras para sistemas baseados no Fedora e no RHEL (Redhat Enterprise Linux), e como o CENTOS é, na verdade, uma compilação do RHEL podemos fazer uso deste repositório.

Adicionando o EPEL ao CentOS:
Para adicionar este repositório ao CentoOS, execute os comandos abaixo:

# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
# rpm -ivh epel-release-5-3.noarch.rpm

Agora vamos verificar se o yum encontra o nginx em algum repositório

# yum search nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* epel: mirrors.tummy.com
* base: mirror.centos-br.org
* updates: mirror.centos-br.org
* addons: mirror.centos-br.org
* extras: mirror.centos-br.org
epel                                                            | 3.4 kB     00:00
284467d700fe1ac543a082342c79dc8ca3a86378-primary.sqlite.bz2     | 2.0 MB     00:13
========================= Matched: nginx=====================
collectd-nginx.i386 : Nginx plugin for collectd
nginx.i386 : Robust, small and high performance http and reverse proxy server

Observando a última linha da saida do comando podemos observar que foi encontrado no repositório EPEL o pacote nginx.i386, então vamos instala-lo com o comando “yum install”:

# yum install nginx.i386
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* epel: mirrors.tummy.com
* base: mirror.centos-br.org
* updates: mirror.centos-br.org
* addons: mirror.centos-br.org
* extras: mirror.centos-br.org
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
–> Running transaction check
—> Package nginx.i386 0:0.6.38-1.el5 set to be updated
–> Finished Dependency Resolution

Dependencies Resolved

========================================================
Package           Arch             Version                     Repository        Size
========================================================
Installing:
nginx             i386             0.6.38-1.el5                epel             318 k

Transaction Summary
========================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 318 k
Is this ok [y/N]:

É só responder y (yes) e o pacote será instalado.

Mudando a senha do root do Mysql 5 no CentOS 5

April 15th, 2009 No Comments   Postado em Linux, MySQL

Sempre que preciso alterar a senha do root no mysql,  preciso fazer o maior exercicio mental para lembrar dos passos ou acabar tendo que pesquisar em vários lugares novamente, então resolvi condensar e adaptar uma parte do próprio manual aqui para consultas rápidas:

Se você acabou de instalar o mysql e quer apenas atribuir uma senha ao root que, estranhamente, a senha default é… em branco, nada, nula, ou seja, não tem senha, basta inicializar o daemon do mysql e usar o mysqladmin para alterar:

# /etc/init.d/mysqld start
# mysqladmin -u root password novasenha

Mas se já existe uma senha e voce a esqueceu ou precisa altera-la por algum motivo, então siga os passos:

1- Finalize o serviço do Mysql, no centos 5 você pode fazer isto de duas maneiras, a primeira é utilizando o script service em /sbin, para isto digite o comando:

# /sbin/service mysqld stop

Ou ainda utilizando o script do daemon diretamente em /etc/init.d/mysqld, para parar o mysql desta maneira digite o comando:
# /etc/init.d/mysqld stop

2 – Reinicie o

1
mysqld

com a opção

1
--skip-grant-tables (para não lêr as tabelas de permissões), o comando para isto é:


<div>::CODECOLORER_BLOCK_3::</div>

</code>

1
<code>3 – Agora alteramos a senha do root:



<div>::CODECOLORER_BLOCK_5::</div>

1
4 – E finalmente reiniciamos o mysql:


<div>::CODECOLORER_BLOCK_7::</div>

CentOS – saber se um software está ou não instalado.

April 15th, 2009 1 Comment   Postado em Linux

Muitas vezes, quando estamos na linha de comando instalando um determinado software nos deparamos com a dúvida se alguns dos softwares de pré-requisitos já está ou não instalado, por exemplo, na instalação do phpmyadmin (http://www.phpmyadmin.net/home_page/index.php), precisamos do php, da extensão php-mbstring e do mysql, para sabermos se os temos  instalados é só digitar o comando, “yum list” se este nos retornar Available packages é porque não está instalado, caso contrário o retorno é Installed Packages, veja abaixo:

# yum list php
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.oi.com.br
* updates: updates.interworx.info
* addons: centos.oi.com.br
* extras: centos.oi.com.br
Installed Packages
php.i386                           5.1.6-23.2.el5_3                                                        installed

# yum list php-mbstring
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.oi.com.br
* updates: updates.interworx.info
* addons: centos.oi.com.br
* extras: centos.oi.com.br
Available Packages
php-mbstring.i386           5.1.6-23.2.el5_3                                                        updates

# yum list mysql-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.pop.com.br
* updates: mirrors.bluehost.com
* addons: centos.pop.com.br
* extras: centos.pop.com.br
Available Packages
mysql-server.i386            5.0.45-7.el5                                                               base


Tags:

Última versão do Redmine no linux (CentOS)

April 7th, 2009 No Comments   Postado em Linux, Redmine

O que é o Redmine:
Redmine é uma aplicação web voltada para o gerenciamento de projetos de softwares,  administrado por Jean-Philippe Lang, projeto de código aberto, totalmente gratuito, desenvolvido na plataforma RoR (Ruby on Rails), O que gosto nele é a simplicidade aliada ao grande número de funcionalidades.

Sobre a dificuldade de instalação:
Alguns desenvolvedores tem reclamado do fato do mesmo ser feito em RoR e ser de de difícil deployment, mas devo dizer que isto é muito relativo, para quem não está acostumado realmente parece ser complexo, mas qual é o desenvolvedor que não se depara, pelo menos uma vez por semana, com algo complexo?

Pré-requisitos:

Database:
  • MySQL 4.1 ou  superior (recommendado)
  • PostgreSQL 8
  • SQLite 3

Subversion:
Vamos precisar também do svn, se você não tem o subversion instalado, basta digitar:

# yum install subversion

Libs:
O Gem também precisa da lib zlib

yum install zlib zlib-devel

RoR:
Como este documento é baseado no CentoOS, voce precisa ter uma máquina com o CentOS 5.2/3 ou o RHEL 5.3 instalados, acredito que também seja possível com qualquer sabor do Red Hat, como por exemplo o Fedora, por outro lado é bem fácil adaptar para qualquer outra distribuição, antes de mais nada precisamos instalar a linguagem Ruby, o Framework RoR e o gerenciador de pacotes RubyGems, Dependendo da versão RM que você quer instalar, vai precisar da versões correspondentes do Ruby/Rails, abaixo uma tabela retirada do site do Redmine em 07/04/2009:

Versão do Redmine Versão suportada do Ruby Versão requerida do Rails
current trunk ruby 1.8.6, 1.8.7 Rails 2.2.2
trunk before r2493 ruby 1.8.6, 1.8.7 Rails 2.2.2
0.8.x ruby 1.8.6, 1.8.7 Rails 2.2.2
0.7.x ruby 1.8.6 Rails 2.0.2

Alguem poderia perguntar porque utilizar versões anteriores, bem, pode haver vários motivos, como por exemplo, se o sistema já tiver o ruby/rails de uma versão suportada já instalada ou se voce usa uma distribuição que ja tem disponível uma destas versões empacotadas.

Obtendo a versão do Rails instalada:

Para saber a versão do Rails que voce tem instalado, digite o comando:

$ rails –v

No meu caso, produz a saida:

Rails 2.3.2

Atualizando o Gems/RoR:

Se voce ja tem o Ruby o RoR instalado pelo metodo do yum ou sua versão é anterior a a 2.2 e deseja instalar uma versao do redmine que exiga esta versão voce pode atualizar o Gem e o Rails, com os seguintes comandos:

# gem update –system
# gem install -v=2.2.2 rails

1. Instalando Ruby/Ruby On Rails/RubyGems:

Para instalar o trio acima é só seguir o artigo Instalando Ruby (1.8.7) e Rails 2.1.0 no CentOS 5 claro que voce deve ao invés de instalar a versão 1.1.1 do RubyGems e a versão 2.1.0 do Rails (que eram as últimas versões disponíveis quando escrevi aquele texto), instalar a versão 1.3.1 do RubyGemns e a versão 2.2.2 do Rails (que são as ultimas versões disponíves quando eu estava escrevendo este). Os ítems 4 e 5 daquele texto era para corrigir um problema específico da versão 5.0 do CentOS, se você não usa esta versão, é provável que você não precise deles. Note que se voce estiver instalando através de pacotes disponíveis em sua distribuição é preciso observar as versões, por exemplo, no CentOS 5.2 a versão empacotada disponível do Ruby é a 1.8.5-5, ou seja, não dá para rodar o redmine, é melhor baixar e instalar tudo.

1.1 Instalando a versão “Snapshot Estável” de abril de 2009:

No link http://www.ruby-lang.org/pt/downloads/ há um link para se baixar o pacote chamado Snapshot Estável com a seguinte descrição “Ficheiros compactados em tar e gzip do último CVS estável. Deverá ser melhor que o última distribuição estável.”, Ok, pode ser, mas quando o baixei no início do mês de abril de 2009 ocorreu um erro quando tentei instalar o RubyGems, depois de segui com sucesso o passo 1 da instalação do Ruby, tive problemas no passo 2 (a instalação do Gems, ultimo comando) que reportou a seguinte mensagem:

/usr/src/rubygems-1.3.1/ ruby setup

/usr/src/rubygems-1.3.1/lib/rubygems/version.rb:53:in `initialize’: Malformed version number string 1.8.8.-1 (ArgumentError)

from /usr/src/rubygems-1.3.1/lib/rubygems.rb:676:in `new’

from /usr/src/rubygems-1.3.1/lib/rubygems.rb:676:in `ruby_version’

from setup.rb:111

Para não ter o mesmo problema, antes de compilar  edit o arquivo version.h presente no diretório onde voce descompactou o Ruby e altere a 5ª linha onde se lê:

# define RUBY_PATCHLEVEL –1

para:

# define RUBY_PATCHLEVEL 1

Após compilado voce se voce digitar Ruby na linha de comando o shell não encontrará o comando, isto porque o processo de compilação coloca o binario em /usr/local/bin, faça um link para /usr/bin com o comando:

# ln –s /usr/local/bin/ruby /usr/bin/ruby

2. Instalando o Redmine:

Antes de continuarmos cabe uma observação, segundo o site do redmine (http://www.redmine.org/wiki/redmine/RedmineInstall) se voce vai usar o MySQL como banco de dados convem instalar o pacote C bindings pois o mesmo incrementa dramaticamente a  performance, para isto executamos o comando:

gem install mysql

2.1 opções de download:

O Download do redmine está disponível tanto a versão estável, indicada para produção, como a versão em desenvolvimento, tanto uma como a outra voce deve baixar via cliente do subversion, para saber como instalar o subversion no CentOS consulte a seção pré-requisitos deste texto:

2.2 Para instalar a ultima versão estável:

O projeto tem o controle de versões sob o subversion e os desenvolvedores utilizam a convenção idealizada pelos seus criadores, versões estáveis estão sempre sob a pasta branches, no endereço http://redmine.rubyforge.org/svn/, para descobrir qual é a ultima estável navegue neste endereço, voce deverá ver algo parecido com:

svn – Revision 2670: /branches


Powered by Subversion version 1.5.5 (r34862)
Veja qual é a pasta que tem o maior número antes da palavra stable e monte o endereço para o comando svn (http://redmine.rubyforge.org/svn/branches/0.8-stable/, neste contexto)  para baixa-la, vá para o diretório onde você pretende instalar o redmine, neste caso minha opção é o /opt, e digite o seguinte comando:

# svn co http://redmine.rubyforge.org/svn/branches/0.8-stable/

Este comando criará a pasta 0.8-stable que é o codigo do redmine, esta é a versão estável, claro que com o passar do tempo não vai mais ser 0.8, de qualquer forma é só montar o endereço com a última versão, mudando apenas a ultima parte do mesmo entre as 2 ultimas barras ( /0.8-stable/, neste caso). Pode-se usar, com o svn, o protocolo do próprio svn ao invés do http, neste caso o comando seria:

# svn co svn://rubyforge.org/var/svn/redmine/branches/0.8-stable/

Isto é tudo, a diferença para a versão de desenvolvimento é que nestes endereços ao invés da palavra branches coloque a palavra trunk, mas a menos que você pretenda contribuir com o projeto é preferivel sempre instalar as versões estáveis.

Alternativa para preguiçosos:

Existe um projeto que empacota tudo que é preciso para instalar o redmine ( (Apache, MySQL, Subversion, Ruby, Rails, etc.) disponível em http://bitnami.org/stack/redmine, tem versões para Windows, Linux, Mac x86 e Mac PPC. Promete muito, infelizmente ainda não tive oportunidade de por as mão no bicho, o problema deste tipo de instalação é que voce se torna refém, quem sabe um dia, por curisiodade, eu o baixe e faça uma experiencia em uma maquina virtual aqui.


Tags:

FTP no CentOS 5

March 31st, 2009 4 Comments   Postado em FTP, Linux

Precisei configurar um ftp no CentOS 5.2, depois de alguma pesquisa na rede cheguei a conclusão de que a melhor opção seria o Proftpd e que o mesmo já está incluso nos pacotes do sistema, estando nos pacotes a instalação é baba:

Instalação:
# yum install proftpd
Loading “fastestmirror” plugin
Loading mirror speeds from cached hostfile
* epel: ftp.linux.ncsu.edu
* adobe-linux-i386: linuxdownload.adobe.com
* base: ftp.usf.edu
* updates: updates.interworx.info
* centosplus: mirror.raystedman.net
* addons: www.cyberuse.com
* extras: mirror.cs.vt.edu
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
–> Running transaction check
—> Package proftpd.i386 0:1.3.1-8.el5 set to be updated
–> Finished Dependency Resolution

Dependencies Resolved

==========================================================
Package                 Arch       Version          Repository        Size
==========================================================
Installing:
proftpd                 i386       1.3.1-8.el5      epel              1.7 M

Transaction Summary
==========================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): proftpd-1.3.1-8.el 100% |=========================| 1.7 MB    00:03
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: proftpd                      ######################### [1/1]

Installed: proftpd.i386 0:1.3.1-8.el5
Complete!
[root@localhost Sidon]#

Tentando colocar o servidor no ar:
Bem, a instalação realmente é baba, mas fazer funcionar não foi tão simples, para testar se esta tudo ok vamos executar o seguinte comando:

[root@Server1]# /etc/init.d/proftpd start
Iniciando proftpd:                                        [FALHOU]
[root@Server1]#

Veja que o comando falha, fiquei horas pesquisando este erro na rede e descobri centenas de mensagens em foruns de pessoas com o mesmissimo problema, as soluções? eheheh, é preciso ter muita paciencia, uma verdadeira garimpagem.

Sobre o aquivo /etc/proftpd.conf:
Em vários sites e/ou foruns encontra-se conjeturas de que este erro possa ser alguma configuração errada no arquivo /etc/proftpd.conf, mas pelo menos em todas as minhas instalações este arquivo foi configurado perfeitamente, claro que é desejável que se altere algumas coisas (o que faremos mais a frente) mas apenas para personalização, não é este arquivo o culpado pela falha no start do proftpd.

O Nome do servidor e o arquivo /etc/hosts:
Olhando no prompt de comando (no tópico acima “Tentando colocar o servidor no ar”) é facil verficar que o nome de meu servidor é Server1, acontece que este nome foi alterado com o comando hostname, este comando altera o valor do arquivo /proc/sys/kernel/hostname que é o arquivo que o sistema lê para configurar o nome da maquina, na inicialização,  mas o comando hostname não altera o arquivo /etc/hosts e então o proftpd fica perdido, abaixo o conteudo do /etc/hosts:

127.0.0.1       localhost.localdomain   localhost
::1     localhost6.localdomain6 localhost6

Vamos altera-lo para:

127.0.0.1       localhost
10.1.1.2         Server1.localdomain
::1     localhost6.localdomain6 localhost6

Onde: 10.1.1.2 é o IP da maquina própria maquina.

Colocando o proftpd no ar:
Agora vamos colocar definitivamente o servidor no ar:

[root@Server1]# /etc/init.d/proftpd start
Iniciando proftpd:                                         [  OK ]
[root@Server1]#

Bingo! :-)


Tags:

Sambando no CentOS 5.2

September 25th, 2008 No Comments   Postado em Linux

Resumo:
Em uma rede com estações windows XP fazendo autenticacao em um PDC SAMBA, voce cria um usuário no linux e esquece de atribuir um diretório a ele, ou seja, deixa o diretorio em branco, ai voce adiciona uma máquina windows a rede e cria este mesmo usuário nesta estação, mesmo que limitado e percebe que o drive deste usuário mostra toda a raiz do drive linux. Grrr!

Ambiente:
Servidor CentOS 5.2 com estações windows XP fazendo autenticação em domínio via SAMBA.

Descrição:
Através da linha de comando é possível criar um usuário linux sem informar seu diretório, fazendo isto ao acessar este usuário via GUI (system-config-users) você verá que o campo do usuário está em branco como na figura abaixo:

Gerenciador de usuários CentOS

Não será possível alterar nada neste usuário até que se coloque o diretório do mesmo, mas de qualquer forma o usuário foi “aceito” e ativo, agora vamos supor que voce adicione este usuário ao domínio através do comando “smbpasswd -a”

Supondo que seu arquivo /etc/samba/smb.conf contenha linha do tipo:

logon drive = z:

O que na prática apenas força o mapeamento do drive do usuário na unidade Z.

Agora coloque uma estação XP no domínio e adicione este usuário no domínio, e veja o drive Z dele e tenha um… IAM (Infarto Agudo do Miocardio), eheheh! o drive Z dele é nada mais nada menos do que o / do sistema, é isto mesmo, o usuário terá acesso a todo o conteudo a partir da raiz, é como se ao invéz de não informar o diretório dele, voce tivesse digitado uma barra (/). Assustador.

Solução:
A solução está mostrada na figura acima, coloque o diretório /dev/null que o drive Z nem deverá aparecer na estação windows.


Tags: ,

Instalando Ruby (1.8.7) e Rails 2.1.0 no CentOS 5

August 9th, 2008 4 Comments   Postado em Linux, Ruby

Tentei usar Ruby on Rails no centos 5 e percebi que o rails não está nos pacotes da distribuição então resolvi instalar manualmente e, desta maneira, ter a última versão estável disponível. Em primeiro lugar é preciso desinstalar qualquer versão instalada:

# yum remove ruby

1. Instalando Ruby Versão 1.8.7
Baixe o pacote disponível no site http://www.ruby-lang.org/pt/downloads/ ou diretamente clicando aqui (Versão 1.8.7), copie ou mova o arquivo para o diretório de sua preferência, veja que este é um arquivo compactado que contém os fontes que deverá ser compilado, eu sempre movo este tipo de arquivo para o diretório “/usr/local/src” (claro que para fazer isto você precisa ter permissão, como você vai instalar pacotes, é melhor logar como root), depois de mover o arquivo, vá para o diretório, descompacte-o, vá para o diretório gerado, configure, compile e instale, vamos mostrar passo a passo, considerando que o arquivo foi baixado para a área de trabalho do usuário:
# mv /home/usuario/Desktop/ruby-1.8.7.tar.bz2 /usr/local/src/
# cd /usr/local/src
# tar -xjf ruby-1.8.7.tar.bz2
# cd ruby-1.8.7
# ./configure
# make
# make install

Neste ponto Ruby deve estar instalado, se quiser você pode testar com o comando “ruby -v” que te mostrará a versão:
# ruby -v
ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-linux]

2. Instalando o RubyGems Versão 1.1.1
Agora voce deve baixar o rubygems do site: http://rubyforge.org/frs/?group_id=126&release_id=21058 ou diretamente deste link (Versão 1.1.1) em seguida mova o arquivo para o diretório escolhido (/usr/local/src, neste contexto), descompacte-o e instale através do Ruby, novamente vamos ao “passo a passo”, sempre considerando que o arquivo tenha sido baixado na área de trabalho do usuário:
# mv /home/usuario/Desktop/rubygems-1.1.1.tgz /usr/local/src
# tar -xzf rubygems-1.1.1.tgz
# cd rubygems-1.1.1.tgz
# ruby setup.rb

3. Tentando Instalar o Rails através do RubyGems
Para instalar o rails vamos usar o Gem, para isto execute o comando abaixo:
# gem install rails --include-dependencies

Em minha instalação recebi as seguintes mensagens:
gem install rails --include-dependencies
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
'gem_original_require': no such file to load -- zlib (LoadError)

Como o erro apresentado refere-se a zlib então vamos instalar zlib e, por via das dúvidas, zlib-devel:
# yum install zlib zlib-devel

4. Então vamos fazer algumas configurações extras:
# cd /usr/local/src/ruby-1.8.7/ext/zlib/
# ruby extconf.rb --with-zlib-include=/usr/include
  --with-zlib-lib=/usr/lib
# make
# make install

5. Recompilando e reinstalando rubygems
# cd /usr/local/src/rubygems-1.1.1/
# ruby setup.rb config
# ruby setup.rb setup
# ruby setup.rb install

6. Instalando o Rails
# gem install rails --include-dependencies

Voce deverá obter a seguinte saida:
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Updating metadata for 592 gems from http://gems.rubyforge.org/
................................................................................
.................
Complete
Bulk updating Gem source index for: http://gems.rubyforge.org/
Bulk updating Gem source index for: http://gems.rubyforge.org/
Successfully installed rails-2.1.0
1 gem installed