<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Say what?]]></title>
  <link href="http://www.kfirlavi.com/atom.xml" rel="self"/>
  <link href="http://www.kfirlavi.com/"/>
  <updated>2012-11-15T12:46:50+02:00</updated>
  <id>http://www.kfirlavi.com/</id>
  <author>
    <name><![CDATA[Kfir Lavi]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Defensive BASH programming]]></title>
    <link href="http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming/"/>
    <updated>2012-11-14T09:35:00+02:00</updated>
    <id>http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming</id>
    <content type="html"><![CDATA[<p>Here is my Katas for creating BASH programs that work. Nothing is new here, but
from my experience pepole like to abuse BASH, forget computer science and create
a <a href="http://en.wikipedia.org/wiki/Big_ball_of_mud">Big ball of mud</a> from their programs.<br/>
Here I provide methods to defend your programs from braking, and keep the code
tidy and clean.</p>

<h2>Immutable global variables </h2>

<ul>
<li>Try to keep globals to minimum</li>
<li>UPPER_CASE naming</li>
<li>readonly decleration</li>
<li>Use globals to replace cryptic $0, $1, etc.</li>
<li>Globals I allways use in my programs:</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">readonly </span><span class="nv">PROGNAME</span><span class="o">=</span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span>
</span><span class='line'><span class="nb">readonly </span><span class="nv">PROGDIR</span><span class="o">=</span><span class="k">$(</span>readlink -m <span class="k">$(</span>dirname <span class="nv">$0</span><span class="k">))</span>
</span><span class='line'><span class="nb">readonly </span><span class="nv">ARGS</span><span class="o">=</span><span class="s2">&quot;$@&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Everything is local</h2>

<p>All variable should be local.</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>change_owner_of_file<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">filename</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">user</span><span class="o">=</span><span class="nv">$2</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">group</span><span class="o">=</span><span class="nv">$3</span>
</span><span class='line'>
</span><span class='line'>    chown <span class="nv">$user</span>:<span class="nv">$group</span> <span class="nv">$filename</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<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='bash'><span class='line'>change_owner_of_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">user</span><span class="o">=</span><span class="nv">$1</span>; <span class="nb">shift</span>
</span><span class='line'><span class="nb">    local </span><span class="nv">group</span><span class="o">=</span><span class="nv">$1</span>; <span class="nb">shift</span>
</span><span class='line'><span class="nb">    local </span><span class="nv">files</span><span class="o">=</span><span class="nv">$@</span>
</span><span class='line'>    <span class="nb">local </span>i
</span><span class='line'>
</span><span class='line'>    <span class="k">for </span>i in <span class="nv">$files</span>
</span><span class='line'>    <span class="k">do</span>
</span><span class='line'><span class="k">        </span>chown <span class="nv">$user</span>:<span class="nv">$group</span> <span class="nv">$i</span>
</span><span class='line'>    <span class="k">done</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>self documenting parameters</li>
<li>Usually for loop use i variable, so it is very important that you declare it
as local.</li>
<li>local does not work on global scope.</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>kfir@goofy ~ <span class="nv">$ </span><span class="nb">local </span>a
</span><span class='line'>bash: <span class="nb">local</span>: can only be used in a <span class="k">function</span>
</span></code></pre></td></tr></table></div></figure>


<h2>main()</h2>

<ul>
<li>Help keep all variables local</li>
<li>Intuitive for functional programming</li>
<li>The only global command in the code is: main</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">files</span><span class="o">=</span><span class="s2">&quot;/tmp/a /tmp/b&quot;</span>
</span><span class='line'>    <span class="nb">local </span>i
</span><span class='line'>
</span><span class='line'>    <span class="k">for </span>i in <span class="nv">$files</span>
</span><span class='line'>    <span class="k">do</span>
</span><span class='line'><span class="k">        </span>change_owner_of_file kfir users <span class="nv">$i</span>
</span><span class='line'>    <span class="k">done</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<h2>Everything is a function</h2>

<ul>
<li>The only code that is running globaly is:

<ul>
<li>Global declerations that are immutable.</li>
<li>main</li>
</ul>
</li>
<li>Keep code clean</li>
<li>procedures become descriptive</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">files</span><span class="o">=</span><span class="k">$(</span>ls /tmp | grep pid | grep -v daemon<span class="k">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>




<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='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    ls <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        | grep pid <span class="se">\</span>
</span><span class='line'>        | grep -v daemon
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">files</span><span class="o">=</span><span class="k">$(</span>temporary_files /tmp<span class="k">)</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><em>Second example is much better</em>. Finding files is the problem of
temporary_files() and not of main()&#8217;s. This code is also testable, by unit
testing of temporary_files().</li>
<li>If you try to test the first example, you will mish mash finding temporary
files with main algorithm.</li>
</ul>


<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='bash'><span class='line'>test_temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span>/tmp
</span><span class='line'>
</span><span class='line'>    touch <span class="nv">$dir</span>/a-pid1232.tmp
</span><span class='line'>    touch <span class="nv">$dir</span>/a-pid1232-daemon.tmp
</span><span class='line'>
</span><span class='line'>    returns <span class="s2">&quot;$dir/a-pid1232.tmp&quot;</span> temporary_files <span class="nv">$dir</span>
</span><span class='line'>
</span><span class='line'>    touch <span class="nv">$dir</span>/b-pid1534.tmp
</span><span class='line'>
</span><span class='line'>    returns <span class="s2">&quot;$dir/a-pid1232.tmp $dir/b-pid1534.tmp&quot;</span> temporary_files <span class="nv">$dir</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we see, this test does not concern main().</p>

<h2>Debugging functions</h2>

<ul>
<li>Run program with -x flag:</li>
</ul>


<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'>bash -x my_prog.sh
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>debug just a small section of code using set -x and set +x, which will print
debug info just for the current code wrapped with set -x &#8230; set +x.</li>
</ul>


<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='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">set</span> -x
</span><span class='line'>    ls <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        | grep pid <span class="se">\</span>
</span><span class='line'>        | grep -v daemon
</span><span class='line'>    <span class="nb">set</span> +x
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>Printing function name and its arguments:</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">echo</span> <span class="nv">$FUNCNAME</span> <span class="nv">$@</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    ls <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        | grep pid <span class="se">\</span>
</span><span class='line'>        | grep -v daemon
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>  So calling the function:</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'>temporary_files /tmp
</span></code></pre></td></tr></table></div></figure>


<p>  will print to the standard output:</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'>temporary_files /tmp
</span></code></pre></td></tr></table></div></figure>


<h2>Code clarity</h2>

<p>What this code do?</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span>/tmp
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -z <span class="nv">$dir</span> <span class="o">]]</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -n <span class="nv">$dir</span> <span class="o">]]</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -f <span class="nv">$dir</span> <span class="o">]]</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -d <span class="nv">$dir</span> <span class="o">]]</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>Let your code speak:</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>
<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>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>is_empty<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">var</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -z <span class="nv">$var</span> <span class="o">]]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>is_not_empty<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">var</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -n <span class="nv">$var</span> <span class="o">]]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>is_file<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">file</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -f <span class="nv">$file</span> <span class="o">]]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>is_dir<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">[[</span> -d <span class="nv">$dir</span> <span class="o">]]</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span>/tmp
</span><span class='line'>
</span><span class='line'>    is_empty <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    is_not_empty <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    is_file <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'>
</span><span class='line'>    is_dir <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> do_something...
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<h2>Each line does just one thing</h2>

