Subscribe

Re: Powershell Lag Time

Just thought I'd add a pedantic note about PowerShell's weird integer rounding rules.  You might want to use [Math]::Truncate() in this case to make sure you don't accidentally round up an extra hour:

PS C:\> [Math]::Truncate($ts.TotalHours).ToString() + ":" + $ts.Minutes + ":" + $ts.Seconds

10820:26:29

Re: Powershell Lag Time

It would be cool if i knew a way to convert 3.05:14:59 to days, hours, minutes, seconds.  So, like 3days,5hours,15minutes,59seconds  Is that a powershell expression that needs to happen?

Re: Powershell Lag Time

Trivial:

PS C:\> $ts

Days              : 450

Hours             : 20

Minutes           : 26

Seconds           : 29

Milliseconds      : 0

Ticks             : 389535890000000

TotalDays         : 450.851724537037

TotalHours        : 10820.4413888889

TotalMinutes      : 649226.483333333

TotalSeconds      : 38953589

TotalMilliseconds : 38953589000

PS C:\> [String]::Format("{0} days, {1} hours, {2} minutes, {3} seconds", $ts.days, $ts.Hours, $ts.Minutes, $ts.Seconds)

450 days, 20 hours, 26 minutes, 29 seconds

Re: Powershell Lag Time

Clinton,

Now i'm sort of getting somewhere

I took your advice from the other thread and have come up with this

"

gc $hostfile | % { $c = Connect-NaController -credential $cred $_; Write-Host "`nController: $c`n"; Get-NaSnapmirror | where-object {$_.LagTime -gt $LagTimeSeconds}  }

"

A few things i'm noticing.  As the script loops through it strips out the headers on each loop.  so for the first example it only lists

Controller: filera

Source                               Destination                          Status         State                LagTimeTS

------                               -----------                          ------         -----                ---------

Also, what is the best way to write the host name like we are and then if it doesn't meet the criteria to write "no snapmirror lag issue"

I was thinking along the lines of

