<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Another Geek Blog &#187; Dicas</title>
	<atom:link href="http://geek.linuxman.pro.br/category/geek/dicas/feed" rel="self" type="application/rss+xml" />
	<link>http://geek.linuxman.pro.br</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Fri, 16 Dec 2011 01:55:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Criando DNS dinâmicos com sua conta no DreamHost</title>
		<link>http://geek.linuxman.pro.br/geek/criando-dns-dinamicos-com-sua-conta-no-dreamhost</link>
		<comments>http://geek.linuxman.pro.br/geek/criando-dns-dinamicos-com-sua-conta-no-dreamhost#comments</comments>
		<pubDate>Fri, 08 Oct 2010 11:30:57 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1454</guid>
		<description><![CDATA[Sou cliente do DreamHost já faz um tempo e acho o serviço deles sensacional. Uma feature que eu ainda não tinha usado é a API que eles disponibilizam para todos os clientes. Bem bacana e flexível. Como em casa eu tenho IP dinâmico e vez por outra ele muda justamente quando preciso acessar de volta [...]]]></description>
			<content:encoded><![CDATA[<p>Sou cliente do DreamHost já faz um tempo e acho o serviço deles sensacional.</p>
<p>Uma feature que eu ainda não tinha usado é a API que eles disponibilizam para todos os clientes. Bem bacana e flexível.</p>
<p>Como em casa eu tenho IP dinâmico e vez por outra ele muda justamente quando preciso acessar de volta resolvi aproveitar e fiz um shell script quick&#8217;n dirty pra usar esse recurso bacana.</p>
<p>Sei que existem diversos serviços de DNS dinâmico por ai, mas preferi essa alternativa que pode ser útil pra mais alguém com uma necessidade parecida. <img src='http://geek.linuxman.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://pastebin.com/XTK05EEV">Tá aqui o script</a>.</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://geek.linuxman.pro.br/tag/dreamhost" title="dreamhost" rel="tag">dreamhost</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/shell" title="shell" rel="tag">shell</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/criando-dns-dinamicos-com-sua-conta-no-dreamhost/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Túnel SSH reverso</title>
		<link>http://geek.linuxman.pro.br/geek/tunel-ssh-reverso</link>
		<comments>http://geek.linuxman.pro.br/geek/tunel-ssh-reverso#comments</comments>
		<pubDate>Thu, 07 Oct 2010 11:30:45 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1448</guid>
		<description><![CDATA[Dica rápida e muito útil: Se você já precisou acessar um servidor Linux atrás de um NAT sobre qual você não tem controle sabe como seria bom poder iniciar a conexão do lado do servidor conectando de volta em você. Isso é possível com um túnel SSH reverso. A idéia é que o servidor que [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida e muito útil:</p>
<p>Se você já precisou acessar um servidor Linux atrás de um NAT sobre qual você não tem controle sabe como seria bom poder iniciar a conexão do lado do servidor conectando de volta em você.</p>
<p>Isso é possível com um túnel SSH reverso. A idéia é que o servidor que você deseja acessar inicia a conexão do lado dele, conecta-se na sua máquina e disponibiliza, via túnel SSH uma porta de volta pra ele.</p>
<p><a href="http://geek.linuxman.pro.br/wp-content/uploads/2010/10/openssh.gif"><img class="aligncenter size-full wp-image-1451" title="openssh" src="http://geek.linuxman.pro.br/wp-content/uploads/2010/10/openssh.gif" alt="" width="520" height="155" /></a></p>
<p>Eu uso isso como um acesso rápido de casa para a empresa naqueles casos onde preciso só acessar rapidamente alguma coisa vinha linha de comando. Tenho acesso VPN se precisar de email, Terminal Services, etc. Seria possível fazer tudo via túnel, mas ai o desempenho não fica grandes coisas e nem é tão conveniente.</p>
<p>O comando (a ser executado do servidor atrás do NAT) é:</p>
<pre>ssh -nNT -R 2222:localhost:22 username@suamaquina</pre>
<p>Uma vez estabelecido o túnel você pode conectar de volta à partir da sua máquina utilizando:</p>
<pre>ssh -p 2222 username@localhost</pre>
<p>Como é possível que a conexão caia, o processo trave ou sei lá o que mais, recomendo os seguintes truques:</p>
<ul>
<li>Use <a href="http://www.dicas-l.com.br/arquivo/logando_com_seguranca_num_servidor_ssh_sem_uso_de_senha.php">chaves públicas para autenticação</a>, assim não precisa de senha</li>
<li>Rode a sessão inicial dentro do <a href="http://www.gnu.org/software/screen/">screen</a>, isso evita perder o console</li>
<li>Rode o túnel dentro de um loop while, pro processo poder ser restaurado caso morra</li>
<li>Pra evitar alguém te sacanear crie um usuário dedicado pra essa conexão e aponte o shell dele para /bin/false</li>
</ul>

	Tags: <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/shell" title="shell" rel="tag">shell</a>, <a href="http://geek.linuxman.pro.br/tag/ssh" title="ssh" rel="tag">ssh</a>, <a href="http://geek.linuxman.pro.br/tag/sysadmin" title="sysadmin" rel="tag">sysadmin</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/tunel-ssh-reverso/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multi Master Replication Manager (MMM)</title>
		<link>http://geek.linuxman.pro.br/geek/multi-master-replication-manager-mmm</link>
		<comments>http://geek.linuxman.pro.br/geek/multi-master-replication-manager-mmm#comments</comments>
		<pubDate>Sat, 02 Oct 2010 23:53:42 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mmm]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1418</guid>
		<description><![CDATA[UPDATE: Acho que arrumei a formatação. Deve estar legível agora. !!!ATENÇÃO &#8211; A visualização de algumas sessões pode estar truncando conteúdo! Pelo jeito a tag &#60;pre&#62; tá quebrada. Preciso olhar isso, mas preguiça, né? Dá pra ler direitinho usando o RSS !!!! Mesmo com a a infra-estrutura toda virtualizada e clusterizada nos ESXi fazer um [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE:</strong> Acho que arrumei a formatação. Deve estar legível agora.<br />
<strong>!!!ATENÇÃO &#8211; A visualização de algumas sessões pode estar truncando conteúdo! Pelo jeito a tag &lt;pre&gt; tá quebrada. Preciso olhar isso, mas preguiça, né? Dá pra ler direitinho usando o <a href="http://geek.linuxman.pro.br/feed">RSS</a> !!!!</strong></p>
<p>Mesmo com a a infra-estrutura toda virtualizada e clusterizada nos ESXi fazer um cluster de MySQL ainda é uma boa idéia.</p>
<p>Não só você pode colocar as duas máquinas em storages diferentes e eliminar mais um ponto de falha mas também você pode dedicar uma (ou mais) VM(s) para read-only.</p>
<p>Isso quer dizer que seus usuários rodando reports e chamando estatísticas/gráficos no meio do dia não vão afetar o desempenho de quem está entrando operações em produção.</p>
<p>Isso dito entra em cena o <a href="http://mysql-mmm.org/">MySQL Multi Master Replication Manager</a> (MMM): Um conjunto de scripts Perl que facilita a replicação e gerenciamento do seu cluster MySQL.</p>
<p>Abaixo os passos que utilizei para criar um cluster de 2 máquinas CentOS 5.5. Vou assumir que você já tem as máquinas em pé com MySQL devidamente instalado.</p>
<p>Além das máquinas rodando o MySQL você vai precisar de uma terceira, que é o monitor. É esse cara que vai manter os olhos no cluster, decidir quando uma máquina morreu e gerenciar os papéis de cada uma.</p>
<p>Nem idéia ainda dos requisitos mínimos desse servidor, visto que apenas fiz um teste pequeno aqui. Mas tá rodando sem reclamar em 1 processador e 512 de RAM.</p>
<h3>Cenário:</h3>
<p>IP Leitura/Gravação MySQL -&gt; 10.0.0.1</p>
<p>IP Somente Leitura MySQL -&gt; 10.0.0.100</p>
<p>IP Servidor MySQL 1 (hostname master) -&gt; 10.0.0.2</p>
<p>IP Servidor MySQL 2 (hostname master2) -&gt; 10.0.0.3</p>
<p>IP Monitor (hostname mon) -&gt; 10.0.0.10</p>
<p>Editando a configuração do MySQL:</p>
<p>Em cada um dos servidores adicione as seguintes linhas embaixo da sessão [mysqld] do <em>/etc/my.cnf</em>:</p>
<pre>
#MMM
read-only
replicate-ignore-db = mysql
binlog-ignore-db = mysql
log-bin=master-binary
relay-log=master-relay
server-id=2
</pre>
<div>Atenção!! master (ali no log-bin e relay-bin) é o HOSTNAME da máquina em questão. Então no meu caso no outro servidor o arquivo receberá as linhas:</div>
<pre>
<div>#MMM</div>
<div>read-only</div>
<div>replicate-ignore-db = mysql</div>
<div>binlog-ignore-db = mysql</div>
<div>log-bin=master2-binary</div>
<div>relay-log=master2-relay</div>
<div>server-id=2</div>
</pre>
<div>Isso vai evitar que mudanças sejam feitas no banco de dados mysql e também define um nome único para os logs que vamos usar mais tarde.</div>
<div>Não esqueça do restart no serviço.</div>
<h3>Instalando o MMM:</h3>
<div>Não sei vocês, mas já passei da idade de compilar pacote na mão. Eu instalo a <a href="http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F">EPEL</a> e já era.</div>
<div>Nos servidores MySQL:</div>
<h3>
<pre>rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum -y install perl-Algorithm-Diff perl-Class-Singleton perl-DBD-MySQL perl-Log-Log4perl perl-Log-Dispatch perl-Proc-Daemon perl-MailTools
yum install mysql-mmm.noarch mysql-mmm-agent.noarch mysql-mmm-tools.noarch</pre>
</h3>
<h3>Configurando os Usuários:</h3>
<p>Dentro de cada servidor precisamos criar 3 usuários: replication, agent e monitor. Abra seu console do MySQL e mande:</p>
<pre>
<pre>GRANT REPLICATION CLIENT                 ON *.* TO 'mmm_monitor'@'10.0.0.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.0.0.%'   IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE                  ON *.* TO 'replication'@'10.0.0.%' IDENTIFIED BY 'replication_password';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;</pre>
</pre>
<p>Abra duas sessões (uma em cada MySQL) e não as feche depois de rodar os comandos acima. Com eles executados faça a seguir:</p>
<pre>SHOW MASTER STATUS;</pre>
<p>E o resultado vai ser algo como:</p>
<pre>
<div id="_mcePaste">mysql&gt; SHOW MASTER STATUS;</div>
<div id="_mcePaste">+-----------------------+----------+--------------+------------------+</div>
<div id="_mcePaste">| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB |</div>
<div id="_mcePaste">+-----------------------+----------+--------------+------------------+</div>
<div id="_mcePaste">| master2-binary.000003 |       98 |              | mysql            |</div>
<div id="_mcePaste">+-----------------------+----------+--------------+------------------+</div>
<div id="_mcePaste">1 row in set (0.00 sec)</div>

mysql&gt;</pre>
<p>Você vai usar essa informação nos comandos abaixo. Note que você deve utilizar o output da execução em uma máquina no input da outra, de forma que crie uma <em>cross-reference</em> entre elas:</p>
<pre>change master to master_host = '10.0.0.3', master_user='replication', master_password='replication_password', master_log_file='master2-binary.000001', master_log_pos=98;</pre>
<p>A seguir vamos editar o <span style="font-family: arial, helvetica; line-height: 16px; font-size: 12px;"><strong>/etc/mysql-mmm/mmm_common.conf:</strong></span></p>
<pre>active_master_role      writer

&lt;host default&gt;
    cluster_interface       eth1
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        replication
    replication_password    replication_password
    agent_user              mmm_agent
    agent_password          agent_password
&lt;/host&gt;

&lt;host master&gt;
    ip      10.0.0.2
    mode    master
    peer    master2
&lt;/host&gt;

&lt;host master2&gt;
    ip      10.0.0.3
    mode    master
    peer    master
&lt;/host&gt;

&lt;role writer&gt;
    hosts   master,master2
    ips     10.0.0.1
    mode    exclusive
&lt;/role&gt;

&lt;role reader&gt;
    hosts   master,master2
    ips     10.0.0.100
    mode    balanced
&lt;/role&gt;</pre>
<p>Este arquivo deve ser exatamente o mesmo nos dois lados do cluster!</p>
<p>E só fica faltando agora editar o <strong>/etc/mysql-mmm/mmm_agent.conf</strong>:</p>
<pre>include mmm_common.conf
this master</pre>
<div>A variável &#8220;this&#8221; indica o hostname. Portanto no meu caso o outro servidor vai ter um &#8220;this master2&#8243;</div>
<p>Com tudo isso pronto vamos no servidor de monitoramento e fazemos:</p>
<pre>rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum install mysql-mmm-monitor.noarch</pre>
<p>Copiamos nele também o <strong>/etc/mysql-mmm/mmm_common.conf.</strong></p>
<p>E depois editamos o <span style="font-family: arial, helvetica; line-height: 16px; font-size: 12px;"><strong>/etc/mysql-mmm/mmm_mon.conf:</strong></span></p>
<pre>&lt;monitor&gt;
    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            10.0.0.1,10.0.0.2,10.0.0.3,10.0.0.100
    auto_set_online     60

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #
&lt;/monitor&gt;

&lt;host default&gt;
    monitor_user        mmm_monitor
    monitor_password    monitor_password
&lt;/host&gt;

debug 0</pre>
<h3>Iniciando os serviços:</h3>
<p>Nos servidores MySQL:</p>
<pre>service mysql-mmm-agent start
chkconfig mysql-mmm-agent on</pre>
<p>No servidor de monitoração:</p>
<pre>service mysql-mmm-monitor start
chkconfig mysql-mmm-monitor on</pre>
<p>Se tudo correu bem em alguns segundos você vai ter os serviços rodando e pode ver o status deles à partir do servidor de monitoração com o seguinte comando:</p>
<pre>[root@mon ~]# mmm_control show
  master(10.0.0.2) master/ONLINE. Roles: writer(10.0.0.1)
  master2(10.0.0.3) master/ONLINE. Roles: reader(10.0.0.100)</pre>
<div>Agora é só aprender mais sobre as opções do mmm_control e correr pro abraço.</div>
<h3>Referências:</h3>
<p><a href="http://www.packtpub.com/article/install-manage-use-mmm-for-mysql-high-availability http://www.packtpub.com/article/setting-up-mysql-replication-for-high-availability?utm_source=rk_mysql_cb_abr2_0510&amp;utm_medium=content&amp;utm_campaign=ramsai http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F http://mysql-mmm.org/mmm2:guide">http://www.packtpub.com/article/install-manage-use-mmm-for-mysql-high-availability</a></p>
<p><a href="http://www.packtpub.com/article/setting-up-mysql-replication-for-high-availability?utm_source=rk_mysql_cb_abr2_0510&amp;utm_medium=content&amp;utm_campaign=ramsai">http://www.packtpub.com/article/setting-up-mysql-replication-for-high-availability?utm_source=rk_mysql_cb_abr2_0510&amp;utm_medium=content&amp;utm_campaign=ramsai</a></p>
<p><a href="http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F">http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F</a></p>
<p><a href="http://mysql-mmm.org/mmm2:guide">http://mysql-mmm.org/mmm2:guide</a></p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/centos" title="CentOS" rel="tag">CentOS</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/mmm" title="mmm" rel="tag">mmm</a>, <a href="http://geek.linuxman.pro.br/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://geek.linuxman.pro.br/tag/replication" title="replication" rel="tag">replication</a>, <a href="http://geek.linuxman.pro.br/tag/sysadmin" title="sysadmin" rel="tag">sysadmin</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/multi-master-replication-manager-mmm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restingindo acesso com rbash</title>
		<link>http://geek.linuxman.pro.br/geek/restingindo-acesso-com-rbash</link>
		<comments>http://geek.linuxman.pro.br/geek/restingindo-acesso-com-rbash#comments</comments>
		<pubDate>Tue, 22 Dec 2009 14:34:27 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[rbash]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1293</guid>
		<description><![CDATA[Como sysadmins vez por outra a gente precisa dar acesso a clientes, parceiros ou outro tipo de usuário temporário/untrusted aos servidores. Apesar de criar um jail root completo ser a melhor solução muitas vezes é mais trabalho do que o necessário e começa a entrar naquele cenário em que a segurança atrapalha a usabilidade e [...]]]></description>
			<content:encoded><![CDATA[<p>Como sysadmins vez por outra a gente precisa dar acesso a clientes, parceiros ou outro tipo de usuário temporário/untrusted aos servidores. Apesar de criar um jail root completo ser a melhor solução muitas vezes é mais trabalho do que o necessário e começa a entrar naquele cenário em que a segurança atrapalha a usabilidade e os negócios.</p>
<p>Uma forma simples de conseguir uma segurança bacana é utilizar o modo restrito do bash. Com isso habilitado o shell irá desabilitar as seguintes funções:</p>
<ul>
<li>Mudar o diretório (cd)</li>
<li>Mudar o valor das variáveis SHELL, PATH, ENV, or BASH_ENV</li>
<li>Comandos que incluem /</li>
<li>Especificar um arquivo que contenha / como fonte para o comando &#8220;.&#8221;</li>
<li>Usar redirecionamento de output (&gt;, &gt;&gt;, |)</li>
<li>etc (man bash para todas as features)</li>
</ul>
<p>Colocando para rodar:</p>
<p>Crie um link do bash para o rbash e adicione o mesmo em /etc/shells:</p>
<pre>ln -s /bin/bash /bin/rbash
echo /bin/rbash &gt;&gt; /etc/shells</pre>
<p>Depois é só mudar o shell do usuário a ser restringido para usar o rbash:</p>
<pre>usermod -s /bin/rbash username</pre>
<p>Combinando isso com traps (do CTRL+C, por exemplo) você consegue criar um ambiente seguro o suficiente para fornecer serviços e acessos aos seus servidores e ainda assim dormir à noite.</p>
<p>Como diria o SuSE: Have a lot of fun!</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://geek.linuxman.pro.br/tag/geek" title="Geek" rel="tag">Geek</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/rbash" title="rbash" rel="tag">rbash</a>, <a href="http://geek.linuxman.pro.br/tag/sysadmin" title="sysadmin" rel="tag">sysadmin</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/restingindo-acesso-com-rbash/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Não reinvente a roda você também</title>
		<link>http://geek.linuxman.pro.br/geek/nao-reinvente-a-roda-voce-tambem</link>
		<comments>http://geek.linuxman.pro.br/geek/nao-reinvente-a-roda-voce-tambem#comments</comments>
		<pubDate>Wed, 01 Jul 2009 02:01:06 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[daemontools]]></category>
		<category><![CDATA[djb]]></category>
		<category><![CDATA[FollowUpTime]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1152</guid>
		<description><![CDATA[Preâmbulo: Recentemente coloquei no ar o FollowUpTime, que como já disse em outros posts é um sistema de monitoração para redes e servidores. Como podem imaginar, um bocado de linhas de código está envolvida num sistema assim e a conta só do engine principal passa das 90 mil linhas. Isso sem incluir templates, javascripts, etc. [...]]]></description>
			<content:encoded><![CDATA[<h2>Preâmbulo:</h2>
<p>Recentemente coloquei no ar o <a href="http://www.followuptime.com">FollowUpTime</a>, que como já disse em outros posts é um sistema de monitoração para redes e servidores.</p>
<p>Como podem imaginar, um bocado de linhas de código está envolvida num sistema assim e a conta só do engine principal passa das 90 mil linhas. Isso sem incluir templates, javascripts, etc.</p>
<p>O sistema é composto de duas partes: Uma que roda num servidor principal gerenciando a maior parte das tarefas e as &#8220;probes&#8221;. As probes são pequenos scripts que recebem instruções sobre hosts a serem testados e respondem para o servidor principal com o tempo de resposta, um OK ou um FAIL. Simples assim.</p>
<p>São essas probes que temos espalhados por vários cantos do planeta.</p>
<p>Porém quando recebi a probe dos desenvolvedores me vi com um pequeno, mas incoveniente problema. Os desenvolvedores realmente optaram pelo <a href="http://en.wikipedia.org/wiki/KISS_principle">princípio KISS</a>. Eles me entregaram uma excelente probe que fazia o que era necessário. E nada mais. Eu tinha nas mãos um daemon que rodava em foreground e jogava mensagens para stdout e stderr e nada mais.</p>
<p>Eu não me demorei e ataquei o problema da forma errada, pensando como um programador e não como um administrador Unix. E acabei reinventado a roda.</p>
<h2>Introdução &#8211; O problema</h2>
<p>Quando percebi o que eu tinha nas mãos logo pensei nos problemas que eu precisava resolver:</p>
<ul>
<li>Preciso iniciar o daemon sempre que der boot na máquina</li>
<li>Preciso ser capaz de rodar em daemon em background, ou vai me zoar a seqüencia de boot</li>
<li>Posso precisar parar/reiniciar/iniciar manualmente este daemon</li>
<li>Se o processo morrer eu tenho que ser notificado e que, de preferência, ele seja reiniciado automaticamente</li>
<li>E sim, esse processo não deve rodar como root</li>
</ul>
<p>Já velhaco de Linux logo pensei num script para ser colocado em /etc/init.d/ que ia resolver boa parte dos meus problemas. Com uma combinação bonita de bash scripting, várias ferramentas e comandos Linux que só se conhece depois de muito tempo de casa (como nohup, pidof, &amp;) e gambiarras na crontab eu consegui. Consegui reinventar a roda. Não vou entrar em detalhes da solução que fiz, pois apesar de 100% funcional não era nem de perto tão bonita quanto:</p>
<h2>A solução &#8211; Daemontools</h2>
<p>Nosso caro amigo <a href="http://cr.yp.to/">D.J.B</a>, autor do famoso Qmail também já passou por um problema parecido com o meu, mas ao invés de criar um solução simples para resolver um problema pontual ele foi mais longe. Ele criou uma solução global que atende o problema dele, o meu e provavelmente também o seu.</p>
<p>Na <a href="http://cr.yp.to/daemontools.html">página oficial do daemontools</a> tem uma tabela, que traduzo abaixo, comparando a ferramenta dele com outras abordagens (incluindo a minha, que utilizava init.d):</p>
<table border="0" cellspacing="0" frame="void" rules="none">
<colgroup>
<col width="242"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
</colgroup>
<tbody>
<tr>
<td style="border-left: 1px solid #000000;" width="242" height="18" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">Funcionalidade</span></em></strong></td>
<td width="86" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">inittab</span></em></strong></td>
<td width="86" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">ttys</span></em></strong></td>
<td width="86" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">init.d</span></em></strong></td>
<td width="86" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">rc.local</span></em></strong></td>
<td style="border-right: 1px solid #000000;" width="86" align="center" bgcolor="#2300dc"><strong><em><span style="font-family: Verdana; color: #ffffff;">/service</span></em></strong></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="34" align="left"><strong><span style="font-family: Verdana;">Fácil instalação e remoção de serviços</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="18" align="left"><strong><span style="font-family: Verdana;">Simples startup inicial</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="18" align="left"><strong><span style="font-family: Verdana;">Reinicializações confiáveis</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="18" align="left"><strong><span style="font-family: Verdana;">Sinalização simples e confiável</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="18" align="left"><strong><span style="font-family: Verdana;">Estado de processo limpo</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
<tr>
<td style="border: 1px solid #000000;" height="18" align="left"><strong><span style="font-family: Verdana;">Portabilidade</span></strong></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Não</span></td>
<td style="border: 1px solid #000000;" align="center"><span style="font-family: Verdana;">Sim</span></td>
</tr>
</tbody>
</table>
<p>Dá para perceber que o cara pensou em tudo e não tem porquê reinventar a roda. Vamos utilizar o daemontools!</p>
<h2>Instalando o Daemontools no Debian 5.0 (Lenny):</h2>
<p>Quem já instalou o daemontools no Debian no passado lembra que pentelhação que era, pois devido a licenciamento era apenas um pseudo-pacote que roda um script para realmente baixar/instalar o daemontools. Isso foi resolvido quando o D.J.B mudou a licença e agora o pacote é um .deb &#8220;de primeira linha&#8221;.</p>
<pre># apt-get install daemontools daemontools-run</pre>
<p>Pronto. Só isso. Próximo passo&#8230;</p>
<h2>Criando um serviço</h2>
<p>Para fins didáticos vamos criar um serviço simples, chamado homer.sh cujo conteúdo é:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #007800;">progname</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">basename</span> <span style="color: #007800;">$0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">LOG</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$progname</span>.log
<span style="color: #007800;">AVISO</span>=<span style="color: #ff0000;">&quot;Hummm... rosquinha...&quot;</span>
<span style="color: #007800;">SONECA</span>=<span style="color: #000000;">2</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span><span style="color: #000000; font-weight: bold;">`</span>: <span style="color: #ff0000;">&quot;starting <span style="color: #007800;">$progname</span>...&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$LOG</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span><span style="color: #000000; font-weight: bold;">`</span>: <span style="color: #ff0000;">&quot;<span style="color: #007800;">$progname</span>: <span style="color: #007800;">$AVISO</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$LOG</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span><span style="color: #000000; font-weight: bold;">`</span>: <span style="color: #ff0000;">&quot;<span style="color: #007800;">$progname</span>: tirando uma soneca de <span style="color: #007800;">$SONECA</span> segundos...&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$LOG</span>
    <span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #007800;">$SONECA</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Não faz muito, mas funciona. E tem exatamente as mesmas características do meu serviço da probe, inclusive rodando em foregroud. E agora? Como &#8220;daemonizar&#8221; isso atendendo todos aqueles meus requisitos iniciais?</p>
<h2>Juntando no daemontools</h2>
<p>Crie um diretório qualquer onde vai guardar seus serviços de forma organizada. Recomendo algo como /opt/services por exemplo. Lá vamos criar um subdiretório homer e moveremos nosso script para lá:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># mkdir -p /opt/services/homer</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># mv homer.sh /opt/services/homer/</span></pre></div></div>

<p>Para controlar a inicialização dele precisamos de um script dentro do mesmo diretório chamado run. Simples assim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">exec</span> .<span style="color: #000000; font-weight: bold;">/</span>homer.sh</pre></div></div>

<p>E estamos 50% prontos. Não esqueça que tanto o homer.sh como o run precisam ser executáveis!</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># chmod 755 /opt/services/homer/*</span></pre></div></div>

<p>Agora para ativar o serviço vem a parte realmente fácil:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ln -s /opt/services/homer /etc/service/</span></pre></div></div>

<p>Conte até 5 e dê um ps auxw no prompt. Sim&#8230; o seu serviço está no ar.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ps aux|grep homer</span>
root      <span style="color: #000000;">3250</span>  <span style="color: #000000;">0.0</span>  <span style="color: #000000;">0.1</span>   <span style="color: #000000;">1620</span>   <span style="color: #000000;">324</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">28</span>   <span style="color: #000000;">0</span>:00 supervise homer
root      <span style="color: #000000;">3450</span>  <span style="color: #000000;">1.2</span>  <span style="color: #000000;">0.4</span>   <span style="color: #000000;">2792</span>  <span style="color: #000000;">1220</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">31</span>   <span style="color: #000000;">0</span>:00 <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>services<span style="color: #000000; font-weight: bold;">/</span>homer<span style="color: #000000; font-weight: bold;">/</span>homer.sh</pre></div></div>

<p>Observem que além do serviço ainda existe um supervisor que manterá os olhos nele e, caso o mesmo morra, será automaticamente reiniciado. Observem que o PID do processo é 3450, certo?</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># kill -9 3450</span>
<span style="color: #666666; font-style: italic;"># ps aux|grep homer</span>
root      <span style="color: #000000;">3250</span>  <span style="color: #000000;">0.0</span>  <span style="color: #000000;">0.1</span>   <span style="color: #000000;">1620</span>   <span style="color: #000000;">324</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">28</span>   <span style="color: #000000;">0</span>:00 supervise homer
root      <span style="color: #000000;">3660</span>  <span style="color: #000000;">8.0</span>  <span style="color: #000000;">0.4</span>   <span style="color: #000000;">2788</span>  <span style="color: #000000;">1212</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">33</span>   <span style="color: #000000;">0</span>:00 <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>services<span style="color: #000000; font-weight: bold;">/</span>homer<span style="color: #000000; font-weight: bold;">/</span>homer.sh</pre></div></div>

<p>Menos de um segundo depois de matar o processo um novo (3660) já assume o lugar. Pra que mesmo que perdi todo aquele tempo desenvolvendo um script de inicialização e depois com outro que ficava vendo se o processo estava vivo?</p>
<h2>Indo mais adiante</h2>
<p>OK, mas um dos requisitos também era rodar o processo como usuário não privilegiado, certo? E, como podem ver ali em cima, tá rodando como root. Vamos modificar um pouco nosso serviço então, criando um usuário, mudando as permissões do arquivo de log e editando o run:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># useradd  -s /bin/false -d /dev/null simpson</span>
<span style="color: #666666; font-style: italic;"># chown simpson:simpson /tmp/homer.sh.log</span></pre></div></div>

<p>E agora o conteúdo do /opt/services/homer/run passa a ser:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">exec</span> setuidgid simpson .<span style="color: #000000; font-weight: bold;">/</span>homer.sh</pre></div></div>

<p>Feito. Vamos reiniciar o processo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># svc -t /etc/service/homer</span>
<span style="color: #666666; font-style: italic;"># ps aux|grep homer</span>
root      <span style="color: #000000;">3250</span>  <span style="color: #000000;">0.0</span>  <span style="color: #000000;">0.1</span>   <span style="color: #000000;">1620</span>   <span style="color: #000000;">324</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">28</span>   <span style="color: #000000;">0</span>:00 supervise homer
simpson   <span style="color: #000000;">4004</span>  <span style="color: #000000;">1.0</span>  <span style="color: #000000;">0.5</span>   <span style="color: #000000;">3304</span>  <span style="color: #000000;">1484</span> ?        S    <span style="color: #000000;">19</span>:<span style="color: #000000;">39</span>   <span style="color: #000000;">0</span>:02 <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span> .<span style="color: #000000; font-weight: bold;">/</span>homer.sh</pre></div></div>

<p>Olha que coisa linda. Tudo que precisamos fazer foi falar pro daemontools: Executa esse cara usando esse id aqui. E pronto.</p>
<h2>Comandos que você precisa saber:</h2>
<h3>Parar um serviço:</h3>
<pre># svc -d /etc/service/serviço</pre>
<h3>Reiniciar um serviço parado manualmente:</h3>
<pre># svc -u /etc/service/serviço</pre>
<h3>Enviando um sinal TERM (comportamento equivalente a restart):</h3>
<pre># svc -t /etc/service/serviço</pre>
<h3>Colocando um serviço em pausa:</h3>
<pre># svc -p /etc/service/serviço</pre>
<h3>Continuando um serviço pausado:</h3>
<pre># svc -c /etc/service/serviço</pre>
<h2>Ainda mais</h2>
<p>Tem muito mais que pode ser feito em cima do daemontools, combinando com ferramentas como multilog e ucspi-tcp. Dê uma olhada na página<a href="http://thedjbway.org/"> the djb way</a>, que foi <span style="text-decoration: line-through;">ostensivamente copiada</span> extensivamente utilizada como referência para este artigo.</p>
<p>E não vamos esquecer do jabá: Conheça o <a href="http://www.followuptime.com">FollowUpTime</a>! Em 5 minutos ou menos você pode se cadastrar e monitorar um site ou serviço gratuitamente!</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/daemontools" title="daemontools" rel="tag">daemontools</a>, <a href="http://geek.linuxman.pro.br/tag/djb" title="djb" rel="tag">djb</a>, <a href="http://geek.linuxman.pro.br/tag/followuptime" title="FollowUpTime" rel="tag">FollowUpTime</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/sysadmin" title="sysadmin" rel="tag">sysadmin</a>, <a href="http://geek.linuxman.pro.br/tag/unix" title="unix" rel="tag">unix</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/nao-reinvente-a-roda-voce-tambem/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Nested variables no Bash</title>
		<link>http://geek.linuxman.pro.br/geek/dicas/nested-variables-no-bash</link>
		<comments>http://geek.linuxman.pro.br/geek/dicas/nested-variables-no-bash#comments</comments>
		<pubDate>Sat, 30 May 2009 01:18:49 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=1090</guid>
		<description><![CDATA[Não sei ao certo como é o nome em português. Variáveis aninhadas? Me deparei com um problema assim hoje: Eu tinha uma função num script shell que recebia um parâmetro de sucesso ou erro. Eu executava algumas coisas e depois tinha que jogar uns dados no arquivo respectivo. Então inicialmente tinha setado uma variável com [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei ao certo como é o nome em português. Variáveis aninhadas? <img src='http://geek.linuxman.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Me deparei com um problema assim hoje: Eu tinha uma função num script shell que recebia um parâmetro de sucesso ou erro. Eu executava algumas coisas e depois tinha que jogar uns dados no arquivo respectivo.</p>
<p>Então inicialmente tinha setado uma variável com os paths dos caminhos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">ARQUIVO_SUCESSO</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>sucesso
<span style="color: #007800;">ARQUIVO_ERRO</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>erro</pre></td></tr></table></div>

<p>Minha função recebia o status como o primeiro argumento ($1) e por isso depois de processar eu precisaria de algo assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;batatinha&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #007800;">$ARQUIVO_</span><span style="color: #007800;">$1</span></pre></td></tr></table></div>

<p>Mas logo percebi que isso não funciona. A solução, no entanto, é simples:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;batatinha&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>  $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">eval</span> <span style="color: #7a0874; font-weight: bold;">echo</span> \<span style="color: #007800;">$ARQUIVO_</span><span style="color: #007800;">$1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>Anotem ai na caixa de truques do Bash.</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://geek.linuxman.pro.br/tag/scripts" title="scripts" rel="tag">scripts</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/dicas/nested-variables-no-bash/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truques no Bash</title>
		<link>http://geek.linuxman.pro.br/geek/truques-no-bash</link>
		<comments>http://geek.linuxman.pro.br/geek/truques-no-bash#comments</comments>
		<pubDate>Thu, 15 Jan 2009 14:08:34 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=641</guid>
		<description><![CDATA[Alguns truques para facilitar o seu dia-a-dia na linha de comando: !$ Representa a última parte do último comando executado. Exemplo: $ grep macarrao comidas.txt macarrao $  cat !$ cat comidas.txt arroz feijao batata frita macarrao Expansão automática Expande automaticamente os valores entre chaves. Uma mão na roda para loops: $ for i in {1..4}; [...]]]></description>
			<content:encoded><![CDATA[<p>Alguns truques para facilitar o seu dia-a-dia na linha de comando:</p>
<h2>!$</h2>
<p>Representa a última parte do último comando executado. Exemplo:</p>
<pre>$ grep macarrao comidas.txt
macarrao</pre>
<pre>$  cat !$
cat comidas.txt
arroz
feijao
batata frita
macarrao</pre>
<h2>Expansão automática</h2>
<p>Expande automaticamente os valores entre chaves. Uma mão na roda para loops:</p>
<pre>$ for i in {1..4}; do echo "i vale $i"; done
i vale 1
i vale 2
i vale 3
i vale 4</pre>
<p>Também funciona com letras:</p>
<pre>$ for i in {a..d}; do echo "i vale $i"; done
i vale a
i vale b
i vale c
i vale d</pre>
<p>E pode ser útil em situações assim:</p>
<pre>$ mkdir -p diretorio{a..c}/sub-diretorio{w..z}</pre>
<pre>$ find .
.
./diretorioc
./diretorioc/sub-diretoriow
./diretorioc/sub-diretoriox
./diretorioc/sub-diretorioz
./diretorioc/sub-diretorioy
./diretoriob
./diretoriob/sub-diretoriow
./diretoriob/sub-diretoriox
./diretoriob/sub-diretorioz
./diretoriob/sub-diretorioy
./diretorioa
./diretorioa/sub-diretoriow
./diretorioa/sub-diretoriox
./diretorioa/sub-diretorioz
./diretorioa/sub-diretorioy</pre>
<h2>^antigo^novo</h2>
<p>Executa o último comando substituindo o valor antigo pelo novo. Exemplo:</p>
<pre>$ cat /etb/lsb-release
cat: /etb/lsb-release: No such file or directory</pre>
<pre>$ ^b^c
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.10
DISTRIB_CODENAME=intrepid
DISTRIB_DESCRIPTION="Ubuntu 8.10"</pre>
<h2>!!</h2>
<p>Reexecuta o último comando. Útil quando você esqueceu algo, como o sudo na frente do comando. Exemplo:</p>
<pre>$ whoami
user</pre>
<pre>$ sudo !!
sudo whoami
root</pre>
<p>Mais truques e dicas <a href="http://samrowe.com/wordpress/advancing-in-the-bash-shell/">aqui</a>.</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://geek.linuxman.pro.br/tag/cli" title="CLI" rel="tag">CLI</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/shell" title="shell" rel="tag">shell</a>, <a href="http://geek.linuxman.pro.br/tag/unix" title="unix" rel="tag">unix</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/truques-no-bash/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lighttpd como proxy</title>
		<link>http://geek.linuxman.pro.br/geek/dicas/lighttpd-como-proxy</link>
		<comments>http://geek.linuxman.pro.br/geek/dicas/lighttpd-como-proxy#comments</comments>
		<pubDate>Tue, 09 Dec 2008 19:32:29 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=577</guid>
		<description><![CDATA[Esses dias me deparei com a seguinte situação: Precisava implementar um serviço baseado em web. Esse serviço vai acumular bastante informações sobre a infra-estrutura da empresa e por isso precisa de autenticação para garantir que apenas as pessoas corretas tenham acesso a essas informações. Mas por motivos que nem vale a pena citar, afinal não [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias me deparei com a seguinte situação: Precisava implementar um serviço baseado em web. Esse serviço vai acumular bastante informações sobre a infra-estrutura da empresa e por isso precisa de autenticação para garantir que apenas as pessoas corretas tenham acesso a essas informações.</p>
<p>Mas por motivos que nem vale a pena citar, afinal não quero uma gastrite, o bagulho não aceita autenticação.</p>
<p>A forma que eu arranjei para resolver isso foi simples: A porta do serviço original é bloqueada via iptables e instalei o lighttpd para servir como proxy, já me aproveitando das features de autenticação dele.</p>
<p>Caso precise fazer algo parecido com isso um dia, segue abaixo como fiz:</p>
<p>Na sessão server.modules adicione:</p>
<pre>            "mod_proxy",</pre>
<p>E logo depois dessa sessão adicione:</p>
<pre>auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/etc/lighttpd/.htpasswd"
auth.require = ( "/" =&gt;
  (
    "method"  =&gt; "basic",
    "realm"   =&gt; "status",
    "require" =&gt; "valid-user"
  )
)

$HTTP["remoteip"] == "192.168.0.0/24" {
          proxy.server  = ( "" =&gt; (
          ( "host" =&gt; "127.0.0.1", "port" =&gt; 8080 )
           )
      )
}</pre>
<p>Onde:</p>
<p><em>192.168.0.0/24</em> = Rede que poderá acessar a aplicação</p>
<p><em>&#8220;host&#8221; =&gt; &#8220;127.0.0.1&#8243;, &#8220;port&#8221; =&gt; 8080</em> = IP e porta originais da sua aplicação.</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/lighttpd" title="lighttpd" rel="tag">lighttpd</a>, <a href="http://geek.linuxman.pro.br/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://geek.linuxman.pro.br/tag/network" title="network" rel="tag">network</a>, <a href="http://geek.linuxman.pro.br/tag/proxy" title="proxy" rel="tag">proxy</a>, <a href="http://geek.linuxman.pro.br/tag/web" title="web" rel="tag">web</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/dicas/lighttpd-como-proxy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando o VIM como IDE para o Bash</title>
		<link>http://geek.linuxman.pro.br/geek/dicas/utilizando-o-vim-como-ide-para-o-bash</link>
		<comments>http://geek.linuxman.pro.br/geek/dicas/utilizando-o-vim-como-ide-para-o-bash#comments</comments>
		<pubDate>Tue, 09 Sep 2008 15:11:51 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=430</guid>
		<description><![CDATA[Como já devem saber eu sou da turminha do vi. Nada contra o Emacs, lógico, mas vi é vi. O relacionamento com ele nunca começa bem. Lembro-me que a primeira vez que abri o vi, num SCO Unix, o único jeito que consegui sair do editor foi rebootando a máquina. Eu não tinha nem idéia [...]]]></description>
			<content:encoded><![CDATA[<p>Como já devem saber <a href="http://geek.linuxman.pro.br/tag/vi">eu sou da turminha do vi</a>. Nada contra o Emacs, lógico, mas vi é vi.<br />
O relacionamento com ele nunca começa bem. Lembro-me que a primeira vez que abri o vi, num SCO Unix, o único jeito que consegui sair do editor foi rebootando a máquina. Eu não tinha nem idéia de que bastava um ESC:q! para cumprir a tarefa. Mas passados 11 anos ou mais deste início traumático, posso dizer que me dou bem com o editor hoje em dia, utilizando-o inclusive para escrever posts no meu blog, como neste momento o faço.</p>
<p>Às vezes o que sentia falta era de alguma coisa para facilitar minha vida quando estava fazendo meus scripts. Alguns pedaços de código você usa de novo, de novo e de novo. E é um saco ficar redigitando.<br />
Importar para dentro do arquivo atual (ESC:r /path/arquivo) ajuda, mas não resolve.</p>
<h2>A solução</h2>
<p>Pesquisando achei o sensacional <a href="http://www.vim.org/scripts/script.php?script_id=365">BASH-IDE</a> para vim. Resolveu todos os meus problemas, exceto a falta de competência como programador.<br />
Utilizando o BASH-IDE podemos configurar um template para novos arquivos, de forma que sempre que abro um novo arquivo .sh no vim ele já adiciona o cabeçalho com informação sobre o autor, data, tag $id$ pro cvs e algumas variáveis e funções que eu coloco em todos os meus script.</p>
<p>O autor do BASH-IDE foi cuidadoso para facilitar a documentação de forma que vários atalhos já são auto-documentados.<br />
Uma nova função criada utilizando o BASH-IDE automaticamente terá o seguinte aspecto:</p>
<pre>function teste ()
{

}    # ----------  end of function teste  ----------</pre>
<p>E ao chamar o atalho para documentação de função você recebe este template:</p>
<pre>#===  FUNCTION  ================================================================
#          NAME:
#   DESCRIPTION:
#    PARAMETERS:
#       RETURNS:
#===============================================================================</pre>
<p>Como tudo é baseado em arquivos texto, as customizações só dependem da sua boa vontade. E ainda vem com um uma cheat sheet em pdf pronta para imprimir e pendurar na sua baia! <img src='http://geek.linuxman.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Boa diversão</p>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/dicas/utilizando-o-vim-como-ide-para-o-bash/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Morre!</title>
		<link>http://geek.linuxman.pro.br/geek/dicas/morre</link>
		<comments>http://geek.linuxman.pro.br/geek/dicas/morre#comments</comments>
		<pubDate>Mon, 08 Sep 2008 19:36:37 +0000</pubDate>
		<dc:creator>Eri</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://geek.linuxman.pro.br/?p=428</guid>
		<description><![CDATA[Uma funçãozinha muito útil do Perl é a &#8220;die&#8221;. Fica fácil gerar mensagens de erro e já abortar a execução numa tacada só. Segue a versão primo-pobre para bash: function die () { echo "$progname: $1"; exit ${2:-1}  ; } Exemplos de uso: [ ! -f /tmp/teste.txt ] &#38;&#38; die "Arquivo não existe" ou [ [...]]]></description>
			<content:encoded><![CDATA[<p>Uma funçãozinha muito útil do Perl é a &#8220;die&#8221;. Fica fácil gerar mensagens de erro e já abortar a execução numa tacada só.</p>
<p>Segue a versão primo-pobre para bash:</p>
<pre>function die () { echo "$progname: $1"; exit ${2:-1}  ; }</pre>
<p>Exemplos de uso:</p>
<pre>[ ! -f /tmp/teste.txt ] &amp;&amp; die "Arquivo não existe"</pre>
<p>ou</p>
<pre>[ "$A" -ne 0 ] &amp;&amp; die "Nao encontrei o zero" 99</pre>

	Tags: <a href="http://geek.linuxman.pro.br/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://geek.linuxman.pro.br/tag/perl" title="perl" rel="tag">perl</a><br />
]]></content:encoded>
			<wfw:commentRss>http://geek.linuxman.pro.br/geek/dicas/morre/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

