<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>David Warburton &#187; Powershell</title>
	<atom:link href="http://blog.davidwarburton.net/category/scripting/powershell-scripting/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.davidwarburton.net</link>
	<description>Musings of a VM and storage engineer with a subtle addiction to scripting</description>
	<lastBuildDate>Sun, 13 May 2012 17:04:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.davidwarburton.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>David Warburton &#187; Powershell</title>
		<link>http://blog.davidwarburton.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.davidwarburton.net/osd.xml" title="David Warburton" />
	<atom:link rel='hub' href='http://blog.davidwarburton.net/?pushpress=hub'/>
		<item>
		<title>Change disk persistence mode on the fly in vSphere using PowerCLI</title>
		<link>http://blog.davidwarburton.net/2010/11/04/change-disk-persistence-mode-on-the-fly-in-vsphere-using-powercli/</link>
		<comments>http://blog.davidwarburton.net/2010/11/04/change-disk-persistence-mode-on-the-fly-in-vsphere-using-powercli/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 00:55:53 +0000</pubDate>
		<dc:creator>DavidWarburton</dc:creator>
				<category><![CDATA[ESXi]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://blog.davidwarburton.net/?p=170</guid>
		<description><![CDATA[I&#8217;ve been plagued, for some time, by a really annoying problem in my home lab. Being as I run everything from the one VM host (ESXi) it is also home to my Windows 2008 domain controller. Recently I had installed Veeam Backup and Replication to finally start backing up my VM&#8217;s (even though it&#8217;s my [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=170&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been plagued, for some time, by a really annoying problem in my home lab. Being as I run everything from the one VM host (ESXi) it is also home to my Windows 2008 domain controller.</p>
<p>Recently I had installed Veeam Backup and Replication to finally start backing up my VM&#8217;s (even though it&#8217;s my home/test environment I would be a broken man if I lost everything on there!). I installed Veeam on to the Windows 2008 DC &#8211; against all common sense of course, but RAM is low in my ML110 and I couldn&#8217;t afford to create another Windows VM.</p>
<p>I had configured Veeam to backup my guest&#8217;s using the vStorage API &#8211; Virtual Appliance mode. Backups of my other Windows guests ran well but I noticed some problems with the DC VM backup after a short while. It was around this time that I also noticed that the hard disks of this guest OS had automatically changed to Independant Nonpersistent! This would have been bad enough for any machine (as soon as the guest powers down you loose all changes), but for a DC &#8211; as you can imagine &#8211; it&#8217;s a nightmare!</p>
<p><a href="http://dl.dropbox.com/u/2873480/blog/veeam_disks/veeam.png"><img class="aligncenter" title="Veeam Backup" src="http://dl.dropbox.com/u/2873480/blog/veeam_disks/veeam%20%28Custom%29.png" alt="" width="200" height="115" /></a></p>
<p>This post on Experts Exchange confirmed &#8211; to some extent &#8211; that Veeam was the culprit and there wasn&#8217;t some other weird force at work: http://www.experts-exchange.com/Software/VMWare/Q_26310902.html</p>
<p>I disabled the DC backup via Veeam but the problem remained that my VM&#8217;s disks were Independant. The vSphere Infrastructure Client does not allow you to change disk modes on the fly so I was stuck &#8211; as soon as I shut my VM down to change the disk type I would loose all changes:</p>
<p><a href="http://dl.dropbox.com/u/2873480/blog/veeam_disks/vic.png"><img class="aligncenter" title="VIC" src="http://dl.dropbox.com/u/2873480/blog/veeam_disks/vic%20%28Custom%29.png" alt="" width="200" height="85" /></a></p>
<p>Thankfully, <a title="PowerCLI" href="http://www.vmware.com/support/developer/PowerCLI/PowerCLI41/html/Set-HardDisk.html" target="_blank">PowerCLI </a>came to my rescue!</p>
<p>After connecting to my ESXi host using</p>
<pre>connect-viserver &lt;esxi_ipaddress&gt;</pre>
<p>All that was needed was a simple command:</p>
<pre>Get-HardDisk -VM <em>&lt;vm_name&gt;</em> | Set-HardDisk -Persistence "Persistent"</pre>
<p>Success!! At least partially. My primary (system) disk had successfully reverted to a persistent disk. However, my second disk had not and PowerCLI had actually errored :</p>
<pre>CapacityKB Persistence                                                    Filename
---------- -----------                                                    --------
68157440   Persistent                       [localdisk01] vm_guest/disk1.vmdk
Set-HardDisk : 04/11/2010 00:49:44    Set-HardDisk        Another task is already in progress.
At line:1 char:42</pre>
<p>I haven&#8217;t yet figured out what task it is that is supposedly in progress, but I certainly can&#8217;t find one. It may be worth noting that my primary disk is on local SATA while the second disk is on an NFS share.</p>
<p>Now, at least, when I run Get-HardDisk, it shows that my system drive is Persistent:</p>
<p><a href="http://dl.dropbox.com/u/2873480/blog/veeam_disks/powercli.png"><img class="aligncenter" title="PowerCLI" src="http://dl.dropbox.com/u/2873480/blog/veeam_disks/powercli%20%28Custom%29.png" alt="" width="200" height="25" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidwarburton.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidwarburton.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidwarburton.wordpress.com/170/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=170&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.davidwarburton.net/2010/11/04/change-disk-persistence-mode-on-the-fly-in-vsphere-using-powercli/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a54ad2551bd756d17e5f75aab3c2acd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">DavidWarburton</media:title>
		</media:content>

		<media:content url="http://dl.dropbox.com/u/2873480/blog/veeam_disks/veeam%20%28Custom%29.png" medium="image">
			<media:title type="html">Veeam Backup</media:title>
		</media:content>

		<media:content url="http://dl.dropbox.com/u/2873480/blog/veeam_disks/vic%20%28Custom%29.png" medium="image">
			<media:title type="html">VIC</media:title>
		</media:content>

		<media:content url="http://dl.dropbox.com/u/2873480/blog/veeam_disks/powercli%20%28Custom%29.png" medium="image">
			<media:title type="html">PowerCLI</media:title>
		</media:content>
	</item>
		<item>
		<title>Netbackup script to report scratch tapes</title>
		<link>http://blog.davidwarburton.net/2010/05/04/netbackup-script-to-report-scratch-tapes/</link>
		<comments>http://blog.davidwarburton.net/2010/05/04/netbackup-script-to-report-scratch-tapes/#comments</comments>
		<pubDate>Tue, 04 May 2010 12:35:29 +0000</pubDate>
		<dc:creator>DavidWarburton</dc:creator>
				<category><![CDATA[Netbackup]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://blog.davidwarburton.net/?p=98</guid>
		<description><![CDATA[I&#8217;ve seen Netbackup used in two completely different ways now. In my last environment all tapes rotas, movements and scratch tapes were handled manually. We had a spreadsheet showing tape sets (see below for an example), when these tapes were collected by Iron Mountain, which days of the months we defined as Monthly/Quarterly backups and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=98&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen Netbackup used in two completely different ways now. In my last environment all tapes rotas, movements and scratch tapes were handled manually. We had a spreadsheet showing tape sets (see below for an example), when these tapes were collected by Iron Mountain, which days of the months we defined as Monthly/Quarterly backups and so on. In this scenario each set of tapes is a number of tapes &#8211; on some days you may use less, on some days you may not have enough loaded.</p>
<p>In the new environment we let Netbackup dictate which tapes are in the scratch pool and free for re-use based on the expiration policy of the jobs written to those tapes. In theory this should mean that you only ever use as many tapes as you need for a given backup job. The problem with this set-up is that although it is, in theory, more efficient, you don&#8217;t always know which tapes you will need each night and how many you have free.</p>
<p>Each day guys were running NBU command lines to show which tapes were in the scratch pool, but having to manually sift through them to see which tapes were currently sat in drives/libraries and of the ones held off-site, which tapes were of which format (LTO2, 3 or 4).</p>
<p>The following script can be scheduled to email out a list of tapes in the scratch pool, which are in what library and also groups the offsite tapes by format. It was knocked up in a hurry so isn&#8217;t as parameterised or dynamic as it should be, but the comments should help you fix it for your needs&#8230;</p>
<p><span id="more-98"></span>Here&#8217;s the script and HTML header &amp; footer&#8230;</p>
<h4>scratch_list.ps1</h4>
<pre>$debugpreference = "continue"

#This "output" variable runs and stores the output of the NBU command line
#Be sure that this .exe is in your path, otherwise change the below to include the full path to the executable.
$output = vmquery.exe -b -pn Scratch
$htmlfile = ".\output.txt"
$today = Get-Date

#Arrays to hold and sort info about our tapes.
#NOTE: this script is hard-coded to work for LTO2 (HCART2), LTO3 (HCART3) and LTO4 (HCART) tape drives/libraries
[array]$aTapes = @()
[array]$aHOffsite = @()
[array]$aH2Offsite = @()
[array]$aH3Offsite = @()

#NOTE: this script is hard coded to include the specific names of tape drives attached (via various media servers) to the master server
$aRobots = @{"TLD0" = 0; "TLD1" = 0; "TLD2" = 0; "TLD3" = 0; "TLD4" = 0; "TLD5" = 0; "TLD6" = 0; "TLD7" = 0; "TLD8" = 0; "TLD9" = 0; "TLD10" = 0; "TLD11" = 0; "TLD12" = 0; "TLD13" = 0; "TLD14" = 0}
$emailBody = Get-Content "header.html"
$aOffsite = 0

#Function to send mail (currently configured to send via Exchange)
function sendEmail() {
 $eServer = New-Object system.net.mail.smtpClient("exchange_server01")

 $From = "netbackup@yourcompany.com"
 $To = "nbu_reports@yourcompany.com"

 $todayDate = [string] $today.day + "/" + [string] $today.month + "/" + [string] $today.year

 $title = "Scratch tape list for $todayDate"

 $Body = $emailBody
 $eMsg = New-Object System.Net.Mail.MailMessage($From,$To,$title,$body)

 $eMsg.IsBodyHTML = $True

 $eServer.send($eMsg)    
}

#Take output of NBU command line util, and for each line pick out bits of the string
#Chuck everything in to a new array called $aTapes
foreach ($line in $output){
 if (($line.contains("HCART")) -and (-not $line.contains("A00"))) {

 $tName = ($line.substring(0, 6)).trim()
 $tType = ($line.substring(8, 6)).trim()
 $tRobot = $line.substring(23, 5).trim() #this captures a wide area with some white space that needs trimming

 $tRobot = $tRobot.replace(" ", "")

 $aTapes += ,($tName, $tRobot, $tType)
 }
}

#Go through the array we just created and then put the contents in to seperate arrays
#dependant on whether they are LTO, LTO2 or LTO3 tapes...
for ($j = 0; $j -lt $aTapes.length; $j++) {
 $tapeID = $aTapes[$j][0]
 $robot = $aTapes[$j][1]
 $type = $aTapes[$j][2]

 if ($robot.contains("-")) {
 switch ($type ) {
 "HCART" {$aHOffsite += ,($tapeID)}
 "HCART2" {$aH2Offsite += ,($tapeID)}
 "HCART3" {$aH3Offsite += ,($tapeID)}
 }

 } else {#If a library type does not contain HCART, HCART2 or HCART3 we must assume it's offsite (or in a safe))
 $temp = "TLD$robot"
 $aRobots[$temp] = $aRobots[$temp] + 1
 }
}

#Take the contents of $aRobots (offsite tapes) and put it in to a variables ready to be dumped in to our html output
foreach ($element in $aRobots) {
 $element &gt; $htmlfile
}

#Start pipping everything out to the $emailBody variable which will make the body of our email
$emailBody += '&lt;table&gt;&lt;tr&gt;&lt;td&gt;Tape drive&lt;/td&gt;&lt;td&gt;# scratch tapes&lt;/td&gt;&lt;/tr&gt;'
foreach ($line in Get-Content $htmlfile) {

 if ($line.contains("TLD")) {
 $emailBody += "&lt;tr&gt;"

 $robot = $line.substring(0, 5)
 $count = $line.substring(31, 3)

 $emailBody += "&lt;td&gt;$robot&lt;/td&gt;&lt;td&gt;$count&lt;/td&gt;"

 $emailBody += "&lt;/tr&gt;"
 }
}
$emailBody += '&lt;/table&gt;&lt;br/&gt;&lt;br/&gt;'

$emailBody += "&lt;b&gt;Offsite tapes...&lt;/b&gt;&lt;br/&gt;"

$emailBody += "&lt;b&gt;HCART&lt;/b&gt;&lt;br&gt;"
foreach($element in $aHOffsite) {
 $emailBody += "$element&lt;br/&gt;"
}
$emailBody += "&lt;br/&gt;&lt;b&gt;HCART2&lt;/b&gt;&lt;br&gt;"
foreach($element in $aH2Offsite) {
 $emailBody += "$element&lt;br/&gt;"
}
$emailBody += "&lt;br/&gt;&lt;b&gt;HCART3&lt;/b&gt;&lt;br&gt;"
foreach($element in $aH3Offsite) {
 $emailBody += "$element&lt;br/&gt;"
}

$emailBody += Get-Content "footer.html"

sendEmail
</pre>
<p>As per my other NBU scripts I use HTML files to store the CSS and opening HTML in order to easily format nice looking emails. See below for examples&#8230;</p>
<h4>header.html</h4>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Scratch tape list&lt;/title&gt;
 &lt;style type="text/css"&gt;
 body {
 font-family: Calibri, Arial, Helvetica;
 color: black;
 font-size: small;
 background-color: #FFFFFF }
 p {
 font-size: small }
 .big {
 font-size: small }
 table {
 font-size: small;
 padding: 0px ;
 border-spacing: 2px ;
 empty-cells: hide ;
 border: 1px solid #AAAAAA }
 td {
 background-color: #EEEEEE;
 vertical-align: top }
 th {
 background-color: #EEEEEE;
 vertical-align: top ;
 text-align: left}
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;p&gt;*** This email is now automatically generated ***&lt;br&gt;&lt;/p&gt;
</pre>
<h4>footer.html</h4>
<pre>&lt;br/&gt;
&lt;p&gt;Regards,&lt;br/&gt;&lt;br/&gt;
&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;

</pre>
<p>Let me know if this helps you out at all or if you can suggest any improvements&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidwarburton.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidwarburton.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidwarburton.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=98&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.davidwarburton.net/2010/05/04/netbackup-script-to-report-scratch-tapes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a54ad2551bd756d17e5f75aab3c2acd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">DavidWarburton</media:title>
		</media:content>
	</item>
		<item>
		<title>Using Powershell to report on Netapp filer snapshots</title>
		<link>http://blog.davidwarburton.net/2010/03/02/using-powershell-to-report-on-netapp-filer-snapshots/</link>
		<comments>http://blog.davidwarburton.net/2010/03/02/using-powershell-to-report-on-netapp-filer-snapshots/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:21:17 +0000</pubDate>
		<dc:creator>DavidWarburton</dc:creator>
				<category><![CDATA[Netapp]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Storage / Backups]]></category>

		<guid isPermaLink="false">http://blog.davidwarburton.net/?p=79</guid>
		<description><![CDATA[We had a few issues recently where SnapManager for Exchange and SnapDrive were failing to communicate properly which resulted in a weeks worth of missed snapshots before anyone realised what was going on. I wrote this script to report on the status of snapshots. The filer name is passed as a variable and a list [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=79&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We had a few issues recently where SnapManager for Exchange and SnapDrive were failing to communicate properly which resulted in a weeks worth of missed snapshots before anyone realised what was going on.</p>
<p>I wrote this script to report on the status of snapshots. The filer name is passed as a variable and a list of volume names is stored as a variable at the top of the script. The output is nicely formatted email.</p>
<ol>
<li>The script uses SSH to connect to the filer (see my <a href="/2010/02/26/scripting-netapp-filers/">SSH guide for Netapp filers</a>)</li>
<li>For each vol listed in the array, the list of snapshots is returned</li>
<li>Any line with &#8220;__daily&#8221; in is processed &#8211; all others are ignored (we only care about our nightly verified snapshots which are all named __daily)</li>
<li>The snapshot name contains the date/time it was taken &#8211; this is read and if the date is within 24 hours of now a success is return (since reports are run the day after the verified job). If the date is over 24 hours a failure is returned.</li>
<li>A nicely formated HTML email is sent out which looks a little something like this&#8230;</li>
</ol>
<p><strong>Please see below for today&#8217;s backup report.</strong></p>
<table style="font-size:xx-small;" border="1" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>VOL Name</strong></td>
<td valign="top"><strong>Status</strong></td>
<td valign="top"><strong>Snapshot name</strong></td>
</tr>
<tr>
<td valign="top">Vol_Exc02_DB</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">0% ( 0%) 0% ( 0%) Mar   02 01:44 exchsnap__exchange02_03-01-2010_23.00.14__daily   (busy,backup[0],dump)</td>
</tr>
<tr>
<td valign="top">Vol_Exc02_LOG</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">0% ( 0%) 0% ( 0%) Mar   02 04:38 eloginfo__exchange02_03-01-2010_23.00.14__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc02_DB1</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">0% ( 0%) 0% ( 0%) Mar 01 23:00 exchsnap__exchange02_03-01-2010_23.00.14__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc02_LOG1</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">1% ( 0%) 0% ( 0%) Mar   02 01:27 eloginfo__exchange02_03-01-2010_23.00.14__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc03_DB</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">1% ( 1%) 0% ( 0%) Mar   02 00:50 exchsnap__exchange03_03-01-2010_23.00.13__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc03_LOG</td>
<td valign="top"><span style="color:#0000ff;">Success</span></td>
<td valign="top">0% ( 0%) 0% ( 0%) Mar   02 02:06 eloginfo__exchange03_03-01-2010_23.00.13__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc03_DB1</td>
<td valign="top"><span style="color:#ff0000;">FAILURE</span></td>
<td valign="top">1% ( 1%) 0% ( 0%) Feb   26 23:00 exchsnap__exchange03_03-01-2010_23.00.13__daily</td>
</tr>
<tr>
<td valign="top">Vol_Exc03_LOG1</td>
<td valign="top"><span style="color:#ff0000;">FAILURE</span></td>
<td valign="top">0% ( 0%) 0% ( 0%) Feb   26 00:32 eloginfo__exchange03_03-01-2010_23.00.13__daily</td>
</tr>
</tbody>
</table>
<p>See the script and HTML files after the jump&#8230;<span id="more-79"></span></p>
<p>Don&#8217;t forget to change the name of your mail server, your sending and recipient email addresses and, most importantly, the location of plink.exe and your DSA keys used to establish the SSH connection (although you could easily modify this script to use RSH instead).</p>
<h4>snapReport.ps1 script</h4>
<pre># ==============================================================================================
#
# NAME:     Netapp filer snapshot reports
#
# AUTHOR:     David Warburton
# DATE:     12/03/2009
#
# PARAMETERS:    1. $filer
#        Specifies the name of the remote filer to connect to.
#        example: snapReport.ps1 myfiler01
#
# ==============================================================================================
$debugPreference = "continue"
$errorActionPreference = "stop"
$filer = $Args[0]
$htmlFile = "D:\Logs\Exchange Snapshot Report\exchange_Snapshot.html"
$volumes = ("Vol_Exc02_DB", "Vol_Exc02_LOG", "Vol_Exc02_DB1", "Vol_Exc02_LOG1", "Vol_Exc03_DB", "Vol_Exc03_LOG", "Vol_Exc03_DB1", "Vol_Exc03_LOG1")
$header = get-content "header.html"
$header &gt; $htmlFile
$today = get-date
function sendEmail() {
 $eServer = new-object system.net.mail.smtpClient("mailserver.yourdomain.com")
 $From = "youraddress@yourcompany.com"
 $To = "backup_reports@yourcompany.com"
 if ($checkType -eq "weekly") {
 $title = "Weekly "
 } else {
 $title = "Daily "
 }
 $todayDate = [string] $today.day + "/" + [string] $today.month + "/" + [string] $today.year
 $title += "Exchange snapshot Report for $todayDate"
 $Body = get-content $htmlFile
 $eMsg = new-object System.Net.Mail.MailMessage($from,$to,$Title,$body)
 $eMsg.IsBodyHTML = $True
 #$eMsg.cc.add($cc)
 $eServer.send($eMsg)
}
function checkSnap($volName) {
 $output = D:\Utils\PuTTY\plink.exe svc-ssh@$filer -i D:\Utils\PuTTY\id_dsa.ppk snap list $volName
 $validsnap = $False
 $snapname = ""
 foreach ($line in $output){
 if ($line.contains("__daily")) {
 $sMonth = $line.substring(62, 2)
 $sDay = $line.substring(65, 2)
 $sYear = $line.substring(68, 4)
 $sDate = [datetime] "$sMonth $sDay $sYear"
 if (($sDate.date).addDays(1) -eq $today.date) {
 $validsnap = $True
 $snapname = $line
 }
 }
 if ($validsnap) {
 return $snapname
 }
 }
 return $False
}
foreach ($vol in $volumes) {
 $line = "&lt;tr&gt;&lt;td&gt;$vol&lt;/td&gt;"
 $status = checkSnap $vol
 if ($status -eq $false) {
 $line += "&lt;td&gt;&lt;font color=red&gt;FAILED&lt;/font&gt;&lt;/td&gt;"
 } else {
 $line += "&lt;td&gt;&lt;font color=blue&gt;Success&lt;/font&gt;&lt;/td&gt;"
 }
 $line += "&lt;td&gt;$status&lt;/td&gt;&lt;/tr&gt;"
 $line &gt;&gt; $htmlFile
}
$footer = Get-Content "footer.html"
$footer &gt;&gt; $htmlFile
sendEmail
</pre>
<p>Here are the HTML bits for the header and footer of the email&#8230;</p>
<h4>header.html</h4>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Backup Report&lt;/title&gt;
 &lt;style type="text/css"&gt;
 body {
 font-family: Calibri, Arial, Helvetica;
 color: black;
 font-size: xx-small;
 background-color: #FFFFFF }
 p {
 font-size: x-small }
 .big {
 font-size: x-small;
 font-weight: bold }
 table {
 padding: 0px ;
 border-spacing: 2px ;
 empty-cells: hide ;
 border: 1px solid #AAAAAA }
 td {
 background-color: #EEEEEE;
 vertical-align: top }
 th {
 background-color: #EEEEEE;
 vertical-align: top ;
 text-align: left}
 &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;*** This email is now automatically generated ***&lt;br&gt;&lt;br&gt;&lt;b&gt;Please see below for today's backup report.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;
 &lt;b&gt;NOTE: &lt;/b&gt;&lt;br/&gt;
 - Exchange and SQL snapshots are managed by SnapManager and are alerted independantly to this report.&lt;br/&gt;
 - Not &lt;u&gt;all&lt;/u&gt; snapshots are shown in these reports. Hourly snapshots are currently not reported upon.
&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
 &lt;th&gt;VOL Name&lt;/th&gt;&lt;th&gt;Status&lt;/th&gt;&lt;th&gt;Number of Snapshots&lt;/th&gt;&lt;th&gt;Last snapshot taken&lt;/th&gt;
&lt;/tr&gt;
</pre>
<h4>footer.html</h4>
<pre>&lt;/table&gt;
&lt;br/&gt;
&lt;p&gt;Regards.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidwarburton.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidwarburton.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidwarburton.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=79&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.davidwarburton.net/2010/03/02/using-powershell-to-report-on-netapp-filer-snapshots/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a54ad2551bd756d17e5f75aab3c2acd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">DavidWarburton</media:title>
		</media:content>
	</item>
		<item>
		<title>Scripting Netapp filers</title>
		<link>http://blog.davidwarburton.net/2010/02/26/scripting-netapp-filers/</link>
		<comments>http://blog.davidwarburton.net/2010/02/26/scripting-netapp-filers/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 14:05:50 +0000</pubDate>
		<dc:creator>DavidWarburton</dc:creator>
				<category><![CDATA[Netapp]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Storage / Backups]]></category>

		<guid isPermaLink="false">http://blog.davidwarburton.net/?p=66</guid>
		<description><![CDATA[Scripting the Netapp filers can be accomplished by using either RSH or SSH. Both of these options must be enabled on the filer(s) in question using. In either case scripts are not processed on the filers themselves. They are scheduled and run on Windows/Linux systems using their native languages (e.g. Vbscript or Powershell). These scripts [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=66&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Scripting the Netapp filers can be accomplished by using either RSH or SSH. Both of these options must be enabled on the filer(s) in question using.</p>
<p>In either case scripts are not processed on the filers themselves. They are scheduled and run on Windows/Linux systems using their native languages (e.g. Vbscript or Powershell). These scripts simply call native OnTAP commands against a filer which then returns data in the form of text. This is important to note as although Powershell is a useful language to use OnTAP will not return native PS objects which means you are limited to text/string based manipulation.</p>
<h3><strong>RSH</strong></h3>
<p>This method is the least secure but is the quickest and easiest to set up. Users need not necessarily be filer administrators. Although there is some degree of security in the sense that access is restricted to a set user account and accessible only via a set IP address, data is not encrypted.</p>
<p>RSH is not natively supported in Windows 2008 [from the command line] as it is in Windows 2003.</p>
<p>To enable RSH on the filer use the following command:</p>
<pre>options rsh.enable on</pre>
<p>You must also specify user accounts and IP addresses via the FilerView web interface.</p>
<h3>SSH</h3>
<p>Windows 2008 does not natively support SSH either so this is accomplished using <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">plink</a>.</p>
<p>To enable SSH on the filer use the following commands:</p>
<pre style="padding-left:30px;">secureadmin setup
secureadmin enable ssh
</pre>
<p>Read more after the break&#8230;</p>
<h4><span id="more-66"></span>Configuring SSH</h4>
<ol>
<li>First create a local user      account on the filer using the following command:
<pre> useradmin user add svc-ssh -g Administrators</pre>
<ol type="a">
<li>the passwords are kept in the Password spreadsheet</li>
<li>The user must be a member of       Administrators to be granted the Login_ssh permission on the filer</li>
</ol>
</li>
<li>Using Powershell (whilst      running with your Admin Account) change directory to the hidden share on      the filer:
<pre> cd \\filer\c$\etc\sshd\</pre>
</li>
<li>Create a folder with the same      name as your account created in step 1 and then another folder to hold the      SSH keys:
<pre> md svc-ssh
 md svc-ssh\.ssh</pre>
</li>
<li>On the script server lunch      PUTTYGEN.EXE and under the &#8220;Key&#8221; menu change the type to      &#8220;SSH-2 DSA key&#8221;. Leave everything else on its default      setting.</li>
<li>Click on the <strong>Generate </strong>button      and follow the prompt</li>
<li>Enter the same password from      step 1 in the &#8220;Key passphrase&#8221; and &#8220;Confirm      passphrase&#8221; areas (they do not HAVE to be the same as step 1 but are      being kept so for simplicity)</li>
<li>When complete, click on Save      public key. Save it to the PuTTY folder with the name:<br />
<strong>id_dsa.pub</strong></li>
<li>Save the private key to the      same place with a similar name:<br />
i<strong>d_dsa.ppk</strong></li>
<li>Copy the contents of the      &#8220;Public key for pasting into OpenSSH authorised_key file&#8221; area      and paste it in to a new text document. You should use Wordpad to do this as Notepad does not      handle the line breaks properly. Save this document as authorized_keys.</li>
<li>You are now finished. You can test connection using PuTTY by selecting your private key. The first time you connect you will be prompted to accept the hosts key. You will still be prompted for a username but you should not need to enter a password as this is what the SSH keys are for.</li>
<p>For scripting purposes we use plink.exe to issue a command. For example:</p>
<pre>.\plink.exe svc-ssh@filer -i "id_dsa.ppk" df -s
</pre>
</ol>
<h4>Scripting using plink</h4>
<p>The basic use of plink.exe is as follows:</p>
<pre>.\plink.exe svc-ssh@filer -i "id_dsa.ppk" df -s</pre>
<p>Two methods can be used to script the filers depending on what you&#8217;re trying to achieve:</p>
<div>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>Reporting</td>
<td>Grabbing the   contents of a single command and piping it to a Powershell variable. This   allows us to manipulate the string (or lines of strings) that are returned.   Objects are not returned so true Powershell scripting (i.e. Object   Orientated) can not be done but PS gives us some very useful string   maniplation functions.</td>
</tr>
<tr>
<td>Maintenance</td>
<td>Issuing multiple   commands to the filer to perform repetitive/scheduled actions. For example,   deleting, renaming and taking new snapshots.</td>
</tr>
</tbody>
</table>
</div>
<p>NOTE: when calling plink.exe in Powershell the full or abbreviated path must be specified. So use either a full path, for example, D:\Utils\PuTTY\plink.exe or just .\plink.exe</p>
<h3>Reporting</h3>
<p>From a Powershell command prompt simply pipe the output of an SSH command in to a variable for later manipulation:</p>
<p>$output = .\plink.exe svc-ssh@filer -i &#8220;id_dsa.ppk&#8221; df -s</p>
<h3>Maintenance</h3>
<p>If multiple command need to be issued &#8211; for example, you need to delete a snapshot, rename the previous 5 snapshots, and then take a new snapshot &#8211; you should issue them all via the one SSH connection.</p>
<p>Commands can be concatenated using a semi-colon. Just be sure to enclose everything in quotes. For example:</p>
<pre> .\plink.exe svc-ssh@filer -i "id_dsa.ppk" "snap delete Vol_A hourly.6; snap rename Vol_A hourly.5 hourly.4; snap rename Vol_A hourly.4 hourly.3; snap rename Vol_A hourly.3 hourly.2; snap rename Vol_A hourly.2 hourly.1; snap create Vol_A hourly.0"

</pre>
<p>Well that&#8217;s it. It&#8217;s a pretty brief post &#8211; if you have any questions please feel free to post them in the comments&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidwarburton.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidwarburton.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidwarburton.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=66&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.davidwarburton.net/2010/02/26/scripting-netapp-filers/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a54ad2551bd756d17e5f75aab3c2acd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">DavidWarburton</media:title>
		</media:content>
	</item>
		<item>
		<title>Netbackup Report Scripting</title>
		<link>http://blog.davidwarburton.net/2010/02/25/netbackup-report-scripting-2/</link>
		<comments>http://blog.davidwarburton.net/2010/02/25/netbackup-report-scripting-2/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 14:01:16 +0000</pubDate>
		<dc:creator>DavidWarburton</dc:creator>
				<category><![CDATA[Batch]]></category>
		<category><![CDATA[Netbackup]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[VBscript]]></category>

		<guid isPermaLink="false">http://davidwarburton.wordpress.com/?p=51</guid>
		<description><![CDATA[Hi everyone. I&#8217;m going to jump right in to my first post (the main reason for starting this blog in the first place) and show you the progress I&#8217;ve made with automating daily reports using our backup solution of choice, Symantec (used to be Veritas) Netbackup. Until now our users have demanded daily reports to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=51&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi everyone. I&#8217;m going to jump right in to my first post (the main  reason for starting this blog in the first place) and show you the  progress I&#8217;ve made with automating daily reports using our backup  solution of choice, Symantec (used  to be Veritas) Netbackup.</p>
<p>Until  now our users have demanded daily reports to be emailed out to key  individuals. The format of these emails was quite basic in theory&#8230;it  simply showed a list of all servers (clients) that were backed up, their  status from last night (e.g. successful, failed, etc&#8230;) but then,  crucially, a list of files that had been skipped.</p>
<p>The reason for  listing each file that had failed was due to Netbackup&#8217;s poor poor  (don&#8217;t get me started on how poor) feedback in the Activity Monitor and  it&#8217;s built in reports. You see sometimes jobs could be marked as  &#8220;Successful with warnings&#8221; if the job completed but the odd file had  been skipped (if it were in use, for example). But other times, although  it still listed which files had been missed if you double-clicked on  each job, it showed the overall status as Successful. This meant that to  report on the servers in the format that was required by our users we  had to manually trawl through the 360 jobs across two Netbackup servers  just to copy and paste the lines of the files that had been missed.</p>
<p>Needless  to say it didn&#8217;t take me long to get bored of this so I started looking  at a way of reproducing our reports automatically.  After some time,  I&#8217;ve come up with a solution &#8211; it uses VBScript to parse the logs files  which I output using a few key Netbackup command-line tools.</p>
<p>The basic process and components to the script are as follows&#8230;</p>
<ol>
<li>A VBscript calls a number of external batch scripts</li>
<li>These batch script run NBU commands and spit their output to text files</li>
<li>The VBscript then reads these text files</li>
<li>The VBscript reads a servers.txt file to determine what jobs to report on*</li>
<li>A LOT of array and string manipulation is used to catalogue which jobs have run and which have errors and if so, it collates all skipped files</li>
<li>These arrays are then parsed and dumped to either an HTML file (which can be used directly in the body of an email) or, as I&#8217;ve recently changed to script, outputs to an Excel file.</li>
</ol>
<p>There are some nice bits to the script(s) and some really nasty bits &#8211; I welcome you to improve on the original and share it with everyone (for example, I know there is a much neater way of calling and parsing the output of batch jobs rather than the nasty wscript.sleep I have used).</p>
<p>* A text file (called servers.txt) is kept along side the scripts. This file is manually edited and must be kept up to date. The file is a number of lines, each one representing a client/job that we wish to report on. The format is as follows:</p>
<pre style="padding-left:30px;">60, myserver, mypolicy, GroupName</pre>
<p>The number at the start represents what days of the week the report should be generated. <em>myserver </em>is obviously the client that is to be reported on. <em>mypolicy</em> is the name of a policy that you are reporting on (since a client may me a member of multiple policies). Finally, <em>GroupName</em> is free text and can be used to group similar clients (that may not necessarily be grouped by the same policy.</p>
<p>The scripts necessary to generate a report are&#8230;</p>
<ol>
<li><a href="/2010/02/25/generatereport-vbs/"><strong>generateReport.vbs</strong></a><br />
The primary script which calls the others and also performs of the processing and HTML/Excel generation</li>
<li><a href="/2010/02/25/job_summary-bat/"><strong>j</strong><strong>obs_summary.bat</strong></a><br />
Issues the bpdjobs &#8211; simmary command and pipes output to a text file. This provides a simple overview of number of total jobs and the number that have succeeded, failed or errored.</li>
<li><a href="/2010/02/25/jobs_report-bat/"><strong>jobs_report.bat</strong></a><br />
This is the main batch script upon which the report is generated. It is a hideous mess of space-formatted garbage and why so much processing is needed to generate a useful and nice looking report.</li>
</ol>
<p>Clicking the scripts above will take you to a separate page with the code and more explanations of how to use it in your environment.</p>
<p><strong>UPDATE</strong>: Okay, so enough of you have expressed an interest that I decided to put it up for public download. Please note that it is not currently protected via any kind of license so please use your discretion. I have included a very basic READ ME that I encourage you to go through. Post your comments here if you have any problems.</p>
<p><span style="color:#0000ff;">Download</span>: <a href="http://db.tt/Fj4Ql8v" target="_blank">Dave&#8217;s Netbackup Reporting script</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidwarburton.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidwarburton.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidwarburton.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.davidwarburton.net&#038;blog=11246690&#038;post=51&#038;subd=davidwarburton&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.davidwarburton.net/2010/02/25/netbackup-report-scripting-2/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3a54ad2551bd756d17e5f75aab3c2acd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">DavidWarburton</media:title>
		</media:content>
	</item>
	</channel>
</rss>
