<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>christian hofstaedtler</title>
 <link href="http://zeha.at/atom.xml" rel="self"/>
 <link href="http://zeha.at/"/>
 <updated>2012-02-16T20:29:19+01:00</updated>
 <id>http://zeha.at/</id>
 <author>
   <name>christian hofstaedtler</name>
 </author>

 
 <entry>
   <title>conhost crashes AKA cmd windows disappear</title>
   <link href="http://zeha.at/blog/2012/02/conhost.html"/>
   <updated>2012-02-16T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2012/02/conhost</id>
   <content type="html">&lt;p&gt;If your cmd windows keep disappearing when using a Win32 version of git, or some configure scripts, this MS KB article is for you:
&lt;a href=&quot;http://support.microsoft.com/kb/2458000&quot;&gt;The conhost.exe process crashes when an application exits on Windows 7 or Windows Server 2008 R2&lt;/a&gt; (KB2458000).&lt;/p&gt;

&lt;p&gt;BTW, requesting hotfixes by email works fully automated, so you'll have the download link a few minutes later.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GPG Key Update</title>
   <link href="http://zeha.at/blog/2012/01/gpg.html"/>
   <updated>2012-01-13T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2012/01/gpg</id>
   <content type="html">&lt;p&gt;Reminder: the only valid GPG Key you should use for sending me encrypted messages, is &lt;a href=&quot;/pgp/pubkey.asc&quot;&gt;93052E03&lt;/a&gt;.
This is also the only valid GPG Key I'm using to sign messages.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Introducing pbundler</title>
   <link href="http://zeha.at/blog/2012/01/pbundler.html"/>
   <updated>2012-01-11T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2012/01/pbundler</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://github.com/zeha/pbundler/&quot;&gt;pbundler&lt;/a&gt; is the &quot;Python Bundler&quot;.&lt;/p&gt;

&lt;p&gt;pbundler is inspired by the great &lt;a href=&quot;http://gembundler.com/&quot;&gt;bundler for Ruby&lt;/a&gt;, which serves the mission of making development in Ruby easier.&lt;/p&gt;

&lt;p&gt;pbundler aims to do the same for Python.&lt;/p&gt;

&lt;p&gt;In version 0.0.1, just released to PyPI, pbundler is just a thin wrapper over virtualenv and pip. Both are tools you probably already use for your Python development, and rightfully so.
If you've been following recent best practices, your projects will already have a &quot;requirements.txt&quot; as well.&lt;/p&gt;

&lt;p&gt;With all of this in place, you, your development peers and your interested users can just run &quot;pbundle&quot; after cloning your project's source code, and are ready to run.&lt;/p&gt;

&lt;p&gt;Let's make Python development a bit more awesome. &lt;a href=&quot;http://github.com/zeha/pbundler/&quot;&gt;Fork freely.&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grml: "Pissed off"</title>
   <link href="http://zeha.at/blog/2011/12/grml-pissed-off.html"/>
   <updated>2011-12-27T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/12/grml-pissed-off</id>
   <content type="html">&lt;p&gt;You probably saw it already, there's a new &lt;a href=&quot;http://grml.org/changelogs/README-grml-2011.12/&quot;&gt;Grml release: 2011.12&lt;/a&gt;.
We made it to
&lt;a href=&quot;http://www.heise.de/open/meldung/Rettungs-Linux-Grml-2011-12-Knecht-Rootrecht-freigegeben-1401261.html&quot;&gt;Heise on December 24th&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've spent countless nights, weekends, free hours during the last months to actually make it happen.
I met with mika for several days twice.
This all is time where I could've slept, could've been with my girlfriend, could've worked on commercial projects, could've sold time, and so on.&lt;/p&gt;

&lt;p&gt;During this time I worked on almost everything: lobbying for a smaller software selection,
&lt;a href=&quot;https://github.com/grml/grml-live&quot;&gt;grml-live&lt;/a&gt; improvements,
cleaning up various parts of the website,
fixing BitTorrent downloads,
automating most of the release process.
I touched all our packages,
overhauled &lt;a href=&quot;http://packages.grml.org/&quot;&gt;packages.grml.org&lt;/a&gt; so it's a tool we can use for the release process.&lt;/p&gt;

&lt;p&gt;For sure, I haven't worked alone on this - the work I've done is only part of what was needed to release,
but without it, there almost certainly would be no release.&lt;/p&gt;

&lt;p&gt;Obviously, not everything is great: where work is done, bugs are introduced, things are overlooked,
in a rush not everything is communicated the best way it could have been.
And in a rush we were.&lt;/p&gt;

&lt;h2&gt;Turn back the time, to mid-2011:&lt;/h2&gt;

&lt;p&gt;Oh right, the 2011.05 release just happened!
RC1 happened while the real release manager was getting married.
It was a tough call to get people moving, so RC1 could happen, and then the same for the release again.&lt;/p&gt;

&lt;p&gt;In the end, we had a frustrated release manager (who was already burned out to start with),
and a new, now-frustrated stealth release manager.
After the release, development on Grml almost came to a full stop.&lt;/p&gt;

&lt;p&gt;Some time later, when it became clear that the promised next release date (December) would be &quot;soon&quot;,
it still looked grim: almost no work had been done on Grml itself.&lt;/p&gt;

&lt;p&gt;In the meantime, the Grml System Administrators did a great job moving the server off from private
infrastructure to a sponsored machine (thank you, Hostway!), and I certainly want to thank them for that.&lt;/p&gt;

&lt;p&gt;Nevertheless, we looked into a void. I drew my own conclusions, and offered to step up as a second release manager,
with one condition (actually, goal): work for a release must go down.&lt;/p&gt;

&lt;p&gt;For this to become true, a few tasks were identified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;set a clear focus on what Grml should be,&lt;/li&gt;
&lt;li&gt;cut out all things not belonging to the new focus,&lt;/li&gt;
&lt;li&gt;automate the release process as far as possible.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Sure, it's hard to swallow and most people can just ignore the alternative: no release at all.&lt;/p&gt;

&lt;h2&gt;&quot;How did it turn out in reality?&quot;, you ask?&lt;/h2&gt;

&lt;p&gt;Certainly a few packages too much were being cut.&lt;/p&gt;

&lt;p&gt;Certainly some use cases got broken by this (especially the desktop usecase).&lt;/p&gt;

&lt;p&gt;Certainly some users are now pissed off that their favorite distribution is no longer a swiss army knife that can do everything, but
nothing really well.&lt;/p&gt;

&lt;h2&gt;But, like, really?&lt;/h2&gt;

&lt;p&gt;While a few people think it's a good idea to piss into the wind or in my face instead of contributing,
overall 2011.12 is a very great release, even if it's got a few more bugs than usual.&lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The project got a lot of feedback from users. Compare this to the previous release, where everybody was saying: &quot;Oh, a new release &lt;em&gt;yawn&lt;/em&gt;&quot;. (No, not overwhelmingly negative feedback.)&lt;/li&gt;
&lt;li&gt;Our disabled userbase woke up when we almost cut brltty and friends. This time, we actually had somebody &lt;strong&gt;test&lt;/strong&gt; (Hi, John!) that stuff works (and discovered that it was broken in 2011.05.)&lt;/li&gt;
&lt;li&gt;The development/release process is way more open and visible.&lt;/li&gt;
&lt;li&gt;At least one of the old developers has (more or less) found motivation to work on Grml.&lt;/li&gt;
&lt;li&gt;We got new people interested in Grml, possibly developing stuff in Grml.&lt;/li&gt;
&lt;li&gt;A few tons of old cruft have been cleaned up.&lt;/li&gt;
&lt;li&gt;The release process is &lt;em&gt;less&lt;/em&gt; work now.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;em&gt;There are even fantasies of releasing more often in the future.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For me it's a great release. I think this also holds true for the project.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr: 2011.12 is a great release, even if some people think otherwise&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Austrian iPhone 4S plan index</title>
   <link href="http://zeha.at/blog/2011/10/iphone-prices-at.html"/>
   <updated>2011-10-21T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2011/10/iphone-prices-at</id>
   <content type="html">&lt;p&gt;Some of the austrian carriers have announced prices for the 4S. The plan index has been updated to reflect that.
&lt;a href=&quot;http://zeha.at/~ch/iphone-tarife/&quot;&gt;PDF &amp;amp; Numbers file&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expect updates when new info becomes available, but I won't announce these here.&lt;/p&gt;

&lt;p&gt;What can be said nevertheless: carrier prices still won't be cheaper than buying the phone unlocked plus a cheap plan.&lt;/p&gt;

&lt;p&gt;Also, smartbob ends 31/10. If you want to go this route you should hurry.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iPhone plan index - Oct. 2011 Update</title>
   <link href="http://zeha.at/blog/2011/10/iphone-prices-at.html"/>
   <updated>2011-10-10T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2011/10/iphone-prices-at</id>
   <content type="html">&lt;p&gt;I've updated my iPhone plan index for Austria for October 2011. &lt;a href=&quot;http://zeha.at/~ch/iphone-tarife/&quot;&gt;PDF &amp;amp; Numbers file&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grml packages in Debian</title>
   <link href="http://zeha.at/blog/2011/10/grml-in-debian.html"/>
   <updated>2011-10-10T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2011/10/grml-in-debian</id>
   <content type="html">&lt;p&gt;The first fruits of our push packages to Debian effort are now available in
Debian. Three often used packages from the Grml Team have arrived in unstable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://packages.debian.org/grml2usb&quot;&gt;grml2usb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://packages.debian.org/grml-debootstrap&quot;&gt;grml-debootstrap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://packages.debian.org/grml-rescueboot&quot;&gt;grml-rescueboot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://qa.debian.org/developer.php?login=team%40grml.org&quot;&gt;Packages overview for Grml Team&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that these packages are no longer part of the grml-testing distribution.&lt;/p&gt;

&lt;p&gt;To get the current version of any of these packages you &lt;em&gt;must&lt;/em&gt; get them from
Debian unstable instead. If this is a problem for you, please come to the
&lt;a href=&quot;http://grml.org/mailinglist/&quot;&gt;grml mailing list&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Short how-to: use schroot with aufs</title>
   <link href="http://zeha.at/blog/2011/05/schroot-and-aufs.html"/>
   <updated>2011-05-15T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2011/05/schroot-and-aufs</id>
   <content type="html">&lt;p&gt;If you need to use schroot instead of cowbuilder, you're probably using it with LVM snapshots. This gives you the advantage that changes to the chroot are thrown away when your session ends.&lt;/p&gt;

&lt;p&gt;In my setup, schroot is used to auto-build Debian packages, with a special wrapper, etc. And boy, the setup was dog slow.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.nikhef.nl/~dennisvd/lvmcrap.html&quot;&gt;&quot;LVM2 snapshot performance problems&quot;&lt;/a&gt; from 2009 explains the slowness.&lt;/p&gt;

&lt;p&gt;Switching to aufs made my builds complete in 25% of their normal time.&lt;/p&gt;

&lt;h2&gt;Here's what you need to do:&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run Debian squeeze stock kernels. They come with a working aufs module. Maybe do a modprobe aufs.&lt;/li&gt;
&lt;li&gt;Migrate back to a type=directory chroot. It's the only base type schroot supports with aufs. (This might be as simple as a mount and changing schroot.conf.)&lt;/li&gt;
&lt;li&gt;Set union-type=aufs in schroot.conf.&lt;/li&gt;
&lt;li&gt;Enjoy the speed!&lt;/li&gt;
&lt;/ol&gt;

</content>
 </entry>
 
 <entry>
   <title>Grml Talk at Grazer Linuxtage 2011</title>
   <link href="http://zeha.at/blog/2011/04/talk-glt11.html"/>
   <updated>2011-04-09T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2011/04/talk-glt11</id>
   <content type="html">&lt;p&gt;I gave an introduction to bare metal deployments and remastering &lt;a href=&quot;http://grml.org/&quot;&gt;Grml&lt;/a&gt;, at the &lt;a href=&quot;http://glt11.linuxtage.at/&quot;&gt;Grazer Linuxtage 2011&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/talks/2011/glt11-deployment-grml-live.pdf&quot;&gt;Slides.&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Running MPLAB X on Windows x64</title>
   <link href="http://zeha.at/blog/2011/03/mplab-x-on-winx64.html"/>
   <updated>2011-03-01T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/03/mplab-x-on-winx64</id>
   <content type="html">&lt;p&gt;If you have Windows (7) x64 installed, it's likely that you have a 32-bit and a 64-bit JVM installed. By default MPLAB X (or rather, the Netbeans Launcher) will pick up the 64-bit JVM. Unfortunately the Microchip Netbeans plugins can't find hardware connected to the USB bus if they run on the 64-bit JVM.&lt;/p&gt;

&lt;p&gt;To remedy this, switch to the 32-bit JVM. To do so, update your MPLAB X shortcut file.&lt;/p&gt;

&lt;p&gt;The original command line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;C:\Program Files (x86)\Microchip\MPLAB X IDE\mplab_ide\bin\LaunchMPLAB_IDE.exe&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The new command line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;C:\Program Files (x86)\Microchip\MPLAB X IDE\mplab_ide\bin\LaunchMPLAB_IDE.exe&quot; --jdkhome &quot;&quot;&quot;C:\Program Files (x86)\Java\jre6&quot;&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Due to brain damage in LaunchMPLAB_IDE.exe you have to use triple quotes around the Java home path.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Configuring ejabberd for IPv4 + IPv6 on Debian squeeze</title>
   <link href="http://zeha.at/blog/2011/03/jabber-ipv6.html"/>
   <updated>2011-03-01T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/03/jabber-ipv6</id>
   <content type="html">&lt;p&gt;Debian squeeze ships with ejabberd 2.1.5.&lt;/p&gt;

&lt;p&gt;The correct way to run this version of ejabberd in dual stack mode is to set up a listener for each of the protocols.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;erlang&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;% Ordinary client-2-server service&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5222&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;::&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;ejabberd_c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65536&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                       &lt;span class=&quot;n&quot;&gt;starttls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;certfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/etc/ejabberd/ejabberd.pem&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5222&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ejabberd_c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65536&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                       &lt;span class=&quot;n&quot;&gt;starttls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;certfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/etc/ejabberd/ejabberd.pem&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;% SSL-enabled client-2-server service&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5223&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;::&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;ejabberd_c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65536&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                       &lt;span class=&quot;n&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;certfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/etc/ejabberd/ejabberd.pem&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5223&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ejabberd_c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;65536&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                       &lt;span class=&quot;n&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;certfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/etc/ejabberd/ejabberd.pem&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;% Server-2-server service&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5269&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;::&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;ejabberd_s2s_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;131072&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5269&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ejabberd_s2s_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s2s_shaper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_stanza_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;131072&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;% ... &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;