<ul>
<li>Break expression with back slash <code>\</code><br/>
For example:</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    ls <span class="nv">$dir</span> | grep pid | grep -v daemon
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Can be written much cleaner:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    ls <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        | grep pid <span class="se">\</span>
</span><span class='line'>        | grep -v daemon
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>Symbols at the start of the line indented<br/>
Bad example of symbols at the end:</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>temporary_files<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    ls <span class="nv">$dir</span> | <span class="se">\</span>
</span><span class='line'>        grep pid | <span class="se">\</span>
</span><span class='line'>        grep -v daemon
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>  Good example where we clearly see the connection between lines and the
  connecting rods:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>print_dir_if_not_empty<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">dir</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    is_empty <span class="nv">$dir</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&quot;dir is empty&quot;</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&quot;dir=$dir&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Printing usage</h2>

<p>Don&#8217;t do this:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">echo</span> <span class="s2">&quot;this prog does:...&quot;</span>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;flags:&quot;</span>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;-h print help&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It should be a function:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>usage<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">echo</span> <span class="s2">&quot;this prog does:...&quot;</span>
</span><span class='line'>    <span class="nb">echo</span> <span class="s2">&quot;flags:&quot;</span>
</span><span class='line'>    <span class="nb">echo</span> <span class="s2">&quot;-h print help&quot;</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>echo is repeated in each line. For that we have Here Document:</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>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>usage<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    cat <span class="s">&lt;&lt;- EOF</span>
</span><span class='line'><span class="s">    usage: $PROGNAME options</span>
</span><span class='line'><span class="s">    </span>
</span><span class='line'><span class="s">    Program deletes files from filesystems to release space. </span>
</span><span class='line'><span class="s">    It gets config file that define fileystem paths to work on, and whitelist rules to </span>
</span><span class='line'><span class="s">    keep certain files.</span>
</span><span class='line'>
</span><span class='line'><span class="s">    OPTIONS:</span>
</span><span class='line'><span class="s">       -c --config              configuration file containing the rules. use --help-config to see the syntax.</span>
</span><span class='line'><span class="s">       -n --pretend             do not really delete, just how what you are going to do.</span>
</span><span class='line'><span class="s">       -t --test                run unit test to check the program</span>
</span><span class='line'><span class="s">       -v --verbose             Verbose. You can specify more then one -v to have more verbose</span>
</span><span class='line'><span class="s">       -x --debug               debug</span>
</span><span class='line'><span class="s">       -h --help                show this help</span>
</span><span class='line'><span class="s">          --help-config         configuration help</span>
</span><span class='line'>
</span><span class='line'><span class="s">    </span>
</span><span class='line'><span class="s">    Examples:</span>
</span><span class='line'><span class="s">       Run all tests:</span>
</span><span class='line'><span class="s">       $PROGNAME --test all</span>
</span><span class='line'>
</span><span class='line'><span class="s">       Run specific test:</span>
</span><span class='line'><span class="s">       $PROGNAME --test test_string.sh</span>
</span><span class='line'>
</span><span class='line'><span class="s">       Run:</span>
</span><span class='line'><span class="s">       $PROGNAME --config /path/to/config/$PROGNAME.conf</span>
</span><span class='line'>
</span><span class='line'><span class="s">       Just show what you are going to do:</span>
</span><span class='line'><span class="s">       $PROGNAME -vn -c /path/to/config/$PROGNAME.conf</span>
</span><span class='line'><span class="s">    EOF</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pay attention that there should be real tab &#8216;\t&#8217; in the start of the line for each
line.<br/>
In vim you can use this replace command if your tab is 4 spaces:</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'>:s/^    /<span class="se">\t</span>/
</span></code></pre></td></tr></table></div></figure>


