v8 Broke my Powershell Script

PowerShell script exchange

v8 Broke my Powershell Script

Veeam Logoby menthol » Wed Nov 19, 2014 6:52 pm

Hi Guys

Hopefully you can help me with this...

I have a script in PS that runs after the full backup job that did the following

  1. Selects & inventories the tape drive
  2. Marks the inserted tape as Free
  3. Selects latest full backup from the backup repository (finds *.vbk files and selects the latest one)
  4. Creates a hardlink for this backup file
  5. Starts the duplication of the file to tape
  6. Ejects the tape
  7. Removes the hardlink
  8. Sends an email report

However the CmdLets appear to have changed so now it doesn't work. The inventorying of the tape drive, selecting of the tape and marking it as free do not seem to work.

Could anyone assist me with this?

Code: Select all
############################################################
### Powershell Script for Automating Backup Duplication    #
### Version: 1                                             #
### Date: 17/06/14                                         #
############################################################

# Initial Setup

Remove-Variable -Name * -Scope script -ErrorAction SilentlyContinue
$Error.clear()
$ErrorActionPreference = "Stop"

# Time & Logging

$logger = New-Object System.Text.StringBuilder
$logger.Length = 0

function Log([string]$Message)
    {
        $LogTime = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
        #$logger.Append($LogTime)
        $logger.AppendLine($LogTime + " " + $Message)
    }


Log "Starting script"

# SMTP
$smtpServer = "server"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)

# Email Reporting
$emailFrom = "xxx"
$emailTo = "xxxx"
$subject_success = "[SUCCESS] SRV Backup Files Replicated to Tape"
$subject_failure = "[FAILURE] SRV Backup Files NOT Replicated to Tape"

# Let's set our locations
$SRV80_b2d = "D:\Veeam\Backups\Backup Job\"

# GET Veeam Module for Commands!

try
{
    Log "Attempting to add the Veeam Snapin so commands can be executed"
    Add-PSSnapin VeeamPSSnapin
    Log "Successfully added the Veeam Snapin"
}
catch
{
    Log "Error while attempting to add the Veeam Snapin: $error"
    Log "Script execution FAILED"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit
}


##################################################################
######################## BEGIN PROCESSES #########################
##################################################################

## INVENTORY THE TAPE ##

try
{
    Log "Attempting to enumerate & inventory the tape drive"
    Get-VBRTapeDrive | Start-VBRTapeInventory
    Log "Successfully inventory'd the tape drive"
}
catch
{
    Log "Error while attempting to inventory the tape drive: $error"
    Log "Script execution FAILED"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit
}



## SELECT THE TAPE ##

$tape = Get-VBRTapeMedium | Where-Object {$_.IsOnline -like "True"}



## MARK TAPE AS FREE ##

try
{
    Log "Attempting to mark $tape as free"
    $tape.MarkAsFree()
    Log "Successfully marked $tape as free"
}
catch
{
    Log "Error while attempting to mark $tape as free: $error"
    Log "Script execution FAILED"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit
}


## LATEST BACKUP SELECTION ##
# Time to get our latest full backup file and store it into a variable, ready for duplication
# It's a bit roundabout at present because the Add-VBRTapeFilesJob cmdlet can't handle files properly


Log "Finding latest full backup of SRV80"
$linkpath = "D:\Veeam\Backups\HardLinks\"
$SRV80_b2d_files = dir $SRV80_b2d -Filter "*.vbk"
$SRV80_Latest = $SRV80_b2d_files | group directory | foreach {@($_.group | sort {[datetime]$_.creationtime} -desc)[0]}

try
{
    Log "Selecting latest full backup of SRV80"
    $FilePath = $SRV80_Latest.DirectoryName
    $FileName = $SRV80_Latest.Name
    $SRV80Link = "LatestSRV80VBK.vbk"
    cmd /c mklink /H $linkpath$SRV80Link $Filepath\$Filename
}
catch
{
    Log "Error while selecting latest full backup: $error"
    Log "Script execution FAILED"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit
}

# Sleep for 10 seconds while Veeam releases its hold on the above hardlink

Start-Sleep -s 10

## NOT NEEDED
#try
#{
#    Log "Creating job for duplicating $SRV60_Latest")
#    #Add-VBRTapeFilesJob -Name "SRV60 to Tape" -Server "This server" -Path $linkpath$Filename -MediaPool "DSG Tape Media" -Masks vbk
#    Log "Successfully created job")
#}
#catch
#{
#    Log "Error while creating duplication job: $error")
#    Log "Script execution FAILED")
#    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
#    exit
#}



################
## START JOB! ##
################


try
{
    Log "Starting job to duplicate $SRV80_Latest"
    Start-VBRJob -Job "SRV80 to Tape"
    Log "Successfully duplicated $SRV80_Latest to tape"
    $jobDuplicated = 1
    Log "Ejecting the tape"
    Get-VBRTapeDrive | Eject-VBRTapeDrive
    Log "Successfully ejected tape"
}
catch
{
    $jobDuplicated = 0
    Log "Error while duplicating: $error"
    Log "Script execution FAILED"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit
}


## NOT NEEDED
#try
#{
#    Log "Removing the SRV60 to Tape Job")
#    #Remove-VBRJob -Job "SRV60 to Tape" -Confirm:$false
#    Log "Successfully removed job")
#}
#catch
#{
#    Log "Error while removing job: $error")
#    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
#    exit
#}


## REMOVE HARD LINKS ##

