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

<channel>
	<title>My Galagzee!</title>
	<atom:link href="http://my.galagzee.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://my.galagzee.com</link>
	<description>Tech in a Galagzee, Not So Far Away.</description>
	<lastBuildDate>Mon, 07 May 2012 03:12:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Ergonomics Recommendations updated!</title>
		<link>http://my.galagzee.com/2012/04/16/ergonomics-recommendations-updated/</link>
		<comments>http://my.galagzee.com/2012/04/16/ergonomics-recommendations-updated/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 20:41:16 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Ergonomics]]></category>
		<category><![CDATA[ergonomics]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[recommendations]]></category>
		<category><![CDATA[resource]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=595</guid>
		<description><![CDATA[I have updated Ville&#8217;s Ergonomics Recommendations as of today. Since the list was previously reviewed and updated a few years ago, many links had to be updated along with the content that now reflects the technology today. Hopefully the resource &#8230; <a href="http://my.galagzee.com/2012/04/16/ergonomics-recommendations-updated/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have updated <a href="http://my.galagzee.com/ergonomics-recommendations/"><strong>Ville&#8217;s Ergonomics Recommendations</strong></a> as of today. Since the list was previously reviewed and updated a few years ago, many links had to be updated along with the content that now reflects the technology today. Hopefully the resource provides useful pointers for anyone looking for information on computer workstation ergonomics!</p>
<p>Note that you can always access the ergonomics resource easily from the blog&#8217;s main menu.</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2012/04/16/ergonomics-recommendations-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chrome v18, self signed certs, &#8220;signed using a weak signature algorithm&#8221;, and an internal CA</title>
		<link>http://my.galagzee.com/2012/04/07/chrome-weak-signature-algorithm/</link>
		<comments>http://my.galagzee.com/2012/04/07/chrome-weak-signature-algorithm/#comments</comments>
		<pubDate>Sun, 08 Apr 2012 04:29:54 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[CA]]></category>
		<category><![CDATA[certificate authority]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[self signed]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[weak signature algorithm]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=566</guid>
		<description><![CDATA[Today when I was accessing some internal resources that are protected with an SSL cert that has been signed by the internal CA, I got an SSL error I hadn&#8217;t seen before: &#8220;This site&#8217;s security certificate is signed using a &#8230; <a href="http://my.galagzee.com/2012/04/07/chrome-weak-signature-algorithm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today when I was accessing some internal resources that are protected with an SSL cert that has been signed by the internal <abbr title="Certificate Authority">CA</abbr>, I got an SSL error I hadn&#8217;t seen before: &#8220;This site&#8217;s security certificate is signed using a weak signature algorithm!&#8221; (see image below). With a quick test it was clear this was only an issue with Chrome. And a few Googlings later I found it was thanks to a recent auto-upgrade to Chrome 18. Most of the Google hits were discussing this error in the context of Facebook – apparently some facebook servers are configured with an old, expired intermediate certificate. But this was not the case with my server cert, signed with the internal CA cert. </p>
<p><img src="http://my.galagzee.com/wp-content/uploads/2012/04/chrome18_weak_signature_algorithm.png" alt="" title="Chrome 18 &quot;Weak signature algorithm&quot; error" width="640" height="238" class="alignnone size-full wp-image-567" /></p>
<p>Digging some more, I came across <a href="http://geekswithblogs.net/dchristiansen/archive/2012/04/02/solved-chrome-v18-self-signed-certs-and-ldquosigned-using-a-again.aspx" target="_blank">a post by Dave Christiansen</a> where he points out an obscurely <a href="http://www.openssl.org/docs/apps/req.html#COMMAND_OPTIONS" target="_blank">documented</a> switch for openssl <em>req</em> command. That works great for single self signed certs, but what if you&#8217;re using an internal CA? The CA cert can be created with &#8220;-sha512&#8243; command using &#8220;openssl req&#8221; (as outlined in Dave&#8217;s post), but then when you sign server certs with &#8220;openssl ca&#8221; – even when you&#8217;ve created the CA cert with the &#8220;-sha512&#8243; switch – Chrome still throws the same error.</p>
<p>The trick is to specify an equally obscurely <a href="http://www.openssl.org/docs/apps/ca.html#CA_OPTIONS" target="_blank">documented</a> argument &#8220;sha512&#8243; for the &#8220;-md&#8221; switch with &#8220;openssl ca&#8221;, like so:</p>
<pre class="brush: plain; title: ; notranslate">
openssl ca -md sha512 -config /etc/ssl/openssl.cnf.internalCA -policy policy_anything -in my.server.name.csr -out my.server.name.pem -keyfile ../private/internalCA.key -days 3650
</pre>
<p>Now the signed server certificate reflects &#8220;sha512RSA&#8221; as the Signature algorithm, and the Chrome error is gone.</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2012/04/07/chrome-weak-signature-algorithm/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Trackball ergonomics</title>
		<link>http://my.galagzee.com/2012/02/21/trackball-ergonomics/</link>
		<comments>http://my.galagzee.com/2012/02/21/trackball-ergonomics/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 17:53:15 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Ergonomics]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Kensington]]></category>
		<category><![CDATA[Logitech]]></category>
		<category><![CDATA[tbe]]></category>
		<category><![CDATA[track ball]]></category>
		<category><![CDATA[trackball]]></category>
		<category><![CDATA[Trackball Explorer]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=527</guid>
		<description><![CDATA[As availability of the remaining Microsoft Trackball Explorers is waning on eBay (or perhaps you&#8217;d like to buy a new device rather than a vintage piece whose bearings have worn down, buttons stick, etc.), I have been considering the alternatives. &#8230; <a href="http://my.galagzee.com/2012/02/21/trackball-ergonomics/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As availability of the remaining <a href="http://my.galagzee.com/2007/07/03/microsoft-trackball-explorer/" TARGET="_blank">Microsoft Trackball Explorers is waning</a> on eBay (or perhaps you&#8217;d like to buy a new device rather than a vintage piece whose bearings have worn down, buttons stick, etc.), I have been considering the alternatives. There are few options, although their ergonomics is not quite as spot on as the venerable <abbr title="TrackBall Explorer">TBE</abbr>&#8216;s which fit like a glove.</p>
<p>But they are workable, and human beings adapt. <img src='http://my.galagzee.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  There is an interesting point I just realized, and I thought of sharing it. Kensington&#8217;s misleadingly named <a href="http://www.kensington.com/kensington/us/us/p/1444/K64325RR/expert-mouse%C2%AE.aspx" target="_blank">Expert <i>Mouse</i></a> works very well in situations where the work surface is low (as it should be for decent ergonomics) so that it is possible to use a third party arm-rest (my preference is <a href="http://www.ergorest.fi/en/forearm_support/" target="_blank">&#8220;330 000&#8243; series ErgoRest forearm support</a>) with it. When your hand &#8216;floats&#8217; above the trackball, it is quite pleasant to use for extended periods of time. </p>
<p>However, in many situations the desk height is too high and Expert Mouse suddenly becomes much less pleasant to use. Its own wrist support is not that comfortable, especially when more of your arm&#8217;s weight is on it. In such situations <a href="http://www.logitech.com/en-us/mice-pointers/trackballs/devices/wireless-trackball-m570" target="_blank">Logitech&#8217;s wireless M570</a> (for some reason &#8220;M570&#8243; sounds like a model of Mercedes-Benz to me <img src='http://my.galagzee.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) works reasonably well. M570 is like a TBE in reverse. For some reason Logitech opted to place the ball at the thumb and button/scroll wheel controls at the forefinger/middle finger. I wish Logitech introduced a model with the controls (trackball/buttons+scroll wheel) reversed and we&#8217;d essentially have a new TBE&#8230; but even as it is, it works reasonably well. If you haven&#8217;t used a thumb-controlled trackball before it will take you a week or two to become fluent with it, and even then the accuracy is not quite as good as it would be with a forefinger-controlled trackball. But it&#8217;s close enough for M570 to work well. And M570 is small enough to lug along with your laptop – a lucky co-incidence since I think M570 works better in less-than-optimal ergonomic settings which you are more likely to encounter while on the road.</p>
<p>N.B.<br />
While both manufacturers provide drivers/utilities for their respective devices, be sure to check out <a href="http://www.highrez.co.uk/downloads/XMouseButtonControl.htm">X-Mouse Button Control</a> software as it is able to teach your trackball cool new workflow-improving tricks!</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2012/02/21/trackball-ergonomics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD: Installed ports in chronological order</title>
		<link>http://my.galagzee.com/2012/01/20/freebsd-installed-ports-in-chronological-order/</link>
		<comments>http://my.galagzee.com/2012/01/20/freebsd-installed-ports-in-chronological-order/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 18:46:41 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[chronologically]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[installed]]></category>
		<category><![CDATA[ports]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=519</guid>
		<description><![CDATA[An easy way to list the installed ports in FreeBSD in chronological order (most recent first):]]></description>
			<content:encoded><![CDATA[<p>An easy way to list the installed ports in FreeBSD in chronological order (most recent first):</p>
<pre class="brush: bash; title: ; notranslate">
ls -latT /var/db/pkg | less
</pre>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2012/01/20/freebsd-installed-ports-in-chronological-order/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NFS automount evolves</title>
		<link>http://my.galagzee.com/2011/12/19/nfs-enforcer/</link>
		<comments>http://my.galagzee.com/2011/12/19/nfs-enforcer/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 20:54:28 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[automount]]></category>
		<category><![CDATA[enforcer]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[self-healing]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=503</guid>
		<description><![CDATA[I&#8217;ve updated the NFS automount script that provides &#8220;self-healing&#8221; NFS mounts. The script now allows a mount to be defined as read-write or read-only, and then subsequently monitors that the share is mounted as R/W or R/O (of course, it &#8230; <a href="http://my.galagzee.com/2011/12/19/nfs-enforcer/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve updated the NFS automount script that provides &#8220;self-healing&#8221; NFS mounts. The script now allows a mount to be defined as read-write or read-only, and then subsequently monitors that the share is mounted as R/W or R/O (of course, it can&#8217;t mount a share that has been shared as R/O as R/W). Both Linux (tested on CentOS 6.1) and FreeBSD versions are provided.</p>
<p>Since various systems can provide cross-mounts via NFS, and they may be started/rebooted at the same time, various shares may or may not be available at each system&#8217;s boot time. By utilizing this script the mounts become available soon after the respective share becomes available (simply adjust the run frequency in crontab to the needs of your specific application). Also, by not adding the NFS mount points in fstab the boot process is not delayed by a share that is not [yet] available.</p>
<p>First for CentOS/Linux:</p>
<pre class="brush: bash; collapse: true; light: false; title: ; toolbar: true; notranslate">
#!/bin/sh

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# set mount/remount request flags
mount=false
remount=false

# remote system name
remotesystem=&quot;$1&quot;

# rw/ro
if [ &quot;$2&quot; = &quot;rw&quot; ]; then
    mountmode=&quot;-w&quot;
else
    mountmode=&quot;-r&quot;
fi

# remote share name
remoteshare=&quot;$3&quot;

# local mount point
mountpoint=&quot;$4&quot;

# file to indicate local mount status
testfile=${mountpoint}/&quot;$5&quot; 

# rw test file
rw_testfile=${mountpoint}/nfs_enforcer_rw_testfile

# command locations
pingcmd=/bin/ping
showmountcmd=/usr/sbin/showmount
grepcmd=/bin/grep
mountcmd=/bin/mount
umountcmd=/bin/umount
statcmd=/usr/bin/stat
touchcmd=/bin/touch
rmcmd=/bin/rm

# --- end variables ---

# make sure the mountpoint is not stale
statresult=`${statcmd} ${mountpoint} 2&gt;&amp;1 | ${grepcmd} &quot;Stale&quot;`

if [ &quot;${statresult}&quot; != &quot;&quot; ]; then
   #result not empty: mountpoint is stale; remove it
   ${umountcmd} -f ${mountpoint}
fi

# ping the remote system (2 sec timeout)
${pingcmd} -w2 -c1 -q ${remotesystem} &gt; /dev/null 2&gt;&amp;1

# make sure the remote system is reachable
if [ &quot;$?&quot; -eq &quot;0&quot; ]; then

   # query the availability of the remote share; not empty result indicates OK
   offsiteshare=`${showmountcmd} -e ${remotesystem} | ${grepcmd} &quot;${remoteshare}&quot;`
   if [ &quot;${offsiteshare}&quot; != &quot;&quot; ] ; then

      # make sure the local mount point (directory) exists (so that [re-]mount, if necessary, is valid)
      if [ -d ${mountpoint} ] ; then

         localmount=`${mountcmd} | ${grepcmd} &quot;${mountpoint}&quot;`

         # make sure the share test file is _not_ present (to make sure the mountpoint is inactive)
         if [ ! -f ${testfile} ] ; then

            # make sure the local mountpoint is inactive (double checking)
            if [ &quot;${localmount}&quot; = &quot;&quot; ] ; then

               # all set to go; request mount
               mount=true
            fi

         else 

            # make sure the local mountpoint is active (double checking)
            if [ &quot;${localmount}&quot; != &quot;&quot; ] ; then

               # attempt to create a test file..
               ${touchcmd} ${rw_testfile} &gt; /dev/null  2&gt;&amp;1

               # ..and test its existence; first handle RW mounted shares:
               if [ -f ${rw_testfile} ] ; then

                  # share was RO requested
                  if [ &quot;$2&quot; = &quot;ro&quot; ]; then
                     remount=true
                  fi

                  # Delete the testfile
                  ${rmcmd} ${rw_testfile}

               # hanle RO mounted shares:
               else

                  # share was RW requested
                  if [ &quot;$2&quot; = &quot;rw&quot; ]; then
                     remount=true
                  fi
               fi
            fi
         fi
      fi
   fi
fi

# perform remount (unmount, request mount)
if $remount ; then
   ${umountcmd} -f ${mountpoint}
   mount=true
fi

# perform mount when so requested
if $mount ; then
   ${mountcmd} ${mountmode} -t nfs ${remotesystem}:${remoteshare} ${mountpoint}
fi

exit 0
</pre>
<p>Then for FreeBSD/UNIX:</p>
<pre class="brush: bash; collapse: true; light: false; title: ; toolbar: true; notranslate">
#!/bin/sh

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/bin

# set mount/remount request flags
mount=false
remount=false

# remote system name
remotesystem=&quot;$1&quot;

# rw/ro
if [ &quot;$2&quot; = &quot;rw&quot; ]; then
    mountmode=&quot;-w&quot;
else
    mountmode=&quot;-r&quot;
fi

# remote share name
remoteshare=&quot;$3&quot;

# local mount point
mountpoint=&quot;$4&quot;

# file to indicate local mount status
testfile=${mountpoint}/&quot;$5&quot; 

# rw test file
rw_testfile=${mountpoint}/nfs_enforcer_rw_testfile

# command locations
pingcmd=/sbin/ping
showmountcmd=/usr/bin/showmount
grepcmd=/usr/bin/grep
mountcmd=/sbin/mount
umountcmd=/sbin/umount
statcmd=stat
touchcmd=/usr/bin/touch
rmcmd=/bin/rm

# --- end variables ---

# make sure the mountpoint is not stale
statresult=`${statcmd} ${mountpoint} 2&gt;&amp;1 | ${grepcmd} &quot;Stale&quot;`

if [ &quot;${statresult}&quot; != &quot;&quot; ]; then
   #result not empty: mountpoint is stale; remove it
   ${umountcmd} -f ${mountpoint}
fi

# ping the remote system (2 sec timeout)
remoteping=`${pingcmd} -c1 -o -q -t2 ${remotesystem} | grep &quot; 0.0%&quot;`

# make sure the remote system is reachable
if [ &quot;${remoteping}&quot; != &quot;&quot; ] ; then

   # query the availability of the remote share; not empty result indicates OK
   offsiteshare=`${showmountcmd} -e ${remotesystem} | ${grepcmd} &quot;${remoteshare}&quot;`
   if [ &quot;${offsiteshare}&quot; != &quot;&quot; ] ; then

      # make sure the local mount point (directory) exists (so that [re-]mount, if necessary, is valid)
      if [ -d ${mountpoint} ] ; then

         localmount=`${mountcmd} | ${grepcmd} &quot;${mountpoint}&quot;`

         # make sure the share test file is _not_ present (to make sure the mountpoint is inactive)
         if [ ! -f ${testfile} ] ; then

            # make sure the local mountpoint is inactive (double checking)
            if [ &quot;${localmount}&quot; = &quot;&quot; ] ; then

               # all set to go; request mount
               mount=true
            fi

         else

            # make sure the local mountpoint is active (double checking)
            if [ &quot;${localmount}&quot; != &quot;&quot; ] ; then

               # attempt to create a test file..
               ${touchcmd} ${rw_testfile} &gt; /dev/null  2&gt;&amp;1

               # ..and test its existence; first handle RW mounted shares:
               if [ -f ${rw_testfile} ] ; then

                  # share was RO requested
                  if [ &quot;$2&quot; = &quot;ro&quot; ]; then
                     remount=true
                  fi

                  # Delete the testfile
                  ${rmcmd} ${rw_testfile}

               # hanle RO mounted shares:
               else

                  # share was RW requested
                  if [ &quot;$2&quot; = &quot;rw&quot; ]; then
                     remount=true
                  fi
               fi
            fi
         fi
      fi
   fi
fi

# perform remount (unmount, request mount)
if $remount ; then
   ${umountcmd} -f ${mountpoint}
   mount=true
fi

# perform mount when so requested
if $mount ; then
   ${mountcmd} ${mountmode} -t nfs ${remotesystem}:${remoteshare} ${mountpoint}
fi

exit 0
</pre>
<p>You should run the automount script from a runfile, like so:</p>
<pre class="brush: plain; title: ; notranslate">
#!/bin/sh

NFS_ENFORCE=/usr/local/sbin/nfs_enforcer

# Separate the following parameters with spaces:
#
# - nfs enforcer command (set above)
# - remote system name (must be resolvable)
# - read/write (rw) or read-only (ro); NOTE: share may be read-only regardless of how this is set
# - remote share name (from remote's /etc/exports)
# - local mount point (existing local directory)
# - share test file (an immutable file on the share)

# e.g.
# $NFS_ENFORCE dbsysvm rw /nfs4shares/conduit /mnt/dbsys_conduit .conduit@dbsysvm
# or (for local remount read-only)
# $NFS_ENFORCE localhost ro /var/web/projects/repository /mnt/rorepo .repository@localhost

$NFS_ENFORCE localhost ro /var/web/projects/repository /mnt/rorepo .repository@localhost

exit 0
</pre>
<p>..and call the the above runfile from crontab:</p>
<pre class="brush: plain; title: ; notranslate">
*/10  *  *  *  *  root  /usr/local/sbin/nfs_enforcer.batch &gt; /dev/null
</pre>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/12/19/nfs-enforcer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sourcing for a new email service</title>
		<link>http://my.galagzee.com/2011/06/17/sourcing-for-new-email-service/</link>
		<comments>http://my.galagzee.com/2011/06/17/sourcing-for-new-email-service/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 03:58:09 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Mail]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[forwarding]]></category>
		<category><![CDATA[fusemail]]></category>
		<category><![CDATA[postini]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=479</guid>
		<description><![CDATA[Couple of years ago I wrote about the initial troubles with Fusemail service not long after having switched to it. The grade for the service level during last couple of years is &#8220;fair&#8221; – the service is usable, and has &#8230; <a href="http://my.galagzee.com/2011/06/17/sourcing-for-new-email-service/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Couple of years ago I wrote about <a href="http://my.galagzee.com/2009/05/03/fusemail-strike-one/">the initial troubles with Fusemail</a> service not long after having switched to it. The grade for the service level during last couple of years is &#8220;fair&#8221; – the service is usable, and has many good features, but its stability is not stellar.  For this reason it is in my plans to move the email service out of Fusemail.. but where to? </p>
<p>There are several hosted email solutions available – such as <a href="http://www.rackspace.com/apps/email_hosting/rackspace_email">Rackspace Webmail</a> or <a href="http://www.bluetie.com/solutions/hostedEmail.php">BlueTie Business Email</a>. From time to time I&#8217;ve reviewed Rackspace&#8217;s features, and among other things they still did not support user-by-user adjustment of spam filter aggressiveness, or the ability to alias users and domains to actual accounts. Especially for the latter reason using Rackspace would be prohibitively expensive for me, so the search had to continue.</p>
<p>I think I have now found a workable solution: an in-house Postfix+Dovecot server with Google Postini as the edge (MX) service. <a href="http://www.postfix.org/">Postfix</a> is an incredibly robust and infinitely configurable mail server that I have only had positive experiences with. But I would rather not have to deal with spam filtering, and I also would rather not have to stress about &#8220;high availability&#8221; of the in-house server. Yes, the server will generally be up and receiving email, but should there be a hardware failure, I would want the inbound mail to be both cached and accessible while the server is repaired. <a href="http://www.google.com/postini/continuity.html">Postini Message Continuity</a> system provides this at $25/year/user (including spam/virus filtering), which roughly equals the annual cost of Fusemail service.  If the receiving email server becomes unavailable, the arrived messages are cached, and are accessible via Gmail.  Once the in-house service is then restored, the cached emails are quickly delivered.</p>
<p>However, one issue remained: in my configuration several of the aliased domains have &#8216;forward&#8217; addresses that don&#8217;t have an associated user account at Fusemail, but that Fusemail has allowed to be forwarded to external destinations without an extra fee (or a separate account). I would not want to have to set up individual accounts at $25/year each to take care of these external forwards. But there is a way! <a href="http://www.google.com/support/forum/p/AppSecurity/thread?tid=5ee5940c3c030bfb&#038;hl=en">Information about the aliased users and domains is retained</a> in the messages as they&#8217;re forwarded by Postini. So by setting up one generic – or a &#8220;forwarder&#8221; – account at Postini, and then aliasing any such external forward accounts to it, it is possible to separate and correctly forward the emails to their intended recipients using Postfix&#8217;s rewriting rules. </p>
<p>Note that the in-house email server will need to be set to receive unauthenticated emails only from Postini&#8217;s IP range; that way spammers can&#8217;t bypass Postini filtering should they discover your SMTP server via port scan (and they will discover it, sooner or later). Also note that while Postini Message Continuity <a href="http://www.google.com/postini/continuity.html">homepage</a> mentions Exchange Server as the in-house mail server, they also provide <a href="http://www.google.com/support/appsecurity/bin/answer.py?hl=en&#038;answer=138232">instructions for how to integrate Postfix</a> (<a href="http://burlingtonitguy.com/business-computer-services/relay-postfix.html">more info</a> can be found on the web).</p>
<p>While this solution does require familiarity with Postfix/Dovecot, it should offer an extremely stable email setup – and maximum amount of control over how email is routed – at a very reasonable cost.</p>
<p>When I get around to implementing this configuration I&#8217;ll write an article or series of articles of the process.  Meanwhile I welcome any feedback, as well as suggestions for other comparable services.  If a stable/high quality, reasonably priced, outsourced solution with good amount of control (equal or better than Fusemail) exists, I would consider it.  But for now it seems that currently the only/best solution that won&#8217;t miss a beat while not breaking the bank is the one I&#8217;ve outlined above.</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/06/17/sourcing-for-new-email-service/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LSI/3Ware 9650SE and ESXi 4.1</title>
		<link>http://my.galagzee.com/2011/06/05/9650se-and-esxi-4-1/</link>
		<comments>http://my.galagzee.com/2011/06/05/9650se-and-esxi-4-1/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 05:06:32 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[Virtualization]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=475</guid>
		<description><![CDATA[I needed to reinstall dev ESXi 4.1. The system has LSI (AMCC, 3Ware..) 9650SE on it, and after a fresh ESXi install the array was nowhere to be found. Oh yes, the drivers are not part of the ESXi installation &#8230; <a href="http://my.galagzee.com/2011/06/05/9650se-and-esxi-4-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I needed to reinstall dev ESXi 4.1. The system has LSI (AMCC, 3Ware..) 9650SE on it, and after a fresh ESXi install the array was nowhere to be found. Oh yes, the drivers are not part of the ESXi installation package (it had been a while since I did the initial install..)! A quick tour around the web quickly produced the patch command:</p>
<p>perl vihostupdate.pl -server x.x.x.x -username root -password &#8220;xxxxxxx&#8221; -b c:\AMCC_2.26.08.035vm40-offline_bundle-179560.zip -i</p>
<p>I recalled I had in the past renamed the lengthy bundle file to &#8216;offline_bundle.zip&#8217;, and did so this time, too, to make it easier to type the command. Executing the command (with the driver bundle named as c:\offline_bundle.zip), I got an error message: &#8220;No matching bulletin or VIB was found in the metadata.&#8221; Some more Googling, and I found a <a href="http://www.righteoushack.net/?p=423">mention</a>: <em>»After shorting</em> [sic] <em>the name of the original file to offline-bundle.zip and re-running the command, I did get positive feedback in the form of this message: The update completed successfully.»</em> So the name has something to do with it!</p>
<p>Interestingly my experience was exactly the opposite than that I found in a blog post from 2009: the driver bundle only worked with its original name (so the above command—which can also be found in the instructions—is the correct one). So not only should one read the instructions, but follow them, too! <img src='http://my.galagzee.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/06/05/9650se-and-esxi-4-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NFS automount, Linux (CentOS) version</title>
		<link>http://my.galagzee.com/2011/05/26/nfs-automount-linux-version/</link>
		<comments>http://my.galagzee.com/2011/05/26/nfs-automount-linux-version/#comments</comments>
		<pubDate>Fri, 27 May 2011 03:51:12 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[automount]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[mount]]></category>
		<category><![CDATA[nfs]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=470</guid>
		<description><![CDATA[Last summer I posted a script that would repeatedly (via cron) check on a availability and status of a NFS mount, and attempt to keep it mounted if possible. That script was written for (Free)BSD. Below is a slightly modified &#8230; <a href="http://my.galagzee.com/2011/05/26/nfs-automount-linux-version/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last summer <a href="http://my.galagzee.com/2010/07/23/mounting-nfs-share-after-boot-and-checking-up-on-it-periodically/">I posted a script</a> that would repeatedly (via cron) check on a availability and status of a NFS mount, and attempt to keep it mounted if possible. That script was written for (Free)BSD. Below is a slightly modified version that runs on Linux (in this case, CentOS).</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# remote system name
remotesystem=sunrise.externalized.net

# remote share name
remoteshare=/nfs4exports/minecraft-backups

# local mount point
mountpoint=/bak/remote

# file to indicate local mount status
testfile=$mountpoint/.minecraftbackups

# command locations
pingcmd=/bin/ping
showmountcmd=/usr/sbin/showmount
grepcmd=/bin/grep
mountcmd=/bin/mount
umountcmd=/bin/umount
statcmd=/usr/bin/stat

# --- end variables ---

# make sure the mountpoint is not stale
testvar=`${statcmd} ${mountpoint} 2&gt;&amp;1 | ${grepcmd} &quot;Stale&quot;`

if [ &quot;${testvar}&quot; != &quot;&quot; ]; then
   #result not empty: mountpoint is stale; remove it
   ${umountcmd} -f ${mountpoint}
fi

# ping the remote system (2 sec timeout)
${pingcmd} -w2 -c1 -q ${remotesystem} &gt; /dev/null 2&gt;&amp;1

if [ &quot;$?&quot; -eq &quot;0&quot; ]; then

   # server is available so query availability of the remote share; not empty is OK
   offsiteshare=`${showmountcmd} -e ${remotesystem} | ${grepcmd} &quot;${remoteshare}&quot;`

   # make sure the local mountpoint is not active
   localmount=`${mountcmd} | ${grepcmd} &quot;${mountpoint}&quot;`

   if [ &quot;${offsiteshare}&quot; != &quot;&quot; ] ; then
      if [ ! -e ${testfile} ] ; then
         if [ &quot;${localmount}&quot; = &quot;&quot; ] ; then
            ${mountcmd} -w -t nfs ${remotesystem}:${remoteshare} ${mountpoint}
         fi
      fi
   fi
fi

exit 0</pre>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/05/26/nfs-automount-linux-version/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Marvell 88E8056 and ESXi 4.1</title>
		<link>http://my.galagzee.com/2011/05/25/marvell-88e8056-and-esxi-4-1/</link>
		<comments>http://my.galagzee.com/2011/05/25/marvell-88e8056-and-esxi-4-1/#comments</comments>
		<pubDate>Wed, 25 May 2011 05:43:23 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[esxi]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=463</guid>
		<description><![CDATA[So I have an older development/experimental server that runs couple of VMs on ESXi 4.1. The server&#8217;s motherboard (ASUS P5BV-C/4L) is from an old workstation, and it has integrated quad NICs which would be nice to be able to use.. &#8230; <a href="http://my.galagzee.com/2011/05/25/marvell-88e8056-and-esxi-4-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So I have an older development/experimental server that runs couple of VMs on ESXi 4.1. The server&#8217;s motherboard (ASUS P5BV-C/4L) is from an old workstation, and it has integrated quad NICs which would be nice to be able to use.. except that the default build of ESXi 4.1 doesn&#8217;t see them (even though ESXi 4.1 <a href="http://www.vm-help.com/esx41/sky2_driver.php">technically supports</a> Marvell 88E8056 NICs). </p>
<p>There are <a href="http://www.kernelcrash.com/blog/using-a-marvell-lan-card-with-esxi-4/2009/08/22/">several</a> <a href="http://neowongch.wordpress.com/2010/08/13/get-marvell-88e8056-working-on-esxi-4-1/">pages</a> that discuss the issue extensively, and have a lot of good information on them. Yet <a href="http://dischord.org/blog/2011/03/28/marvell-88e8056-and-vsphere-4-1/">another page</a> has a quick low down on how to get the driver properly installed.</p>
<p>However, having not worked on ESXi CLI for some time I had forgotten, for example, that busybox that ESXi uses wipes the root files on every reboot. After a while I recalled (from an old note) that to save changes to the /etc/vmware/simple.map I would need to execute <em>/sbin/backup.sh 0 /bootbank/</em> after making the edits. But even that was unecessary. </p>
<p>One sentence on the <a href="http://dischord.org/blog/2011/03/28/marvell-88e8056-and-vsphere-4-1/">brief recap page</a>, would have saved me couple of hours tonight. So here it is: <strong>»Just upload the attached <a href="http://dischord.org/misc/dump/oem.tgz">oem.tgz</a> into /bootbank folder with scp, then reboot, and you&#8217;re done!»</strong> And when you do that, you <em>are</em> done – the pre-prepared oem.tgz works perfectly!</p>
<p>Yes, had I known, I would&#8217;ve known, but I didn&#8217;t. <img src='http://my.galagzee.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Hopefully this saves time for someone else!</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/05/25/marvell-88e8056-and-esxi-4-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Expanding VMware Workstation VM partition</title>
		<link>http://my.galagzee.com/2011/01/01/expanding-vmware-workstation-partition/</link>
		<comments>http://my.galagzee.com/2011/01/01/expanding-vmware-workstation-partition/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 04:23:23 +0000</pubDate>
		<dc:creator>Ville Walveranta</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[expanding]]></category>
		<category><![CDATA[extending]]></category>
		<category><![CDATA[partition]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://my.galagzee.com/?p=455</guid>
		<description><![CDATA[Few days ago I set up CentOS 5.5 on VMware Workstation 7.1 for PHP debugging. During the installation I shrunk the suggested VM disk size from the default 20Gb to 10Gb thinking that there&#8217;ll be plenty of space (being more &#8230; <a href="http://my.galagzee.com/2011/01/01/expanding-vmware-workstation-partition/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Few days ago I set up CentOS 5.5 on VMware Workstation 7.1 for PHP debugging. During the installation I shrunk the suggested VM disk size from the default 20Gb to 10Gb thinking that there&#8217;ll be plenty of space (being more familiar with FreeBSD systems that generally have a rather small footprint). But once I had completed the installation the root partition had just couple of hundred megabytes of free space remaining. Argh! </p>
<p>After looking around for the solution for a few moments I downloaded the free <a href="http://partedmagic.com" target="_blank"><strong>Parted Magic Live CD</strong></a> that includes <a href="http://gparted.sourceforge.net/" target="_blank">GParted</a>, <a href="http://clonezilla.org/" target="_blank">Clonezilla</a> and number of other utilities in an easy to use package. In the end extending the CentOS partition was a snap. After shutting down the CentOS VM, I first extended the VM disk in Workstation 7.1 VM settings from 10Gb to 20Gb in VM settings > Hard Disk > Utilities > Expand.</p>
<p>Then I edited the VM&#8217;s .vmx file by adding the following statement:</p>
<p>bios.bootDelay = &#8220;10000&#8243;</p>
<p>This slows down the VM&#8217;s boot sequence by adding a 10 second delay so that it&#8217;s easier to focus the VM screen (with a click of a mouse) and hit F2 before the VM startup commences. Note that you need to click the area of the VM screen where POST (boot) info is being displayed to give it focus; clicking on the similarly colored (black) area closer to the edges of the VM display is at ths point (during the boot) actually outside of the VM &#8220;screen&#8221;, hence it will not focus the VM, and without focus clicking on F2 does nothing. The other alternative (to ensure that VM enters its virtual BIOS settings) is to add a statement:</p>
<p>bios.forceSetupOnce = &#8220;TRUE&#8221;</p>
<p>.. in the .vmx file.</p>
<p>Once in VM BIOS settings I changed the boot order so that the CD/DVD drive is now the first boot device. I then popped the Parted Magic CD in the drive and rebooted the VM. With Parted Magic up and running I started Partition Editor (GParted), and moved the 1.4Gb linux-swap partition to the end of the newly expanded 20Gb disk space. Next I expanded the third partition (&#8220;/home&#8221;) to total of 6.8Gb, and moved it also to the right, back to back with the swap partition. Finally I gave the root partition (&#8220;/&#8221;) the rest of the free space giving it total size of 11.7Gb. Once the operations had been applied (requested changes written to the disk) I exited GParted and shut down Parted Magic choosing &#8220;reboot system&#8221; on exit. </p>
<p>Once the CentOS finished boothing, I checked the partition sizes with &#8216;df -h&#8217; to confirm that root and home partitions reflect the extra space assigned to them. You might also want to restore the hard drive as the primary boot device for the VM in the VM BIOS settings so that a CD/DVD you might later forget in the CD/DVD drive won&#8217;t try to boot instead of the VM.</p>
]]></content:encoded>
			<wfw:commentRss>http://my.galagzee.com/2011/01/01/expanding-vmware-workstation-partition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

