<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Geek on the road]]></title>
  
  <link href="http://sgmac.com/" />
  <updated>2013-02-17T00:06:07+01:00</updated>
  <id>http://sgmac.com/</id>
  <author>
    <name><![CDATA[Sergio Galv&aacute;n]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/sgmac" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="sgmac" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Apache Redirect HTTPS]]></title>
    <link href="http://sgmac.com/2012/10/27/apache-https-redirect/" />
    <updated>2012-10-27T11:54:00+02:00</updated>
    <id>http://sgmac.com/2012/10/27/apache-https-redirect</id>
    <content type="html"><![CDATA[<p>If you need to set up redirection with Apache, do not waste your time using the <em>Rewrite</em> module, instead use <strong>Redirect</strong>, the easy way:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;VirtualHost *:80>
</span><span class='line'>    ServerName lab.sgmac.com
</span><span class='line'>    Redirect / https://lab.sgmac.com/
</span><span class='line'>&lt;/VirtualHost >
</span><span class='line'>
</span><span class='line'>&lt;VirtualHost *:443>
</span><span class='line'>    ServerName lab.sgmac.com
</span><span class='line'>    ... 
</span><span class='line'>&lt;/VirtualHost ></span></code></pre></td></tr></table></div></figure>


<p>I find this pretty straightforward and more readable.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rewriting git commits]]></title>
    <link href="http://sgmac.com/2012/06/30/rewriting-git-commits/" />
    <updated>2012-06-30T17:28:00+02:00</updated>
    <id>http://sgmac.com/2012/06/30/rewriting-git-commits</id>
    <content type="html"><![CDATA[<p>In this post I&#8217;ll explain how to rewrite your git commits and how to upload your private git repositories to github, but keeping your commit history. Recently I forgot to define my email address on the  <strong>&#8216;.gitconfig</strong>&#8217; file, this means all my history is dirty, and I wanted to fix it. Of course you can rewrite your commit history.</p>

<p>These are my last two commits on a repository with the wrong email address,</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">commit</span> <span class="mi">2</span><span class="n">c096fc8c8fa425bfd6c11a1223ec9a512383784</span>
</span><span class='line'><span class="n">Author</span><span class="p">:</span> <span class="n">Srgio</span> <span class="n">Galvan</span> <span class="o">&lt;</span><span class="n">false_email</span><span class="nd">@gmail.com</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">Date</span><span class="p">:</span>   <span class="n">Thu</span> <span class="n">Jun</span> <span class="mi">28</span> <span class="mi">15</span><span class="p">:</span><span class="mi">40</span><span class="p">:</span><span class="mi">08</span> <span class="mi">2012</span> <span class="o">+</span><span class="mo">0300</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Add</span> <span class="nb">filter</span> <span class="n">example</span>
</span><span class='line'>
</span><span class='line'><span class="n">commit</span> <span class="n">b70b8832df12a53069ae36e928ffb7fbce2dea2e</span>
</span><span class='line'><span class="n">Author</span><span class="p">:</span> <span class="n">Sergio</span> <span class="n">Galvan</span> <span class="o">&lt;</span><span class="n">false_email</span><span class="nd">@gmail.com</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">Date</span><span class="p">:</span>   <span class="n">Wed</span> <span class="n">Jun</span> <span class="mi">27</span> <span class="mo">00</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">18</span> <span class="mi">2012</span> <span class="o">+</span><span class="mo">0300</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Last</span> <span class="n">exercise</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then I found  <strong>git filter-branch(1)</strong> :</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git filter-branch --env-filter ' export GIT_AUTHOR_EMAIL=good_email_address@gmail.com'</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s pretty straighforward, let&#8217;s check the new email address:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">commit</span> <span class="mi">4</span><span class="n">cf11c1d39fd4d91792d37f90ca51eb5b9037477</span>
</span><span class='line'><span class="n">Author</span><span class="p">:</span> <span class="n">Sergio</span> <span class="n">Galvan</span> <span class="o">&lt;</span><span class="n">good_email_addres</span><span class="nd">@gmail.com</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">Date</span><span class="p">:</span>   <span class="n">Thu</span> <span class="n">Jun</span> <span class="mi">28</span> <span class="mi">15</span><span class="p">:</span><span class="mi">40</span><span class="p">:</span><span class="mi">08</span> <span class="mi">2012</span> <span class="o">+</span><span class="mo">0300</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Add</span> <span class="nb">filter</span> <span class="n">example</span>
</span><span class='line'>
</span><span class='line'><span class="n">commit</span> <span class="n">f391ad1d131b287df8aa7df15e01ce707b64419f</span>
</span><span class='line'><span class="n">Author</span><span class="p">:</span> <span class="n">Sergio</span> <span class="n">Galvan</span> <span class="o">&lt;</span><span class="n">good_email_addressgmail</span><span class="o">.</span><span class="n">com</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">Date</span><span class="p">:</span>   <span class="n">Wed</span> <span class="n">Jun</span> <span class="mi">27</span> <span class="mo">00</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">18</span> <span class="mi">2012</span> <span class="o">+</span><span class="mo">0300</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Last</span> <span class="n">exercise</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you might already know, the SHA-1 hash is different, now you can&#8217;t keep pushing to your remote if you ever had one. On the other hand, I have my respository almost ready to pushing into github. First create your respository in github, and the proceed with the next step:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git  push --mirror git@github.com:githubuser/myrepo.git</span></code></pre></td></tr></table></div></figure>


<p>There are more properties you might want to define, check theme out.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Puppet apt-sources]]></title>
    <link href="http://sgmac.com/2012/05/25/puppet-apt-sources/" />
    <updated>2012-05-25T23:44:00+02:00</updated>
    <id>http://sgmac.com/2012/05/25/puppet-apt-sources</id>
    <content type="html"><![CDATA[<p>I started making my own puppet modules and I want to share <strong>apt-sources</strong>. It&#8217;s a pretty straightforward module to manage debian repositories in a simple way. If you&#8217;d like getting started with puppet keep reading.</p>

<p>Basically the module allows to define one or more repositories, besides of the area. In Debian we find three areas, <strong>main,contrib and non-free</strong>, though the last two are not part of Debian.  In any case, you could find different areas when using non-official repositories. The module itself only updates the <em>/etc/apt/sources.list</em> file, you do not forget to update your system afterwards.</p>

<figure class='code'><figcaption><span>init.pp </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="k">class</span> <span class="n">apt</span><span class="o">-</span><span class="n">sources</span> <span class="p">(</span>
</span><span class='line'>        <span class="vg">$release</span> <span class="o">=</span> <span class="vg">$:</span><span class="ss">:lsbdistcodename</span><span class="p">,</span>
</span><span class='line'>        <span class="vg">$area</span> <span class="o">=</span> <span class="k">undef</span><span class="p">,</span>
</span><span class='line'>        <span class="vg">$sources</span> <span class="o">=</span> <span class="k">undef</span>
</span><span class='line'><span class="p">){</span>
</span><span class='line'>    <span class="n">file</span> <span class="p">{</span> <span class="s1">&#39;/etc/apt/sources.list&#39;</span><span class="p">:</span>
</span><span class='line'>            <span class="k">ensure</span>  <span class="o">=&gt;</span> <span class="n">present</span><span class="p">,</span>
</span><span class='line'>            <span class="n">owner</span>   <span class="o">=&gt;</span> <span class="s1">&#39;root&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">group</span>   <span class="o">=&gt;</span> <span class="s1">&#39;root&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">mode</span>    <span class="o">=&gt;</span> <span class="s1">&#39;0644&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">content</span> <span class="o">=&gt;</span> <span class="n">template</span><span class="p">(</span><span class="s1">&#39;apt-sources/sources.list.erb&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now we only need to define the template.</p>

<figure class='code'><figcaption><span>sources.list.erb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&lt;</span><span class="sx">% @area </span><span class="o">=</span> <span class="n">area</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="nb">Array</span><span class="p">)</span> <span class="p">?</span> <span class="n">area</span><span class="o">.</span><span class="n">flatten</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="p">:</span> <span class="n">area</span>  <span class="sx">%&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="sx"># Default repositories</span>
</span><span class='line'><span class="sx">deb http://ftp.ie.debian.org/debian/ &lt;%= release %&gt;</span> <span class="n">main</span>
</span><span class='line'><span class="n">deb</span><span class="o">-</span><span class="n">src</span> <span class="n">http</span><span class="ss">:/</span><span class="o">/</span><span class="n">ftp</span><span class="o">.</span><span class="n">ie</span><span class="o">.</span><span class="n">debian</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">debian</span><span class="o">/</span> <span class="o">&lt;</span><span class="sx">%= release %&gt; main</span>
</span><span class='line'>
</span><span class='line'><span class="sx">&lt;% if sources.is_a?(Array) %&gt;</span>
</span><span class='line'><span class="sx">&lt;% sources.each do |repo| -%&gt;</span>
</span><span class='line'><span class="sx">deb &lt;%=</span> <span class="n">repo</span> <span class="sx">%&gt; &lt;%= release %&gt;</span> <span class="o">&lt;</span><span class="sx">%= @area %&gt;</span>
</span><span class='line'><span class="sx">&lt;% end -%&gt;</span>
</span><span class='line'><span class="sx">&lt;% else %&gt;</span>
</span><span class='line'><span class="sx">deb &lt;%=</span> <span class="n">sources</span> <span class="sx">%&gt; &lt;%= release %&gt;</span> <span class="o">&lt;%=</span> <span class="vi">@area</span> <span class="sx">%&gt;</span>
</span><span class='line'><span class="sx">&lt;% end %&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And some examples:</p>

<figure class='code'><figcaption><span>sources.pp </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Example 1: Just one source and one area</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="p">{</span> <span class="s1">&#39;apt-sources&#39;</span><span class="p">:</span>
</span><span class='line'>        <span class="n">area</span>    <span class="o">=&gt;</span> <span class="s1">&#39;main&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="n">sources</span> <span class="o">=&gt;</span> <span class="s1">&#39;http://backports.deban.org/debian-backports&#39;</span><span class="p">,</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Example 2:  Using arrays</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="p">{</span> <span class="s1">&#39;apt-sources&#39;</span><span class="p">:</span>
</span><span class='line'>        <span class="n">area</span>    <span class="o">=&gt;</span> <span class="o">[</span><span class="s1">&#39;main&#39;</span><span class="p">,</span><span class="s1">&#39;non-free&#39;</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>        <span class="n">sources</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s1">&#39;http://backports.deban.org/debian-backports&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="s1">&#39;http://www.deb-multimedia.org&#39;</span><span class="o">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This approach is quick and useful, and does the work. Just a bunch of ideas to improve it: <em>Keyring management, Management of areas in <strong>apt-sources.d</strong>, and apt-sources as a puppet type</em>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recovering a VDI disk]]></title>
    <link href="http://sgmac.com/2012/04/17/recovering-a-vdi-disk/" />
    <updated>2012-04-17T14:08:00+02:00</updated>
    <id>http://sgmac.com/2012/04/17/recovering-a-vdi-disk</id>
    <content type="html"><![CDATA[<p>Recently I ran into an issue regarding a vm&#8217;s storage. It turns out one of the VDI on my virtual machine was faulty. I had some data inside and I didn&#8217;t want to lose it.</p>

<p>First of all, we can convert from VDI to raw. I did the conversion from Windows, I guess it should be the same from Linux.</p>

<figure class='code'><figcaption><span>converting </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> C:/VDIs/VboxManage internalcommands converttoraw  disk-vm-testing.vdi  vdisk.raw
</span></code></pre></td></tr></table></div></figure>


<p>Now let&#8217;s see what is inside the raw disk:</p>

<figure class='code'><figcaption><span>fdisk </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="n">dm</span><span class="nv">@testing:</span><span class="c1">#{~} fdisk  -l vdisk.raw</span>
</span><span class='line'><span class="n">You</span> <span class="n">must</span> <span class="n">set</span> <span class="n">cylinders</span><span class="o">.</span>
</span><span class='line'><span class="n">You</span> <span class="n">can</span> <span class="k">do</span> <span class="n">this</span> <span class="n">from</span> <span class="n">the</span> <span class="n">extra</span> <span class="n">functions</span> <span class="n">menu</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">Disk</span> <span class="n">vdisk</span><span class="o">.</span><span class="n">raw:</span> <span class="mi">0</span> <span class="n">MB</span><span class="p">,</span> <span class="mi">0</span> <span class="n">bytes</span>
</span><span class='line'><span class="mi">255</span> <span class="n">heads</span><span class="p">,</span> <span class="mi">63</span> <span class="n">sectors</span><span class="o">/</span><span class="n">track</span><span class="p">,</span> <span class="mi">0</span> <span class="n">cylinders</span>
</span><span class='line'><span class="n">Units</span> <span class="o">=</span> <span class="n">cylinders</span> <span class="n">of</span> <span class="mi">16065</span> <span class="o">*</span> <span class="mi">512</span> <span class="o">=</span> <span class="mi">8225280</span> <span class="n">bytes</span>
</span><span class='line'><span class="n">Sector</span> <span class="n">size</span> <span class="p">(</span><span class="n">logical</span><span class="sr">/physical): 512 bytes /</span> <span class="mi">512</span> <span class="n">bytes</span>
</span><span class='line'><span class="n">I</span><span class="sr">/O size (minimum/o</span><span class="n">ptimal</span><span class="p">):</span> <span class="mi">512</span> <span class="n">bytes</span> <span class="o">/</span> <span class="mi">512</span> <span class="n">bytes</span>
</span><span class='line'><span class="n">Disk</span> <span class="n">identifier:</span> <span class="mh">0x000d598a</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Device</span> <span class="n">Boot</span>      <span class="n">Start</span>         <span class="n">End</span>      <span class="n">Blocks</span>   <span class="n">Id</span>  <span class="n">System</span>
</span><span class='line'><span class="n">vdisk</span><span class="o">.</span><span class="n">raw1</span>   <span class="o">*</span>           <span class="mi">1</span>         <span class="mi">996</span>     <span class="mi">7993344</span>   <span class="mi">83</span>  <span class="n">Linux</span>
</span><span class='line'><span class="n">Partition</span> <span class="mi">1</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">end</span> <span class="n">on</span> <span class="n">cylinder</span> <span class="n">boundary</span><span class="o">.</span>
</span><span class='line'><span class="n">vdisk</span><span class="o">.</span><span class="n">raw2</span>             <span class="mi">996</span>        <span class="mi">1045</span>      <span class="mi">392193</span>    <span class="mi">5</span>  <span class="n">Extended</span>
</span><span class='line'><span class="n">Partition</span> <span class="mi">2</span> <span class="n">has</span> <span class="n">different</span> <span class="n">physical</span><span class="o">/</span><span class="n">logical</span> <span class="n">endings:</span>
</span><span class='line'>     <span class="n">phys</span><span class="o">=</span><span class="p">(</span><span class="mi">1023</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">63</span><span class="p">)</span> <span class="n">logical</span><span class="o">=</span><span class="p">(</span><span class="mi">1044</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span>
</span><span class='line'><span class="n">vdisk</span><span class="o">.</span><span class="n">raw5</span>             <span class="mi">996</span>        <span class="mi">1045</span>      <span class="mi">392192</span>   <span class="mi">82</span>  <span class="n">Linux</span> <span class="n">swap</span> <span class="o">/</span> <span class="n">Solaris</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case I only have a first partition, because the second one was used as swap device. I have to find out the offset where the data is.</p>

<figure class='code'><figcaption><span>offset </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='perl'><span class='line'><span class="n">dm</span><span class="nv">@testing:</span><span class="c1">#{~}  parted vdisk.raw</span>
</span><span class='line'><span class="n">GNU</span> <span class="n">Parted</span> <span class="mf">2.3</span>
</span><span class='line'><span class="n">Using</span> <span class="sr">/media/s</span><span class="n">f_Downloads</span><span class="o">/</span><span class="n">vdisk</span><span class="o">.</span><span class="n">raw</span>
</span><span class='line'><span class="n">Welcome</span> <span class="n">to</span> <span class="n">GNU</span> <span class="n">Parted</span><span class="o">!</span> <span class="n">Type</span> <span class="s">&#39;help&#39;</span> <span class="n">to</span> <span class="n">view</span> <span class="n">a</span> <span class="n">list</span> <span class="n">of</span> <span class="n">commands</span><span class="o">.</span>
</span><span class='line'><span class="p">(</span><span class="n">parted</span><span class="p">)</span> <span class="n">unit</span>
</span><span class='line'><span class="n">Unit</span><span class="p">?</span>  <span class="p">[</span><span class="n">compact</span><span class="p">]?</span> <span class="n">B</span>
</span><span class='line'><span class="p">(</span><span class="n">parted</span><span class="p">)</span> <span class="n">p</span>
</span><span class='line'><span class="n">Model:</span>  <span class="p">(</span><span class="n">file</span><span class="p">)</span>
</span><span class='line'><span class="n">Disk</span> <span class="sr">/media/s</span><span class="n">f_Downloads</span><span class="o">/</span><span class="n">vdisk</span><span class="o">.</span><span class="n">raw:</span> <span class="mi">8589934592</span><span class="n">B</span>
</span><span class='line'><span class="n">Sector</span> <span class="n">size</span> <span class="p">(</span><span class="n">logical</span><span class="sr">/physical): 512B/</span><span class="mi">512</span><span class="n">B</span>
</span><span class='line'><span class="n">Partition</span> <span class="n">Table:</span> <span class="n">msdos</span>
</span><span class='line'>
</span><span class='line'><span class="n">Number</span>  <span class="n">Start</span>        <span class="n">End</span>          <span class="n">Size</span>         <span class="n">Type</span>      <span class="n">File</span> <span class="nb">system</span>     <span class="n">Flags</span>
</span><span class='line'> <span class="mi">1</span>      <span class="mi">1048576</span><span class="n">B</span>     <span class="mi">8186232831</span><span class="n">B</span>  <span class="mi">8185184256</span><span class="n">B</span>  <span class="n">primary</span>   <span class="n">ext4</span>            <span class="n">boot</span>
</span><span class='line'> <span class="mi">2</span>      <span class="mi">8187280384</span><span class="n">B</span>  <span class="mi">8588886015</span><span class="n">B</span>  <span class="mi">401605632</span><span class="n">B</span>   <span class="n">extended</span>
</span><span class='line'> <span class="mi">5</span>      <span class="mi">8187281408</span><span class="n">B</span>  <span class="mi">8588886015</span><span class="n">B</span>  <span class="mi">401604608</span><span class="n">B</span>   <span class="n">logical</span>   <span class="n">linux</span><span class="o">-</span><span class="n">swap</span><span class="p">(</span><span class="n">v1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="n">parted</span><span class="p">)</span><span class="n">q</span>
</span></code></pre></td></tr></table></div></figure>


<p>The &#8216;Start&#8217; column shows me the offset for the partition I&#8217;m interested in. Next step is to map this offset with a loopback device and mount it.</p>

<figure class='code'><figcaption><span>mount</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">dm</span><span class="nd">@testing</span><span class="p">:</span><span class="c">#{~} losetup -o 1048576  /dev/loop0  vdisk.raw</span>
</span><span class='line'><span class="n">dm</span><span class="nd">@testing</span><span class="p">:</span><span class="c">#{~} mount /dev/loop0 /mnt/vdi</span>
</span><span class='line'><span class="n">dm</span><span class="nd">@testing</span><span class="p">:</span><span class="c">#{~} mount | grep loop</span>
</span><span class='line'><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">loop0</span> <span class="n">on</span> <span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="n">vdi</span> <span class="nb">type</span> <span class="n">ext4</span> <span class="p">(</span><span class="n">rw</span><span class="p">)</span>
</span><span class='line'><span class="n">dm</span><span class="nd">@testing</span><span class="p">:</span><span class="c">#{~} ls /mnt/vdi</span>
</span><span class='line'><span class="n">ls</span> <span class="o">/</span><span class="n">mnt</span><span class="o">/</span>
</span><span class='line'><span class="nb">bin</span>  <span class="n">boot</span>  <span class="n">dev</span>  <span class="n">etc</span>  <span class="n">home</span>  <span class="n">initrd</span><span class="o">.</span><span class="n">img</span>  <span class="n">lib</span>  <span class="n">lost</span><span class="o">+</span><span class="n">found</span>  <span class="n">media</span>  <span class="n">mnt</span>  <span class="n">opt</span>  <span class="n">proc</span>  <span class="n">root</span>  <span class="n">sbin</span>  <span class="n">selinux</span>  <span class="n">srv</span>  <span class="n">sys</span>  <span class="n">tmp</span>  <span class="n">usr</span>  <span class="n">var</span>  <span class="n">vmlinuz</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point you should be able to access your data, or at least some part of it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My git functions]]></title>
    <link href="http://sgmac.com/2012/03/24/git-functions/" />
    <updated>2012-03-24T21:20:00+01:00</updated>
    <id>http://sgmac.com/2012/03/24/git-functions</id>
    <content type="html"><![CDATA[<p>After reading  <a href="http://www.debian-administration.org/articles/316"><strong>An introduction to bash completion</strong></a> I came up with an idea. I thought it would be really nice to have bash completion for all my git repositories. Furthermore I have a couple of functions that help me out to create new repos on the remote server and <strong>gitfy</strong> the current folder. For the next two functions I assume public key is enabled.</p>

<p>The function below takes a list of directories and creates bare respositories on the remote server.</p>

<figure class='code'><figcaption><span>g  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#############################</span>
</span><span class='line'><span class="c"># Create several repostiories</span>
</span><span class='line'><span class="c">#############################</span>
</span><span class='line'>
</span><span class='line'>g<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>   <span class="o">[</span> <span class="nv">$# </span>-lt 1 <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">printf</span> <span class="s1">&#39;repo name missing\n&#39;</span> <span class="o">&amp;&amp;</span> <span class="k">return </span>126 ;
</span><span class='line'>   <span class="k">for</span><span class="o">((</span><span class="nv">i</span><span class="o">=</span>1; i &lt;<span class="o">=</span> <span class="nv">$#;</span> i++<span class="o">))</span>
</span><span class='line'>   <span class="k">do</span>
</span><span class='line'><span class="k">        </span><span class="nb">eval </span><span class="nv">repo</span><span class="o">=</span><span class="s1">&#39;$&#39;</span><span class="nv">$i</span>
</span><span class='line'>        ssh git@server.com  <span class="s2">&quot; mkdir ${repo}.git &amp;&amp; cd ${repo}.git &amp;&amp; git init --bare &amp;&gt; /dev/null&quot;</span>
</span><span class='line'>   <span class="k">done</span>
</span><span class='line'>
</span><span class='line'><span class="k"> </span><span class="nb">echo</span> <span class="s2">&quot;${repo}.git&quot;</span> &gt;&gt; <span class="nv">$HOME</span>/.repolist
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to keep a list of my repositories, every time I create a new repository I append it to my <em>repolist</em>. Sometimes I have been working on something and I want to add the current directory to a remote repository, here is another function that helps:</p>

<figure class='code'><figcaption><span>gitfy </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#############################</span>
</span><span class='line'><span class="c"># Gitfy the current directory</span>
</span><span class='line'><span class="c">#############################</span>
</span><span class='line'>
</span><span class='line'>gitfy<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>   g <span class="k">${</span><span class="nv">PWD</span><span class="p">##*/</span><span class="k">}</span>
</span><span class='line'>
</span><span class='line'>cat <span class="s">&lt;&lt;-EOF &gt; .gitignore</span>
</span><span class='line'><span class="s">*~</span>
</span><span class='line'><span class="s">*#</span>
</span><span class='line'><span class="s">EOF</span>
</span><span class='line'>
</span><span class='line'>   git init . <span class="o">&amp;&amp;</span> git add . <span class="o">&amp;&amp;</span><span class="se">\</span>
</span><span class='line'>                 git commit -m <span class="s2">&quot;First commit&quot;</span> <span class="o">&amp;&amp;</span> <span class="se">\</span>
</span><span class='line'>                 git remote add origin ssh://git@server.com/home/git/<span class="k">${</span><span class="nv">PWD</span><span class="p">##*/</span><span class="k">}</span>.git <span class="o">&amp;&amp;</span> <span class="se">\</span>
</span><span class='line'>                 git push origin master
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the bash completion for my git repositories :</p>

<figure class='code'><figcaption><span>clone </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">##############################</span>
</span><span class='line'><span class="c"># Repositories bash completion</span>
</span><span class='line'><span class="c">##############################</span>
</span><span class='line'>clone<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        git clone ssh://git@server.com/home/git/<span class="k">${</span><span class="nv">1</span><span class="k">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>_clone<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">local </span>cur prev opts
</span><span class='line'>    <span class="nv">COMPREPLY</span><span class="o">=()</span>
</span><span class='line'>    <span class="nv">cur</span><span class="o">=</span><span class="s2">&quot;${COMP_WORDS[COMP_CWORD]}&quot;</span>
</span><span class='line'>    <span class="nv">prev</span><span class="o">=</span><span class="s2">&quot;${COMP_WORDS[COMP_CWORD-1]}&quot;</span>
</span><span class='line'>    <span class="nv">opts</span><span class="o">=</span><span class="k">$(</span> cat <span class="nv">$HOME</span>/.repolist <span class="k">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">cur</span><span class="k">}</span> <span class="o">==</span> * <span class="o">]]</span> ; <span class="k">then</span>
</span><span class='line'><span class="k">        </span><span class="nv">COMPREPLY</span><span class="o">=(</span> <span class="k">$(</span><span class="nb">compgen</span> -W <span class="s2">&quot;${opts}&quot;</span> <span class="k">${</span><span class="nv">cur</span><span class="k">})</span> <span class="o">)</span>
</span><span class='line'>        <span class="k">return </span>0
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="nb">complete</span> -F _clone clone
</span></code></pre></td></tr></table></div></figure>


<p>And the example :</p>

<figure class='code'><figcaption><span>example </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>adm@testing:<span class="k">${</span><span class="p">~</span><span class="k">}</span>clone <span class="o">[</span>TAB<span class="o">]</span>
</span><span class='line'>mygits.git             puppet-template.git    tcp.git
</span><span class='line'>capistrano.git         course-saas.git        dotfiles.git
</span><span class='line'>ldap.git               notes.git              puppet-vps.git
</span><span class='line'>todos.git
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;m quite sure it could be much better but for me works fine. It&#8217;s pretty handy, and I had the opportunity to play around with bash completion.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Strace to the rescue]]></title>
    <link href="http://sgmac.com/2012/03/03/strace-to-the-rescue/" />
    <updated>2012-03-03T11:55:00+01:00</updated>
    <id>http://sgmac.com/2012/03/03/strace-to-the-rescue</id>
    <content type="html"><![CDATA[<p>Today in the IRC somebody asked which would be the best way to know if a process already exists in the system. The choice was between using <strong>test -d /proc/PID</strong> or <strong>kill -0 PID</strong>.</p>

<p>Both of them do the job, the question here, we want to use the best one. Suddenly I remembered an option that comes with <strong>strace</strong> and lets you query the number of syscalls for a given trace. Besides we can order based on the number of syscalls.</p>

<figure class='code'><figcaption><span>cmd1 </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>adm@testing:<span class="k">${</span><span class="p">~</span><span class="k">}</span> strace -c -S calls <span class="nb">kill</span> -0 1234
</span><span class='line'><span class="nb">kill</span>: No such process
</span><span class='line'>% <span class="nb">time     </span>seconds  usecs/call     calls    errors syscall
</span><span class='line'>------ ----------- ----------- --------- --------- ----------------
</span><span class='line'>  -nan    0.000000           0        12           mmap2
</span><span class='line'>  -nan    0.000000           0         6           close
</span><span class='line'>  -nan    0.000000           0         5           open
</span><span class='line'>  -nan    0.000000           0         5           fstat64
</span><span class='line'>  -nan    0.000000           0         4           <span class="nb">read</span>
</span><span class='line'>  -nan    0.000000           0         4         4 access
</span><span class='line'>  -nan    0.000000           0         3           brk
</span><span class='line'>  -nan    0.000000           0         3           munmap
</span><span class='line'>  -nan    0.000000           0         2           mprotect
</span><span class='line'>  -nan    0.000000           0         1           write
</span><span class='line'>  -nan    0.000000           0         1           execve
</span><span class='line'>  -nan    0.000000           0         1           getpid
</span><span class='line'>  -nan    0.000000           0         1         1 <span class="nb">kill</span>
</span><span class='line'>  -nan    0.000000           0         1           dup
</span><span class='line'>  -nan    0.000000           0         1         1 _llseek
</span><span class='line'>  -nan    0.000000           0         1           fcntl64
</span><span class='line'>  -nan    0.000000           0         1           set_thread_area
</span><span class='line'>------ ----------- ----------- --------- --------- ----------------
</span><span class='line'>100.00    0.000000                    <span class="o">{</span>52<span class="o">}</span>       6 total
</span></code></pre></td></tr></table></div></figure>


<p>On the other hand, the second command&#8217;s output:</p>

<figure class='code'><figcaption><span>cmd2 </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>adm@testing:<span class="k">${</span><span class="p">~</span><span class="k">}</span>strace -c -S calls <span class="nb">test</span> -d /proc/1234
</span><span class='line'>% <span class="nb">time     </span>seconds  usecs/call     calls    errors syscall
</span><span class='line'>------ ----------- ----------- --------- --------- ----------------
</span><span class='line'>  -nan    0.000000           0         7           mmap2
</span><span class='line'>  -nan    0.000000           0         5           close
</span><span class='line'>  -nan    0.000000           0         3           open
</span><span class='line'>  -nan    0.000000           0         3         3 access
</span><span class='line'>  -nan    0.000000           0         3           brk
</span><span class='line'>  -nan    0.000000           0         3           fstat64
</span><span class='line'>  -nan    0.000000           0         2           mprotect
</span><span class='line'>  -nan    0.000000           0         1           <span class="nb">read</span>
</span><span class='line'>  -nan    0.000000           0         1           execve
</span><span class='line'>  -nan    0.000000           0         1           munmap
</span><span class='line'>  -nan    0.000000           0         1         1 stat64
</span><span class='line'>  -nan    0.000000           0         1           set_thread_area
</span><span class='line'>------ ----------- ----------- --------- --------- ----------------
</span><span class='line'>100.00    0.000000                   <span class="o">{</span>31<span class="o">}</span>         4 total
</span></code></pre></td></tr></table></div></figure>


<p>The column <em>calls</em> helps to know the number of performed syscalls. Using <em>test -d /proc/PID</em> gives a better performance due to a minor number of syscalls.</p>

<p>I really like strace, is a tool you had better know, here I got syscalls statistics, but you can trace syscalls either specific or a bunch of them, follow forked processes and much more, this is only a simple example. I hope it helps.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RMbackups]]></title>
    <link href="http://sgmac.com/2012/02/27/rmbackups/" />
    <updated>2012-02-27T23:20:00+01:00</updated>
    <id>http://sgmac.com/2012/02/27/rmbackups</id>
    <content type="html"><![CDATA[<p>The first time I came up with this script was a long time ago and I did it with Perl. Today I feel like doing such a thing using Ruby.</p>

<p> Basically the script takes a number of directories and an optional pattern (last argument) from the command line. If either a directory or a pattern is not providen, it looks for in the current directory, and use a default pattern.</p>

<p>The script searches for those files matching the pattern and deletes thoses files from the system. Besides, it checks the owner of the files is the same that is running the script.</p>

<figure class='code'><figcaption><span>rmbackups.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;find&#39;</span>
</span><span class='line'><span class="n">directories</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'><span class="n">pattern</span> <span class="o">=</span> <span class="sr">/.*~$/</span>
</span><span class='line'><span class="k">if</span> <span class="o">!</span> <span class="no">ARGV</span><span class="o">.</span><span class="n">empty?</span>  <span class="ow">and</span> <span class="no">ARGV</span><span class="o">.</span><span class="n">size</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">pattern</span> <span class="o">=</span> <span class="sr">/</span><span class="si">#{</span><span class="no">ARGV</span><span class="o">.</span><span class="n">pop</span><span class="si">}</span><span class="sr">/</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">directories</span> <span class="o">=</span> <span class="p">(</span><span class="no">ARGV</span><span class="o">.</span><span class="n">empty?</span><span class="p">)</span> <span class="p">?</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="bp">__FILE__</span><span class="p">))</span> <span class="p">:</span> <span class="no">ARGV</span>
</span><span class='line'><span class="n">directories</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">d</span><span class="o">|</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">Find</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">d</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">file</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">owned?</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>         <span class="nb">puts</span> <span class="s2">&quot;Deleting </span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>   <span class="no">File</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The default pattern is set to delete backup files ending with <strong>&#8221;~&#8221;</strong>. Below is the ouput:</p>

<figure class='code'><figcaption><span>shell </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>dev@testing<span class="k">$(</span>~<span class="k">)</span> ./rmbackups.rb
</span><span class='line'>Deleting /home/dev/ruby/findit.rb~
</span><span class='line'>Deleting /home/dev/ruby/delicious.rb~
</span><span class='line'>Deleting /home/dev/ruby/rmbackups.rb~
</span></code></pre></td></tr></table></div></figure>


<p>You might change the pattern from the command line:</p>

<figure class='code'><figcaption><span>shell </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>.dev@testing<span class="k">$(</span>~<span class="k">)</span> /rmbackups.rb /var/tmp /tmp  <span class="s2">&quot;.?#.*#$&quot;</span>
</span><span class='line'>Deleting /var/tmp/#.vile.somethin#
</span><span class='line'>Deleting /var/tmp/.#strangefile#
</span><span class='line'>Deleting /tmp/#file#
</span><span class='line'>Deleting /tmp/#a-strangefile#
</span></code></pre></td></tr></table></div></figure>


<p>This is how it works, I did not try too many different patterns beyond these.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interesting shell]]></title>
    <link href="http://sgmac.com/2012/02/25/interesting-shell/" />
    <updated>2012-02-25T18:46:00+01:00</updated>
    <id>http://sgmac.com/2012/02/25/interesting-shell</id>
    <content type="html"><![CDATA[<p>Finally here is my last compilation about shell environment variables.</p>

<h3>1.CDPATH</h3>

<p>If this is set, keeps a directory list separated by &#8216;:&#8217; and every time that you type the command <strong>&#8220;cd DIR&#8221;</strong> it searches for the directory in the above list, even if your current directory is not the right one. Let&#8217;s see an example, I define the directory holding all my git repositories, if I try to make <strong>cd repo</strong> from any part on the system, even if I not in the right place, I will get there:</p>

<figure class='code'><figcaption><span>shell </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">CDPATH</span><span class="o">=</span><span class="s2">&quot;~/mygits&quot;</span>
</span><span class='line'>devadm@testing<span class="k">$(</span>~<span class="k">)</span>ls mygits
</span><span class='line'>blog scripts org-mode cv
</span><span class='line'>devadm@testing<span class="k">$(</span>/usr/share/doc<span class="k">)</span> <span class="nb">cd  </span>blog
</span><span class='line'>devadm@testing<span class="k">$(</span>~/mygits/blog<span class="k">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>In my opinion is useful to keep just one directory or probably up to two, more than this, it could get messy.</p>

<h3>2.FIGNORE</h3>

<p>If you want to narrow down the ouput when performing filename completion, this is without a doubt your shell env. When set, it ignores suffixes while performing filename completion.</p>

<figure class='code'><figcaption><span>shell </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>devadm@testing<span class="k">$(</span>~<span class="k">)</span><span class="nb">export </span><span class="nv">FIGIGNORE</span><span class="o">=</span><span class="s2">&quot;#:.o:~&quot;</span>
</span><span class='line'>devadm@testing<span class="k">$(</span>~/application<span class="k">)</span>ls file*
</span><span class='line'>file1.o file2.o file1 file1 file~
</span><span class='line'>devadm@testing<span class="k">$(</span>~<span class="k">)</span>ls <span class="o">[</span>TAB<span class="o">]</span> <span class="o">[</span>TAB<span class="o">]</span>
</span><span class='line'>file1 file2
</span></code></pre></td></tr></table></div></figure>


<p>I mentioned this shell env because it was curious to me. I guess I have never found any case where I had to use such a thing, but that does not mean it wouldn&#8217;t be useful to somebody else.</p>

<h3>3.HISTCONTROL</h3>

<p>It can be set to  <strong>ignorespace</strong> , and it does not record words starting with empty space. On the other hand I do not like to have duplicated lines,  <strong>ingnoredups</strong> does not repeat entries in the history. Finally, I like to join both options so I use <strong>ignoreboth</strong> instead.</p>

<figure class='code'><figcaption><span>.bashrc</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">HISTCONTROL</span><span class="o">=</span>ignoreboth
</span></code></pre></td></tr></table></div></figure>


<h3>4.HOSTFILE</h3>

<p>It holds the path to a file containing a list of hosts in the same format as <em>/etc/hosts</em> , if it is set, tries to complete the hostname with one of the entries on the file. Otherwiese will look for <em>/etc/hosts</em>.</p>

<p>It could be pretty useful if you want to keep a personal file with your hosts.</p>

<figure class='code'><figcaption><span>.bashrc </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">HOSTFILE</span><span class="o">=</span><span class="s2">&quot;~/.myhosts&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The only problem I see here, if I you want to access hosts defined in <strong>/etc/hosts</strong>. You could make a script that checks if there is a new entry in the <strong>/etc/hosts</strong> and then appends the last entries to your personal list. Once again, this is only an idea I came up with, but actually I did not follow through.</p>

<h3>5.TMPDIR</h3>

<p>If set, bash uses its value as the name of a directory in which creates temporary files. With this option I can set my personal temp directory.</p>

<figure class='code'><figcaption><span>.bashrc </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> <span class="nb">export </span><span class="nv">TMPDIR</span><span class="o">=</span><span class="s2">&quot;~/.tmpbash&quot;</span>
</span><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<h3>6.TMOUT</h3>

<p>Sets a timeout and affects to <strong>read</strong> or <strong>select</strong> builtin commands, when not input is given. An interesting case is if you set this to your current shell. After N seconds without providing any input it will kill your shell, so keep this in mind.</p>

<figure class='code'><figcaption><span>tmout-read.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Sets to 3 seconds timeout</span>
</span><span class='line'><span class="nv">TMOUT</span><span class="o">=</span><span class="s2">&quot;3&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">printf</span> <span class="s1">&#39;Could you please give me an absolute path ?&#39;</span>
</span><span class='line'><span class="nb">read</span> -r -s -n10 absolute_path
</span><span class='line'>
</span><span class='line'><span class="o">[</span> -z name <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">printf</span> <span class="s1">&#39;Your path is : %s\n&#39;</span> <span class="nv">$absolute_path</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well, the last posts were focused on bash shell environment because I was digging into the man bash and I found quite interesting things I did not know, I hope some of them were useful for you as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shell environment variables]]></title>
    <link href="http://sgmac.com/2012/02/16/shell-environment-variables/" />
    <updated>2012-02-16T21:34:00+01:00</updated>
    <id>http://sgmac.com/2012/02/16/shell-environment-variables</id>
    <content type="html"><![CDATA[<p>In the <a href="http://sgmac.com/2012/02/08/nifty-bash-scripting">previous</a> post I wrote about different topics such as BASH_ENV, subshells or expressions. Today I&#8217;m going to talk about <strong>shell enviroment variables</strong>.</p>

<h3>1. BASHPID</h3>

<p> This is the PID of the current bash process. This behaviour is different from $$ in cases such a subshell where $BASHPID says the PID of the subshell, whereas $$ shows the PID of the bash holding the subshell.</p>

<figure class='code'><figcaption><span>bashpid.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$$</span> <span class="nv">$BASHPID</span> <span class="c"># 23353 23353</span>
</span><span class='line'><span class="nv">$ </span><span class="nb">echo</span> <span class="s1">&#39;Subsshell&#39;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$$</span>; <span class="nb">echo</span> <span class="nv">$BASHPID</span><span class="k">)</span><span class="c"># 21060 23353</span>
</span></code></pre></td></tr></table></div></figure>


<h3>2. BASH_LINENO</h3>

<p>Number of lines in the current script, from the beginning to the line the function was called from.</p>

<figure class='code'><figcaption><span>bash_lineno.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c">#!/bin/bash </span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>show_env_vars<span class="o">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;$FUNCNAME&quot;</span>    <span class="c"># show_env_vars</span>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;$BASH_LINENO&quot;</span> <span class="c"># Number on lines till show_env_vars was call (11)</span>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;$LINENO&quot;</span>      <span class="c"># Current line 7</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>show_env_vars
</span></code></pre></td></tr></table></div></figure>


<h3>3. DIRSTACK</h3>

<p>Array with the directories you are moving using popd and pushd builtins to add/remove directories.</p>

<figure class='code'><figcaption><span>dirstack.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># After doing some pushd </span>
</span><span class='line'>
</span><span class='line'><span class="nv">$ </span><span class="k">for </span>i in  <span class="k">${</span><span class="nv">DIRSTACK</span><span class="p">[@]</span><span class="k">}</span>; <span class="k">do </span><span class="nb">printf</span>  <span class="s1">&#39;DIR: %s\n&#39;</span> <span class="nv">$i</span>; <span class="k">done                                                                                                                                                               </span>
</span><span class='line'>
</span><span class='line'>DIR: /tmp
</span><span class='line'>DIR: /var/tmp/testing
</span><span class='line'>DIR: /home/cartoon
</span><span class='line'>DIR: /usr/share/doc
</span><span class='line'>DIR: /var/tmp
</span><span class='line'>DIR: /var/www
</span></code></pre></td></tr></table></div></figure>


<h3>4. EUID and GROUPS</h3>

<p><strong>EUID</strong>  of the current user, initialized at shell startup. This variable is read only. On the other hand <strong>GROUPS</strong>  is an array of groups which the current user is member of.</p>

<figure class='code'><figcaption><span>euid_groups.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>0; i &lt; <span class="k">${#</span><span class="nv">GROUPS</span><span class="p">[@]</span><span class="k">}</span>;  i++<span class="o">))</span>; <span class="k">do </span><span class="nb">printf</span> <span class="s1">&#39;gid:%d\n&#39;</span> <span class="k">${</span><span class="nv">GROUPS</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="k">}</span><span class="err">&quot;</span> ; <span class="k">done</span>
</span><span class='line'>gid: 1002
</span><span class='line'>gid: 1001
</span></code></pre></td></tr></table></div></figure>


<h3>5. Gathering OS info</h3>

<p>Below there are some of the shell environment vars you could use, for instance if you need to check the architecture. I have not tried in Sparc yet but I would like.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">HOSTNAME</span><span class="o">=</span><span class="s">&#39;Self explanatory&#39;</span>
</span><span class='line'><span class="n">HOSTTYPE</span><span class="o">=</span><span class="s">&#39;Arhcitecture i486&#39;</span><span class="o">.</span>
</span><span class='line'><span class="n">OSTYPE</span><span class="o">=</span><span class="s">&#39;Operating System where bash is running i.e: linux-gnu&#39;</span>
</span><span class='line'><span class="n">PPID</span><span class="o">=</span><span class="s">&#39;Parent process ID of the current shell&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>6. Random numbers</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>RANDOM A random number betwwen 0 and 32767.
</span><span class='line'><span class="c"># Getting a random number between 0 and 99</span>
</span><span class='line'>
</span><span class='line'><span class="nb">echo</span> <span class="err">&quot;</span>RANDOM: <span class="k">$((</span> <span class="nv">$RANDOM</span> <span class="o">%</span> <span class="m">100</span><span class="k">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>In sum, there are a wide number of shell environment variables to keep in mind if you are scripting. Next time I will post more shell vars, but focused on customizing your bash shell.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nifty bash scripting]]></title>
    <link href="http://sgmac.com/2012/02/08/nifty-bash-scripting/" />
    <updated>2012-02-08T00:01:00+01:00</updated>
    <id>http://sgmac.com/2012/02/08/nifty-bash-scripting</id>
    <content type="html"><![CDATA[<p>One of the things I should do more often is to read the man pages. Recently I have spent some time digging into the bash man pages, and I would like to share some interesting stuff.</p>

<h3>1.<strong>BASH_ENV</strong></h3>

<p>If you run a script, it looks for this variable and if it&#8217;s set, expands the value to the name of a file and reads its content. The filename should content the absolute pathmane otherwise it will no be able to locate the file.</p>

<figure class='code'><figcaption><span>.bashrc </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>export BASH_ENV="$HOME/.customs"</span></code></pre></td></tr></table></div></figure>


<p>Take a look to the above example. From now, and beacuse I set BASH_ENV in my <strong>.bashrc</strong>, my scripts will have a set of fuctions or whatever I defined in there. It would be the same doing  <strong>source $HOME/.customs</strong> in every script. This is really good, you have a set of custom functions or variables available to all your scripts.</p>

<p>A good idea would be to set this variable in either <em>/etc/profile</em> or <em>/etc/bash.bashrc</em> , if you want to share it with the rest of users in the system.</p>

<h3>2.<strong>Run in a subshell ( ) vs current shell{ }</strong></h3>

<p>This is someting you might not pay attention. In order to assign the ouput of some shell commands to a variable, try first to use <strong>{ }</strong>. Let&#8217;s see an example:</p>

<figure class='code'><figcaption><span>colors.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># Current shell</span>
</span><span class='line'><span class="nb">declare</span> -A <span class="nv">colors</span><span class="o">=()</span>;
</span><span class='line'>
</span><span class='line'><span class="nv">line</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
</span><span class='line'><span class="o">{</span> <span class="k">for </span>key in <span class="k">${</span><span class="p">!colors[@]</span><span class="k">}</span>; <span class="k">do </span>line+<span class="o">=</span><span class="s2">&quot;$key&quot;</span> ; <span class="k">done</span>; <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Subshell</span>
</span><span class='line'><span class="nv">line</span><span class="o">=</span>
</span><span class='line'><span class="k">$(for </span>key in <span class="k">${</span><span class="p">!colors[@]</span><span class="k">}</span>; <span class="k">do </span>line+<span class="o">=</span><span class="s2">&quot;$key&quot;</span> ; <span class="k">done</span>;<span class="k">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Perhaps you realized the problem it crops up here.</p>

<p>  <strong>Current shell {} </strong></p>

<p>  -Variables are available while the script is running. In the previus example I can access both variables, <em>colors and line</em>. Commands are separated by &#8216;;&#8217;. It&#8217;s also quite handy when using  conditionals.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> if_true  <span class="o">&amp;&amp;</span>  <span class="o">{</span> cmd1; cmd2; cmd3; <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>  <strong>Subshell $() </strong></p>

<p>  -Variable assigments do not remain. Any change to any variable in the script would not take effect after ending the command execution. However it would be possible to get the output by means of either <strong>echo</strong> or <strong>printf</strong> commands. Besides variable scope, performance could be worse due to new subshell execution.</p>

<h3>3.Using [[ ]] expressions</h3>

<p>You might know the old form <strong> [ ] </strong> , but this is the new one, and has some pretty cool properties as <em>Pattern Matching</em>. I guess the best way to get an idea is watching an example.</p>

<figure class='code'><figcaption><span>bash_regex.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">ip_address</span><span class="o">=</span><span class="s2">&quot;10.20.30.40&quot;</span>
</span><span class='line'><span class="o">[[</span> <span class="nv">$ip_address</span> <span class="o">=</span>~ ^<span class="o">([</span>0-9<span class="o">]{</span>1,3<span class="o">})</span><span class="se">\.</span><span class="o">([</span>0-9<span class="o">]{</span>1,3<span class="o">})</span><span class="se">\.</span><span class="o">([</span>0-9<span class="o">]{</span>1,3<span class="o">})</span><span class="se">\.</span><span class="o">([</span>0-9<span class="o">]{</span>1,3<span class="o">})</span><span class="nv">$ </span><span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&quot;Valid IP address&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Iterating matches</span>
</span><span class='line'><span class="k">for </span>n in <span class="k">${</span><span class="nv">BASH_REMATCH</span><span class="p">[@]</span><span class="k">}</span>; <span class="k">do </span><span class="nb">echo</span> <span class="nv">$n</span>; <span class="k">done</span>
</span><span class='line'>10.20.30.40
</span><span class='line'>10
</span><span class='line'>20
</span><span class='line'>30
</span><span class='line'>40
</span></code></pre></td></tr></table></div></figure>


<p>Of course the above example is just for purpose, actually it does not validate a real ip address, but does the trick. Most interesting is the variable <strong>BASH_REMATCH</strong>, an array holding each substring matched by parenthesized subexpressions. Regarding regular expressions you should look for in the man as in <em>regex(3) and regex(7)</em>.</p>

<h3>4. Case and ;&amp; operator</h3>

<p>This operator continues the execution to next option if available. I came up with an example and you will see how it works:</p>

<figure class='code'><figcaption><span>pickcolor.sh </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">options</span><span class="o">=</span><span class="s2">&quot;ac:lh&quot;</span>
</span><span class='line'><span class="k">while </span><span class="nb">getopts</span> <span class="nv">$options</span>  flag
</span><span class='line'><span class="k">do</span>
</span><span class='line'><span class="k">        case</span> <span class="nv">$flag</span> in
</span><span class='line'>                a<span class="o">)</span>
</span><span class='line'>                        <span class="nv">list_all</span><span class="o">=</span><span class="s2">&quot;on&quot;</span>
</span><span class='line'>                        ;&amp;
</span><span class='line'>                c<span class="o">)</span>
</span><span class='line'>
</span><span class='line'>                        <span class="nv">c</span><span class="o">=</span><span class="k">${</span><span class="nv">OPTARG</span><span class="p">,,</span><span class="k">}</span>
</span><span class='line'>                        <span class="o">[</span> <span class="nv">$list_all</span> <span class="o">==</span> <span class="s2">&quot;on&quot;</span> <span class="o">]</span>  <span class="o">&amp;&amp;</span> <span class="nb">shift</span>
</span><span class='line'>                        <span class="o">[</span> <span class="nv">$list_all</span> <span class="o">==</span> <span class="s2">&quot;off&quot;</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">shift</span> <span class="o">&amp;&amp;</span> <span class="nb">shift</span>
</span><span class='line'>
</span><span class='line'><span class="nb">                        </span><span class="nv">args</span><span class="o">=</span><span class="s2">&quot;$*&quot;</span>
</span><span class='line'>                        <span class="nv">msg</span><span class="o">=</span><span class="s2">&quot;${args:-$default}&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>                        <span class="k">if</span> <span class="o">[</span> <span class="nv">$list_all</span> <span class="o">==</span> <span class="s2">&quot;on&quot;</span> <span class="o">]</span>;<span class="k">then</span>
</span><span class='line'><span class="k">                                for </span>color in <span class="k">${</span><span class="p">!colors[@]</span><span class="k">}</span>
</span><span class='line'>                                <span class="k">do</span>
</span><span class='line'><span class="k">                                        </span>draw_with_color <span class="s2">&quot;$color&quot;</span> <span class="s2">&quot;$msg&quot;</span>
</span><span class='line'>                                <span class="k">done</span>
</span><span class='line'><span class="k">                        else</span>
</span><span class='line'><span class="k">                                </span>check_color <span class="s2">&quot;$c&quot;</span> <span class="o">&amp;&amp;</span> draw_with_color <span class="s2">&quot;$c&quot;</span> <span class="s2">&quot;$msg&quot;</span>
</span><span class='line'>                        <span class="k">fi</span>
</span><span class='line'>
</span><span class='line'>                           ;;
</span><span class='line'>                l|-list<span class="o">)</span>
</span><span class='line'>                        <span class="nb">printf</span> <span class="s1">&#39;Available colors: \n&#39;</span>
</span><span class='line'>                        _show_colors <span class="o">&amp;&amp;</span> <span class="nb">exit</span>
</span><span class='line'>                        ;;
</span><span class='line'>                h|-help<span class="o">)</span>
</span><span class='line'>                        usage <span class="o">&amp;&amp;</span> <span class="nb">exit</span>
</span><span class='line'>                        ;;
</span><span class='line'>                *<span class="o">)</span>
</span><span class='line'>                        usage <span class="o">&amp;&amp;</span> <span class="nb">exit</span>
</span><span class='line'>                        ;;
</span><span class='line'>        <span class="k">esac</span>
</span><span class='line'><span class="k">done</span>
</span></code></pre></td></tr></table></div></figure>


<p>Previus chunk of code is part of the <a href="http://sgmac.com/files/pickcolor.sh">pickcolor</a> script. The main idea was to jazz some text up with a chosen color, then I thought it would be more practical to enable the option of pating the same text with all the available colors.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>
</span><span class='line'>pickcolor.sh
</span><span class='line'>usage: pickcolor.sh <span class="o">[</span>OPTIONS<span class="o">]</span> message
</span><span class='line'>Options:
</span><span class='line'>       -a --all    Test all colors <span class="k">for </span>message
</span><span class='line'>       -c --color  Set font color.
</span><span class='line'>       -l --list   List available colors.
</span><span class='line'>       -h --help   Help
</span><span class='line'>
</span><span class='line'><span class="c"># Colors up using all the colors</span>
</span><span class='line'><span class="nv">$ </span>pickcolor -a  Show me the colors
</span><span class='line'>
</span><span class='line'><span class="c"># Color up using just one color</span>
</span><span class='line'><span class="nv">$ </span>pickcolor -c red Paint my room !!
</span></code></pre></td></tr></table></div></figure>


<p>The special operator ;&amp; was really useful and did the trick.  Next part I will write about shell vars and some builtin commands to have in mind.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scripting with VIM]]></title>
    <link href="http://sgmac.com/2012/01/30/scripting-with-vim/" />
    <updated>2012-01-30T20:46:00+01:00</updated>
    <id>http://sgmac.com/2012/01/30/scripting-with-vim</id>
    <content type="html"><![CDATA[<p>I have been an <a href="http://www.gnu.org/software/emacs">Emacs</a> geek for really long while, it&#8217;s my favourite editor. Whether I have to spend time or not, is always the first option that comes into my mind. Some time ago, I struggled with vim, but due to my previous position I had to work with different OS such as Solaris,AIX or HP-UX. I realized that is good to know several ways to do the same thing, and unfortunately your favourite editor is not always available.</p>

<p>In my daily work I have to fill in many templates in order to configure some network elements such as switches or routers. Likewise, I decided to make a small vim script that will help me out in such an unpleasant task.</p>

<figure class='code'><figcaption><span>helpers.vim </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='vim'><span class='line'><span class="k">function</span><span class="p">!</span> Net_acl<span class="p">()</span>
</span><span class='line'>  <span class="k">let</span> s:vip_a  <span class="p">=</span> input<span class="p">(</span><span class="s1">&#39;VIP-A:  &#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">let</span> s:vip_b  <span class="p">=</span> input<span class="p">(</span><span class="s1">&#39;VIP-B:: &#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">let</span> s:vip_c  <span class="p">=</span> input<span class="p">(</span><span class="s1">&#39;VIP-C:  &#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">let</span> s:vip_d  <span class="p">=</span> input<span class="p">(</span><span class="s1">&#39;VIP-D:  &#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  :%s<span class="sr">/&lt;vlab-a&gt;/</span>\<span class="p">=</span>s:vip_a/g
</span><span class='line'>  :%s<span class="sr">/&lt;vlan-b&gt;/</span>\<span class="p">=</span>s:vip_b/g
</span><span class='line'>  :%s<span class="sr">/&lt;vlan-c&gt;/</span>\<span class="p">=</span>s:vip_c/g
</span><span class='line'>  :%s<span class="sr">/&lt;vlan-dP&gt;/</span>\<span class="p">=</span>s:vip_d/g
</span><span class='line'><span class="k">endfunction</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span><span class="p">!</span> Net_vlan_names<span class="p">()</span>
</span><span class='line'>  :%s<span class="sr">/&lt;vlan-\(\w*\)&gt;/</span>vlan<span class="p">-</span>\<span class="m">1</span>/g
</span><span class='line'>  :%s<span class="sr">/&lt;\(extravlan\)&gt;/</span>\<span class="m">1</span>/g
</span><span class='line'><span class="k">endfunction</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the function <strong>Net_acl()</strong> is called, it will ask the ips addresses you&#8217;d like to use for each of the vlans you have defined. Keep in mind, when you define a function in VIM, the first letter must be capital.</p>

<figure class='code'><figcaption><span>using_helpers.vim </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='vim'><span class='line'><span class="p">:</span><span class="k">call</span> Net_acl<span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>On the other hand, the function <strong>Net_vlan_names()</strong> takes a pattern inside angle brackets off. If you have to do repetitive tasks, scripting is the right approach no matter what you use. Just get the job done.</p>

<p>From now on,  I will keep on adding more functions to my <em>helpers.vim</em>. I really enjoyed.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Migration to Nginx]]></title>
    <link href="http://sgmac.com/2011/11/20/migration-to-nginx/" />
    <updated>2011-11-20T00:00:00+01:00</updated>
    <id>http://sgmac.com/2011/11/20/migration-to-nginx</id>
    <content type="html"><![CDATA[<p>It turns out I&#8217;ve made some tweaks in the blog. First of all,  I
changed my  hosting provider , now I&#8217;m trying a VPS with
<a href="http://www.hetzner.de">Hetzner</a>, what so far
seems pretty cool.</p>

<p> Then I decided it would be a great opportunity to try Puppet, and I&#8217;ve
 made a couple of recipes, just for users and openssh service. I will write
 someday about this, right now I want to explain some issues I came
 across whereas I peformed the migration of this blog and my wiki.</p>

<p> I had some issues installing Nginx + PHP-fpm. I use Dokuwiki to keep
 my technical information. You might install Nginx
 either from Debian repositories or sources. Due to this site runs
 using Toto engine, and I need Passenger, I asked a friend of mine which
 would be the best way to do such a thing, and he recommended me to
 install from Ruby Enterprise.</p>

<p> The <strong>fastcgi_params</strong> file is different depending on how you install
 Nginx. Installing from Passenger installer, this file does not have
 the follwing line.</p>

<pre><code>fastcgi_param   SCRIPT_FILENAME         $request_filename
</code></pre>

<p>After adding the above line I got properly working Nginx + php-fpm.</p>

<p><strong>UPDATED</strong>:Another issue I have just seen, Nginx init script does not stop the processes.
You have to be sure the _pid /var/run/nginx.pid __ parameter is defined in the nginx.conf file, otherwise the processes will not be killed.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xen, function not implemented]]></title>
    <link href="http://sgmac.com/2010/11/18/xen-function-not-implemented/" />
    <updated>2010-11-18T00:00:00+01:00</updated>
    <id>http://sgmac.com/2010/11/18/xen-function-not-implemented</id>
    <content type="html"><![CDATA[<p>If you have been playing around with Xen&#8217;s compilation, and you tried go back to an old version of the hypervisor you probably got this error:</p>

<pre><code> ERROR (SrvDaemon:349) Exception starting xend ((38, 'Function not implemented'))
Traceback (most recent call last):
  File "usr/lib/python2.5/site-packages/xen/xend/server/SrvDaemon.py", line 335, in run
    xinfo = xc.xeninfo()&lt;
</code></pre>

<p>The function <strong>xeninfo()</strong> is  only available in Xen 4.x ,  that&#8217;s what I found out searching in Google. The problem, I messed everything up. The way I sorted it out was pretty simple, just uninstall  all the packages and reinstall them, at least in Debian Lenny it worked well.</p>

<p>That&#8217;s all.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shared Libraries]]></title>
    <link href="http://sgmac.com/2010/09/02/shared-libraries/" />
    <updated>2010-09-02T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/09/02/shared-libraries</id>
    <content type="html"><![CDATA[<p>If you have your own shared libraries with the whole set of your favorite functions, probably you will have seen this common error:</p>

<pre><code>./myapp: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or direct
</code></pre>

<p>Let&#8217;s take a look inside the binary:</p>

<pre><code>tuxedo@host:$&gt; ldd test
    linux-gate.so.1 =&gt;  (0xb7ef6000)
    libatest.so =&gt; not found
    libc.so.6 =&gt; /lib/i686/cmov/libc.so.6 (0xb7d81000)
</code></pre>

<p>By default the system is looking for in the paths defined in the <strong>/etc/ld.so.conf</strong>, which recursively adds the definitions in the folder <strong>/etc/ld.so.conf.d</strong>
Here&#8217;s the quick trick:</p>

<pre><code>tuxedo@host:$&gt; export LD_LIBRARY_PATH=`pwd` 
</code></pre>

<p>I use this whereas I&#8217;m implementing my library, after that you can put it wherever you feel like.</p>

<pre><code>tuxedo@host:$&gt; ldd test
linux-gate.so.1 =&gt;  (0xb7f5e000)
    libtest.so =&gt; /home/tuxedo/syslib/libtest.so (0xb7f56000)
    libc.so.6 =&gt; /lib/i686/cmov/libc.so.6 (0xb7de3000)
    /lib/ld-linux.so.2 (0xb7f5f000)
</code></pre>

<p>Now the executable will work. I&#8217;ll retake this issue, I have some interesting things to tell about shared libraries. Happy coding!!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xrandr extends your monitor]]></title>
    <link href="http://sgmac.com/2010/08/20/xrandr-extends-your-monitor/" />
    <updated>2010-08-20T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/08/20/xrandr-extends-your-monitor</id>
    <content type="html"><![CDATA[<p>Long time ago if you wanted to have your laptop and an external monitor working together you had to  use  Xinerama, lucky me, that has changed. First of all, we need to install xrandr.</p>

<pre><code> # aptitude install x11-server-utils
</code></pre>

<p>If you executes xrandr, it will show you the outputs you have available:</p>

<pre><code>$ xrandr VGA connected (normal left inverted right)
 1280x960       60.0
   1280x800       60.0  
   1152x768       54.8  
   800x600        56.2  
   640x480        59.9  
LVDS connected 1280x800+0+0 (normal left inverted right) 0mm x 0mm
   1280x800       59.9*+   60.0  
   1280x768       60.0  
   1152x768       54.8  
   1024x768       85.0     75.0     70.1     60.0  
   832x624        74.6  
   800x600        85.1     72.2     75.0     60.3     56.2  
   640x480        85.0     72.8     75.0     59.9  
   720x400        85.0  
   640x400        85.1  
   640x350        85.1  
</code></pre>

<p>To get all this working, a section  must be added into <em>/etc/X11/xorg.conf</em> file</p>

<pre><code>Section "Screen"
    Identifier      "Default Screen"
    Monitor         "Configured Monitor"
    DefaultDepth    24
    &lt;strong&gt;SubSection "Display"
        Modes "1280x1024" "1280x800"
        Virtual 2560  1024
    EndSubSection&lt;/strong&gt;
EndSection
</code></pre>

<p><strong>Using xrandr</strong></p>

<p>Let&#8217;s to try out our configuration:</p>

<pre><code>$ xrandr --output VGA --mode 1280x1024 --left-of LVDS
</code></pre>

<p>In fact, that is the line we need to put in our little script:</p>

<pre><code>$ vi .kde/Autostart/dual.sh
</code></pre>

<p>Henceforth we can work with an extended desktop, and increase our productivity.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sudo  LDAP (II)]]></title>
    <link href="http://sgmac.com/2010/08/17/sudo-ldap-ii/" />
    <updated>2010-08-17T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/08/17/sudo-ldap-ii</id>
    <content type="html"><![CDATA[<p>The second part of this article is here, so if you missed the first one, you might take a look <a href="http://sgmac.com/blog/2010/08/01/sudo-ldap-i/">Part One</a></p>

<h3>3. LDAP setup</h3>

<p>Let&#8217;s guess your root suffix is  <strong>dc=company,dc=com</strong>, you
need to append the next entry to your directory :</p>

<pre><code>dn: ou=sudoers,dc=company,dc=com
  objectClass: top
  objectClass: organizationalunit
  description: Sudo Configuration
  ou: sudoers
</code></pre>

<p>Besides we will need a default profile:</p>

<pre><code>dn: cn=defaults,ou=sudoers,dc=company,dc=com
  sudoOption: ignore_local_sudoers
  objectClass: top
  objectClass: sudoRole
  cn: defaults
  description: Our default options
  sudooption: log_host
  sudooption: logfile=/var/log/sudolog
  sudooption: !syslog
</code></pre>

<p>Perhaps you would like to get the most of sudo&#8217;s powder, take a look in its website. You can add as much profiles as you like, suppose you want to add one for system administration:</p>

<pre><code>dn: cn=sysadmin,ou=sudoers,dc=company,dc=com
 objectClass: top
 objectClass: sudoRole
 cn: unix_admins
 sudoUser: tuxman
 sudoUser: darkman
 sudoUser: bill
 sudoHost: ALL
 sudoCommand: /usr/bin/ls
</code></pre>

<p>As far as I concern, how to configure sudo is out of this post, however together the source of sudo there is an utility, _sudoers2ldif__, a perl script that helps you to translate your sudo&#8217;s configuration file.  Next step requires to modify our profile. Probably you will have a similar profile to this one:</p>

<pre><code>dn: cn=default,ou=profile,dc=company,dc=com
objectClass: DUAConfigProfile
defaultSearchBase: dc=company,dc=com
cn: default
credentialLevel: proxy
defaultServerList: 192.168.76.66
profileTTL: 300
searchTimeLimit: 60
authenticationMethod: simple
serviceSearchDescriptor: passwd:cn=sudoers,dc=company,dc=com
</code></pre>

<p>After these modifications you must initialize your client.</p>

<h3>4. Setting up <strong>/etc/ldap.conf</strong>  and <strong>nsswitch.conf</strong></h3>

<p>It&#8217;s time to tell our client where to find sudoers file, by means of  <strong>/etc/ldap.conf</strong>, that looks something like this.</p>

<pre><code>   uri ldap://192.168.76.66
   sudoers_base ou=sudoers,dc=company,dc=com
   bindpw  cn=proxyagent,ou=profile,dc=company,dc=com
   binddn  password
   sudoers_debug 0
</code></pre>

<p>You might use anonymous access, that&#8217;s your choice, just remember to check your ACI&#8217;s. Pretty interesting the option <strong>sudoers_debug</strong> which helps you to debug, at level 3 will show you as much information as possible. The last step, how to find our sudoers&#8217; profile,  <em>nsswitch.conf</em></p>

<pre><code>  sudoers: ldap
</code></pre>

<p>Let&#8217;s check if is working:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">tuxman</span><span class="nd">@host</span><span class="p">:</span><span class="err">$</span><span class="o">&gt;</span> <span class="n">sudo</span> <span class="n">ls</span>
</span><span class='line'><span class="p">[</span><span class="n">sudo</span><span class="p">]</span> <span class="n">password</span> <span class="k">for</span> <span class="n">client</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'><span class="n">sudo</span> <span class="n">ls</span>
</span><span class='line'><span class="n">LDAP</span> <span class="n">Config</span> <span class="n">Summary</span>
</span><span class='line'><span class="o">===================</span>
</span><span class='line'><span class="n">uri</span>              <span class="n">ldap</span><span class="p">:</span><span class="o">//</span><span class="mf">192.168</span><span class="o">.</span><span class="mf">76.66</span>
</span><span class='line'><span class="n">ldap_version</span>     <span class="mi">3</span>
</span><span class='line'><span class="n">sudoers_base</span>     <span class="n">ou</span><span class="o">=</span><span class="n">sudoers</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">company</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="n">binddn</span>           <span class="p">(</span><span class="n">anonymous</span><span class="p">)</span>
</span><span class='line'><span class="n">bindpw</span>           <span class="p">(</span><span class="n">anonymous</span><span class="p">)</span>
</span><span class='line'><span class="n">ssl</span>              <span class="p">(</span><span class="n">no</span><span class="p">)</span>
</span><span class='line'><span class="o">===================</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap_initialize</span><span class="p">(</span><span class="n">ld</span><span class="p">,</span> <span class="n">ldap</span><span class="p">:</span><span class="o">//</span><span class="mf">192.168</span><span class="o">.</span><span class="mf">76.66</span><span class="p">)</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap_set_option</span><span class="p">:</span> <span class="n">debug</span> <span class="o">-&gt;</span> <span class="mi">0</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap_set_option</span><span class="p">:</span> <span class="n">ldap_version</span> <span class="o">-&gt;</span> <span class="mi">3</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap_sasl_bind_s</span><span class="p">()</span> <span class="n">ok</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">found</span><span class="p">:</span><span class="n">cn</span><span class="o">=</span><span class="n">defaults</span><span class="p">,</span><span class="n">ou</span><span class="o">=</span><span class="n">sudoers</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">company</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoOption</span><span class="p">:</span> <span class="s">&#39;ignore_local_sudoers&#39;</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoOption</span><span class="p">:</span> <span class="s">&#39;log_host&#39;</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoOption</span><span class="p">:</span> <span class="s">&#39;logfile=/var/log/sudolog&#39;</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoOption</span><span class="p">:</span> <span class="s">&#39;!syslog&#39;</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">search</span> <span class="s">&#39;(|(sudoUser=tuxman)(sudoUser=</span><span class="si">%o</span><span class="s">ther)(sudoUser=ALL))&#39;</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">found</span><span class="p">:</span><span class="n">cn</span><span class="o">=</span><span class="n">sysadmin</span><span class="p">,</span><span class="n">ou</span><span class="o">=</span><span class="n">sudoers</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">company</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoHost</span> <span class="s">&#39;ALL&#39;</span> <span class="o">...</span> <span class="n">MATCH</span><span class="err">!</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">ldap</span> <span class="n">sudoCommand</span> <span class="s">&#39;/usr/bin/ls&#39;</span> <span class="o">...</span> <span class="n">MATCH</span><span class="err">!</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">Command</span> <span class="n">allowed</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">user_matches</span><span class="o">=</span><span class="mi">1</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">host_matches</span><span class="o">=</span><span class="mi">1</span>
</span><span class='line'><span class="n">sudo</span><span class="p">:</span> <span class="n">sudo_ldap_lookup</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">=</span><span class="mh">0x02</span>
</span><span class='line'><span class="n">tuxman</span><span class="nd">@host</span><span class="p">:</span><span class="err">$</span><span class="o">&gt;</span> <span class="n">files</span><span class="o">/</span>  <span class="n">sudoers2ldif</span><span class="o">.</span><span class="n">pl</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point everything should be working. Last step, to translate our <em>sudoers</em> file.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rotating backups with Ruby]]></title>
    <link href="http://sgmac.com/2010/08/06/rotating-backups-with-ruby/" />
    <updated>2010-08-06T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/08/06/rotating-backups-with-ruby</id>
    <content type="html"><![CDATA[<p>Today I&#8217;ve made some simple scripts to get my backups update. Two entries in our crontab will make the rest of work for us.</p>

<p>The first one gets a backup of our database, the second rotates the files. I also add support to Syslog, because I would like to know if my script worked out.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="nv">DATE</span><span class="o">=</span><span class="k">$(</span>date +%Y-%m-%d<span class="k">)</span>
</span><span class='line'>mysqldump -h host userdb  database  --password<span class="o">=</span>1234 | gzip &gt; <span class="se">\</span>
</span><span class='line'> <span class="k">${</span><span class="nv">HOME</span><span class="k">}</span>/path/files/file-<span class="k">${</span><span class="nv">DATE</span><span class="k">}</span>.gz
</span></code></pre></td></tr></table></div></figure>


<h3>Crontab</h3>

<p>Let&#8217;s add some entries to our crontab:</p>

<pre><code>user@home:~&gt; crontab -e
</code></pre>

<p>As far as I concern I would review the entries, it&#8217;s pretty easy to make some mistakes while we&#8217;re writing, besides I guess it&#8217;s a best practice.</p>

<pre><code>user@home:~&gt; crontab -l
</code></pre>

<p>The above command will show our entries.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># m h  dom mon dow   command
</span><span class='line'>HOME=/path/user/home
</span><span class='line'>PATH=PATH:/path/to/ruby
</span><span class='line'>
</span><span class='line'>0 00 * * * ${HOME}/scripts/backup_db_blog.sh
</span><span class='line'>0 00 * * * ${HOME}/scripts/rotatedb.rb</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s a MUST to leave an empty line at the end of the cron, otherwise the cron will not run. There is another thing to take into account, PATHS. Don&#8217;t forget to set them.</p>

<h3>Syslog</h3>

<p> Due to I wanted support Syslog,  I had to set it up correctly  in my  <em>/etc/syslog.conf</em></p>

<pre><code>local7.*                  /var/log/backups.log
</code></pre>

<p>Aside to create the above file,  you must reload syslog daemon. Afterwards, I wanted to know if that configuration would work. There is a command that will help you:</p>

<pre><code>user@home:~&gt; logger -p local7.debug "Sending a message to debug"
user@home:~&gt; more /var/log/backups.log
Aug  6 20:31:22 home user: Sending a message to debug
</code></pre>

<p>The first argument <em>local7</em> is the Syslog&#8217;s FACILITY and the other one is the PRIORITY. You must adapt to your own script.<br/>
Here is the script to rotate. After then days, will remove only the four oldest backups.</p>

<figure class='code'><figcaption><span>rotatedb.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'><span class="sx">%w(syslog)</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">c</span><span class="o">|</span> <span class="nb">require</span> <span class="n">c</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="no">BACKUP</span><span class="o">=</span><span class="s1">&#39;/path/to/backup/directory&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">SyslogMsg</span>
</span><span class='line'>  <span class="no">Syslog</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;rotatedb&quot;</span><span class="p">,</span> <span class="no">Syslog</span><span class="o">::</span><span class="no">LOG_PID</span>  <span class="p">\</span>
</span><span class='line'>             <span class="o">|</span> <span class="no">Syslog</span><span class="o">::</span><span class="no">LOG_CONS</span> <span class="p">,</span>  <span class="no">Syslog</span><span class="o">::</span><span class="no">LOG_LOCAL7</span> <span class="p">)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="n">msg</span><span class="o">=</span><span class="s2">&quot;Message sent&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="no">Syslog</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="no">Syslog</span><span class="o">::</span><span class="no">LOG_DEBUG</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="kp">include</span> <span class="no">SyslogMsg</span>
</span><span class='line'><span class="n">files</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'><span class="no">Dir</span><span class="o">.</span><span class="n">entries</span><span class="p">(</span><span class="no">BACKUP</span><span class="p">)</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">e</span><span class="o">|</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">e</span> <span class="o">!~</span> <span class="sr">/^\./</span>
</span><span class='line'>    <span class="n">files</span> <span class="o">&lt;&lt;</span> <span class="n">e</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">files</span><span class="o">.</span><span class="n">sort!</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">files</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">10</span>
</span><span class='line'>  <span class="mi">0</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">index</span><span class="o">|</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span> <span class="no">BACKUP</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span> <span class="o">+</span> <span class="n">files</span><span class="o">[</span><span class="n">index</span><span class="o">]</span> <span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="no">SyslogMsg</span><span class="o">::</span><span class="nb">send</span><span class="p">(</span><span class="s2">&quot;Backups for mysql rotated.&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, if you get some troubles, review the above steps, check that you have the right permissions and you have reloaded your syslog configuration. If you try the <strong>logger</strong> command and you see the message you have just sent, everything should work out.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Forwarded ports and RSA key]]></title>
    <link href="http://sgmac.com/2010/08/04/forwarded-ports-and-rsa-key/" />
    <updated>2010-08-04T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/08/04/forwarded-ports-and-rsa-key</id>
    <content type="html"><![CDATA[<p>When I&#8217;m doing port forwarding I always get the same annoying message</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>tuxman@athome:> ssh -p 3000 someuser@localhost
</span><span class='line'>
</span><span class='line'>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
</span><span class='line'>@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
</span><span class='line'>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;/b>
</span><span class='line'>IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
</span><span class='line'>Someone could be eavesdropping on you right now (man-in-the-middle attack)!
</span><span class='line'>It is also possible that the RSA host key has just been changed.
</span><span class='line'>The fingerprint for the RSA key sent by the remote host is
</span><span class='line'>22:ce:a2:e1:fe:cc:e6:73:cb:03:96:1e:23:3c:5b:55.
</span><span class='line'>Please contact your system administrator.
</span><span class='line'>Add correct host key in /home/tuxman/.ssh/known_hosts to get rid of this message.
</span><span class='line'>Offending key in /home/tuxman/.ssh/known_hosts:159
</span><span class='line'>RSA host key for [localhost]:4000 has changed and you have requested strict checking.
</span><span class='line'>Host key verification failed.</span></code></pre></td></tr></table></div></figure>


<p>Appending some lines to  the <strong>~/.ssh/config</strong> file, solves the issue</p>

<pre><code>Host localhost
   HostKeyAlias  &lt;em&gt;youralias&lt;/em&gt;
</code></pre>

<p>The <strong>HostKeyAlias</strong>  keyword allows us to define an alias and use it instead of the real name. I frequently use ssh port forwarding and I wanted to get rid of this message.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sudo LDAP  (I)]]></title>
    <link href="http://sgmac.com/2010/08/01/sudo-ldap-i/" />
    <updated>2010-08-01T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/08/01/sudo-ldap-i</id>
    <content type="html"><![CDATA[<p>Last day at work I had to get working sudo and ldap. I&#8217;m not gonna get into a discussion about if it&#8217;s worth or not to use sudo. I can just say from my own experience, if you have a large number of users and hosts, they are clearly distinguishable and you are using roles (i.e: sysadmin, backup, any kind of group&#8230;) it&#8217;s totally worth.</p>

<p>Moreover, bear in mind you would have to update every sudo config file , definitely would be tedious, and here&#8217;s when LDAP gets in.</p>

<p>I brought into play two virtual machines, both of them running Solaris
10.  Commonly I prefer doing that before making some huge mistake in a
real environment, so here&#8217;s what I did. I called <em>box0</em> to the
client and <em>ldapbox</em> to the server. The rest of the post, I&#8217;ll
assume you have set up a Directory Server and Native LDAP client
service working fine.
Summary:</p>

<h3>1. Extending Schema</h3>

<p>This step is pretty straightforward, you only need to add the schema
to your directory instance, and restart the server.  Assuming your
instance might be in the default path
<em>/var/opt/SUNWdsee/dsins1/config/schema/99users.ldif</em>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>attributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo'
</span><span class='line'> EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX
</span><span class='line'> 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
</span><span class='line'>
</span><span class='line'>attributeTypes: ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' 
</span><span class='line'>EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX
</span><span class='line'>1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )
</span><span class='line'>
</span><span class='line'>attributeTypes: ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC' Command(s) to be executed by sudo' 
</span><span class='line'>EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
</span><span class='line'>X-ORIGIN 'SUDO' )
</span><span class='line'>
</span><span class='line'>attributeTypes: ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo' 
</span><span class='line'>EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
</span><span class='line'>X-ORIGIN 'SUDO' )
</span><span class='line'>
</span><span class='line'>attributeTypes: ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo'
</span><span class='line'> EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
</span><span class='line'> X-ORIGIN 'SUDO' )
</span><span class='line'>
</span><span class='line'>objectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top
</span><span class='line'>STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost
</span><span class='line'>$ sudoCommand $ sudoRunAs $ sudoOption $ description ) X-ORIGIN 'SUDO'
</span><span class='line'>)</span></code></pre></td></tr></table></div></figure>


<p>Now you only need to restart the server.Why do I need to restart my server? The matter is, the first time you started your server, the file was read into memory, so any change you make  later will not have effect, at least you restart the instance.</p>

<h3>2. LDAP support for sudo</h3>

<p>You will need to get the source code of sudo and at least 1.7 version or upper. The reason is because earlier versions will not read <em>nsswitch.conf</em>.  I used sudo-1.7.2p7, you can get it from <a href="http://www.sunfreeware.com">Sunfreeware</a>. Of course if you want to compile you will need to solve some dependencies, here is the list, however you had better confirm  by yourself.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>/---|(Sudo)
</span><span class='line'>       |-* gcc-3.4.6-sol10-x86-local  
</span><span class='line'>       |-* libiconv-1.13.1-sol10-x86-local
</span><span class='line'>       |-* libintl-3.4.0-sol10-x86-local 
</span><span class='line'>       |-* openssl-1.0.0a-sol10-x86-local
</span><span class='line'>  
</span><span class='line'>
</span><span class='line'> /---|( OpenLdap )
</span><span class='line'>       |- * db-4.7.25.NC-sol10-x86-local
</span><span class='line'>       |- * libtool-2.2.6b-sol10-x86-local
</span><span class='line'>       |- * sasl-2.1.21-sol10-x86-local
</span><span class='line'>       |- * openldap-2.4.22-sol10-x86-local</span></code></pre></td></tr></table></div></figure>


<p> At this point and after installing all the dependencies we just need to compile:</p>

<pre><code>./configure --with-ldap &amp;&amp; make 
</code></pre>

<p> Those people who like tinkering with Unix tools, is time to call <em>ldd</em> and take a look into sudo.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>libpam.so.1 =>   /lib/libpam.so.1
</span><span class='line'>        libdl.so.1 =>    /lib/libdl.so.1
</span><span class='line'>*       libldap-2.4.so.2 =>      &lt;em>&lt;b>(/usr/local/lib/libldap-2.4.so.2)&lt;/b>&lt;/em>
</span><span class='line'>*       liblber-2.4.so.2 =>      &lt;em>&lt;b>(/usr/local/lib/liblber-2.4.so.2)&lt;/b>&lt;/em>
</span><span class='line'>        libintl.so.8 =>  /usr/local/lib/libintl.so.8
</span><span class='line'>        libsocket.so.1 =>        /lib/libsocket.so.1
</span><span class='line'>        libnsl.so.1 =>   /lib/libnsl.so.1
</span><span class='line'>        libc.so.1 =>     /lib/libc.so.1
</span><span class='line'>        libcmd.so.1 =>   /lib/libcmd.so.1
</span><span class='line'>        libresolv.so.2 =>        /usr/lib/libresolv.so.2
</span><span class='line'>        libgen.so.1 =>   /usr/lib/libgen.so.1
</span><span class='line'>        libsasl2.so.2 =>         /usr/local/lib/libsasl2.so.2
</span><span class='line'>        libssl.so.1.0.0 =>       /usr/local/ssl/lib/libssl.so.1.0.0
</span><span class='line'>        libcrypto.so.1.0.0 =>    /usr/local/ssl/lib/libcrypto.so.1.0.0
</span><span class='line'>        libgcc_s.so.1 =>         /usr/local/lib/libgcc_s.so.1
</span><span class='line'>        libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
</span><span class='line'>        libsec.so.1 =>   /usr/lib/libsec.so.1
</span><span class='line'>        libmp.so.2 =>    /lib/libmp.so.2
</span><span class='line'>        libmd.so.1 =>    /lib/libmd.so.1
</span><span class='line'>        libscf.so.1 =>   /lib/libscf.so.1
</span><span class='line'>        libavl.so.1 =>   /lib/libavl.so.1
</span><span class='line'>        libdoor.so.1 =>  /lib/libdoor.so.1
</span><span class='line'>        libuutil.so.1 =>         /lib/libuutil.so.1
</span><span class='line'>        libm.so.2 =>     /lib/libm.so.2</span></code></pre></td></tr></table></div></figure>


<p>If the LDAP libraries does not appear remember to add the path:</p>

<pre><code># crle -l -u  PATH_TO_LIBRARIES&lt;/b&gt;
</code></pre>

<p>Obviously I wouldn&#8217;t like having to install OpenLdap in all my clients (if you want to apply to more than one), so I thought to carry just  with the libraries I needed. In a nutshell, we have just extended the schema and also enabled ldap support for sudo. The two last points for the next post.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Background jobs in your bash prompt]]></title>
    <link href="http://sgmac.com/2010/07/30/background-jobs-in-your-bash-prompt/" />
    <updated>2010-07-30T00:00:00+02:00</updated>
    <id>http://sgmac.com/2010/07/30/background-jobs-in-your-bash-prompt</id>
    <content type="html"><![CDATA[<p>In most cases when I&#8217;m working with the shell, I send my applications to background, mostly my emacs. Nonetheless I forget quickly, and I open too many times the same file.</p>

<p>Due to my lack of memory I decided to make a function that shows me how many programs I have in background, here is the function:</p>

<figure class='code'><figcaption><span>Jobs in background  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="k">function </span>get_njobs <span class="o">{</span>
</span><span class='line'> <span class="nv">njobs</span><span class="o">=</span><span class="k">$(</span><span class="nb">jobs</span> | wc -l<span class="k">)</span>
</span><span class='line'>
</span><span class='line'> <span class="k">if</span> <span class="o">[</span> <span class="nv">$njobs</span> -gt <span class="s2">&quot;0&quot;</span> <span class="o">]</span>;
</span><span class='line'> <span class="k">then</span>
</span><span class='line'><span class="k">   </span><span class="nb">echo</span> <span class="nv">$njobs</span> |  sed -e <span class="s1">&#39;s/\([0-9]*\)/(\1)/g&#39;</span>
</span><span class='line'> <span class="k">fi</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>prompt <span class="o">{</span>
</span><span class='line'>
</span><span class='line'><span class="c">#  Shell into Emacs</span>
</span><span class='line'> <span class="k">if</span> <span class="o">[</span> <span class="nv">$TERM</span> !<span class="o">=</span> <span class="s2">&quot;dumb&quot;</span> <span class="o">]</span>;
</span><span class='line'> <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">alias </span><span class="nv">ls</span><span class="o">=</span><span class="s1">&#39;ls --color=auto&#39;</span>
</span><span class='line'>  <span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;${purpple}\u@${close}${YELLOW}\h${close}:{\W}\$(get_njobs)&quot;</span>
</span><span class='line'> <span class="k">else</span>
</span><span class='line'><span class="k">        </span><span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;[\u@\h:\w]&quot;</span>
</span><span class='line'> <span class="k">fi</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now you can do some work in background and will see what I mean:</p>

<pre><code>user@host:{~} emacs &amp;
user@host:{~}(1)
</code></pre>

<p>As you may notice, the number inside the brackets remembers me if
there is some program running in background. Do not forget to add the
function at the end of your  <em>bashrc</em>.</p>

<p><strong>UPDATE</strong>:  If you add <strong>\j</strong> to your PS1 variable you
will get the same effect but if there is not jobs you will always get
a (0).</p>
]]></content>
  </entry>
  
</feed>