</content>
 </entry>
 
 <entry>
   <title>The last 6 months</title>
   <link href="http://zeha.at/blog/2011/01/the-last-6-months.html"/>
   <updated>2011-01-18T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/01/the-last-6-months</id>
   <content type="html">&lt;p&gt;In case you were wondering what I was doing the last 6 months, go look here (be warned, it's in German): &lt;a href=&quot;http://magnolia.zeha.at/&quot;&gt;Magnolia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In other words, I now know a lot about embedding Python on Windows, and Unicode in Windows Consoles. It's ugly.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Namespace.at Jabber redundant</title>
   <link href="http://zeha.at/blog/2011/01/jabber-redundancy.html"/>
   <updated>2011-01-16T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/01/jabber-redundancy</id>
   <content type="html">&lt;p&gt;The namespace.at Jabber service is now running on two nodes, one hosted in Austria and the second one in the Netherlands. Theoretically this should ensure that the Jabber service is more resilient against network failures or other downtimes of the primary namespace.at server in Austria.&lt;/p&gt;

&lt;p&gt;We will see.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grml Deployment talk at Metalab DevOps Meeting</title>
   <link href="http://zeha.at/blog/2011/01/talk-grml-deployment.html"/>
   <updated>2011-01-11T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2011/01/talk-grml-deployment</id>
   <content type="html">&lt;p&gt;I gave an introduction to bare metal deployments using &lt;a href=&quot;http://grml.org/&quot;&gt;Grml&lt;/a&gt;, at the &lt;a href=&quot;http://metalab.at/wiki/Devops_Meetup&quot;&gt;DevOps meetup&lt;/a&gt; at Metalab.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/talks/2011/grml-deployment-free.pdf&quot;&gt;Slides.&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PGP key transition</title>
   <link href="http://zeha.at/blog/2010/11/pgp-key-transition.html"/>
   <updated>2010-11-03T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2010/11/pgp-key-transition</id>
   <content type="html">&lt;a href=&quot;/pgp/message.asc&quot;&gt;Signed message&lt;/a&gt; &lt;a href=&quot;/pgp/pubkey.asc&quot;&gt;New pubkey&lt;/a&gt;&lt;br/&gt;
&lt;pre&gt;
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

- -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

This is a key material upgrade, from 1024 DSA to 4096 RSA.

If you have previously signed the key 48F44F92, I'd like to ask you to
also sign my new key 93052E03.

This notice is signed with both keys, please verify this before taking
any action.

- -----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAkzROUoACgkQ4jeDIEj0T5JMqwCdH+HfdwNuYlenZkvJ2Xy4ZfK1
5owAoIuUY0ne+ICwlCIL5bWxpQVgzKSk
=gDgu
- -----END PGP SIGNATURE-----
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iQIcBAEBCAAGBQJM0TmBAAoJEFwT1tuTBS4D5FsP/AuePUJA+XaEvDNc+fFSeAJ2
WVt/BCd7Ik47MUvWcv1ljuGIHAU03SeeO/zn17eQraghhVME/TJ/CmmFYYs/Crax
auWSfY5OEcQwutm7tf2RI0z/mQDbPTcvj8LwX4wkcDNdxjpxSMziGHCZMahj7exA
6Sc9BFmhBmqhyaR/rPi8cE3hv/u3JA5OvtnRXKymDDYv8+/l9LNhwXVbmHKFJYNM
TgD6Toyh/of2hjnYKki+5NCEqESY316E1UYTz+qiZKaBHFjgnqnBXD1AFe13emMC
AFprAqul26GYSTFDfyHZFx8yhRWrz8PF39mSpaIBfoWJwI6K5RD0SwuvAzCMoWI+
QwcQXKDhaBCYrIbgaNSZXs+x084CVXQ6Pp/D5/BhtenGkYNv8n/jRlEVGgtDsFd5
ONFgTSnWoxeucWMAKsoSy5P5zO+aluz+c/3MtQBU8vURsH4W6t0qtxS5RDqXdvXC
JNOzwBETBHabcm596VG77TM6IueeQ/qYkQfxItc3M2Jb+2am1grOHxqEEIRWrHIc
0nj37gc3WvzkZAPe2K+B6aLhBC9eIozBSXREa4jY1SiepXK249EnvWBG8qOjOpRI
lLlUT2w0eTo5jQgnBsdD2fhMXcgijWc8KuPPND7kuidA6CRNlTKWnowgzzCGDGr6
kc7mazqLj6Dk0xiHcnMd
=R83A
-----END PGP SIGNATURE-----
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>On the non-security of system logs</title>
   <link href="http://zeha.at/blog/2010/10/on-the-non-security-of-system-logs.html"/>
   <updated>2010-10-12T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/10/on-the-non-security-of-system-logs</id>
   <content type="html">&lt;p&gt;Let me make a claim:
  Current system level logging systems are insecure.&lt;/p&gt;

&lt;p&gt;On what level you ask? Authentication of log entries.&lt;/p&gt;

&lt;p&gt;Most system logging services have some way of restricting who can view log entries. But practically none have a way of restricting who can &lt;em&gt;write&lt;/em&gt; log entries, and therefore they also do not have any authentication that a log entry written by program X is really from program X - not from someone just claiming to be program X.&lt;/p&gt;

&lt;p&gt;This is especially true if the logging service can forward log entries to another machine (rather: if it can receive log entries from another machine).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means for the system administrator:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can not trust your syslogs for that something in there really happened. They are generally a good indication of what's going on, but it's trivial for anyone to fake log entries.
This holds true for classic Un*x syslog as well as the Windows NT Event Log, and especially for the Audit logs in those systems.&lt;/p&gt;

&lt;p&gt;If all of this is obvious for you, ask yourself: when was the last time you questioned if a particular syslog entry was real or fake?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Grml developer</title>
   <link href="http://zeha.at/blog/2010/10/new-grml-developer.html"/>
   <updated>2010-10-12T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/10/new-grml-developer</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://lists.mur.at/pipermail/grml/2010-October/004920.html&quot;&gt;Michael Prokop announces a new developer joining the grml team.&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>fail2ban is insecure by design</title>
   <link href="http://zeha.at/blog/2010/10/fail2ban-is-insecure-by-design.html"/>
   <updated>2010-10-12T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/10/fail2ban-is-insecure-by-design</id>
   <content type="html">&lt;p&gt;To quote the &lt;a href=&quot;http://www.fail2ban.org&quot;&gt;fail2ban&lt;/a&gt; web site:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Fail2ban scans log files like /var/log/pwdfail or /var/log/apache/error_log and bans IP that makes too many password failures. It updates firewall rules to reject the IP address.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Well, it also scans /var/log/auth.log which is a file written by syslog. Combined with &lt;a href=&quot;http://zeha.at/blog/2010/10/on-the-non-security-of-system-logs.html&quot;&gt;my previous blog entry&lt;/a&gt;, you can already see where this is going.&lt;/p&gt;

&lt;p&gt;fail2ban uses a simple regex based scheme for parsing the login failure logs, for example for the sshd service (one of many):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;^%(__prefix_line)sFailed (?:password|publickey) for .* from &amp;lt;HOST&amp;gt;(?: port \d*)?(?: ssh\d*)?$
&lt;/code&gt;&lt;/pre&gt;

&lt;br/&gt;


&lt;p&gt;You can easily turn around fail2ban to work for you, an unprivileged user (do this 5 times or so):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;logger -p auth.info -i -t sshd &quot;Failed password for root from 10.3.3.3 port 3333 ssh2&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If fail2ban runs in it's default configuration you have now inhibited all traffic from 10.3.3.3.&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>For Reference: abcde.conf</title>
   <link href="http://zeha.at/blog/2010/06/for-reference-abcde-conf.html"/>
   <updated>2010-06-01T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/06/for-reference-abcde-conf</id>
   <content type="html">&lt;p&gt;For reference (and only if for my very own reference), an abcde.conf for flac + space-based filenames:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PADTRACKS=y
ACTIONS=default,replaygain
OUTPUTTYPE=flac
OUTPUTFORMAT='${ARTISTFILE}/${ALBUMFILE}/${TRACKNUM} - ${ARTISTFILE} - ${TRACKFILE}'
VAOUTPUTFORMAT='VA/${ALBUMFILE}/${TRACKNUM} - ${ARTISTFILE} - ${TRACKFILE}'
ONETRACKOUTPUTFORMAT=$OUTPUTFORMAT
VAONETRACKOUTPUTFORMAT=$VAOUTPUTFORMAT
MAXPROCS=8
mungefilename ()
{
    echo &quot;$@&quot; | sed s,:,\ -,g | tr /\* _+ | tr -d \'\&quot;\?\[:cntrl:\]
}
pre_read ()
{
  eject -t
}
EJECTCD=y
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This post is motivated by a once again lost abcde.conf file.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lessons learned with Supermicro's remote management/IPMI view</title>
   <link href="http://zeha.at/blog/2010/05/lessons-learned-with-supermicros-remote-managementipmi-view.html"/>
   <updated>2010-05-29T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/05/lessons-learned-with-supermicros-remote-managementipmi-view</id>
   <content type="html">&lt;p&gt;Supermicro's recent IPMI/KVM (&quot;remote server management with graphical console&quot;) violates all good design principles and what you would expect from such a solution.&lt;/p&gt;

&lt;p&gt;Basically, it works like this: there is some management controller on the mainboard, with it's own dedicated network port. It's got an HTTP interface for use &amp;amp; configuration. For use it offers basic power control (off, on, reset), a serial-over-lan transport, and a graphical console which can also provide disk services to the host (CD/ISO, USB Key, floppy).&lt;/p&gt;

&lt;p&gt;For the basic feature set, this sounds like what you want to use.&lt;/p&gt;

&lt;p&gt;Unfortunately Supermicro's implementation adds a great deal of obstacles which make using it nearly impossible. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The HTML UI makes extensive use of JavaScript and AJAX, and fails to provide progress and error messages when something goes wrong.&lt;/li&gt;
&lt;li&gt;The client part of the graphical console appears to be implemented in Java &lt;em&gt;and&lt;/em&gt; native code. The native code parts are only available for the platforms Supermicro has chosen to support (i386/amd64 of Windows and &quot;Linux&quot;).&lt;/li&gt;
&lt;li&gt;Different servers appear to require different management controller firmware versions. While the interface looks quite the same, it seems to do completely different things under the hood. (&quot;This one works on a Mac, the other's dont?&quot;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;None of this does any good.&lt;/p&gt;

&lt;p&gt;Details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The graphical console requires you to use Sun Java 6u17. Using a newer Java version plainly doesn't work, and you get either no window and no error message or &quot;Authentication failed&quot;.&lt;/li&gt;
&lt;li&gt;The underlying protocol seems to be VNC, but with a different authentication scheme, making standard VNC clients useless. (Also it appears to be an OEM version of ATENs KVM/VNC stuff.)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A friend pointed me to the so called &quot;IPMIView&quot; tool, which basically is a standalone version of the graphical console and some other bonus features. Compared to the Java applet stuff, it feels rather stable, but has the same platform limitations (i.e. Windows + &quot;Linux&quot; only). It appears to be available only from SM's FTP server:
   &lt;a href=&quot;ftp://ftp.supermicro.com/utility/IPMIView/&quot;&gt;ftp://ftp.supermicro.com/utility/IPMIView/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, to compare this situation with HP: HP's &quot;ILO 2&quot; is &lt;em&gt;very&lt;/em&gt; slow, went through a few firmware versions to fix rather odd bugs, but: the basic features (== what you depend on during emergencies) work and worked all the time. Their graphical console also is Java, but with no native code, and therefore works fine on a Mac and IIRC it also worked fine on ppc Linux.&lt;/p&gt;

&lt;p&gt;Sidebar:&lt;/p&gt;

&lt;p&gt;This has cost a client about 12 man hours. They're using Macs in the office, and those are now basically useless during emergency times.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Dyson has arrived</title>
   <link href="http://zeha.at/blog/2010/05/a-dyson-has-arrived.html"/>
   <updated>2010-05-17T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/05/a-dyson-has-arrived</id>
   <content type="html">&lt;p&gt;After &gt;5 years with some old-style Siemens vacuum cleaner, I've now replaced it with a Dyson DC32.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The normal strainer is very effective, especially on carpets&lt;/li&gt;
&lt;li&gt;Bar/staff is rather flexible -&gt; more freedom for cleaning under the bed&lt;/li&gt;
&lt;li&gt;Very long cable -&gt; more freedom&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very loud&lt;/li&gt;
&lt;li&gt;Getting the bin clean afterwards is a bit challenging. Might not be a problem compared to normal vacuum cleaners though (which also tend to be full of dust after replacing the dustbag)&lt;/li&gt;
&lt;li&gt;Needs more stowing space&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Have a MySQL (Replication) Setup?</title>
   <link href="http://zeha.at/blog/2010/05/have-a-mysql-replication-setup.html"/>
   <updated>2010-05-10T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/05/have-a-mysql-replication-setup</id>
   <content type="html">&lt;p&gt;If so, you should invest some time in research of tools already available.&lt;/p&gt;

&lt;p&gt;At least, you should consider using &lt;a href=&quot;http://www.maatkit.org&quot;&gt;MaatKit&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Most of Maatkit's functionality is designed for MySQL.  It makes MySQL easier and safer to manage. It provides simple, predictable ways to do things you cannot otherwise do. That's why Maatkit is now shipping by default with many GNU/Linux distributions such as Debian and CentOS.  You can use Maatkit to prove replication is working correctly, fix corrupted data, automate repetitive tasks, speed up your servers, and much more.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I found it especially useful in MySQL Replication Setups. mk-table-checksum and mk-table-sync will save you headaches in this scenarios.&lt;/p&gt;

&lt;p&gt;(This entry was prompted by an conversation.)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Setting up GemPlus USB reader on Linux</title>
   <link href="http://zeha.at/blog/2010/04/setting-up-gemplus-usb-reader-on-linux.html"/>
   <updated>2010-04-22T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2010/04/setting-up-gemplus-usb-reader-on-linux</id>
   <content type="html">&lt;p&gt;For reference.&lt;/p&gt;

&lt;p&gt;SmartCard reader is a gemalto PC USB-SL Reader, P/N HWP108841C.&lt;/p&gt;

&lt;p&gt;Install these packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sys-apps/pcsc-lite (+usb +hal)&lt;/li&gt;
&lt;li&gt;app-crypt/ccid&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It might be benefical to install sys-apps/pcsc-tools too.&lt;/p&gt;

&lt;p&gt;After this, start pcscd. You don't need to put anything into /etc/reader.conf, pcscd should pick up the USB reader, and load the ccid driver.&lt;/p&gt;

&lt;p&gt;If you happen to use MOCCA, the Austrian &quot;Buergerkarte&quot; software, it should now find the card reader. Might need to restart it though.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>"Domain Renewal Group"/"Domain Registry of America" = scam</title>
   <link href="http://zeha.at/blog/2010/03/domain-renewal-groupdomain-registry-of-america-scam.html"/>
   <updated>2010-03-08T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2010/03/domain-renewal-groupdomain-registry-of-america-scam</id>
   <content type="html">&lt;p&gt;The beloved &lt;a href=&quot;http://en.wikipedia.org/wiki/Domain_Registry_of_America&quot;&gt;DROA&lt;/a&gt; is again sending &quot;renewal notices&quot;. Also, they will transfer your domain name to them and charge you lots of money.&lt;/p&gt;

&lt;p&gt;So - if you receive letters from them, discard them.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux on the Intel DP55KG board</title>
   <link href="http://zeha.at/blog/2010/01/linux-on-the-intel-dp55kg-board.html"/>
   <updated>2010-01-03T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2010/01/linux-on-the-intel-dp55kg-board</id>
   <content type="html">&lt;p&gt;Now owning an Intel DP55KG board (&lt;a href=&quot;http://www.intel.com/products/desktop/motherboards/DP55KG/DP55KG-overview.htm&quot;&gt;http://www.intel.com/products/desktop/motherboards/DP55KG/DP55KG-overview.htm&lt;/a&gt;), I naturally tried running Linux on it. Unfortunately this was not one of those &quot;works out of the box&quot; experiences.&lt;/p&gt;

&lt;p&gt;The current issues are (all tested with 2.6.31.4):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux does not reboot properly (Windows does). You need to say &lt;tt&gt;reboot=a&lt;/tt&gt; on the kernel cmdline.&lt;/li&gt;
&lt;li&gt;Ethernet link speed gets set to 10MBit/s. &lt;a href=&quot;http://e1000.sf.net/&quot;&gt;http://e1000.sf.net/&lt;/a&gt; has e1000e-1.2.2 drivers which resolve this.&lt;/li&gt;
&lt;li&gt;There will be a HPET WARNing in dmesg. It should be harmless (&lt;a href=&quot;http://thread.gmane.org/gmane.linux.kernel/913374/focus=915233&quot;&gt;http://thread.gmane.org/gmane.linux.kernel/913374/focus=915233&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Other stuff to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The extra Marvell controller exposes an AHCI interface, so just use the AHCI SATA driver for it. Hot-plugging eSATA drives works fine.&lt;/li&gt;
&lt;li&gt;There are apparently issues with Noctua fans, but I haven't verified that yet.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>root-on-LVM2 with Gentoo</title>
   <link href="http://zeha.at/blog/2009/12/root-on-lvm2-with-gentoo.html"/>
   <updated>2009-12-31T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/12/root-on-lvm2-with-gentoo</id>
   <content type="html">&lt;p&gt;For various reasons I had to reinstall my home desktop, this time using Gentoo Linux.&lt;/p&gt;

&lt;p&gt;My desktop systems usually have their root-fs on an LVM2 volume. Alas, such a setup is not covered in the Gentoo Installation Guide. Here are the details:&lt;/p&gt;

&lt;h1&gt;Setting up root-on-LVM2 with Gentoo&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Fact:&lt;/em&gt; root-on-LVM2 needs an initramfs to work.&lt;/p&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;emerge lvm2&lt;/tt&gt; in your chroot before doing any kernel work.&lt;/li&gt;
&lt;li&gt;Setup LVM2 as usual (create type &lt;tt&gt;8e&lt;/tt&gt; PV partitions, &lt;tt&gt;pvcreate&lt;/tt&gt; them, &lt;tt&gt;vgcreate&lt;/tt&gt;, &lt;tt&gt;lvcreate&lt;/tt&gt;, &lt;tt&gt;mkfs&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;Use &lt;tt&gt;genkernel --lvm&lt;/tt&gt; to build your kernel.&lt;/li&gt;
&lt;li&gt;Specify &lt;tt&gt;root=/dev/mapper/VGNAME-LVNAME&lt;/tt&gt; and &lt;tt&gt;dolvm&lt;/tt&gt; on the kernel command line.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You &lt;em&gt;may&lt;/em&gt; need to set these things in your kernel config, too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disable asynchronous SCSI device scanning&lt;/li&gt;
&lt;li&gt;Build SCSI/SATA device drivers into your kernel&lt;/li&gt;
&lt;li&gt;Build device mapper as a module&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;(These last things are what I did, without testing other options.)&lt;/p&gt;

&lt;p&gt;If the initramfs complains about not finding your root-LV, check that there is an &lt;tt&gt;/etc/lvm/lvm.conf&lt;/tt&gt; inside the initramfs. Else, &lt;tt&gt;pvscan/vgscan will&lt;/tt&gt; scan no devices for PVs/VGs.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Configuring Hudson for grml autobuilds on EC2</title>
   <link href="http://zeha.at/blog/2009/11/configuring-hudson-for-grml-autobuilds-on-ec2.html"/>
   <updated>2009-11-08T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/11/configuring-hudson-for-grml-autobuilds-on-ec2</id>
   <content type="html">Suppose you want to do automated builds of grml using the excellent grml-live framework, and host this in a nice autobuilder, like, &lt;a href=&quot;http://hudson-ci.org&quot;&gt;Hudson&lt;/a&gt;. Also you don't have the necessary disk space, RAM, etc. locally so you want to use &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;Amazon EC2&lt;/a&gt; to host the worker machine.

&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;big&gt;&lt;b&gt;Install Hudson&lt;/b&gt;&lt;/big&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hudson-ci.org/&quot;&gt;Download Hudson.&lt;/a&gt; (Actually grab hudson.war.)
&lt;li&gt;&lt;code&gt;apt-get install sun-java6-jdk&lt;/code&gt;
&lt;li&gt;&lt;code&gt;adduser --system --group --disabled-password hudson &lt;/code&gt;
&lt;li&gt;&lt;code&gt;su - hudson&lt;/code&gt;
&lt;li&gt;&lt;code&gt;java -jar hudson.war&lt;/code&gt;
&lt;/ul&gt;

The Hudson web interface should now be listening on port 8080. Go there and configure it.

&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;big&gt;&lt;b&gt;Configure Hudson&lt;/b&gt;&lt;/big&gt;&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use the plugin manager (Click 'Manage Hudson', -&gt; 'Manage Plugins') to install the EC2 plugin. Restart hudson afterwards. (It may take a while until all available plugins are listed. Be patient.)
&lt;li&gt;Configure the basics ('Mange Hudson' -&gt; 'Configure system'):
&lt;li&gt;Set &quot;# of executors&quot; to &lt;code&gt;0&lt;/code&gt;. This effectively disables any builds on the master.
&lt;li&gt;In the &quot;Cloud&quot; section add &quot;Amazon EC2&quot;.
&lt;li&gt;Configure Access Key, Secret Key and EC2 RSA private key. (First two are in your Amazon EC2 Credentials, the RSA private key can be created using the EC2 Management Console by using the 'Create keypair' function.)
&lt;li&gt;Add an AMI:
&lt;ul&gt;
&lt;li&gt;AMI ID: &lt;code&gt;ami-fcf61595&lt;/code&gt; (current AMI ID from &lt;a href=&quot;http://www.alestic.com&quot;&gt;alestic.com&lt;/a&gt; for Debian squeeze server 64bit)
&lt;li&gt;Instance Type: &lt;code&gt;LARGE&lt;/code&gt; (the Alestic AMI won't work with the SMALL type)
&lt;li&gt;Description: &lt;code&gt;Debian 6.0 server 64bit (Alestic) US&lt;/code&gt;
&lt;li&gt;Remote FS Root: &lt;code&gt;/mnt/hudson&lt;/code&gt; (where the hudson slave will store it's local data. /mnt is the large disk for EC2.)
&lt;li&gt;Labels: &lt;code&gt;debian-6.0-amd64&lt;/code&gt; (AMIs with the same label will be grouped by Hudson)
&lt;li&gt;Init Script: &lt;code&gt;wget -q http://your.web.server/hudson-slave.run &amp;&amp; bash hudson-slave.run&lt;/code&gt; (Get my &lt;a href=&quot;http://zeha.at/blog/2009/11/08/hudson-slave.run&quot;&gt;hudson-slave.run&lt;/a&gt; and copy it to a web server reachable by your EC2 instances.)
&lt;/ul&gt;
&lt;li&gt;Save.&lt;/li&gt;
&lt;/ul&gt;

By now you should be able to manually add a node on EC2 from 'Mange Hudson' -&gt; 'Manage Nodes' (click &quot;Provision from EC2&quot;).
If this works well, you're mostly done.

&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;big&gt;&lt;b&gt;Setup a build job&lt;/b&gt;&lt;/big&gt;&lt;/h2&gt;
Now create a new job for building grml. Job name can be &quot;grml-small amd64 testing&quot; or whatever you actually build :-)&lt;br/&gt;
Choose &quot;Build a free-style software project&quot; as the proper option.

&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;big&gt;&lt;b&gt;Configure your job&lt;/b&gt;&lt;/big&gt;&lt;/h2&gt;
From the job dashboard choose your job, and select &quot;Configure&quot;.&lt;br/&gt;
&lt;br/&gt;
Check &quot;this build is parameterized&quot; and add two String parameters:
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;FLAVOUR&lt;/code&gt;
&lt;li&gt;Default Value: &lt;code&gt;grml-small&lt;/code&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;CLASSES&lt;/code&gt;
&lt;li&gt;&lt;code&gt;GRMLBASE,GRML_SMALL,AMD64&lt;/code&gt;
&lt;/ul&gt;

For the build, you'll need to add two shell steps, with the following script contents:&lt;br/&gt;
&lt;b&gt;Execute shell step #1:&lt;/b&gt;&lt;br/&gt;
&lt;pre&gt;
#!/bin/bash
echo &quot;setup system and cleanup&quot;
set +e
set +x
apt-get install -y mksh fai-client fai-server fakeroot squashfs-tools squashfs-lzma-tools bc perl
apt-get install -y grml-live grml-live-addons

cat &gt; /etc/grml/grml-live.local &lt;&lt; EOF
GRML_LIVE_SOURCES=&quot;
deb http://localhost/apt-cacher/http.us.debian.org/debian squeeze main contrib non-free
deb http://localhost/apt-cacher/deb.grml.org/ grml-stable  main
deb http://localhost/apt-cacher/deb.grml.org/ grml-testing main
&quot;
FAI_DEBOOTSTRAP=&quot;squeeze http://localhost/apt-cacher/http.us.debian.org/debian&quot;
#SQUASHFS_OPTIONS=&quot;-nolzma&quot;
SUITE=&quot;squeeze&quot;
CLASSES=&quot;${CLASSES}&quot;
VERSION=&quot;${BUILD_ID}&quot;
EOF

grep /grml /proc/mounts | awk '{print $2}' | sort -r | xargs umount
rm -rf /grml

rm -rf work
mkdir -p work
&lt;/pre&gt;
&lt;br/&gt;

&lt;b&gt;Execute shell step #2:&lt;/b&gt;&lt;br/&gt;
&lt;pre&gt;
#!/bin/bash
echo &quot;actual build&quot;
set -x
set -e
mkdir -p /grml
mount -t tmpfs -o suid,dev none /grml
cd /grml
set +e
grml-live -g ${FLAVOUR} -F
RC=$?
set -e
cd -
mv /grml/grml-live/grml_isos/* work/
umount /grml
exit $RC
&lt;/pre&gt;
&lt;br/&gt;
&lt;br/&gt;
For post-build Actions you'll want to check &quot;Archive the artifacts&quot; and use &quot;work/**/*.iso&quot; as the files to archive. This way the built ISO will be copied to the Hudson master.

&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;&lt;big&gt;&lt;b&gt;Test it&lt;/b&gt;&lt;/big&gt;&lt;/h2&gt;
After saving your job config, do a test run by clicking &quot;Build now&quot;. After a few moments you should see a build running, and console output should show grml-live doing it's work!&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
You obviously want to customize the parameters to your job as well as the first shell fragment, if you want to build something different than some grml-small amd64 ISO ;-)
&lt;br/&gt; 
</content>
 </entry>
 
 <entry>
   <title>Testing in mobile phone browsers</title>
   <link href="http://zeha.at/blog/2009/10/testing-in-mobile-phone-browsers.html"/>
   <updated>2009-10-18T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/10/testing-in-mobile-phone-browsers</id>
   <content type="html">Browsers on mobile phones are a &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2009/10/there_is_no_web.html&quot;&gt;pain&lt;/a&gt;. It feels a bit like the old browser wars, except that there are no fights.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Testing all those browsers is even more painfully: you'd need one physical device for each released mobile phone OS + version out there. &lt;a href=&quot;http://twitter.com/PPK&quot;&gt;PPK&lt;/a&gt; can do this, but you probably don't have all those devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what about emulating...?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah. It works for Android.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Android SDK (free download!) actually contains an emulator which seems to run the original binaries. You can also hook up a debugger (adb logcat) to the emulated device, and start debugging javascript in the browser. Nice. (Also on Mac.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The iPhone SDK (&lt;a href=&quot;http://developer.apple.com/iphone/&quot;&gt;free download from Apple&lt;/a&gt;. Mac only) contains a simulator: the &quot;device&quot; will run x86 code, so it's not the same as the physical device to start with. I need to check if the browser behaves the same as on the phone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For Symbian phones, you need to download a Symbian / &lt;a href=&quot;http://www.forum.nokia.com/Tools_Docs_and_Code/Tools/Platforms/S60_Platform_SDKs/&quot;&gt;Series60 SDK&lt;/a&gt; from Nokia (&lt;i&gt;forum.nokia.com&lt;/i&gt; - how weird is that? After 14 days you need to register it). It's Win32 only, and again only a simulator which runs x86 code. It didn't work at all on my Windows 7 desktop. (Also it's the SDK with the strangest feeling. I can fully understand why no one is developing apps for S60.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
 
</content>
 </entry>
 
 <entry>
   <title>Doing OpenID right</title>
   <link href="http://zeha.at/blog/2009/10/doing-openid-right.html"/>
   <updated>2009-10-18T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/10/doing-openid-right</id>
   <content type="html">So, everyone* is now accepting OpenID for authentication.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But with doing so, many sites are actually hurting OpenID and themselves.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;Here's why: they've integrated it badly.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;There are obviously many parts of the OpenID integration people can fuck up, but here are the three common cases:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;b&gt;#1 Your login page shoots a large text box right into your user's face.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;Also it goes on to explain a long way what OpenID is, etc, yadda.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;This is plainly wrong for two good reasons:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;a) your site breaks user expectations of a login page (where's the username + password boxes?)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;Live sample for doing it wrong:&amp;nbsp;&lt;a href=&quot;http://meta.stackoverflow.com/users/login&quot;&gt;stackoverflow&lt;/a&gt;. They also get bonus points for listing Google as the first provider but not having read Google's freely available research about &lt;a href=&quot;http://code.google.com/apis/accounts/docs/OpenID.html#loginUI&quot;&gt;UI design for OpenID&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;(You should understand that most users out there have an account with one of the large providers and don't host their own OpenID stuff. &lt;i&gt;Really&lt;/i&gt;.)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;b) no &lt;i&gt;ordinary user&lt;/i&gt; cares for OpenID.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;This is just a simple fact of life. Users want to get things done, not think about some cool whizzbang technology your site's using to make your life simpler. They do care a lot about you making their lives easier, though - so let's move on to case #2 and see what that means.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;b&gt;#2 Your site uses OpenID only for authentication.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;OpenID can do so much more for you and your users, please actually &lt;i&gt;use&lt;/i&gt;&amp;nbsp;it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;Authentication is probably the number one reason for implementing OpenID. Yep, it makes your life easier: you (as a site operator) no longer need to store user credentials and keep them safe and so on. But why stop there?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;In the same request you make for authenticating your users, you can also request profile data (if it's available), like an email address, a nickname, user's real name, etc. Obviously not every OpenID provider will have this info, but if it does and you use it to pre-fill user profiles on your site, your users will thank you.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;Again, stackoverflow is a nice example of doing this completely wrong.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;Their welcome screen for new users:&amp;nbsp;&lt;form mt:asset-id=&quot;7&quot; class=&quot;mt-enclosure mt-enclosure-image&quot; style=&quot;display: inline;&quot;&gt;&lt;a href=&quot;http://zeha.at/blog/assets_c/2009/10/stackoverflow-openid-signup-7.html&quot; onclick=&quot;window.open('http://zeha.at/blog/assets_c/2009/10/stackoverflow-openid-signup-7.html','popup','width=1094,height=483,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false&quot;&gt;&lt;img src=&quot;http://zeha.at/blog/assets_c/2009/10/stackoverflow-openid-signup-thumb-200x88-7.png&quot; width=&quot;200&quot; height=&quot;88&quot; alt=&quot;stackoverflow-openid-signup.png&quot; class=&quot;mt-image-none&quot; style=&quot;&quot; /&gt;&lt;/a&gt;&lt;/form&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;form mt:asset-id=&quot;7&quot; class=&quot;mt-enclosure mt-enclosure-image&quot; style=&quot;display: inline;&quot;&gt;&lt;a href=&quot;http://zeha.at/blog/assets_c/2009/10/stackoverflow-openid-signup-7.html&quot; onclick=&quot;window.open('http://zeha.at/blog/assets_c/2009/10/stackoverflow-openid-signup-7.html','popup','width=1094,height=483,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false&quot;&gt;&lt;/a&gt;&lt;/form&gt;Yep, a scary &quot;are you sure you want to create a new account&quot; page. Instead of asking users how they would like to appear on the site instead of &quot;unknown &amp;lt;providername&amp;gt;&quot;. Really: the way to go - for creating new users - is: ask about profile data and provide a (small) link to merge with an existing account.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;b&gt;#3 Require seperate logins across sister sites.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This obviously only applies to you if you have sister sites, but probably you do if you're focusing multiple countries or multiple interest groups.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yep, there are OpenID providers (like Google) out there which will give you per-realm tokens. And this is good (privacy, you know).&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;But this is not something you want to slam into your user's face. It's your site's problem, so solve it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;And it's easy to solve: make a central realm, probably your main site (e.g. &quot;amazon.com&quot; if you were Amazon and had amazon.(com|co.uk|de|fr) as sites) for logging in. This way you'll have only one token and be done with it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;* obviously greatly exaggerated, but the time to solve this problems is &lt;i&gt;now&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>DMI data on consumer hardware</title>
   <link href="http://zeha.at/blog/2009/10/dmi-data-on-consumer-hardware.html"/>
   <updated>2009-10-17T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/10/dmi-data-on-consumer-hardware</id>
   <content type="html">&lt;a href=&quot;http://en.wikipedia.org/wiki/Desktop_Management_Interface&quot;&gt;Desktop Management Interface&lt;/a&gt; - DMI is a standard for exposing base data about the system (hardware) to the running software. Usually you'd get the manufacturer name, etc.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;At least in theory.&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;On typical consumer hardware (like&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255); &quot;&gt;&lt;a href=&quot;http://zeha.at/blog/2009/10/atomion-board-replaces-my-old-fileserver.html&quot; style=&quot;text-decoration: underline; &quot;&gt;my Zotac board&lt;/a&gt;), you instead get this:&lt;/span&gt;
&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ dmidecode
...
Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
        Manufacturer: To be filled by O.E.M.
        Product Name: To be filled by O.E.M.
        Version: To be filled by O.E.M.
        Serial Number: To be filled by O.E.M.
        Asset Tag: To Be Filled By O.E.M.

...
&lt;/pre&gt;&lt;br /&gt;I don't need to say that there is no way of finding out what hardware you've actually got from this info.&lt;/div&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>"Regular Expressions Cookbook" may not be what you want</title>
   <link href="http://zeha.at/blog/2009/09/regular-expressions-cookbook-may-not-be-what-you-want.html"/>
   <updated>2009-09-05T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/09/regular-expressions-cookbook-may-not-be-what-you-want</id>
   <content type="html">I bought &lt;a href=&quot;http://oreilly.com/catalog/9780596520687/&quot;&gt;this book&lt;/a&gt; for reasons I cannot remember, and I can't see why I did this in the first place. The intro chapters are not very useful, they do not cover anything besides 'Perl-style regexes' (they do cover differences between different Perl-style RE implementations though).&lt;div&gt;I'll probably keep it as a reference, if I ever need an RE for an already solved problem &lt;b&gt;and&lt;/b&gt; Google would fail me.&amp;nbsp;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Atom+ION board replaces my old fileserver </title>
   <link href="http://zeha.at/blog/2009/09/atomion-board-replaces-my-old-fileserver.html"/>
   <updated>2009-09-05T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/09/atomion-board-replaces-my-old-fileserver</id>
   <content type="html">&lt;div&gt;I've got myself a &lt;a href=&quot;http://pden.zotac.com/index.php?page=shop.product_details&amp;amp;flypage=flypage_images.tpl&amp;amp;product_id=169&amp;amp;category_id=15&amp;amp;option=com_virtuemart&amp;amp;Itemid=1&quot;&gt;Zotac ION ITX A&lt;/a&gt; board (with an Atom 330) to replace my old home fileserver's hardware (P4). This worked out well, but there are some traps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Old 533 MHz memory does not work - but does not fail completely. Instead, the system does not boot on &lt;i&gt;some&lt;/i&gt; attempts. Holding down the reset switch eventually makes it boot. After replacing the memory with fresh 667MHz DIMMs, this was resolved. (The board is actually spec'd for 667/800 DIMMs only, but I didn't notice this at first.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The shipped CPU fan is - as you'd expect - crap. It's so noisy that even the old system was quieter. I've removed the CPU fan and instead hooked up an 80mm Noctua fan which indirectly cools the CPU cooler. This is now as quiet as it gets (within the time and money I'm willing to spend on this).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BIOS flashing only works from a (emulated) DOS boot disk. The flasher definitively is &lt;i&gt;scary&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The WLAN card (it's actually a card, so I guess I could replace it) is an ath9k - AP mode doesn't really seem to work with the current Linux drivers. I was hoping to get rid of my AP, but this has to wait...&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Doing what one suggests</title>
   <link href="http://zeha.at/blog/2009/08/doing-what-one-suggests.html"/>
   <updated>2009-08-26T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/doing-what-one-suggests</id>
   <content type="html">During my recent mini-talk I suggested, that one should always use the latest version of puppet.&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;But, our own production setup was still on 0.24.4.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Yep, 0.24.&lt;b&gt;4&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;That old.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This got us into some trouble during deployment of the Nagios/Naginator types (in 0.24.4+0.24.5 they are dead slow and missing features which make them unusable). Therefore, we've now upgraded to 0.24.8 and enjoy fast deployment of those types :-)&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Blog now reachable via IPv6</title>
   <link href="http://zeha.at/blog/2009/08/blog-now-reachable-via-ipv6.html"/>
   <updated>2009-08-25T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/blog-now-reachable-via-ipv6</id>
   <content type="html">&lt;a href=&quot;http://zeha.at/&quot;&gt;This blog&lt;/a&gt; is now reachable using IPv6, too.&lt;div&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;If you're using IPv6, it should say so here:&amp;nbsp;&lt;img src=&quot;/ipv6/v4orv6.cgi&quot; style=&quot;border:1px solid red;&quot; /&gt;&lt;/span&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>"Configuration Management using Puppet"</title>
   <link href="http://zeha.at/blog/2009/08/configuration-management-using-puppet.html"/>
   <updated>2009-08-24T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/configuration-management-using-puppet</id>
   <content type="html">I gave a very short talk on Puppet, during FrOSCon 2009 as part of the PostgreSQL project line.&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;form mt:asset-id=&quot;6&quot; class=&quot;mt-enclosure mt-enclosure-file&quot; style=&quot;display: inline;&quot;&gt;&lt;a href=&quot;http://zeha.at/blog/2009/08/24/puppetlightningtalk.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/form&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(As OOo cannot do an reasonable export to PDF, I redid the slides with Keynote.)&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Monitoring static values</title>
   <link href="http://zeha.at/blog/2009/08/monitoring-static-values.html"/>
   <updated>2009-08-19T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/monitoring-static-values</id>
   <content type="html">Sometimes statically configured values/limits are not so static as you'd think:&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;form mt:asset-id=&quot;5&quot; class=&quot;mt-enclosure mt-enclosure-image&quot; style=&quot;display: inline;&quot;&gt;&lt;img alt=&quot;tomcat_jvmheap-day.png&quot; src=&quot;/blog/assets_c/2009/08/tomcat_jvmheap-day-thumb-240x240-5.png&quot; width=&quot;495&quot; height=&quot;295&quot; class=&quot;mt-image-none&quot; style=&quot;&quot; /&gt;&lt;/form&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The 'Maximum Limit' is configured to be&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; &quot;&gt;9728M&lt;/span&gt;. But maybe this isn't what we think it is :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Looking back at 5 years old code</title>
   <link href="http://zeha.at/blog/2009/08/looking-back-at-5-years-old-code.html"/>
   <updated>2009-08-16T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/looking-back-at-5-years-old-code</id>
   <content type="html">Looking back at 5 years old code makes me a bit sad. How&amp;nbsp;embarrassing!&lt;div&gt;At least I've now cleaned up the mess of where the code is located. No more outdated CVS &amp;amp; SVN repos, 4 backup copies, etc.&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Replacing nscd for "hosts" caching</title>
   <link href="http://zeha.at/blog/2009/08/replacing-nscd-for-hosts-caching.html"/>
   <updated>2009-08-13T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/replacing-nscd-for-hosts-caching</id>
   <content type="html">I'm currently looking for a replacement for caching the Linux NSS &quot;hosts&quot; &quot;database&quot;. Basically, my goal is caching DNS lookups, but with a few restrictions:&lt;div&gt;&lt;ul&gt;&lt;li&gt;The cache should not cache until the DNS TTL expires, but for a maximum of a configurable TTL. This is needed, so I can easily flush the DNS caches on the central resolvers, but don't need to worry about the cache on each and every machine.&lt;/li&gt;&lt;li&gt;The cache should ask one or more centrally installed resolvers, as they have special configurations for some domains.&lt;/li&gt;&lt;li&gt;The cache should be running locally, as everything else will break at some point. *&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;nscd is designed to do this, but unfortunately it has serious bugs which make it unsuitable for use, including&amp;nbsp;&lt;a href=&quot;http://sourceware.org/bugzilla/show_bug.cgi?id=4428&quot;&gt;this bug&lt;/a&gt;&amp;nbsp;(which also features a nice &quot;Drepper response&quot;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not sure which software to use yet, maybe it doesn't even exist.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Any recommendations?&lt;/div&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Backwards incompatible change in Firefox 3.0.13</title>
   <link href="http://zeha.at/blog/2009/08/backwards-incompatible-change-in-firefox-3013.html"/>
   <updated>2009-08-05T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/backwards-incompatible-change-in-firefox-3013</id>
   <content type="html">Seems like Firefox 3.0.13 has been released, as well as the updates for
Ubuntu, probably fixing the BlackHat related SSL problems.&lt;br /&gt;&lt;br /&gt;This is of course fine, but the fix seems to have broken behavior we've relied on for all too long: &lt;br /&gt;&lt;br /&gt;Previously,
given a certificate for *.domain.com, this would (in Firefox, not in
other browsers) also be valid for a host called &quot;foo.bar.domain.com&quot;.
As of 3.0.13 this is no longer true, and therefore we're getting loads
of SSL errors now...&lt;br /&gt;&lt;br /&gt;(I've not validated this with Firefox on Windows.)&lt;br /&gt;   
</content>
 </entry>
 
 <entry>
   <title>Switched to VoIP</title>
   <link href="http://zeha.at/blog/2009/08/switched-to-voip.html"/>
   <updated>2009-08-04T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/08/switched-to-voip</id>
   <content type="html">At work we've now successfully switched from an Alcatel OmniPCX Enterprise to a VoIP-/SIP-based solution. This has worked pretty well, some users were excited, some not so (as always).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're not even missing features, and it's way better for us to handle now. (Even as the LDAP-backed provisioning is still missing right now.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall summary basically boils down to:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.freeswitch.org/&quot; style=&quot;text-decoration: underline; &quot;&gt;Freeswitch&lt;/a&gt;&amp;nbsp;(inside OpenVZ on a HP ProLiant)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.polycom.com/products/voice/desktop_solutions/soundpoint/desk_phones/soundpoint_ip321_331.html&quot; style=&quot;text-decoration: underline; &quot;&gt;Polycom 331 hardware phones&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Some users are running twinkle instead&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.polycom.com/support/voice/soundpoint_ip/applications/corporate_directory_access.html&quot;&gt;LDAP-based directory&lt;/a&gt; on the Polycom phones (needs a software license though)&lt;/li&gt;&lt;li&gt;Phones are provisioned via DHCP+HTTP, they automatically switch to the Voice VLAN after getting their initial DHCP lease&lt;/li&gt;&lt;li&gt;PoE&lt;/li&gt;&lt;li&gt;LDAP-based provisioning of Users&amp;nbsp;(not yet ready, but real soon now)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.freeswitch.org/&quot; style=&quot;text-decoration: underline; &quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, all of this was&amp;nbsp;made possible &amp;amp; implemented&amp;nbsp;mostly by my colleagues, not by myself.&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Resetting your bitlbee password</title>
   <link href="http://zeha.at/blog/2009/07/resetting-your-bitlbee-password.html"/>
   <updated>2009-07-10T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/07/resetting-your-bitlbee-password</id>
   <content type="html">If you're using bitlbee, and forgot your password, it's relatively easy to reset it - if you actually host your own bitlbee server.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;/var/lib/bitlbee$ mv nickname.* old/&lt;/li&gt;&lt;li&gt;reconnect&lt;/li&gt;&lt;li&gt;register&amp;nbsp;&lt;/li&gt;&lt;li&gt;disconnect&lt;/li&gt;&lt;li&gt;/var/lib/bitlbee$&amp;nbsp;mv old/* .&lt;/li&gt;&lt;li&gt;reconnect&lt;/li&gt;&lt;li&gt;reset your account passwords&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Good luck!&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>PXE boot decisions</title>
   <link href="http://zeha.at/blog/2009/07/pxe-boot-decisions.html"/>
   <updated>2009-07-07T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/07/pxe-boot-decisions</id>
   <content type="html">&lt;a href=&quot;http://syslinux.zytor.com/&quot;&gt;SYSLINUX/PXELINUX&lt;/a&gt;&amp;nbsp;is officially awesome. You've almost certainly already used it - while booting from a Linux installation CD - and probably already use it if you do any PXE stuff.&lt;div&gt;What you may not knew is that it provides an&amp;nbsp;&lt;a href=&quot;http://syslinux.zytor.com/wiki/index.php/Comboot_API&quot;&gt;API&lt;/a&gt;&amp;nbsp;programs can use, it can directly execute specially crafted DOS command binaries (COM), and even has a special 32-bit mode for these programs (the collection of these is &quot;&lt;a href=&quot;http://syslinux.zytor.com/wiki/index.php/Comboot_API&quot;&gt;Comboot API&lt;/a&gt;&quot;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are lots of cool things in the API and the &lt;a href=&quot;http://git.kernel.org/?p=boot/syslinux/syslinux.git;a=tree;f=com32;hb=HEAD&quot;&gt;extensive sample programs&lt;/a&gt;. Especially nice is the readily available &lt;a href=&quot;http://git.kernel.org/?p=boot/syslinux/syslinux.git;a=blob;f=com32/gplinclude/dmi/dmi.h&quot;&gt;DMI&amp;nbsp;support&lt;/a&gt; in the API.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This made my task an easy journey. First, what I wanted to actually do:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;If a machine gets booted from PXE (from any location, we have a central TFTP server),&lt;/li&gt;&lt;li&gt;if it is a server of a known model, auto-boot into a customized &lt;a href=&quot;http://grml.org/&quot;&gt;grml&lt;/a&gt; environment for auto-deployment,&lt;/li&gt;&lt;li&gt;else present our standard PXE boot menu for OS installation/recovery purposes.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And this basically boils down to:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Write a small Comboot program which checks the DMI product_name against a pre-defined string (for HP ProLiant servers this unsurprisingly starts with &quot;ProLiant&quot;) and dispatches to two different PXELINUX configuration files. I named &lt;a href=&quot;http://github.com/zeha/syslinux/blob/8f57ad47f822ebb992c4cd320367c78112ec72ce/com32/modules/proliant.c&quot;&gt;this program proliant.c32&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Write pxelinux.cfg/default which does exactly one thing: auto-load proliant.c32.&lt;/li&gt;&lt;li&gt;Write the seperate PXELINUX configuration files.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>FRITZ!Box Fon WLAN + WRT54GL Wireless Bridge</title>
   <link href="http://zeha.at/blog/2009/05/fritzbox-fon-wlan-wrt54gl-wireless-bridge.html"/>
   <updated>2009-05-31T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/fritzbox-fon-wlan-wrt54gl-wireless-bridge</id>
   <content type="html">After spending two hours fighting different WRT54GL firmware versions, WDS, Client Bridge, and other stuff, here's my solution for bridging the ethernet to WLAN on an Linksys WRT54GL with a Fritz!Box Fon WLAN 7140 WLAN basis station.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get dd-wrt for the WRT54GL. I used version 24-sp1.&lt;/li&gt;&lt;li&gt;Do a full factory reset on the WRT.&lt;/li&gt;&lt;li&gt;dd-wrt Setup: Basic Setup/Network Setup: configure an IP in the same network as your Fritz!box is in.&lt;/li&gt;&lt;li&gt;Security/Firewall: SPI Firewall -&amp;gt; Disable&lt;/li&gt;&lt;li&gt;Wireless/Basic Settings:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Wireless Mode -&amp;gt; Repeater Bridge&lt;/li&gt;&lt;li&gt;Wireless Network Mode -&amp;gt; G-Only&lt;/li&gt;&lt;li&gt;SSID -&amp;gt; needs to match your Fritz!box SSID&lt;/li&gt;&lt;li&gt;Network Configuration -&amp;gt; Bridged&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Wireless/Wireless Security:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Security Mode: if your Fritz!box is configured for WPA or WPA2/Mixed, select WPA here (&lt;b&gt;NOT WPA2!&lt;/b&gt; - it won't work)&lt;/li&gt;&lt;li&gt;WPA Algo should be TKIP for a Fritz!box&lt;/li&gt;&lt;li&gt;WPA Shared Key -&amp;gt; same as on your Fritz!box&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;You probably need to reboot the WRT after changing all this stuff.&lt;br /&gt;&lt;br /&gt;Now go to Status/Wireless, you should see the Fritz!box in the Access Points &amp;amp; Clients list, with a Signal Quality &amp;gt; 0.&lt;br /&gt;If it doesn't work yet, try the &quot;Site Survey&quot; and click &quot;Join&quot; next to your WLAN network.&lt;br /&gt;&lt;br /&gt;There isn't anything special to configure on the Fritz!box. If it finds your WRT it should say &quot;Repeater&quot; next to it in the WLAN Monitor menu.&lt;br /&gt;&lt;br /&gt;Probably it's better to use WDS instead of &quot;Repeater Bridge&quot;, but I haven't got that working. If you do, let me know!&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Introducing lastfmproxy-rb</title>
   <link href="http://zeha.at/blog/2009/05/introducing-lastfmproxy-rb.html"/>
   <updated>2009-05-22T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/introducing-lastfmproxy-rb</id>
   <content type="html">Last.fm released a new&amp;nbsp;&lt;a href=&quot;http://www.last.fm/api/radio&quot;&gt;Radio API&lt;/a&gt;&amp;nbsp;which must be used instead of the old one now. Unfortunately most programs have not been updated to the new API, including&amp;nbsp;&lt;a href=&quot;http://vidar.gimp.org/?page_id=50&quot;&gt;lastfmproxy&lt;/a&gt;, which I wanted to use to listen to last.fm from my squeezebox (there are some limitations in the native squeezebox/last.fm radio stuff which prevent me from using it).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore, I want to introduce: lastfmproxy-rb (&lt;a href=&quot;https://github.com/zeha/lastfmproxy-rb&quot;&gt;git repo&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This piece of software aims to provide a real Shoutcast/ICY-style &quot;internet radio&quot; stream based on the last.fm radio API. In the current state it's mostly a big hack, but the basics (== listening) works already. ICY metadata is still on my todo list, for example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Requirements:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ruby 1.8 installed&lt;/li&gt;&lt;li&gt;last.fm subscriber (limitation of last.fm)&lt;/li&gt;&lt;li&gt;have an last.fm API key (get it&amp;nbsp;&lt;a href=&quot;http://www.last.fm/api/account&quot;&gt;here for free&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quick start:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;fetch proxy.rb&lt;/li&gt;&lt;li&gt;create config.rb:&lt;pre&gt;config = {
  :username =&amp;gt; 'yaddayadda',
  :password =&amp;gt; 'PASSWORD',
  :station =&amp;gt; 'lastfm://artist/MGMT/similarartists',
  :api_key =&amp;gt; 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  :api_secret =&amp;gt; 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}
&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;ruby ./proxy.rb&lt;/li&gt;&lt;li&gt;point your audio client to http://localhost:2000/listen.mp3&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Polycom SoundPoint IP 330: a first look</title>
   <link href="http://zeha.at/blog/2009/05/polycom-soundpoint-ip-330-a-first-look.html"/>
   <updated>2009-05-12T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/polycom-soundpoint-ip-330-a-first-look</id>
   <content type="html">&lt;form mt:asset-id=&quot;3&quot; class=&quot;mt-enclosure mt-enclosure-image&quot; style=&quot;display: inline;&quot;&gt;&lt;a href=&quot;http://zeha.at/blog/2009/05/12/soundpoint_ip330_320.jpg&quot;&gt;&lt;img alt=&quot;soundpoint_ip330_320.jpg&quot; src=&quot;http://zeha.at/blog/assets_c/2009/05/soundpoint_ip330_320-thumb-200x200.jpg&quot; width=&quot;200&quot; height=&quot;200&quot; class=&quot;mt-image-right&quot; style=&quot;float: right; margin: 0 0 20px 20px;&quot; /&gt;&lt;/a&gt;&lt;/form&gt;Got my &lt;a href=&quot;http://www.polycom.com/products/voice/desktop_solutions/soundpoint/desk_phones/soundpoint_ip330_320.html&quot;&gt;Polycom SoundPoint IP 330&lt;/a&gt; today, and already had a chance to take a first look.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not that impressed yet, but I guess this is a good sign. Provisioning &quot;just worked&quot; as documented on the web, as well as the PoE, SIP, firmware upgrade (which is really just part of the provisioning), dialing stuff, etc. German translation is included, but it's (like on all SIP phones) very confusing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But it's already less confusing than the Snom 360 I was previously using.&lt;/div&gt;


 
</content>
 </entry>
 
 <entry>
   <title>Making the case for 15 boxes per rack</title>
   <link href="http://zeha.at/blog/2009/05/fifteen-machines-per-rack.html"/>
   <updated>2009-05-12T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/fifteen-machines-per-rack</id>
   <content type="html">&lt;div&gt;We are now putting exactly 15 1U machines into each rack. This number fits nicely for our setup.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;15 machines equal to:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;15x3 switch ports. Each machine gets out-of-band management, in-band management and a VLAN trunk port.&lt;/li&gt;&lt;li&gt;16x2 power ports, as each machine gets two PSUs for redundancy requirements. The switch obviously also has redundant PSUs, so this totals 32 power ports. With CEE7/4 plugs this already takes lots of space just for the plugs/power bars.&lt;/li&gt;&lt;li&gt;~ 4000kW power requirement; we calculate with ~260W per server (actually more during boot etc).&lt;/li&gt;&lt;li&gt;15x5 cables. Two power cables, 3 Ethernet patch cables per machine. Plus a few more for switch power and switch/rack interconnects.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's already a challenge to actually handle all this stuff in a single rack. It gets &lt;b&gt;&lt;i&gt;really &lt;/i&gt;&lt;/b&gt;messy if you surpass 15 machines per rack.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We group these 15 1U machines in groups of three. After each group we leave 1U empty. After the second group we leave an extra 1U empty and mount the 4U switch on the read side. Then again we leave 2U empty and mount the remaining three groups below. Power bars go to the rear sides, heavier machines go to the bottom.&lt;/div&gt;&lt;div&gt;My colleague detailed this layout on the&amp;nbsp;&lt;a href=&quot;http://amd.co.at/adminwiki/Rack_Layout_(CH)&quot;&gt;amd.co.at/AdminWiki&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe we can do 20 machines per rack when we know more about power on the &lt;a href=&quot;http://h10010.www1.hp.com/wwpc/us/en/en/WF25a/15351-15351-3328412-241644-241475-3929672.html&quot;&gt;new HP ProLiant server generation&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>ruby-ldap + SSL</title>
   <link href="http://zeha.at/blog/2009/05/ruby-ldap-ssl.html"/>
   <updated>2009-05-06T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/ruby-ldap-ssl</id>
   <content type="html">If you have trouble with ruby-ldap to connect to an SSL-only LDAP server, there can be &lt;b&gt;lots&lt;/b&gt; of reasons. From what I've seen today, the next time I've problems like this I'd check these things first:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;does ldapsearch -x -H ldaps://your.ldap.hostname work?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;if not, fix this. usually you need to set TLS_CACERT in /etc/ldap/ldap.conf&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;check the underlying ldap library. ruby's ldap library can be linked against the OpenLDAP libldap or against the Netscape LDAP SDK. Make sure the binaries supplied with the correct library can connect to your ldap server.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;check that the minimum amount of code works, an example would be:&lt;br /&gt;&lt;br /&gt;require 'ldap'&lt;br /&gt;&lt;br /&gt;conn = LDAP::SSLConn.new( 'your.ldap.hostname', 636 )&lt;br /&gt;conn.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )&lt;br /&gt;conn.bind('cn=loginuser,o=foo','FOOPASSWORD') {&lt;br /&gt;&amp;nbsp; conn.perror(&quot;bind&quot;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In my case, I was missing the TLS_CACERT config option in /etc/ldap/ldap.conf and was only getting a useless &quot;Connect error&quot; from ruby.&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Puppet 0.25.0 beta1 + Passenger</title>
   <link href="http://zeha.at/blog/2009/05/puppet-025-passenger.html"/>
   <updated>2009-05-06T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/puppet-025-passenger</id>
   <content type="html">&lt;a href=&quot;http://groups.google.com/group/puppet-users/browse_thread/thread/e1786e8fc87eb9be/967a749e9a027bf4&quot;&gt;The first beta version of Puppet 0.25.0 was released&lt;/a&gt;. If you're using Passenger, please read ext/rack/README for setup instructions, and keep in mind that the old config.ru file from the wiki will no longer work. (There's a new one in ext/rack.)&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>EDAC i5000 NON-FATAL ERRORs on HP ProLiant Hardware</title>
   <link href="http://zeha.at/blog/2009/05/edac-i5000-non-fatal-errors-on-hp-proliant-hardware.html"/>
   <updated>2009-05-06T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/05/edac-i5000-non-fatal-errors-on-hp-proliant-hardware</id>
   <content type="html">If you're seeing messages like 'EDAC i5000 NON-FATAL ERROR' in your kernel.log, and that is on HP ProLiant hardware (DL360 G5 in this case), take them seriously and PANIC ^W act immediately. (These messages are neither a &lt;a href=&quot;http://marc.info/?l=fedora-list&amp;amp;m=121220070120235&amp;amp;w=2&quot;&gt;kernel bug&lt;/a&gt; nor a &lt;a href=&quot;http://markmail.org/message/sblchfhe34uefchg&quot;&gt;hardware bug&lt;/a&gt;, but the plain truth.)&lt;br /&gt;&lt;br /&gt;Just had a machine panic with an NMI today, and we've delayed ^W ignored the kernel messages for a few days...&lt;br /&gt;&lt;br /&gt;Causes could probably be faulty RAM, faulty system board, or something else. If you don't get a lit 'memory faulty' LED, the IML will helpfully save a bit of info when an NMI occours, so you at least have something to tell HP.&lt;br /&gt;&lt;br /&gt;  
</content>
 </entry>
 
 <entry>
   <title>Data Centers in Vienna</title>
   <link href="http://zeha.at/blog/2009/04/data-centers-in-vienna.html"/>
   <updated>2009-04-19T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2009/04/data-centers-in-vienna</id>
   <content type="html">&lt;div&gt;Vienna has a relatively small data center density compared to other cities, but there are still a few options worth exploring:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.danubedc.com/&quot;&gt;DanubeDC&lt;/a&gt;, Floridsdorf: very competent looking, fast interaction possible. They build a second DC on the south side of the Danube, too, probably with high-density cooling zones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href=&quot;http://www.ibm.com/contact/at/de/&quot; style=&quot;text-decoration: underline; &quot;&gt;IBM&lt;/a&gt; ODC21, Floridsdorf: Bureaucracy; fast; very competent looking. Can do high-density cooling zones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.interxion.at/&quot;&gt;InterXion&lt;/a&gt;, Floridsdorf: &quot;the datacenter&quot;. VIX2 is hosted here. A bureaucracy. Can do large-scale projects, as well as high-density cooling zones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.interoute.com/&quot;&gt;interoute&lt;/a&gt;, Liesing&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://invitel-int.com/&quot;&gt;Invitel&lt;/a&gt;, Voesendorf: Can do large-scale projects, unfortunately not directly located in Vienna.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.nessus.at/&quot;&gt;Nessus&lt;/a&gt;, Favoriten: probably very flexible, small company.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.sil.at/&quot;&gt;SIL&lt;/a&gt;, Heiligenstadt: okay. Sometimes a pita, but things get better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www6.inode.at/typo3/produkte/housing/inode-housing/inode-housing/&quot;&gt;UPC&lt;/a&gt;, Favoriten: probably okay. Flexible pricing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are rumors that Verizon and Telia also operate data centers in Vienna, but I couldn't get pricing/info from them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most data centers offer reasonable pricing while not being capable of doing proper pre-sales. You better know exactly what you want ahead of calling/visiting anyone.&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Why we're using GRML in the datacenter</title>
   <link href="http://zeha.at/blog/2009/03/why-were-using-grml-in-the-datacenter.html"/>
   <updated>2009-03-23T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/03/why-were-using-grml-in-the-datacenter</id>
   <content type="html">&lt;a href=&quot;http://grml.org/&quot;&gt;grml&lt;/a&gt; basically is a live Linux CD optimized for text-tool users and sysadmins. We are using it in the datacenter, and here's why:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's a breeze to use for unprepared tasks: it contains a lot of useful tools, and it's just a CD you need to carry. Got a broken machine? Suddenly some box is acting strange? Fire up grml and check what's going on.&lt;/li&gt;&lt;li&gt;It's easy to integrate into your existing infrastructure. You probably already have some PXE server for network booting, and you can boot grml off it after &lt;a href=&quot;http://wiki.grml.org/doku.php?id=terminalserver#booting_grml_without_grml-terminalserver&quot;&gt;following a few simple steps&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;It's easy to extend. We've just recently replaced our old preseeded debian installer for deploying new machines with grml (from PXE boot) + a simple script I wrote in an hour or so. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;It supports all our hardware.&lt;/li&gt;&lt;li&gt;The grml64 variant is a true 64-bit Linux, which is great if you want to deploy 64-bit installations.&lt;/li&gt;&lt;li&gt;It's based on Debian, so our people are already familiar with the environment.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Try grml out - grab your copy of grml or grml64 &lt;a href=&quot;http://grml.org/download/&quot;&gt;from here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also, grml provides a nice pre-configured zsh (and related shell environment). If you like it, you may want to use it permanently for your workstation (or even servers). Get the instructions from &lt;a href=&quot;http://grml.org/console/&quot;&gt;http://grml.org/console/&lt;/a&gt; 
</content>
 </entry>
 
 <entry>
   <title>Piwik: tracking actions</title>
   <link href="http://zeha.at/blog/2009/03/piwik-tracking-actions.html"/>
   <updated>2009-03-23T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/03/piwik-tracking-actions</id>
   <content type="html">&lt;a href=&quot;http://piwik.org/&quot;&gt;Piwik&lt;/a&gt; is an open-source web analysis tool, a bit like Google Analytics, but it's supposed to be installed on your own server. After being nagged by &lt;a href=&quot;http://blogs.amd.co.at/robe/&quot;&gt;Robe&lt;/a&gt; I decided to test it on a low-traffic site (actually Robe also wrote all code to make this happen).&lt;br /&gt;&lt;br /&gt;Piwik assumes that you just put their supplied javascript code on your site and be done with it. The JS will modify all links so it can track site exits and such stuff. This probably works well for static web pages, but it obviously does not for already javascript-heavy sites like the site in question. &lt;br /&gt;&lt;br /&gt;The site actually only ever loads a single HTML page from the server, and shows you a list of links and upon clicking one of these links, the site javascript will update the page content on the fly, without forcing a full page reload (think of a picture gallery).&lt;br /&gt;So, piwik was just ever seeing the initial page load, but not when a user clicked on such a picture link. Therefore the stats were mostly useless.&lt;br /&gt;But: piwik can actually track custom supplied actions, and you could call the piwik tracking code &lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>HP support Debian lenny on ProLiant G5 series</title>
   <link href="http://zeha.at/blog/2009/02/hp-support-debian-lenny-on-proliant-g5-series.html"/>
   <updated>2009-02-20T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/02/hp-support-debian-lenny-on-proliant-g5-series</id>
   <content type="html">&lt;a href=&quot;http://www.debian.org/News/2009/20090214&quot;&gt;Debian 5.0 (&quot;lenny&quot;) has landed&lt;/a&gt;, and now &lt;a href=&quot;http://hp.com/go/debian&quot;&gt;HP officially supports&lt;/a&gt; it.&lt;br /&gt;&lt;br /&gt;The first downloads are &lt;a href=&quot;http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=en&amp;amp;cc=us&amp;amp;prodNameId=3288144&amp;amp;prodTypeId=15351&amp;amp;prodSeriesId=1121486&amp;amp;swLang=8&amp;amp;taskId=135&amp;amp;swEnvOID=4033&quot;&gt;available on the regular support pages&lt;/a&gt;. I've been waiting for this to happen for a very long time, and will now test what has been delivered.&lt;br /&gt;&lt;br /&gt;Update: the ILO components seem to be missing from this initial release, but hpasm, hpacucli are fully functional, and I suspect the other software packages will work too (hpsmh, hpadu, hp-snmp-agents, cpqacuxe). Manually installing ia32-libs was necessary on amd64, as hpbootcfg crashed without it.&lt;br /&gt;  
</content>
 </entry>
 
 <entry>
   <title>PowerDNS 2.9.22 released</title>
   <link href="http://zeha.at/blog/2009/01/powerdns-2922-released.html"/>
   <updated>2009-01-27T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2009/01/powerdns-2922-released</id>
   <content type="html">After a very long time, &lt;a href=&quot;http://doc.powerdns.com/changelog.html#CHANGELOG-AUTH-2-9-22&quot;&gt;PowerDNS 2.9.22&lt;/a&gt; has &lt;a href=&quot;http://blog.netherlabs.nl/articles/2009/01/27/powerdns-2-9-22-released-rfc-5452-assigned&quot;&gt;been released&lt;/a&gt; by it's author; a release I've been looking forward to because of various issues.&lt;br /&gt;&lt;br /&gt;Unfortunately this is too late for the Debian lenny release, so I'll probably need to maintain custom packages for both etch &amp;amp; lenny.&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Creating a multi-floppy USB Key (for flashing HP DL140/145 G2 systems)</title>
   <link href="http://zeha.at/blog/2008/12/creating-a-multi-floppy-usb-key-for-flashing-hp-dl140145-g2-systems.html"/>
   <updated>2008-12-01T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2008/12/creating-a-multi-floppy-usb-key-for-flashing-hp-dl140145-g2-systems</id>
   <content type="html">I'm a (not-so) proud owner of one HP ProLiant DL140 G2 (Intel-based) and one HP ProLiant DL145 G2 (AMD-based) machines. These were, at the time, good machines, not so expensive, and had two fixed 3.5&quot; SATA drives, allowing for cheap disk upgrades. (BTW, this blog runs on one of these.)&lt;br /&gt;&lt;br /&gt;HP had outfitted these machines with so-called &quot;Lights-Out 100i management&quot;, basically delivering IPMI-based out-of-band management, with serial-over-LAN. If you take a look at what Supermicro delivers nowadays, you would not want the LO100i. I've also had lots of problems with the LO100i, so I stopped using it.&lt;br /&gt;&lt;br /&gt;Few days ago I decided to give the LO100i a new try. In the meantime, HP issued firmware upgrades for both the system ROMs as well as for the LO100i management processor (BMC). The journey begins...&lt;br /&gt;&lt;br /&gt;Interesting facts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The DL140/145G2 were made in 2005, and were shipped without a floppy drive.&lt;/li&gt;&lt;li&gt;There is no way to add a floppy drive into the machine.&lt;/li&gt;&lt;li&gt;The EXE is a 16-bit DOS executable which runs in full-screen mode.&lt;/li&gt;&lt;li&gt;The downloaded EXE (containing the flash update) requires a floppy drive to write its self-contained floppy image to.&lt;/li&gt;&lt;li&gt;System ROM and BMC updates are seperate, so each one needs a seperate floppy disk.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;What's not working:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;64bit Windows can &lt;b&gt;NOT&lt;/b&gt; execute 16-bit DOS executables. All the Windows machines at work are 64bits. (They do not have a floppy drive anyway.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Full-screen DOS applications can &lt;b&gt;NOT&lt;/b&gt; run inside a terminal services connection.&lt;/li&gt;&lt;li&gt;DOSEMU does crash on my 64bit Linux desktop.&lt;/li&gt;&lt;li&gt;Unzipping the downloaded EXE (&quot;SoftPAQ&quot;) file does not work, it's some kind of Compaq propietary tool.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Conclusions so far:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I've got one DL140 and one DL145, so I'd need 4 floppies.&lt;/li&gt;&lt;li&gt;I'd need a USB floppy drive. I checked at a local store, such a drive costs about 30 euros.&lt;/li&gt;&lt;li&gt;It would take lots of time in the data center.&lt;/li&gt;&lt;li&gt;I'd need even more than 4 floppies, because floppy disks are &lt;u&gt;&lt;i&gt;&lt;b&gt;very&lt;/b&gt;&lt;/i&gt;&lt;/u&gt; unreliable.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I decided to use a single USB key instead. I've been recently given such a (very cheap) key from my employer - nothing to lose if something goes wrong with it.&lt;br /&gt;&lt;br /&gt;Preparations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get a Windows desktop, install &lt;a href=&quot;http://www.winimage.com/&quot;&gt;WinImage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Get a Linux desktop with the following software:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;VirtualBox (Ubuntu: &lt;tt&gt;apt-get install virtualbox-ose&lt;/tt&gt; and login again)&lt;/li&gt;&lt;li&gt;mkisofs&lt;/li&gt;&lt;li&gt;syslinux&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;http://www.freedos.org/freedos/files/&quot;&gt;FreeDOS&lt;/a&gt; installation ISO. You'll only need the small base-cd ISO.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Download the relevant updates from hp.com. For me those were:&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;DL140G2 BIOS: SP32670.EXE&lt;/li&gt;&lt;li&gt;DL140G2 BMC: SP33955.EXE&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;DL145G2 BIOS: SP33884.EXE&lt;/li&gt;&lt;li&gt;DL145G2 BMC: SP33956.EXE&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
  
Now lets do this:&lt;br /&gt;&lt;br /&gt;1) Use WinImage to create an empty image of a 1.44MB floppy disk. Save it as floppy.img (select &lt;b&gt;uncompressed&lt;/b&gt; before saving it). floppy.img will serve as a virtual floppy disk for the SoftPAQs. &lt;br /&gt;&lt;br /&gt;2) Copy floppy.img to your Linux desktop, put the Windows machine aside.&lt;br /&gt;Yes, you could use dd + mtools/mformat to do this, but it's so much easier with WinImage.&lt;br /&gt;&lt;br /&gt;3) Create a ISO from the updates. &lt;tt&gt;mkdir temp_dir&lt;/tt&gt;, copy all the EXEs into it; run:&lt;pre&gt;mkisofs -o updates.iso temp_dir
&lt;/pre&gt;This updates.iso will serve as the source for our DOS VM, so we don't have to set up networking inside the VM.&lt;br /&gt;&lt;br /&gt;4) Start VirtualBox, create a new VM, profile type DOS. Create a virtual hard drive for it.&lt;br /&gt;&lt;br /&gt;5) Add the floppy.img and the FreeDOS ISO to your newly created VirtualBOX VM.&lt;br /&gt;&lt;br /&gt;6) Boot the VM, install FreeDOS to the virtual hard drive. Follow the on-screen instructions; xfdisk hanged for me at reboot time, resetting the VM worked fine.&lt;br /&gt;&lt;br /&gt;7) Mount updates.iso in VirtualBox instead of the FreeDOS ISO.&lt;br /&gt;&lt;br /&gt;8) Inside FreeDOS: mkdir c:\tmp ; copy all files from the virtual CD drive (usually D:) to c:\tmp (the ROMpaq stuff won't work properly from the virtual CD drive).&lt;br /&gt;&lt;br /&gt;9) For every single update:&lt;br /&gt;9a) &lt;tt&gt;format a:&lt;/tt&gt;&amp;nbsp; (without this, the extractor will fail to recognize the floppy disk after the first run)&lt;br /&gt;9b) run the &lt;tt&gt;SPxxxx.exe&lt;/tt&gt;, type Agree and have it write the update to drive A:&lt;br /&gt;9c) unmount the floppy.img from VirtualBox, save it away with a meaningful filename. We'll put these images onto the USB key later on.&lt;br /&gt;9d) re-mount floppy.img in VirtualBox&lt;br /&gt;&lt;br /&gt;10) Shut down VirtualBox. Save your VM for the future.&lt;br /&gt;&lt;br /&gt;11) Prepare the USB key. If there's something on it, make a backup - we'll wipe it in the next step.&lt;br /&gt;&lt;br /&gt;12) Write a superfloppy-style DOS filesystem onto the USB key. This will allow most BIOSes to boot from the key. Run:&lt;br /&gt;&lt;pre&gt;mkdosfs -I /dev/sdX
&lt;/pre&gt;&lt;br /&gt;13) Put the syslinux bootloader onto it:&lt;br /&gt;&lt;pre&gt;syslinux /dev/sdX
&lt;/pre&gt;&lt;br /&gt;14) Mount the new filesystem on your USB key, so we can copy more stuff onto it:&lt;pre&gt;mount /dev/sdX /mnt
&lt;/pre&gt;&lt;br /&gt;15) Copy the floppy images you created above to /mnt. Remember that you can't use long filenames (so 8.3 filenames must do; directories are okay).&lt;br /&gt;&lt;br /&gt;16) Create /mnt/syslinux.cfg. This is the configuration file for the bootloader. We'll want syslinux to stop after loading and issue a prompt:&lt;br /&gt;&lt;pre&gt;echo &quot;PROMPT 1&quot; &amp;gt;/mnt/syslinux.cfg
&lt;/pre&gt;
&lt;br /&gt;17) Copy the memdisk kernel. It's a floppy emulator (for A:), which operates in RAM.&lt;br /&gt;&lt;pre&gt;cp /usr/lib/syslinux/memdisk /mnt/&lt;/pre&gt;
&lt;br /&gt;18) For every floppy image you have, put the following lines into your syslinux.cfg. They will tell syslinux what to do with all the files:&lt;br /&gt;&lt;pre&gt;    label IDENTIFIER
        kernel memdisk
        append initrd=FLOPPYIMAGE.NAME
&lt;br /&gt;&lt;/pre&gt;
Obviously, you need to replace FLOPPYIMAGE.NAME and IDENTIFIER. IDENTIFIER will be the string you type at the syslinux prompt after booting from the USB key, to select this particular floppy image.&lt;br /&gt;&lt;br /&gt;19) &lt;code&gt;umount /mnt&lt;/code&gt; and try your fresh 4floppy-in-1key.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Puppet: managing directories recursively</title>
   <link href="http://zeha.at/blog/2008/11/puppet-managing-directories-recursively.html"/>
   <updated>2008-11-26T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2008/11/puppet-managing-directories-recursively</id>
   <content type="html">&lt;p&gt;This is not very obvious from &lt;a href=&quot;http://docs.puppetlabs.com/references/stable/type.html#file&quot;&gt;Puppet's TypeReference&lt;/a&gt;, but you can manage directories in a very interesting way:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Recursively copy a directory from the filestore to a client &lt;b&gt;_and_&lt;/b&gt;&lt;/li&gt;&lt;li&gt;remove all unmanaged files&lt;/li&gt;&lt;/ul&gt;Still not very interesting, but please see the light:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can deploy an empty directory,&lt;/li&gt;&lt;li&gt;Fill this directory using seperate file resources, possibly from other modules (or even other nodes, if you use exported resources)&lt;/li&gt;&lt;li&gt;Everything puppet did not put into the directory gets removed.&lt;/li&gt;&lt;/ul&gt;This yields, very effectively, a fully managed directory with lots of flexibility.&lt;br /&gt;We're using this approach for all sorts of configuration directories, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;APT's sources.list.d and apt.conf.d&lt;/li&gt;&lt;li&gt;Debian-Apache2's sites-available/sites-enabled&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Debian-Exim4's conf.d (including subdirectories)&lt;/li&gt;&lt;li&gt;Bacula director/Munin configuration (in combination with the concatenated_file type)&lt;/li&gt;&lt;/ul&gt; For this to work, you need to do a little bit of work:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;prepare a directory in your module filestore which will be the (usually empty) source directory&lt;br/&gt;I often put a README file in there, explaining what's going on.&lt;/li&gt;
&lt;li&gt;add this code snippet for managing the target directory:&lt;br /&gt;
&lt;pre&gt;file { &quot;/etc/exim4/conf.d&quot;:
  ensure =&amp;gt; directory, # so make this a directory
  recurse =&amp;gt; true, # enable recursive directory management
  purge =&amp;gt; true, # purge all unmanaged junk
  force =&amp;gt; true, # also purge subdirs and links etc.
  owner =&amp;gt; &quot;root&quot;,
  group =&amp;gt; &quot;root&quot;,
  mode =&amp;gt; 0644, # this mode will also apply to files from the source directory
  # puppet will automatically set +x for directories
  source =&amp;gt; &quot;puppet:///exim/exim4-conf.d-empty&quot;,
}
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;add one or more file resources which deploy files into the target directory, example:
&lt;pre&gt;file { &quot;/etc/exim4/conf.d/router/400_testrouter&quot;:
  ensure =&amp;gt; present,
  owner =&amp;gt; &quot;root&quot;,
  group =&amp;gt; &quot;root&quot;,
  mode =&amp;gt; 0644,
  source =&amp;gt; &quot;puppet:///exim/exim4-conf.d/router/400_testrouter&quot;,
}
&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;Because puppet looks for those file resources which manage a sub-dir of the managed directory it is also possible to define a sub-directory with unmanaged files, which will then &lt;b&gt;not&lt;/b&gt; get removed - no magic involved here:&lt;br /&gt;
&lt;pre&gt;file { &quot;/etc/exim4/conf.d/acl&quot;:
  ensure =&amp;gt; directory,
  owner =&amp;gt; &quot;root&quot;,
  group =&amp;gt; &quot;root&quot;,
  mode =&amp;gt; 0755,
}
&lt;/pre&gt;&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>New Tunnelblick version fixes Nameserver problems</title>
   <link href="http://zeha.at/blog/2008/11/new-tunnelblick-version-fixes-nameserver-problems.html"/>
   <updated>2008-11-26T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2008/11/new-tunnelblick-version-fixes-nameserver-problems</id>
   <content type="html">If your company uses &lt;a href=&quot;http://www.openvpn.net/&quot;&gt;OpenVPN&lt;/a&gt; as the VPN-solution for road warriors, and you are using a Mac, you are probably using &lt;a href=&quot;http://code.google.com/p/tunnelblick/&quot;&gt;Tunnelblick&lt;/a&gt;. Tunnelblick is a nice GUI wrapper for OpenVPN on OS X. (I understand it consists of a bit more than a wrapper, but you never see those parts.)&lt;br /&gt;&lt;br /&gt;I recently upgraded to version 3.0b9 which fixed all those nasty crash bugs, but created a new problem for me: it would no longer correctly set the nameserver if told to. Even worse, it would somehow destroy /etc/resolv.conf, so all name resolution went out while using the VPN. Not very useful, so I lived without the company nameservers and tried to remember the important IP addresses instead (uh).&lt;br /&gt;On November 20th a new version was released - 3.0b10 - which fixes this problem, but this is not noted in the &lt;a href=&quot;http://code.google.com/p/tunnelblick/wiki/ReleaseNotes&quot;&gt;ReleaseNotes&lt;/a&gt;. I suspect the bug was fixed in openvpn and not in Tunnelblick, and the new openvpn version which is included in the new Tunnelblick version no longer suffers from this problem.&lt;br /&gt;&lt;br /&gt;Yay.&lt;br /&gt;  
</content>
 </entry>
 
 <entry>
   <title>tcpdump: go non-promiscuous</title>
   <link href="http://zeha.at/blog/2008/11/tcpdump-go-non-promiscuous.html"/>
   <updated>2008-11-25T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2008/11/tcpdump-go-non-promiscuous</id>
   <content type="html">College of mine reminded me today, that &lt;b&gt;one does not want&lt;/b&gt; tcpdump with the NIC in promiscuous mode (the default for tcpdump, turn it off with &lt;tt&gt;-p&lt;/tt&gt;), when debugging problems. And really, there is no other use for tcpdump, than debugging problems. (You don't sniff for fun, do you? And I'd want to use Wireshark in that case anyway.)&lt;br /&gt;&lt;br /&gt;So, why is promiscuous mode a bad idea?&lt;br /&gt;Because tcpdump will show you a very different truth - it will show you what's on the wire, but &lt;b&gt;not&lt;/b&gt; what ethernet packets your machine really accepts under normal conditions - it will only accept packets which destination address is set to the machines ethernet address (plus some multicast stuff, but I'm usually not interested in those). This will especially get you in trouble, if you rely on the IP adresses in tcpdumps output to determine if &quot;this packet is for me&quot;. You will fool yourself into thinking, &quot;oh these packets all arrive here&quot;, and all your further conclusions from this point forward are &lt;i&gt;wrong&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Typical situation for this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Machine M is connected to Router R&lt;/li&gt;&lt;li&gt;Machine M has got more than one IP address, but only the first one is directly bound to the interface&lt;/li&gt;&lt;li&gt;You swap the ethernet card in machine M (or migrate the whole machine to new hardware, probably more common these days)&lt;/li&gt;&lt;li&gt;IP connectivity works, but the secondary IPs are not reachable&lt;/li&gt;&lt;ul&gt;&lt;li&gt;because router R caches the ethernet address for all IPs&lt;/li&gt;&lt;li&gt;only the primary/first IP got updated in the routers ARP cache (= IP address to ethernet address cache)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;tcpdump will show you different truths:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;without ethernet address display turned on, plus NIC in promiscuous mode:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;shows that everything is fine&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;NIC not in promiscous mode:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;would have shown you that the packets don't arrive ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;I failed to recognize this problem two times by now, first time this got us quite some outage time, and Yesterday I saw the symptoms, got the feeling that again the ARP cache is acting up, finally resolved the issue, but I hadn't proof that this was the problem. And I could have had... &lt;i&gt;if I'd used non-promisc mode or turned on ethernet address display in tcpdump.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;  
</content>
 </entry>
 
 <entry>
   <title>No more double-clicks</title>
   <link href="http://zeha.at/blog/2008/11/no-more-double-clicks.html"/>
   <updated>2008-11-06T00:00:00+01:00</updated>
   <id>http://zeha.at/blog/2008/11/no-more-double-clicks</id>
   <content type="html">During a shower thought, I realized that I'm no longer double-clicking, for the most of my computer usage.&lt;br /&gt;What are double clicks useful for? Maximizing windows, opening files, starting apps, etc.&lt;br /&gt;But I'm just not doing this stuff any more - window management is only a keyboard thingie with &lt;a href=&quot;http://xmonad.org/&quot;&gt;xmonad&lt;/a&gt;, maximizing windows on OS X is a single-click anyway, and on Windows I've moved to using the (single-click) buttons, too.&lt;br /&gt;The other tasks are pretty much non-existent with xmonad (and no &quot;desktop manager&quot;).&lt;br /&gt;On OS X app starts only come via quicksilver/the dock; opening files can also be done using drag&amp;amp;drop and I'm increasingly doing this.&lt;br /&gt;&lt;br /&gt;  
</content>
 </entry>
 
 <entry>
   <title>Collecting config from your Puppet clients</title>
   <link href="http://zeha.at/blog/2008/10/collecting-config-from-your-puppet-clients.html"/>
   <updated>2008-10-22T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/collecting-config-from-your-puppet-clients</id>
   <content type="html">I'm doing more boring stuff using Puppet this week, but there are some highlights anyway. I needed to configure Nagios/NRPE-checks on all clients for disk usage, process count, swap space and system load.&lt;br /&gt;In our setup the NRPE daemon needs to have the warning and critical values for those on the client. Configuring this for new clients is trivial, but for old ones it's quite a bit of manual work to collect the old configuration (instead of deploying the defaults and see what happens - avoiding Nagios alert storms is ++).&lt;br /&gt;&lt;br /&gt;Facter + storedconfigs wipes all the manual stuff away:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;deploy a new fact which collects the interesting stuff from nrpe.cfg&lt;/li&gt;&lt;li&gt;write a simple SELECT against the puppet database&lt;/li&gt;&lt;li&gt;(optional) write a simple script which tells you, what &quot;default config&quot; actually means&lt;br /&gt;&lt;/li&gt;&lt;li&gt;enjoy your config values&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The collecter fact:&lt;br /&gt;&lt;pre&gt;Facter.add(&quot;nrpe_collect&quot;) do
	setcode do
		fn = &quot;/etc/nagios/nrpe_local.cfg&quot;
		lines = File.read(fn)
		str = &quot;&quot;
		lines.each {|x|
			if x =~ /check_(disk|procs|swap|load)/
				str+=&quot;;&quot; + x.chomp 
			end
		}
		str
	end
end
&lt;/pre&gt;(Not the most beautiful ruby, but that took me like one minute to think and write.)&lt;br /&gt;&lt;br /&gt;Query the puppet db (syntax for Postgres):
&lt;pre&gt;select hosts.name||' '||value from fact_values &lt;br /&gt;  inner join hosts on fact_values.host_id=hosts.id&lt;br /&gt; &amp;nbsp;inner join fact_names on fact_values.fact_name_id=fact_names.id&lt;br /&gt; &amp;nbsp;where fact_names.name='nrpe_collect';&lt;/pre&gt;
Results:
&lt;pre&gt; vnode02.in.domain.at ;command[check_disk]=/usr/lib/nagios/plugins/check_disk -X nfs -w 20% -c 10%;command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20;command[check_swap]=/usr/lib/nagios/plugins/check_swap -w75% -c50%;command[check_procs]=/usr/lib/nagios/plugins/check_procs -w 1200 -c 1450
 vnode03.in.domain.at ;command[check_disk]=/usr/lib/nagios/plugins/check_disk -X nfs -w 20% -c 10%;command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20;command[check_swap]=/usr/lib/nagios/plugins/check_swap -w75% -c50%;command[check_procs]=/usr/lib/nagios/plugins/check_procs -w 1200 -c 1450
 (...)
&lt;/pre&gt;
&lt;br /&gt;This will probably result in the following manifest tomorrow:&lt;br /&gt;In our allhosts class:&lt;br /&gt;
&lt;pre&gt;# nagios plugin for disk usage
if $disk_warning {
	$disk_warning = $disk_warning	# need this for puppet &amp;lt;0.24.6
} else {
	$disk_warning = &quot;20%&quot;&lt;br /&gt;}
if $disk_critical {
	$disk_critical = $disk_critical
} else {
	$disk_critical = &quot;10%&quot;
}
nagios::plugin { &quot;check_disk&quot;:
	check_script =&amp;gt; &quot;check_disk&quot;,
	args =&amp;gt; &quot;-w $disk_warning -c $disk_critical -X nfs&quot;,
}&lt;/pre&gt;
And the clients which are determined to have special values will get this in their node files:
&lt;pre&gt;	$disk_critical = &quot;5%&quot;
	$disk_warning = &quot;10%&quot;
&lt;/pre&gt; 
</content>
 </entry>
 
 <entry>
   <title>Puppet 0.24.4 + Passenger in production</title>
   <link href="http://zeha.at/blog/2008/10/puppet-0244-passenger-in-production.html"/>
   <updated>2008-10-16T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/puppet-0244-passenger-in-production</id>
   <content type="html">Today we moved our Puppetmaster 0.24.4 installation to Passenger.&lt;br /&gt;&lt;br /&gt;We've previously be running just plain WEBrick, and after adding a few more clients Yesterday, we ran into some troubling issues. A few clients just failed fetching files from the fileserver with &quot;Connection reset by peer&quot; errors.&lt;br /&gt;&lt;br /&gt;Those errors seem to be gone now, and a few short puppetrun-s show that 6 master processes handle our (for now) 30 clients fine - and quick.&lt;br /&gt;&lt;br /&gt;storedconfigs got us into some trouble at first: after the first client run, the master failed with a PGError saying that the PostgreSQL connection went away. I band-aided this with an ActiveRecord::Base.remove_connection in rack.rb after the client request has been executed; this should not do any harm, and works fine so far.&lt;br /&gt;   
</content>
 </entry>
 
 <entry>
   <title>Puppet: Exported Resources</title>
   <link href="http://zeha.at/blog/2008/10/puppet-exported-resources.html"/>
   <updated>2008-10-07T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/puppet-exported-resources</id>
   <content type="html">As of today we're using &lt;a href=&quot;http://projects.puppetlabs.com/projects/puppet/wiki/Exported_Resources&quot;&gt;Exported Resources&lt;/a&gt; to let our &lt;a href=&quot;http://munin.projects.linpro.no/&quot;&gt;Munin&lt;/a&gt; and &lt;a href=&quot;http://www.bacula.org/&quot;&gt;Bacula&lt;/a&gt; servers know about their clients.&lt;br /&gt;&lt;br /&gt;It's really easy to set up. Enable &lt;a href=&quot;http://projects.puppetlabs.com/projects/puppet/wiki/Using_Stored_Configuration&quot;&gt;stored configuration&lt;/a&gt; on the puppetmaster, create a resource the client exports and a place to collect them in the server config.&lt;br /&gt;&lt;br /&gt;Looks like this for the client node config:&lt;br /&gt;&lt;pre class=&quot;literal-block&quot;&gt;  @@file { &quot;/var/local/puppet/munin-nodes/$fqdn&quot;:&lt;br /&gt;    &amp;nbsp;content =&amp;gt; &quot;[$fqdn]\n other munin stuff here&quot;, &lt;br /&gt;     tag =&amp;gt; &quot;munin&quot;,&lt;br /&gt;  }&lt;/pre&gt;And for the server node:&lt;br /&gt;&lt;pre class=&quot;literal-block&quot;&gt;  File &amp;lt;&amp;lt;| tag == 'munin' |&amp;gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;So, what does this do, really?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;when puppet runs on the client node:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;encounter the @@file resource&lt;/li&gt;&lt;li&gt;save the encounter as well as the parameters to the storedconfigs db on the puppetmaster (in our case PostgreSQL of course).&lt;/li&gt;&lt;li&gt;that's it for the client node&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;when puppet runs on the server node:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;encounter the File &amp;lt;&amp;lt;||&amp;gt;&amp;gt; directive&lt;/li&gt;&lt;li&gt;query all the stored @@file encounters from the storedconfigs db&lt;/li&gt;&lt;li&gt;only those matching the specified tag will be used&lt;/li&gt;&lt;li&gt;realize all the matching files onto the server node&lt;/li&gt;&lt;li&gt;=&amp;gt; lots of files in /var/local/puppet/munin-node/&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Easy, huh.&lt;br /&gt;&lt;br /&gt;Note though, that the client node does not send a fully realized template back to puppetmaster, but will send the encounter of the @@file resource and the available $variables etc.&lt;br /&gt;Also note that updates to the @@file resource will only become visible on the server node, after &lt;b&gt;both&lt;/b&gt; the client node and the server node had a puppet run. (The exporting client node run must come before the server node run.)&lt;br /&gt;&lt;br /&gt;Setup notes for puppetmaster on Debian etch:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You probably already run puppet and puppetmaster from &lt;a href=&quot;http://backports.debian.org/&quot;&gt;backports.debian.org&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;That version requires the rails package from testing. It's not in bpo, so either fetch it from testing and directly install it or rebuild it yourself on etch (needs 2 or 3 other packages as well, &lt;b&gt;_if_&lt;/b&gt; you rebuild it). Rebuilding was painless though.&lt;/li&gt;&lt;/ul&gt;One more thing: if you want to manage the munin server, you'll have to use something like &lt;a href=&quot;http://git.black.co.at/?p=module-common;a=blob;f=manifests/defines/concatenated_file.pp;hb=HEAD&quot;&gt;concatenated_file&lt;/a&gt; [from git.black.co.at] to generate munin.conf (as munin can't include a directory into it's configuration).&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Detecting OpenVZ</title>
   <link href="http://zeha.at/blog/2008/10/detecting-openvz.html"/>
   <updated>2008-10-07T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/detecting-openvz</id>
   <content type="html">Reliably detecting if there is an &lt;a href=&quot;http://www.openvz.org/&quot;&gt;OpenVZ&lt;/a&gt; Environment is pretty easy:&lt;br /&gt;&lt;br /&gt;Just check for existance of /proc/user_beancounters.&lt;br /&gt;&lt;br /&gt;But this will only tell you that OpenVZ is there. It won't tell you, if you are inside an unprivileged Virtual Environment (VE) or on the privileged Hardware Node (HN or VE0).&lt;br /&gt;Still an easy check:&lt;br /&gt;&lt;br /&gt;Read /proc/$PID/status and check for &quot;envID: $VEID&quot;. $VEID will be 0 for the Hardware Node (hence the VE0 name). If it's greater than 0, you are inside an unprivileged VE.&lt;br /&gt;&lt;br /&gt;Facter 1.5.3 will probably have support for &lt;a href=&quot;http://projects.puppetlabs.com/issues/show/1634&quot;&gt;this&lt;/a&gt;.  
</content>
 </entry>
 
 <entry>
   <title>Puppet 0.25.x + Passenger</title>
   <link href="http://zeha.at/blog/2008/10/puppet-025x-passenger.html"/>
   <updated>2008-10-04T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/puppet-025x-passenger</id>
   <content type="html"> In my &lt;a href=&quot;http://zeha.at/blog/2008/09/puppet-passenger.html&quot;&gt;previous entry&lt;/a&gt; about Puppet I was talking about using Puppet 0.24.6 (unreleased) inside Apache. (More specifically: running puppetmaster with Passenger in Apache).&lt;br /&gt;&lt;br /&gt;I've now got a working code base for Puppet 0.25.x. + Passenger.&lt;br /&gt;&lt;br /&gt;See for yourself:&lt;br /&gt;&lt;a href=&quot;http://github.com/zeha/puppet-rack/commits/feature/rack/&quot;&gt;http://github.com/zeha/puppet-rack/commits/feature/rack/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately it seems like the current Puppet 0.25.x client can't talk to the corresponding master (regardless of WEBrick or Passenger), as not all required handlers/methods are implemented in the new REST interface.&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>HP ProLiant Resources</title>
   <link href="http://zeha.at/blog/2008/10/hp-proliant-resources.html"/>
   <updated>2008-10-01T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/10/hp-proliant-resources</id>
   <content type="html">&lt;div&gt;Your tools of trade if you're working with HP ProLiant 3xx+ hardware. I've only got DL360s, DL380s and a few DL320s here at work, so can't say anything about the bigger ones. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; white-space: pre-wrap; font-weight: bold;&quot;&gt;HP SmartStart or Firmware Update CDs&lt;/span&gt;&lt;/div&gt;&lt;div&gt;You should know them. SmartStart usually comes with the server, but hp.com obviously has newer versions. SmartStart comes in handy when configuring complex RAID stuff (more than one logical drive per array, something you can't do from the rom-based tool). Fimware maintenance CDs are one-shot firmware upgrades for your machine, so get them from hp.com too.&lt;/div&gt;

Yep, you can PXE-boot those. &lt;a href=&quot;http://forums11.itrc.hp.com/service/forums/questionanswer.do?admit=109447626+1222894046516+28353475&amp;amp;threadId=1007139&quot;&gt;This HP-ITRC forum entry&lt;/a&gt; has the details including an awesome PDF &lt;form mt:asset-id=&quot;1&quot; class=&quot;mt-enclosure mt-enclosure-file&quot; style=&quot;display: inline;&quot;&gt;&lt;a href=&quot;http://zeha.at/blog/2008/10/01/PXE%20Booting%20HP%20SmartStart%20or%20Firmware%20Update%20CDs.pdf&quot;&gt;(local copy of awesome pdf).&lt;/a&gt;&lt;/form&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My recommendation: have both CDs on your boot server (and in your toolbox), but don't rely on the firmware update being functional when booted from the network - I saw problems when the NIC firmware got updated. Also I had problems with NFS with Release 8.20, but CIFS worked fine for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, keep copies of the older CD versions, &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;if&lt;/span&gt; you've got older hardware. HP sometimes drop support for older hardware from newer CD releases. (Space constraints, etc.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;


&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; white-space: pre-wrap; font-weight: bold;&quot;&gt;QuickSpecs: Hardware Specifications&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Bookmark the QuickSpecs links for your hardware. Need to know &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;exact&lt;/span&gt; physical dimensions? Maximum RAM module count? How RAMs need to be installed for your required RAM configuration? That one box is maxed out on CPU and you need to find faster CPUs? QuickSpecs have the answers. &lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://h18004.www1.hp.com/products/quickspecs/12476_div/12476_div.html&quot; style=&quot;text-decoration: underline; &quot;&gt;DL360G5&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://h18004.www1.hp.com/products/quickspecs/12477_div/12477_div.html&quot;&gt;DL380G5&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://h18004.www1.hp.com/products/quickspecs/12571_div/12571_div.html&quot; style=&quot;text-decoration: underline; &quot;&gt;DL320s&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=hp+proliant+quickspecs+filetype%3Ahtml+site%3Ahp.com&quot;&gt;Google knows them all&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; white-space: pre-wrap; font-weight: bold;&quot;&gt;Proliant ILO2 Hardware Health Monitoring using Nagios&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;See this &lt;a href=&quot;http://blog.insidesystems.net/articles/2007/09/05/monitoring-ilo2-with-nagios&quot; style=&quot;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.insidesystems.net/articles/2007/09/05/monitoring-ilo2-with-nagios&quot;&gt;insidesystems.net blog article&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;


&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; white-space: pre-wrap; font-weight: bold;&quot;&gt;IT Resource Center&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;Hosts Warranty Check, KB, Support Case Manager. You will need one of them at some point.&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.itrc.hp.com/&quot;&gt;HP ITRC Homepage&lt;/a&gt;&lt;/div&gt;&lt;div&gt;ITRC logins are not the hp.com passport, so one more login to save.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; white-space: pre-wrap; font-weight: bold;&quot;&gt;Care Packs / Hardware support / Parts replacement&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;Care Packs are warranty extensions. And sometimes also software support.&lt;/div&gt;&lt;div&gt;Lookup tool for your hardware: &lt;a href=&quot;http://h30125.www3.hp.com/csn/salesmktg/elfpack/elf_nonlkup_ctrylang.asp?code=ELNL&quot; style=&quot;text-decoration: underline; &quot;&gt;Here&lt;/a&gt;. IE only. Doesn't work sometimes. Have hardware Part and Serial number ready.&lt;/div&gt;&lt;div&gt;If your product is wrong in their database, mail them, they can fix that. (I had an MSA60 recognized as a 6412 enclosure.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Your hardware QuickSpecs tell you about the included warranty (for most Proliant models this is 3Yrs 9x5 NBD by now), and what Care Pack options are available.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, when contacting HP always have your hardware P/N and S/N ready, you'll need them. Sometimes you will also need the purchase date and (maybe) a copy of the invoice (mostly only if you are approaching end of warranty period). Best to document all of this when you deploy the server for the first time.&lt;/div&gt;&lt;div&gt;Store your HP customer number in your documentation. Saves you quite some time on the phone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another time I'll talk a bit about the basic software components that ship with ProLiants.&lt;/div&gt; 
</content>
 </entry>
 
 <entry>
   <title>Puppet + Passenger</title>
   <link href="http://zeha.at/blog/2008/09/puppet-passenger.html"/>
   <updated>2008-09-29T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/09/puppet-passenger</id>
   <content type="html">&lt;p&gt;I've been working the last few days on getting puppetmaster (the &lt;a href=&quot;http://www.puppetlabs.com/puppet/&quot;&gt;Puppet&lt;/a&gt; server) running inside Apache, using &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;font style=&quot;font-size: 1.5625em;&quot;&gt;Why Passenger?&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Simple answer: for the performance. We currently have over 150 servers (many of the virtual) to manage. Right now only a small subset of these servers is running the puppet client, but I'm looking forward to the point where we will manage all of them using puppet.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;http://projects.puppetlabs.com/projects/puppet/wiki/Using_Mongrel&quot;&gt;puppet docs&lt;/a&gt; have to say this about scaling:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;Mongrel scales much better than WEBrick, at least partially because
it allows you to run multiple processes serving the same pool of
clients on the same host. WEBrick only uses Ruby's threading, which
does not scale beyond one processor, and it appears that WEBrick starts
dropping connections beyond about 2 concurrent connections.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;If you're getting connection-reset or End-of-file errors, you should
try Mongrel. As more people try it and it proves to be stable, it will
eventually become the preferred serving platform for the master.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;While I understand that WEBrick is more or less just a development web server, I also know from other projects that Mongrel just doesn't cut it. The puppet way of running mongrel also seems to be even more cumbersome than running mongrel with mongrel-cluster. But, in any case, there is no one monitoring your mongrel processes, to see if they would die and then restart them. And I saw lots of mongrels dieing for various reasons already. (None of them were puppet mongrels though, didn't even bother trying that.)&lt;/p&gt;&lt;p&gt;&lt;font style=&quot;font-size: 1.5625em;&quot;&gt;First Results&lt;/font&gt;&lt;/p&gt;&lt;p&gt;The first result of my effort is a fully working puppetmaster for puppet 0.24.x running as a Passenger app. Technically, it's behaving like a &lt;a href=&quot;http://rack.rubyforge.org/&quot;&gt;rack&lt;/a&gt; application (and my config.ru is using the rack library), so Passenger just auto-discovers it and launches a puppetmaster instance on the first client connect.&lt;/p&gt;&lt;p&gt;All the usual Passenger configuration should apply, including process limits etc.&lt;/p&gt;&lt;p&gt;&lt;font style=&quot;font-size: 1.5625em;&quot;&gt;Caveats&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You may wonder how SSL is handled in this configuration - Apache handles it, just like in a puppetmaster with mongrel setup. This has a few implications: Apache won't start up if the standalone puppetmasterd never started up and created the SSL certificates and CA. Everything else should work just fine.&lt;/p&gt;&lt;p&gt;There's also another catch: Passenger will &lt;b&gt;not&lt;/b&gt; start an application as root, but always as the designated application user. Therefore puppetmaster will not create all the usual stuff (== no manifest check). This needs to be done by the standalone puppetmasterd, at least once.&lt;/p&gt;&lt;font style=&quot;font-size: 1.5625em;&quot;&gt;Trying it out&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get puppet 0.24.6-pre from &lt;a href=&quot;http://github.com/jamtur01/puppet/tree/0.24.x&quot;&gt;puppet 0.24.x stable branch (at github.com)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Get my patch from &lt;a href=&quot;http://groups.google.com/group/puppet-dev/browse_thread/thread/a3a013723a3769c9&quot;&gt;my puppet-dev posting&lt;/a&gt; or check the &lt;a href=&quot;http://projects.puppetlabs.com/issues/show/1603&quot;&gt;redmine ticket&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Follow the instructions in the &lt;a href=&quot;http://projects.puppetlabs.com/projects/puppet/wiki/Using_Passenger&quot;&gt;puppet wiki&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font style=&quot;font-size: 1.5625em;&quot;&gt;What about 0.25.x?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;I'm still working on that. 0.25.x changed the whole server side, so I've got a lot to do here.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
 

</content>
 </entry>
 
 <entry>
   <title>Debian Installer preseeding: partitioning</title>
   <link href="http://zeha.at/blog/2008/09/debian-installer-preseeding-partitioning.html"/>
   <updated>2008-09-29T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/09/debian-installer-preseeding-partitioning</id>
   <content type="html">For automated Debian installations you usually have two choices:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;scripted install&lt;/li&gt;&lt;li&gt;image based&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I actually don't like image based installs - they are usually a pain to update (with security updates, etc). For our automated installations I therefore chose a scripted approach, based on &lt;a href=&quot;http://d-i.alioth.debian.org/manual/en.i386/apb.html&quot;&gt;preseeding&lt;/a&gt;.&lt;br /&gt;Most things are quite obvious to implement, but there are a few tricks still.&lt;br /&gt;&lt;br /&gt;Partitioning is one of the tasks which is &lt;b&gt;really&lt;/b&gt; tricky. It's so easy to get something wrong, and the installer will just not tell you why it failed.&lt;br /&gt;&lt;br /&gt;What I wanted to achieve:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;16GB root fs on the first HP SmartArray device, outside LVM&lt;/li&gt;&lt;li&gt;rest of the first hpsa device as an LVM PV&lt;/li&gt;&lt;li&gt;one LVM VG called &quot;vg1&quot;&lt;/li&gt;&lt;li&gt;1GB swap inside that&lt;/li&gt;&lt;li&gt;leave the other devices untouched&lt;/li&gt;&lt;/ul&gt;After taking a look at the &lt;a href=&quot;http://d-i.alioth.debian.org/manual/en.i386/apbs04.html#preseed-partman&quot;&gt;relevant docs&lt;/a&gt; it looked like I could preseed the LVM stuff, but in the end I gave up doing that. Time needed to figure out what's wrong just isn't worth it. &lt;br /&gt;&lt;br /&gt;So I ended up doing a simple recipe, which creates a 16GB rootfs (becoming /dev/cciss/c0d0p1) and a swap partition. The swap partition usually ends up being a logical partition, spanning the rest of the blockdevice (becoming /dev/cciss/c0d0p5).&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;

&lt;pre&gt;d-i partman-auto/expert_recipe string regularvnode :: 16000 16000 16000 ext3 $primary{ } $bootable{ } method{ format } format{ } use_filesystem{ } filesystem{ ext3 } mountpoint{ / } .  100 10000 1000000000 linux-swap method{ swap } format{ } .&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This example actually works. So safe it for reference!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the late script I then run parted to drop the swap partition and prepare LVM:&lt;br /&gt;&lt;br /&gt;Example late_script:&lt;br /&gt;&lt;br /&gt;

&lt;pre&gt;echo &quot;Configuring LVM&quot;
swapoff -a
swapoff /dev/cciss/c0d0p5
parted /dev/cciss/c0d0 -- rm 2
parted /dev/cciss/c0d0 -- mkpart primary ext2 16GB -1s
parted /dev/cciss/c0d0 -- toggle 2 lvm
pvcreate /dev/cciss/c0d0p2
apt-install lvm2 # make sure target knows about lvm
&lt;/pre&gt;

All of this was only tested with Debian etch. The lenny installer has a new share of problems, and I haven't successfully seeded it yet.&lt;br /&gt;&lt;br /&gt;One thing to know: you can't have no swap partition. While this works when doing a manual install, it doesn't when seeded. In my experience the installer would just endlessly loop in the partitioner.&lt;br /&gt; 
</content>
 </entry>
 
 <entry>
   <title>Debian Installer preseeding: autostart from PXE</title>
   <link href="http://zeha.at/blog/2008/09/debian-installer-preseeding-autostart-from-pxe.html"/>
   <updated>2008-09-29T00:00:00+02:00</updated>
   <id>http://zeha.at/blog/2008/09/debian-installer-preseeding-autostart-from-pxe</id>
   <content type="html">Assume that you have a fully working Debian Installer preseed configuration. Your x86 target machines do not have CD-ROM drives (and handling CDs is cumbersome), booting from elsewhere is not really an option.&lt;br /&gt;&lt;br /&gt;Solution: boot from PXE. &lt;br /&gt;DHCP, tftpd-hpa and pxelinux are set up easily in just a couple of minutes.&lt;br /&gt;&lt;br /&gt;Here's the pxelinux.cfg configuration as needed to make the installer enter silent mode:&lt;br /&gt;
&lt;pre&gt;label auto&lt;br /&gt;kernel debian/etch/amd64/linux
append vga=normal initrd=debian/etch/amd64/initrd.gz DEBCONF_DEBUG=5 -- auto url=http://debian.namespace.at/d-i/etch/./preseed.cfg locale=en_US interface=auto console-keymaps-at/keymap=us debian-installer/country=AT hostname=installme domain=namespace.at
&lt;/pre&gt;

This will set up an English/US locale, US keyboard, set the preseed.cfg path and kick off installation.
Hostname and domain are optional, but can be used to override the values from DHCP.

DEBCONF_DEBUG=5 is quite useful to see what's currently happening. While the installer is running you can switch to console 4 to see what's going on. After the installation has finished you can take a look at /var/log/installer and see what happened. Saves quite some time while debugging late_scripts.
 
</content>
 </entry>
 
 
</feed>

