<?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 Meier</title>
	<atom:link href="http://www.meier.ws/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.meier.ws</link>
	<description>Web Developer &#38; Sysadmin</description>
	<lastBuildDate>Tue, 21 Feb 2012 16:10:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Icinga 1.6 As A Monitoring Solution On Ubuntu 12.04 (Part 2: Icinga Web)</title>
		<link>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web/</link>
		<comments>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:49:01 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.meier.ws/?p=315</guid>
		<description><![CDATA[After getting a basic Icinga installation up and running in the last part, I&#8217;ll describe how to get Icinga Web, the new Ajax-powered web interface for Icinga to work. If you encounter any problems feel free to post a comment or check out the helpful Icinga Docs and Wiki. All parts of my Icinga 1.6 <a href='http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>After getting a basic Icinga installation up and running in the last part, I&#8217;ll describe how to get <a href="http://www.icinga.org/about/icingaweb/" target="_blank">Icinga Web</a>, the new Ajax-powered web interface for Icinga to work. If you encounter any problems feel free to post a comment or check out the helpful Icinga <a href="http://docs.icinga.org/1.6/en/icinga-web-introduction.html" target="_blank">Docs</a> and <a href="https://wiki.icinga.org/display/howtos/Setting+up+Icinga+Web+on+Ubuntu" target="_blank">Wiki</a>.</p>
<p>All parts of my <em>Icinga 1.6 As A Monitoring Solution On Ubuntu 12.04</em> series:</p>
<ul>
<li><a href="/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/">Part 1: Basic Installation (including the Classic Web Interface)</a></li>
<li><a href="/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web">Part 2: Icinga Web (New Ajax Interface)</a> [this post]</li>
<li>Part 3: NagiosQL (Web-based Configuration Interface for Icinga) [coming soon]</li>
<li>Part 4: Staying Up-To-Date On Host Status (external Tools)</li>
<li>Part 5: Monitoring Printers (over SNMP)</li>
<li>Part 6: Monitoring Windows and Linux Maschines</li>
<li>Part 7: Using Icinga Data In Your Own Applications (using REST API)</li>
</ul>
<div>This part is strongly based on the Wiki article (see link above), so you can get additional informations there.</div>
<h3>1) Prerequisites</h3>
<p>For the next steps you&#8217;ll need some additional packages (mostly PHP modules for Apache) and if you want to fetch Icinga using Git, the Git client, so let&#8217;s install them:</p>
<pre>apt-get install php5 php5-cli php-pear php5-xmlrpc php5-xsl php5-gd php5-ldap php5-mysql
(optional) apt-get install git</pre>
<h3>2) Installation</h3>
<p>Now you&#8217;ll need the Icinga Web source. Unfortunately, at the time of this writing, there is no Ubuntu package available.  I cloned the Git repository, since I wanted the upcoming 1.6.2 version of Icinga Web, however in most cases (and unless told otherwise by a developer), you&#8217;re probably better off downloading a <a href="https://www.icinga.org/download/packages/" target="_blank">stable package</a> from the Icinga Website.</p>
<p>Using a package:</p>
<ul>
<li>Go to <a href="https://www.icinga.org/download/packages/">https://www.icinga.org/download/packages/</a> and download the latest stable version of Icinga Web to your server (e.g. using wget &lt;url&gt;)</li>
<li>Extract the contents using
<pre>tar vfxz icinga-web-x.x.x.tar.gz</pre>
</li>
<li>Change into the new directory (cs icinga-web-x.x.x)</li>
</ul>
<p>Using git:</p>
<ul>
<li>
<pre>git clone git://git.icinga.org/icinga-web.git</pre>
</li>
<li>cd icinga-web</li>
</ul>
<p>Now it&#8217;s time to configure the installation process. If we don&#8217;t specify target directories, everything will go to /usr/local/inciga-web/.., however since we installed Icinga already using packages and therefore use the global directory structure (/etc/icinga, etc), I prefer a similar structure for Icinga Web. The following configure line will therefore make sure that Icinga Web uses /etc and /var:</p>
<pre>./configure --with-api-cmd-file=/var/lib/icinga/rw/icinga.cmd --with-conf-dir=/etc/icinga-web --with-log-dir=/var/log/icinga-web --with-cache-dir=/var/cache/icinga-web</pre>
<p>To compile everything, you&#8217;ll need the &#8220;make&#8221; command. In most cases this will already be installed, however on a fresh system like mine, I had to install it (and a lot of dependencies) first using</p>
<pre>apt-get install build-essentials</pre>
<p>Now it&#8217;s time to compile Icinga Web and add the neccessary configuration to Apache. This will create a file icinga-web.conf in /etc/apache2/conf.d containing the neccessary Alias directives.</p>
<pre>make install
make install-apache-config</pre>
<p>Icinga Web uses the rewrite module for Apache, so let&#8217;s activate it:</p>
<pre>a2enmod rewrite
service apache2 restart</pre>
<h3>3) Configuration</h3>
<p>Your Icinga Web installation is now accessible at /icinga-web, however it&#8217;ll greet you with a nice critical exception message. But don&#8217;t be discouraged, help is coming! :-)<br />
Icinga Web uses it&#8217;s own tables to store information (like it&#8217;s own user database, last open crons, etc), so we need to create these tables and provide Icinga Web with the database credentials. It is recommended to use a seperate database for Icinga Web (e.g. icinga_web), however it is also possible to keep the Icinga Web tables in the same database as the rest of Icinga. I chose the second method to reduce the number of databases we have and keep it together for easier backup.</p>
<p>In the following instructions, I&#8217;ll use a couple of placeholders that you&#8217;ll need to replace with your actual values. The placeholders will be</p>
<ul>
<li>[iwuser] for the database user for your Icinga Web database. You can use the same user as IDOUtils, but it&#8217;s probably a good idea to use a different one.</li>
<li>[iwpass] the password for iwuser</li>
<li>[iwdb] The database name for Icinga Web. This is either the icinga database if you want to  use the same as IDOUtils or for example icinga_web if you prefer to use a different database</li>
<li>[idouser] This is the database username from Part 1 (usually icinga_idoutils)</li>
<li>[idopass] The password for idouser, if you had one generated, you can look it up in /etc/icinga/ido2db.cfg</li>
<li>[idodb] The database for IDOUtils, probably just &#8216;icinga&#8217;</li>
</ul>
<p>If you want to use a different database, now would be the time to create it (either using a GUI tool like phpMyAdmin or MySQL workbench or using the &#8220;create database &lt;name&gt;&#8221; sql command) and grant the neccesary user rights for your [iwuser] (see the Wiki for a GRANT command, or use the GUI tool).</p>
<p>Icinga Web provides a SQL script to create the neccessary tables. Let&#8217;s import the schema:</p>
<p>mysql -u [iwuser] -p -h hostname.of.database.serv.er [iwdb] &lt; /usr/local/icinga-web/etc/schema/mysql.sql</p>
<p>If your MySQL server is running locally, you can skip the hostname parameter. The command will ask you for the password of [iwuser] and afterwards create the structure in [iwdb].</p>
<p>Now that we installed the software, configured Apache, created a database and tables, all that&#8217;s left to do is tell Icinga Web how to connect to the database. While this sounds simple enough, it was ironically the most difficult part in my opinion. Icinga Web uses Doctrine, a database abstraction layer which is good because it dramatically increases the number of supported databases. However it also means that the configuration is stored in XML format.</p>
<p>The database configuration is stored in /etc/icinga-web/databases.xml  (there&#8217;s also an equally named file in /usr/local/icinga-web/app/config, don&#8217;t edit that file!). In this file there are two sections, the first one to configure the icinga-web database connection, the second one for the IDOUtils database connection. All you have to change is the connection strings (in &lt;ae:parameter name=&#8221;dsn&#8221;&gt;). So basically change:</p>
<pre>mysql://icinga_web:icinga_web@localhost:3306/icinga_web to mysql://[iwuser]:[iwpass]@[hostname or localhost]:3306/[iwdb]
and
mysql://icinga:icinga@localhost:3306/icinga to mysql://[idouser]:[idopass]@[hostname or localhost]:3306/[idodb]</pre>
<p>Replace the placeholders with the actual values from your environment. As a reminder: The IDOUtils user and password can be found in /etc/icinga/ido2db.cfg.<br />
<strong>Important:</strong> Uncomment both sections. XML comments start with &lt;!&#8211; and end with &#8211;&gt;. You can find those around each db:database tag. Just remove them so your modified configuration becomes active. This is the most likely cause if you still receive critical exceptions after you followed all steps.</p>
<p>The last step is to run /usr/local/icinga-web/bin/clearcache.sh to remove any configuration cache and ensure Icinga Web will load the new configuration. If you open /icinga-web now, you should be greeted with a login prompt. The default username is &#8220;root&#8221; and default password is &#8220;password&#8221;.</p>
<p>If you still get a critical exception, make sure you really  removed the comment characters in databases.xml.</p>
<h3>4) Using Icinga Web</h3>
<p>Icinga Web should now be fully usable. The first thing to do is obviously to change your password. Afterwards feel free to explore Icinga Web and its cronks. Cronks are like widgets or gadgets or modules or plugins in other software, they show data or subsets of data from IDOUtils in Icinga Web. An example for a cronk would be &#8220;Unhandled service problems&#8221;.</p>
<h4>Tackle Cronk</h4>
<p>Icinga Web 1.6 introducted a new (experimental!) cronk named Tackle which shows a list of all your hosts with their service status as a stacked (horizontal) bar. An example can be found in the <a href="http://docs.icinga.org/1.6/en/icinga-web-introduction.html#id1397962" target="_blank">1.6 docs</a>. This is one of my favorite features of Icinga Web and you should definitively check it out. Unfortunately it is <a href="https://dev.icinga.org/issues/2275" target="_blank">not stable enough to be released</a> just yet and is therefore deactivated in the upcoming 1.6.2 release. If you want to use it anyway (and are aware that it might not work as expected yet!), you can enable it again by reversing the changeset attached to the bug issue. All you need to do is basically change &#8220;hide&#8221; and &#8220;disabled&#8221; back to false in the Tackle configuration in /usr/local/icinga-web/app/modules/Cronks/config/cronks_misc.xml. But remember, that it still is highly experimental &#8211; you&#8217;ve been warned.</p>
<p>&nbsp;</p>
<p>This is the end of Part 2. If everything went well you should now have a working Icinga installation along with the new Icinga Web interface. Unfortunately we are still only monitoring localhost (unless you changed the configuration files yourself). The next part should take care of that however. I will show you how to install <a href="http://www.nagiosql.org/" target="_blank">NagiosQL</a>, a web based configuration tool for Nagios and Icinga which allows you to change or add hosts and services without getting your hands dirty with configuration files ;-)</p>
<p>If you have problems, suggestions or remarks, feel free to leave a comment or sent me an email.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Icinga 1.6 As A Monitoring Solution On Ubuntu 12.04 (Part 1: Installation)</title>
		<link>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/</link>
		<comments>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 21:29:21 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.meier.ws/?p=301</guid>
		<description><![CDATA[Since it was time to get rid of Nagios and upgrade to a newer monitoring solution, I decided to check out several different programs and finally decided on Icinga. The main reasons for this decision were the facts that it was actively developed, allowed us to continue using a lot of our existing Nagios plugins <a href='http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Since it was time to get rid of Nagios and upgrade to a newer monitoring solution, I decided to check out several different programs and finally decided on <a href="http://www.icinga.org" target="_blank">Icinga</a>. The main reasons for this decision were the facts that it was actively developed, allowed us to continue using a lot of our existing Nagios plugins and is available as an Ubuntu package which makes updating in the future a lot easier.  In this post I will describe the neccessary steps to get Icinga up and running along with idoutils (and ido2db), to write the data into a database (which will allow us to fetch the data and display it in external systems, e.g using the icinga php api).</p>
<p>All parts of my <em>Icinga 1.6 As A Monitoring Solution On Ubuntu 12.04</em> series:</p>
<ul>
<li><a href="/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/">Part 1: Basic Installation (including the Classic Web Interface)</a> [this post]</li>
<li><a href="/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-2-icinga-web">Part 2: Icinga Web (New Ajax Interface)</a></li>
<li>Part 3: NagiosQL (Web-based Configuration Interface for Icinga) [coming soon]</li>
<li>Part 4: Staying Up-To-Date On Host Status (external Tools)</li>
<li>Part 5: Monitoring Printers (over SNMP)</li>
<li>Part 6: Monitoring Windows and Linux Maschines</li>
<li>Part 7: Using Icinga Data In Your Own Applications (using REST API)</li>
</ul>
<p>Software used:</p>
<ul>
<li>Ubuntu 12.04</li>
<li>Icinga 1.6.1 (from Ubuntu repository)</li>
<li>Idoutils</li>
<li>MySQL 5</li>
<li>Apache 2</li>
</ul>
<p>Note: At the time of this writing Ubuntu 12.04 was still in Alpha, so there is a (slim) chance that some of the steps change with the final release at the end of April.</p>
<p>If you have a different environment or need help with the installation or configuration, the Icinga team provides great documentation with the official <a href="http://docs.icinga.org/" target="_blank">Icinga Docs</a> and <a href="https://wiki.icinga.org/display/howtos/Setting+up+Icinga+with+IDOUtils+on+Ubuntu" target="_blank">Wiki</a>. Both are definitely worth checking out.</p>
<p>This tutorial will start with a fresh Ubuntu server installation no additional packages installed. If you already have a live system, some steps might not be neccessary.</p>
<h2>1) Installing the neccessary software</h2>
<p>Lets start with installing dbconfig-common. This package is used during the installation of the remaining software to ask the user questions about database access:</p>
<pre>apt-get install dbconfig-common</pre>
<p>Now you have two choices: Either you&#8217;ll use a local MySQL server in which case, simply install it using apt-get install mysql-server. If you plan to use a remote server (as it&#8217;ll be the case in most production systems), edit /etc/dbconfig-common/config and make sure dbc_remote_questions_default is set to &#8216;true&#8217;. This will make dbconfig ask about the configuration of a remote server.</p>
<p>Now install the Icinga and Iciga-Idoutils packages, this should install a whole lot of dependencies as well:</p>
<pre>apt-get install icinga icinga-idoutils</pre>
<p>During the installation you&#8217;ll need to provide database access parameters (like hostname if you enabled remote questions and the password of your MySQL root user). Be sure to provide valid answers because the information will be written to several files and changing them afterwards is annoying.</p>
<p>Now the first part is done and you should already be able to access your Icinga installation at http://yourhostname.com/icinga with the username &#8216;icingaadmin&#8217; and the password you entered during installation.</p>
<p>&#8220;<em>But this was so easy, why the hell did you write a blog post about it?</em>&#8221; &#8211; Well, while Icinga is in fact already running and checking your local services, unfortunately idoutils and external commands don&#8217;t work&#8230; yet.</p>
<h2>2) Configuring idoutils and ido2db</h2>
<p>While the setup program should&#8217;ve already created the correct config files, ido2db wasn&#8217;t enabled by default (you could run the init.d script but nothing happened).</p>
<p>To enable ido2db, edit /etc/default/icinga and set IDO2DB to &#8216;yes&#8217; and run /etc/init.d/ido2db start. This should start the ido2db daemon (check in your process list). If ido2db isn&#8217;t running, look in /var/log/syslog for any clues what went wrong. In my case it worked like a charm after I set IDO2DB to yes.</p>
<p>Now we need to tell Icinga to actually use ido2db. Go to /etc/icinga/modules and rename idoutils.cfg-sample to idoutils.cfg. If you&#8217;d restart Icinga now, you&#8217;d probably get a nasty &#8220;idomod.o could not be found&#8221; error. This is because in the config file we just renamed the path to idomod.o is set to /usr/sbin. It was however located at /usr/lib/icinga/idomod.o for me. I&#8217;d recommend to run &#8216;updatedb&#8217; and afterwards &#8216;locate idomod.o&#8217; to figure out where the file is on your installation. Now edit the config file (if neccessary) and adjust the path setting to the correct value. Now it&#8217;s time to restart Icinga (/etc/init.d/icinga restart) and the database should start to fill out with data. Check /var/log/syslog to make sure no errors appear. If you have errors you can&#8217;t resolve yourself, leave a comment below.</p>
<p>Note: I had the problem, that database connection failed. This was a corner case because the installation script added the icinga-idoutils user with the short hostname of the local machine. Since the database server had a different domain however, the connection failed. I fixed it by changing the host name of the user to &#8216;%&#8217;. This shouldn&#8217;t happen for most people however.</p>
<h2>3) Enabling external commands</h2>
<p>External commands allow the web server (or any other user) to issue commands to Icinga. This is useful to force a service check using the web interface after you fixed an error (and don&#8217;t want to wait for the next automatic check) and to disable notifications etc. By default external commands are disabled, to enable them, edit /etc/icinga/icinga.conf and set &#8220;check_external_commands&#8221; to 1. Now restart Icinga. In a world full of green gras and honey this would suffice. Unfortunately some more steps were required (at least one of them appears to be a bug in the installation script, so chances are, it&#8217;s gone by the time you read this):</p>
<ol>
<li>Add the webserver user to the nagios group. To do this, edit /etc/group and find the nagios entry (probably at the end of the file) and after the color add &#8220;www-data&#8221;.  Save. This is required so that the web server may write to the command pipe used for external commands. The same step is required for any other user that should be able to use external commands.</li>
<li><span style="text-decoration: line-through;">The directory /var/lib/icinga/rw which contains the command pipe was in my case only accessible by the nagios user (not the nagios group). I expect this to be a bug, however, you should probably check anyway. If it has only 700 permissions, allow the nagions group access by executing &#8220;chmod g+rx /var/lib/icinga/rw&#8221;.</span><strong>Edit:</strong> As Michael Friedrich and Alexander Wirt (see comments) pointed out, this modification wouldn&#8217;t survive an update. Here&#8217;s the correct way to do it (from README.Debian):
<pre>/etc/init.d/icinga stop
dpkg-statoverride --update --add nagios nagios 2710 /var/lib/icinga/rw
dpkg-statoverride --update --add nagios nagios 751 /var/lib/icinga
/etc/init.d/icinga start</pre>
<p>(If you haven&#8217;t added www-data to the nagios group, change the second &#8216;nagios&#8217; in the first statoverride command to your webserver group (e.g. www-data))</li>
</ol>
<p>Now you should be able to execute commands using the web interface (like forcing a service check). If you still encounter problems, the log file (/var/log/syslog or /var/log/icinga/icinga.log) are usually good pointers to the cause of the problem.</p>
<p>This concludes the first part. You now have a basic Icinga system running and are already actively monitoring the local host, which might not be as exciting as you hoped, but is a start nevertheless. If you are familiar with Nagios configuration, you can now go nuts on the Icinga config files, which basically follow the same schema. The paths to each config file can be found in /etc/icinga.conf.  If you have problems following a certain step or getting the installation so far to work, feel free to leave a comment or send me an email and I&#8217;ll try to help as good as I can.</p>
<p>In the coming days I&#8217;ll try to write a bit about getting <a href="https://www.icinga.org/about/icingaweb/" target="_blank">Icinga Web</a>, the new Ajax-powered web interface to work. Another topic I&#8217;d like to touch is using <a href="http://www.nagiosql.org/" target="_blank">NagiosQL</a> as a web based configuration option for Icinga and last but not least add a few remote hosts and service checks. I&#8217;ll also provide you with a few plugin recommendation and an example for monitoring printers for their toner and paper levels. Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2012/02/icinga-1-6-as-a-monitoring-solution-on-ubuntu-12-04-part-1-installation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Single Sign-On for Web Apps using Kerberos</title>
		<link>http://www.meier.ws/2011/07/single-sign-on-for-web-apps/</link>
		<comments>http://www.meier.ws/2011/07/single-sign-on-for-web-apps/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 19:16:09 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[kerberos]]></category>
		<category><![CDATA[single sign-on]]></category>
		<category><![CDATA[SSO]]></category>

		<guid isPermaLink="false">http://www.mmeier.net/?p=286</guid>
		<description><![CDATA[Background: At work we have a web based administration tool for student accounts, notebook rental and different billing processes. So far it&#8217;s been using its own user database for authentication. Since the service personal already has Active Directory accounts and matching group memberships it seems appropriate to use these for authorization and authentification. To make <a href='http://www.meier.ws/2011/07/single-sign-on-for-web-apps/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Background:<br />
At work we have a web based administration tool for student accounts, notebook rental and different billing processes. So far it&#8217;s been using its own user database for authentication. Since the service personal already has Active Directory accounts and matching group memberships it seems appropriate to use these for authorization and authentification. To make it even simpler we&#8217;ll also automatically use the current Windows logon instead of prompting to login (aka Single Sign-On) using Kerberos.</p>
<p>I&#8217;ll provide all necessary instructions and hopefully spare some of you some time.</p>
<p>&nbsp;</p>
<p><strong>Requirements:</strong></p>
<p>This tutorial assumes the following environment:</p>
<ul>
<li>Windows 2008 Active Directory  (Domain: EXAMPLE.COM, Domain Controller: dc01.example.com)</li>
<li>Clients: Windows XP or newer</li>
<li>Linux Webserver (web.example.com) running Apache 2.2, examples are provided for Ubuntu 10.04 LTS</li>
</ul>
<div><strong>1) Creating a User Account</strong></div>
<div>First of all you need to create a new user account (not a computer account!) for the webserver in your domain . Since the webserver is called &#8220;web&#8221; we&#8217;ll simply name it kerbweb (feel free to use any other name). Afterwards you&#8217;ll need to add the service principal to that account and export the keytab to a file. Kerberos uses this keytab file to authenticate to the domain controller later on.</div>
<div>To create this file open a command shell with administrator privileges (important) on your domain controller  (Start-&gt;Run.., type &#8216;cmd&#8217;, right-click command prompt and select Run as Administrator). Execute following command by substituting the placeholders with the correct values:</p>
<pre>ktpass /princ HTTP/#full_hostname_of_your_linux_server#@#domain# /mapuser #username#@#domain# /pass #random password# /crypto rc4-hmac-nt /ptype KRB5_NT_SRV_HST /out #filename#.keytab</pre>
</div>
<div> For our example it would look like this:</div>
<div>
<pre>ktpass /princ HTTP/web.example.com@EXAMPLE.COM /mapuser kerbweb@EXAMPLE.COM /pass randompasswordetc /crypto rc4-hmac-nt /ptype KRB5_NT_SRV_HST /out web.keytab</pre>
</div>
<div>This will create a keytab file with rc4 encryption (using AES is also possible but your linux machine must support it) with the principal name HTTP/web.example.com which is what Apache will use when running on the host web.example.com. Important: A principal name must not be assigned to multiple user accounts! Move this file to your web server. For future reference I&#8217;ll assume that you stored it as /etc/apache2/web.keytab but any other location is fine as well.</div>
<p></p>
<div><strong>2) Installing and Configuring Kerberos</strong></div>
<div>Install Kerberos on your linux machine. The process is dependant on your distribution. For Ubuntu use</div>
<div>
<pre>apt-get install krb5-user</pre>
</div>
<div>This should install the necessary software and create a configuration file /etc/krb5.conf. Adjust this file to your environment. For our example it should look like this:</div>
<div>
<pre>[libdefaults]
        default_realm = EXAMPLE.COM
        default_tgs_enctypes = arcfour-hmac-md5 RC4-HMAC DES-CBC-MD5 DES-CBC-CRC
        default_tkt_enctypes = arcfour-hmac-md5 RC4-HMAC DES-CBC-MD5 DES-CBC-CRC

[domain_realm]
        web.example.com = EXAMPLE.COM

[realms]
        EXAMPLE.COM = {
                kdc = dc01.example.com
                admin_server = dc01.example.com
                default_domain = example.com
        }</pre>
</div>
<div>It is important that you list the above encryption types since we used RC4-HMAC for our keytab file.</div>
<div>Now let&#8217;s see if Kerberos itself is able to talk to your domain controller. Run the following command by replacing _username_ with a valid active directory account:</div>
<div>
<pre>kinit _username_@EXAMPLE</pre>
</div>
<div>You should be prompted for the user&#8217;s password. If everything works fine the command should simple exit (no output). Afterwards run</div>
<div>
<pre>klist</pre>
</div>
<div>to list kerberos tickets your server received from the domain controller. A single ticket should appear from our kinit call. If this does not work the kerberos configuration in incorrect. Try to google for the error message you receive.</div>
<div>Now that we&#8217;ve got Kerberos working it&#8217;s time to test if our keytab file is working correctly. To do this we&#8217;ll run kinit again but this time instead of an actual user use the keytab file and the principal name like this:</div>
<div>
<pre>kinit -k -t /etc/apache2/web.keytab HTTP/web.example.com@EXAMPLE.COM</pre>
</div>
<div>This should not produce any output if the keytab is working fine. Now run both of these commands:</div>
<div>
<pre>kvno HTTP/web.example.com@EXAMPLE.COM
klist -e</pre>
</div>
<div>The output should list two tickets (one for HTTP/web.example.com) with the encryption and the encryption tpye &#8220;ArcFour with HMAC/md5, AES-256 CTS mode with 96-bit SHA-1 HMAC&#8221;.</div>
<div>Just to make sure, check the encryption type of your keytab with the following command:</div>
<div>
<pre>klist -e -k /home/cippool/servicebackend.keytab</pre>
</div>
<div>It should show the same encryption type. If not, something&#8217;s wrong with your keytab. Try to rebuild it.</div>
<p></p>
<div><strong>3) Webserver Configuration</strong></div>
<div>Now that we&#8217;ve got Kerberos running and are able to talk to the domain controller using our keytab file it&#8217;s time to get the web server to use it.<br />
Note: This is a good time to chown the keytab to your webserver user and chmod 0400 it to deny access to anyone else.</div>
<div>To enable Kerberos Authentification in Apache you need to install the mod_auth_kerb module. In Ubuntu run these commands:</div>
<div>
<pre>apt-get install libapache2-mod-auth-kerb
a2enmod auth_kerb
/etc/init.d/apache2 restart</pre>
</div>
<div>Apache is now able to authenticate using Kerberos. Time to test this:</div>
<div>Create a new directory in your document root (e.g. /var/www/kerbtest). Make sure your web server allows you to override settings using a .htaccess file by setting  AllowOverride All in your VirtualHost configuration.</div>
<div>Now create a .htaccess file in your new directory with the following content:</div>
<div>
<pre>AuthName "Kerberos Protected Directory"
AuthType Kerberos
Krb5Keytab /etc/apache2/web.keytab
KrbAuthRealms EXAMPLE.COM
KrbServiceName HTTP
KrbMethodNegotiate on
KrbVerifyKDC on
require valid-user</pre>
</div>
<div>This will tell Apache that access to this directory is only granted when the current client user is a valid domain account.<br />
Note: Access will be instantly denied if the user is not using a computer that is in our EXAMPLE.COM domain. To offer users a login prompt if they do not belong to the domain (e.g. for home office users) add the line &#8220;KrbMethodK5Passwd on&#8221;.
</div>
<p></p>
<div><strong>4) Webbrowser Configuration</strong></div>
<div>For this to work at all the browser must use a mechanism called SPNEGO.  While this feature is present in most current browsers it usually requires certain settings or conditions. See the next section for instructions on the most common browsers.</div>
<div>Internet Explorer / Google Chrome:<br />
Chrome seems to use a lot of settings from the Internet Explorer on Windows systems. This means if you can get it to work in IE, it&#8217;ll also work in Chrome.</div>
<div>Internet Explorer will only use SPNEGO if the URL is trusted and SPNEGO is enabled. The following steps should get you set up and running:</p>
<ul>
<li>Go to Tools -&gt; Internet Options -&gt; Security</li>
<li>Select &#8220;Local intranet&#8221; and click on &#8220;Sites&#8221; and choose &#8220;Advanced&#8221;. Add the host name of your web server to the list of local sites (without http://, etc). Click OK to save the settings and return to the Internet Options window.</li>
<li>Choose the Advanced tab and scroll down to Security Settings. Make sure that &#8220;Enable Integrated Windows Authentication&#8221; is checked. Click OK and restart your browser.</li>
</ul>
<div>Firefox:</div>
<div>In Firefox you are required to add the host name to the list of trusted uris. Unfortunately there is no GUI configuration available for this.</div>
<div>
<ul>
<li>Type &#8220;about:config&#8221; in your address bar</li>
<li>Type &#8220;network.&#8221; in the filter</li>
<li>Double-click on network.negotiate-auth.trusted-uris and add the host name. If you need to add multiple host names use a comma  as delimiter</li>
<li>Click OK and restart Firefox to activate the setting</li>
</ul>
</div>
<div><strong>5) Testing everything</strong></div>
<div>It&#8217;s time to see if the whole ordeal actually works. Add a index.php to the new directory containing just the string &#8220;It works&#8221; and try to access it using your browser. If you are signed in on a valid domain account, a page with the text should appear, otherwise you should get an access denied error message. If this does not work as expected, read again over all previous steps and look at your apache error log for any clues. If you still can&#8217;t get it to work, leave a comment or contact me directly.</div>
</div>
<p></p>
<div><strong>6) Getting the user name</strong></div>
<div>While our directory is protected against external access, you&#8217;ll usually want to know who exactly is accessing the site. Apache provides that information in the REMOTE_USER environment variable. In PHP you can access this with <em>getenv(“REMOTE_USER”)</em>. In our current configuration this will contain &#8220;username@EXAMPLE.COM&#8221;. Since you already know the domain you can make auth_kerb strip it automatically by adding &#8220;KrbLocalUserMapping on&#8221; to the .htaccess file (requires a fairly new mod_auth_kerb version though). Afterwards you&#8217;ll only receive &#8220;username&#8221; in <em>getenv(“REMOTE_USER”)</em>.</div>
<p></p>
<div><strong>7) Adding Authorization</strong></div>
<div>So far we&#8217;ve only covered the Authentication part (&#8220;Who is the user?&#8221;) which is handled by Kerberos. However most of the time you don&#8217;t want any AD account to access a site. Here comes Authorization (&#8220;Is the user allowed to do that?&#8221;) into play. While it is possible to let the application handle it, it is more convenient to have Apache deny unauthorized users.</div>
<div>A clean approach would be to add all authorized users to a certain active directory group and only allow access to this group.</div>
<div>Create a suitable group in your AD and add a few users. Let&#8217;s assume the group is called &#8216;Webusers&#8217; and is in the organizational unit &#8220;Groups&#8221;. The Distinguished Name would therefore be &#8220;CN=Webusers,OU=Groups,DC=example,DC=com&#8221;.</div>
<div>To limit access to certain AD entities, you&#8217;ll need an additional Apache module called mod_authnz_ldap.<br />
In Ubuntu this module should already installed and only needs to be enabled:</div>
<div>
<pre>a2enmod authnz_ldap
/etc/init.d/apache2 restart</pre>
</div>
<div>Depending on your installation, Apache might need a valid user to access the AD using LDAP. You can try to omit the AuthLDAPBind* lines in the configuration below, but if that does not work, add a new user account. I&#8217;ll use &#8220;ldapuser&#8221; and &#8220;ldappass&#8221; as username and password for the example. You should obviously use something more secure.</div>
<div>Now we only need to add the required configuration to our .htaccess file. Remove the current &#8220;require valid-user&#8221; line and instead add:</div>
<div>
<pre>AuthLDAPURL "ldap://dc01.example.com/dc=example,dc=com?sAMAccountName"
AuthLDAPBindDN ldapuser@example.com
AuthLDAPBindPassword ldappass
Require ldap-group CN=Webusers,OU=Groups,DC=example,DC=com</pre>
</div>
<div>AuthLDAPURL should be an URI to your domain controller. If you want to use a SSL connection use ldaps:// (this will usually require some additional linux configuration like a certificate). sAMAccountName is the name of the attribute that contains the username. This means Apache will search in your AD using LDAP for the sAMAccountName that Kerberos provided and then make sure it belongs to the group Webusers. You can add multiple Require statements and they will be handled as OR statements (meaning a user must fulfill only one of the requirements, not all), e.g. to add multiple groups or OUs (like Accounting and Management).</div>
<div>Now a user should only be able to access the site if he has a valid domain account, the browser provides SPNEGO and he belongs to the given group.</div>
<p></p>
<div><strong>8) Recap</strong></div>
<div>For reference here&#8217;s a short list of the steps we had to do:</div>
<div>
<ol>
<li>Add a new AD user for the web server</li>
<li>Create a keytab file for the user with the correct principal name</li>
<li>Install and configure kerberos on your web server</li>
<li>Configure Apache to use mod_auth_kerb and add the necessary settings to a .htacces file (or directly to your VirtualHost if you prefer)</li>
<li>Add Authorization using LDAP</li>
</ol>
</div>
<div>I hope you found this tutorial helpful. I&#8217;m only human and make mistakes, so please point out any errors you encounter.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2011/07/single-sign-on-for-web-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webservices &#8211; The good, the bad and the ugly</title>
		<link>http://www.meier.ws/2011/04/webservices-the-good-the-bad-and-the-ugly/</link>
		<comments>http://www.meier.ws/2011/04/webservices-the-good-the-bad-and-the-ugly/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 06:57:04 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://www.mmeier.net/?p=271</guid>
		<description><![CDATA[The reason for this post is some bad experience I had recently with one (or in fact multiple) webservices, so excuse me if this sounds a bit like a rant. First of all I&#8217;d like to say that I absolutely love webservices. They are one of the greatest things since the invention of sliced bread. <a href='http://www.meier.ws/2011/04/webservices-the-good-the-bad-and-the-ugly/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>The reason for this post is some bad experience I had recently with one (or in fact multiple) webservices, so excuse me if this sounds a bit like a rant.</p>
<p>First of all I&#8217;d like to say that I absolutely love webservices. They are one of the greatest things since the invention of sliced bread. They allow interaction between different parties using a standardized communication protocol (well mostly at least) and don&#8217;t require any special client software.</p>
<p>Basically there are three kinds of webservices:<br />
<strong>Proprietary Webservices:</strong> The least &#8220;open&#8221; kind of webservices. While they usually use a standard protocol (HTTP), the usage is completely dependent on the service provider. A client needs to know the full API to communicate with such a service.  They are often used by URLs such as this:</p>
<p>http://example.ws/myApplication/addUser.php?firstname=Michael&#038;Lastname=Meier&#038;favColor=blue</p>
<p>In other cases the whole interaction is defined in the payload and HTTP is only used for communication. I&#8217;d advise to avoid creating new proprietary webservices nowadays, but you can&#8217;t always avoid existing services.</p>
<p><strong>RESTful Webservices:</strong> My personal preference for most tasks. The URLs usually represent objects on the service side and the default HTTP methods (GET=Read, PUT=Update, POST=Add/Insert, DELETE=Delete) are used to access those objects (similiar to CRUD in databases, but not exactly the same). Errors are indicated using the appropriate HTTP error code and a message in the body. They can use basic authentification provided by HTTP but further features like transactions usually need to be implemented in the payload. RESTful services don&#8217;t save any information on the client state which makes creating such services a lot easier. Calls typically look like this:<br />
GET http://example.ws/myApplication/user/12345 to get the information for user 12345<br />
PUT http://example.ws/myApplication/user/12345 to update its information (data in body)</p>
<p><strong>WS-* (SOAP) Webservices:</strong> Often called &#8220;Big Webservices&#8221;, these offer the most functionality. There are a lot of WS-* extensions that add functionality to the web service protocol like Reliability, Security, Transactions and advanced Authentification. SOAP uses (xml-style) messages that can be transfered using a lot of different protocols (usually HTTP, but FTP, Email, even MMS would also be possible). SOAP services keep track of the client state to allow process chains. They are also described by a WSDL (WebService Description Language) file which contains information how to contact the webservice and which methods are available (including parameters), making it possible to use the service without much inside knowledge.</p>
<p>After reading this one might think that SOAP services are the go-to solution for all your webservice needs. Unfortunately that seems to be the conclusion many executives have come to as well. What they don&#8217;t realize is that SOAP generates a huge overhead and processing SOAP requests and responses takes a lot more work than handling the simpler RESTful operations. Getting catalog information from a RESTful service is as easy as calling the responsible service with the category as a parameter like &#8220;GET http://example.ws/catalog/programming&#8221;. This operation in SOAP would look like this:</p>
<div>
<pre>POST http://example.ws/catalogSvc
&lt;?xml version="1.0"?&gt;
&lt;soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"&gt;
  &lt;soap:Header /&gt;
  &lt;soap:Body&gt;
    &lt;m:GetCatalogList xmlns:m="http://example.ws/catalog"&gt;
      &lt;m:Category&gt;Programming&lt;/m:Category&gt;
    &lt;/m:GetCatalogList&gt;
  &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;</pre>
</div>
<p>&#8220;Slightly&#8221; more complicated and that is without any soapHeader information.</p>
<p>So using SOAP services is bad? Not at all. They are great when they are needed. But it is important to know when they are needed and when they&#8217;re just bloat (and often slower). Let&#8217;s get back to my bad experience mentioned above. I&#8217;ll use the catalog example above. We needed a web service that would provide us with 1) a list of all categories (multiple tiers, so preferably a tree like structure), 2) the list of books for certain category and 3) detail information for each book. The service would only be accessed using PHP from a limited number of (known) users.</p>
<p>From this information you should come to the conclusion that a SOAP service would probably be a bit overkill but a single RESTful service with three interfaces  (/catalog, /catalog/category/x, /book/x) would do perfectly fine especially since we only need read access. If for some reason you really, really, really want to use a SOAP service (a client may already exist which uses SOAP), a single service with three operations (e.g. GetCategoryList, GetBookList, GetBookDetails) would be the smart choice.</p>
<p>Well, I mentioned &#8220;the ugly&#8221; in the title (and I didn&#8217;t mean proprietary services). This is what we received as a web service in the catalog case: Not one, not two, but three separate SOAP services with different URLs for each of the operations. Just don&#8217;t do stuff like that. Seriously. Don&#8217;t. There is hardly ever a reason to spread information that belongs together over different services. It&#8217;s BAD DESIGN.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2011/04/webservices-the-good-the-bad-and-the-ugly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speeding up Thecus N8800Pro&#8217;s NFS write performance</title>
		<link>http://www.meier.ws/2011/01/speeding-up-thecus-n8800pros-nfs-write-performance/</link>
		<comments>http://www.meier.ws/2011/01/speeding-up-thecus-n8800pros-nfs-write-performance/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 16:34:26 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[meta module]]></category>
		<category><![CDATA[n8800]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[thecus]]></category>

		<guid isPermaLink="false">http://www.mmeier.net/?p=262</guid>
		<description><![CDATA[We have a Thecus N8800Pro fileserver to cover the institute's storage needs. The storage system is connected to a Linux box via a 1Gbit/sec switch and is accessed by NFS. While the read performance was acceptable (about 85MByte/sec) the write performance left much to be desired (just 3MByte/sec). After some research the cause seemed to be the <em>sync</em> setting in /etc/exports which is responsible for synchronous data transfer. ]]></description>
			<content:encoded><![CDATA[<p>We have a Thecus N8800Pro fileserver to cover the institute&#8217;s storage needs. The storage system is connected to a Linux box via a 1Gbit/sec switch and is accessed by NFS. While the read performance was acceptable (about 85MByte/sec) the write performance left much to be desired (just 3MByte/sec). After some research the cause seemed to be the <em>sync</em> setting in /etc/exports which is responsible for synchronous data transfer:</p>
<pre>"/raid0/data/usershare" 172.x.x.x (rw,no_root_squash,<strong>sync</strong>,anonuid=99,anongid=99)</pre>
<p>For test purposes I changed it to async and sent the reload command to the NFSd (/app/bin/rc/rc.nfsd reload). Note: Do not attempt to restart the NFSd instead. For some reason it completely stopped working when doing so and the only way to get it back up was to disable and enable the NFS module using the web interface or restart the machine.</p>
<p>After remounting the shares on the Linux box we finally had a good write performance (about 75megs/sec). The only problem was to make the async setting stick. The Thecus machines seem to completely rebuild the configuration whenever a configuration change was done using the web interface and, what was worse, when the system was rebooted. Obviously this overwrote the async change every time. The script responsible for it also resides on a read-only filesystem so changes to the script weren&#8217;t possible (and would have been reverted by a firmware upgrade anyway, I&#8217;m afraid).</p>
<p>To solve this issue I had to get a bit creative. There is a <a href="http://naswebsite.com/wiki/Thecus_N5200_Module:_META">META module</a> for the Thecus N5200 which runs all executable files in a certain directory on startup. Unfortunately it can&#8217;t be installed on the N8800pro by default. To get it to work, download the archive and the link above, extract it on a box with the make command available (your typical Linux box will do) and change to META/Configure. You&#8217;ll need to adjust the install.rdf file (XML) and change the NasType n5200 to n8800 and set NasVersion to the version shown at the bottom right in your web interface (3.05.02.2 in my case). Afterwards go back to directory including the META.mod file and run &#8216;make&#8217;. It should generate a new META.mod which can now be installed on the N8800Pro.</p>
<p>Afterwards, SSH to the N8800Pro and change to  <em>/raid/data/module/META/system/etc/startup</em>. Executable files in this directory will be run at system startup.<br />
Create a file (e.g. nfs_async.sh) with the following content:</p>
<pre>#!/bin/bash
sed -i 's/,sync,/,async,/g' /etc/exports
/app/bin/rc/rc.nfsd reload</pre>
<p>and make it executable (chmod +x nfs_async.sh). Now the async setting should be set to all your exports on reboot.</p>
<p>This still leaves the problem that whenever the share configuration is changed it will be overwritten and the machine has either to be restarted (to run META module) or the script has to be called manually. Since both ways are not really desirable, the next step will be to make sure that the exports file is adjusted during runtime when neccessary. I&#8217;ll update this post when I got a working solution. It will probably be based on META to update the crontab file on startup and a cron script that will periodically check whether the /etc/exports file was changed (or has sync entries) and fix it when neccessary.</p>
<p>Attention: Using the async option might have unexpected consequences. We haven&#8217;t been running the configuration long enough to be sure that there are no side-effects. Use this method at your own risk and try it with less important data for a while before using it on productive files.</p>
<p>&nbsp;</p>
<p><strong>Update 2011-08-13:</strong> Matt Robinson from <a title="ISP Doctor Internet Solutions" href="http://www.ispdr.net.au/" target="_blank">ISP Dr Internet Solutions</a> was kind enough to provide the following script for all readers. It can remotely adjust the async setting and perform a short performance test. If your &#8220;sys&#8221; user has a password, you might want to store a public key on the Thecus machines.</p>
<blockquote><p># Fix up the nas async nfs export to fix speed for Thecus NASs<br />
#       &#8212; run this on any nas after it is rebooted etc<br />
#<br />
#  Usage: fixnas.sh nas_name [ fix | show | test ]<br />
#<br />
#  Put this script in a directory where the nas_host_name is<br />
#    another dir name and mount point in side it, ie:<br />
#<br />
#       &#8230;./remote-mounts/fixnas.sh<br />
#      &#8230;./remote-mounts/my-nas-01/<br />
#      &#8230;./remote-mounts/my-nas-02/<br />
#<br />
#  MR: 12-08-2011   <a href="mailto:matts@ispdr.net.au" target="_blank">matts@ispdr.net.au</a>  thanx to Michael Meier</p>
<p># Local Progs<br />
DD=&#8221;/bin/dd&#8221;<br />
SSH=&#8221;/usr/bin/ssh&#8221;</p>
<p># Thecus ssh user<br />
USER=&#8221;sys&#8221;</p>
<p># Test Parms<br />
COUNT=&#8221;100000&#8243;<br />
FILE=&#8221;SPEED-TEST&#8221;</p>
<p># Commands To Run On Nas<br />
SHO_CMD=&#8221;cat /etc/exports&#8221;<br />
FIX_CMD=&#8221;sed -i &#8216;s/,sync,/,async,/g&#8217; /etc/exports; /app/bin/rc/rc.nfsd reload&#8221;</p>
<p># Check Args<br />
[ $# -ne 2 ] &amp;&amp; echo -e &#8220;nUsage: $0 nas_name [ fix | show | test ] n&#8221; &amp;&amp; exit 1<br />
NAS=&#8221;$1&#8243;</p>
<p># Parse Command And Run On Host<br />
case &#8220;$2&#8243; in</p>
<p>fix)            # Run Fix<br />
echo -e &#8220;nFixing Async Exports On $NAS&#8221;<br />
$SSH &#8220;$USER@$NAS&#8221; &#8220;$FIX_CMD&#8221;<br />
echo -e &#8220;Done!n&#8221;<br />
;;</p>
<p>show)           # Run Show<br />
echo -e &#8220;nNFS Exports On $NAS:&#8221;<br />
$SSH &#8220;$USER@$NAS&#8221; &#8220;$SHO_CMD&#8221;<br />
echo<br />
;;</p>
<p>test)           # Run Test<br />
echo -e &#8220;nTesting Write To $NAS:&#8221;<br />
$DD &#8220;if=/dev/zero&#8221; &#8220;of=$NAS/$FILE&#8221; &#8220;bs=8k&#8221; &#8220;count=$COUNT&#8221;<br />
rm -f &#8220;$NAS/$FILE&#8221;<br />
echo<br />
;;</p>
<p>*)              # Invalid Command<br />
echo -e &#8220;nInvalid Commandn&#8221;<br />
exit 1<br />
esac</p>
<p>exit 0</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2011/01/speeding-up-thecus-n8800pros-nfs-write-performance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Fresh Start</title>
		<link>http://www.meier.ws/2010/12/a-fresh-start/</link>
		<comments>http://www.meier.ws/2010/12/a-fresh-start/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 13:09:32 +0000</pubDate>
		<dc:creator>micha</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://mmeier.net/?p=254</guid>
		<description><![CDATA[&#8220;About time!&#8221; was the first reaction I heard when I told a friend about me working on my new homepage. Several weeks later and just in time for the new year it&#8217;s ready for the public. Aside from the static (bilingual) content I&#8217;ll try to regular blog posts to keep it interesting. The content of <a href='http://www.meier.ws/2010/12/a-fresh-start/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>&#8220;About time!&#8221; was the first reaction I heard when I told a friend about me working on my new homepage. Several weeks later and just in time for the new year it&#8217;s ready for the public.<br />
Aside from the static (bilingual) content I&#8217;ll try to regular blog posts to keep it interesting. The content of a personal blog is always a balancing act between professional posts and personal topics. Due to this I decided to keep this blog mostly technical. I wish to give valuable tips and information on topics such as Server Administration, Software Development, Android, Fault Tolerance, Cloud Computing and much more from work experience and my Bachelor thesis. There&#8217;ll be the occasional non tech post as well, so it hopefully won&#8217;t be only for hardcore geeks.</p>
<p>Blog posts will be in English to address a wider audience unless it&#8217;s a topic only relevant to Germans in which case it&#8217;ll be (obviously) in German.</p>
<p>I don&#8217;t consider myself to be perfect and might make mistakes so feel free to give (constructive) feedback and corrections. All that&#8217;s left to say for now is: Have fun :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meier.ws/2010/12/a-fresh-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