<h2>Command line arguments</h2>

<p>Here is an example to complement the usage function above. I got this code from
<a href="http://kirk.webfinish.com/2009/10/bash-shell-script-to-use-getopts-with-gnu-style-long-positional-parameters/" title="bash shell script to use getopts with gnu style long positional parameters">Kirk&#8217;s blog post - bash shell script to use getopts with gnu style long
positional parameters</a>:</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>
<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>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>cmdline<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="c"># got this idea from here:</span>
</span><span class='line'>    <span class="c"># http://kirk.webfinish.com/2009/10/bash-shell-script-to-use-getopts-with-gnu-style-long-positional-parameters/</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">arg</span><span class="o">=</span>
</span><span class='line'>    <span class="k">for </span>arg
</span><span class='line'>    <span class="k">do</span>
</span><span class='line'><span class="k">        </span><span class="nb">local </span><span class="nv">delim</span><span class="o">=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'>        <span class="k">case</span> <span class="s2">&quot;$arg&quot;</span> in
</span><span class='line'>            <span class="c">#translate --gnu-long-options to -g (short options)</span>
</span><span class='line'>            --config<span class="o">)</span>         <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-c &quot;</span>;;
</span><span class='line'>            --pretend<span class="o">)</span>        <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-n &quot;</span>;;
</span><span class='line'>            --test<span class="o">)</span>           <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-t &quot;</span>;;
</span><span class='line'>            --help-config<span class="o">)</span>    usage_config <span class="o">&amp;&amp;</span> <span class="nb">exit </span>0;;
</span><span class='line'>            --help<span class="o">)</span>           <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-h &quot;</span>;;
</span><span class='line'>            --verbose<span class="o">)</span>        <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-v &quot;</span>;;
</span><span class='line'>            --debug<span class="o">)</span>          <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}-x &quot;</span>;;
</span><span class='line'>            <span class="c">#pass through anything else</span>
</span><span class='line'>            *<span class="o">)</span> <span class="o">[[</span> <span class="s2">&quot;${arg:0:1}&quot;</span> <span class="o">==</span> <span class="s2">&quot;-&quot;</span> <span class="o">]]</span> <span class="o">||</span> <span class="nv">delim</span><span class="o">=</span><span class="s2">&quot;\&quot;&quot;</span>
</span><span class='line'>                <span class="nv">args</span><span class="o">=</span><span class="s2">&quot;${args}${delim}${arg}${delim} &quot;</span>;;
</span><span class='line'>        <span class="k">esac</span>
</span><span class='line'><span class="k">    done</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">#Reset the positional parameters to the short options</span>
</span><span class='line'>    <span class="nb">eval set</span> -- <span class="nv">$args</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">while </span><span class="nb">getopts</span> <span class="s2">&quot;nvhxt:c:&quot;</span> OPTION
</span><span class='line'>    <span class="k">do</span>
</span><span class='line'><span class="k">         case</span> <span class="nv">$OPTION</span> in
</span><span class='line'>         v<span class="o">)</span>
</span><span class='line'>             <span class="nb">readonly </span><span class="nv">VERBOSE</span><span class="o">=</span>1
</span><span class='line'>             ;;
</span><span class='line'>         h<span class="o">)</span>
</span><span class='line'>             usage
</span><span class='line'>             <span class="nb">exit </span>0
</span><span class='line'>             ;;
</span><span class='line'>         x<span class="o">)</span>
</span><span class='line'>             <span class="nb">readonly </span><span class="nv">DEBUG</span><span class="o">=</span><span class="s1">&#39;-x&#39;</span>
</span><span class='line'>             <span class="nb">set</span> -x
</span><span class='line'>             ;;
</span><span class='line'>         t<span class="o">)</span>
</span><span class='line'>             <span class="nv">RUN_TESTS</span><span class="o">=</span><span class="nv">$OPTARG</span>
</span><span class='line'>             verbose VINFO <span class="s2">&quot;Running tests&quot;</span>
</span><span class='line'>             ;;
</span><span class='line'>         c<span class="o">)</span>
</span><span class='line'>             <span class="nb">readonly </span><span class="nv">CONFIG_FILE</span><span class="o">=</span><span class="nv">$OPTARG</span>
</span><span class='line'>             ;;
</span><span class='line'>         n<span class="o">)</span>
</span><span class='line'>             <span class="nb">readonly </span><span class="nv">PRETEND</span><span class="o">=</span>1
</span><span class='line'>             ;;
</span><span class='line'>        <span class="k">esac</span>
</span><span class='line'><span class="k">    done</span>
</span><span class='line'>
</span><span class='line'><span class="k">    if</span> <span class="o">[[</span> <span class="nv">$recursive_testing</span> <span class="o">||</span> -z <span class="nv">$RUN_TESTS</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'>        <span class="o">[[</span> ! -f <span class="nv">$CONFIG_FILE</span> <span class="o">]]</span> <span class="se">\</span>
</span><span class='line'>            <span class="o">&amp;&amp;</span> eexit <span class="s2">&quot;You must provide --config file&quot;</span>
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'><span class="k">    return </span>0
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You use it like this, using the immutable ARGS variable we defined at the top:</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'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    cmdline <span class="nv">$ARGS</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<h2>Unit Testing</h2>

<ul>
<li>very important in higher level languages</li>
<li>Use <a href="http://code.google.com/p/shunit2/">shunit2</a> for unit testing</li>
</ul>


<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>test_config_line_paths<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">s</span><span class="o">=</span><span class="s1">&#39;partition cpm-all, 80-90,&#39;</span>
</span><span class='line'>
</span><span class='line'>    returns <span class="s2">&quot;/a&quot;</span> <span class="s2">&quot;config_line_paths &#39;$s /a, &#39;&quot;</span>
</span><span class='line'>    returns <span class="s2">&quot;/a /b/c&quot;</span> <span class="s2">&quot;config_line_paths &#39;$s /a:/b/c, &#39;&quot;</span>
</span><span class='line'>    returns <span class="s2">&quot;/a /b /c&quot;</span> <span class="s2">&quot;config_line_paths &#39;$s   /a  :    /b : /c, &#39;&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>config_line_paths<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">partition_line</span><span class="o">=</span><span class="s2">&quot;$@&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">echo</span> <span class="nv">$partition_line</span> <span class="se">\</span>
</span><span class='line'>        | csv_column 3 <span class="se">\</span>
</span><span class='line'>        | delete_spaces <span class="se">\</span>
</span><span class='line'>        | column 1 <span class="se">\</span>
</span><span class='line'>        | colons_to_spaces
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="nb">source</span> /usr/bin/shunit2
</span></code></pre></td></tr></table></div></figure>


<p>Here is another example using df command:</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>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">DF</span><span class="o">=</span>df
</span><span class='line'>
</span><span class='line'>mock_df_with_eols<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    cat <span class="s">&lt;&lt;- EOF</span>
</span><span class='line'><span class="s">    Filesystem           1K-blocks      Used Available Use% Mounted on</span>
</span><span class='line'><span class="s">    /very/long/device/path</span>
</span><span class='line'><span class="s">                         124628916  23063572 100299192  19% /</span>
</span><span class='line'><span class="s">    EOF</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>test_disk_size<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    returns 1000 <span class="s2">&quot;disk_size /dev/sda1&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">DF</span><span class="o">=</span>mock_df_with_eols
</span><span class='line'>    returns 124628916 <span class="s2">&quot;disk_size /very/long/device/path&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>df_column<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">disk_device</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">column</span><span class="o">=</span><span class="nv">$2</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$DF</span> <span class="nv">$disk_device</span> <span class="se">\</span>
</span><span class='line'>        | grep -v <span class="s1">&#39;Use%&#39;</span> <span class="se">\</span>
</span><span class='line'>        | tr <span class="s1">&#39;\n&#39;</span> <span class="s1">&#39; &#39;</span> <span class="se">\</span>
</span><span class='line'>        | awk <span class="s2">&quot;{print \$$column}&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>disk_size<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">disk_device</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>
</span><span class='line'>    df_column <span class="nv">$disk_device</span> 2
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here I have exception, for testing, I declare DF in the global scope not
readonly. This is because of shunit2 not allowing to change global scope
functions.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Elegant locking of BASH program]]></title>
    <link href="http://www.kfirlavi.com/blog/2012/11/06/elegant-locking-of-bash-program/"/>
    <updated>2012-11-06T08:18:00+02:00</updated>
    <id>http://www.kfirlavi.com/blog/2012/11/06/elegant-locking-of-bash-program</id>
    <content type="html"><![CDATA[<h2>Intro</h2>

<p>I want to block program from running twice simultaneously. Why would I want such
a thing? Lets say you have a program that creates the directory <code>/tmp/prog</code> and
update files inside this directory. If you run the program twice at the same
time, files inside this directory will get clobbered. Searching the net for
solution, <a href="http://linux.die.net/man/1/flock"><code>flock</code></a> comes up as a good way to solve the problem. <a href="http://linux.die.net/man/1/flock"><code>flock</code></a>
is part of the <a href="http://www.kernel.org/pub/linux/utils/util-linux/">util-linux</a> package.</p>

<h2>Basic solution</h2>

<p>Here is an <a href="http://stackoverflow.com/questions/169964/how-to-prevent-a-script-from-running-simultaneously">example</a> posted at <a href="http://stackoverflow.com">stackoverflow</a>:</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='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Makes sure we exit if flock fails.</span>
</span><span class='line'><span class="nb">set</span> -e
</span><span class='line'>
</span><span class='line'><span class="o">(</span>
</span><span class='line'>    <span class="c"># Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds</span>
</span><span class='line'>    flock -n 200
</span><span class='line'>
</span><span class='line'>    <span class="c"># Do stuff</span>
</span><span class='line'>
</span><span class='line'><span class="o">)</span> 200&gt;/var/lock/.myscript.exclusivelock
</span></code></pre></td></tr></table></div></figure>


<p>At the heart of the locking mechanizm is the last line, which create the file
<code>/var/lock/.myscript.exclusivelock</code> using file descriptor 200. The syntax
<code>9&gt;textfile</code>, is the way in BASH to create textfile using file descriptor 9.
Then we check if the file is locked in line 8, <code>flock -n 200</code> using the
file descriptor 200 we used to create the lock file with.   So while the
critical code after line 8, that runs in the sub shell, is running, the file
<code>/var/lock/.myscript.exclusivelock</code> stays locked, and will be released when the
sub shell exits.</p>

<h2>Next step</h2>

<p>My first rule of programming in BASH, is to have all the code functional and
the only line that is globally executed is <code>main</code> like this:</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='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'>do_A<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    ...
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>do_B<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    ...
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>So using this example, to lock the program we can do this:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">(</span>
</span><span class='line'>    flock -n 200
</span><span class='line'>    main
</span><span class='line'>
</span><span class='line'><span class="o">)</span> 200&gt;/var/lock/.myscript.exclusivelock
</span></code></pre></td></tr></table></div></figure>


<p>or:</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='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">(</span>
</span><span class='line'>        flock -n 200
</span><span class='line'>        do_A
</span><span class='line'>        do_B
</span><span class='line'>
</span><span class='line'>    <span class="o">)</span> 200&gt;/var/lock/.myscript.exclusivelock
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>First example breaks my rule, and <code>main</code> is not the only global code, but is not
too bad. The second example, does not look good to me. It seems that main have
more syntax complexity then it should. What we really want, in order to keep the code
clean, is creating a lock function that will behave like this:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    lock <span class="o">||</span> <span class="nb">exit </span>1
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Creating a locking function</h2>

