<?xml version="1.0" encoding="UTF-8"?>

    <feed xmlns="http://www.w3.org/2005/Atom">
        <title>tummy.com Main Blog Feed</title>
        <subtitle>Your Linux Data Center Experts</subtitle>
        <link rel="alternate" href="http://www.tummy.com/" />
        <link rel="self" href="http://www.tummy.com/feed.xml" type="application/atom+xml" />
        <id>http://www.tummy.com/</id>
        <updated>2013-05-16T00:21:32Z</updated>
        
        <author>
            <name>tummy.com, ltd.</name>
            <email>webmaster@tummy.com</email>
            <uri>http://www.tummy.com/</uri>
        </author>
        
        
            <entry>
                <title>40-day Streak at Github</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/05/15/40-day-streak-at-github/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/05/15/40-day-streak-at-github/</id>
                <updated>2013-05-15T16:02:00Z</updated>
                
                <summary type="html">I don&amp;#39;t get to develop software much, so mostly I do it recreationally.  Recently, I got an urge to develop a &amp;quot;30 day streak&amp;quot; on github.  It tracks the streak for you -- that&amp;#39;s how I noticed it, it said my streak was maybe a couple of days...</summary>
                <content type="html">&lt;p&gt;I don&amp;#39;t get to develop software much, so mostly I do it recreationally.  Recently, I got an urge to develop a &amp;quot;30 day streak&amp;quot; on github.  It tracks the streak for you -- that&amp;#39;s how I noticed it, it said my streak was maybe a couple of days...&lt;/p&gt;

&lt;p&gt;I had a bit of a false start: 9 days in I misunderstood something and missed a day...  Now I&amp;#39;ve built up 43 days.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s been amazingly powerful, this trying to do something every day on github.  I&amp;#39;ve made more progress on a number of pet projects than I have in quite a long time.  I also started a new project, and have kept with it for over a month consistently.  It&amp;#39;s not uncommon for me to start a new project and then lose interest after a relatively short period of time.&lt;/p&gt;

&lt;p&gt;There have been some days where my participation has been very small.  For example, when I don&amp;#39;t have much time or energy during the day, I will usually review the TODO list and do triage: adding items, removing items I have completed but forgot to remove, adding more details, or just ordering it based on priority.  Valuable, but not exactly rocket science...&lt;/p&gt;

&lt;p&gt;The new project I have been working the most on is a re-write of the Python memcache client, making sure it&amp;#39;s fully tested and using a few new APIs (so far).  The code is much cleaner than the previous code (which I didn&amp;#39;t write, I&amp;#39;ve just been maintaining).  The big benefit is that the same codebase works with both Python 2.7 and 3.3.&lt;/p&gt;

&lt;p&gt;You can check out my progress on &lt;a href=&#34;https://github.com/linsomniac&#34;&gt;my github profile&lt;/a&gt;.  I&amp;#39;m not sure how long I want to keep going with the streak...  I definitely wanted to do 30 days, but didn&amp;#39;t want to feel like I had to keep going once I hit that.  I might consider breaking the streak once I get this new project released.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Nagios NRPE Exploit</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/05/15/nagios-nrpe-exploit/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/05/15/nagios-nrpe-exploit/</id>
                <updated>2013-05-15T15:26:00Z</updated>
                
                <summary type="html">Note that there is an exploit for NRPE, the network daemon for running Nagios monitoring checks, which may allow unauthenticated users on the public Internet to run arbitrary commands on impacted systems.  In particular, if you don&amp;#39;t either firewall off NRPE, or enable the &amp;quot;allowed host&amp;quot; setting in NRPE, arbitrary commands can be run as the user the NRPE daemon runs as.</summary>
                <content type="html">&lt;p&gt;Note that there is an exploit for NRPE, the network daemon for running Nagios monitoring checks, which may allow unauthenticated users on the public Internet to run arbitrary commands on impacted systems.  In particular, if you don&amp;#39;t either firewall off NRPE, or enable the &amp;quot;allowed host&amp;quot; setting in NRPE, arbitrary commands can be run as the user the NRPE daemon runs as.&lt;/p&gt;

&lt;p&gt;It looks like there is at least one very active person scanning for this exploit and using automated tools to compromise hosts via it.  They seem to be deploying Bitcoin mining clients, and we have seen two machines in very different parts of the public Internet space compromised by this, using the same bitcoin mining account name.&lt;/p&gt;

&lt;p&gt;If your machine has been compromised by this person, it will be running the &amp;quot;minerd&amp;quot; process, using all available CPU time.&lt;/p&gt;

&lt;p&gt;It appears to impact NRPE version 2.13 and below.  Here is an &lt;a href=&#34;http://www.opsview.com/whats-new/blog/security-notice-nrpe-exploit&#34;&gt;Opsview blog post about the exploit&lt;/a&gt;&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Python unittest of Misbehaving TCP Servers</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/05/11/python-unittest-of-misbehaving-tcp-servers/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/05/11/python-unittest-of-misbehaving-tcp-servers/</id>
                <updated>2013-05-11T15:18:00Z</updated>
                
                <summary type="html">I&amp;#39;ve been working on &lt;a href=&#34;https://github.com/linsomniac/python-memcached2&#34;&gt;the next generation memcached module&lt;/a&gt; for Python, and it includes extensive tests.  One of the things I wanted to test was what happened when the Memcache server unexpectedly dies.</summary>
                <content type="html">&lt;p&gt;I&amp;#39;ve been working on &lt;a href=&#34;https://github.com/linsomniac/python-memcached2&#34;&gt;the next generation memcached module&lt;/a&gt; for Python, and it includes extensive tests.  One of the things I wanted to test was what happened when the Memcache server unexpectedly dies.&lt;/p&gt;

