Lenovo Warranty Information Lookup
To continue with the theme of my last post, I’m going to show how to gather the warranty information for Lenovo Servers. This was a bit tricky as this isn’t an API call, but more of a website parsing.
Getting the Lenovo Server information
To be able to perform this warranty lookup, the server information will need to be retrieved, and what a better way than getting it from the VMhosts themselves.
$Manufacturer = @() $Clusters = Get-Cluster Foreach ($cluster in $clusters){ $VMhosts = $cluster | Get-vmhost foreach ($VMhost in $VMhosts){ $line = "" | Select VMhost, Manufacturer $line.VMhost = $VMhost.name $line.Manufacturer = $VMhost.Manufacturer $Manufacturer += $line } } $Manufacturer | Sort-Object -Property Manufacturer
This gathers all of the Manufacturer information of all of the VMhosts within the clusters in vSphere. So now you can either just target the VMhosts or clusters that contain the Lenovo hardware.
Getting the serial number from the Host
This is a simple one liner that gets the serial number
$cli = Get-vmhost $VMhost | Get-EsxCli $serialno = $cli.hardware.platform.get().serialnumber
Get model information to query the warranty site
I don’t normally use regular expression, just because the syntax of it is just confusing. So i have been forcing myself to make use of it more often as it can help to save line of code.
$Manufacturer = @() $Clusters = Get-Cluster Foreach ($cluster in $clusters){ $VMhosts = $cluster | Get-vmhost foreach ($VMhost in $VMhosts){ $line = "" | Select VMhost, Manufacturer, Model, Class, MachineType, ShortModel [regex]$regexClass = "\d{4}" [regex]$regexMachType = "\d{4}[A-Z][A-Z]\d{1}" [regex]$regexModel = "[x]\d{3}\s[A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z]\s[A-Za-z][A-Za-z][A-Za-z][A-Za-z]" $line.VMhost = $VMhost.name $line.Manufacturer = $VMhost.Manufacturer $line.model = $vmhost.Model $line.Class = ($regexClass.Matches($($vmhost.model))).Value $line.MachineType = ($regexMachType.Matches($($vmhost.model))).Value $line.ShortModel = ((($regexModel.Matches($($vmhost.model))).Value).replace(" ","-")).ToLower() $Manufacturer += $line } } $Manufacturer | Sort-Object -Property Manufacturer
This updated code will pull the required information to be able to put the URL together to query for the warranty information. The regex code is based on the models that my environment has which are Flex System x440 Compute Node -[7917AC1]- and Flex System x240 Compute Node -[8737AC1]-. You mileage may differ.
Querying for the warranty dates
The format for the URL that has the warranty information is as follows.
https://datacentersupport.lenovo.com/us/en/products/servers/flex/$($shortmodel)/$($class)/$($machinetype)/$($serialno)/warranty
As you can see we have all of the information gather via the previous code snippets. Now we just need to put it all together to make the proper URL, invoke the web request and parse the content for the information we are looking for.
$Manufacturer = @() $Clusters = Get-Cluster kyvmc08 Foreach ($cluster in $clusters){ $VMhosts = $cluster | Get-vmhost foreach ($VMhost in $VMhosts){ $line = "" | Select VMhost, Manufacturer, SerialNo, Model, Class, MachineType, ShortModel, WarrantyStart, WarrantyEnd $cli = Get-vmhost $VMhost | Get-EsxCli $serialno = $cli.hardware.platform.get().serialnumber [regex]$regexClass = "\d{4}" [regex]$regexMachType = "\d{4}[A-Z][A-Z]\d{1}" [regex]$regexModel = "[x]\d{3}\s[A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z]\s[A-Za-z][A-Za-z][A-Za-z][A-Za-z]" $shortmodel = ((($regexModel.Matches($($vmhost.model))).Value).replace(" ","-")).ToLower() $class = ($regexClass.Matches($($vmhost.model))).Value $machinetype = ($regexMachType.Matches($($vmhost.model))).Value $url = "https://datacentersupport.lenovo.com/us/en/products/servers/flex/$($shortmodel)/$($class)/$($machinetype)/$($serialno)/warranty" $WebRequestResult = Invoke-WebRequest -Uri $URL $date = (($WebRequestResult.AllElements | Select innerHTML | Select-String -Pattern $serialno) | Select -Skip 1 | Select -First 1) | Select-String "\d{4}-\d{2}-\d{2}" [regex]$regex = "\d{4}-\d{2}-\d{2}" $warrantydates = $regex.Matches($date) | Foreach {$_.value} | Select -Skip 1 | Select -First 2 $WarrantyStart = $warrantydates[1] $WarrantyEnd = $warrantydates[0] $line.VMhost = $VMhost.name $line.Manufacturer = $VMhost.Manufacturer $line.SerialNo = $serialno $line.model = $vmhost.Model $line.Class = $class $line.MachineType = $machinetype $line.ShortModel = $shortmodel $line.WarrantyStart = $WarrantyStart $line.WarrantyEnd = $WarrantyEnd $Manufacturer += $line } } $Manufacturer | Sort-Object -Property Manufacturer | Ft -AutoSize
Below a sample of the output from the script.
– Stuart