Histórico por ‘Linux’ Categoria:
Um pouco de sed e regex, excluindo várias ocorrencias de um mesmo arquivo
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.
Instalando o FirebirdSS-2.1.3 no Opensuse 11.1
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
PhpMyAdmin atualizado no CentOS 5.3
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: phpMyAdmin
Instalando o nginx no CentOS 5.3 através do Yum
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
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.
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: CentOS
Última versão do Redmine no linux (CentOS)
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: Redmine
FTP no CentOS 5
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: proftpd
Sambando no CentOS 5.2
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:
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.
Instalando Ruby (1.8.7) e Rails 2.1.0 no CentOS 5
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
