<?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>Michael Kuron&#039;s Blog</title>
	<atom:link href="http://blog.michael.kuron-germany.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.michael.kuron-germany.de</link>
	<description></description>
	<lastBuildDate>Sun, 09 Jun 2013 12:11:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>HP StorageWorks P2000 G3 and ATTO Thunderlink FC 1082</title>
		<link>http://blog.michael.kuron-germany.de/2013/06/hp-storageworks-p2000-g3-and-atto-thunderlink-fc-1082/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/06/hp-storageworks-p2000-g3-and-atto-thunderlink-fc-1082/#comments</comments>
		<pubDate>Sat, 08 Jun 2013 16:02:22 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Server]]></category>
		<category><![CDATA[atto]]></category>
		<category><![CDATA[dot hill]]></category>
		<category><![CDATA[dothill]]></category>
		<category><![CDATA[esxi]]></category>
		<category><![CDATA[fc]]></category>
		<category><![CDATA[fc1082]]></category>
		<category><![CDATA[fibre channel]]></category>
		<category><![CDATA[hewlett-packard]]></category>
		<category><![CDATA[hp]]></category>
		<category><![CDATA[mac mini]]></category>
		<category><![CDATA[mac os x server]]></category>
		<category><![CDATA[msa2000]]></category>
		<category><![CDATA[p2000]]></category>
		<category><![CDATA[san]]></category>
		<category><![CDATA[storageworks]]></category>
		<category><![CDATA[thunderbolt]]></category>
		<category><![CDATA[thunderlink]]></category>
		<category><![CDATA[xsan]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=343</guid>
		<description><![CDATA[Hardware To replace a 2006 Xserve and a 7TB Xserve RAID at the university, we recently got a Mac mini server, an ATTO ThunderLink FC 1082 Thunderbolt to 8Gbit Fibre Channel adapter, and a HP StorageWorks P2000 G3 MSA FC Dual Controller LFF (specifically, model number AP845B). The P2000 is not explicitly on ATTO&#8217;s compatibility matrix, but when [...]]]></description>
				<content:encoded><![CDATA[<h3>Hardware</h3>
<p>To replace a 2006 Xserve and a 7TB Xserve RAID at the university, we recently got a Mac mini server, an <a href="https://www.attotech.com/products/product.php?cat=16&amp;scat=29&amp;prod=100&amp;sku=TLFC-1082-D00">ATTO ThunderLink FC 1082</a> Thunderbolt to 8Gbit Fibre Channel adapter, and a <a href="http://h18000.www1.hp.com/products/quickspecs/13551_div/13551_div.html">HP StorageWorks P2000 G3 MSA FC Dual Controller LFF</a> (specifically, model number AP845B).</p>
<p>The P2000 is not explicitly on ATTO&#8217;s compatibility matrix, but when I asked their tech support about it, they said it was compatible and provided me with a pre-release version of their Multi Path Director driver for the Thunderlink which is officially compatible.</p>
<p>Evidently, the P2000 G3 is an OEM&#8217;d version of the <a href="http://www.dothill.com/dothill-products/assuredsan-3000-series/">Dot Hill AssuredSAN 3000 Series</a> (specifically, the 3730), which is on ATTO&#8217;s compatibility list, so I assume the standard driver would work just as well.</p>
<p>We chose the Thunderlink/P2000 combo over a <a href="http://www.promise.com/storage/raid_category.aspx?region=en-US&amp;m=574&amp;rsn=40&amp;statistic=Mac">Promise</a> solution because it was cheaper, fully 8Gbit capable and had four host ports. Also, I know that HP&#8217;s tech support is good and they&#8217;ll have spare parts around for many years. Plus, the P2000 is VMWare ESXi certified.</p>
<p>The obvious downside to the P2000 is that the disk bays do not have standard SAS connectors but require an interposer board to convert to a <a href="http://en.wikipedia.org/wiki/Fibre_Channel_electrical_interface#40-pin_.22SCA-2.22_disk_connector">SCA-2/SCA-40 connector</a>. The included slot blinds are in fact blinds and cannot be used to mount an actual drive. You can get empty caddies/trays for the P2000 on eBay or from some used SAN equipment dealer for around 100 euros, or buy your hard drives from HP for a premium of around 100-150 euros over the plain drives. (The interposer board itself appears to get sold under the model numbers 371595-001 or 60-272-02 on eBay, but I haven&#8217;t found a model number for the caddy frame yet.) If you&#8217;re buying plain drives, you can check <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c00305257#A8">HP&#8217;s hard drive model matrix</a> to see what model of drive an HP part number corresponds to. For example, the 3TB SAS drive QK703A is a Seagate Constellation ES.2 ST33000650SS and the 2TB SAS drive AW555A, which we ordered, is a Seagate Constellation ES ST2000NM0001).</p>
<h3>Firmware</h3>
<p>I have verified that the firmwares are interchangeable between the AssuredSAN 3000 and the P2000 G3: I downloaded and extracted the TS250R023 from both <a href="http://crc.dothill.com">Dot Hill</a> and <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/DriverDownload.jsp?lang=en&amp;cc=us&amp;prodNameId=4118560&amp;taskId=135&amp;prodTypeId=12169&amp;prodSeriesId=4118559&amp;lang=en&amp;cc=us">HP</a> and both contain a file named TS250R023.bin with an MD5 sum of 7b267cc4178aef53f7d3487e356f8435. I assume that&#8217;s the file that can be uploaded through the web interface.</p>
<p>To extract the HP firmware, download the Linux updater (e.g. CP020030.scexe) and use a hex editor to find the offset of the line break after the end of the shell script at the beginning, then use dd to skip the plain text: <em>dd if=CP020030.scexe bs=1 skip=8602 of=scexe_tmp24664.tar.gz</em>. Now you can <em>tar zxf scexe_tmp24664.tar.gz</em> and pull out the TS250R023.bin.</p>
<p>To extract the TS250R023.bin, simply <em>tar xf TS250R023.bin</em>. If you want to poke around the root filesystem of the Management Controller, <em>unsquashfs mc/components/app.squashfs</em>. You may need to compile <a href="http://squashfs.sourceforge.net">squashfs-tools</a> yourself to get LZMA support (edit squashfs-tools/Makefile, set LZMA_SUPPORT=1 or LZMA_XZ_SUPPORT=1 and <em>apt-get install liblzma-dev zlib1g-dev liblz-dev</em>).</p>
<h3>Setup and configuration</h3>
<p>After unpacking the device, I first updated the firmware to the most recent version available from <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/DriverDownload.jsp?lang=en&amp;cc=us&amp;prodNameId=4118560&amp;taskId=135&amp;prodTypeId=12169&amp;prodSeriesId=4118559&amp;lang=en&amp;cc=us">HP</a>. Before you do that (I used the Windows utility), make sure to set static IP addresses or DHCP static mappings (otherwise the update might fail due to changing addresses). After you set the password for the <em>manage</em> user, you&#8217;ll need to SSH into the device to change the password on a hidden <em>admin</em> account about which HP issued a <a href="http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c02662287">security advisory back in December 2010</a> (but still hasn&#8217;t fixed it in the firmware).</p>
<p>I created a RAID5 out of 4x 2TB drives and dedicated a fifth one as a global spare. In the global disk settings, I enabled spindown so the spare would not be running unnecessarily. The RAID initialization took close to two days, but as that runs in the background, you can already start using it.</p>
<p>Then I created a couple volumes (setting the default mapping to not mapped) and mapped two of them to our Mac mini server (on the Thunderlink) and a third to our two VMWare ESXi servers (on Qlogic QLE2460 HBAs). This was much easier to do than on our old Xserve RAID and I love that I can start out with smaller volumes (sized appropriately that they&#8217;ll last for the next year) and expand them later on. The P2000 does not do thin provisioning, but you can&#8217;t really expect that at this price point.</p>
<p><strong>This article will continue to be updated over the next couple weeks (and I might add some photos and screenshots) as we explore the device further:</strong></p>
<p>We want to connect two ESXi 5.1 servers, two Mac mini Servers with Mac OS X 10.8 and an old Xserve with Mac OS X 10.6. We might even try an Xsan between the Xserve and one of the Mac minis</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/06/hp-storageworks-p2000-g3-and-atto-thunderlink-fc-1082/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tracking DHL Freight packages</title>
		<link>http://blog.michael.kuron-germany.de/2013/05/tracking-dhl-freight-packages/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/05/tracking-dhl-freight-packages/#comments</comments>
		<pubDate>Fri, 31 May 2013 15:10:05 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=341</guid>
		<description><![CDATA[I recently got a shipment notification with a tracking number starting with JND and followed by 17 digits, half of them zero. After searching around for a while, I figured it was shipped by DHL Freight. It&#8217;s kind of hard to find the tracking page for that and it&#8217;s not supported by Delivery Status, so [...]]]></description>
				<content:encoded><![CDATA[<p>I recently got a shipment notification with a tracking number starting with JND and followed by 17 digits, half of them zero. After searching around for a while, I figured it was shipped by DHL Freight. It&#8217;s kind of hard to find the tracking page for that and it&#8217;s not supported by <a href="http://junecloud.com/software/iphone/delivery-status-touch.html">Delivery Status</a>, so here&#8217;s the link: <a href="https://activetracing.dhl.com/DatPublic/datSelection.do">https://activetracing.dhl.com/</a>. It&#8217;s hidden on the DHL web site; you can find it by going to the Logistics tab in the tracking section and clicking &#8220;Road and rail&#8221;.</p>
<hr />
<p>Ich habe kürzlich eine Versandbenachrichtigung mit einer Trackingnummer erhalten, die mit JND anfängt. Wie sich herausstellt, gehören solche Trackingnummern zu DHL Freight. Die Tracking-Seite ist etwas schwierig zu finden und <a href="http://junecloud.com/software/iphone/delivery-status-touch.html">Delivery Status</a> unterstützt DHL Freight auch nicht. Der Direktlink ist <a href="https://activetracing.dhl.com/DatPublic/datSelection.do">https://activetracing.dhl.com/</a> und er ist recht versteckt auf der DHL-Webseite: Man muss auf das Logistik-Tab gehen und dort auf &#8220;Land- und Schienenverkehre&#8221; klicken.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/05/tracking-dhl-freight-packages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two-legged OAuth between PHP and JIRA</title>
		<link>http://blog.michael.kuron-germany.de/2013/04/two-legged-oauth-between-php-and-jira/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/04/two-legged-oauth-between-php-and-jira/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 17:44:34 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[JIRA]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=336</guid>
		<description><![CDATA[If you want to use the JIRA REST API without storing plain-text passwords in your application, you need to use OAuth. If you want the application to directly talk to JIRA without binding it to a JIRA user account, you need to use 2-legged OAuth. JIRA requires RSA keys for 2-legged OAuth. Zend_OAuth supports RSA-signed [...]]]></description>
				<content:encoded><![CDATA[<p>If you want to use the JIRA REST API without storing plain-text passwords in your application, you need to use OAuth. If you want the application to directly talk to JIRA without binding it to a JIRA user account, you need to use 2-legged OAuth. JIRA requires RSA keys for 2-legged OAuth. Zend_OAuth supports RSA-signed requests, but this is somewhat undocumented. Also, the Java OAuth library used by JIRA appears to have a bug that requires the field <em>oauth_token</em> in the <em>Authorization</em> header to be present but blank for 2-legged authentication (if it&#8217;s not present, it raises uncaught exceptions&#8230;). Lastly, you have to use the exact server name that JIRA thinks it has. Finding out all this took me quite a while, so here is the full code:</p>
<h3>PHP Code</h3>
<pre>require_once 'Zend/Oauth.php';
require_once 'Zend/Oauth/Consumer.php';
require_once 'Zend/Crypt/Rsa/Key/Private.php';
require_once 'Zend/Crypt/Rsa/Key/Public.php';</pre>
<pre>$jql = 'project = KB';
$max = 50;
$server = 'https://www.example.com/jira/'; // this must not be http://localhost:8080. It must match the proxyName, proxyPort and Context configured in ./conf/server.xml in JIRA. Otherwise you get signature_invalid exceptions
$query = array('jql' =&gt; $jql, 'startAt' =&gt; '0', 'maxResults' =&gt; $max, 'fields' =&gt; 'summary,assignee,duedate,priority')</pre>
<pre>$privkey = new Zend_Crypt_Rsa_Key_Private('jira.pem');
$pubkey = new Zend_Crypt_Rsa_Key_Public('jira.pub');
$consumer = 'samplescript';</pre>
<pre>$query['oauth_token'] = ''; // otherwise you get uncaught net.oauth.OAuthProblemException: signature_invalid exceptions
$oauth_config = array(
 'consumerKey' =&gt; $consumer,
 'rsaPrivateKey' =&gt; $privkey,
 'rsaPublicKey' =&gt; $pubkey,
 'signatureMethod' =&gt; 'RSA-SHA1',
 'siteUrl' =&gt; $server . '/plugins/servlet/oauth',
 'requestScheme' =&gt; Zend_Oauth::REQUEST_SCHEME_QUERYSTRING,
 );</pre>
<pre>$oauth = new Zend_Oauth_Consumer($oauth_config);
$oauth-&gt;setSignatureMethod('RSA-SHA1');
$oauth-&gt;setRsaPrivateKey($privkey);
$oauth-&gt;setRsaPublicKey($pubkey);</pre>
<pre>$token = new Zend_Oauth_Token_Access(); // 2-legged authentication doesn't use tokens, but this is the only way to get a HTTP Client that sets the proper Authorization headers
$oauth-&gt;setToken($token);
$client = $token-&gt;getHttpClient($oauth_config, $url);</pre>
<pre>$client-&gt;setUri(sprintf('%s/search', $url));
$client-&gt;setMethod(Zend_Http_Client::GET);
$client-&gt;setParameterGet($query);
$json = json_decode($client-&gt;request()-&gt;getBody());</pre>
<pre>print_r($json);</pre>
<h3>Generating the keys</h3>
<pre>openssl genrsa -out jira.pem 1024
openssl rsa -in jira.pem -pubout -out jira.pub</pre>
<h3>Registering them with JIRA</h3>
<p>Go to the JIRA Administration, click Plugins, then Application Links.</p>
<p>Click Add Application Link, enter your server URL, enter the name of your application and select Generic Application.</p>
<p>Now configure it: got to Incoming Authentication, set a Consumer Key (I used samplescript above), set a name and paste the contents of jira.pub into the box. Now check <label id="two-lo-enabled-label" for="two-lo-enabled">Allow 2-Legged OAuth and enter a user name to which you want to map the key (i.e. which user&#8217;s permissions the OAuth client should have).</label></p>
<p><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2013/04/Screen-Shot-2013-04-21-at-19.43.53.png"><img class="aligncenter size-full wp-image-337" alt="JIRA OAuth configuration" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2013/04/Screen-Shot-2013-04-21-at-19.43.53.png" width="697" height="578" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/04/two-legged-oauth-between-php-and-jira/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenWRT hardware recommendation: TP-Link TL-WDR3600</title>
		<link>http://blog.michael.kuron-germany.de/2013/04/tp-link-tl-wdr3600/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/04/tp-link-tl-wdr3600/#comments</comments>
		<pubDate>Sat, 13 Apr 2013 07:52:37 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=326</guid>
		<description><![CDATA[I recently replaced my WiFi access point, an ancient Linksys WRT54G v3.1. I was looking for something that supported simultaneous dualband, multiple SSIDs, and VLANs. I also wanted something that could run OpenWRT. I ended up buying the TP-Link TL-WDR3600 because it met all these criteria and was available for less than 50 €. After [...]]]></description>
				<content:encoded><![CDATA[<p>I recently replaced my WiFi access point, an ancient Linksys WRT54G v3.1. I was looking for something that supported simultaneous dualband, multiple SSIDs, and VLANs. I also wanted something that could run OpenWRT.</p>
<p>I ended up buying the TP-Link TL-WDR3600 because it met all these criteria and was available for less than 50 €. After using it for a few months, I can definitely recommend it: The wireless coverage is good, it supports Multi-SSID just fine, and the internal switch is fully VLAN-capable (and easy to configure using the OpenWRT LuCI web interface).</p>
<p>My only complaint is that in the 5 GHz band (5150 MHz &#8211; 5250 MHz), OpenWRT limits me to 50 mW of output power (<a href="http://git.kernel.org/cgit/linux/kernel/git/linville/wireless-regdb.git/tree/db.txt">the Linux kernel</a> has a limit of 100 mW), even though I could legally run up to 200 mW. These lowest four channels of the 5 GHz Wifi band don&#8217;t even require TPC (transmission power control) or DFS (radar detection) in Germany, making the limitation completely unnecessary.</p>
<p>The TL-WDR3500, TL-WDR4300 and TL-WDR4310 are identical to the TL-WDR3600 save the radio module, so the instructions here should apply to them as well.</p>
<p>Here&#8217;s a short how-to on getting started with OpenWRT on the WDR3600:</p>
<h4>Installing OpenWRT</h4>
<p>Hook up your computer to an Ethernet port on the WDR3600.</p>
<p>Download <a href="http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wdr3600-v1-squashfs-factory.bin">openwrt-ar71xx-generic-tl-wdr3600-v1-squashfs-factory.bin</a> and upload it using the factory web interface at <a href="http://192.168.0.1">http://192.168.0.1</a> (do not rename the file or it might not update).</p>
<p>After it reboots, renew your DHCP lease (OpenWRT uses a different subnet by default) and <code>telnet 192.168.1.1</code>. There, run passwd to set a password, then hit Ctrl-D to disconnect. Now you can <code>ssh root@192.168.1.1</code>.</p>
<p>The first thing to do is backup the bootloader and ART partition, just in case:<br />
<code>dd if=/dev/$(grep '"art"' /proc/mtd | cut -c 1-4) of=/tmp/art.backup<br />
dd if=/dev/$(grep '"u-boot"' /proc/mtd | cut -c 1-4) of=/tmp/u-boot.backup</code><br />
Now you can <code>scp root@192.168.1.1:/tmp/*.backup ~/Desktop</code> to get them off the device.</p>
<p>Next, install the web interface:<br />
<code>opkg update<br />
opkg install luci<br />
/etc/init.d/uhttpd enable<br />
/etc/init.d/uhttpd start</code><br />
Now you can easily configure everything the way you want it (but please don&#8217;t ask questions in the comments about the specific configuration: the OpenWRT forums are a much better place for that).</p>
<h4>Upgrading OpenWRT</h4>
<p><code>cd /tmp<br />
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wdr3600-v1-squashfs-sysupgrade.bin<br />
md5sum openwrt-ar71xx-generic-tl-wdr3600-v1-squashfs-sysupgrade.bin<br />
# compare it against http://downloads.openwrt.org/snapshots/trunk/ar71xx/md5sums</p>
<p>sysupgrade -v openwrt-ar71xx-generic-tl-wdr3600-v1-squashfs-sysupgrade.bin</code><br />
The device will eventually reboot and come up with the new firmware. Your configuration should still be present.</p>
<h4>Failsafe mode</h4>
<p>If you&#8217;ve locked yourself out, it&#8217;s easy to get back in: unplug the device, plug it back in and as soon as one of the LEDs on the front starts flashing, push and hold the WDS button. Release it when that LED starts flashing a lot faster.</p>
<p>Now, set your computer to a static IP of 192.168.1.x with a subnet mask of 255.255.255.0 and telnet 192.168.1.1. Now you can reset your password (<code>passwd</code>), change configuration variables (<code>uci</code>), or do a factory reset (<code>firstboot</code>). When you&#8217;re done, <code>reboot -f</code> to return to the normal operation mode.</p>
<p><font color="red"><br />
<h4>Warning</h4>
<p>It is possible to brick your device with OpenWRT. All the commands above are provided without warranty, so use at your own risk; if you don&#8217;t know what your doing, don&#8217;t do it.</p>
<p>Also, it&#8217;s not that easy to get back to the original TP-Link firmware (which you would definitely need to to if you wanted to return the device to TP-Link for warranty repair.</p>
<p>Note that depending on local laws, flashing an alternative firmware may void your warranty altogether. Even if it does not, screwing up such a flash process yourself is sure to void the warranty anywhere&#8230;</font></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/04/tp-link-tl-wdr3600/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Xserve RAID and Atto Thunderlink FC 1082 are incompatible if used without an FC switch</title>
		<link>http://blog.michael.kuron-germany.de/2013/04/xserve-raid-atto-thunderlink-fc-108/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/04/xserve-raid-atto-thunderlink-fc-108/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 13:33:50 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Server]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=323</guid>
		<description><![CDATA[We&#8217;re running a 2006 Xserve RAID at the university. Our old server was a 2006 Xserve with an Apple 2 Gbit Fibre Channel card. When we recently got a new Mac mini server to replace, we ordered an Atto Thunderlink FC 1082 to interface with the RAID. The Promise SANLink would have been a possible alternative, [...]]]></description>
				<content:encoded><![CDATA[<p>We&#8217;re running a 2006 Xserve RAID at the university. Our old server was a 2006 Xserve with an Apple 2 Gbit Fibre Channel card. When we recently got a new Mac mini server to replace, we ordered an <a href="http://www.attotech.com/products/product.php?cat=16&amp;scat=29&amp;prod=100&amp;sku=TLFC-1082-D00">Atto Thunderlink FC 1082</a> to interface with the RAID. The <a href="http://www.promise.com/storage/raid_series.aspx?region=en-global&amp;m=192&amp;rsn1=40&amp;rsn3=49">Promise SANLink</a> would have been a possible alternative, but the Thunderlink is capable of 8 Gbit/s, thus future-proofing our investment.</p>
<p>Unfortunately, when I hooked up the Thunderlink straight to the Xserve RAID using an <a href="http://store.apple.com/us/product/MA461G/A/apple-copper-fibre-channel-cable-4gb-sfp-to-sfp">Apple Fibre Channel Copper Cable</a>, neither the Xserve RAID Admin utility nor the Mac mini showed a connection. After some googling around, it appears as if the <a href="https://discussions.apple.com/thread/2319309?start=0&amp;tstart=0">Xserve RAID is not capable of negotiating links with HBAs that are capable of more than 2 Gbit/s</a>. Turns out also says that you shouldn&#8217;t use their 4 Gbit card with the Xserve RAID: <a href="http://support.apple.com/kb/ht1769">HT1769</a>.</p>
<p>Since the RAID has been working fine for quite a while with two HP servers running VMWare ESXi with <a href="http://www.qlogic.com/Products/adapters/Pages/FibreChannelAdapters.aspx">Qlogic QLE2460</a> controllers connected through a <a href="http://www.qlogic.com/Products/Switches/Pages/FibreChannelSwitches.aspx">Qlogic SANbox 5200</a> 2 Gbit FC switch, and I knew the Thunderlink worked with that switch, I simply used an FC Copper Cable between the Thunderlink and the switch and one between the switch and the RAID, configured the zoning, et voilà, the array mounted on the Mac mini.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/04/xserve-raid-atto-thunderlink-fc-108/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using C++11 on Mac OS X 10.8</title>
		<link>http://blog.michael.kuron-germany.de/2013/02/using-c11-on-mac-os-x-10-8/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/02/using-c11-on-mac-os-x-10-8/#comments</comments>
		<pubDate>Thu, 21 Feb 2013 06:45:50 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=316</guid>
		<description><![CDATA[Recent Xcode versions for Mac OS X 10.7 and 10.8 ship with Clang, a modern compiler for C/C++/ObjC based on LLVM. It fully supports C++11: simply add -std=c++0x or -std=c++11 to your CXXFLAGS. This already gives you all the new language features such as the auto keyword. However, when you get more in-depth with C++, you&#8217;ll [...]]]></description>
				<content:encoded><![CDATA[<p>Recent Xcode versions for Mac OS X 10.7 and 10.8 ship with <a href="http://clang.llvm.org">Clang</a>, a modern compiler for C/C++/ObjC based on <a href="http://llvm.org">LLVM</a>. It fully supports <a href="http://en.wikipedia.org/wiki/C%2B%2B11">C++11</a>: simply add <strong>-std=c++0x</strong> or <strong>-std=c++11</strong> to your CXXFLAGS. This already gives you all the new language features such as the auto keyword.</p>
<p>However, when you get more in-depth with C++, you&#8217;ll also want to use the new features of the standard library, such as &lt;array&gt; or &lt;random&gt;.  This however results in strange error messages:</p>
<pre>gamelogic/Board.cpp:11:10: fatal error: 'random' file not found
#include &lt;random&gt;
         ^</pre>
<p>As it turns out, your binaries get linked to the system-default <a href="http://gcc.gnu.org/libstdc++/">libstdc++</a> version (/usr/lib/libstdc++.6.dylib) which is too old to support C++11. However, Mac OS X also includes <a href="http://libcxx.llvm.org">libc++</a> (/usr/lib/libc++.1.dylib), a complete reimplementation of the standard library by the LLVM team that is fully C++11 compatible. Simply tell the compiler to use it using <strong>-stdlib=libc++</strong> and tell the linker to link against it using <strong>-lc++</strong>.</p>
<p>So for a qmake .pro project file, all this might look as follows. The conditional makes it compatible with other compilers such as <a href="http://gcc.gnu.org">g++</a> on Linux that already ship with a C++11-compatible standard library.</p>
<pre>QMAKE_CXXFLAGS += -std=c++0x</pre>
<pre>macx {</pre>
<pre> contains(QMAKE_CXX, /usr/bin/clang++) {</pre>
<pre>  message(Using LLVM libc++)</pre>
<pre>  QMAKE_CXXFLAGS += -stdlib=libc++</pre>
<pre>  QMAKE_LFLAGS += -lc++</pre>
<pre> }</pre>
<pre>}</pre>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/02/using-c11-on-mac-os-x-10-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenVPN for iOS</title>
		<link>http://blog.michael.kuron-germany.de/2013/01/openvpn-for-ios/</link>
		<comments>http://blog.michael.kuron-germany.de/2013/01/openvpn-for-ios/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 15:09:19 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=308</guid>
		<description><![CDATA[Today, OpenVPN Technologies released OpenVPN Connect for iOS. Finally, we can use OpenVPN on all major platforms. I know many of my blog readers have been waiting for this: my article on the iOS VPN API is one of the most popular articles on my blog. OpenVPN Connect is not based on the classic GPL [...]]]></description>
				<content:encoded><![CDATA[<p>Today, OpenVPN Technologies released <a href="https://itunes.apple.com/us/app/openvpn-connect/id590379981">OpenVPN Connect</a> for iOS. Finally, we can use OpenVPN on all major platforms. I know many of my blog readers have been waiting for this: my article on the <a title="iOS 4.1: Undocumented VPN API, used by Cisco AnyConnect" href="http://blog.michael.kuron-germany.de/2010/09/ios-4-1-undocumented-vpn-api-used-by-cisco-anyconnect/">iOS VPN API</a> is one of the most popular articles on my blog.</p>
<p>OpenVPN Connect is not based on the classic GPL OpenVPN software (supposedly GPL and App Store are not compatible), but supposed to be fully compatible with any OpenVPN server running version 2.1 or higher (including IPv6 support with servers running the recently-released version 2.3). Supposedly it can even be managed using the &#8220;Custom SSL&#8221; option in iPhone Configuration Utility.</p>
<p>Two points I&#8217;d like to mention which might temporarily disappoint some people:</p>
<ul>
<li>It currently requires client certificates (but the help promises that that&#8217;ll change soon).</li>
<li>Layer 2 tap interfaces are not supported. As I noted in my VPN API blog post, iOS provides a utun interface, which only does layer 3.</li>
</ul>
<p>Go check it out on the <a href="https://itunes.apple.com/us/app/openvpn-connect/id590379981">App Store</a> or have a look at <a href="https://plus.google.com/u/0/102486415329787631392/posts/faSspbtGkcW">Gert Döring&#8217;s Google+ post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2013/01/openvpn-for-ios/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>VMWare ESXi 5.1.0 breaks PCI Passthrough (Update: fixed in ESXi510-201212001)</title>
		<link>http://blog.michael.kuron-germany.de/2012/10/vmware-esxi-5-1-0-799733-breaks-pci-passthrough/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/10/vmware-esxi-5-1-0-799733-breaks-pci-passthrough/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 15:49:08 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[esxi]]></category>
		<category><![CDATA[pci]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=282</guid>
		<description><![CDATA[After I upgraded to VMWare ESXi 5.1.0, my server crashed with a purple screen of death as soon as I fired up a VM that was using a passed-through PCI device (1244:0e00, an AVM GmbH Fritz!Card PCI v2.0 ISDN (rev 01)).I have been running the original version of ESXi 5.0.0 for a year and everything worked [...]]]></description>
				<content:encoded><![CDATA[<p>After I upgraded to VMWare ESXi 5.1.0, my server crashed with a purple screen of death as soon as I fired up a VM that was using a passed-through PCI device (1244:0e00, an AVM GmbH Fritz!Card PCI v2.0 ISDN (rev 01)).I have been running the original version of ESXi 5.0.0 for a year and everything worked fine. In fact, I have never ever seen such a purple screen of death.</p>
<pre style="background-color: #ff00ff; color: white;">VMware ESXi 5.1.0 [Releasebuild-799733 x86_64]
#PF Exception 14 in world 4077:vmx IP 0x418039cf095c addr 0xl4
cr0=0x80010031 cr2=0x14 cr3=0x15c0d6000 cr4=0x42768
Frame=0x41221fb5bc00 ip=0x418039cf095c err=0 rflags=0x10202
rax=0x0 rbx=0x10 rcx=0x417ff9f084d0
rdx=0x41000168e5b0 rbp=0x41221fb5bcd8 rsi=0x41000168ee90
rdi=0x417ff9f084d0 r8=0x0 r9=0x1
r10=0x3ffd81972a9 r11=0x0 r12=0x41221fb5bd58
r13=0x41000168e350 r14=0xB r15=0x0
*PCPU3:4077/vmx
PCPU B: UUVU
Code start: 0x418039a00000 VMK uptime: 0:00:06:21.499
0x41221fb5bcd8:[0x418039cf095c]PCI_GetExtCapIdx@vmkernel#nover+0x2b stack: 0x41221fb5bd38
0x41221fb5bd48:[0x418039abadd2]VMKPCIPassthru_GetPCIInfo@vmkernel#nover+0x335 stack: 0x29000030e001
0x41221fb5beb8:[0x418B39ea2c51]UW64VMKSyscallUnpackPCIPassthruGetPCIInfo@&lt;None&gt;#&lt;None&gt;+0x28 stack:
0x41221fb5bef8:[0x4l8039e79791]User_LinuxSyscallHandler@&lt;None&gt;#&lt;None&gt;+0x17c stack: 0x418039a4cc70
0x41221fb5bf18:[0x4l8039aa82be]User_LinuxSyscallHandler@vmkernel#nover+0x19 stack: 0x3ffd8197490
0x41221fb5bf28:[0x418039b10064]gate_entry@vmkernel#nover+0x63 stack: 0x10b
base fs=0x0 gs=0x418040c00000 Kgs=0x0
Coredump to disk. Slot 1 of 1.
Finalized dump header (9/9) DiskDunp: Successful.
Debugger waiting(world 4077) -- no port for remote debugger. "Escape" For local debugger.</pre>
<p>Turns out that is a bug in ESXi. Luckily, downgrading an ESXi is simple enough: just hit Shift-R at the boot prompt and tell it to revert to the previous version.</p>
<p><strong>Update: Patch <a href="http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=2035777">ESXi510-201212401-BG</a> in version <a href="http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=2035775">ESXi510-201212001</a> (build 914609), released on December 20th, fixes the PCI passthrough issue (PR924167) according to <a href="http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=2039030">KB2039030</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/10/vmware-esxi-5-1-0-799733-breaks-pci-passthrough/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Fixing Microsoft Office 2011 SP2 Volume licensing</title>
		<link>http://blog.michael.kuron-germany.de/2012/10/fixing-microsoft-office-2011-sp2-volume-licensing/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/10/fixing-microsoft-office-2011-sp2-volume-licensing/#comments</comments>
		<pubDate>Wed, 03 Oct 2012 12:45:03 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technical Stuff]]></category>
		<category><![CDATA[com.microsoft.office.licensing]]></category>
		<category><![CDATA[microsoft office 2011]]></category>
		<category><![CDATA[microsoft office setup assistant]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=279</guid>
		<description><![CDATA[UPDATE 2012-11-15: The 14.2.5 installer no longer has this weird behavior (it does not include removables.txt files at all, however the postinstall script would still process them if they were there). Since it requires 14.2.3 as a prerequisite, you&#8217;ll still need to apply the fix mentioned below to 14.2.3 when chaining updates. UPDATE 2012-11-30: I [...]]]></description>
				<content:encoded><![CDATA[<p><strong>UPDATE 2012-11-15</strong>: The 14.2.5 installer no longer has this weird behavior (it does not include removables.txt files at all, however the postinstall script would still process them if they were there). Since it requires 14.2.3 as a prerequisite, you&#8217;ll still need to apply the fix mentioned below to 14.2.3 when chaining updates.</p>
<p><strong>UPDATE 2012-11-30</strong>: I just obtained a copy of the 14.2.3 installer ISO from Microsoft VLSC. Copies of Office installed from it (or probably any 14.2.0+ installer ISO) do not exhibit the behavior explained here. The newer installer ships with flat-file Main.nib files that do not get removed by the removables.txt script.</p>
<p><strong>UPDATE 2013-03-13</strong>: The 14.3.2 updater again contains a removables.txt which breaks Microsoft Office Setup Assistant.app. If you didn&#8217;t replace your installer ISO with a newer version, you will again need to apply the fix mentioned below when installing this update.</p>
<p>When you run Word, Excel, PowerPoint or Outlook 2011, it checks /Library/Preferences/com.microsoft.office.licensing.plist . If that file is not valid (such as after doing a fresh install of Microsoft Office 2011), it launches /Applications/Microsoft Office 2011/Office/Microsoft Office Setup Assistant.app. Microsoft Office Setup Assistant checks whether the DVD from which you installed is a volume licensed copy; if it is, it silently populates that plist and quits (allowing the app you initially started to start up); if it is not, it prompts you for a product key and activation.</p>
<p>If you install from the DVD, launch one of the Office apps to activate the license, quit it and then install all the available updates from Microsoft, everything is fine.</p>
<p>If you update to version 14.2.0, 14.2.1, 14.2.2, 14.2.3, 14.2.4 (or possibly future versions) right after installing from the DVD however, Microsoft Office Setup Assistant.app gets corrupted. This is due to ./Office 2011 14.2.X Update.mpkg/Contents/Packages/Office2011_all_core_14.2.X.combo.pkg/Contents/Resources/removables.txt, which gets run by ./Office 2011 14.2.X Update.mpkg/Contents/Packages/Office2011_all_core_14.2.X.combo.pkg/Contents/Resources/postflight. It deletes the contents of /Applications/Microsoft Office 2011/Office/Microsoft Office Setup Assistant.app/Contents/Resources/XX.lproj/Main.nib (which is a bundle-style NIB), however (unlike probably everything else listed in removables.txt) the update does not contain updated versions of them.</p>
<p>If you&#8217;re running an individually-licensed copy of Office 2011, that is no big deal: the Office apps themselves are able to prompt for a license key and activation.</p>
<p>If you&#8217;re running a volume licensed copy of Office 2011, you&#8217;re in trouble: You now get prompted for a product key by every Office app, which you obviously don&#8217;t have.</p>
<p>To fix this situation, you have two options:</p>
<p>1. Copying /Library/Preferences/com.microsoft.office.licensing.plist from a working install. You can do this using your favorite software depolyment tool, such as <a href="http://code.google.com/p/munki/">Munki</a>. Please note that importing it as a Managed Preference (MCX) into Workgroup Manager (and probably Profile Manager) does not help. The file needs to be physically present on the client machine.</p>
<p>2. Move Microsoft Office Setup Assistant.app out of the way before updating. You can do this if your software deployment tool supports adding custom pre- and post-install scripts (Munki allows you to do that).</p>
<p>Here&#8217;s my pre-install script:</p>
<pre>#!/bin/bash
cd "/Applications/Microsoft Office 2011/Office"
mv "Microsoft Office Setup Assistant.app" "SetupAssistantBackup.app"
exit 0</pre>
<p>And my post-install script:</p>
<pre>#!/bin/bash
cd "/Applications/Microsoft Office 2011/Office"
mv "SetupAssistantBackup.app" "Microsoft Office Setup Assistant.app"
exit 0</pre>
<p>To find out whether you still need to do this on future updates (such as 14.2.5), open the installer package in a tool like <a href="http://www.charlessoft.com">Pacifist</a> and check the following: a) Did they remove the  Microsoft Office Setup Assistant.app lines from removables.txt (go to the Resources tab and enter <em>removables.txt</em> into the search box to locate the file)? b) Does the update contain a new version of Microsoft Office Setup Assistant.app (go to the Package Contents tab and enter <em>setup assistant</em> into the search box to check for its existence)? If either one is true, Microsoft decided to fix the problem and you no longer need to use my pre-/post-install scripts.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/10/fixing-microsoft-office-2011-sp2-volume-licensing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Converting Xen Linux VMs to VMWare</title>
		<link>http://blog.michael.kuron-germany.de/2012/09/converting-xen-linux-vms-to-vmware/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/09/converting-xen-linux-vms-to-vmware/#comments</comments>
		<pubDate>Sat, 15 Sep 2012 10:18:50 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[dd]]></category>
		<category><![CDATA[esxi]]></category>
		<category><![CDATA[fdisk]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=272</guid>
		<description><![CDATA[A year ago I wrote about how to convert from Xen to VMWare (which is a similar process to a Xen virtual-to-physical or V2P conversion). Now I found a much simpler solution, thanks to http://www.zomo.co.uk/2012/04/moving-disks-from-xen-to-kvm/ . In this example, I&#8217;m using LVM disks, but the process is no different from using Xen disk images. Install Debian [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.michael.kuron-germany.de/2011/10/how-to-converting-xen-linux-vms-to-vmware-esxi/">A year ago</a> I wrote about how to convert from Xen to VMWare (which is a similar process to a Xen virtual-to-physical or V2P conversion). Now I found a much simpler solution, thanks to <a href="http://www.zomo.co.uk/2012/04/moving-disks-from-xen-to-kvm/">http://www.zomo.co.uk/2012/04/moving-disks-from-xen-to-kvm/</a> .</p>
<p>In this example, I&#8217;m using LVM disks, but the process is no different from using Xen disk images.</p>
<ol>
<li>Install Debian Wheezy into a VMWare virtual machine. Attach a secondary virtual disk (it will be called /dev/sdc from now on) that&#8217;s sized about 500 MB larger than your Xen DomU (just to be safe). Fire up the VM. All subsequent commands will be run from inside that VM.</li>
<li>Check whether your DomU disk has a partition table: <em>ssh root@xen fdisk -l /dev/xenvg/4f89402b-8587-4139-8447-1da6d0571733.disk0</em>. If it does, proceed to step 3. If it does not, proceed to step 4.</li>
<li>Clone the Xen DomU onto the secondary virtual disk via SSH: <em>ssh root@xen dd bs=1048576 if=/dev/xenvg/4f89402b-8587-4139-8447-1da6d0571733.disk0 | dd bs=1048576 of=/dev/sdc</em>. Proceed to step 7.</li>
<li>Zero out the beginning of the target disk: <em>dd if=/dev/zero of=/dev/sdc bs=1048576 count=16</em></li>
<li>Partition it and add a primary partition 8 MB into the disk: <em>fdisk /dev/sdc</em>, o Enter w Enter, <em>fdisk /dev/sdc</em>, n Enter p Enter 1 Enter 16384 Enter Enter, w Enter</li>
<li>Clone the Xen DomU onto the secondary virtual disk&#8217;s first partition via SSH: <em>ssh root@lara dd bs=1048576 if=/dev/xenvg/4f89402b-8587-4139-8447-1da6d0571733.disk0 | dd bs=1048576 of=/dev/sdc1</em></li>
<li><em>reboot</em></li>
<li>Mount the disk: <em>mount -t ext3 /dev/sdc1 /mnt; cd /mnt</em></li>
<li>Fix fstab: <em>nano etc/fstab</em>: change root disk from to /dev/sda1</li>
<li>Fix the virtual console: <em>nano etc/inittab</em>: replace hvc0 with tty1</li>
<li>Chroot into the disk: <em>mount -t proc none /mnt/proc; mount -t sysfs none /mnt/sys; mount -o bind /dev /mnt/dev; chroot /mnt /bin/bash</em></li>
<li>Fix mtab so the Grub installer works: <em>grep -v rootfs /proc/mounts &gt; /etc/mtab</em></li>
<li>Install Grub: <em>apt-get install grub2</em>. When the installer asks to which disks to install, deselect all disks.</li>
<li>Install Grub to MBR: <em>grub-install &#8211;force /dev/sdc</em></li>
<li>Update Grub configuration: <em>update-grub</em></li>
<li>Leave the chroot: <em>exit; umount /mnt/* /mnt</em></li>
<li><em>shutdown</em></li>
</ol>
<p>Now you can detach the secondary virtual disk and create a new VM with it. If everything worked correctly, it will boot up.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/09/converting-xen-linux-vms-to-vmware/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mac OS X 10.8 Mountain Lion Review</title>
		<link>http://blog.michael.kuron-germany.de/2012/09/mac-os-x-10-8-mountain-lion-review/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/09/mac-os-x-10-8-mountain-lion-review/#comments</comments>
		<pubDate>Tue, 11 Sep 2012 17:24:16 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=264</guid>
		<description><![CDATA[So I finally upgraded to Mountain Lion. I completely skipped over Lion because I didn&#8217;t like how Apple was iOS-ifying everything and had just stayed on Snow Leopard until a few days ago. Personally, I think Snow Leopard was the best operating system ever released. It was super stable and had everything you could ask [...]]]></description>
				<content:encoded><![CDATA[<p>So I finally upgraded to Mountain Lion. I completely skipped over Lion because I didn&#8217;t like how Apple was iOS-ifying everything and had just stayed on Snow Leopard until a few days ago. Personally, I think Snow Leopard was the best operating system ever released. It was super stable and had everything you could ask of an operating system. I never really liked Leopard because it never worked 100% stable for me (though it did bring Time Machine and QuickLook, both of which are features I use every day). Tiger was great too back in the days, but if you look at it now, the GUI looks totally inconsistent.</p>
<p>Now that Apple is discontinuing security updates for Snow Leopard and an increasing number of apps requires Lion or newer, I had not much of a choice but upgrade.</p>
<p>This isn&#8217;t a full review of Mountain Lion. If you want to read one, check out <a href="http://arstechnica.com/apple/2012/07/os-x-10-8/">John Siracusa&#8217;s epic review at Ars Technica</a>. So far my impressions are:</p>
<p><strong>Stability and speed</strong>: Mountain Lion is just as stable as Snow Leopard. It is also noticeably more responsive than Snow Leopard. I don&#8217;t think this has anything to do with actual speed, but more of a psychological thing: Safari now renders progressively, and many apps already let you interact with them while they&#8217;re still starting up (previously they would have been frozen for another second or two while they finished their startup prcedure).</p>
<p>iOS-ification: <strong>Launchpad</strong> is completely useless, but luckily Spotlight and the Dock still work exactly as they always have and will continue to be my preferred way of launching applications.</p>
<p><strong>Auto Save</strong> however is outright obnoxious. You can no longer Command-D to hit the &#8220;Don&#8217;t Save&#8221; button when you want to close a window discarding changes. [<strong>UPDATE</strong>: Can't believe it took me half a year to figure out that Command-Backspace can be used instead as an alternative to the old Command-D.] That window doesn&#8217;t even respect NSNavPanelExpandedStateForSaveMode (i.e. clicking the disclosure triangle is not persistent). &#8220;Save as&#8221; is now a secondary menu option behind &#8220;Duplicate&#8221;. iWork and TextEdit now show a file browser upon launch instead of opening a blank document. Save as defaults to iCloud instead of the local hard drive. And there are probably dozens of other things.</p>
<p>Here are some useful defaults commands to make it slightly less painful, but you still can&#8217;t completely disable Auto Save. Luckily I spend most of my time in apps that don&#8217;t use Auto Save (e.g. Microsoft Office, TextWrangler, TextMate, TeXShop).</p>
<pre>defaults write -g NSNavPanelExpandedStateForSaveMode -bool TRUE # always expand open/save dialog</pre>
<pre>defaults write -g NSDocumentSaveNewDocumentsToCloud -bool FALSE # save locally instead of to iCloud by default</pre>
<p>Also, check &#8220;Ask to keep changes when closing document&#8221; in the General pane in System Preferences.</p>
<p><strong>Hold-to-umlaut</strong> is annoying on a full-size keyboard. Luckily you can re-enable key repeat:</p>
<pre>defaults write -g ApplePressAndHoldEnabled -bool false # enable key-repeat</pre>
<p><strong>FileVault 2</strong> is simple to enable, as secure as software-based full-disk encryption can be (according to <a href="http://eprint.iacr.org/2012/374.pdf">several researchers</a>) and has no noticeable performance hit. If you&#8217;re using it, you should enable deep sleep, otherwise the disk remains unlocked during sleep:</p>
<pre>sudo pmset -a destroyfvkeyonstandby 1 hibernatemode 25</pre>
<p>One thing that Apple could improve: after waking from deep sleep and entering your password at the EFI screen, that password should also be passed to the screensaver unlock screen (similar to how it&#8217;s passed to the loginwindow when booting). (this might be worth filing a bug report)</p>
<p>All of my favorite hidden <strong>Dock</strong> settings still work:</p>
<pre>defaults write com.apple.Dock showhidden -bool YES # make hidden apps transparent
defaults write com.apple.dock no-glass -boolean YES # disable 3D dock
killall Dock</pre>
<p>The one thing that doesn&#8217;t really work anymore is dragging widgets out of Dashboard after enabling developer mode:</p>
<pre>defaults write com.apple.dashboard devmode -bool YES # enable dashboard dev mode
killall Dock</pre>
<p>If you uncheck &#8220;Show Dashboard as a space&#8221; in the Mission Control pane in System Preferences, you can actually drag out the widget, but more often than not, it will just vanish along the way and won&#8217;t reappear until you kill the Dock.</p>
<p><strong>Messages</strong>: I find it slightly annoying that Messages lists every single phone number and email address in the Show Info screen for every buddy, even if they don&#8217;t have iMessage activated. In fact, it even shows them after you disable iMessage in Messages&#8217; preferences. Also, I miss the new message popup in the top right corner of my screen. Now, the only indication of a message received while you were away from your computer is a small number badge on the messages icon and a notification in Notification Center (which you don&#8217;t see until you open Notification Center). In fact, it doesn&#8217;t even show the message window until you click the icon (which may actually be a bug).</p>
<p><strong>Notification Center</strong> is a very nice Growl replacement. I mainly need it for Mail and iChat, so I didn&#8217;t even bother installing something like <a href="http://www.macworld.com/article/1168437/bark_sends_growl_alerts_to_notification_center.html">Bark</a> to forward Growl messages to Notification Center.</p>
<p><strong>Full Screen</strong> is useless on a multi-screen setup, but running apps in full screen is pointless anyway on all but the smallest screens. <strong>Spaces</strong> used to be a pretty neat feature to switch between multiple sets of apps. Unfortunately, the old spaces (which you could access using Ctrl plus a number key or Ctrl plus the arrow keys) are gone and the new spaces can only be used to switch between multiple full-screen apps.</p>
<p>Most of my complaints are a matter of getting used to. When upgrading to a new OS, you always gain some things and you lose some things The only major issue I have is Auto Save. As long as my everyday apps don&#8217;t support it, I&#8217;ll be happy. Once they do (in Microsoft Office 2015 perhaps), I&#8217;ll need to find some way to get around it or get used to it.</p>
<p>Everything else is a reasonable tradeoff for being on the most recent OS version again.</p>
<p>I do remember how much my Windows friends complained six years ago when Vista changed everything they were used to after a decade of Windows 95 thru Windows XP. Or how some of my Linux friends complain about how Gnome 3 is so much worse than Gnome 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/09/mac-os-x-10-8-mountain-lion-review/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Installing Apple Remote Desktop 3.6.1 without first installing the boxed version</title>
		<link>http://blog.michael.kuron-germany.de/2012/09/installing-apple-remote-desktop-3-6-1-without-first-installing-the-boxed-version/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/09/installing-apple-remote-desktop-3-6-1-without-first-installing-the-boxed-version/#comments</comments>
		<pubDate>Sun, 09 Sep 2012 09:27:38 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Server]]></category>
		<category><![CDATA[Apple Remote Desktop]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=262</guid>
		<description><![CDATA[Apple Remote Desktop 3.0 was released in 2006. The current version is 3.6.1, and as such your six year old boxed copy license still entitles you to run it. ARD has undergone some major changes during that time: most notably, Apple switched it from a Postgres database to an SQLite database, which greatly reduced its [...]]]></description>
				<content:encoded><![CDATA[<p>Apple Remote Desktop 3.0 was released in 2006. The current version is 3.6.1, and as such your six year old boxed copy license still entitles you to run it.</p>
<p>ARD has undergone some major changes during that time: most notably, Apple switched it from a Postgres database to an SQLite database, which greatly reduced its memory footprint and made it much more self-contained.</p>
<p>After reinstalling Mac OS X on my computer, I didn&#8217;t want to first install my boxed copy (version 3.2) because I didn&#8217;t want it to bloat my system with a copy of Postgresql that would get replaced by the update anyway.</p>
<p>After six years, it&#8217;s a safe bet that the downloadable <a href="http://support.apple.com/kb/DL1570">Admin Update 3.6.1</a> does not require any previous version&#8217;s files. However, the installer checks for the existence of a previous version before allowing you to select the destination drive. This check can be satisfied by first running</p>
<p>defaults write /Applications/Remote\ Desktop.app/Contents/Info CFBundleShortVersionString -float 3.0</p>
<p>I&#8217;d like to point out that it still requires the license key that came in the box when you first run ARD.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/09/installing-apple-remote-desktop-3-6-1-without-first-installing-the-boxed-version/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hashing and verifying LDAP passwords in PHP</title>
		<link>http://blog.michael.kuron-germany.de/2012/07/hashing-and-verifying-ldap-passwords-in-php/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/07/hashing-and-verifying-ldap-passwords-in-php/#comments</comments>
		<pubDate>Thu, 26 Jul 2012 18:44:29 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[password hashes]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=255</guid>
		<description><![CDATA[I recently migrated a PHP web application that used LDAP for authentication and MySQL for data to something entirely MySQL based. I needed the users to be able to continue using their old LDAP passwords, so I dumped the LDAP database and grabbed the userPassword field for each user, base64_decode()d it and wrote that to [...]]]></description>
				<content:encoded><![CDATA[<p>I recently migrated a PHP web application that used LDAP for authentication and MySQL for data to something entirely MySQL based. I needed the users to be able to continue using their old LDAP passwords, so I dumped the LDAP database and grabbed the userPassword field for each user, base64_decode()d it and wrote that to a MySQL table. These password hashes start with something like {crypt}, {MD5}, {SHA1} or {SSHA1}, or in very rare cases, are plain-text.</p>
<p>Here&#8217;s a PHP function I wrote that, given a plain-text $password, verifies it against such a $hash. This is what you&#8217;ll be calling from your authentication script to verify a given password against the hash.</p>
<pre>function check_password($password, $hash)
 {
 if ($hash == '') // no password
 {
 //echo "No password";
 return FALSE;
 }
 
 if ($hash{0} != '{') // plaintext password
 {
 if ($password == $hash)
 return TRUE;
 return FALSE;
 }
 
 if (substr($hash,0,7) == '{crypt}')
 {
 if (crypt($password, substr($hash,7)) == substr($hash,7))
 return TRUE;
 return FALSE;
 }
 elseif (substr($hash,0,5) == '{MD5}')
 {
 $encrypted_password = '{MD5}' . base64_encode(md5( $password,TRUE));
 }
 elseif (substr($hash,0,6) == '{SHA1}')
 {
 $encrypted_password = '{SHA}' . base64_encode(sha1( $password, TRUE ));
 }
 elseif (substr($hash,0,6) == '{SSHA}')
 {
 $salt = substr(base64_decode(substr($hash,6)),20);
 $encrypted_password = '{SSHA}' . base64_encode(sha1( $password.$salt, TRUE ). $salt);
 }
 else
 {
 echo "Unsupported password hash format";
 return FALSE;
 }
 
 if ($hash == $encrypted_password)
 return TRUE;
 
 return FALSE;
 }</pre>
<p>And here&#8217;s one that make a {SSHA} hash from a password (I did not implement all the other algorithms as by today&#8217;s standards, they are no longer secure). This is what you&#8217;ll be calling from your change password script to hash the password for storing in the database.</p>
<pre>function hash_password($password) // SSHA with random 4-character salt
 {
 $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4);
 return '{SSHA}' . base64_encode(sha1( $password.$salt, TRUE ). $salt);
 }</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/07/hashing-and-verifying-ldap-passwords-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Troubleshooting Apple Software Update Server</title>
		<link>http://blog.michael.kuron-germany.de/2012/06/troubleshooting-apple-software-update-server/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/06/troubleshooting-apple-software-update-server/#comments</comments>
		<pubDate>Sat, 23 Jun 2012 21:00:44 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac OS X Server]]></category>
		<category><![CDATA[software update server]]></category>
		<category><![CDATA[sucatalog]]></category>
		<category><![CDATA[sus]]></category>
		<category><![CDATA[swcdn.apple.com]]></category>
		<category><![CDATA[_productId Update]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=248</guid>
		<description><![CDATA[We are currently in the process of migrating towards a thin imaging approach for the Macs I manage at my university. One of the things we needed was an Apple Software Update Server, which is pretty straight forward to set up using Server Admin. I used Snow Leopard Server 10.6.8 with Lion updates enabled as [...]]]></description>
				<content:encoded><![CDATA[<p>We are currently in the process of migrating towards a thin imaging approach for the Macs I manage at my university. One of the things we needed was an Apple Software Update Server, which is pretty straight forward to set up using Server Admin. I used Snow Leopard Server 10.6.8 with Lion updates enabled as described in <a href="http://support.apple.com/kb/HT4771">Apple&#8217;s KB article</a>.</p>
<p>A command I found extremely useful:</p>
<pre>sudo serveradmin settings swupdate | grep "enable = no" | awk -F '=' '{print $1"= yes"}' | sudo serveradmin settings</pre>
<p>This command enables all available updates. If you have set SUS to automatically mirror, but not automatically enable, this command saves you from having to click on every single one of the 600 updates to enable it.</p>
<p>A few days after I set up my SUS I was starting to see a bunch of error messages in /var/log/swupd/swupd_syncd_log after starting a sync run using the refresh button below the updates list in Server Admin. I&#8217;ll go over them here and explain my fixes:</p>
<h3>&#8220;Product file URL contains possible security violation.&#8221; in log</h3>
<pre>*** Product file URL contains possible security violation.
*** Product ID: "11D2515_ServerEssentials"; file URL: "http://swcdn.apple.com/content/downloads/10/59/11D2515_ServerEssentials/xajda1v3ycqbtv75fiw5hvosaovu9to9hc/ServerEssentials.dst/041-5774.Italian.dist"
*** Reason: file download path cannot be reached / does not exist.
*** The suspect product file will not be downloaded.</pre>
<p>A few Lion updates contain subfolders, which SUS does not create. Simply create those subfolders (<em>mkdir /var/db/swupd/content/downloads/10/59/11D2515_ServerEssentials/xajda1v3ycqbtv75fiw5hvosaovu9to9hc/ServerEssentials.dst; chown _softwareupdate /var/db/swupd/content/downloads/10/59/11D2515_ServerEssentials/xajda1v3ycqbtv75fiw5hvosaovu9to9hc/ServerEssentials.dst</em>) and have SUS recheck for available updates.</p>
<p>[EDIT: The original version of this blog post used curl to download the file, but forgot to chown the folder. Letting SUS download the file itself is the cleaner solution.]</p>
<p>[EDIT 2: This issue is really <a href="https://groups.google.com/d/topic/macenterprise/ojAdC1TGB7Y/discussion">widespread</a> with the ARD Client 3.6 update, where http://swcdn.apple.com/content/downloads/31/58/041-5433/xt9k9paj5zu8rx258rdccohk236ee77clh/RemoteDesktopClient.dst/041-5433.*.dist fails. This does solve this issue.]</p>
<h3>&#8220;Product XXX-YYYY is no longer available and has no replacement&#8221; in log or &#8221;*** Missing version string for product XXX-YYYY&#8221; in log or &#8221;_productId Update&#8221; showing up in Server Admin</h3>
<p>Your catalog is corrupted. Delete it to have it rebuilt automatically. The following commands help:</p>
<pre>sudo serveradmin stop swupdate
cd $(sudo serveradmin settings swupdate:updatesDocRoot | awk -F '"' '{print $2}')/html/content
mv catalogs catalogs.old
sudo serveradmin start swupdate</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/06/troubleshooting-apple-software-update-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protected: Create a bootable Mac OS X Lion Server USB drive</title>
		<link>http://blog.michael.kuron-germany.de/2012/06/create-a-bootable-mac-os-x-lion-serve-usb-drive/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/06/create-a-bootable-mac-os-x-lion-serve-usb-drive/#comments</comments>
		<pubDate>Fri, 08 Jun 2012 19:56:13 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Server]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[lion server]]></category>
		<category><![CDATA[ServerEssentials.pkg]]></category>
		<category><![CDATA[swcdn.apple.com]]></category>
		<category><![CDATA[swscan.apple.com]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=233</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
				<content:encoded><![CDATA[<form action="http://blog.michael.kuron-germany.de/wp-login.php?action=postpass" method="post">
<p>This post is password protected. To view it please enter your password below:</p>
<p><label for="pwbox-233">Password: <input name="post_password" id="pwbox-233" type="password" size="20" /></label> <input type="submit" name="Submit" value="Submit" /></p>
</form>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/06/create-a-bootable-mac-os-x-lion-serve-usb-drive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Active PA speaker systems</title>
		<link>http://blog.michael.kuron-germany.de/2012/03/active-pa-speaker-systems/</link>
		<comments>http://blog.michael.kuron-germany.de/2012/03/active-pa-speaker-systems/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 13:42:17 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Sound]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=221</guid>
		<description><![CDATA[During my high school time, I did a lot of work as a sound technician and lighting designer at all kinds of events, both as a volunteer at school and outside of school. Recently someone from the school told me that they were looking at buying a new portable speaker system, both to replace their [...]]]></description>
				<content:encoded><![CDATA[<p>During my high school time, I did a lot of work as a sound technician and lighting designer at all kinds of events, both as a volunteer at school and outside of school. Recently someone from the school told me that they were looking at buying a new portable speaker system, both to replace their old/broken/underpowered one and because they were paying more than a thousand euros in rental fees for additional speakers every year. They asked me if I could help them choose one. We quickly reached the conclusion that active speakers were the way to go because of their flexibility and because they would often be operated by people who didn&#8217;t know a lot about all the technical stuff.</p>
<p>We ended up narrowing it down to three candidates: the <a href="http://www.yamahaproaudio.com/global/en/products/speakers/dsr_series/">Yamaha DSR</a> series, the <a href="http://www.jblpro.com/catalog/general/productfamily.aspx?fid=93&amp;mid=3">JBL PRX600</a> series, and the <a href="http://www.qscaudio.com/products/speakers/kw_series/">QSC KW</a> series. These are the top-of-the-line active systems the largest and most reputable speaker manufacturers have to offer, as of early 2012. The next step was to find a place where we could listen to all three and compare them. <a href="http://www.thomann.de/">Thomann</a>, the largest online shop for musical instruments and PA equipment in Europe, where we have been buying sound equipment for years, has a huge store and showroom in a small town in northern Bavaria. They ordered and set up all these speakers for us and let us listen to them for more than an hour. If the friendly sales guy ever grew tired of listening to our test songs like &#8220;He&#8217;s A Pirate&#8221; by Klaus Badelt or &#8220;Man in the Mirror&#8221; by Michael Jackson over and over again, he certainly didn&#8217;t show it.</p>
<p>We almost immediately ruled out the QSC: We had the <a href="http://www.thomann.de/de/qsc_kw_153.htm">QSC KW 153</a> three-way 15&#8243; top coupled with a <a href="http://www.thomann.de/de/qsc_kw_181.htm">QSC KW 181</a> 18&#8243; subwoofer set up, but the mids and highs just sounded muddy.</p>
<p>Some other speakers we temporarily had in the test were some JBL Eon (by accident), which just sounded cheap compared to the others, and some RCF Art, which had crisp and powerful base, but not exactly outstanding highs.</p>
<p><span style="color: #000080;">Now we only had the <a href="http://www.thomann.de/de/jbl_prx_615m.htm"><span style="color: #000080;">JBL PRX 615</span></a> two-way 15&#8243; top coupled with the <a href="http://www.thomann.de/de/jbl_prx_618s_xlf.htm"><span style="color: #000080;">JBL PRX618-XLF</span></a> 18&#8243; subwoofer and the <a href="http://www.thomann.de/de/yamaha_dsr_115.htm"><span style="color: #000080;">Yamaha DSR 115</span></a> two-way 15&#8243; top coupled with the <a href="http://www.thomann.de/de/yamaha_dsr_118w.htm"><span style="color: #000080;">Yamaha DSR 118W</span></a> 18&#8243; subwoofer left over. We tested and compared them for almost an hour: sometimes we tended towards the JBLs, other times we liked the Yamahas more.</span></p>
<p><span style="color: #000080;">The JBLs sounded very smooth (if you want to be mean, you could call them a tiny bit muddy) and their base stretched down to 30 Hz. On the other hand, the Yamahas had super-clear mids and highs and very precise and crisp base. After quite some discussion, we decided to go with the Yamahas. Another advantage was their significantly lower price and their more advanced DSP circuitry to protect the speakers.</span></p>
<p>They got delivered a few days ago and so far we&#8217;re really happy with them. They sound amazing: Perfect for the school&#8217;s numerous music performances. And they are powerful: Perfect for events like dances and parties.</p>
<p><span style="color: #000080;">If you&#8217;re looking for a set of high-quality portable speakers for a school, church, band or DJ, the Yamaha DSR series is most likely your best choice. They sound great, have lots of power and are well worth their money.</span></p>
<p>If you just use them for speech, a set of Yamaha DSR 112 would probably be a fine choice (I didn&#8217;t test the DSR 112, but assume they&#8217;re as good as the DSR 115 with a little less low-mids). If you&#8217;re using them for a band, go for a set of DSR 115, and if you have drums, base or anything else below 120 Hz, definitely get a pair of DSR 118W subwoofers along with them. Same goes for DJ and party use: a pair each of DSR 115 and DSR 118W should suffice to bring high-decibel, high-quality sound to a few hundred audience members.</p>
<p>If you have experiences with the Yamaha DSR (or the recently-released smaller DXR and DSW series), or have found other speakers in the same price range that sound better, please feel free to share them in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2012/03/active-pa-speaker-systems/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integrating BIND with AD-integrated Microsoft DNS</title>
		<link>http://blog.michael.kuron-germany.de/2011/10/integrating-bind-with-ad-integrated-microsoft-dns/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/10/integrating-bind-with-ad-integrated-microsoft-dns/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 09:36:33 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[ActiveDirectory]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[BIND9]]></category>
		<category><![CDATA[Microsoft DNS]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=191</guid>
		<description><![CDATA[I recently set up BIND9 to run secondary zones for an ActiveDirectory-integrated DNS server (the reason being that I hated effectively losing internet access when I rebooted my W2k8R2 server). While that was really easy (add the Linux server to the nameservers tab in DNS Admin, allow zone transfers and notifications, add slave zones in [...]]]></description>
				<content:encoded><![CDATA[<p>I recently set up BIND9 to run secondary zones for an ActiveDirectory-integrated DNS server (the reason being that I hated effectively losing internet access when I rebooted my W2k8R2 server). While that was really easy (add the Linux server to the nameservers tab in DNS Admin, allow zone transfers and notifications, add slave zones in the named.conf), I thought that it shouldn&#8217;t be too difficult to also automatically replicate AD-integrated Conditional Forwarders.</p>
<p>While they are easily found in the <em>DC=DomainDnsZones</em> and <em>DC=ForestDnsZones</em> branch inside the AD, it turns out that the server information is stored in <em>dnsproperty</em> attributes containing binary data. However, Microsoft actually provides a <a href="http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-DNSP%5D.pdf">specification</a> for their DNS data structures, which is certainly very commendable. But as it turns out, it appears to have been written by someone who had no clue about Endianness or how many bits are in a byte (*).<br />
The essence is: everything is Big Endian, except for IP addresses (the spec claims they are Network Byte Order, but in reality they are Little Endian), and every occurence of &#8220;1 byte&#8221; in section 2.3.1.1 dnsProperty should be replaced with &#8220;4 byte&#8221;.</p>
<p>So after taking about two hours for something that I expected would only take a couple minutes to hack together, I ended up with 400 lines of code that generate a file you can include in your named.conf that will look something like this:<br />
<code>zone "google.com" {<br />
    type forward;<br />
    forward first;<br />
    forwarders { 74.82.42.42; 2001:470:20:0:0:0:0:2; };<br />
};</p>
<p>zone "youtube.com" {<br />
    type forward;<br />
    forward first;<br />
    forwarders { 74.82.42.42; 2001:470:20:0:0:0:0:2; };<br />
};</code><br />
(For those curious, this sample configuration would point google.com and youtube.com at Hurricane Electric&#8217;s DNS server so that you get AAAA records, a.k.a. <a href="http://www.google.com/intl/en/ipv6/">Google over IPv6</a>)</p>
<p>After this worked, I decided to also pull my slave zone definitions through the same mechanism. It only took me a minute to do that.<br />
<code>zone "example.com" {<br />
	type slave;<br />
	file "slave_example.com";<br />
	masters { 10.0.0.1; };<br />
	allow-notify { 10.0.0.1; };<br />
};</code></p>
<p>So here we are: BIND9 as a fully-blown sync partner for AD-integrated DNS zones. To add a zone or conditional forwarder to BIND, add it to AD, set it to replicate to all DNS/domain controllers in this domain or forest, add the BIND server to the nameservers tab and allow zone transfers and notifications, and wait for the cron job to kick in.</p>
<p>I ended up having to write this script in PHP because Python&#8217;s LDAP module appears to have a broken SASL implementation, and you need SASL to use Kerberos for an LDAP connection.</p>
<p>The <a href='http://blog.michael.kuron-germany.de/wp-content/uploads/2011/10/condfwds.php_.txt'>PHP script</a> takes two parameters (1. the AD server&#8217;s address or the AD DNS domain name; 2. the AD base DN) and requires a valid Kerberos ticket.<br />
The <a href='http://blog.michael.kuron-germany.de/wp-content/uploads/2011/10/condfwds.sh_.txt'>shell script</a> (which you will most likely want to run from a cron job), which shares much of its code with my script from <a href="http://blog.michael.kuron-germany.de/2011/02/isc-dhcpd-dynamic-dns-updates-against-secure-microsoft-dns/" title="ISC DHCPd: Dynamic DNS updates against secure Microsoft DNS">ISC DHCPd: Dynamic DNS updates against secure Microsoft DNS</a>, needs to be configured with your realm, domain, base DN, user name (principal) and path to a keytab for that user (instruction on how to generate the keytab using ktutil are in the script&#8217;s comments).</p>
<p>(*) After doing all this, I figured that people from projects like Samba that write open source software to re-implement or interface with Microsoft products are doing an absolutely amazing job. They most likely aren&#8217;t getting any better specs than the one I found on MS DNS (if they get specs at all), and yet still somehow create almost perfect software that is a lot more complex than the simple stuff I did here.</p>
<p><strong>UPDATE 2011-10-30:</strong> Apparently, AD refuses all requests from Linux clients that come in via IPv6. To force IPv4, line 7 of the PHP script needs to be changed to <code>$conn = ldap_connect(gethostbyname($adserver), 389);</code>, which is also fixed in the downloadable script.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/10/integrating-bind-with-ad-integrated-microsoft-dns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mount ext3 VMDK in VMWare Fusion using VMDKMounter</title>
		<link>http://blog.michael.kuron-germany.de/2011/10/mount-ext3-vmdk-in-vmware-fusion/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/10/mount-ext3-vmdk-in-vmware-fusion/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 19:06:16 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=184</guid>
		<description><![CDATA[VMWare Fusion 3 comes with a tool called VMDKMounter.app. It allowed you to simply double-click NTFS or FAT32 VMDKs and they would be mounted on your desktop. VMWare Fusion 4 dropped this tool, but you can download version 3.1.3 and extract /Library/Application Support/VMware Fusion/VMDKMounter.app from the package using Pacifist (just make sure that VMDKMounter.app/Contents/MacOS/vmware-vmdkMounterTool has [...]]]></description>
				<content:encoded><![CDATA[<p>VMWare Fusion 3 comes with a tool called VMDKMounter.app. It allowed you to simply double-click NTFS or FAT32 VMDKs and they would be mounted on your desktop.</p>
<p>VMWare Fusion 4 dropped this tool, but you can download version 3.1.3 and extract <em>/Library/Application Support/VMware Fusion/VMDKMounter.app</em> from the package using <a href="http://www.charlessoft.com/">Pacifist</a> (just make sure that VMDKMounter.app/Contents/MacOS/vmware-vmdkMounterTool has the sticky bit set and is owned by root:wheel after you extract it).</p>
<p>Next, install <a href="http://osxfuse.github.com/">OSXFUSE</a> (the successor to <a href="http://code.google.com/p/macfuse/">MacFUSE</a>) and <a href="http://sourceforge.net/projects/fuse-ext2/">fuse-ext2</a> if you don&#8217;t already have them installed.</p>
<p>VMDKMounter attempts to mount EXT2 using <strong>/System/Library/Filesystems/ext2.fs/Contents/Resources/mount_ext2</strong>, so we need to create two symlinks:</p>
<p><code>cd /System/Library/Filesystems<br />
sudo ln -s fuse-ext2.fs ext2.fs<br />
cd ext2.fs/Contents/Resources<br />
sudo ln -s ../../mount_fuse-ext2 mount_ext2</code></p>
<p>Now we&#8217;re all set, you can simply open a VMDK by double-clicking it, or you can right-click a VMWare VM and open it with VMDKMounter.app and automatically have all its VMDKs mounted.</p>
<p>If you are receiving an NTFS-3G error message when mounting a non-NTFS VMDK: that&#8217;s perfectly normal, so you can just click OK. The error message is due to VMDKMounter simply trying a bunch of file system mounters until it finds one that doesn&#8217;t fail. As far as I can tell, it tries (in that order) ntfs, msdos, ntfs-3g, hfs, ext2, ext3.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/10/mount-ext3-vmdk-in-vmware-fusion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>How-To: Converting Xen Linux VMs to VMWare ESXi</title>
		<link>http://blog.michael.kuron-germany.de/2011/10/how-to-converting-xen-linux-vms-to-vmware-esxi/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/10/how-to-converting-xen-linux-vms-to-vmware-esxi/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 10:47:59 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualization]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=179</guid>
		<description><![CDATA[I have a couple Linux VMs I created on Xen using xen-create-image (as such, they are using pygrub and have one virtual disk file per partition). Now I want to migrate those over to a VMWare ESXi box. To convert your raw Xen disk images to VMWare vmdk files, do this: 1. In VMWare Fusion [...]]]></description>
				<content:encoded><![CDATA[<p>I have a couple Linux VMs I created on Xen using xen-create-image (as such, they are using pygrub and have one virtual disk file per partition). Now I want to migrate those over to a VMWare ESXi box. To convert your raw Xen disk images to VMWare vmdk files, do this:</p>
<p>1. In VMWare Fusion or Workstation, do a basic install of Debian Squeeze onto a flat-file (not split into 2GB segments and preallocated) VMDK that is slightly larger than your virtual Xen disk with a separate VMDK for swap.<br />
2. Downgrade it to Grub 1 using <em>apt-get install grub-legacy</em>, <em>grub-install /dev/sda</em>, <em>update-grub</em> (as Grub 2 is not compatible with /boot/grub/menu.lst files as generated by xen-create-image).<br />
3. Shut down and make a copy of the VMDK.<br />
4. Boot the VM back up and re-install Grub2 using <em>apt-get install grub</em>.<br />
5. Edit /boot/grub/grub.cfg and replace <em>root=UUID=xxxxxxxxxx</em> in the linux lines with <em>root=/dev/sda1</em><br />
6. Shut down the VM and attach the VMDK you copied in step 3 as an additional disk (this will be the target disk for our conversion).<br />
7. Boot it up and make sure that you&#8217;re getting a Grub2 screen (i.e. it is not booting from the copied VMDK).<br />
8. Using <em>mount</em>, check that your root disk is sda1 (which usually should be the first disk, not the copied disk). Using <em>ls /dev/sd*</em>, make sure it sees the target disk as sdc.<br />
9. <em>dd if=/path/to/xen/vm/disk.img of=/dev/sdc1 bs=1048576</em><br />
10. mount /dev/sdc1 /mnt; cd /mnt<br />
11. nano etc/fstab: replace swap disk /dev/xvda1 with /dev/sdb1 and root disk /dev/xvda2 with /dev/sda1<br />
12. nano etc/inittab: replace hvc0 with tty1<br />
13. nano boot/grub/menu.lst: replace /dev/xvda2 with /dev/sda1<br />
14. umount /mnt<br />
15. Attach the new virtual disk to a VM and boot a rescue system. There, drop to a shell on /dev/sda1 and apt-get update, apt-get install grub<br />
16. Reboot<br />
17. Done!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/10/how-to-converting-xen-linux-vms-to-vmware-esxi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using Intel AMT&#8217;s VNC server</title>
		<link>http://blog.michael.kuron-germany.de/2011/10/using-intel-amts-vnc-server/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/10/using-intel-amts-vnc-server/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 09:27:03 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[intel amt]]></category>
		<category><![CDATA[remote kvm]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[vpro]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=173</guid>
		<description><![CDATA[Newer Intel Chipsets with vPro/Intel AMT, such as the Q57, Q67 and C206 (as long as they&#8217;re paired with a Core i5/i7 or Xeon with integrated graphics), have a feature called Remote KVM. To use it, press Ctrl-P at the BIOS splash screen to get to the MEBx menu, set a password (minimum 8 characters, [...]]]></description>
				<content:encoded><![CDATA[<p>Newer Intel Chipsets with vPro/Intel AMT, such as the Q57, Q67 and C206 (as long as they&#8217;re paired with a Core i5/i7 or Xeon with integrated graphics), have a feature called Remote KVM.</p>
<p>To use it, press Ctrl-P at the BIOS splash screen to get to the MEBx menu, set a password (minimum 8 characters, mixed case, numbers and special characters are enforced), configure the network settings (they can even match the OS&#8217;s IP address), enable Remote KVM and disable User Opt-In.</p>
<p>Next, download the <a href="http://software.intel.com/en-us/articles/download-the-latest-intel-amt-software-development-kit-sdk/">Intel AMT SDK</a>, extract the ZIP and open .\Windows\Intel_AMT\Bin\KVM\KVMControlApplication.exe . There, you can enable KVM as seen in the following screenshot:<br />
<a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/10/Screen-shot-2011-10-08-at-10.28.40.png"><img class="aligncenter size-full wp-image-174" title="Intel AMT KVM Console Remote Machine Settings" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/10/Screen-shot-2011-10-08-at-10.28.40.png" alt="" width="923" /></a></p>
<p>KVM Status can either be set to &#8220;redirection ports&#8221; (meaning it will only be accessible to VNC clients that specifically support Intel AMT, such as RealVNC Viewer Plus or Intel&#8217;s KVM Console, the former of which costs $100, the latter of which constantly overlays a RealVNC logo on the screen), to &#8220;default port&#8221; (meaning it will be accessible on TCP port 5900 to any VNC client), or to &#8220;all ports&#8221; (which is the combination of both).<br />
If you enable VNC access, you will also need to set an RFB Password. As I found out the hard way (Intel actually has it hidden in their <a href="http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide/DOCS/Implementation%20and%20Reference%20Guide/HTMLDocuments/WS-Management_Class_Reference/IPS_KVMRedirectionSettingData.htm#RFBPassword">documentation</a> as well), it gets truncated at 8 characters and at the same time has the same security requirements as the general AMT password.<br />
If you disabled User Opt-In in the MEBx menu, you can disable it here as well.</p>
<p>So that&#8217;s it, now you can use almost any VNC client you like (RealVNC and Chicken of the VNC work fine, while Apple Remote Desktop appears to cause the VNC server to freeze) and control the machine just as if you were sitting in front of it.<br />
Two things I noticed: On my machine, the BIOS splash screen was not visible during a KVM connection (not even on a directly-attached screen), so to get to the BIOS I needed to blindly hit the corresponding key. Also, it is not possible to enter the MEBx menu during a KVM connection (probably for some obscure security reasons): if you hit the corresponding key, it immediately exits and continues normal bot; if you establish a KVM connection while in MEBx, you get disconnected immediately.</p>
<p>After about half an hour of playing with Intel AMT, I have to say it&#8217;s really cool. If you&#8217;re buying/building a home server, you should definitely consider getting a mainboard with Intel AMT 6.0 or later: You get server-grade remote management capabilities for a very small premium, which are very useful if you ever lock yourself out while remotely connected to the server.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/10/using-intel-amts-vnc-server/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Protected: Running Mac OS X 10.4, 10.5, 10.6 and 10.7 in VMWare Fusion 4.0</title>
		<link>http://blog.michael.kuron-germany.de/2011/09/running-mac-os-x-10-4-10-5-10-6-and-10-7-in-vmware-fusion-4-0/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/09/running-mac-os-x-10-4-10-5-10-6-and-10-7-in-vmware-fusion-4-0/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 14:28:37 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[10.4]]></category>
		<category><![CDATA[10.5]]></category>
		<category><![CDATA[10.6]]></category>
		<category><![CDATA[10.7]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[tiger]]></category>
		<category><![CDATA[vmware fusion]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=149</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
				<content:encoded><![CDATA[<form action="http://blog.michael.kuron-germany.de/wp-login.php?action=postpass" method="post">
<p>This post is password protected. To view it please enter your password below:</p>
<p><label for="pwbox-149">Password: <input name="post_password" id="pwbox-149" type="password" size="20" /></label> <input type="submit" name="Submit" value="Submit" /></p>
</form>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/09/running-mac-os-x-10-4-10-5-10-6-and-10-7-in-vmware-fusion-4-0/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Xen 4.0 and Citrix WHQL PV drivers for Windows</title>
		<link>http://blog.michael.kuron-germany.de/2011/06/141/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/06/141/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 09:29:00 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[citrix]]></category>
		<category><![CDATA[windows server 2008 r2]]></category>
		<category><![CDATA[x64]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=141</guid>
		<description><![CDATA[Xen 4.0 is supposed to be able to use Citrix&#8217;s WHQL certified Windows paravirtualization drivers. Their advantage over the GPLPV drivers is that they are code-signed, meaning they run on 64-bit Windows without disabling some of Windows&#8217; security features. UPDATE 2011-10-17: Signed GPLPV drivers are now available. I have not yet tested them, but I [...]]]></description>
				<content:encoded><![CDATA[<p>Xen 4.0 is <a href="http://wiki.xensource.com/xenwiki/Xen4.0">supposed</a> to be able to use Citrix&#8217;s WHQL certified Windows paravirtualization drivers. Their advantage over the <a href="http://wiki.xensource.com/xenwiki/XenWindowsGplPv">GPLPV drivers</a> is that they are code-signed, meaning they run on 64-bit Windows without disabling some of Windows&#8217; security features.</p>
<p><strong>UPDATE 2011-10-17</strong>: <a href="http://www.h-online.com/open/news/item/Univention-signs-Xen-Windows-driver-1361143.html">Signed GPLPV drivers are now available.</a> I have not yet tested them, but I assume the fix below is no longer necessary.</p>
<p>While the Citrix drivers included in XenServer 5.5 work (<a href="http://xenbits.xen.org/hg/xen-4.0-testing.hg/rev/be9b8be3c648?revcount=960">after making a single registry tweak</a>), the more recent ones included in e.g. <a href="http://downloads.xen.org/XCP/42052/XCP-1.0-base-42052.iso">Xen Cloud Platform 1.0</a> do not work right away:</p>
<p>If you install the XCP drivers, make that registry tweak and reboot the DomU, you&#8217;ll notice messages like <code>XENUTIL: WARNING: CloseFrontend: timed out in XenbusWaitForBackendStateChange: /local/domain/0/backend/console/[id]/0 in state INITIALISING; retry.</code> in your <em>/var/log/xen/qemu-dm-*.log</em> and Windows just gets stuck during boot and keeps spinning forever. To get it back to work, you&#8217;ll need to<br />
<code>xenstore-rm /local/domain/0/backend/console/[id]<br />
xenstore-rm /local/domain/0/backend/vfb/[id]</code><br />
after starting the VM (thanks to <a href="http://lists.xensource.com/archives/html/xen-users/2011-02/msg00631.html">Keith Coleman</a>&#8216;s mailing list post!).</p>
<p>To automatically run these commands upon DomU start, create a script named <em>/usr/lib/xen/bin/qemu-dm-citrixpv</em> with the following contents<br />
<code>#!/bin/sh</p>
<p>xenstore-rm /local/domain/0/backend/console/$2<br />
xenstore-rm /local/domain/0/backend/vfb/$2</p>
<p>sh -c "sleep 10; xenstore-rm /local/domain/0/backend/console/$2; xenstore-rm /local/domain/0/backend/vfb/$2" &#038;</p>
<p>exec /usr/lib/xen/bin/qemu-dm $*</code><br />
and <code>chmod +x</code> it.</p>
<p>Then, edit your DomU config file and modify the device_model line and point it to your new script:<br />
<code>device_model = '/usr/lib/xen/bin/qemu-dm-citrixpv'</code></p>
<p>Now your Windows Server 2008 R2 x64 HVM-DomU is all set!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/06/141/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asterisk: Remotely retrieving voicemail by pressing *</title>
		<link>http://blog.michael.kuron-germany.de/2011/04/asterisk-remotely-retrieving-voicemail-by-pressing/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/04/asterisk-remotely-retrieving-voicemail-by-pressing/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 12:00:07 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=135</guid>
		<description><![CDATA[Many howtos around the internet on how to remotely access your voicemail box involve a dedicated extension reachable from the outside or an IVR menu entry. But wouldn&#8217;t it be much nicer if you could just press the * DTMF key during the announcement? Turns out, this is quite simple: [incoming-external] exten => s,1,Dial(SIP/1234,20) exten [...]]]></description>
				<content:encoded><![CDATA[<p>Many howtos around the internet on how to remotely access your voicemail box involve a dedicated extension reachable from the outside or an IVR menu entry. But wouldn&#8217;t it be much nicer if you could just press the * DTMF key during the announcement? Turns out, this is quite simple:</p>
<p><code>[incoming-external]<br />
exten => s,1,Dial(SIP/1234,20)<br />
exten => s,n,Voicemail(1234,us)<br />
exten => a,1,VoiceMailMain(1234)<br />
exten => a,n,Hangup()</code></p>
<p>And it even works when you&#8217;re using macros (like I am):</p>
<p><code>[incoming-external]<br />
exten => 5551234,1,Macro(incoming-plus-voicemail,SIP/1234,20,1234)<br />
exten => 5551337,1,Macro(incoming-plus-voicemail,SIP/1337,20,1337)</p>
<p>[macro-incoming-plus-voicemail] ; SIP/xxx, wait time, voicemail<br />
exten => s,1,Dial(${ARG1},${ARG2}<br />
exten => s,n,Voicemail(${ARG3},us)<br />
; </code>push * during the announcement to access your mailbox<br />
<code>exten => a,1,VoiceMailMain(${ARG3})<br />
exten => a,n,Hangup()</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/04/asterisk-remotely-retrieving-voicemail-by-pressing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asterisk: Compile SRTP Module without recompiling Asterisk</title>
		<link>http://blog.michael.kuron-germany.de/2011/04/asterisk-compile-srtp-module-without-recompiling-asterisk/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/04/asterisk-compile-srtp-module-without-recompiling-asterisk/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 21:20:27 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Asterisk]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=129</guid>
		<description><![CDATA[I recently installed Asterisk 1.8.3 (the Asterisk team now provides pre-built Debian packages at http://packages.asterisk.org). Unfortunately, that package came without the res_srtp SRTP module. (UPDATE: Starting in 1.8.4, it does come with it.) Because I didn&#8217;t feel like re-compiling the entire package, I just took the corresponding version of res_srtp.c from the SVN, added the [...]]]></description>
				<content:encoded><![CDATA[<p>I recently installed Asterisk 1.8.3 (the Asterisk team now provides pre-built Debian packages at <a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+Packages">http://packages.asterisk.org</a>).<br />
Unfortunately, that package came without the res_srtp SRTP module. <em>(<strong>UPDATE</strong>: Starting in 1.8.4, it does come with it.)</em> Because I didn&#8217;t feel like re-compiling the entire package, I just took the corresponding version of <a href="http://svnview.digium.com/svn/asterisk/tags/1.8.3/res/res_srtp.c?revision=308575">res_srtp.c</a> from the SVN, added the following lines to the beginning of it:</p>
<p><code>#ifndef AST_MODULE<br />
#define AST_MODULE "res_srtp"<br />
#endif</code></p>
<p>and compiled and installed it using</p>
<p><code>gcc -shared res_srtp.c -o res_srtp.so -lsrtp<br />
sudo cp res_srtp.so /usr/lib/asterisk/modules/</code></p>
<p>You&#8217;ll need to have libsrtp0-dev and asterisk-dev installed, otherwise the compile will fail.<br />
Then, you can do <code>sudo asterisk -r</code> and load the module using <code>module load res_srtp</code> (or just restart Asterisk).</p>
<p>I&#8217;m still working on getting SRTP working flawlessly both incoming and outgoing and with stuff like transfers. Asterisk <a href="https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Specifics">Secure Calling Specifics</a> are a good starting point, but I&#8217;m also planning to write another post about this in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/04/asterisk-compile-srtp-module-without-recompiling-asterisk/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Asterisk: Change Callee-ID using CONNECTEDLINE</title>
		<link>http://blog.michael.kuron-germany.de/2011/04/asterisk-change-callee-id-using-connectedline/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/04/asterisk-change-callee-id-using-connectedline/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 21:10:38 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[sip]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=122</guid>
		<description><![CDATA[It&#8217;s easy to change your Caller ID (assuming your phone provider doesn&#8217;t filter it) in Asterisk using something like Set(CALLERID(name)=blah). This is often used to choose which number to use for an outgoing call if you have multiple on a single SIP or ISDN trunk. But did you know it&#8217;s just as easy to change [...]]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s easy to change your Caller ID (assuming your phone provider doesn&#8217;t filter it) in Asterisk using something like <em>Set(CALLERID(name)=blah)</em>. This is often used to choose which number to use for an outgoing call if you have multiple on a single SIP or ISDN trunk.</p>
<p>But did you know it&#8217;s just as easy to change the Callee ID on an outgoing call, i.e. change what your phone displays during the call? This can be very useful to display on the phone which one of several possible outgoing lines (multiple SIP providers, ISDN, &#8230;) was used or at which point in an IVR menu you are at the moment. To do this, use <em>Set(CONNECTEDLINE(name)=blah)</em>. Before getting started, set <em>sendrpid = pai</em> in your sip.conf.</p>
<p>To make things easier, I created two macros in my dialplan:</p>
<p><code>[macro-connectedline-name-number]<br />
exten =&gt; s,1,Set(CONNECTEDLINE(name,i)=${ARG1})<br />
exten =&gt; s,n,Set(CONNECTEDLINE(number,i)=${ARG2})<br />
exten =&gt; s,n,Set(CONNECTEDLINE(pres)=allowed)</code></p>
<p><code>[macro-connectedline-name]<br />
exten =&gt; s,1,Macro(connectedline-name-number,${ARG1}, ${MACRO_EXTEN})</code></p>
<p>Now I can do things like</p>
<p><code>[internal-test]<br />
exten =&gt; 101,1,Answer()<br />
exten =&gt; 101,n,Macro(connectedline-name,<em>Hello World</em>)<br />
exten =&gt; 101,n,Playback(hello-world)<br />
exten =&gt; 101,n,Hangup()</code></p>
<p>in my dialplan (IVR example).</p>
<p>Or how about</p>
<p><code>[outgoing]<br />
exten => 100,1,Macro(connectedline-name,<em>Mailbox</em>)<br />
exten => 100,n,VoiceMailMain(${CALLERID(num)},s)<br />
exten =&gt; _XXX.,n,Macro(connectedline-name,<em>VoIP 1</em>)<br />
exten =&gt; _XXX.,n,Dial(SIP/${EXTEN}@voipprovider)</code></p>
<p>(outgoing line example).</p>
<p>The Asterisk Wiki also has an entire page on <a href="https://wiki.asterisk.org/wiki/display/AST/Manipulating+Party+ID+Information">Manipulating Party ID Information</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/04/asterisk-change-callee-id-using-connectedline/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>NFS Performance: rsize and wsize</title>
		<link>http://blog.michael.kuron-germany.de/2011/03/nfs-performance-rsize-and-wsize/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/03/nfs-performance-rsize-and-wsize/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 11:23:29 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[nfs]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=119</guid>
		<description><![CDATA[NFS is supposed to be a very simple and fast network file protocol. However, when I tried to use it on my Xen box between a Debian Squeeze DomU and an NFS server running on the Debian Squeeze Dom0, I noticed that write performance was abysmal: any write more than a couple KB in size [...]]]></description>
				<content:encoded><![CDATA[<p>NFS is supposed to be a very simple and fast network file protocol. However, when I tried to use it on my Xen box between a Debian Squeeze DomU and an NFS server running on the Debian Squeeze Dom0, I noticed that write performance was abysmal: any write more than a couple KB in size would not only slow down to a crawl, but also bog down the DomU, making it rather difficult to even cancel the write.</p>
<p>After some researching and testing, I tracked it down to the rsize and wsize mount options: they specify the size of the chunks sent at a single time. Apparently, they are set to 1M if you don&#8217;t specify anything else. In my case, wsize=131072 and rsize=262144 showed the highest write and read speeds respectively. However, wsize=131072 is not too far away from the cliff after which writing drops to a crawl, so I decided to back it down to 65536.</p>
<p><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/03/nfs-size.png"><img class="aligncenter size-medium wp-image-120" title="NFS wsize/rsize" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/03/nfs-size-300x146.png" alt="" width="300" height="146" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/03/nfs-performance-rsize-and-wsize/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Patching DSDT in recent Linux kernels without recompiling</title>
		<link>http://blog.michael.kuron-germany.de/2011/03/patching-dsdt-in-recent-linux-kernels-without-recompiling/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/03/patching-dsdt-in-recent-linux-kernels-without-recompiling/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 14:18:04 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[acpi]]></category>
		<category><![CDATA[dsdt]]></category>
		<category><![CDATA[kernel]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=115</guid>
		<description><![CDATA[Up until a year or two ago, the Linux kernel let you replace the ACPI DSDT by adding a customized version to the initrd. However, more recent versions disable that by default. If you&#8217;re using Grub2 as your bootloader though, the alternative is simple: just add acpi /boot/dsdt.aml to your Grub config. If you prefer [...]]]></description>
				<content:encoded><![CDATA[<p>Up until a year or two ago, the Linux kernel let you replace the ACPI DSDT by adding a customized version to the initrd. However, more recent versions disable that by default. If you&#8217;re using Grub2 as your bootloader though, the alternative is simple: just add acpi /boot/dsdt.aml to your Grub config. If you prefer a more elegant solution, just add the attached <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/03/01_acpi.txt">01_acpi.txt</a> to /etc/grub.d, renamed it to 01_acpi and <i>chmod +x</i> it; then run <i>update-grub2</i> to rebuild your Grub config. It originally came from <a href="http://ubuntuforums.org/attachment.php?attachmentid=173402&amp;d=1287953669">ubuntuforums.org</a> and I removed the -e flag in the acpi line, which caused the new DSDT only to be visible to Grub, but not to the OS.</p>
<p>I believe the acpi command in Grub2 originally came from the Hackintosh community &#8211; messing around with DSDTs is a lot more common there because Mac OS X is rather picky.</p>
<p>For those of you who don&#8217;t know what I&#8217;m talking about: the DSDT describes certain hardware features your PC has, such as buttons, CPU power save modes, and lots of other things. Some mainboards have very poorly done BIOSes that have equally messed up DSDT tables. I won&#8217;t go into a lot of detail regarding how to fix those here though (it&#8217;s as simple as <em>cat /proc/acpi/dsdt &gt; dsdt.dat</em>; <em>iasl -d dsdt.dat</em>; editing <em>dsdt.dsl </em>to your liking; <em>iasl -tc dsdt.dsl</em> (this last step will probably produce a number of errors that can be solved by googling for the error number and making the appropriate changes in dsdt.dsl)).</p>
<p>Another valuable hint for people messing around with DSDTs: the DSDT is not the only place that can contain this kind of information, the other place would be the SSDT and possibly additional SSDTs. You can find them in /sys/firmware/acpi/tables and decompile them just like the DSDT as described above. Instead of recompiling the SSDT by itself, you could probably also consider merging it into your custom DSDT at the appropriate places.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/03/patching-dsdt-in-recent-linux-kernels-without-recompiling/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Using motd to warn you of upcoming fsck</title>
		<link>http://blog.michael.kuron-germany.de/2011/03/using-motd-to-warn-you-of-upcoming-fsck/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/03/using-motd-to-warn-you-of-upcoming-fsck/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 14:03:10 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[fsck]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=112</guid>
		<description><![CDATA[Has it ever happened to you that you remotely rebooted a Linux server and wondered why after 10 minutes you still couldn&#8217;t Ping or SSH into it? Quite often, this is caused by a lengthy run of fsck on one of your ext3 file systems (on current multi-TB disks, they can take an hour or [...]]]></description>
				<content:encoded><![CDATA[<p>Has it ever happened to you that you remotely rebooted a Linux server and wondered why after 10 minutes you still couldn&#8217;t Ping or SSH into it? Quite often, this is caused by a lengthy run of fsck on one of your ext3 file systems (on current multi-TB disks, they can take an hour or longer). They usually get triggered automatically around every six months or 30 mounts, and there&#8217;s no easy way of knowing when it will happen.</p>
<p>My solution to this is rather simple: <em>tune2fs -l</em> tells you when the next fsck is coming up, so why not run a script upon every boot and have it write that information into /etc/motd so that you can see it every time you SSH in? The script is below (as a bonus, drives being fscked in less than 5 mounts or a week are printed in red), so all you need to do is put it somewhere on your hard drive and add something like<br />
<code># Add FSCK status to MOTD<br />
	[ -f /root/fsck_stats.sh ] &#038;&#038; bash /root/fsck_stats.sh >> /var/run/motd</code><br />
to the init script that generates your motd (on Debian Squeeze, that would be /etc/init.d/bootlogs).</p>
<p><code>#!/bin/bash</code></p>
<p><code> </code></p>
<p><code>echo</p>
<p>for disk in /dev/sda1 /dev/mapper/vm--storage-vms /dev/sdb1<br />
do<br />
cur_mounts=$(tune2fs -l $disk | grep "Mount count:" | awk '{print $3}')<br />
max_mounts=$(tune2fs -l $disk | grep "Maximum mount count:" | awk '{print $4}')<br />
diff_mounts=$(echo $max_mounts-$cur_mounts | bc)<br />
last_check=$(tune2fs -l $disk | grep "Last checked:" | awk '{print $3}')<br />
next_check=$(tune2fs -l $disk | grep "Next check after:" | awk '{print $4" "$5" "$6" "$7" "$8}')<br />
next_check_timestamp=$(date -d "$next_check" "+%s")<br />
cur_timestamp=$(date "+%s")<br />
diff_next=$(echo $next_check_timestamp-$cur_timestamp | bc)</p>
<p>color=""<br />
[ $diff_mounts -lt 5 ] &amp;&amp; color="\033[31m"<br />
[ $diff_next -lt 604800 ] &amp;&amp; color="\033[31m"</p>
<p></code></p>
<p><code>echo -e "$color Next FSCK on $(basename $disk): $next_check or in $diff_mounts mounts\033[0m"</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/03/using-motd-to-warn-you-of-upcoming-fsck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPv6 router on Linux</title>
		<link>http://blog.michael.kuron-germany.de/2011/02/ipv6-router-on-linux/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/02/ipv6-router-on-linux/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 10:08:47 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[radvd]]></category>
		<category><![CDATA[tunnelbroker.net]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=110</guid>
		<description><![CDATA[Setting up Linux as an IPv6 router is really easy. Even if your ISP doesn&#8217;t do IPv6 yet (like mine), there&#8217;s no reason not to get an IPv6 tunnel from Tunnelbroker.net and be IPv6-ready within minutes. Do a basic install of your favorite Linux distribution. Since my server runs Xen, I just did xen-create-image &#8211;ip=192.168.200.5 &#8211;netmask=255.255.255.0 [...]]]></description>
				<content:encoded><![CDATA[<p>Setting up Linux as an IPv6 router is really easy. Even if your ISP doesn&#8217;t do IPv6 yet (like mine), there&#8217;s no reason not to get an IPv6 tunnel from <a href="http://www.tunnelbroker.net">Tunnelbroker.net </a>and be IPv6-ready within minutes.</p>
<ol>
<li>Do a basic install of your favorite Linux distribution.<br />
Since my server runs Xen, I just did <em>xen-create-image &#8211;ip=192.168.200.5 &#8211;netmask=255.255.255.0 &#8211;gateway=192.168.200.1 &#8211;nameserver=192.168.200.23 &#8211;mirror=http://ftp.de.debian.org/debian/ &#8211;passwd &#8211;hostname=router-ipv6 &#8211;dist=squeeze &#8211;arch=i386 &#8211;size=4G &#8211;swap=1G &#8211;dir=/data/vms/router-ipv6 &#8211;memory=64M &#8211;role=udev &#8211;pygrub </em>and ran <em>ln -s /etc/xen/router-ipv6.cfg /etc/xen/auto</em> to have it automatically start upon reboot. To start the VM, do xm create router-ipv6.cfg</li>
<li>SSH into the virtual machine and configure the LAN and the WAN interface. Since I&#8217;m using a tunnel, my WAN interface is a 6in4 interface; if you&#8217;re using a physical one you&#8217;ll need to manually edit the Xen VM config file to add the physical interface to the VM. So we&#8217;re adding the following lines to /etc/network/interfaces<br />
<code>iface eth0 inet6 static<br />
address 2001:470:xxxb:xxxx::1<br />
netmask 64</p>
<p>auto 6in4<br />
iface 6in4 inet6 v4tunnel<br />
address 2001:470:xxxa:xxxx::2<br />
netmask 64<br />
endpoint 216.66.80.30<br />
gateway 2001:470:xxxa:xxxx::1<br />
up ip route add ::/0 dev 6in4</code></li>
<li>Next, edit /etc/sysctl.conf and set net.ipv6.conf.all.forwarding=1 by removing the comment sign from the beginning of the line.</li>
<li><em>apt-get install radvd</em> and then edit /etc/radvd.conf to look like this:<br />
<code>interface eth0<br />
{<br />
AdvSendAdvert on;<br />
AdvLinkMTU 1280;<br />
prefix 2001:470:xxxb:xxxx::1/64<br />
{<br />
AdvOnLink on;<br />
AdvAutonomous on;<br />
};<br />
RDNSS 2001:470:xxxb:xxx:yyyy:yyyy:yyyy:yyyy<br />
{<br />
};<br />
</code><br />
Most of this is pretty self-explanatory (the prefix line should contain the address of the router&#8217;s network interface and everything else just enables router advertisements), however the RDNSS line needs to point to the IPv6 address (it will automatically get one after you finish step 6) of your local DNS forwarder.</li>
<li>Next, you&#8217;ll probably want to configure the firewall so that your computers can&#8217;t be accessed from outside (remember, with IPv6 every device gets a publicly routable address). apt-get install shorewall6 and then edit the following files to configure it:<br />
In /etc/default/shorewall6: <code>startup=1</code> (enables the firewall) and <code>wait_interface="6in4"</code> (your WAN interface)<br />
In /etc/shorewall6/zones: Add the lines <code>fw firewall</code>, <code>net ipv6</code> and <code>loc ipv6</code><br />
In /etc/shorewall6/interfaces: Add the lines <code>net 6in4 detect</code> and <code>loc eth0 detect</code><br />
In /etc/shorewall6/policy: Add the lines <code>net all REJECT notice</code>, <code>loc all ACCEPT</code>, <code>fw all ACCEPT</code> and <code>all all REJECT notice</code><br />
In /etc/shorewall6/rules: Configure the firewall rules to your liking. I added <code>Ping(ACCEPT) all all</code> to allow incoming pings (I don&#8217;t believe in this security-by-obscurity stuff). I also added <code>ACCEPT all loc:2001:470:xxxb:xxxx:zzzz:zzzz:zzzz:zzzz</code> because that machine has its own IPv6-configured firewall.</li>
<li>Reboot the VM.</li>
</ol>
<p>All your IPv6-ready clients should start picking up addresses automatically. Linux, Mac OS X and iPhones do as expected and base their IP on the MAC address. Windows 7 does the same, but also makes up a random IP which gets used by default for all outgoing connections due to privacy reasons. On Windows XP, you need to manually add IPv6 to the network protocols in the network connection properties, after which it&#8217;ll behave similarly to Windows 7.<br />
The DNS server announced by radvd however only gets picked up by the iPhone. Mac OS X only supports manually-configured IPv6 DNS servers as far as I can tell. Windows automatically configures fec0:0:0:ffff::1, fec0:0:0:ffff::2 and fec0:0:0:ffff::3 as its DNS servers; you could add one of these addresses to your DNS server (and add some other address in the fec0:0:0:ffff::/64 range to your IPv6 router VM&#8217;s LAN interface so that clients can actually find a route to it), but unfortunately the site-local prefix fec0::/10 has been deprecated for more than half a decade and should no longer be used. But fear not, it&#8217;s perfectly fine to talk to your DNS server using IPv4 &#8211; it will still resolve AAAA (IPv6 A) queries without issues. And I expect IPv4 to stay around for at least another decade, so you&#8217;re not likely to run into trouble for a long time.</p>
<ol></ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/02/ipv6-router-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ISC DHCPd: Dynamic DNS updates against secure Microsoft DNS</title>
		<link>http://blog.michael.kuron-germany.de/2011/02/isc-dhcpd-dynamic-dns-updates-against-secure-microsoft-dns/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/02/isc-dhcpd-dynamic-dns-updates-against-secure-microsoft-dns/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 13:31:46 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[ad]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[dhcp]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[kerberos]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=99</guid>
		<description><![CDATA[ISC DHCPd is capable of Dynamic DNS updates against servers like BIND that support shared-key authentication or any other server that supports unauthenticated updates (such as BIND or Microsoft DNS with secure updates disabled). So, what to do if you want to run ISC DHCPd on your Windows network, which is obviously running Microsoft&#8217;s DNS [...]]]></description>
				<content:encoded><![CDATA[<p>ISC DHCPd is capable of Dynamic DNS updates against servers like BIND that support shared-key authentication or any other server that supports unauthenticated updates (such as BIND or Microsoft DNS with secure updates disabled).</p>
<p>So, what to do if you want to run ISC DHCPd on your Windows network, which is obviously running Microsoft&#8217;s DNS server? BIND&#8217;s nsupdate tool supports Microsoft&#8217;s Kerberos authentication scheme when using the -g flag (the -o flag is only necessary for Windows 2000 Server, but not anymore for Windows Server 2008 R2), and DHCPd supports on commit/release/expiry blocks that let you run scripts upon these events. So here is my script:</p>
<p><code>#!/bin/bash</code></p>
<p><code>## CONFIGURATION ##</code></p>
<p><code>realm=EXAMPLE.COM<br />
principal=dhcpduser@$realm<br />
keytab=/root/dhcpduser.keytab<br />
domain=example.com<br />
ns=example-domain01.example.com</p>
<p>export KRB5CCNAME="/tmp/dhcp-dyndns.cc"</p>
<p># keytab can be generated using<br />
# $ ktutil<br />
# ktutil: addent -password -p dhcpduser@EXAMPLE.COM -k 1 -e aes256-cts-hmac-sha1-96<br />
# Password for dhcpduser@EXAMPLE.COM:<br />
# ktutil:  wkt dhcpduser.keytab<br />
# ktutil:  quit</p>
<p>## VARIABLES ##</p>
<p>action=$1<br />
ip=$2<br />
name=$(echo $3 | awk -F '.' '{print $1}')<br />
mac=$4</p>
<p>usage()<br />
{<br />
echo "USAGE:"<br />
echo $0 add 192.0.2.123 testhost 00:11:22:33:44:55<br />
echo $0 add 192.168.0.127 "" 00:11:22:44:33:55<br />
echo $0 delete 192.0.2.123 testhost 00:11:22:33:44:55<br />
echo $0 delete 192.0.2.127 "" 00:11:22:44:33:55<br />
}</p>
<p>if [ "$ip" = "" ]; then<br />
echo "IP missing"<br />
usage<br />
exit 101<br />
fi<br />
if [ "$name" = "" ]; then<br />
#echo "name missing"<br />
#usage<br />
#exit 102<br />
name=$(echo $ip | awk -F '.' '{print "dhcp-"$1"-"$2"-"$3"-"$4}')</p>
<p>if [ "$action" = "delete" ]; then<br />
name=$(host $ip | awk '{print $5}' | awk -F '.' '{print $1}')</p>
<p>echo $name | grep NXDOMAIN 2&gt;$1 &gt;/dev/null<br />
if [ "$?" = "0" ]; then<br />
exit 0;<br />
fi<br />
fi<br />
fi</p>
<p>ptr=$(echo $ip | awk -F '.' '{print $4"."$3"."$2"."$1".in-addr.arpa"}')</p>
<p>## KERBEROS ##</p>
<p>#export LD_LIBRARY_PATH=/usr/local/krb5-1.7/lib<br />
#export PATH=/usr/local/krb5-1.7/bin:$PATH</p>
<p>klist 2&gt;&amp;1 | grep $realm | grep '/' &gt; /dev/null<br />
if [ "$?" = 1 ]; then<br />
expiration=0<br />
else<br />
expiration=$(klist | grep $realm | grep '/' | awk -F '  ' '{system ("date -d \""$2"\" +%s")}' | sort | head -n 1)<br />
fi</p>
<p>now=$(date +%s)<br />
if [ "$now" -ge "$expiration" ]; then<br />
echo "Getting new ticket, old one expired $expiration, now is $now"<br />
kinit -F -k -t $keytab $principal<br />
fi</p>
<p>## NSUPDATE ##</p>
<p>case "$action" in<br />
add)<br />
echo "Setting $name.$domain to $ip on $ns"</p>
<p>oldname=$(host $ip $ns | grep "domain name pointer" | awk '{print $5}' | awk -F '.' '{print $1}')<br />
if [ "$oldname" = "" ]; then<br />
oldname=$name<br />
elif [ "$oldname" = "$name" ]; then<br />
oldname=$name<br />
else<br />
echo "Also deleting $oldname A record"<br />
fi</p>
<p>nsupdate -g &lt;<br />
server $ns<br />
realm $realm<br />
update delete $oldname.$domain 3600 A<br />
update delete $name.$domain 3600 A<br />
update add $name.$domain 3600 A $ip<br />
send<br />
UPDATE<br />
result1=$?<br />
nsupdate -g &lt;<br />
server $ns<br />
realm $realm<br />
update delete $ptr 3600 PTR<br />
update add $ptr 3600 PTR $name.$domain<br />
send<br />
UPDATE<br />
result2=$?<br />
;;</p>
<p>delete)<br />
echo "Deleting $name.$domain to $ip on $ns"<br />
nsupdate -g &lt;<br />
server $ns<br />
realm $realm<br />
update delete $name.$domain 3600 A<br />
send<br />
UPDATE<br />
result1=$?<br />
nsupdate -g &lt;<br />
server $ns<br />
realm $realm<br />
update delete $ptr 3600 PTR<br />
send<br />
UPDATE<br />
result2=$?<br />
;;<br />
*)<br />
echo "Invalid action specified"<br />
exit 103<br />
;;<br />
esac</p>
<p>result=$result1$result2<br />
if [ "$result" != "00" ]; then<br />
echo "DHCP-DNS Update failed: $result"<br />
logger "DHCP-DNS Update failed: $result"<br />
fi</p>
<p></code></p>
<p><code>exit $result</code></p>
<p>and here is the relevant part of my dhcpd.conf:</p>
<p><code>on commit {<br />
set noname = concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address));<br />
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);<br />
set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));<br />
set ClientName = pick-first-value(option host-name, host-decl-name, config-option host-name, noname);<br />
log(concat("Commit: IP: ", ClientIP, " Mac: ", ClientMac, " Name: ", ClientName));</code></p>
<p><code>execute("/root/dhcp-dyndns.sh", "add", ClientIP, ClientName, ClientMac);<br />
}<br />
on release {<br />
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);<br />
set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));<br />
log(concat("Release: IP: ", ClientIP, " Mac: ", ClientMac));<br />
# cannot get a ClientName here, for some reason that always fails</code></p>
<p><code>execute("/root/dhcp-dyndns.sh", "delete", ClientIP, "", ClientMac);<br />
}<br />
on expiry {<br />
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);<br />
# cannot get a ClientMac here, apparently this only works when actually receiving a packet<br />
log(concat("Expired: IP: ", ClientIP));<br />
# cannot get a ClientName here, for some reason that always fails</p>
<p></code></p>
<p><code> execute("/root/dhcp-dyndns.sh", "delete", ClientIP, "", "0");<br />
}</code></p>
<p>Figuring this all out took me several afternoons because Kerberos 5 1.8 has a bug where forwardable tickets (which is the default on Debian) are incompatible with nsupdate. Manually compiling 1.7 or getting 1.9 from the experimental Debian branch helps, as does adding the -F flag to kinit (which I did in the script above) to make the ticket non-forwardable.<br />
I filed a bug with Debian (<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=611906" target="_blank">#611906</a>) and Sam Hartman (thanks!) helped me track it down.</p>
<p><strong>EDIT 2011-11-17:</strong><br />
I recently ran into the issue that if the AD server could not be reached, dhcpd would stall (and not respond to DHCP requests during that time) until nsupdate reached its timeout. The fix is simple: rename dhcp-dyndns.sh to dhcp-dyndns-real.sh and create dhcp-dyndns.sh with the following contents to fork off the real script into the background:<br />
<code>#!/bin/bash</p>
<p>$(dirname $0)/dhcp-dyndns.sh $@ 2>&#038;1 | logger &#038;</code></p>
<p>Also, I updated the <i>on commit</i> section in the dhcpd.conf excerpt above to compose a fallback name from the IP address if the client provides no hostname. This fixes the issue that nsupdate tries to register a record based on the name and fails.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/02/isc-dhcpd-dynamic-dns-updates-against-secure-microsoft-dns/feed/</wfw:commentRss>
		<slash:comments>69</slash:comments>
		</item>
		<item>
		<title>Extending Active Directory for Mac OS X clients</title>
		<link>http://blog.michael.kuron-germany.de/2011/02/active-directory-mac-os-x-mcx/</link>
		<comments>http://blog.michael.kuron-germany.de/2011/02/active-directory-mac-os-x-mcx/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 13:20:05 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technical Stuff]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[ad]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[mcx]]></category>
		<category><![CDATA[opendirectory]]></category>
		<category><![CDATA[windows server 2008 r2]]></category>
		<category><![CDATA[workgroup manager]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=94</guid>
		<description><![CDATA[After I wrote about building your own OpenDirectory server on Linux a while back, I decided to do the same thing on Windows Server 2008 R2. The process of extending the AD schema to include Apple classes and attributes is documented by Apple (this is the Leopard version of the document &#8211; if you don&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<p>After I wrote about building your own <a href="http://blog.michael.kuron-germany.de/2009/04/building-your-own-opendirectory-server-on-linux/">OpenDirectory server on Linux</a> a while back, I decided to do the same thing on Windows Server 2008 R2. The process of extending the AD schema to include Apple classes and attributes is <a href="http://images.apple.com/business/solutions/it/docs/Modifying_the_Active_Directory_Schema.pdf">documented by Apple</a> (this is the Leopard version of the document &#8211; if you don&#8217;t plan on having exclusively Snow Leopard clients, you can follow the <a href="http://images.apple.com/business/solutions/it/docs/L407117B-US_Mod_AD_Schema_Support_Macs_WP-4.pdf">newer version</a> of the document that skips a couple of things that Snow Leopard no longer needs).</p>
<p>But since schema extensions are generally frowned upon in the Windows world because they&#8217;re irreversible (why the heck, Microsoft&#8230;?), I initially tried a dual-directory (golden triangle, magic triangle) type approach where I&#8217;d be augmenting my AD with Apple records coming from an AD LDS (Active Directory Lightweight Directory Services, previously called ADAM, Active Directory User Mode, which is basically a plain LDAP server from Microsoft). While this may sound like a great idea, I just couldn&#8217;t get it to work. After dozens of manual schema extensions to AD LDS (Microsoft doesn&#8217;t include many standard LDAP attributes, so I had to dig through the dependencies of apple.schema and even tried importing a complete OD schema), I gave up because I could not get Workgroup Manager to authenticate against it to allow me to make changes.</p>
<p>So the next thing to do was follow Apple&#8217;s AD schema extension guide (linked above) and do what everybody else did. This was rather straight-forward (managed preferences for users, groups and computers worked right away), but when I tried to create a computer list (which is not possible using Snow Leopard&#8217;s Server Admin Tools, but requires Tiger&#8217;s (which throw loads of errors on Snow Leopard but still get the job done) since Leopard introduced computer groups which however are not supported by the AD plugin), it just said I didn&#8217;t have permission to do that. After enabling DirectoryService debug logging (<em>killall -USR1 DirectoryService &amp;&amp; killall -USR2 DirectoryService</em>), I traced it down to <em>Active Directory: Add record CN=Untitled_1,CN=Mac OS X,DC=xxx,DC=zz with FAILED &#8211; LDAP Error 19</em> in /Library/Logs/DirectoryService/*. Apparently, that&#8217;s caused by some versions of ADSchemaAnalyzer setting <em>objectClassCategory</em> to 0 instead of 1 on all exported classes. Too bad AD schema extensions are irreversible and that&#8217;s one of the attributes you can&#8217;t change later on&#8230; <img src='http://blog.michael.kuron-germany.de/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  Well, with AD Schema Management MMC snap-in, I was able to rename the botched apple-computer-list class, defunct it and add a new one using ldifde. With some really wild hacking in the AD Schema using ADSI Editor, I was then able to  eventually get OS X to no longer look at the renamed attribute, but instead at the new one. To see whether you have been successful, <em>killall DirectoryService</em>, wait a few seconds and <em>grep -H computer-list /Library/Preferences/DirectoryService/ActiveDirectory*</em> will show a line indicating which class in the schema it&#8217;s using.</p>
<p>Once you&#8217;re there, everything should work as expected. If you don&#8217;t want to use Tiger&#8217;s Workgroup Manager to create old-style computer lists, you can do that in ADSI Editor and create <em>apple-computer-list</em> objects in the <em>CN=Mac OS X</em> branch by hand.</p>
<p>So, attached is the schema ldif that&#8217;s exactly the way it should be. I really wonder why Apple doesn&#8217;t provide it themselves &#8211; it&#8217;s going to turn out exactly like that every time you follow their guide on any Windows server&#8230; <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2011/02/mods.ldif_.txt">Apple Schema for Active Directory</a></p>
<p>I guess that the overall conclusion of this should be that AD schema extensions in general and specifically Mac OS X managed clients in AD environments are a nasty hack. I suppose the dual directory/magic triangle/golden triangle approach with a Microsoft AD and an Apple OD would work, but it requires maintaining two separate directories, which may not be that great in a larger environment either.</p>
<p>If Apple discontinues Mac OS X Server at some point in the near future (which the demise of the Xserve and the lack of announcements regarding Mac OS X 10.7 Server alongside Mac OS X Lion suggest), this is definitely something they need to improve. There are some third-party solutions that store MCX settings outside of AD (similar to Windows GPOs, which are stored on the SYSVOL share) such <a href="http://www.thursby.com/products/admitmac.html">Thursby ADmitMac</a> &#8211; however that&#8217;s a rather expensive solution (a dozen client licenses costs about as much as two Mac mini servers) and might break after OS updates (though from what I&#8217;ve heard, they&#8217;re rather quick at providing updates). If Apple does discontinue Mac OS X Server, they should definitely improve Lion&#8217;s AD integration to replicate ADmitMac&#8217;s features.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2011/02/active-directory-mac-os-x-mcx/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>HTML to ePub using Sigil</title>
		<link>http://blog.michael.kuron-germany.de/2010/12/html-to-epub-using-sigil/</link>
		<comments>http://blog.michael.kuron-germany.de/2010/12/html-to-epub-using-sigil/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 22:11:19 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[ebooks]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sigil]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=87</guid>
		<description><![CDATA[I was looking for a way to convert HTML books into an ePub file. The general layout of the file should be preserved (including images), while all the stuff that doesn&#8217;t make sense on an ebook reader (such as navigation elements and the usual &#8220;back to top&#8221; links) should be removed. After trying Calibre rather [...]]]></description>
				<content:encoded><![CDATA[<p>I was looking for a way to convert HTML books into an ePub file. The general layout of the file should be preserved (including images), while all the stuff that doesn&#8217;t make sense on an ebook reader (such as navigation elements and the usual &#8220;back to top&#8221; links) should be removed.</p>
<p>After trying <a href="http://calibre-ebook.com/" target="_blank">Calibre</a> rather extensively, I came across an app named <a href="http://code.google.com/p/sigil/" target="_blank">Sigil</a>, which does exactly what I want: You just throw in your HTML files (it automatically imports images referenced by them) and add some metadata.</p>
<p>Before proceeding, you should use your favorite scripting language (or modify the attached quick-and-dirty <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/12/clean-html.php_.txt">PHP script</a>) to remove everything but the main part of the chapter from the HTML files. (Make sure to remove any tables or divs surrounding the entire content because that might break page-by-page navigation on your ebook reader).</p>
<p>Sigil works very smooth if your HTML files are in alphabetical order. If they&#8217;re not, don&#8217;t despair: take the index.html file that (hopefully) came with them and us your favorite scripting language (or modify the attached quick-and-dirty <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/12/clean-html.php_.txt">PHP script</a>) to grab all the links from it (be sure to remove anchors and duplicates) and generate an XML structure like <code>&lt;spine toc="ncx"&gt;<br />
&lt;itemref idref="file1.html" /&gt;<br />
&lt;itemref idref="file2.html" /&gt;<br />
&lt;/spine&gt;</code>. Manually replace the <code>spine</code> section in the content.opf file inside the generated ePub with the lines you just created. Then re-open the ePub in Sigil and check whether it found any HTML files you forgot to include (they will show up at the top of the file list) &#8211; if there are any, move them to the place where you want them.</p>
<p>Once you have everything the way you want it, check the auto-generated table of contents using the TOC Editor option. Chances are that you have everything in there duplicated if the links in your index.html file are recognized as chapter headlines. In that case, just uncheck those (if you don&#8217;t feel like unchecking 500 items, I&#8217;ve <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/12/uncheck.applescript.txt">attached an AppleScript</a> to do that, just select the bottom-most line you want unchecked and adjust the number of lines inside the script).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2010/12/html-to-epub-using-sigil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS 4.1: Undocumented VPN API, used by Cisco AnyConnect</title>
		<link>http://blog.michael.kuron-germany.de/2010/09/ios-4-1-undocumented-vpn-api-used-by-cisco-anyconnect/</link>
		<comments>http://blog.michael.kuron-germany.de/2010/09/ios-4-1-undocumented-vpn-api-used-by-cisco-anyconnect/#comments</comments>
		<pubDate>Sat, 25 Sep 2010 13:30:55 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=72</guid>
		<description><![CDATA[A few days ago, Cisco AnyConnect was admitted to the App Store. This was mentioned by a few blogs, but they didn&#8217;t seem to notice the relevance of it. AnyConnect is an enterprise SSL VPN technology by Cisco, so this may not seem relevant to all that many people at first sight. However, in order [...]]]></description>
				<content:encoded><![CDATA[<p>A few days ago, <a href="http://itunes.apple.com/app/cisco-anyconnect/id392790924">Cisco AnyConnect</a> was admitted to the App Store. This was mentioned by a few blogs, but they didn&#8217;t seem to notice the relevance of it. AnyConnect is an enterprise SSL VPN technology by Cisco, so this may not seem relevant to all that many people at first sight.<br />
However, in order to implement a VPN client to provide VPN connectivity for other apps, you need to hook into the operating system&#8217;s network stack. On the iOS App Store, everybody knows that Apple is rather strict on what a developer can do &#8212; hooking into the OS kernel and providing network functionality to other apps isn&#8217;t something they provide APIs for (and therefore don&#8217;t allow).</p>
<p>Wondering how Cisco got around these App Store limitations, I took a closer look at the AnyConnect app. Upon first starting it, it asks whether you want to let it &#8220;extend&#8230; the Virtual Private Network (VPN) capabilities of your device&#8221;.</p>
<div id="attachment_73" class="wp-caption alignnone" style="width: 210px"><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/IMG_0127.png"><img class="size-medium wp-image-73" title="Cisco AnyConnect app" alt="" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/IMG_0127-200x300.png" width="200" height="300" /></a><p class="wp-caption-text">Cisco AnyConnect Secure Mobility Client extends the Virtual Private Network (VPN) capabilities of your device. Do you want to enable this software? Don&#8217;t Allow / OK</p></div>
<p>After entering a VPN server name etc., I switched over to the Settings app and noticed that the newly created AnyConnect VPN showed up as a system-wide VPN (though if you try to edit it from there, it&#8217;ll just say that you should use the AnyConnect app instead).</p>
<div id="attachment_79" class="wp-caption alignnone" style="width: 210px"><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/IMG_0128.png"><img class="size-medium wp-image-79" title="VPN settings" alt="" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/IMG_0128-200x300.png" width="200" height="300" /></a><p class="wp-caption-text">To configure the settings for &#8230;.., use the app provided by Cisco.</p></div>
<p>Odd, how would an app be able to do any of this if it&#8217;s not allowed to get involved with iOS deeper than the App Store guidelines would allow?</p>
<p>Moving on and digging deeper into the .ipa bundle:</p>
<p>The Payload contains <em>AnyConnectDataAgent.<strong>vpnplugin</strong></em>, in addition to the <em>AnyConnect.app</em>:</p>
<div id="attachment_76" class="wp-caption alignnone" style="width: 254px"><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/Screen-shot-2010-09-25-at-15.13.06.png"><img class="size-medium wp-image-76" title="AnyConnect 2.4.3032.ipa" alt="" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/Screen-shot-2010-09-25-at-15.13.06-244x300.png" width="244" height="300" /></a><p class="wp-caption-text">AnyConnectDataAgent.vpnplugin</p></div>
<p><em>AnyConnect.app</em>&#8216;s <em>Entitlements.plist</em> contains an entitlement named <strong>com.apple.networking.vpn.configuration</strong>:</p>
<div id="attachment_77" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/Screen-shot-2010-09-25-at-14.54.17.png"><img class="size-medium wp-image-77" title="AnyConnect.app's Entitlements.plist" alt="" src="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/09/Screen-shot-2010-09-25-at-14.54.17-300x178.png" width="300" height="178" /></a><p class="wp-caption-text">com.apple.networking.vpn.configuration</p></div>
<p>Neither vpnplugin bundles nor the com.apple.networking.vpn.configuration entitlement are documented anywhere (at least not in a way that can be found through Google). Since this appears to be a special iOS API created by Apple specifically for Cisco, the question is whether it&#8217;s also open to other developers. The only other app I&#8217;ve found that uses it is <a href="http://itunes.apple.com/app/junos-pulse/id381348546">Juniper Junos Pulse</a>, which was posted a few weeks before the AnyConnect app. Since both Junos Pulse and AnyConnect have in common that they require iOS 4.1, I think it&#8217;s safe to assume that 4.1 introduced the API they use.<br />
Personally, I&#8217;d be interested to see an OpenVPN client for the iPhone. I&#8217;m not sure whether that will ever happen though if this VPN API only exits semi-officially, especially since OpenVPN is not backed by a big company like Cisco or Juniper.</p>
<p><span style="text-decoration: underline;" data-mce-mark="1">Update 2011:</span> The German computer magazine <a href="http://www.heise.de/artikel-archiv/ct/2011/10/160_kiosk">c&#8217;t wrote about the API</a>, but couldn&#8217;t make much sense of it either.</p>
<p><span style="text-decoration: underline;" data-mce-mark="1">Update 2012:</span> The current list of apps using this API consists of: <a href="http://itunes.apple.com/de/app/junos-pulse/id381348546?mt=8">Juniper Junos Pulse</a> (released September 2010, requires iOS 4.1), <a href="http://itunes.apple.com/de/app/cisco-anyconnect/id392790924?mt=8">Cisco AnyConnect</a> (released September 2010, requires iOS 4.1), <a href="http://itunes.apple.com/de/app/f5-big-ip-edge-client/id411062210?mt=8">F5 BIG-IP</a> (released December 2010, requires iOS 4.2), <a href="http://itunes.apple.com/de/app/sonicwall-mobile-connect/id466931806?mt=8">SonicWall Mobile Connect</a> (released December 2011, requires iOS 4.2), <a href="http://itunes.apple.com/de/app/aruba-networks-via/id481378525?mt=8">Aruba VIA</a> (released December 2011, requires iOS 4.3) and <a href="https://itunes.apple.com/de/app/id506669652?mt=8">CheckPoint Mobile VPN</a> (released March 2012, requires iOS 5.0).</p>
<p><span style="text-decoration: underline;" data-mce-mark="1">Update 2012</span>: Googling for the VPN entitlement now not only finds my blog post, but also configd source code at Apple: first in <a href="http://opensource.apple.com/source/configd/configd-395.6/SystemConfiguration.fproj/helper/SCHelper_server.c">OS X 10.7 sources</a> and later in <a href="http://www.opensource.apple.com/source/configd/configd-453.16/SystemConfiguration.fproj/helper/SCHelper_server.c">OS X 10.8 sources</a> (but not in OS X 10.6, which iOS 4 was based on). In the older version, inside an ifdef checking for iPhone OS, a constant named kSCVPNFilterEntitlementName is declared containing that entitlement, but the constant never gets used. In OS X 10.8, it is no longer ifdeffed to the iPhone OS and actually gets used for allowing limited access to the global preferences.plist.</p>
<p><span style="text-decoration: underline;">Update 2012</span>: Playing around with AnyConnect again, I noticed that it now uses a generic utun network interface, which is similar to a Linux-style layer 3 tun interface. utun is used for example by Mac OS X&#8217;s Back to my Mac feature: the kernel implementation in Mac OS X 10.8.2 can be found in the XNU source at <a href="http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/bsd/net/if_utun.c">bsd/net/if_utun.c</a>. Some details can be found in <a href="http://www.amazon.com/dp/1118057651/">Levin, Jonathan. Mac OS X and iOS Internals: To the Apple&#8217;s Core. Chapter 17, Layer II, Case Study: utun. Wiley, 2012</a>.</p>
<p>I have received several more reports of unsuccessful attempts to get access to the VPN API. Apparently despite now offering a generic utun interface, Apple continues to be very strict about it. And to date, there still isn&#8217;t an OpenVPN client for iOS.</p>
<p><span style="text-decoration: underline;">Update 2013</span>: <a href="http://blog.michael.kuron-germany.de/2013/01/openvpn-for-ios/">OpenVPN Connect</a> was released today. It supports tun-style OpenVPN connections. Hooray, finally we can use OpenVPN on iOS! Apparently it can even be managed using the &#8220;Custom SSL&#8221; option in iPhone Configuration Utility.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2010/09/ios-4-1-undocumented-vpn-api-used-by-cisco-anyconnect/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>3rd party Exchange ActiveSync servers</title>
		<link>http://blog.michael.kuron-germany.de/2010/04/3rd-party-exchange-activesync-servers/</link>
		<comments>http://blog.michael.kuron-germany.de/2010/04/3rd-party-exchange-activesync-servers/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 10:02:35 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[eas]]></category>
		<category><![CDATA[exchange activesync]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=61</guid>
		<description><![CDATA[I&#8217;ve recently been looking for a comprehensive list of mail/groupware servers/services that offer Exchange ActiveSync integration, e.g. for the iPhone or Windows Mobile. Since I couldn&#8217;t find one, I&#8217;m putting together a list myself. (I&#8217;m not including Microsoft Exchange Server and all those Hosted Exchange solutions, since they&#8217;re pretty obvioius choices.) Services: Google Mail using [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve recently been looking for a comprehensive list of mail/groupware servers/services that offer Exchange ActiveSync integration, e.g. for the iPhone or Windows Mobile. Since I couldn&#8217;t find one, I&#8217;m putting together a list myself. (I&#8217;m not including Microsoft Exchange Server and all those Hosted Exchange solutions, since they&#8217;re pretty obvioius choices.)</p>
<p><strong>Services:</strong><br />
<a href="http://mail.google.com">Google Mail</a> using <a href="http://www.google.com/mobile/sync/">Google Sync</a>: Gmail (free) or own domain (free for <a href="http://www.google.com/apps/intl/en/group/index.html">up to 50 users</a>)<br />
coming in June: <a href="http://arstechnica.com/microsoft/news/2010/04/activesync-ssl-coming-to-hotmail.ars">Hotmail</a><br />
<a href="https://www.nuevasync.com/">NuevaSync Premium</a>: works with any IMAP mail server ($25/year)</p>
<p><strong>Server software:</strong><br />
<a href="http://www.kerio.com/connect">Kerio Connect</a>&#8216;s <a href="http://www.kerio.com/connect/wireless/activesync">ActiveSync Support</a> ($540 for 5 users)<br />
<a href="http://www.open-xchange.com/">Open-Xchange</a> using <a href="http://www.open-xchange.com/en/mobility-solutions-en">OXtender for Business Mobility</a>: ($21.75 / 14.50€ per user)<br />
<a href="https://www.scalix.com/">Scalix</a> using <a href="http://www.scalix.com/enterprise/products/activesync.php">Scalix ActiveSync</a>: ($299 for 10 users)<br />
<a href="http://www.zimbra.com">Zimbra Collaboration Suite</a> using <a href="http://www.zimbra.com/products/mobile_smartphone.html">Zimbra Mobile for Smartphones</a>: ($25/$35 per user per year + $500/$1000 per year)</p>
<p><a href="http://z-push.sourceforge.net/soswp/index.php?pages_id=1&#038;t=home">Z-Push</a> (free, appears to with any IMAP server)</p>
<p>If you know any others, please go ahead and add them to the comments, and I&#8217;ll add them to this list.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2010/04/3rd-party-exchange-activesync-servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beejive Transcript Importer for Adium</title>
		<link>http://blog.michael.kuron-germany.de/2010/02/beejive-transcripts-to-adium/</link>
		<comments>http://blog.michael.kuron-germany.de/2010/02/beejive-transcripts-to-adium/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 14:50:54 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[adium]]></category>
		<category><![CDATA[beejive]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[im]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=53</guid>
		<description><![CDATA[A few months ago, I wrote a quick and dirty script that goes through iTunes&#8217; iPhone backup, searches for Beejive&#8217;s data and converts it to Adium-compatible chat logs. It even imports files and pictures. It does not support timezones and daylight savings time, but other than that, it does a good job. I was initially [...]]]></description>
				<content:encoded><![CDATA[<p>A few months ago, I wrote a quick and dirty script that goes through iTunes&#8217; iPhone backup, searches for Beejive&#8217;s data and converts it to Adium-compatible chat logs. It even imports files and pictures. It does not support timezones and daylight savings time, but other than that, it does a good job. I was initially planning for writing a converter to iChat log format, but iChat&#8217;s transcripts basically consists of serialized data stored in plists and is undocumented, so it would be very difficult to implement iChat&#8217;s transcript format.</p>
<p>You may download it <a href="http://blog.michael.kuron-germany.de/wp-content/uploads/2010/02/beejive_importer.php.command">here</a>. If you find a bug, please do let me know in the comments, but don&#8217;t expect I&#8217;ll fix it anytime soon <img src='http://blog.michael.kuron-germany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2010/02/beejive-transcripts-to-adium/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Slim down Final Cut Studio&#8217;s Media Content using HFS Compression</title>
		<link>http://blog.michael.kuron-germany.de/2009/12/hfs-compression-for-final-cut-studio/</link>
		<comments>http://blog.michael.kuron-germany.de/2009/12/hfs-compression-for-final-cut-studio/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 16:39:25 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Final Cut Studio]]></category>
		<category><![CDATA[iLife]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Technical Stuff]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[fcs]]></category>
		<category><![CDATA[hfs+]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=48</guid>
		<description><![CDATA[A full installation of Final Cut Studio 3 with all media content (for Motion, DVD Studio Pro, and Soundtrack Pro Loops) takes up around 40-50 GB of hard drive space. How about regaining 5-10 GB of precious by enabling HFS compression for these folders? Since HFS compression is completely transparent, there are no adverse effects [...]]]></description>
				<content:encoded><![CDATA[<p>A full installation of Final Cut Studio 3 with all media content (for Motion, DVD Studio Pro, and Soundtrack Pro Loops) takes up around 40-50 GB of hard drive space.<br />
How about regaining 5-10 GB of precious by enabling <a href="http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars/3">HFS compression</a> for these folders? Since HFS compression is completely transparent, there are no adverse effects to expect (other than browsing the content libraries being almost unnoticeably slower).</p>
<p>To start, you&#8217;ll need a command-line tool called <a href="http://web.me.com/brkirch/brkirchs_Software/afsctool/afsctool.html">afsctool</a> which can compress (and, amongst other features, decompress) folders using HFS compression. The command you&#8217;ll need to run is e.g. <strong><em>sudo afsctool -c -l -k -v -i -9 /Library/Application\ Support/Final\ Cut\ Studio</em><span style="font-weight: normal;">. This compresses all files the given folder using the highest possible compression, verifies its results, prints out the names of files it is unable to compress, and outputs statistics once it&#8217;s done.</span></strong></p>
<p><strong><span style="font-weight: normal;">Some of the folders I compressed:<br />
/Library/Application Support/Final Cut Studio/ (contains Motion and DVD Studio Pro templates): 22.5% compression savings<br />
/Library/Application Support/LiveType/ (contains Motion&#8217;s LiveType fonts): 11.4% compression savings<br />
/Library/Application Support/GarageBand/ (contains GarageBand&#8217;s  instruments and learning-to-play stuff): 14.3% compression savings<br />
/Library/Application Support/iDVD/ (contains iDVD&#8217;s themes): 19.5% compression savings<br />
/Library/Audio/Apple Loops/ (contains GarageBand&#8217;s and Soundtrack Pro&#8217;s loops): 4.1%<br />
/Library/Audio/Impulse Responses/ (contains  Soundtrack Pro&#8217;s impulse response data): 41.3% compression savings</span></strong></p>
<p><strong><span style="font-weight: normal;">Looking at the compression savings: everything that contains high-quality video can be compressed by around 20%, while audio which is already heavily compressed only yields around 5%. The most amazing result though are the 40% by which the Impulse Responsed were compressed &#8211; apparently, these are uncompressed AIFF audio files and thus ideal for compression.</span></strong></p>
<p><strong><span style="font-weight: normal;">Obviously, your mileage may vary and I&#8217;m not responsible if you compress too much and break your system (I&#8217;m sure there is a reason why Apple didn&#8217;t compress all system files). However, compressing the iLife and Final Cut Studio media content appears safe, I haven&#8217;t noticed any unwanted side-effects and it seems well worth trying if you&#8217;d like to regain a few gigabytes.</span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2009/12/hfs-compression-for-final-cut-studio/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Laptop Theft Tracking Software for Mac OS X</title>
		<link>http://blog.michael.kuron-germany.de/2009/08/laptop-thaft-tracker/</link>
		<comments>http://blog.michael.kuron-germany.de/2009/08/laptop-thaft-tracker/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 10:44:23 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ltt]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=40</guid>
		<description><![CDATA[Over the past 2.5 years or so, I&#8217;ve been developing a piece of software that allows tracking a stolen Mac laptop (works for Desktops too, though they are obviously less likely to get stolen). Once installed on your Mac, it starts contacting my server in regular intervals to check whether it has been armed through [...]]]></description>
				<content:encoded><![CDATA[<p>Over the past 2.5 years or so, I&#8217;ve been developing a piece of software that allows tracking a stolen Mac laptop (works for Desktops too, though they are obviously less likely to get stolen).<br />
Once installed on your Mac, it starts contacting my server in regular intervals to check whether it has been armed through a Web GUI. If it is armed, it starts sending screenshots and iSight captures, as well as network information like internal and external IP and available wireless networks, which you can then provide to the police in order to aid recovery of your Mac. So in that regard, it is very similar to software like e.g. <a href="http://www.orbicule.com/undercover/mac/">Orbicule&#8217;s Undercover</a>.</p>
<p>After 3 major releases of LTT and beta testing on close to 200 computers, I can now say that version 3.0.4 is very stable and runs well on both Tiger and Leopard, has no known bugs and is ready for widespread use. My current server setup can (theoretically) handle around 10000 simultaneously active clients. If you&#8217;re interested in testing it or if you would like to give your Mac some additional theft protection, please contact me so that I can set you up with an account to use the service.</p>
<p><strong>Frequently Asked Questions</strong></p>
<p>How secure is LTT?<br />
All communication is done over an SSL-encrypted connection, so it is protected from being spied on and not prone to things like ARP spoofing or DNS poisoning.</p>
<p>How do you prevent unauthorized access to my LTT account, which could potentially be used for spying?<br />
As long as you keep your password secret, there is not a whole lot you need to worry about. However, if somebody were to break into my server, I obviously can&#8217;t guarantee for it <img src='http://blog.michael.kuron-germany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  .</p>
<p>Why am I not receiving screenshots?<br />
If the screen is asleep, screenshots are apparently not possible &#8211; this is not a bug in my software, it&#8217;s probably due to the way Apple implemented WindowServer.</p>
<p>Why am I not receiving iSight captures?<br />
Either  the camera is in use by a different program or the laptop is being operated with the clamshell closed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2009/08/laptop-thaft-tracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>USB to SATA/IDE adapter</title>
		<link>http://blog.michael.kuron-germany.de/2009/04/usb-to-sata-ide-adapter/</link>
		<comments>http://blog.michael.kuron-germany.de/2009/04/usb-to-sata-ide-adapter/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 16:00:53 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Hardware + Gadgets]]></category>
		<category><![CDATA[hard drive]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[sata]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=14</guid>
		<description><![CDATA[If you often find yourself needing to temporarily connect bare hard drives (2.5&#8243;, 3.5&#8243; or 5.25&#8243;) to your computer, a USB to SATA/IDE adapter is a nice investment. A while ago, I bought the Sharkoon DriveLink. The nice thing about it is that it can run 2.5&#8243; hard drives without the power brick. However, it [...]]]></description>
				<content:encoded><![CDATA[<p>If you often find yourself needing to temporarily connect bare hard drives (2.5&#8243;, 3.5&#8243; or 5.25&#8243;) to your computer, a USB to SATA/IDE adapter is a nice investment.</p>
<p>A while ago, I bought the <a href="http://www.sharkoon.com/html/produkte/externe_gehaeuse/drive_link/index_en.html"><strong>Sharkoon DriveLink</strong></a>. The nice thing about it is that it can run 2.5&#8243; hard drives without the power brick. However, it would randomly disappear from the computer, interrupting any file transfers that may have been in progress. I returned it and got a replacement unit that showed the exact same behavior, so I returned it for a refund.</p>
<p>Instead, I bought the <a href="http://www.scythe-usa.com/product/acc/013/scupc1000.html"><strong>Scythe Kama Connect 2</strong></a>. So far, it&#8217;s been working like a charm.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2009/04/usb-to-sata-ide-adapter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building your own OpenDirectory server on Linux</title>
		<link>http://blog.michael.kuron-germany.de/2009/04/building-your-own-opendirectory-server-on-linux/</link>
		<comments>http://blog.michael.kuron-germany.de/2009/04/building-your-own-opendirectory-server-on-linux/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 17:45:22 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[directory access]]></category>
		<category><![CDATA[kerberos]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[opendirectory]]></category>
		<category><![CDATA[openldap]]></category>
		<category><![CDATA[sasl]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[workgroup manager]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=16</guid>
		<description><![CDATA[OpenDirectory is a feature included with Mac OS X Server. Wouldn&#8217;t it be nice if you could use it without having to spend hundreds of dollars on a server license? Wouldn&#8217;t it be great if you could add it into your existing Linux-based OpenLDAP server? It&#8217;s actually quite easy because OpenDirectory is a standard OpenLDAP [...]]]></description>
				<content:encoded><![CDATA[<p>OpenDirectory is a feature included with Mac OS X Server. Wouldn&#8217;t it be nice if you could use it without having to spend hundreds of dollars on a server license? Wouldn&#8217;t it be great if you could add it into your existing Linux-based OpenLDAP server? It&#8217;s actually quite easy because OpenDirectory is a standard OpenLDAP server with a special Apple schema.</p>
<p><strong>0. Prerequisites</strong><br />
- OpenLDAP server with Samba integration (I&#8217;m runnig it on a Ubuntu 8.04 server, using the standard OpenLDAP and Samba packages). I won&#8217;t go into the details of how to set this up, there are lots of tutorials around the web on this.<br />
- some kind of LDAP admin tool, I used phpLDAPAdmin<br />
- Mac OS X 10.5 Leopard clients</p>
<p><strong>1. Adding the Apple schema to your OpenDirectory server</strong><br />
It is located in <em>/etc/openldap/schema/apple.schema</em> on any Mac. Copy this file to your OpenLDAP server and add it to your <em>slapd.conf</em>.<br />
You may run into the problem that <em>apple.schema</em> references some <em>samba.schema</em> entries that were deprecated with Samba 3. Specifically, these are <em>acctFlags</em>, <em>pwdLastSet</em>, <em>logonTime</em>, <em>logoffTime</em>, <em>kickoffTime</em>, <em>homeDrive</em>, <em>scriptPath</em>, <em>profilePath</em>, <em>userWorkstations</em>, <em>smbHome</em>, <em>rid</em> and <em>primaryGroupID</em>, so you&#8217;ll need to edit<em>apple.schema</em> and replace these with their Samba 3 counterparts.<br />
Now, restart the OpenLDAP daemon so it recognizes the changes.</p>
<p><strong>2. Adding some Mac-specific attributes to your LDAP server</strong><br />
Add an <em>ou=macosx</em> branch to your LDAP tree, under which you&#8217;ll need to create <em>ou=accesscontrols, ou=augments, ou=automountMap, ou=autoserversetup, ou=certificateauthorities, ou=computer_groups, ou=computer_lists, ou=computers, ou=filemakerservers, ou=locations, ou=machines, ou=maps, ou=mount, ou=neighborhoods, ou=places, ou=preset_computer_groups, ou=preset_computer_lists, ou=preset_computers, ou=preset_groups, ou=preset_users, ou=printers, </em>and<em> ou=resources</em>.<br />
To all your LDAP groups, add the <em>apple-group</em> objectClass. To all your LDAP users, add the <em>apple-user </em>objectClass.</p>
<p><strong>3. Connecting your Mac to the LDAP directory</strong><br />
On your Mac, go into Directory Access and add your LDAP server. Choose OpenDirectory as the server type and adjust the Samba mappings to match your changes from step 1. Here is a plist you can import into Directory Access that already has these mappings corrected: <a rel="attachment wp-att-18" href="http://blog.michael.kuron-germany.de/2009/04/building-your-own-opendirectory-server-on-linux/ldapv3_unix_samba3_od/">LDAPv3_Unix_Samba3_OD.plist</a>.<br />
If you want your other clients to automatically use this mapping, create a <em>cn=config</em> branch in your LDAP tree and use the <em>Write to Server</em> button in Directory Access.</p>
<p><strong>4. Use Workgroup Manager to set network home folders, managed preferences, &#8230;</strong><br />
Now, you can use Workgroup Manager to manage network home folders and managed preferences, just like you would on a Mac server.  You&#8217;ll need to authenticate using an LDAP user who has full write privileges to the directory (as set in <em>slapd.conf</em>). The standard <em>cn=admin,dc=example,dc=com</em> user will NOT work.</p>
<p><strong>5. Conclusion</strong><br />
Almost everything works, except for:<br />
- adding new users and group through Workgroup Manager<br />
- solution: unknown<br />
- assigning directory admin privileges to users through Workgroup Manager<br />
- solution: using an OpenLDAP server set up to use <em>cn=config</em> instead of <em>slapd.conf</em>. This will also require going into Directory Access again and adding the <em>OLCBDBConfig, OLCFrontEndConfig, OCGlobalConfig, OLCSchemaConfig</em> and <em>OLCOverlayDynamicID</em> record types back in (they are included in the OpenDirectory mapping, but I deleted them from mine because they only cause error messages on an OpenLDAP server with <em>slapd.conf</em> configuration).</p>
<p>Here are all the web sites that helped me in the process of figuring this out:<br />
<a href="http://docs.info.apple.com/article.html?path=ServerAdmin/10.4/en/c6od15.html ">http://docs.info.apple.com/article.html?path=ServerAdmin/10.4/en/c6od15.html</a> (this one is especially important because it explains what to do if your LDAP server is not set up for SASL authentication)<br />
<a href="http://www.emmes-world.de/mac-afp-homes.html">http://www.emmes-world.de/mac-afp-homes.html</a> (this one describes a similar setup and was my most important resource)<br />
<a href="http://rajeev.name/blog/2006/09/09/integrating-mac-os-x-into-unix-ldap-environment-with-nfs-home-directories">http://rajeev.name/blog/2006/09/09/integrating-mac-os-x-into-unix-ldap-environment-with-nfs-home-directories</a>/<br />
<a href="http://www.netmojo.ca/blog/tag/ldap/">http://www.netmojo.ca/blog/tag/ldap/</a><br />
<a href="http://www.macdevcenter.com/pub/a/mac/2003/08/26/active_directory.html?page=2">http://www.macdevcenter.com/pub/a/mac/2003/08/26/active_directory.html?page=2</a></p>
<p><strong>7. Further Information<br />
<span style="font-weight: normal;">Since you&#8217;re not using Kerberos for authentication, you may want to look at securing your LDAP connections with SSL. Here are some links that talk about it:<a href="http://www.novell.com/coolsolutions/feature/19965.html"></p>
<p>http://www.novell.com/coolsolutions/feature/19965.html</p>
<p></a><a href="http://www.afp548.com/article.php?story=20071203011158936">http://www.afp548.com/article.php?story=20071203011158936</a></span></strong></p>
<p>Someone else also wrote a blog post about <a href="http://deepport.net/archives/setting-up-a-linux-server-for-os-x-clients/">Setting up a Linux server for OS X clients</a>, in which they also describe how to incorporate Kerberos into the whole equation. That&#8217;s certainly something worth considering.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2009/04/building-your-own-opendirectory-server-on-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Protected: Running Mac OS X (non-Server) in VMWare Fusion</title>
		<link>http://blog.michael.kuron-germany.de/2009/03/running-mac-os-x-non-server-in-vmware-fusion/</link>
		<comments>http://blog.michael.kuron-germany.de/2009/03/running-mac-os-x-non-server-in-vmware-fusion/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 17:07:40 +0000</pubDate>
		<dc:creator>Michael Kuron</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[10.4]]></category>
		<category><![CDATA[10.5]]></category>
		<category><![CDATA[10.6]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[tiger]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[vmware fusion]]></category>

		<guid isPermaLink="false">http://blog.michael.kuron-germany.de/?p=11</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
				<content:encoded><![CDATA[<form action="http://blog.michael.kuron-germany.de/wp-login.php?action=postpass" method="post">
<p>This post is password protected. To view it please enter your password below:</p>
<p><label for="pwbox-11">Password: <input name="post_password" id="pwbox-11" type="password" size="20" /></label> <input type="submit" name="Submit" value="Submit" /></p>
</form>
]]></content:encoded>
			<wfw:commentRss>http://blog.michael.kuron-germany.de/2009/03/running-mac-os-x-non-server-in-vmware-fusion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