&lt;p&gt;Rather than using Mocks, I wanted to have my code connect to a real server that was misbehaving.  So I created a class that you can give a simple expect/send program to, and it forks off and runs a server for a few seconds, then exits.  The program is a list, with None indicating that it should receive data from the client, and a string indicating something to send.&lt;/p&gt;

&lt;p&gt;This allowed me to track down a number of exceptions that I wasn&amp;#39;t catching in my high-level wrapper code that treats exceptions as cache misses.  Fantastically useful!&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve published this code to my &lt;a href=&#34;https://github.com/linsomniac/python-unittest-skeleton&#34;&gt;unittest skeleton code repository&lt;/a&gt;.  Here&amp;#39;s a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from mctestsupp import RECEIVE, CommandServer

immediately_disconnect_server = CommandServer([])
sc = memcached2.ServerConnection(&amp;#39;memcached://127.0.0.1:{0}/&amp;#39;
        .format(immediately_disconnect_server.port))
with self.assertRaises(memcached2.ServerDisconnect):
            memcache.set(&amp;#39;foo&amp;#39;, &amp;#39;bar&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That also has a skeleton for testing Bottle web apps super easily.  I&amp;#39;ve been using Bottle a lot lately for simple little web control panel type apps.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Correct Password Hashing in Python</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/04/08/correct-password-hashing-in-python/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/04/08/correct-password-hashing-in-python/</id>
                <updated>2013-04-08T22:40:00Z</updated>
                
                <summary type="html">With Python 3.3, a set of my patches were accepted to enhance the crypt library and make strong password hashing easy.  Just call &amp;quot;crypt.crypt()&amp;quot; with the password and the result will be a salted hash.  You can then use that salted hash with &amp;quot;crypt.crypt()&amp;quot; to check the password again in the future:</summary>
                <content type="html">&lt;p&gt;With Python 3.3, a set of my patches were accepted to enhance the crypt library and make strong password hashing easy.  Just call &amp;quot;crypt.crypt()&amp;quot; with the password and the result will be a salted hash.  You can then use that salted hash with &amp;quot;crypt.crypt()&amp;quot; to check the password again in the future:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import crypt
&amp;gt;&amp;gt;&amp;gt; salted_hash = crypt.crypt(&amp;#39;foo&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; len(salted_hash) 
106
&amp;gt;&amp;gt;&amp;gt; crypt.crypt(&amp;#39;foo&amp;#39;, salted_hash) == salted_hash
True
&amp;gt;&amp;gt;&amp;gt; crypt.crypt(&amp;#39;bar&amp;#39;, salted_hash) == salted_hash
False
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More information is available in the &lt;a href=&#34;http://docs.python.org/3.3/library/crypt.html?highlight=crypt#crypt.crypt&#34;&gt;crypt module documentation&lt;/a&gt;&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>New BackBlaze Storage Pod, 180TB for $11K.</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/04/08/new-backblaze-storage-pod-180tb-for-11k/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/04/08/new-backblaze-storage-pod-180tb-for-11k/</id>
                <updated>2013-04-08T22:22:00Z</updated>
                
                <summary type="html">Back in 2009, BackBlaze came out of nowhere and announced the open sourced plans for a 4U system capable of storing over 60TB for $8K.  Just a few weeks ago they released the &lt;a href=&#34;http://blog.backblaze.com/2013/02/20/180tb-of-good-vibrations-storage-pod-3-0/&#34;&gt;Version 3.0 Storage Pod Plans&lt;/a&gt;, capable of storing 180TB for under $11K.  Good to see they&amp;#39;ve been keeping up with new releases, looks like a lot of good enhancements like better vibration dampening.</summary>
                <content type="html">&lt;p&gt;Back in 2009, BackBlaze came out of nowhere and announced the open sourced plans for a 4U system capable of storing over 60TB for $8K.  Just a few weeks ago they released the &lt;a href=&#34;http://blog.backblaze.com/2013/02/20/180tb-of-good-vibrations-storage-pod-3-0/&#34;&gt;Version 3.0 Storage Pod Plans&lt;/a&gt;, capable of storing 180TB for under $11K.  Good to see they&amp;#39;ve been keeping up with new releases, looks like a lot of good enhancements like better vibration dampening.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>First 5 Minutes Troubleshooting A Server</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/04/03/first-5-minutes-troubleshooting-a-server/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/04/03/first-5-minutes-troubleshooting-a-server/</id>
                <updated>2013-04-03T12:48:00Z</updated>
                
                <summary type="html">Evelyn forwarded this blog post on the &lt;a href=&#34;http://devo.ps/blog/2013/03/06/troubleshooting-5minutes-on-a-yet-unknown-box.html&#34;&gt;First 5 Minutes Troubleshooting An Unknown Server&lt;/a&gt;.  It&amp;#39;s pretty good, as a general guide for an unknown server.</summary>
                <content type="html">&lt;p&gt;Evelyn forwarded this blog post on the &lt;a href=&#34;http://devo.ps/blog/2013/03/06/troubleshooting-5minutes-on-a-yet-unknown-box.html&#34;&gt;First 5 Minutes Troubleshooting An Unknown Server&lt;/a&gt;.  It&amp;#39;s pretty good, as a general guide for an unknown server.&lt;/p&gt;

&lt;p&gt;Our focus is a little different: We try not to have unknown servers, which is why we try to get our customers to commit to an ongoing relationship rather than just getting called when there&amp;#39;s an emergency.  We have had success at preventing problems rather than reacting to them.  The diagnosis process is quite different when you are more familiar with a box and you know that munin and nagios monitoring are set up, etc...&lt;/p&gt;

&lt;p&gt;In general, I will say that when there is a problem on a customer system, especially if it is performance-related, I will usually look at &amp;quot;uptime&amp;quot; first.  This tells you if the system was recently rebooted, and the system load.  If the load is higher than 0.5 or so, I will usually run &amp;quot;vmstat 1&amp;quot; and watch that output, which will tell me if the system is spending a lot of &amp;quot;cpu wa&amp;quot; time (usually I/O related), has no &amp;quot;cpu id&amp;quot; (idle CPU resources), if there are many &amp;quot;b&amp;quot; (blocked processes), and if it&amp;#39;s swapping.&lt;/p&gt;

&lt;p&gt;However, as the beginning of the above post says, knowing what you are troubleshooting is best.  I always prefer to know how to reproduce the problem that I am troubleshooting, and if any changes have been made since it was last working.  Of course, some of this information you have to take with a grain of salt.  If I had a nickel for every time I&amp;#39;ve heard &amp;quot;No, nothing has changed&amp;quot; when something had changed...  :-)&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Article on Budget Data-Center Storage</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/03/25/article-on-budget-data-center-storage/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/03/25/article-on-budget-data-center-storage/</id>
                <updated>2013-03-25T13:59:00Z</updated>
                
                <summary type="html">Inexpensive storage tends to lack robustness, but robust storage tends to be spendy.  I&amp;#39;ve spent time over the last year brainstorming and decided to write down some of my ideas, hoping that it either helps out someone else or that it sparks discussion to provide some more ideas.  &lt;a href=&#34;http://www.tummy.com/articles/budget-datacenter-storage-overview/&#34;&gt;Ideas on Budget Storage for the Data Center&lt;/a&gt;.  Any clever ideas?</summary>
                <content type="html">&lt;p&gt;Inexpensive storage tends to lack robustness, but robust storage tends to be spendy.  I&amp;#39;ve spent time over the last year brainstorming and decided to write down some of my ideas, hoping that it either helps out someone else or that it sparks discussion to provide some more ideas.  &lt;a href=&#34;http://www.tummy.com/articles/budget-datacenter-storage-overview/&#34;&gt;Ideas on Budget Storage for the Data Center&lt;/a&gt;.  Any clever ideas?&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>SSH Network Tunneling</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/03/04/ssh-network-tunneling/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/03/04/ssh-network-tunneling/</id>
                <updated>2013-03-04T23:37:00Z</updated>
                
                <summary type="html">In the past I&amp;#39;ve used PPP over SSH to do simple network tunnels.  This is not recommended for any serious networking, but last week I was doing some VoIP testing and wanted to isolate NAT on both ends from being the problem.  You typically don&amp;#39;t want a TCP tunnel for a VPN, but I just needed something simple for an hour of testing.</summary>
                <content type="html">&lt;p&gt;In the past I&amp;#39;ve used PPP over SSH to do simple network tunnels.  This is not recommended for any serious networking, but last week I was doing some VoIP testing and wanted to isolate NAT on both ends from being the problem.  You typically don&amp;#39;t want a TCP tunnel for a VPN, but I just needed something simple for an hour of testing.&lt;/p&gt;

&lt;p&gt;I found that SSH now has a &amp;quot;-w&amp;quot; option which will set up &amp;quot;tun&amp;quot; devices on either end and transport the traffic between them.  If you say &amp;quot;ssh -w 0:0 hostname&amp;quot;, it will set up a &amp;quot;tun0&amp;quot; on both ends.  Then you just need to ifconfig the two tunnel endpoints.  You can use the &amp;quot;LocalCommand&amp;quot; setting to do one ifconfig and the remote command to do the other, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -o PermitLocalCommand=yes \
    -o LocalCommand=&amp;#34;ifconfig tun0 192.168.0.1 netmask 255.255.255.252&amp;#34; \
    -w 0:0 $HOSTNAME \
    &amp;#39;ifconfig tun0 192.168.0.2 netmask 255.255.255.252; sleep 900000&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that on the server you will need to set &amp;quot;PermitTunnel yes&amp;quot; in /etc/ssh/sshd_config and restart SSH.  This needs to run as root on both ends to build the tunnel interface.&lt;/p&gt;

&lt;p&gt;It looks like this functionality is not exactly new, but I hadn&amp;#39;t heard about it before.  I tend to avoid tunneling over SSH, because TCP over TCP tends to react badly, so I haven&amp;#39;t looked at it in probably a decade.  But in this case I just needed something simple, and GRE tunneling  would have been problematic because of NAT on both ends.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Git cheat-sheet</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/03/02/git-cheat-sheet/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/03/02/git-cheat-sheet/</id>
                <updated>2013-03-02T13:33:00Z</updated>
                
                <summary type="html">I am a huge fan of version control.  However, I do very little development, and even less Linux kernel development.  So my interactions with git are usually limited to &amp;quot;git pull&amp;quot;, &amp;quot;git push&amp;quot; and &amp;quot;git commit -a&amp;quot;.  Sometimes I run into having to do unusual things, like last night where I accidentally ran a &amp;quot;git rm&amp;quot; on the wrong file and needed to get it back.</summary>
                <content type="html">&lt;p&gt;I am a huge fan of version control.  However, I do very little development, and even less Linux kernel development.  So my interactions with git are usually limited to &amp;quot;git pull&amp;quot;, &amp;quot;git push&amp;quot; and &amp;quot;git commit -a&amp;quot;.  Sometimes I run into having to do unusual things, like last night where I accidentally ran a &amp;quot;git rm&amp;quot; on the wrong file and needed to get it back.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m starting a &lt;a href=&#34;http://www.tummy.com/articles/seans-git-cheatsheet/&#34;&gt;Git Cheatsheet&lt;/a&gt; to record examples of commands that I use infrequently but want to remember.  So that I don&amp;#39;t have to keep bugging my git go-to-guy &lt;a href=&#34;http://www.wwwdotorg.org/&#34;&gt;Stephen Warren&lt;/a&gt; about the same thing.  :-)&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>What you need to know about ARP, in article form.</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/03/02/what-you-need-to-know-about-arp-in-article-form/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/03/02/what-you-need-to-know-about-arp-in-article-form/</id>
                <updated>2013-03-02T13:19:00Z</updated>
                
                <summary type="html">A few weeks ago we ran into a situation where two machines ended up on the same IP address, on machines an hour away, despite testing which was done before leaving.  Worse, the duplicated IP was on the system management console, so this was the only way into the machine, an OS had not yet been installed.  Knowing how ARP works can allow you to work around a situation like this, so I wrote an article about it: &lt;a href=&#34;http://www.tummy.com/articles/networking-basics-how-arp-works/&#34;&gt;Networking Basics: How ARP Works&lt;/a&gt;.</summary>
                <content type="html">&lt;p&gt;A few weeks ago we ran into a situation where two machines ended up on the same IP address, on machines an hour away, despite testing which was done before leaving.  Worse, the duplicated IP was on the system management console, so this was the only way into the machine, an OS had not yet been installed.  Knowing how ARP works can allow you to work around a situation like this, so I wrote an article about it: &lt;a href=&#34;http://www.tummy.com/articles/networking-basics-how-arp-works/&#34;&gt;Networking Basics: How ARP Works&lt;/a&gt;.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>New nanomon with built-in daemon mode scheduler</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/23/new-nanomon-with-built-in-daemon-mode-scheduler/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/23/new-nanomon-with-built-in-daemon-mode-scheduler/</id>
                <updated>2013-02-23T13:33:00Z</updated>
                
                <summary type="html">I&amp;#39;ve released a new &lt;a href=&#34;http://www.tummy.com/software/nanomon/&#34;&gt;nanomon&lt;/a&gt; which includes an internal scheuler.  The primary benefits of this scheduler are that it can run checks more frequently than every minute, and multiple copies will not be started if the checks take longer than the check frequency.  You can now run checks every 15 second, for example.</summary>
                <content type="html">&lt;p&gt;I&amp;#39;ve released a new &lt;a href=&#34;http://www.tummy.com/software/nanomon/&#34;&gt;nanomon&lt;/a&gt; which includes an internal scheuler.  The primary benefits of this scheduler are that it can run checks more frequently than every minute, and multiple copies will not be started if the checks take longer than the check frequency.  You can now run checks every 15 second, for example.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>BIND+RRL patched RPMs available</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/20/bindrrl-patched-rpms-available/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/20/bindrrl-patched-rpms-available/</id>
                <updated>2013-02-20T15:12:00Z</updated>
                
                <summary type="html">As I mentioned &lt;a href=&#34;http://www.tummy.com/blogs/2013/01/11/interesting-read-on-request-versus-response-rate-limiting/&#34;&gt;previously about BIND response rate limiting&lt;/a&gt;, we recently had some problems with our DNS server being hammered, probably as part of a denial of service attack on some remote entities.</summary>
                <content type="html">&lt;p&gt;As I mentioned &lt;a href=&#34;http://www.tummy.com/blogs/2013/01/11/interesting-read-on-request-versus-response-rate-limiting/&#34;&gt;previously about BIND response rate limiting&lt;/a&gt;, we recently had some problems with our DNS server being hammered, probably as part of a denial of service attack on some remote entities.&lt;/p&gt;

&lt;p&gt;DNS is a fairly troublesome protocol because typically it uses UDP, and UDP makes it trivial to cause the server to send its response to an innocent third party.&lt;/p&gt;

&lt;p&gt;The correct fix for this seems to be Response Rate Limiting, which there are some &lt;a href=&#34;http://www.redbarn.org/dns/ratelimits&#34;&gt;patches available for BIND&lt;/a&gt;.  Request rate limiting, they suggest, happens at the wrong level, and can&amp;#39;t tell the difference between someone asking for a bunch of distinct queries rather than the same query over and over like what our attack was about.&lt;/p&gt;

&lt;p&gt;But, getting those patches applied to the RPMs for CentOS was a bit of a pain.  Quite a bit, actually, took the better part of a day to get the new RPMs built and tested.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve made availbale the packages I&amp;#39;ve built for 32-bit CentOS 6 at &lt;a href=&#34;http://yum1.tummy.com/bind-rrl/centos/6/&#34;&gt;http://yum1.tummy.com/bind-rrl/centos/6/&lt;/a&gt;.  You should be able to list this location in your &amp;quot;/etc/yum.repos.d/bindrrl.repo&amp;quot; file like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[bindrrl]
name=BIND RRL for Enterprise Linux 6 - $basearch
baseurl=http://yum1.tummy.com/bind-rrl/centos/$releasever/$basearch
enabled=1
gpgcheck=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That should allow you to use yum to install and update to the RRL patched versions.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>New release of nanomon.</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/19/new-release-of-nanomon/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/19/new-release-of-nanomon/</id>
                <updated>2013-02-19T15:25:00Z</updated>
                
                <summary type="html">I&amp;#39;ve released a new version of &lt;a href=&#34;http://www.tummy.com/software/nanomon/&#34;&gt;nanomon&lt;/a&gt; which make the &amp;quot;UP&amp;quot; e-mail report what services have recovered.  Previously it simply reported that all services were up, because at the time the &amp;quot;UP&amp;quot; comes through it doesn&amp;#39;t remember what was down.</summary>
                <content type="html">&lt;p&gt;I&amp;#39;ve released a new version of &lt;a href=&#34;http://www.tummy.com/software/nanomon/&#34;&gt;nanomon&lt;/a&gt; which make the &amp;quot;UP&amp;quot; e-mail report what services have recovered.  Previously it simply reported that all services were up, because at the time the &amp;quot;UP&amp;quot; comes through it doesn&amp;#39;t remember what was down.&lt;/p&gt;

&lt;p&gt;nanomon is extremely simple monitoring, but with enough features that it will prevent false positives and prevent e-mails from being generated for every check, alerts only get sent on service transition.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Wrote a Quickstart for Static Sites with Mynt</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/15/wrote-a-quickstart-for-static-sites-with-mynt/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/15/wrote-a-quickstart-for-static-sites-with-mynt/</id>
                <updated>2013-02-15T13:49:00Z</updated>
                
                <summary type="html">I recently presented to NCLUG about building a static site using the &amp;quot;Mynt&amp;quot; tool.  As part of that I have written an &lt;a href=&#34;http://www.tummy.com/articles/static-sites-with-bootstrap-and-mynt/&#34;&gt;article about using Mynt to build a static site&lt;/a&gt;.  This is based on the work I did with building the new tummy.com site, and combines all the tricks I found related to making a full site, rather than using Mynt to make a blog, which is what the Mynt tutorial goes over.</summary>
                <content type="html">&lt;p&gt;I recently presented to NCLUG about building a static site using the &amp;quot;Mynt&amp;quot; tool.  As part of that I have written an &lt;a href=&#34;http://www.tummy.com/articles/static-sites-with-bootstrap-and-mynt/&#34;&gt;article about using Mynt to build a static site&lt;/a&gt;.  This is based on the work I did with building the new tummy.com site, and combines all the tricks I found related to making a full site, rather than using Mynt to make a blog, which is what the Mynt tutorial goes over.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Preventing Power Outages, Super Bowl Edition</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/11/preventing-power-outages-super-bowl-edition/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/11/preventing-power-outages-super-bowl-edition/</id>
                <updated>2013-02-11T19:37:00Z</updated>
                
                <summary type="html">There has been a lot of discussion about the power outage at the Super Bowl.  Power failure is a subject near and dear to most computer users, especially those in the Data Center.  A lot has been written about the outage, including finger pointing in all different directions. I especially like the statements that the &amp;quot;&lt;a href=&#34;http://chicago.cbslocal.com/2013/02/08/mystery-solved-super-bowl-outage-traced-to-faulty-relay-device/&#34;&gt;faulty device was manufactured in Chicago&lt;/a&gt;&amp;quot;.  As if the readers will conclude &amp;quot;Oh, that explains everything!&amp;quot;</summary>
                <content type="html">&lt;p&gt;There has been a lot of discussion about the power outage at the Super Bowl.  Power failure is a subject near and dear to most computer users, especially those in the Data Center.  A lot has been written about the outage, including finger pointing in all different directions. I especially like the statements that the &amp;quot;&lt;a href=&#34;http://chicago.cbslocal.com/2013/02/08/mystery-solved-super-bowl-outage-traced-to-faulty-relay-device/&#34;&gt;faulty device was manufactured in Chicago&lt;/a&gt;&amp;quot;.  As if the readers will conclude &amp;quot;Oh, that explains everything!&amp;quot;&lt;/p&gt;
&lt;h2&gt;Backup Power FTW?&lt;/h2&gt;
&lt;p&gt;One piece of commentary I&amp;#39;ve particularly found interesting is the &lt;a href=&#34;http://perspectives.mvdirona.com/2013/02/04/ThePowerFailureSeenAroundTheWorld.aspx&#34;&gt;personal blog post of Amazon Distinguished Engineer James Hamilton&lt;/a&gt;.  I&amp;#39;ll admit that my first reaction on hearing about this blog post was &amp;quot;I&amp;#39;m not sure Amazon is one to be talking about preventing blackouts&amp;quot;.  Coming shortly after the Christmas Eve 17-hour outage of Netflix (which uses Amazon&amp;#39;s infrastructure) and an hour outage of Amazon&amp;#39;s own site.  Particularly as it seems unlikely that an Amazon engineer has any direct knowledge of the specific inside workings of the venue where the outage occurred.&lt;/p&gt;

&lt;p&gt;The blog entry is worth a read and does offer some good suggestions.  However, it also offers some more problematic suggestions.&lt;/p&gt;

&lt;p&gt;The good suggestions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replacing the lighting with equipment that doesn&amp;#39;t take 20 minutes to
come online.  Half the outage was after power was restored.&lt;/li&gt;
&lt;li&gt;Splitting power up into smaller zones and interleaving the lights.
Instead of half the Superdome going black, maybe it could have been
designed so that every 4th or 6th light went out.&lt;/li&gt;
&lt;li&gt;Automated Recovery could have shortened the power outage from 15 minutes
to seconds.  Though the lights still would have taken 20 minutes to come
back on.&lt;/li&gt;
&lt;li&gt;Improved testing procedures seem likely to have found this fault, if
testing at maximum expected utilization and at overload had been done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, I would call into question the recommendation of installing backup generators.  Admittedly, I&amp;#39;m making this call a week after the blog posting, and we have more information about the cause of the failure.  I did make this call a week ago, I just haven&amp;#39;t had time to write about it until now.  That&amp;#39;s my story and I&amp;#39;m sticking to it.&lt;/p&gt;
&lt;h2&gt;Why Not Backup Power?&lt;/h2&gt;
&lt;p&gt;My primary concern here is that you have to be extremely careful when adding complexity to a system.  As the saying goes, &amp;quot;For every difficult problem, there&amp;#39;s a simple, obvious, solution that is completely wrong.&amp;quot; Adding UPSs and generators to a system that has insufficient testing, is almost certainly a bad thing.&lt;/p&gt;

&lt;p&gt;At this point it looks like the &lt;a href=&#34;http://tech.slashdot.org/story/13/02/09/2042233/super-bowl-blackout-caused-by-defective-protective-relay&#34;&gt;fault was caused by an incorrectly configured breaker&lt;/a&gt; designed to protect equipment at the stadium.  It sounds likely that the breaker was configured with too low a set-point, which caused it to trip prematurely.&lt;/p&gt;
&lt;h2&gt;My Conclusions&lt;/h2&gt;
&lt;p&gt;The biggest gain here in reliability would be better testing procedures.  That likely would have found the configuration issue with the breaker before it impacted the event.  However, improved testing isn&amp;#39;t &amp;quot;sexy&amp;quot;.  The sound-bite we are hearing is &amp;quot;Amazon engineer says spending $10M (60 seconds of advertising worth) on generators would have prevented blackout&amp;quot;.&lt;/p&gt;

&lt;p&gt;The next priority I would look at is decreasing the lighting startup time.  Any power outage causing 20 minutes of darkness seems like a big red flag.&lt;/p&gt;

&lt;p&gt;One thing the blog doesn&amp;#39;t go into is how you select the results of the brainstorming on possible countermeasures.  That is the more important part of the Service Outage Analysis process: you brainstorm solutions and then you analyze them and pick the appropriate ones, usually in terms of cost/benefit.&lt;/p&gt;
&lt;h2&gt;Our Experience with Power Outages&lt;/h2&gt;
&lt;p&gt;In a Data Center environment, they tend to be pretty rare.  In our facility, we haven&amp;#39;t had a single power outage to any of our cabinets since 2004 when we moved in there.&lt;/p&gt;

&lt;p&gt;Most outages I know of in the data center are human caused, typically smaller scale issues.  For example, cabinets accidentally or intentionally being run too close to the limit.  Or whole-room incidents like the &lt;a href=&#34;http://lj-dev.livejournal.com/670215.html&#34;&gt;livejournal outages years ago&lt;/a&gt; where an EPO (Emergency Power Off) button was pushed by someone working in the room.&lt;br&gt;
Twice over a couple of years.&lt;/p&gt;

&lt;p&gt;I can only imagine that pressing the EPO button generates a RG interrupt.  You know: Resume Generation...&lt;/p&gt;

&lt;p&gt;Many of these issues can be addressed by high availability clusters running with no shared single point of failure.  For example, several years ago we had a transfer switch which, instead of being 30A was two separate 15A sides.  But all monitoring for it was on the 30A side...  The total load was well under rated capacity, but one half was just a bit too high, so that half triggered a circuit breaker.&lt;/p&gt;

&lt;p&gt;In our case, redundant machines are always in other cabinets, so those gracefully took over after a few seconds.&lt;/p&gt;

&lt;p&gt;In that case, it was decided that the appropriate countermeasure was to replace this gear with gear that had monitoring at the individual breaker level.  That&amp;#39;s been the only significant power outage we&amp;#39;ve had at our facility in 7 years.&lt;/p&gt;

&lt;p&gt;And that&amp;#39;s the name of the game: taking appropriate countermeasures.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>A Quick Review of Python Static Site Generators</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/09/a-quick-review-of-python-static-site-generators/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/09/a-quick-review-of-python-static-site-generators/</id>
                <updated>2013-02-09T23:26:00Z</updated>
                
                <summary type="html">We&amp;#39;ve been working to completely revamp the &lt;a href=&#34;http://www.tummy.com/&#34;&gt;tummy.com website&lt;/a&gt; and as part of that have reviewed a number of different options.</summary>
                <content type="html">&lt;p&gt;We&amp;#39;ve been working to completely revamp the &lt;a href=&#34;http://www.tummy.com/&#34;&gt;tummy.com website&lt;/a&gt; and as part of that have reviewed a number of different options.&lt;/p&gt;
&lt;h2&gt;Trying the Big Boys&lt;/h2&gt;
&lt;p&gt;The old site was built using a tool-chain I built a decade ago, and there are much more modern choices that take care of a lot of things I had to build in that system.  So I started looking at fairly off-the-shelf systems including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://wordpress.org/&#34;&gt;Wordpress&lt;/a&gt; is really a best of breed blog system,
I&amp;#39;ve been using it for my personal blog and it&amp;#39;s really fantastic.  But
I spent some time playing with it for a site publisher and it really
felt more oriented towards a blog than a site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mezzanine.jupo.org/&#34;&gt;Mezzanine&lt;/a&gt; is a Python-based content
management system, so it would be something I could dig into the code if
need be.  But I really wanted something I wouldn&amp;#39;t have to dig into.
The reason I kept looking here was that it has a separate front page and
content pages, and they use different markup, and I wanted several pages
the same, like the front page, and didn&amp;#39;t want to have to manage them in
different markup.  Plus, it seemed like a very big, complex system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Static Site Generators&lt;/h2&gt;
&lt;p&gt;After looking at these I started thinking I might be able to get away with something extremely simple.  For some of our dynamic content, we can do Javascript rather than server-side, and everything else is basically static, except for blog feeds and comments.&lt;/p&gt;

&lt;p&gt;Our site has a lot of blog entries (~450) but also has articles (30), software pages (13), presentations (40), and our company information (30 pages).  The company pages are the primary reason for this site, so a solution that put the blogs in #1 spot was not an option.&lt;/p&gt;

&lt;p&gt;So I started looking at static site generators, including some like &lt;a href=&#34;https://github.com/mojombo/jekyll&#34;&gt;Jekyll&lt;/a&gt;, but mostly I looked seriously at these:&lt;/p&gt;
&lt;h2&gt;Nikola&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://nikola.ralsina.com.ar/&#34;&gt;Nikola&lt;/a&gt; generates a wonderful looking blog, but it is really targeted at making a blog first.  The main page always seems to be the blogroll, where I wanted my site top page and many other pages, and a blog as well.  I did install and run some trials with it, and loved the look of the blogs.&lt;/p&gt;

&lt;p&gt;Nikola had a lot of configuration and tools available for it, which was good.  But it really felt targeted towards a blog site or a blog site with some stories.&lt;/p&gt;

&lt;p&gt;It uses the Mako template engine which I&amp;#39;ve used in the past and been happy with.  I&amp;#39;ve always been able to do what I needed to do with Mako where Jinja2 I sometimes run into issues with if I wan to include a template that includes another template, for example.&lt;/p&gt;

&lt;p&gt;In the end, I decided Nikola probably wasn&amp;#39;t for me.  For a straight up blog site, it is probably really good.  I could always fall back to using Nokola, or even Wordpress, for just the blogs component of the site.&lt;/p&gt;
&lt;h2&gt;Pelican&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.getpelican.com/&#34;&gt;Pelican&lt;/a&gt; has quite a lot of activity on github.  More than Nikola by quite a bit.  It also has a lot of features, but again is targeted towards primarily a blog.  While you can supply your own template pages to get installed (and you have to list every such page you want to install), if you install a top-level index.html, it is going to overwrite the main blog page and you lose it.&lt;/p&gt;

&lt;p&gt;Compared to Mynt, which publishes all the files you give it in your documents directory, the listing of the pages (they call them templates) in the config file seemed obtuse.  I had always figured I&amp;#39;d just write a snipped of Python code, since the config file is Python code, that would dynamically generate it.&lt;/p&gt;

&lt;p&gt;I was basically able to get the site working entirely in Pelican, except that the blog pages would get overwritten.&lt;/p&gt;

&lt;p&gt;Another thing I ran into is that in the templates, Pelican exposes fairly little functionality to you.  The templates seem to just be meant for theme creators and the blogs, and it doesn&amp;#39;t expose things like date formatters which Mynt did.&lt;/p&gt;

&lt;p&gt;I probably could have fixed these issues, but in the end I made a decision that of the three Mynt just fit better for publishing a site rather than a blog.&lt;/p&gt;
&lt;h2&gt;Mynt&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://mynt.mirroredwhite.com/&#34;&gt;Mynt&lt;/a&gt; has very little github activity, less than either of the above.  I almost gave up on it right at the beginning because the documentation for getting started is pretty thin.  It shows you how to install, create posts, and build the results.  However, as I started digging deeper there wasn&amp;#39;t much deeper you could go.&lt;/p&gt;

&lt;p&gt;While I can&amp;#39;t find it now, I ran into this part of the documentation that said something to the effect of &amp;quot;You shouldn&amp;#39;t need documentation, if you do I haven&amp;#39;t done my job.&amp;quot;  I almost wrote the whole thing off, but I decided &amp;quot;Ok, let&amp;#39;s put this claim to the test...&amp;quot;  I looked in the directory that was created as part of the quickstart guide, and it all seemed pretty obvoius.&lt;/p&gt;

&lt;p&gt;So I started modifying it and adding pages.  The top level index.html is a Jinja2 template, which accesses a layout defined in the &amp;quot;templates&amp;quot; directory (all &amp;quot;special&amp;quot; directories start with a leading underscore).  Posts are just a data structure handed to the template, for example.&lt;/p&gt;

&lt;p&gt;I will say the layout feels a little more rudimentary than Pelican or Nikola.  The abilities are more limited, for example it doesn&amp;#39;t understand blogs with multiple authors (we are just having the author be a tag for the posts).  It also can&amp;#39;t generate feeds for arbitrary tags &lt;a href=&#34;https://github.com/Anomareh/mynt/pull/35&#34;&gt;without this patch to apply feeds for every tag&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I implemented our customer testimonials using Javascript, and the comments we&amp;#39;ve outsourced to &lt;a href=&#34;http://disqus.com/&#34;&gt;Disqus&lt;/a&gt;, which is what all of the static site generators seem to use.  Though Mynt doesn&amp;#39;t directly support Disqus like the others do, it was trivial to add to the templates.&lt;/p&gt;

&lt;p&gt;Customizing and theming were all done manually, which in some ways is better than Pelican where the theme is not something you can really touch.  For my custom theme, this worked out great.  If you want to have someone else in charge of theming, or use only an existing theme, one of the others might be better.  Though Pelican and Nikola didn&amp;#39;t have that many themes.&lt;/p&gt;

&lt;p&gt;While there are some places where it feels limited, in general if you are building a site, rather than just a blog, I think Mynt is the best choice of the three.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>New tummy.com Website</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/02/09/new-tummycom-website/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/02/09/new-tummycom-website/</id>
                <updated>2013-02-09T23:17:00Z</updated>
                
                <summary type="html">The &lt;a href=&#34;http://www.tummy.com/&#34;&gt;tummy.com&lt;/a&gt; website has been revamped with a more&lt;br&gt;
modern look.  Sorry for the RSS feeds re-delivering the last few entries,&lt;br&gt;
the new system apparently pushed them out with slightly different&lt;br&gt;
information so the RSS readers picked them up as new items.</summary>
                <content type="html">&lt;p&gt;The &lt;a href=&#34;http://www.tummy.com/&#34;&gt;tummy.com&lt;/a&gt; website has been revamped with a more&lt;br&gt;
modern look.  Sorry for the RSS feeds re-delivering the last few entries,&lt;br&gt;
the new system apparently pushed them out with slightly different&lt;br&gt;
information so the RSS readers picked them up as new items.&lt;/p&gt;

&lt;p&gt;The new site was done using the &lt;a href=&#34;http://mynt.mirroredwhite.com/&#34;&gt;Mynt static site&lt;br&gt;
generator&lt;/a&gt;, which worked out really well.&lt;br&gt;
I&amp;#39;ll be writing up more about it and the other alternatives I looked at&lt;br&gt;
shortly.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Interesting read on request versus response rate limiting.</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2013/01/11/interesting-read-on-request-versus-response-rate-limiting/" type="text/html" />
                <id>http://www.tummy.com/blogs/2013/01/11/interesting-read-on-request-versus-response-rate-limiting/</id>
                <updated>2013-01-11T12:28:00Z</updated>
                
                <summary type="html">We&amp;#39;ve recently been the reflection point in a DNS-based reflection+amplification attack. We implemented some rate limiting to prevent it, and as part of my research on this topic I found this discussion to be fascinating. In particular, the trade-offs between request rate limiting and response rate limiting... It&amp;#39;s about half way down in &lt;a href=&#34;http://comments.gmane.org/gmane.network.dns.operations/1403&#34;&gt;this dns-operations thread on &amp;quot;DNS ANY from Amazon&amp;quot;&lt;/a&gt;.</summary>
                <content type="html">&lt;p&gt;We&amp;#39;ve recently been the reflection point in a DNS-based reflection+amplification attack. We implemented some rate limiting to prevent it, and as part of my research on this topic I found this discussion to be fascinating. In particular, the trade-offs between request rate limiting and response rate limiting... It&amp;#39;s about half way down in &lt;a href=&#34;http://comments.gmane.org/gmane.network.dns.operations/1403&#34;&gt;this dns-operations thread on &amp;quot;DNS ANY from Amazon&amp;quot;&lt;/a&gt;.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>SVN directories</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2012/12/21/svn-directories/" type="text/html" />
                <id>http://www.tummy.com/blogs/2012/12/21/svn-directories/</id>
                <updated>2012-12-21T14:22:00Z</updated>
                
                <summary type="html">Just a note on something I&amp;#39;ve noticed in Ubuntu Quantal... It includes Subversion version 1.7.5, which has this compelling feature: The .svn directories have been merged into a single directory at the top level of your checkout. So no longer are the subdirectories littered with .svn directories. Makes script and find commands of sub-sections of the repository easier.</summary>
                <content type="html">&lt;p&gt;Just a note on something I&amp;#39;ve noticed in Ubuntu Quantal... It includes Subversion version 1.7.5, which has this compelling feature: The .svn directories have been merged into a single directory at the top level of your checkout. So no longer are the subdirectories littered with .svn directories. Makes script and find commands of sub-sections of the repository easier.&lt;/p&gt;
</content>
            </entry>
        
            <entry>
                <title>Skeleton for testing Python code.</title>
                <link rel="alternate" href="http://www.tummy.com/blogs/2012/12/14/skeleton-for-testing-python-code/" type="text/html" />
                <id>http://www.tummy.com/blogs/2012/12/14/skeleton-for-testing-python-code/</id>
                <updated>2012-12-14T23:18:00Z</updated>
                
                <summary type="html">Thanks to Bill Tucker and 2011&amp;#39;s &lt;a href=&#34;http://coderetreat.org/&#34;&gt;Code Retreat&lt;/a&gt; that he put on, I&amp;#39;ve become quite the convert to testing. I knew I should be doing it, but I never found the time to become really comfortable with them until Code Retreat. </summary>
                <content type="html">&lt;p&gt;Thanks to Bill Tucker and 2011&amp;#39;s &lt;a href=&#34;http://coderetreat.org/&#34;&gt;Code Retreat&lt;/a&gt; that he put on, I&amp;#39;ve become quite the convert to testing. I knew I should be doing it, but I never found the time to become really comfortable with them until Code Retreat. &lt;/p&gt;

&lt;p&gt;However, especially when I was starting, I found I really needed some examples and wanted some boilerplate I could just drop in place. At the Code Retreat I had just recently come back across an entry I made on my personal Wiki that had some examples. Since then I&amp;#39;ve expanded on them and today I included some examples of testing Bottle web applications (I still totally love Bottle by the way). &lt;/p&gt;

&lt;p&gt;I&amp;#39;ve create a github account that has these examples and related code such as a &amp;quot;Makefile&amp;quot; which automatically runs the test. You can find it at &lt;a href=&#34;https://github.com/linsomniac/python-unittest-skeleton&#34;&gt;https://github.com/linsomniac/python-unittest-skeleton&lt;/a&gt;. I hope you find it as useful as I have.&lt;/p&gt;
</content>
            </entry>
        
    </feed>
