<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://interwebplus.com/blog/rss/" rel="self" type="application/rss+xml" />
		<title>interWeb+</title>
		<description></description>
		<link>http://interwebplus.com/blog/</link>
			<item>
				<title>Administering Dell Remote Access Controllers with Ubuntu</title>
				<link>http://interwebplus.com/blog/post/administering-dell-remote-access-controllers-with-ubuntu</link>
				<guid>http://interwebplus.com/blog/post/administering-dell-remote-access-controllers-with-ubuntu</guid>
				<pubDate>Thu, 13 Sep 2012 13:52:00 -0400</pubDate>
				<description><![CDATA[ <p>
	"RACADM enables you to locally or remotely configure and manage your DRAC 5", according to Dell. Installing racadm in Ubuntu is very straightforward and easy.</p>
<h2>
	Here's how.</h2>
<p>
	Run the following commands in a Terminal session:</p>
<p>
	<code>sudo mkdir /tmp/dell<br />
	cd /tmp/dell<br />
	sudo wget http://linux.dell.com/repo/hardware/OMSA_5.5/pe2650/rh50/srvadmin/srvadmin-racser-devel-5.5.0-364.i386.rpm<br />
	sudo apt-get install rpm<br />
	rpm2cpio srvadmin-racser-devel-5.5.0-364.i386.rpm | sudo cpio -idmv<br />
	sudo mkdir /usr/lib/dell<br />
	sudo cp opt/dell/srvadmin/rac3/libs/* /usr/lib/dell/<br />
	sudo cp opt/dell/srvadmin/rac3/bin/racadm /usr/sbin/racadm<br />
	sudo touch /etc/ld.so.conf.d/dell.conf<br />
	sudo chmod 777 /etc/ld.so.conf.d/dell.conf<br />
	echo "/usr/lib/dell" > /etc/ld.so.conf.d/dell.conf<br />
	sudo chmod 644 /etc/ld.so.conf.d/dell<br />
	sudo ldconfig</code></p>
<h2>
	That's it!</h2>
<p>
	You may now use racadm to administer your Dell Remote Access Controllers (DRAC). Here's a quick overview of the the available commands you may run using this great tool:</p>
<p>
	<code>  help <subcmd>   -- list usage statement for specified subcmd<br />
	  allowEnDisRem   -- Allow Enable or Disable Remote Console<br />
	  clearasrscreen  -- clear the last ASR screen(last blue screen)<br />
	  clrraclog       -- clear the RAC Log<br />
	  clrsel          -- clear the SEL<br />
	  config          -- configure the RAC<br />
	  coredump        -- display the last RAC coredump<br />
	  coredumpdelete  -- delete the coredump stored in the RAC<br />
	  fwupdate        -- execute or get status on RAC firmware update<br />
	  getassettag     -- display asset tags<br />
	  getconfig       -- display the RAC configuration<br />
	  getled          -- display the LED settings on a module<br />
	  getmnfgcfg      -- display manufacturing config mode<br />
	  getmodinfo      -- get module config and status information<br />
	  getniccfg       -- display the current IP configuration<br />
	  getraclog       -- display RAC Log entries<br />
	  getractime      -- display the time from the Remote Access Controller<br />
	  getsel          -- display system event log entries<br />
	  getsensors      -- display RAC sensor readings and information<br />
	  getsensorinfo   -- get sensor status for the specified sensors<br />
	  getssninfo      -- display information about active sessions<br />
	  getsvctag       -- display service tags<br />
	  getsysinfo      -- display general RAC and system information<br />
	  gettracelog     -- display Trace Log entries<br />
	  localauthenable -- Local OS authentication Enable or Disable<br />
	  racdump         -- dump RAC status and state information for debug<br />
	  setmnfgcfg      -- set manufacturing config mode<br />
	  racreset        -- reset the RAC<br />
	  racresetcfg     -- reset the RAC to the default configuration<br />
	  serveraction    -- execute graceful/hard server reset, or power-on/off/cycle<br />
	  setassettag     -- set the specified asset tag<br />
	  setled          -- set the state of the LEDs on a module<br />
	  setniccfg       -- set the IP configuration<br />
	  setrac          -- set Time, Hostname, OS Name/Type from host-to-RAC<br />
	                   (The setrac command is not available with the -r option)<br />
	  setractime      -- set the time on the Remote Access Controller<br />
	  setsysinfo      -- set chassis name and chassis location<br />
	  sslcertupload   -- upload a Server or CA certificate on the RAC<br />
	  sslcertdownload -- download a server or Active Directory CA certificate<br />
	  sslcertview     -- view a Server or CA certificate<br />
	  sslcsrgen       -- generate and download CSR from the RAC or check CSR status<br />
	  syncvncpassword -- Sync VNC password from RAC to the Host VNC server<br />
	  testalphapage   -- test the RAC alpha numeric paging feature<br />
	  testemail       -- test the RAC e-mail feature<br />
	  testnumpage     -- test the RAC numeric paging feature<br />
	  testtrap        -- test the RAC trap feature<br />
	  version         -- display racadm utility version information<br />
	<br />
	Usage of racadm commands for remote administration :<br />
	<br />
	racadm -r <RAC IP address> -u <username> -p <password> <RAC command and options><br />
	racadm -r <RAC IP address> -i <RAC command and options><br />
	<br />
	With the "-i" option, the username and password are entered interactively.</code></p>
<p>
	Have fun!</p>
<h3>
	Further reading and sources</h3>
<ul>
	<li>
		<a href="http://www.hedonists.ca/2009/03/11/drac-reset">http://www.hedonists.ca/2009/03/11/drac-reset</a></li>
	<li>
		<a href="https://wiki.edubuntu.org/HardwareSupportMachinesServersDellNotes">https://wiki.edubuntu.org/HardwareSupportMachinesServersDellNotes</a></li>
	<li>
		<a href="http://support.dell.com/support/edocs/software/smdrac3/drac5/OM53/en/ug/racugc9.htm">http://support.dell.com/support/edocs/software/smdrac3/drac5/OM53/en/ug/racugc9.htm</a></li>
</ul>
 ]]></description>
			</item>
			<item>
				<title>Titanic II</title>
				<link>http://interwebplus.com/blog/post/titanic-ii</link>
				<guid>http://interwebplus.com/blog/post/titanic-ii</guid>
				<pubDate>Tue, 01 May 2012 11:43:00 -0400</pubDate>
				<description><![CDATA[ <p>
	Speaking of tragedies and the Titanic, some rich Aussie is building a <a href="http://www.theverge.com/culture/2012/4/30/2988719/australian-billionaire-building-a-replica-of-the-titanic">replica</a> of the Titanic. The maiden voyage is planned for 2016.</p>
<p>
	I highly disapprove for many reasons, some of them ethical and some of them more complex. Is it just me?</p>
<p>
	This just feels <strong>wrong</strong>.</p>
 ]]></description>
			</item>
			<item>
				<title>Flight 447</title>
				<link>http://interwebplus.com/blog/post/flight-447</link>
				<guid>http://interwebplus.com/blog/post/flight-447</guid>
				<pubDate>Tue, 01 May 2012 11:40:26 -0400</pubDate>
				<description><![CDATA[ <p>
	Check out this <a href="http://www.telegraph.co.uk/technology/9231855/Air-France-Flight-447-Damn-it-were-going-to-crash.html">Telegraph article</a> detailing the crash that occurred on June 1st 2009.</p>
<p>
	It's all so tragic. It really makes me think of the Titanic. All this tragedy and death, because of screens not representing the necessary information. Hopefully that will change sometime.</p>
 ]]></description>
			</item>
			<item>
				<title>Add RDP Link To Windows Servers in V-Shell</title>
				<link>http://interwebplus.com/blog/post/add-rdp-link-to-windows-servers-in-v-shell</link>
				<guid>http://interwebplus.com/blog/post/add-rdp-link-to-windows-servers-in-v-shell</guid>
				<pubDate>Fri, 20 Apr 2012 11:11:00 -0400</pubDate>
				<description><![CDATA[ <p>
	I decided to add an action link in the host and service list views, in V-Shell. So I added this functionality in fetch_icons.php.</p>
<p>
	The problem was, though, that not all hosts required the <em>same </em>action. For example, a network printer requires a link in the form of <em>"http://172.16.1.10"</em>, while our APC UPSes and our FortiGates require a secure connection (<em>"https://172.16.1.10"</em>) and don't automatically switch to one.</p>
<p>
	Now, for Windows servers.. A direct link to their IP address doesn't do much, except for reminding you that they don't have a web server set up by default!</p>
<p>
	So I found a <a href="http://www.isrcomputing.com/knowledge-base/networking-tips/79-how-to-create-rdp-or-ssh-link-using-html.html">nice tip</a> that explained how to create your own ".rdp" files. That, along with some quick and dirty PHP, and boom! We've got something that's actually pretty cool.</p>
<p>
	I now have action links that go exactly where they should, depending on which hostgroup the host belongs to.</p>
<p>
	I thought I'd share the finished result of my experiment. Here is the new and improved <strong>fetch_icons.php</strong>.</p>
<ul>
	<li>
		v1.0 - Initial release</li>
	<li>
		<a href="http://interwebplus.com/blog/data/uploads/fetch_icons_1.1.zip">v1.1</a> - Cleaner code, adds dynamic creation of VNC files when no RDP service is found</li>
</ul>
<h3>
	Prerequisites</h3>
<p>
	First, it goes without saying that you need Nagios and V-Shell.</p>
<p>
	Now, you should also add the <a href="http://exchange.nagios.org/directory/Plugins/Remote-Access/check_x224/details">RDP service check</a> to your Windows Server template. Name the service <em>RDP</em>. </p>
<p>
	Finally, create an <em>rdp </em>folder in V-Shell's root folder, and chmod it to 777. This allows the script to dump the finished ".rdp" files in there. The same goes for a <em>vnc </em>subfolder.</p>
<p>
	Have fun! Here's <a href="http://interwebplus.com/blog/data/uploads/images/action_icons.png">a screenshot</a> of the icons in action.</p>
 ]]></description>
			</item>
			<item>
				<title>Monitor Dell Servers: check_dell</title>
				<link>http://interwebplus.com/blog/post/monitor-dell-servers-check_dell</link>
				<guid>http://interwebplus.com/blog/post/monitor-dell-servers-check_dell</guid>
				<pubDate>Thu, 19 Apr 2012 16:11:00 -0400</pubDate>
				<description><![CDATA[ <p>
	I was looking for a good way to monitor our Dell servers, but I didn't want to have to go through OpenManage. I wanted to be able to connect directly to the machine, without going through an additional step. </p>
<p>
	The <em>check_bmc</em> scripts floating around on the net didn't work for me, for some reason.</p>
<p>
	So I decided to write my own.</p>
<h2>
	Introducing check_dell</h2>
<p>
	This plugin connects directly to a DRAC (Dell Remote Access Controller) or iDRAC (Integrated Dell Remote Access Controller) and provides information about the server and its status.</p>
<p>
	This program does not require OpenManage to work, and is thus more independent then some other scripts that I had found while searching for a feasible solution.</p>
<p>
	There are only two requirements. IPMI needs to be enabled through the DRAC web interface, and the <em>freeipmi-tools</em> package needs to be installed on your Ubuntu/Nagios machine.</p>
<p>
	To enable IPMI through the web GUI, perform the following steps.</p>
<h3>
	For DRAC v5</h3>
<ul>
	<li>
		Click on <strong>Remote Access</strong> in the left navigation pane.</li>
	<li>
		Click on <strong>Configuration </strong>in the top navigation pane.</li>
	<li>
		Scroll down to IPMI LAN Settings and activate the Enable IPMI Over LAN checkbox.</li>
	<li>
		Click on <strong>Apply Changes</strong>.</li>
</ul>
<h3>
	For iDRAC v6</h3>
<ul>
	<li>
		Click on <strong>iDRAC Settings</strong> in the left navigation pane.</li>
	<li>
		Click on <strong>Network/Security</strong> in the top navigation pane.</li>
	<li>
		Scroll down to IPMI Settings and activate the <strong>Enable IPMI Over LAN</strong> checkbox.</li>
	<li>
		Click on <strong>Apply</strong>.</li>
</ul>
<p>
	Finally, run the following command on your Ubuntu machine to install the needed package.</p>
<p>
	<code>sudo apt-get install freeipmi-tools</code></p>
<h2>
	The script</h2>
<p>
	Here's <a href="http://interwebplus.com/blog/data/uploads/check_dell_1.0.zip">version 1.0</a> of check_dell. Save it in your libexec folder and make it executable.</p>
<p>
	Usage can be obtained by running <em>check_dell</em> with no arguments.</p>
<h3>
	Don't Forget</h3>
<p>
	You have to add the command to Nagios. It could look something like this:</p>
<p>
	<code>define command {<br />
	  command_name  check_dell<br />
	  command_line  $USER1$/check_dell -H $HOSTADDRESS$ -U administrator -P password -m $ARG1$ -w $ARG2$ -c $ARG3$<br />
	  register  1<br />
	}</code></p>
<p>
	Have fun!</p>
 ]]></description>
			</item>
			<item>
				<title>Unix: Count Lines or Words</title>
				<link>http://interwebplus.com/blog/post/unix-count-lines-or-words</link>
				<guid>http://interwebplus.com/blog/post/unix-count-lines-or-words</guid>
				<pubDate>Fri, 30 Mar 2012 16:08:53 -0400</pubDate>
				<description><![CDATA[ <p>
	A neat little utility to count words or lines in a file, or from stdout:</p>
<p>
	<code>wc</code></p>
<p>
	For example, to count how many lines (<em>-l</em>) the <em>locate *.desktop</em> command returns:</p>
<p>
	<code>locate *.desktop | wc -l</code></p>
<p>
	Or to count how many words (<em>-w</em>) are in <em>textfile.txt</em>:</p>
<p>
	<code>wc -w textfile.txt</code></p>
<p>
	For more info, </p>
<p>
	<code>man wc</code></p>
<p>
	I didn't know about this one, so I thought I'd share.</p>
 ]]></description>
			</item>
			<item>
				<title>PowerShell Warning and File Unblocking</title>
				<link>http://interwebplus.com/blog/post/powershell-warning-and-file-unblocking</link>
				<guid>http://interwebplus.com/blog/post/powershell-warning-and-file-unblocking</guid>
				<pubDate>Thu, 29 Mar 2012 12:07:00 -0400</pubDate>
				<description><![CDATA[ <p>
	When trying to run a PowerShell script on Windows Server, I got a warning message.</p>
<p>
	<code>Security Warning<br />
	Run only scripts that you trust. While scripts from the Internet can be useful,<br />
	this script can potentially harm your computer. Do you want to run<br />
	C:\script.ps1?<br />
	[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D"):</code></p>
<h3>
	What?</h3>
<p>
	This happens because of a something called <em>NTFS alternate streams</em>. More about these <a href="http://www.flexhex.com/docs/articles/alternate-streams.phtml">here</a>.</p>
<p>
	When a file is downloaded from the Internet, it is marked as unsafe by using the <em>Zone.Identifier</em> stream. However, we know that the script, program, or other file that we downloaded is safe, so let's get rid of the protection.</p>
<p>
	I wrote a batch file to automatically mark all files in the current directory as safe. Copy the following text to a file, change the extension to <em>bat</em>, and run it.</p>
<p>
	<code>@echo off<br />
	cls<br />
	echo This will unblock all files in the current directory directory.<br />
	echo This also marks them as safe for execution.<br />
	set /p userinp=Continue? (y/n):<br />
	set userinp=%userinp:~0,1%<br />
	if "%userinp%"=="y" goto unblock<br />
	if "%userinp%"=="Y" goto unblock<br />
	goto abort<br />
	:unblock<br />
	FOR /r . %%G in (*.*) do (<br />
	echo. > %%G:Zone.Identifier<br />
	)<br />
	goto done<br />:abort<br />
	echo Aborted. Goodbye.<br />
	goto exit<br />:done<br />
	echo Success!<br />
	goto exit<br />:exit<br />
	pause</code></p>
<p>
	For the more geek-inclined: the batch file actually blanks the <em>Zone.Identifier</em> stream. This effectively removes the security block from the files, and XP is none the wiser.</p>
<p>
	Have fun!</p>
 ]]></description>
			</item>
			<item>
				<title>Make Outlook and Android Talk to Each Other</title>
				<link>http://interwebplus.com/blog/post/make-outlook-and-android-talk-to-each-other</link>
				<guid>http://interwebplus.com/blog/post/make-outlook-and-android-talk-to-each-other</guid>
				<pubDate>Thu, 29 Mar 2012 11:15:00 -0400</pubDate>
				<description><![CDATA[ <p>
	One of our users wanted to get his Outlook contacts on his new Samsung Galaxy Gio (GT-S5660M). One would have thought the one-time-sync process to be easy, simple, and painless, right?</p>
<h3>
	Wrong</h3>
<p>
	For some reason, the import functionality of the Kies software that came with the phone is severely limited; an UI glitch prevents the end-user from selecting which columns in a CSV file correspond to which fields in the contacts entry.</p>
<p>
	It turns out that the easiest way to get this done is by exporting your contacts to a vCard, a format which is supported by Outlook.. Kinda.</p>
<h3>
	Here's how to get it done</h3>
<ul>
	<li>
		Select all the contacts you'd like on your Android phone in Outlook</li>
	<li>
		Go to the <em>Actions </em>menu, and select <em>Forward vCard</em></li>
	<li>
		Send the resulting email to yourself</li>
	<li>
		Go to <em>File</em>, and select <em>Save Attachments</em></li>
	<li>
		Save the vCard (.vcf) files to a new folder</li>
	<li>
		Open a command prompt and <em>cd </em>to the folder containing the vcf files</li>
	<li>
		Run the following command:</li>
</ul>
<p>
	<code>copy *.vcf Outlook.vcf</code></p>
<ul>
	<li>
		Now, in Kies, expand your Android phone's tree, and select <em>Contacts</em>
		<ul style="margin-bottom: 0px;">
			<li>
				Make sure you select the <em>Contacts </em>entry that's under your phone!</li>
		</ul>
	</li>
	<li>
		Click on <em>Import from PC</em>, and feed it your <em>Outlook.vcf</em> file.</li>
	<li>
		If you're happy with the proposed changes (the entries in orange) then click on <em>Save to device</em>.</li>
</ul>
<h3>
	Ta-Dam</h3>
<p>
	Your Android phone now contains all of the contacts that Outlook does.</p>
<p>
	I'm <strong>really </strong>starting to love my iPhone right about now.</p>
 ]]></description>
			</item>
			<item>
				<title>PsExec From Linux: Winexe</title>
				<link>http://interwebplus.com/blog/post/psexec-from-linux-winexe</link>
				<guid>http://interwebplus.com/blog/post/psexec-from-linux-winexe</guid>
				<pubDate>Fri, 23 Mar 2012 14:53:00 -0400</pubDate>
				<description><![CDATA[ <p>
	If you ever need to remotely login to a Windows computer's command line from a Linux box, you can use the useful <em>winexe </em>program found in the tarball I talk about <a href="http://interwebplus.com/blog/post/nagios-check-wmi-plus-on-ubuntu">here</a>.</p>
<p>
	There's an error in the source code that'll prevent winexe from working, though. </p>
<p>
	You can fix it by editing <em>service.c</em>...</p>
<p>
	<code>nano wmi-1.x.xx/Samba/source/winexe/service.c</code></p>
<p>
	Replace<strong> line 18</strong> with this (notice the subtle difference):</p>
<p>
	<code>#define NT_STATUS_SERVICE_DOES_NOT_EXIST NT_STATUS(0x0000424)</code></p>
<p>
	Now compile everything (after modifying <em>GNUmakefile </em>as described in my previous blog post...).</p>
<p>
	<code>make</code></p>
<p>
	Once everything is compiled, all you have to do is copy the winexe binary to your bin folder.</p>
<p>
	<code>cp wmi-1.x.xx/Samba/source/bin/wmic /usr/bin</code></p>
<p>
	And now, try it out!</p>
<p>
	<code>winexe -U 'DOMAIN\adminuser' //computername cmd</code></p>
<p>
	This should, after prompting your for <em>adminuser</em>'s password, give you access to the remote Windows machine's command prompt.</p>
<p>
	<code># winexe -U 'DOMAIN\adminuser' //computername cmd<br />
	Password for [DOMAIN\adminuser]:<br />
	Microsoft Windows XP [version 5.1.2600]<br />
	(C) Copyright 1985-2001 Microsoft Corp.<br/>C:\WINDOWS\system32></code></p>
<p>
	I used iconv to make sure that accented characters appear correctly, since Windows sometimes use a funky codepage (like in this case, for me). If you see funky characters, run this to find out which codepage Windows is using:</p>
<p>
	<code># winexe -U 'DOMAIN\adminuser' //computername 'cmd /c chcp'<br />
	Password for [DOMAIN\adminuser]:<br />
	Page de codes active▒: <strong>850</strong></code></p>
<p>
	Grab the three-digit code and substitute it for the <em>850 </em>in the <em>iconv </em>part of the following command:</p>
<p>
	<code># winexe -U 'DOMAIN\adminuser' //computername 'cmd /c dir c:\' | iconv -f CP<strong>850</strong><br />
	Password for [DOMAIN\adminuser]:<br />
	Le volume dans le lecteur C n'a pas de nom.<br />
	Le numéro de série du volume est XXXX-XXXX<br/>Répertoire de c:\<br/>2009-02-13  10:37    <REP>          A-123<br />
	2008-06-03  13:55           627 820 A-5 Wall Drawing.dwg<br />
	2009-02-12  16:19                 0 AUTOEXEC.BAT<br />
	2009-02-12  16:19                 0 CONFIG.SYS<br />
	2009-02-12  16:42    <REP>          dell<br />
	2012-03-23  14:02    <REP>          Documents and Settings<br />
	2009-02-12  16:41    <REP>          I386<br />
	2012-03-20  08:57    <REP>          IDE<br />
	2009-02-12  16:45    <REP>          Intel<br />
	2012-03-23  07:47               164 loginscript.log<br />
	2011-09-22  08:13            13 030 PDO.log<br />
	2012-03-22  13:11    <REP>          Program Files<br />
	2009-04-27  20:09           111 766 snt9382.tif<br />
	2009-05-01  14:47            94 084 snt9384.tif<br />
	2010-03-03  01:04           758 486 snt9385.tif<br />
	2009-02-18  11:23    <REP>          Underdog<br />
	2012-03-23  14:16    <REP>          WINDOWS<br />
	               8 fichier(s)        1 605 350 octets<br />
	               9 Rép(s)  93 033 771 008 octets libres</code></p>
<p>
	Enjoy.</p>
 ]]></description>
			</item>
			<item>
				<title>Math, From A Blonde\&#039;s Point Of View</title>
				<link>http://interwebplus.com/blog/post/math-from-a-blondes-point-of-view</link>
				<guid>http://interwebplus.com/blog/post/math-from-a-blondes-point-of-view</guid>
				<pubDate>Thu, 22 Mar 2012 23:53:00 -0400</pubDate>
				<description><![CDATA[ <p>
	Wow. <a href="http://www.youtube.com/watch?v=N4_THXK4nbY">This</a> is unbelievable.</p>
<p>
	<em><strong>Really?</strong></em></p>
 ]]></description>
			</item>
			<item>
				<title>Bash: Using Functions</title>
				<link>http://interwebplus.com/blog/post/bash-using-functions</link>
				<guid>http://interwebplus.com/blog/post/bash-using-functions</guid>
				<pubDate>Fri, 16 Mar 2012 15:30:00 -0400</pubDate>
				<description><![CDATA[ <p>
	If you're like me, you often find yourself typing in the same commands in your shell over and over again.</p>
<p>
	Here's a neat way to make things a bit shorter: by using Bash functions.</p>
<h3>
	For Example</h3>
<p>
	I often search for text inside of files in the terminal. To do this, my command often looks like this:</p>
<p>
	<code>find -type f | xargs grep -siR "search text here"</code></p>
<p>
	I got fed up of typing these lines all the time! So I created a function named <em>fif </em>(find-in-files.. lame, I know) that makes this task alot faster and simpler.</p>
<h3>
	How</h3>
<p>
	Here are the steps that I took. Open up <em>~/.bashrc</em> and add this to the bottom of it:</p>
<p>
	<code>fif () {<br />
	        clear<br />
	        echo -e "Finding text \"\033[1;32m"$1"\033[m\" in files under \""$PWD"\""<br />
	        echo<br />
	        export GREP_COLOR='1;32'<br />
	        find -type f | xargs grep --color -siIR "$1"<br />
	        echo<br />
	}</code></p>
<p>
	Now, either log out and back in, or run this command:</p>
<p>
	<code>source ~/.bashrc</code></p>
<p>
	This reloads your session using the parameters found in <em>~/.bashrc</em>.</p>
<p>
	Now, enter this:</p>
<p>
	<code>fif "search text here"</code></p>
<p>
	And the output will be something like this:</p>
<p>
	<code>Finding text "search text here" in files under "/root/testdir"<br />

	./testsubdir/123.txt:Lorem ipsum search text here doloret.<br />
	./Test.txt:Search Text HERE!!! Yep, it works.</code></p>
<h3>
	Try It Out</h3>
<p>
	Now, use your imagination! Bash functions can automate or simplify a number of repetitive tasks that we carry out on a daily basis.</p>
<p>
	I'm glad I found out about them.</p>
 ]]></description>
			</item>
			<item>
				<title>Craziness on the feed</title>
				<link>http://interwebplus.com/blog/post/craziness-on-the-feed</link>
				<guid>http://interwebplus.com/blog/post/craziness-on-the-feed</guid>
				<pubDate>Fri, 16 Mar 2012 13:13:00 -0400</pubDate>
				<description><![CDATA[ <p>
	For those of you who are subscribed to my RSS feed, you'll notice that you got an unhealthy dose of old articles served up as being new today..</p>
<h3>
	Sorry!</h3>
<p>
	This is due to an update to the site which allows two things:</p>
<ul>
	<li>
		Better search-engine visibility</li>
	<li>
		Nicer URLs :) </li>
</ul>
<p>
	No panic, it won't happen often.</p>
<p>
	'Nuff said.</p>
 ]]></description>
			</item>
			<item>
				<title>Wow.. WISE Images</title>
				<link>http://interwebplus.com/blog/post/wow-wise-images</link>
				<guid>http://interwebplus.com/blog/post/wow-wise-images</guid>
				<pubDate>Fri, 16 Mar 2012 09:37:00 -0400</pubDate>
				<description><![CDATA[ <p>
	Check out <a href="http://wise.ssl.berkeley.edu/gallery_images.html">the awesome images</a> from the WISE orbital telescope.</p>
<p>
	The wonders of creation never cease to amaze - Isaiah 40:26</p>
<p>
	<img alt="" src="http://wise.ssl.berkeley.edu/gallery_images/flaring_black_hole-lg.jpg" style="border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; width: 635px; height: 429px; " /></p>
<p>
	<img alt="" src="http://wise.ssl.berkeley.edu/gallery_images/WISE2010-047-lg.jpg" style="border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; width: 635px; height: 635px; " /></p>
<p>
	<img alt="" src="http://wise.ssl.berkeley.edu/gallery_images/B-RCW86-IR-Xray-lg.jpg" style="border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; width: 635px; height: 487px; " /></p>
 ]]></description>
			</item>
			<item>
				<title>Apache: 404 Weirdness</title>
				<link>http://interwebplus.com/blog/post/apache-404-weirdness</link>
				<guid>http://interwebplus.com/blog/post/apache-404-weirdness</guid>
				<pubDate>Tue, 13 Mar 2012 15:08:13 -0400</pubDate>
				<description><![CDATA[ <p>
	This has been a crazy two weeks.</p>
<p>
	I had a working setup with PNP4Nagios and Nagios. Everything was great.</p>
<p>
	Then, I decided to install <a href="http://www.nagiosql.org/">NagiosQL</a> to try it out, give it a test run. By the way, it's pretty damn cool. Try it out if you can.</p>
<p>
	After installing it, PNP4Nagios's web UI (read: the graphs) didn't work anymore. I got this error when trying to access any PNP4Nagios page:</p>
<p>
	<code>The requested URL /pnp4nagios/index.php/graph was not found on this server.</code></p>
<h3>
	Damn it</h3>
<p>
	I struggled with this for weeks. I reconfigured every Apache and PNP4Nagios configuration file that I could find.</p>
<p>
	Turns out, the solution was (as always) quite simple. I found it on <a href="http://stackoverflow.com/questions/9323678/repair-broken-symlinks-reinstall-php5">Stack Exchange</a>, after days of searching.</p>
<p>
	<code>apt-get purge libapache2-mod-php5 php5 && apt-get install libapache2-mod-php5 php5<br />
	service apache2 restart</code></p>
<p>
	Everything now works like a charm once again. Oh, the joy.</p>
<p>
	It would seem that NagiosQL's installation (or rather, the installation of its prerequisites) somehow broke something.. Frankly, I don't really care. As long as it works now, I'm happy.</p>
<p>
	 </p>
 ]]></description>
			</item>
			<item>
				<title>The following packages have been kept back...</title>
				<link>http://interwebplus.com/blog/post/the-following-packages-have-been-kept-back</link>
				<guid>http://interwebplus.com/blog/post/the-following-packages-have-been-kept-back</guid>
				<pubDate>Fri, 02 Mar 2012 09:43:46 -0500</pubDate>
				<description><![CDATA[ <p>
	I just <strong>love</strong> these simple, not-really-that-important problems that are relatively easy to fix, but that nevertheless drive me insane until I do so. I have determined that the trivialness of the problem is always inversely correlated with the speed at which the said problem invades all of my consious thoughts, as well as my subconscious.</p>
<h2>
	What is it this time?</h2>
<p>
	Well, go figure, but running apt-get upgrade got me this:</p>
<p>
	<code>The following packages have been kept back:<br />
	        gnome-shell</code></p>
<p>
	What the heck?</p>
<p>
	Luckily, it turns out this one is simple enough to fix.</p>
<p>
	<code>apt-get dist-upgrade</code></p>
<p>
	Thanks goodness for the supposedly obsolete <a href="http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html#s-dist-upgrade">APT documentation</a>.</p>
 ]]></description>
			</item>
			<item>
				<title>Apple Event on March 7th!</title>
				<link>http://interwebplus.com/blog/post/apple-event-on-march-7th</link>
				<guid>http://interwebplus.com/blog/post/apple-event-on-march-7th</guid>
				<pubDate>Tue, 28 Feb 2012 12:31:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I'm thinking one of two things.</p>
<div>
	<p>
		One: a new line of hi-res, multitouch Macs. The line between Apple devices will get thinner and a unified iDevice ecosystem will slowly become even more of a reality.</p>
	<p>
		Two: a redesigned iPad, perhaps with no physical home button. Think of the multitouch gestures introduced a while back. Looks to me as if Apple was testing the waters, no?</p>
	<p>
		OK, it's probably more likely to be the second option. But I think the first one will materialize soon as well.</p>
</div>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Monitor Fortigate Firewalls</title>
				<link>http://interwebplus.com/blog/post/nagios-monitor-fortigate-firewalls</link>
				<guid>http://interwebplus.com/blog/post/nagios-monitor-fortigate-firewalls</guid>
				<pubDate>Tue, 28 Feb 2012 11:58:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I modified a <a href="http://exchange.nagios.org/directory/Plugins/Hardware/Network-Gear/Fortinet/Check-Fortigate-CPU-load/details">cool script</a> to monitor our Fortigates (200A and 80C).</p>
<p>
	Here's hoping someone finds it useful.</p>
<h3>
	Usage</h3>
<p>
	<code># ./check_fortigate_status<br />
	Usage: check_fortigate_status -H host -m mode [-C community] [-M X] [-w XX] [-c XX]<br />
	Options:<br />
	-H, --host hostname (or IP address)<br />
	        Check interface on the indicated host.<br />
	-m, --mode STRING<br />
	        What to check<br />
	        Valid values are:<br />
	                cpu             Returns CPU usage<br />
	                memory          Returns memory usage<br />
	                sessions        Returns the number of active IP sessions<br />
	-C, --community STRING<br />
	        SNMP community string<br />
	        Default: public<br />
	-M, --modus X<br />
	        0: Just monitor, no alarms<br />
	        1: Threshold excesses will cause alarms<br />
	        Default: 2<br />
	-w, --warn XX<br />
	        Nagios warning threshold<br />
	        Percent value for "memory" and "cpu" modes<br />
	        Default: 80%<br />
	        Integer value for "sessions" mode<br />
	        Default: 1500<br />
	-c, --crit XX<br />
	        Nagios critical threshold<br />
	        Percent value for "memory" and "cpu" modes<br />
	        Default: 90%<br />
	        Integer value for "sessions" mode<br />
	        Default: 2000</code></p>
<h3>
	The Service Definitions</h3>
<p>
	<code># Service to check Fortigate's memory<br />
	define service {<br />
	        use                     generic-service<br />
	        hostgroup_name          fortigates<br />
	        service_description     Memory Usage<br />
	        check_command           check_fortigate_status!memory<br />
	}<br />
	# Service to check Fortigate's cpu<br />
	define service {<br />
	        use                     generic-service<br />
	        hostgroup_name          fortigates<br />
	        service_description     CPU Usage<br />
	        check_command           check_fortigate_status!cpu<br />
	}<br />
	# Service to check Fortigate's IP sessions<br />
	define service {<br />
	        use                     generic-service<br />
	        hostgroup_name          fortigates<br />
	        service_description     Active Sessions<br />
	        check_command           check_fortigate_status!sessions<br />
	}</code></p>
<h3>
	The Nagios Command</h3>
<p>
	<code>define command {<br />
	        command_name            check_fortigate_status<br />
	        command_line            $USER1$/check_fortigate_status -H $HOSTADDRESS$ -m $ARG1$<br />
	}</code></p>
<h3>
	The code</h3>
<p>
	<code>#!/usr/bin/perl<br />
	# This Plugin checks the status of Fortigate Firewalls<br />
	# Thanks to Gerrit Doornenbal for the original script.. <br />
	# I just modded it heavily.<br/># Check for proper args....<br />
	if ($#ARGV <= 0){<br />
	&print_help();<br />
	}<br/>my %status = ( 'UNKNOWN' => '-1',<br />
	    'OK'    => '0',<br />
	    'WARNING' => '1',<br />
	    'CRITICAL' => '2' );<br />
	my ($ip, $mode, $community, $modus, $warn, $crit, $performance) = pars_args();<br/>@oidDescTest = (".1.3.6.1.4.1.12356.1.3", ".1.3.6.1.2.1.47.1.1.1.1.10.1");<br />
	until ($oidFound) {<br />
	foreach $oidDesc (@oidDescTest) {<br />
	  $snmpCommand = `/usr/bin/snmpwalk -v 2c -c $community $ip $oidDesc`;<br />
	  chomp $snmpCommand;<br/>  if ($snmpCommand =~ "No Such Object") {<br />
	   # Do nothing<br />
	  } else {<br />
	   $oidFound = "yes";<br />
	   $descString = $snmpCommand;<br />
	  }<br />
	}<br />
	}<br/>@descArray = split("\"", $descString);<br />
	$unitdesc = @descArray[-1];<br/>@descArray = split(",", $unitdesc);<br />
	$unitdesc = @descArray[0];<br/>@descArray = split(" ", $unitdesc);<br />
	$unitdesc = @descArray[0];<br/>if ($mode =~ "cpu" && $unitdesc =~ m/200/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.1.8";<br />
	} elsif ($mode =~ "cpu" && $unitdesc =~ m/80c/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.3";<br />
	} elsif ($mode =~ "cpu") {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.3";<br />
	} elsif ($mode =~ "mem" && $unitdesc =~ m/200/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.1.9";<br />
	} elsif ($mode =~ "mem" && $unitdesc =~ m/80c/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.4";<br />
	} elsif ($mode =~ "mem") {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.4";<br />
	} elsif ($mode =~ "ses" && $unitdesc =~ m/200/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.1.10";<br />
	} elsif ($mode =~ "ses" && $unitdesc =~ m/80c/i) {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.8";<br />
	} elsif ($mode =~ "ses") {<br />
	$oid = ".1.3.6.1.4.1.12356.101.4.1.8";<br />
	} else {<br />
	&print_help();<br />
	}<br/>eval {<br />
	$snmpCommand = `/usr/bin/snmpwalk -v 2c -c $community $ip $oid`;<br />
	chomp $snmpCommand;<br />
	} or do {<br />
	system("clear");<br />
	print "\nOops! Your model doesn't seem to be supported by this script... Yet!\n\n";<br />
	print "If you want to help out, try running the following command (replace \"FGXXXXXXXXXXXXXX\" with your Fortigate's serial number):\n\n";<br />
	print " snmpwalk -v 2c -c public [FortiGate IP address] .1.3.6.1.4.1.12356 | grep -iR \"FGXXXXXXXXXXXXXX\"\n";<br />
	print "\n";<br />
	print "The OIDs for CPU usage and other stats are almost always found near an OID containing the unit's serial number.\n\n";<br />
	print "For example, here's the output I get:\n\n";<br />
	print " # snmpwalk -v 2c -c public 172.16.10.10 .1.3.6.1.4.1.12356 | grep -iR \"FGT80C1234567890\"\n";<br />
	print "  iso.3.6.1.4.1.12356.100.1.1.1.0 = STRING: \"FGT80C1234567890\"\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.2.1 = STRING: \"FGT80C1234567890\"\n\n";<br />
	print "Now, all I need is to find which OID branch contains the info I want.\nTo do this, I grab the OID of the first result...\n\n";<br />
	print " iso.3.6.1.4.1.12356.100.1.1.1.0\n\n";<br />
	print "... remove the last two digits...\n\n";<br />
	print " iso.3.6.1.4.1.12356.100.1.1\n\n";<br />
	print "... and use that with snmpwalk.\n\n";<br />
	print " # snmpwalk -v 2c -c public 172.16.10.10 iso.3.6.1.4.1.12356.100.1.1\n";<br />
	print "  iso.3.6.1.4.1.12356.100.1.1.1.0 = STRING: \"FGT80C1234567890\"\n\n";<br />
	print "Hmmm. Nothing useful here.\n\nLet's try the second value.\n\n";<br />
	print " iso.3.6.1.4.1.12356.101.13.2.1.1.2.1\n\n";<br />
	print "... remove the last two digits...\n\n";<br />
	print " iso.3.6.1.4.1.12356.101.13.2.1.1\n\n";<br />
	print "... and try that with snmpwalk!\n\n";<br />
	print " # snmpwalk -v 2c -c public 172.16.10.10 iso.3.6.1.4.1.12356.101.13.2.1.1\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.1.1 = INTEGER: 1\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.2.1 = STRING: \"FGT80C1234567890\"\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.3.1 = Gauge32: 99\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.4.1 = Gauge32: 72\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.5.1 = Gauge32: 19690\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.6.1 = Gauge32: 212\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.7.1 = Counter32: 4185780372\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.8.1 = Counter32: 2786324006\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.9.1 = Counter32: 0\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.10.1 = Counter32: 0\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.11.1 = \"\"\n";<br />
	print "  iso.3.6.1.4.1.12356.101.13.2.1.1.11.1 = No more variables left in this MIB View (It is past the end of the MIB tree)\n\n";<br />
	print "Ooohhh... I like this!\nThe third and fourth values turn out to be the values for CPU and RAM usage, respectively..\n\n";<br />
	print "So, try to find the values for your model, and I'll update the script with your findings.\n\n";<br />
	<br />
	exit($status{"UNKNOWN"});<br />
	};<br/>if ($mode =~ "cpu") {<br />
	@cpuArray = split(" ", $snmpCommand);<br />
	$usage = @cpuArray[-1]."%";<br />
	$usagestring = "CPU Usage";<br />
	} elsif ($mode =~ "mem") {<br />
	@memArray = split(":", $snmpCommand);<br />
	$usage = @memArray[-1]."%";<br />
	$usagestring = "Memory Usage";<br />
	} elsif ($mode =~ "ses") {<br />
	@sesArray = split(" ", $snmpCommand);<br />
	$usage = @sesArray[-1];<br />
	$warn = "1500";<br />
	$crit = "2000";<br />
	$usagestring = "Active IP Sessions";<br />
	}<br/>$usage =~ s/^\s+//; # Remove leading...<br />
	$usage =~ s/\s+$//; # ...and trailing spaces<br/>my $string_errors="";<br />
	my $state = "OK";<br/>my $unitstate="OK";<br />
	if ($modus >= 1 )<br />
	{<br />
	if ($usage >= $warn)<br />
	{<br />
	  $unitstate="WARNING";<br />
	}<br />
	if ($usage >= $crit)<br />
	{<br />
	  $unitstate="CRITICAL";<br />
	}<br />
	}<br/>my $string = $unitdesc . ": " . $unitstate;<br />
	$string = $string . ", $usagestring: " . $usage;<br/>my $perfstring="";<br />
	if ( $performance eq "yes" )<br />
	{<br />
	$perfstring="| $usagestring=".$usage.";".$warn.";".$crit;<br />
	}<br />
	$string = $string.$perfstring;<br/>if($string =~/uknw/){<br />
	$state = "UNKNOWN";<br />
	}<br />
	if($string =~/WARNING/){<br />
	$state = "WARNING";<br />
	}<br />
	if($string =~/down/){<br />
	$state = "CRITICAL";<br />
	}<br />
	if($string =~ m/critical/i){<br />
	$state = "CRITICAL";<br />
	}<br/>print $string."\n";<br />
	exit($status{$state});<br/>sub pars_args<br />
	{<br />
	my $ip    = "";<br />
	my $mode    = "";<br />
	my $community = "public";<br />
	my $modus   = "2";<br />
	my $warn  = "80";<br />
	my $crit  = "90";<br />
	my $performance = "yes";<br />
	while(@ARGV)<br />
	{<br />
	  if($ARGV[0] =~/^-H|^--host/)<br />
	  {<br />
	   $ip = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	  if($ARGV[0] =~/^-m|^--mode/)<br />
	  {<br />
	   $mode = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	  if($ARGV[0] =~/^-C|^--community/)<br />
	  {<br />
	   $community = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	  if($ARGV[0] =~/^-M|^--modus/)<br />
	  {<br />
	   $modus = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	if($ARGV[0] =~/^-w|^--warn/)<br />
	  {<br />
	   $warn = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	if($ARGV[0] =~/^-c|^--crit/)<br />
	  {<br />
	   $crit = $ARGV[1];<br />
	   shift @ARGV;<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	if($ARGV[0] =~/^-f|^-F/)<br />
	  {<br />
	   $performance = "yes";<br />
	   shift @ARGV;<br />
	   next;<br />
	  }<br />
	}<br />
	return ($ip, $mode, $community, $modus, $warn, $crit, $performance);<br />
	}<br/>sub print_help() {<br />
	print "\n";<br />
	print "Usage: check_fortigate_status -H host -m mode [-C community] [-M X] [-w XX] [-c XX]\n\n";<br />
	print "Options:\n\n";<br />
	print " -H, --host hostname (or IP address)\n";<br />
	print " Check interface on the indicated host.\n\n";<br />
	print " -m, --mode STRING\n";<br />
	print " What to check\n";<br />
	print " Valid values are:\n";<br />
	print "  cpu  Returns CPU usage\n";<br />
	print "  memory  Returns memory usage\n";<br />
	print "  sessions Returns the number of active IP sessions\n\n";<br />
	print " -C, --community STRING\n";<br />
	print " SNMP community string\n";<br />
	print " Default: public\n\n";<br />
	print " -M, --modus X\n";<br />
	print " 0: Just monitor, no alarms\n";<br />
	print " 1: Threshold excesses will cause alarms\n";<br />
	print " Default: 2\n\n";<br />
	print " -w, --warn XX\n";<br />
	print " Nagios warning threshold\n";<br />
	print " Percent value for \"memory\" and \"cpu\" modes\n";<br />
	print " Default: 80%\n";<br />
	print " Integer value for \"sessions\" mode\n";<br />
	print " Default: 1500\n\n";<br />
	print " -c, --crit XX\n";<br />
	print " Nagios critical threshold\n";<br />
	print " Percent value for \"memory\" and \"cpu\" modes\n";<br />
	print " Default: 90%\n";<br />
	print " Integer value for \"sessions\" mode\n";<br />
	print " Default: 2000\n";<br />
	#print " -F Also giving performance data output.\n\n";<br />
	#print "This plugin checks certain performance stats and gives the current utilization.\n\n";<br />
	<br />
	exit($status{"UNKNOWN"});<br />
	}</code></p>
 ]]></description>
			</item>
			<item>
				<title>Network: Find Out On Which Computers Domain Users are Logged In</title>
				<link>http://interwebplus.com/blog/post/network-find-where-domain-users-are-logged-in</link>
				<guid>http://interwebplus.com/blog/post/network-find-where-domain-users-are-logged-in</guid>
				<pubDate>Thu, 23 Feb 2012 14:26:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I just rediscovered a neat tool I had forgotten about: <a href="http://www.unixwiz.net/tools/nbtscan.html">nbtscan</a>.</p>
<p>
	<code>apt-get install nbtscan</code></p>
<p>
	I was trying to remember what computer a particular user used normally... Without success.</p>
<h3>
	Wow</h3>
<p>
	All it took was:</p>
<p>
	<code>nbtscan 172.16.0.0/16 | grep -iR "user"</code></p>
<p>
	Where <em>172.16.0.0/16</em> is the range to scan, and <em>user</em> is a part of the user's username on the domain.</p>
<p>
	Boom. The computer's hostname, IP address, and MAC address showed up.</p>
<p>
	<code>172.16.1.100  COMPUTER-NAME  <server>  USER-NAME  00:11:22:33:44:55</code></p>
<p>
	You gotta love these little freebies. It's cross-platform, too.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Acknowledge by Email</title>
				<link>http://interwebplus.com/blog/post/nagios-acknowledge-by-email</link>
				<guid>http://interwebplus.com/blog/post/nagios-acknowledge-by-email</guid>
				<pubDate>Tue, 21 Feb 2012 13:02:00 -0500</pubDate>
				<description><![CDATA[ <p>
	Bob is sleeping soundly. The time is 2AM.</p>
<p>
	Suddenly, he is wide awake. His phone has alerted him of a critical situation! He has received an email from Nagios! What could it be? The servers are down? The routers are shot?</p>
<p>
	No.</p>
<p>
	As his rage mounts, he realizes that the cause of his untimely awakening is that some useless, crappy WAP somewhere in his office building stopped responding to pings. </p>
<p>
	Big whoop!</p>
<p>
	His phone then happily wakes him up every sixty minutes after this point, and, since it's Saturday, it keeps alerting him like so right up until Monday, when he finally goes to work and resets the damn WAP.</p>
<p>
	<em>* Note: The character described here may possibly represent myself. The time and incidents may </em><em>still </em><em>be very fresh in my mind. :sigh:</em></p>
<h2>
	Never again</h2>
<p>
	Sorry about that. My fingers sort of ran away, there.</p>
<p>
	Anyway.. Have you ever wanted to be able to acknowledge Nagios warnings by email? Me too.</p>
<p>
	I found one really good article on this, but I had a few troubles setting everything up, so I thought I'd share.</p>
<h2>
	Here's how</h2>
<p>
	Since we use Exchange on Server 2003 for our mail, a bit of hoop-jumping is necessary.</p>
<ul>
	<li>
		For this tutorial to work, Nagios will need to have its own mailbox and address, something like <em>nagios@domain.com</em>.</li>
</ul>
<p>
	First thing's first. Install Gnome-Shell. Don't worry, you won't have to use it for very long.</p>
<p>
	sudo apt-get install gnome-shell</p>
<ul>
	<li>
		Note that from now on, everything I do is as the user "root".</li>
</ul>
<p>
	Log-in to a Gnome-Shell session.</p>
<p>
	Download and install DavMail's latest deb package. As of today, it can be found <a href="http://sourceforge.net/projects/davmail/files/davmail/3.9.7/davmail_3.9.7-1870-1_all.deb/download">here</a>. </p>
<ul>
	<li>
		DavMail, in our case, serves as a gateway between Ubuntu and MS Exchange. We're going to use it to fetch email replies to acknowledgments.</li>
</ul>
<p>
	Open up DavMail (the GUI of which does not yet work in Unity..) and give it your OWA url. Don't forget the http<strong>s</strong>, if necessary. Also, note the IMAP port that's configured (usually 1143 on standard installations of DavMail).</p>
<p>
	Close the settings and logout of the Gnome-Shell session.</p>
<p>
	Open up a trusty Terminal and change the file <em>~/.davmail.properties</em> so that the line that reads:</p>
<p>
	<code>davmail.server=false</code></p>
<p>
	Becomes:</p>
<p>
	<code>davmail.server=true</code></p>
<p>
	Also, change all the <em>log4j </em>lines near the bottom to read <em>WARN</em>, not <em>DEBUG</em>.</p>
<p>
	Now, create an Upstart job for DavMail by touching /etc/init/davmail.conf, and adding the following contents:</p>
<p>
	<code># davmail - DavMail Gateway<br />
	#<br />
	# DavMail Exchange Gateway<br/>description     "DavMail Exchange Gateway"<br/>start on started network-manager<br />
	stop on stopped network-manager<br/>expect fork<br />
	respawn<br/>exec /usr/bin/nohup /usr/bin/davmail /root/.davmail.properties 2>/dev/null >/dev/null &</code></p>
<p>
	Reboot and make sure that the davmail daemon is running.</p>
<p>
	<code>ps aux | grep davmail</code></p>
<p>
	Now, install fetchmail. This fetches the mail from the Exchange server, with DavMail acting as the man-in-the-middle.</p>
<p>
	<code>apt-get install fetchmail</code></p>
<p>
	Let's configure it. Create <em>/root/.fetchmailrc</em> with the following contents (change the bold parts):</p>
<p>
	<code>set no bouncemail<br />
	defaults:<br />
	  antispam -1<br />
	  batchlimit 100<br />
	poll localhost with protocol imap and port 1143<br />
	user <strong>domain</strong>\\<strong>nagios</strong> password <strong>NagiosMailboxPassword</strong> is root<br />
	no rewrite<br />
	mda "/usr/bin/procmail -f %F -d %T";</code></p>
<p>
	Now, we install procmail. This program processes the mail so that replies containing the key word "ack" are downloaded locally and erased from Exchange.</p>
<p>
	<code>apt-get install procmail</code></p>
<p>
	And, we configure it too. Create <em>/root/.procmailrc</em> with the following contents:</p>
<p>
	<code>:0<br />
	* ^Subject.*ack<br />
	| expand | sed -e 's/[ ]*$//g' | sed -e 's/^/ /' > /usr/local/nagios/libexec/mail_acknowledgement</code></p>
<p>
	Now, let's tell fetchmail to give the mail it receives to procmail. Make a <em>/root/.forward</em> file. It should look like this:</p>
<p>
	<code>| "/usr/bin/procmail"</code></p>
<p>
	Test it out! Send an email with "ack" in the subject line to Nagios' email address, and run:</p>
<p>
	<code>fetchmail</code></p>
<p>
	You should see that you have received one new message. You may ignore any warnings, as long as the mail is downloaded properly. Was it?</p>
<p>
	<code>cat /usr/local/nagios/libexec/mail_acknowledgement</code></p>
<h3>
	Scripts are fun</h3>
<p>
	Now, we'll set up the automated execution of the email retrieval, parsing, and appropriate acknowledgment when necessary.</p>
<p>
	Create <em>/usr/local/nagios/libexec/mail_acknowledge</em> and dump this inside:</p>
<p>
	<code>#/usr/bin/perl<br/>open(FILE, "/usr/local/nagios/libexec/mail_acknowledgement") or die "Can't open acknowledgement file";<br />
	@subjectArray = <FILE>;<br />
	close(FILE);<br />
	$subject = @subjectArray[0];<br />
	$subject =~ s/ack//gi;<br/>open(FILE, "/usr/local/nagios/libexec/mail_acknowledged_by") or die "Can't open acknowledged_by file";<br />
	@originatorArray = <FILE>;<br />
	close(FILE);<br/>$originatorString = @originatorArray[0];<br />
	@originatorStringSplit = split("\"", $originatorString);<br/>$originatorName = @originatorStringSplit[1];<br/>$originatorEmail = @originatorStringSplit[2];<br />
	$originatorEmail =~ tr/<>//d;<br />
	chomp $originatorEmail;<br />
	$originatorEmail =~ s/^\s+//; # Remove leading...<br />
	$originatorEmail =~ s/\s+$//; # ...and trailing spaces<br/>$now = `/bin/date +%s`;<br />
	chomp $now;<br/>$commandfile = '/usr/local/nagios/var/rw/nagios.cmd';<br/>if ($subject =~ m/Service/i ){ # Does the subject contains "service"?<br />
	($service, $host) = split(" service on ", $subject);<br />
	    ($what, $service) = split("M: ", $service);<br />
	} else { # Well then, it must be a host problem...<br />
	@subjectSplit = split(":", $subject);<br />
	    $host =  @subjectSplit[-1];<br />
	}<br/>if ($host) {<br />
	chomp $host;<br />
	$host =~ s/^\s+//; # Remove leading...<br />
	$host =~ s/\s+$//; # ...and trailing spaces<br />
	}<br />
	if ($service) {<br />
	chomp $service;<br />
	$service =~ s/^\s+//; # Remove leading...<br />
	$service =~ s/\s+$//; # ...and trailing spaces<br />
	}<br/>
<br />
# This is where the acknowledgement happens<br />
	# You could get creative with this and pass all kinds of arguments via email<br />
	# A list of external commands is found here: http://www.nagios.org/development/apis/externalcommands/<br/>if ($service) {<br />
	$ack = "ACKNOWLEDGE_SVC_PROBLEM;$host;$service;1;1;1;$originatorName;Received from $originatorEmail";<br />
	} else {<br />
	$ack = "ACKNOWLEDGE_HOST_PROBLEM;$host;1;1;1;$originatorName;Received from $originatorEmail";<br />
	}<br/>open(LOGFILE, ">>/usr/local/nagios/libexec/mail_acknowledgement_log");<br/>$formatteddate = `/bin/date "+%F %T"`;<br />
	chomp $formatteddate;<br/>if ($host) { # Do we have something to acknowledge?<br />
	if ($subject =~ m/Problem/i ) { # Was the email really a reply to a problem?<br />
	  sub_print("$ack");<br />
	 <br />
	  if ($originatorName) {<br />
	   $originatorOut = "$originatorName ($originatorEmail)";<br />
	  } else {<br />
	   $originatorOut = "$originatorEmail";<br />
	  }<br />
	  if ($service) {<br />
	   print LOGFILE "$formatteddate - $originatorOut acknowledged problem with \"$service\" service on \"$host\".\n";<br />
	  } else {<br />
	   print LOGFILE "$formatteddate - $originatorOut acknowledged problem with \"$host\".\n";<br />
	  }<br />
	  # print LOGFILE "\nExiting.\n";<br />
	  exit 0;<br />
	} else { # Nice try, mister<br />
	  $nope = 1;<br />
	}<br />
	} else {<br />
	$nope = 1;<br />
	}<br/>if ($nope = 1) { # We've got nothing to do..<br />
	print "No Nagios acknowledgement requests pending. \nExiting.\n";<br />
	exit 0;<br />
	}<br/>sub sub_print {<br />
	$narf=shift;<br />
	open(F, ">$commandfile") or die "cant";<br />
	print F "[$now] $narf\n";<br />
	close F;<br />
	}</code></p>
<p>
	Make it executable.</p>
<p>
	<code>chmod a+x /usr/local/nagios/libexec/mail_acknowledge</code></p>
<p>
	Now, create <em>/usr/local/nagios/libexec/mail_acknowledgement_checker</em> with these contents:</p>
<p>
	<code>#!/bin/bash<br />
	/bin/cat /usr/local/nagios/libexec/mail_acknowledgement | /bin/grep Subject > /usr/local/nagios/libexec/mail_acknowledgement_temp<br />
	/bin/cat /usr/local/nagios/libexec/mail_acknowledgement | /bin/grep "From: " > /usr/local/nagios/libexec/mail_acknowledged_by<br />
	/bin/mv /usr/local/nagios/libexec/mail_acknowledgement_temp /usr/local/nagios/libexec/mail_acknowledgement<br />
	/bin/sed 's/Subject: //g' /usr/local/nagios/libexec/mail_acknowledgement > /usr/local/nagios/libexec/mail_acknowledgement_temp<br />
	/bin/mv /usr/local/nagios/libexec/mail_acknowledgement_temp /usr/local/nagios/libexec/mail_acknowledgement<br />
	/bin/sed 's/^[ \t]*//' /usr/local/nagios/libexec/mail_acknowledgement > /usr/local/nagios/libexec/mail_acknowledgement_temp<br />
	/bin/mv /usr/local/nagios/libexec/mail_acknowledgement_temp /usr/local/nagios/libexec/mail_acknowledgement<br />
	/bin/sed 's/ack //gI' /usr/local/nagios/libexec/mail_acknowledgement > /usr/local/nagios/libexec/mail_acknowledgement_temp<br />
	/bin/mv /usr/local/nagios/libexec/mail_acknowledgement_temp /usr/local/nagios/libexec/mail_acknowledgement<br />
	/bin/sed 's/^[ \t]*//' /usr/local/nagios/libexec/mail_acknowledgement > /usr/local/nagios/libexec/mail_acknowledgement_temp<br />
	/bin/mv /usr/local/nagios/libexec/mail_acknowledgement_temp /usr/local/nagios/libexec/mail_acknowledgement<br />
	/usr/bin/perl /usr/local/nagios/libexec/mail_acknowledge</code></p>
<p>
	Make it executable too.</p>
<p>
	<code>chmod a+x /usr/local/nagios/libexec/mail_acknowledgement_checker</code></p>
<p>
	Edit root's crontab.</p>
<p>
	<code>crontab -e</code></p>
<p>
	Add the following lines to the bottom of the crontab:</p>
<p>
	<code>*/2 * * * * /usr/bin/fetchmail -f /root/.fetchmailrc -L /usr/local/nagios/libexec/mail_acknowledgement_fetchmail; bash /usr/local/nagios/libexec/mail_acknowledgement_checker<br/>@monthly mv /usr/local/nagios/libexec/mail_acknowledgement_log /usr/local/nagios/libexec/mail_acknowledgement_log_last_month</code></p>
<p>
	This will check for email acknowledgments every two minutes, and start a new log each month.</p>
<h3>
	On the Nagios side..</h3>
<p>
	We also need to change the Nagios commands for sending email. The default ones won't do.</p>
<p>
	Open <em>/usr/local/nagios/etc/objects/commands.cfg</em> and change the <em>notify-host-by-email</em> and <em>notify-service-by-email</em> commands.</p>
<p>
	<code># 'notify-host-by-email' command definition<br />
	define command{<br />
	  command_line  echo "Notification Type: $NOTIFICATIONTYPE$\nAuthor: $NOTIFICATIONAUTHOR$\nComment: $NOTIFICATIONCOMMENT$\n\nHost: $HOSTALIAS$\nHostname: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\n\nDate/Time: $LONGDATETIME$\n\nInfo: $HOSTOUTPUT$\n" | sendemail -u "$NOTIFICATIONTYPE$: $HOSTNAME$" -f nagios@domain.com -t $CONTACTEMAIL$ -s mail.domain.com<br />
	  command_name notify-host-by-email<br />
	}<br/># 'notify-service-by-email' command definition<br />
	define command{<br />
	  command_name notify-service-by-email<br />
	  command_line  echo "Notification Type: $NOTIFICATIONTYPE$\nAuthor: $NOTIFICATIONAUTHOR$\nComment: $NOTIFICATIONCOMMENT$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\n\nInfo:\n$SERVICEOUTPUT$\n$LONGSERVICEOUTPUT$\n" | sendemail -u "$NOTIFICATIONTYPE$: $SERVICEDESC$ service on $HOSTNAME$" -f nagios@domain.com -t $CONTACTEMAIL$ -s mail.domain.com <br />
	}</code></p>
<p>
	Reload Nagios.</p>
<p>
	<code>service nagios reload</code></p>
<h2>
	Enjoy your sleep</h2>
<p>
	Now, if all went well, you should be able to simply reply to a warning the next time that Nagios is freaking out, and it should shut up immediately.</p>
<p>
	<strong>Isn't life great?</strong></p>
<h3>
	References</h3>
<p>
	During my research for this little project, I referred to countless pages. Here are the ones that helped me most. Sincere thanks goes to the authors.</p>
<ul>
	<li>
		<a href="http://www.techopsguys.com/2010/01/05/acknowledge-nagios-alerts-via-email-replies/">TechOps Guy</a></li>
	<li>
		<a href="http://fak3r.com/2011/07/07/howto-retrieve-email-with-fetchmail-and-forward-it-on-with-procmail/">fak3r</a></li>
	<li>
		<a href="http://www.togaware.com/linux/survivor/Fetchmail_Collect.html">Togaware</a></li>
	<li>
		<a href="http://serverfault.com/questions/26897/execute-command-for-select-emails-with-postfix">Server Fault</a></li>
	<li>
		<a href="http://lipas.uwasa.fi/~ts/info/proctips.html#reject">Timo Salmi</a></li>
	<li>
		<a href="http://davmail.sourceforge.net/linuxsetup.html">DavMail</a></li>
	<li>
		<a href="http://old.nagios.org/developerinfo/externalcommands/commandlist.php">Old Nagios documentation</a></li>
</ul>
 ]]></description>
			</item>
			<item>
				<title>Outlook: Warn Before Closing</title>
				<link>http://interwebplus.com/blog/post/outlook-warn-before-closing</link>
				<guid>http://interwebplus.com/blog/post/outlook-warn-before-closing</guid>
				<pubDate>Fri, 17 Feb 2012 13:56:27 -0500</pubDate>
				<description><![CDATA[ <p>
	A user came to me asking if there was a way to prevent Outlook 2003 from closing without warning if she clicks accidentally on the <em>Close </em>button. I've actually done this before, and I knew exactly where she was coming from.</p>
<p>
	Turns out there's no setting for this in Outlook. But I did find a <a href="http://www.windowsitpro.com/article/email/displaying-a-prompt-before-outlook-closes">workaround</a> thanks to my friend Google. It's not pretty, but it works.</p>
<h2>
	Here's how</h2>
<ul>
	<li>
		Open Outlook</li>
	<li>
		Create a new message and address it to yourself</li>
	<li>
		Give the message a nifty subject, like "Don't close!" or something along those lines</li>
	<li>
		Click on <em>Options</em></li>
	<li>
		Check the option to send the message only after a certain date and time (2014 seemed nice and faraway enough in this case)</li>
	<li>
		Click on <em>Close</em></li>
	<li>
		Click on <em>Send</em></li>
	<li>
		Click on your <em>Outbox</em></li>
	<li>
		Double-click on the message you just created</li>
	<li>
		Close it</li>
	<li>
		Try closing Outlook</li>
</ul>
<p>
	Admittedly ugly, but like I said... It works.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Storing Credentials for Use in Commands</title>
				<link>http://interwebplus.com/blog/post/nagios-storing-credentials-for-use-in-commands</link>
				<guid>http://interwebplus.com/blog/post/nagios-storing-credentials-for-use-in-commands</guid>
				<pubDate>Fri, 17 Feb 2012 09:39:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I don't know about you, but I tend to always read the documentation about <em>everything</em>. I like to be well informed of what my possibilities are, and how I can go about them.</p>
<p>
	I must've been slightly distracted when I installed Nagios. Or comatose. Anyway, for some reason, I failed to read much of the available documentation on installing and setting up Nagios. This resulted in way too much trial and error for my taste.</p>
<p>
	So, maybe all of you already knew about what I'm about to say. If so, well good for you! I know I would've like to know before.</p>
<h2>
	Commands Need Privileges, But...</h2>
<p>
	Sometimes, a command will require a username and password to run properly. For example, <em>check_esx </em>and <em>check_wmi_plus </em>both require administrative privileges on a domain level to function correctly.</p>
<p>
	So, what did my commands look like? Simple. </p>
<p>
	<code>command_line    $USER1$/check_esx.pl -D vcenter.domain.com -u "domain\admin" -p AmazingPassword -H $HOSTNAME$.domain.com -l cpu -s usage -w ~:$ARG1$ -c ~:$ARG2$</code></p>
<p>
	Nobody has access to the monitoring server. So even if the passwords are visible, it's not so bad. Right?</p>
<p>
	I tried this for fun:</p>
<p>
	<code>find -type f | xargs grep -iR "AmazingPassword"</code></p>
<p>
	Wow. My password was everywhere. And I mean <em>everywhere</em>. Archives, perfdata.. Nah. This didn't feel right.</p>
<h2>
	There's a Better Way</h2>
<p>
	And of course, it's <a href="http://nagios.sourceforge.net/docs/3_0/configmain.html">documented</a>.</p>
<p>
	The key is a nifty little file called <em>resource.cfg</em>. Open it up. It's generally located in <em>/usr/local/nagios/etc/</em>.</p>
<p>
	Here's what mine looks like now. It's self-explanatory, really.</p>
<p>
	<code>###########################################################################<br />
	#<br />
	# RESOURCE.CFG - Sample Resource File for Nagios 3.3.1<br />
	#<br />
	# Last Modified: 09-10-2003<br />
	#<br />
	# You can define $USERx$ macros in this file, which can in turn be used<br />
	# in command definitions in your host config file(s).  $USERx$ macros are<br />
	# useful for storing sensitive information such as usernames, passwords,<br />
	# etc.  They are also handy for specifying the path to plugins and<br />
	# event handlers - if you decide to move the plugins or event handlers to<br />
	# a different directory in the future, you can just update one or two<br />
	# $USERx$ macros, instead of modifying a lot of command definitions.<br />
	#<br />
	# The CGIs will not attempt to read the contents of resource files, so<br />
	# you can set restrictive permissions (600 or 660) on them.<br />
	#<br />
	# Nagios supports up to 32 $USERx$ macros ($USER1$ through $USER32$)<br />
	#<br />
	# Resource files may also be used to store configuration directives for<br />
	# external data sources like MySQL...<br />
	#<br />
	###########################################################################<br/># Sets $USER1$ to be the path to the plugins<br />
	$USER1$=/usr/local/nagios/libexec<br/># Sets $USER2$ to be the path to event handlers<br />
	#$USER2$=/usr/local/nagios/libexec/eventhandlers<br/># Store some usernames and passwords (hidden from the CGIs)<br />
	$USER3$=domain<br />
	$USER4$=admin<br />
	$USER5$=AmazingPassword</code></p>
<p>
	Now we're talkin'! All the commands that require credentials now look something like this:</p>
<p>
	<code>command_line    $USER1$/check_esx.pl -D vcenter.domain.com -u "$USER3$\$USER4$" -p $USER5$ -H $HOSTNAME$.domain.com -l cpu -s usage -w ~:$ARG1$ -c ~:$ARG2$</code></p>
<p>
	Much better!</p>
 ]]></description>
			</item>
			<item>
				<title>RSS Feed</title>
				<link>http://interwebplus.com/blog/post/rss-feed</link>
				<guid>http://interwebplus.com/blog/post/rss-feed</guid>
				<pubDate>Thu, 16 Feb 2012 10:04:00 -0500</pubDate>
				<description><![CDATA[ <p>
	Ok...</p>
<p>
	So apparently some people (<em>you know who you are :P</em>) like my blog enough to want an RSS feed..</p>
<p>
	Believe it or not, I hadn't really considered the possibility that other people besides myself would actually <strong>read </strong>my blog, much less enjoy doing so, so I'm still slightly in shock. But hey! A feed is actually a really good idea.</p>
<p>
	So, <a href="http://interwebplus.com/blog/index.php?id=rss">here you go</a>, people.</p>
<p>
	Enjoy!</p>
 ]]></description>
			</item>
			<item>
				<title>Apache: Setting the FQDN So That Apache Stops Grumbling</title>
				<link>http://interwebplus.com/blog/post/apache-setting-the-fqdn-so-that-apache-stops-grumbling</link>
				<guid>http://interwebplus.com/blog/post/apache-setting-the-fqdn-so-that-apache-stops-grumbling</guid>
				<pubDate>Tue, 07 Feb 2012 15:43:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I was getting <strong>really </strong>tired of seeing this message every single time that I reloaded or restarted Apache.</p>