try
{
    Log "Removing the symbolic link to the backup file"
    cmd.exe /c del $linkpath$SRV80Link
    Log "Successfully removed the symbolic link to the backup file"
}
catch
{
    Log "Error while removing symbolic link: $error"
    $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
    exit



# Let's wrap it up and email our report
# SRV80 will be in a different script
# EMAIL RESULTS #

if ($error.count -le 0)
        {
            if ($jobDuplicated = 1)
                {
                    Log "SRV80 backup files are on tape, yay!"
                    Log "Script executed successfully"
                    $smtp.Send($emailFrom, $emailTo, $subject_success, $logger.ToString())
                }
        }
else
        {
        Log "Script execution Error"
        $smtp.Send($emailFrom, $emailTo, $subject_failure, $logger.ToString())
        }


THANK YOU!
menthol
Influencer
 
Posts: 12
Liked: 2 times
Joined: Fri Jan 24, 2014 10:02 am
Full Name: Brad Wyatt

Re: v8 Broke my Powershell Script

Veeam Logoby v.Eremin » Thu Nov 20, 2014 12:19 pm

Let's try the following:

Inventory:

Code: Select all
$Drive = Get-VBRTapeDrive -name "Name of Drive"
Start-VBRTapeInventory -Library $Drive

Select tape:

Code: Select all
$Medium = Get-VBRTapeMedium | where {$_.location -like "Drive"}

Mark as free:

Code: Select all
$MediaPool = Get-VBRTapeMediaPool -Name "Free"
Move-VBRTapeMedium -Medium $Medium -MediaPool $MediaPool

As to the usage of hardlinks, please be aware that with version 8 revised tape PS model, it's now possible to change "source" settings of files to tape job. So, there is no need to use complex "hardlink" approach any longer.

Code: Select all
Set-VBRFileToTapeJob -Job $Job -Object <Object>

Thanks.
v.Eremin
Veeam Software
 
Posts: 13290
Liked: 973 times
Joined: Fri Oct 26, 2012 3:28 pm
Full Name: Vladimir Eremin

Re: v8 Broke my Powershell Script

Veeam Logoby menthol » Thu Nov 20, 2014 12:28 pm

Thanks for such a detailed answer.

I've tried the inventory script but it errors with:

Code: Select all
Start-VBRTapeInventory : Cannot bind parameter 'Library'. Cannot convert the "Tape0" value of type "Veeam.Backup.PowerShell.Infos.VBRTapeDrive" to type
"Veeam.Backup.PowerShell.Infos.VBRTapeLibrary".
At line:2 char:37
+     Start-VBRTapeInventory -Library $Drive
+                                     ~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-VBRTapeInventory], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Veeam.Backup.PowerShell.Cmdlets.StartVBRTapeInventory


Any ideas?

I haven't tried the other code snippets yet since they depend on each other working.

Thanks again
menthol
Influencer
 
Posts: 12
Liked: 2 times
Joined: Fri Jan 24, 2014 10:02 am
Full Name: Brad Wyatt

Re: v8 Broke my Powershell Script

Veeam Logoby v.Eremin » Thu Nov 20, 2014 12:38 pm

What if you try to use Get-VBRLibary commandlet, will the corresponding drive be listed?

Code: Select all
Get-VBRLibrary -name "Name of your drive"


Thanks.
v.Eremin
Veeam Software
 
Posts: 13290
Liked: 973 times
Joined: Fri Oct 26, 2012 3:28 pm
Full Name: Vladimir Eremin

Re: v8 Broke my Powershell Script

Veeam Logoby menthol » Thu Nov 20, 2014 1:20 pm

Thanks for that.

I've got it further than I had before... it will now try and duplicate the file, but it keeps getting stuck at 'WaitingTape'.

Even though it successfully moves the tape to the Free set.

It says the Tape is full, then says the tape currently in drive cannot be used for backup.
menthol
Influencer
 
Posts: 12
Liked: 2 times
Joined: Fri Jan 24, 2014 10:02 am
Full Name: Brad Wyatt

Re: v8 Broke my Powershell Script

Veeam Logoby v.Eremin » Thu Nov 20, 2014 1:28 pm

Just to be sure - will it work, if you perform the very same steps via GUI? Thanks.
v.Eremin
Veeam Software
 
Posts: 13290
Liked: 973 times
Joined: Fri Oct 26, 2012 3:28 pm
Full Name: Vladimir Eremin

Re: v8 Broke my Powershell Script

Veeam Logoby menthol » Thu Nov 20, 2014 1:33 pm

Yep it's working via GUI.

There seems to be a difference between marking the tape as free and MOVING it to the 'Free' media pool.

Marking it as free worked.
menthol
Influencer
 
Posts: 12
Liked: 2 times
Joined: Fri Jan 24, 2014 10:02 am
Full Name: Brad Wyatt

Re: v8 Broke my Powershell Script

Veeam Logoby v.Eremin » Thu Nov 20, 2014 1:43 pm

Two more thoughts. What happens if prior to executing job, you short erase a given medium (Erase-VBRTapeMedium)? What if you move a medium back to corresponding media pool after placing it inside "Free" one (Move-VBRTapeMedium)? Thanks.
v.Eremin
Veeam Software
 
Posts: 13290
Liked: 973 times
Joined: Fri Oct 26, 2012 3:28 pm
Full Name: Vladimir Eremin


Return to PowerShell



Who is online

Users browsing this forum: Yahoo [Bot] and 8 guests