<p>To move locking to a function, we&#8217;ll need to get rid of this sub shell syntax.</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">(</span>
</span><span class='line'>    flock -n 200
</span><span class='line'>    ...
</span><span class='line'>
</span><span class='line'><span class="o">)</span> 200&gt;/var/lock/.myscript.exclusivelock
</span></code></pre></td></tr></table></div></figure>


<p>The answer is to be found in jdimpson&#8217;s blog post <a href="http://jdimpson.livejournal.com/5685.html">using flock to protect critical sections in shell scripts</a>.
Using <code>exec</code> to create the lock file:</p>

<pre><code>exec 200&gt;/var/lock/.myscript.exclusivelock
</code></pre>

<p>Now we can crate the lock file, and use flock to acquire it:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">exec </span>200&gt;/var/lock/.myscript.exclusivelock
</span><span class='line'>
</span><span class='line'>    flock -n 200 <span class="se">\</span>
</span><span class='line'>        <span class="o">||</span> <span class="nb">exit </span>1
</span><span class='line'>
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>Lets create the lock function:</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='bash'><span class='line'>lock<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">exec </span>200&gt;/var/lock/.myscript.exclusivelock
</span><span class='line'>
</span><span class='line'>    flock -n 200 <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> <span class="k">return </span>0 <span class="se">\</span>
</span><span class='line'>        <span class="o">||</span> <span class="k">return </span>1
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    lock <span class="o">||</span> <span class="nb">exit </span>1
</span><span class='line'>
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>So now we have hard coded function ;-) What can we do next? Lets get rid of the
magic number 200 and the lock filename, and turn them to a variables.</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>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</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="nb">readonly </span><span class="nv">PROGNAME</span><span class="o">=</span><span class="k">$(</span>basename <span class="s2">&quot;$0&quot;</span><span class="k">)</span>
</span><span class='line'><span class="nb">readonly </span><span class="nv">LOCKFILE_DIR</span><span class="o">=</span>/tmp
</span><span class='line'><span class="nb">readonly </span><span class="nv">LOCK_FD</span><span class="o">=</span>200
</span><span class='line'>
</span><span class='line'>lock<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">prefix</span><span class="o">=</span><span class="nv">$1</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">fd</span><span class="o">=</span><span class="k">${</span><span class="nv">2</span><span class="k">:-</span><span class="nv">$LOCK_FD</span><span class="k">}</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">lock_file</span><span class="o">=</span><span class="nv">$LOCKFILE_DIR</span>/<span class="nv">$prefix</span>.lock
</span><span class='line'>
</span><span class='line'>    <span class="c"># create lock file</span>
</span><span class='line'>    <span class="nb">eval</span> <span class="s2">&quot;exec $fd&gt;$lock_file&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># acquier the lock</span>
</span><span class='line'>    flock -n <span class="nv">$fd</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">&amp;&amp;</span> <span class="k">return </span>0 <span class="se">\</span>
</span><span class='line'>        <span class="o">||</span> <span class="k">return </span>1
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>eexit<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nb">local </span><span class="nv">error_str</span><span class="o">=</span><span class="s2">&quot;$@&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">echo</span> <span class="nv">$error_str</span>
</span><span class='line'>    <span class="nb">exit </span>1
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>main<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    lock <span class="nv">$PROGNAME</span> <span class="se">\</span>
</span><span class='line'>        <span class="o">||</span> eexit <span class="s2">&quot;Only one instance of $PROGNAME can run at one time.&quot;</span>
</span><span class='line'>
</span><span class='line'>    do_A
</span><span class='line'>    do_B
</span><span class='line'><span class="o">}</span>
</span><span class='line'>main
</span></code></pre></td></tr></table></div></figure>