$lag = Get-NaSnapmirror | where-object {$_.LagTime -gt $LagTimeSeconds

Am i totally off base?

I'm also noticing the built in formatting is not big enough for some of our volume names.  I am going to work on that with the expression statements like you did in the other post.  I will re-post when im done.

Re: Powershell Lag Time

Clinton,

Got my heads back with the following code.. I took your advince from the previous thread.. Still needs work but it's a start

$lagtimeseconds = "86400"

gc $hostfile | % {

     $c = Connect-NaController $_ -credential $cred

     Get-NaSnapmirror | where-object {$_.LagTime -gt $LagTimeSeconds}  | Select SourceLocation,DestinationLocation,Status,State,LagtimeTS |  ft @{expression={$c};Label="Filer name";width=20},@{expression={$_.SourceLocation};Label="Source";Width=40},@{Expression={$_.DestinationLocation};Label="Destination";Width=40},@{expression={$_.status};Label="status";width=20},@{Expression={$_.state};Label="state";width=20},@{Expression={$_.lagtimets};label="lag time";width=20}

     }

I had to increase the widths b/c our volume are quite long.    I'm not a true fan of how i did filer name, but it's a start. 

I would more like

*** Filer Name ****

blah blah

That's for tomorrow.. And then i will do the same for snapvault status.. This will really helps us out.  I knew you converted lagtimTS into days and hours.  I'm thinking how I would do this in VB.  I would create a function that does that that I can whip a variable through to convert.  is it something similiar? 

Re: Powershell Lag Time

Josh, you're on the right track.  Try the -GroupBy parameter to Format-Table.  That can save you a little horizontal space.  'Fraid I can't help you with VB, though!

PS C:\> gc .\filers.txt | % { $c = Connect-NaController $_; Get-NaSnapmirror | where-object {$_.LagTime -gt $LagTimeSeconds}  | Select SourceLocation,DestinationLocation,Status,State,LagtimeTS |  ft @{expression={$_.SourceLocation};Label="Source";Width=40},@{Expression={$_.DestinationLocation};Label="Destination";Width=40},@{expression={$_.status};Label="status";width=20},@{Expression={$_.state};Label="state";width=20},@{Expression={$_.lagtimets};label="lag time";width=20} -GroupBy @{expression={$c};Label="Filer name"} }

   Filer name: dunn

Source                                   Destination                              status               state                lag time

------                                   -----------                              ------               -----                --------

dunn:testvol3                            benson:testvol3                          idle                 source               209.08:02:47

benson:testvol3                          dunn:testvol3                            idle                 broken-off           209.07:02:45

dunn:AS_5_12_1                           fas2050b:AS_5_12_1_NODELETE              idle                 source               455.03:01:47

dunn:SC_3_3_0                            fas2050b:SnapCreator_3_3_0_NODELETE      idle                 source               455.03:01:20

   Filer name: benson

Source                                   Destination                              status               state                lag time

------                                   -----------                              ------               -----                --------

dunn:testvol3                            benson:testvol3                          idle                 broken-off           209.08:02:48

benson:testvol3                          dunn:testvol3                            idle                 source               209.07:02:46

Re: Powershell Lag Time

Clinton,

Here's what I have so far.. There are a few flaws that I want to work on.  I would rather not put the password stored in the script.  I can compile it, but i was wondering if there is a better way to do this

Also, i had to abandon the Format-table command b/c I couldn't figure out how to format-table and then dump to csv.  Also, the way we are dumping to CSV is kind of lame.  I would like to use native Excel API, but i know this is a lot more challenging and i'm not sure i'm ready for it.  But basically this gets the job done for now.  It's ugly but it works. 

Improvements, comments, suggestions are welcome and appreciated.

### Mail "constants"

      $sendMailAs    = "xx"

       $recipients    = "x

       $subjectLine = "Daily Exchange VSM LAG TIME"

       $mailMessage = "Daily Exchange VSM Lag time"

       $smtpServer = "x"

       $priority = "high"

### File Constants

    $date = (get-date).toString('dd-MMM-yyyy_h-mm-ss')

    $ext = ".xls"

    $outfile = "Exchange_VSM_Lag_" + $date + $ext

    $delim = "`t"

### Import Data OnTap Module

    # Check toolkit version

    try

    {

        if (-Not (Get-Module DataONTAP))

        {

            Import-Module DataONTAP -EA 'STOP' -Verbose:$false

        }

        if ((Get-NaToolkitVersion).CompareTo([system.version]'1.7') -LT 0) { throw }

    }

    catch [Exception]

    {

        Write-Warning "This script requires Data ONTAP PowerShell Toolkit 1.7 or higher."

        return;

    }

### Define Lag time

$lagtimeseconds = "86400" #24 hour lagtime

### Input File properties

$hostfile = "hosts.txt"

$accnt = "xx"

$filerpassw = "xxx"

$password = ConvertTo-SecureString $filerpassw -AsPlainText –Force 

$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $accnt,$password 

$snapMirrors = @()

gc $hostfile | % {

    $C = Connect-NaController -credential $cred $_

    $snapMirrors +=  Get-NaSnapmirror | where-object {$_.lagTime -gt $lagTimeSeconds} | Select SourceLocation,DestinationLocation,Status,State,LagtimeTS # |  ft @{expression={$c};Label="Filer name";width=20},@{expression={$_.SourceLocation};Label="Source";Width=40},@{Expression={$_.DestinationLocation};Label="Destination";Width=40},@{expression={$_.status};Label="status";width=20},@{Expression={$_.state};Label="state";width=20},@{Expression={$_.lagtimets};label="lag time";width=20}

}

$dataToWrite = $snapMirrors | convertTo-Csv -delimiter $delim -noType

$dataToWrite | sc $outfile

## Send Email

Send-MailMessage -To $recipients -From $sendMailAs -Attachments $outfile -Subject $subjectLine -Body $mailMessage -Priority $priority -SmtpServer $smtpServer

#####

Re: Powershell Lag Time

I forgot to mention that i keep getting this trailing errror.  I made sure the input file had no trailing spaces and I can't figure out where it's coming from.. a bit of annoying

ERROR: ConvertTo-Csv : Cannot bind argument to parameter 'InputObject' because it is null.

ERROR: At C:\temp\good\good\lagtime2.ps1:68 char:44

ERROR: + $dataToWrite = $snapMirrors | convertTo-Csv <<<<  -delimiter $delim -noType

ERROR:     + CategoryInfo          : InvalidData&colon; (Smiley Happy [ConvertTo-Csv], ParameterBindingValidationException

ERROR:     + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertToCsvCommand

ERROR:

Re: Powershell Lag Time

Hi Josh,

I'd recommend "Add-NaCredential -SystemScope" for managing the creds.  Simply connect to your controller at the console and then call that cmdlet.  Then in your script, don't specify credentials at all, and the machine encrypted values you entered earlier will be used automatically!

You shouldn't be using FT/Format-Table to send data to CSV.  Format-Table is really for sending data to the screen/console.  Instead, just use "Select-Command" like you are doing which builds PSObjects.  Note that you can pass expressions like "@{Name=SomeField;Expression={$Some[Value]}}" to the select cmdlet.

The Exception you mention is probably from a controller with no out-of-date mirrors.  In that case PowerShell is going to push a $null onto your $snapMirrors list.  You can easily filter those out like this:

$snapMirrors | where {$_} | convertTo-Csv -delimiter $delim -noType

Cheers!

Eric

Re: Powershell Lag Time

Eric,

Thanks for the points,  I will review the add-nacredential cmdlet.   I still don't understand how that will work in an automated script job.. It can't prompt me for passwords.   Will review this weekend.

I will check out adjusting thta line to handle any Null values..

More to come next week.