<p>
	<code>apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName</code></p>
<p>
	It turns out the fix was simpler than I imagined.</p>
<p>
	Run this command:</p>
<p>
	<code>echo "ServerName localhost" | sudo tee -a /etc/apache2/httpd.conf > /dev/null</code></p>
<p>
	Restart Apache...</p>
<p>
	<code>sudo service apache2 restart</code></p>
<p>
	And you are now freed from this annoying warning.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Check WMI Plus on Ubuntu</title>
				<link>http://interwebplus.com/blog/post/nagios-check-wmi-plus-on-ubuntu</link>
				<guid>http://interwebplus.com/blog/post/nagios-check-wmi-plus-on-ubuntu</guid>
				<pubDate>Thu, 02 Feb 2012 14:12:00 -0500</pubDate>
				<description><![CDATA[ <p>
	I stumbled upon <a href="http://www.edcint.co.nz/checkwmiplus/">this great plugin</a> today, that logs into a Windows server through WMI. The beauty of this is that you don't have to install any client on the Windows side. This simplifies greatly the task of monitoring large networks laden with Windows machines.</p>
<p>
	A few obstacles need to be overcome to successfully use this plugin with Nagios on recent releases of Ubuntu, however.</p>
<h2>
	Here's how.</h2>
<p>
	First, download the <a href="http://www.edcint.co.nz/checkwmiplus/?q=downloads">latest version</a> and untar it. Copy both check_wmi_plus.pl and the check_wmi_plus.d folder to Nagios' libexec folder.</p>
<ul>
	<li>
		For me, this is /usr/local/nagios/libexec.</li>
	<li>
		I renamed the script to check_wmi_plus... I find it cleaner when Nagios plugins don't have file extensions.</li>
</ul>
<p>
	Make the script executable.</p>
<p>
	<code>sudo chmod a+x /usr/local/nagios/libexec/check_wmi_plus</code></p>
<h3>
	The WMI client</h3>
<p>
	Check WMI Plus depends on wmic, the Linux WMI client. Previously, one would simply install the wmi-client package from apt and be on their way. However, this package is now unavailable for newer releases due to licensing issues.</p>
<p>
	So we compile from source!</p>
<p>
	First, make sure you've got what it takes.</p>
<p>
	<code>sudo apt-get install build-essential</code></p>
<p>
	Now, download the latest version of wmi from <a href="http://dev.zenoss.org/svn/trunk/inst/externallibs/">here</a>. Untar the archive.</p>
<p>
	Open GNUmakefile, in the wmi-1.X.XX folder. We need to make a few mods so that everything compiles smoothly.</p>
<p>
	Delete or comment out (by adding a pound sign) the following lines (line numbers may vary slightly for you):</p>
<p>
	<code>ZENOSS_BINDIR     = $(ZENHOME)/bin <em># Line <strong>20</strong></em><br />
	ZENPYTHON         = $(ZENOSS_BINDIR)/python <em># Line <strong>21</strong></em><br />
	USE_BREAKPAD = 1 <em># Line <strong>73</strong></em><br />
	$(call check,directory,$(ZENHOME),"ZENHOME") <em># Line <strong>111</strong></em><br />
	$(call check,directory,$(ZENHOME),"ZENHOME") <em># Line <strong>130</strong></em></code></p>
<p>
	And change line <strong>22</strong> (where the PYTHON variable is declared) to this:</p>
<p>
	<code>PYTHON           ?= /usr/bin/python</code></p>
<p>
	If necessary, substitute the path above for the path to python on your system.</p>
<p>
	<code>which python</code></p>
<p>
	Save and close GNUmakefile.</p>
<p>
	Enter the WMI directory, if you aren't already there.</p>
<p>
	<code>cd wmi-1.X.XX</code></p>
<p>
	And compile WMI.</p>
<p>
	<code>make</code></p>
<p>
	Copy the WMI client binary to your bin folder.</p>
<p>
	<code>sudo cp Samba/source/bin/wmic /usr/bin</code></p>
<p>
	Now try running wmic.</p>
<p>
	<code>$ wmic<br />
	Usage: [-?|--help] [--usage] [-d|--debuglevel DEBUGLEVEL] [--debug-stderr]<br />
	        [-s|--configfile CONFIGFILE] [--option=name=value]<br />
	        [-l|--log-basename LOGFILEBASE] [--leak-report] [--leak-report-full]<br />
	        [-R|--name-resolve NAME-RESOLVE-ORDER]<br />
	        [-O|--socket-options SOCKETOPTIONS] [-n|--netbiosname NETBIOSNAME]<br />
	        [-W|--workgroup WORKGROUP] [--realm=REALM] [-i|--scope SCOPE]<br />
	        [-m|--maxprotocol MAXPROTOCOL] [-U|--user [DOMAIN\]USERNAME[%PASSWORD]]<br />
	        [-N|--no-pass] [--password=STRING] [-A|--authentication-file FILE]<br />
	        [-S|--signing on|off|required] [-P|--machine-pass]<br />
	        [--simple-bind-dn=STRING] [-k|--kerberos STRING]<br />
	        [--use-security-mechanisms=STRING] [-V|--version] [--namespace=STRING]<br />
	        [--delimiter=STRING]<br />
	        //host query<br/><br/>Example: wmic -U [domain/]adminuser%password //host "select * from Win32_ComputerSystem"<br />
	 </code></p>
<p>
	Congrats! The WMI client is now installed on your system. You may delete the WMI source directory, now.</p>
<p>
	<code>cd ../<br />
	rm -r wmi-1*</code></p>
<h3>
	Perl Modules</h3>
<p>
	Certain Perl modules are also required for the plugin to work as intended.</p>
<p>
	<code>sudo cpan install Data::Dumper Getopt::Long DateTime Scalar::Util Storable</code></p>
<h3>
	Plugin Configuration</h3>
<p>
	Finally, we need to configure the plugin so that it knows where certain files are located.</p>
<p>
	Open the check_wmi_plus script and change these lines with the appropriate paths (line numbers may vary slightly for you):</p>
<p>
	<code>my $conf_file='/usr/local/nagios/libexec/check_wmi_plus.d/check_wmi_plus.conf';<em> # Line <strong>30</strong></em><br />
	use lib "/usr/local/nagios/libexec"; <em># Line <strong>45</strong></em><br />
	our $base_dir='/usr/local/nagios/libexec/check_wmi_plus.d';<em> # Line <strong>116</strong></em></code></p>
<p>
	And open the check_wmi_plus.conf file, located in the check_wmi_plus.d folder, and change these lines with the appropriate paths (line numbers may, again, vary slightly for you):</p>
<p>
	<code>use lib "/usr/local/nagios/libexec"; #  Line <strong>15</strong><br />
	$wmic_command="/usr/bin/wmic"; #  Line <strong>24</strong><br />
	$wmi_ini_file="$base_dir/check_wmi_plus.ini"; #  Line <strong>31</strong><br />
	$wmi_ini_dir="$base_dir"; # Line <strong>37</strong></code></p>
<p>
	Save and close the file.</p>
<h2>
	Try it out</h2>
<p>
	By now, you should have a working check_wmi_plus script residing in Nagios' libexec folder.</p>
<p>
	Here are just two example commands you can try. This checks CPU usage:</p>
<p>
	<code>/usr/local/nagios/libexec/check_wmi_plus -H windowsserver -u domain/user -p userpassword -m checkcpu<br/><br/>OK (Sample Period 7 sec) - Average CPU Utilisation 2.82%|'Avg CPU Utilisation'=2.82%;</code></p>
<p>
	And this checks the CPU usage of a particular process:</p>
<p>
	<code>/usr/local/nagios/libexec/check_wmi_plus -H terminalserver -u domain/user -p userpassword -m checkproc -s cpu  -a msaccess<br/><br/>OK (Sample Period 602 sec) - Found 7 Instance(s) of "msaccess" running. CPU_MSACCESS(PID=7996)=0.0%   CPU_MSACCESS(PID=14124)=0.0%   CPU_MSACCESS(PID=9704)=0.0%   CPU_MSACCESS(PID=15020)=0.0%   CPU_MSACCESS(PID=10856)=0.0%   CPU_MSACCESS(PID=10036)=0.0%   CPU_MSACCESS(PID=12996)=0.0%   |'Process Count'=7; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%; 'Avg Utilisation CPU_MSACCESS'=0.0%;</code></p>
<p>
	Now, all that's left for you to do is to read all the <a href="http://www.edcint.co.nz/checkwmiplus/">documentation</a> on this plugin and discover all its options and possibilities and how awesome it really is.</p>
<p>
	Alot of help is actually bundled with the plugin..</p>
<p>
	<code>/usr/local/nagios/libexec/check_wmi_plus --help | less</code></p>
<p>
	Enjoy!</p>
 ]]></description>
			</item>
			<item>
				<title>The Undeleteable Shadow Copy</title>
				<link>http://interwebplus.com/blog/post/the-undeleteable-shadow-copy</link>
				<guid>http://interwebplus.com/blog/post/the-undeleteable-shadow-copy</guid>
				<pubDate>Thu, 02 Feb 2012 10:00:00 -0500</pubDate>
				<description><![CDATA[ <p>
	Something strange just happened.</p>
<p>
	A backup drive on one of our Server 2003 machines had Shadow Copy enabled, for some odd reason. So, I said "I'll disable it by clicking on the Disable button". It's so simple!</p>
<p>
	Wrong. </p>
<p>
	I got a lovely "Error 0x8004231d" message, complaining about how the specified Shadow Copy storage association was in use and coouldn't be deleted.</p>
<p>
	We'll see about that.</p>
<ul>
	<li>
		Open Settings</li>
	<li>
		Set "Use limit" to 300</li>
	<li>
		Click OK</li>
	<li>
		Click Disable</li>
	<li>
		Click Yes</li>
	<li>
		Enjoy the sound of angels singing</li>
</ul>
 ]]></description>
			</item>
			<item>
				<title>When Shadow Copies Don\&#039;t Work..</title>
				<link>http://interwebplus.com/blog/post/when-shadow-copies-dont-work</link>
				<guid>http://interwebplus.com/blog/post/when-shadow-copies-dont-work</guid>
				<pubDate>Thu, 02 Feb 2012 09:03:00 -0500</pubDate>
				<description><![CDATA[ <p>
	On a fully updated Windows Server 2003 machine, Shadow Copies all of a sudden stopped working for some reason.</p>
<p>
	It turns out the solution was really simple, and I thought I'd share. The problem was being caused by a corruption in the Shadow Copy's Scheduled Task.</p>
<h3>
	To fix:</h3>
<ul>
	<li>
		Disable Shadow Copies for the drive</li>
	<li>
		Delete all Scheduled Tasks that start with "ShadowCopyVolume"</li>
	<li>
		Enable Shadow Copies</li>
	<li>
		Change schedule to suit your needs</li>
</ul>
<p>
	Shadow Copies should now be alive and kicking.</p>
<p>
	I hope this can help someone in need.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Implementing Auto-Complete for the Search Box</title>
				<link>http://interwebplus.com/blog/post/nagios-implementing-auto-complete-for-the-search-box</link>
				<guid>http://interwebplus.com/blog/post/nagios-implementing-auto-complete-for-the-search-box</guid>
				<pubDate>Thu, 02 Feb 2012 08:46:00 -0500</pubDate>
				<description><![CDATA[ <p>
	Ever start typing a host name in the search box, and then just forget the exact name? Or even worse, remeber just a part of the name, but not the first part?</p>
<p>
	It's moments like these that make one wonder why exactly the Nagios search box present, in its crippled state. Well, fret no more. We'll fix that sucker and make him so useful, you'll never want to scroll through your host list again.</p>
<h2>
	Requirements</h2>
<ul>
	<li>
		Nagios 3.x</li>
	<li>
		The Vautour style</li>
	<li>
		<a href="http://interwebplus.com/blog/data/uploads/jquery.zip">jquery.zip</a></li>
</ul>
<p>
	Note that I'm assuming that your Nagios base directory is "/usr/local/nagios".</p>
<p>
	The jquery.zip file contains a version of jQuery and jQueryUI that I modified to make them work with the (slightly rigid) Nagios iframe setup.</p>
<p>
	If however you're using V-Shell, you can grab jQuery and jQueryUI straight from their respective web sites. The stock versions work just fine with V-Shell's PHP interface.</p>
<p>
	By the way, kudos to the jQuery team and also to the guys at jQuery UI! Without them, this mod wouldn't be here. (:</p>
<h2>
	Installation</h2>
<p>
	Extract "jquery.zip" in the "share/js" folder.<br />
	You should now have "jquery.js", "jquery-ui.js", and a "jquery-ui" folder in the "share/js" folder.</p>
<p>
	Make sure that all files in there are readable by everyone.</p>
<p>
	<code>sudo chmod -R a+r /usr/local/nagios/share/js/*</code></p>
<p>
	Now, open share/sidebar.html and replace lines 10 and 11 (the two script references) with this:</p>
<p>
	<code><script type="text/javascript" src="js/jquery.js"></script><br />
	<script type="text/javascript" src="js/jquery-ui.js"></script><br />
	<link rel="stylesheet" type="text/css" href="js/jquery-ui/jquery-ui.css" media="screen, projection" /></code></p>
<p>
	Replace lines 15 through 21 (the "search_box" div) with these lines:</p>
<p>
	<code><div id="search_box"><br />
	          <form action="/nagios/cgi-bin/status.cgi" id="search_form" method="get" target="main"><br />
	                    <input id="search" name="host" type="text" /><br />
	                    <input type="hidden" name="navbarsearch" value="1" /><br />
	                    <input src="images/interface/search.gif" alt="OK" title="Search" id="search_submit" type="image" /><br />
	          </form><br />
	</div><br />
	<script type="text/javascript"><br />
	          $(document).ready(function() {<br />
	                    jQuery.get('hosts.txt', function(data) {<br />
	                              hosts = data.split('\n');<br />
	                              $( "#search" ).autocomplete({<br />
	                                        source: hosts<br />
	                              })<br />
	                    });<br />
	          });<br />
	</script></code></p>
<p>
	Save and close sidebar.html.</p>
<p>
	Now, we'll set-up the creation of a file named "hosts.txt".</p>
<p>
	This file will contain a list of all your hosts, that will automatically get updated every hour by cron.<br />
	We use this list for our autocomplete entries.</p>
<p>
	Edit your crontab by running:</p>
<p>
	<code>crontab -e</code></p>
<p>
	If applicable, select your editor of choice. I use nano.</p>
<p>
	Now, add this to the bottom of the cron file (copy/paste is your friend!):</p>
<p>
	<code>@hourly /bin/cat /usr/local/nagios/var/objects.cache | /bin/grep "host_name" | /bin/sed 's/\s*host_name\s*//g' | /usr/bin/sort | /usr/bin/uniq > /usr/local/nagios/share/hosts.txt</code></p>
<p>
	And finally, you should run the following command, to create hosts.txt immediately, without waiting for cron to kick in.</p>
<p>
	<code>/bin/cat /usr/local/nagios/var/objects.cache | /bin/grep "host_name" | /bin/sed 's/\s*host_name\s*//g' | /usr/bin/sort | /usr/bin/uniq > /usr/local/nagios/share/hosts.txt</code></p>
<p>
	You can, if you want, check out /usr/local/nagios/share/hosts.txt, to verify that the list was created successfully.</p>
<p>
	<code>cat /usr/local/nagios/share/hosts.txt</code></p>
<p>
	This should display a list of your hosts on the screen.</p>
<h2>
	Try it out</h2>
<p>
	You should now have a working autocomplete search box!</p>
<p>
	So, open up your Nagios web page and experience the rebirth of the search box.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Integrated Windows Authentification with Kerberos</title>
				<link>http://interwebplus.com/blog/post/nagios-integrated-windows-authentification-with-kerberos</link>
				<guid>http://interwebplus.com/blog/post/nagios-integrated-windows-authentification-with-kerberos</guid>
				<pubDate>Wed, 01 Feb 2012 14:08:00 -0500</pubDate>
				<description><![CDATA[ <p>
	That damn login screen was really getting to me. Forget the fact that I clicked on "Remember password". I just didn't want to see it, period!</p>
<p>
	My colleague showed me a project he was working on, with Sharepoint. When you go on the project's web page, the login happens automatically. It's seamless! Using Windows credentials, the site decides what the user is and isn't allowed to see, based on his/her Active Directory groups and OUs. This really fascinated me. </p>
<p>
	Why the heck couldn't it be the same for Nagios? </p>
<p>
	Well guess what. It can.</p>
<p>
	And here's how!</p>
<h2>
	Installation</h2>
<p>
	Ok, this here is happening on a fully updated Ubuntu 11.10 virtual machine, complete with Nagios Core 3.3.1, V-Shell, PNP4Nagios, the whole shebang.</p>
<p>
	First off, we need a few packages.</p>
<p>
	<code>sudo apt-get install apache2-mpm-prefork libapache2-mod-auth-kerb libapache-mod-auth-kerb krb5-config krb5-clients krb5-user samba-client</code></p>
<p>
	Now, we configure!</p>
<p>
	Open up (or create) /etc/krb5.conf and modify it according to your environment. (Modify the bold parts.)</p>
<p>
	<code>[libdefaults]<br />
	dns_lookup_realm = true<br />
	dns_lookup_kdc = true<br />
	udp_preference_limit = 1<br />
	default_realm = <strong>YOURDOMAIN.COM</strong><br />
	default_keytab_name = FILE:/etc/krb5.keytab<br />
	ccache_type = 3<br />
	kdc_timesync = 0 [realms]<br />
	<strong>YOURDOMAIN.COM</strong> = {<br />
	kdc = <strong>maindc</strong>.<strong>yourdomain.com</strong>:88<br />
	master_kdc = <strong>maindc</strong>.<strong>yourdomain.com</strong>:88<br />
	kpasswd =<strong>maindc</strong>.<strong>yourdomain.com</strong>:464<br />
	kpasswd_server = <strong>maindc</strong>.<strong>yourdomain.com</strong>:464<br />
	}<br />
	[domain_realm]<br />
	<strong>yourdomain.com</strong> = <strong>YOURDOMAIN.COM</strong><br />
	<strong>YOURDOMAIN </strong>= <strong>YOURDOMAIN.COM</strong><br />
	.<strong>yourdomain.com</strong> = <strong>YOURDOMAIN.COM</strong><br />
	<strong>maindc.yourdoamin.com = YOURDOMAIN.COM</strong><br />
	<strong>apacheserver.yourdomain.com = YOURDOMAIN.COM</strong></code></p>
<p>
	Now, test it.</p>
<p>
	<code>kinit <strong>Domain-User</strong></code></p>
<p>
	If this works, then Ubuntu is communicating via Kerberos with your domain controller. So far, so good!</p>
<p>
	Now, open up /etc/samba/smb.conf and add (or modify) the following directives, under the [Global] section:</p>
<p>
	<code>workgroup = <strong>YOURDOMAIN</strong><br />
	dedicated keytab file = /etc/krb5.keytab<br />
	kerberos method = dedicated keytab<br />
	security = ADS<br />
	password server = *<br />
	realm = <strong>YOURDOMAIN.COM</strong><br />
	winbind offline logon = true<br />
	winbind refresh tickets = true<br />
	winbind use default domain = no<br />
	preferred master = no<br />
	domain master = No</code></p>
<p>
	Now, it's time to join the domain!</p>
<p>
	<code>net ads join -U <strong>Domain-Administrator</strong></code></p>
<p>
	And, give the Apache daemon the right to read our Kerberos authentification file:</p>
<p>
	<code>sudo chmod 740 /etc/krb5.keytab<br />
	sudo chown www-data:www-data /etc/krb5.keytab</code></p>
<p>
	Activate the Kerberos authentification module in Apache by adding the following line to the bottom of /etc/apache2/apache2.conf:</p>
<p>
	<code>LoadModule auth_kerb_module modules/mod_auth_kerb.so</code></p>
<h2>
	Configure Nagios for Kerberos authentification</h2>
<p>
	To do so, open up the Nagios Apache config file, located for me in /etc/apache2/conf.d/nagios.conf.</p>
<p>
	Edit it to use the new Kerberos authentification, instead of the old htpasswd.users file.</p>
<p>
	It should look something like this:</p>
<p>
	<code>ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"<br />
	<Directory "/usr/local/nagios/sbin"><br />
	   Options ExecCGI<br />
	   AllowOverride None<br />
	   Order allow,deny<br />
	   Allow from all<br />
	   AuthName "Nagios Secured Access"<br />
	   AuthType Kerberos<br />
	   Krb5Keytab /etc/krb5.keytab<br />
	   KrbAuthRealms <strong>YOURDOMAIN.COM</strong><br />
	   KrbMethodNegotiate on<br />
	   KrbMethodK5Passwd On<br />
	   KrbServiceName HTTP<br />
	   require user <strong>adminaccount</strong>@<strong>YOURDOMAIN.COM</strong><br />
	   require user <strong>youraccount</strong>@<strong>YOURDOMAIN.COM</strong><br />
	   require user <strong>otheradmin</strong>@<strong>YOURDOMAIN.COM</strong><br />
	</Directory><br />
	Alias /nagios "/usr/local/nagios/share"<br />
	<Directory "/usr/local/nagios/share"><br />
	   Options None<br />
	   AllowOverride None<br />
	   Order allow,deny<br />
	   Allow from all<br />
	   AuthName "Nagios Secured Access"<br />
	   AuthType Kerberos<br />
	   Krb5Keytab /etc/krb5.keytab<br />
	   KrbAuthRealms <strong>YOURDOMAIN.COM</strong><br />
	   KrbMethodNegotiate on<br />
	   KrbMethodK5Passwd On<br />
	   KrbServiceName HTTP<br />
	   require user <strong>adminaccount</strong>@<strong>YOURDOMAIN.COM</strong><br />
	   require user <strong>youraccount</strong>@<strong>YOURDOMAIN.COM</strong><br />
	   require user <strong>otheradmin</strong>@<strong>YOURDOMAIN.COM</strong><br />
	</Directory></code></p>
<p>
	The three "require user" lines (well, actually, six..) are the lines that determine which users are allowed to access the Nagios interface. Modify these to suit your needs.</p>
<p>
	I didn't want to have to configure all the Apache conf files for each Nagios plugin I had (PNP4Nagios, Nagvis, and the like all use their seperate Apache config files, in the <em>conf.d</em> folder..). If your setup is like mine, the Ubuntu machine's sole reason for being is monitoring and the like. So I didn't see any reason why the authentification couldn't be on a Apache-wide basis.</p>
<p>
	So instead of modifying nagios.conf, I went ahead and changed /etc/apache2/sites-enabled/000-default. This is the global configuration file in which directives are specified for the whole web server. So here's what my <em>DocumentRoot </em>section looks like (irrelevant parts edited out):</p>
<p>
	<code><VirtualHost *:80><br />
	        DocumentRoot /usr/local/nagios/share/vshell<br />
	        <Directory /><br />
	                Options FollowSymLinks<br />
	                AllowOverride None<br />
	                AuthType Kerberos<br />
	                AuthName "Nagios Authentification"<br />
	                KrbMethodNegotiate On<br />
	                KrbMethodK5Passwd On<br />
	                KrbAuthRealms MYDOMAIN.COM<br />
	                Krb5KeyTab /etc/krb5.keytab<br />
	                require user me@MYDOMAIN.COM<br />
	                require user other-it-guy@MYDOMAIN.COM<br />
	                require user third-it-guy@MYDOMAIN.COM<br />
	                require user admin-account@MYDOMAIN.COM<br />
	        </Directory><br />
	</VirtualHost></code></p>
<h2>
	End result</h2>
<p>
	Now, restart the Apache daemon..</p>
<p>
	<code>sudo service apache2 reload ; sudo service apache2 restart</code></p>
<p>
	Close all open browsers, and try opening up Nagios' home page.</p>
<p>
	If all goes well, you should be greeted with a cheerful line in the Tactical Monitoring Overview section that goes a little something like this:</p>
<p>
	<em>Logged in as </em><em>youraccount@YOURDOMAIN.COM</em></p>
<p>
	As always, feedback is always welcome.. Share your experiences!</p>
<h3>
	Thanks</h3>
<p>
	Huge thanks goes to Michele Baldessari, Tevfik Karagülle, and Scott Lowe for their awesome blog posts on this. Without those I'd still be banging my head against the wall.</p>
 ]]></description>
			</item>
			<item>
				<title>Nagios: Using V-Shell with Vautour</title>
				<link>http://interwebplus.com/blog/post/nagios-using-v-shell-with-vautour</link>
				<guid>http://interwebplus.com/blog/post/nagios-using-v-shell-with-vautour</guid>
				<pubDate>Tue, 31 Jan 2012 10:01:00 -0500</pubDate>
				<description><![CDATA[ <p>
	While playing around with Nagios, it suddenly dawned on me: the CGI-based interface can be <strong>maddening </strong>sometimes.</p>
<p>
	To remedy this, I set myself on the task of finding an alternate GUI to Nagios that was easy to set up, and easy to configure. My sights finally fell upon V-Shell, a PHP frontend to Nagios.</p>
<p>
	The setup was a breeze. However, since I made heavy use of the Vautour style in my previous config, V-Shell's, shall we say, <em>different </em>interface was a shock. </p>
<p>
	So I tried to integrate Vautour and V-Shell into one nice little harmonious package.</p>
<p>
	It's not yet finished, but it's getting there. </p>
<p>
	Try it out and see what you think.</p>

<h1>
	Setup</h1>
<p>
	Install the Nagios <a href="http://assets.nagios.com/downloads/exchange/nagiosvshell/vshell.tar.gz">V-Shell</a> frontend to Nagios, according to the instructons.</p>
<p>
	Once that is done, to get the same look and feel as the <a href="http://exchange.nagios.org/directory/Addons/Frontends-(GUIs-and-CLIs)/Web-Interfaces/Themes-and-Skins/Vautour-Style/details">Vautour</a> style, you need to change a couple of files.</p>

<p>
	Replace vshell/css/style.css with <a href="http://interwebplus.com/blog/data/uploads/style.css">this file</a>.</p>

<p>
	In vshell/js/header.inc.js, change the line that reads:</p>
<p>
	<code>$(divID).slideToggle("fast");</code></p>
<p>
	To:</p>
<p>
	<code>$(divID).slideToggle(400, 'easeInQuad');</code></p>
<p>
	In the vshell/views folder, replace the following files...</p>
<ul>
	<li>
		display_functions.php</li>
	<li>
		header.php</li>
	<li>
		tac.php</li>
</ul>
<p>
	... with the ones found in <a href="http://interwebplus.com/blog/data/uploads/views.zip">this zip file</a>.</p>
<p>
	On line 58 of vshell/views/footer.php, add:</p>
<p>
	<code><div style="clear:both"></div></code></p>
<p>
	And finally, extract <a href="http://interwebplus.com/blog/data/uploads/js.zip">this file</a> inside the vshell/js folder.</p>
<h3>
	Voilà</h3>
<p>
	You should now have a custom, Vautour-ized, V-Shell-powered Nagios installation, ready to monitor anything you want.</p>
<p>
	It should now be accessible at http://nagiosserver/vshell, or http://nagiosserver/nagios/vshell, depending on how you set up apache.</p>
<p>
	<strong>Edit: </strong>Screenshots are available <a href="http://interwebplus.com/blog/data/uploads/images/vautour-v-shell-1.png" onclick="window.open(this.href, '', 'resizable=no,status=no,location=no,toolbar=no,menubar=no,fullscreen=no,scrollbars=no,dependent=no'); return false;">here</a>, and <a href="http://interwebplus.com/blog/data/uploads/images/vautour-v-shell-2.png" onclick="window.open(this.href, '', 'resizable=no,status=no,location=no,toolbar=no,menubar=no,fullscreen=no,scrollbars=no,dependent=no'); return false;">here</a>.</p>
<p>
	Drop me a line if you have comments or suggestions!</p>

<p>
	Next up: a guide on integrating Nagios in a Windows Server 2003 Active Directory environment, complete with Single Sign-On (SSO) <strong>and </strong>Integrated Windows Authentification (IWA)!</p>
 ]]></description>
			</item>
	</channel>
</rss>