<p>So now we have a lock function that does what we want. It gets the prefix of
the lock filename, and then variable fd is 200 by default, but you can specify
different file descriptor number like this <code>lock $PROGNAME 500</code>. The important
change in the lock function is the turning of 200 to a variable <code>$fd</code>, and to
be able to execute the lock file creation, we use <code>eval</code>. Try it without <code>eval</code>
and see what happens. You will get error that there is no command 200.</p>

<h2>Conclusion</h2>

<p>We arrived from script like locking mechanism to a well closed lock function,
that will create exclusivity of the program running. I would go further and
paste this lock command to a library of its own. Then source it. i.e. <code>source
/usr/lib/lock.sh</code>. Look again at the main function and see how elegant and
expressive it is. i.e. lock program or exit the program, because another
instance of the program is already running.</p>

<p>nJoy,<br/>
Kfir</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Polar Wearlink Bluetooth on Linux]]></title>
    <link href="http://www.kfirlavi.com/blog/2012/10/28/polar-wearlink-bluetooth-on-linux/"/>
    <updated>2012-10-28T13:50:00+02:00</updated>
    <id>http://www.kfirlavi.com/blog/2012/10/28/polar-wearlink-bluetooth-on-linux</id>
    <content type="html"><![CDATA[<h2>Intro</h2>

<p>In the preparations for getting my first smart phone, mainly to use it as a
heart rate monitor and GPS for my workouts, I opted for buying a bluetooth heart
rate chest strap. Until I&#8217;ll get new phone, I want to connect the chest strap to
my laptop, for logging heart rate when exercising at home.</p>

<p>Searching the net for Linux HRM (heart rate monitor) implementation, I have
found an interesting post <a href="http://ww.telent.net/2012/5/3/listening_to_a_polar_bluetooth_hrm_in_linux" title="Listening to a Polar Bluetooth HRM in Linux - by Daniel Barlow">Listening to a Polar Bluetooth HRM in Linux</a>.  The
author wrote a Ruby script that listens to the Polar bluetooth device. So I
opted to buy the chest strap he uses in the blog post - <a href="http://www.polar.fi/en/products/accessories/Polar_WearLink_transmitter_with_Bluetooth" title="Polar WearLink+ transmitter with Bluetooth">Polar WearLink+
transmitter with Bluetooth</a>.  Pay attention this is not the <a href="http://www.polar.fi/en/products/accessories/H7_heart_rate_sensor" title="Polar H7 heart rate sensor">Polar H7</a>
which is the newer and support Bluetooth 4.0, but have a lot of issues
connecting to android devices. I paid 80$ include shipping to Israel.</p>

<p>After getting the Polar strap, I notice problem connecting the device.
Searching Google, I found that there are issues with the battery, that drains
too fast. Here is the <a href="http://forum.polar.fi/showthread.php?t=18487&amp;page=5" title="Problems with Polar WearLink+ transmitter with Bluetooth - Polar forumes">thread</a> about this problem. I took the battery out,
and tried to replace it with other batteries, but nothing. My computer couldn&#8217;t
find the device.  Next day I tried again, and replaced the battery again to the
original. Then by magic, the computer did found the device. I don&#8217;t know how or
why this happened, but I&#8217;ll keep track of the battery life and post back.</p>

<h2>My heart rate on the screen ;-)</h2>

<p>In his <a href="http://ww.telent.net/2012/5/3/listening_to_a_polar_bluetooth_hrm_in_linux" title="Listening to a Polar Bluetooth HRM in Linux - by Daniel Barlow">blog post</a> Daniel created a <a href="https://gist.github.com/2500413" title="polar.rb by Daniel Barlow">small program</a> that listen to the
heart rate belt, then prints the data to the screen.  Here is a sample output of
the program, and the column <code>:hr=&gt;</code> shows my heart rate:</p>

<figure class='code'><figcaption><span></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="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">9</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">74</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">793</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">25</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">74</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">811</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">26</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">11</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">73</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">845</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">27</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">12</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">73</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">816</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">29</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">13</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">73</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">810</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">30</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">14</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">74</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">800</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">31</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">15</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">74</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">779</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">32</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">0</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">75</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">776</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">34</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">76</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">769</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">36</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">2</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">75</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">833</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">36</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">3</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">74</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">837</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">38</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">4</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">75</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">800</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">39</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">10</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">245</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">5</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">75</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">783</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">40</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span><span class='line'><span class="p">{</span><span class="ss">:len</span><span class="o">=&gt;</span><span class="mi">8</span><span class="p">,</span> <span class="ss">:chk</span><span class="o">=&gt;</span><span class="mi">247</span><span class="p">,</span> <span class="ss">:seq</span><span class="o">=&gt;</span><span class="mi">6</span><span class="p">,</span> <span class="ss">:status</span><span class="o">=&gt;</span><span class="mi">209</span><span class="p">,</span> <span class="ss">:hr</span><span class="o">=&gt;</span><span class="mi">75</span><span class="p">,</span> <span class="ss">:rr</span><span class="o">=&gt;[</span><span class="mi">814</span><span class="o">]</span><span class="p">,</span> <span class="ss">:time</span><span class="o">=&gt;</span><span class="mi">2012</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">27</span> <span class="mi">17</span><span class="p">:</span><span class="mi">21</span><span class="p">:</span><span class="mi">41</span> <span class="o">+</span><span class="mo">0200</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Few steps to get it working</h2>

<h3>Compile kernel Bluetooth drivers</h3>

<pre><code>make menuconfig
</code></pre>

<p>and in <code>Networking support -&gt; Bluetooth subsystem support (NEW)</code> I just marked
everything as module. After you understand what driver you need, you can unmark
the drivers that are not needed by your system. This procedure is for
<a href="http://www.gentoo.org">Gentoo</a> users, or people that use custom kernels. For other OSs Bluetooth is
usually provided with the standard kernel.</p>

<h3>Install software</h3>

<p>You will need to install bluez for handling the Bluetooth service:</p>

<pre><code>emerge -av net-wireless/bluez
</code></pre>

<p>Next, if you have Broadcom BCM203x and STLC2300 Bluetooth chips, you should
install their firmware:</p>

<pre><code>emerge -av net-wireless/bluez-firmware 
</code></pre>

<p>For debugging the connection you can use hcidump similar to tcpdump:</p>

<pre><code>emerge -av net-wireless/bluez-hcidump
</code></pre>

<p>And last, but very important for providing PIN to the Bluetooth device:</p>

<pre><code>emerge -av net-wireless/blueman 
</code></pre>

<h3>Enable Bluetooth</h3>

<p>I have an Lenovo X201 laptop, so I enable and disable the Bluetooth with this
command:</p>

<pre><code>echo enable &gt; /proc/acpi/ibm/bluetooth
echo disable &gt; /proc/acpi/ibm/bluetooth
</code></pre>

<p>If you don&#8217;t have a Thikpad, this method will not work, as this command relays
on thinkpad.ko kernel module. Please Google to find out how to enable Bluetooth
on your setup.</p>

<p>Now start the bluez service:</p>

<pre><code>/etc/init.d/bluetooth start
</code></pre>

<h3>Search the Polar device</h3>

<p>In order to search the chest strap, you will need to run:</p>

<pre><code>hcitool scan
</code></pre>

<p>and the output should look similar to this:</p>

<pre><code>Scanning ...
        00:22:D0:00:95:31       Polar iWL
</code></pre>

<p>The mac address is important, as you need to supply it as a parameter to
<a href="https://gist.github.com/2500413" title="polar.rb by Daniel Barlow">polar.rb</a>.</p>

<p>I found that my laptop will not find the Polar device on the first scan, so I
ran the following command to scan few times:</p>

<pre><code>while true ; do hcitool scan ; sleep 1 ; done
</code></pre>

<p>It took a while, but it finds the Polar device eventually.</p>

<h3>Pairing laptop with Polar strap</h3>

<p>Ok, I must admit, this was quit challenging. I didn&#8217;t install the bluman package
at first, and saw that running</p>

<pre><code>ruby polar.rb 00:22:D0:00:95:31
</code></pre>

<p>result with connection refused. Using hcidump, I saw that the Bluetooth on the
chest strap is aborting the connection due to lack of PIN code. The manual
states that the PIN is 0000 (4 times zero), so I searched for a way to add this
to the program. It wasn&#8217;t straight forward task, so I read again <a href="http://ww.telent.net/2012/5/3/listening_to_a_polar_bluetooth_hrm_in_linux" title="Listening to a Polar Bluetooth HRM in Linux - by Daniel Barlow">Daniel&#8217;s
post</a> and noticed that he uses the blueman package. I installed it. Then ran
the command:</p>

<pre><code>blueman-applet
</code></pre>

<p>Hit the <strong>Search</strong> button and it should find the Polar device, then hit the <strong>Pair</strong>
button to allow the device to request the PIN. This provided the initial pairing
of the device with the laptop.</p>

<p><img src="http://www.kfirlavi.com/blog/2012/10/28/polar-wearlink-bluetooth-on-linux/blueman-applet.png" title="blueman-applet window after pairing laptop and Polar device" ></p>

<p>After this procedure, I was able to run the <code>polar.rb</code> using the command:</p>

<pre><code>ruby polar.rb 00:22:D0:00:95:31
</code></pre>

<p>and my heart rate beats started appearing on the laptop screen.</p>
]]></content>
  </entry>
  
</feed>
