Check for new MPs Action

Microsoft.SystemCenter.MPUpdate.CheckForMPUpdate (WriteActionModuleType)

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.SystemCenter.MPUpdateActionAccount
InputTypeSystem.TriggerData

Member Modules:

ID Module Type TypeId RunAs 
PerformCheckForMPUpdates WriteAction System.CommandExecuter Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
MPVersionFileUrlstring$Config/MPVersionFileUrl$MP Version File Url
TimeoutSecondsint$Config/TimeoutSeconds$Timeout Seconds

Source Code:

<WriteActionModuleType ID="Microsoft.SystemCenter.MPUpdate.CheckForMPUpdate" Accessibility="Internal" RunAs="Microsoft.SystemCenter.MPUpdateActionAccount" Batching="false">
<Configuration>
<xsd:element name="MPVersionFileUrl" type="xsd:string"/>
<xsd:element name="DatabaseServerName" type="xsd:string"/>
<xsd:element name="DatabaseName" type="xsd:string"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="MPVersionFileUrl" Selector="$Config/MPVersionFileUrl$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="PerformCheckForMPUpdates" TypeID="System!System.CommandExecuter">
<ApplicationName>%windir%\system32\cscript.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>//nologo $file/MPUpdate.js$ $Config/MPVersionFileUrl$ $Config/DatabaseServerName$ $Config/DatabaseName$</CommandLine>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>MPUpdate.js</Name>
<Contents><Script>
//Copyright (c) Microsoft Corporation. All rights reserved.
//*************************************************************************
// $ScriptName: MPUpdate $
//
// Purpose - Check for new versions of Management Packs
//
// Parameters - 0 - Management Pack Catalog File URL
// 1 - OpsMgr Database Server Name
// 2 - OpsMgr Database Name
//
//*************************************************************************

var msgSource = "MPUpdate";

// Event Messages
// Download failure
var E_NO_INTERNET_CONNECTION = 1000;
var E_NO_INTERNET_CONNECTION_MSG = "Could not retrieve Management Pack Catalog file: ";

// XML Parsing failure
var E_NO_PARSE_FAILED = 1001;
var E_NO_PARSE_FAILED_MSG = "Could not parse Management Pack Catalog file: ";

// XML Parsing failure
var E_NO_GENERAL_FAILURE = 1002;
var E_NO_GENERAL_FAILURE_MSG = "General failure: ";

// Later version of MP found
var LATER_VERSION_MP_FOUND = 2000;

var EVENT_TYPE_SUCCESS = 0;
var EVENT_TYPE_ERROR = 1;
var EVENT_TYPE_WARNING = 2;
var EVENT_TYPE_INFORMATION = 4;

var adStateOpen = 1;

var oAPI = new ActiveXObject("MOM.ScriptAPI");

//Check the input arguments
var oArgs = WScript.Arguments;

if (oArgs.Length != 3)
{
WScript.Quit(-1);
}

var mpCatalogFileUrl = oArgs(0);
var opsMgrDBServerName = oArgs(1);
var opsMgrDBName = oArgs(2);

// Check if we have access to the Internet
// Log an error if we do not have access to the internet

// Download the MP Catalog file url
var mpCatalogFile = GetMPCatalogFile(oArgs(0));

var mpDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");

// Load the MP Catalog file
LoadCatalogFile(mpCatalogFile)

// Connect to the database and the list and versions of the MPs
GetMPInfo(opsMgrDBServerName, opsMgrDBName);

function GetMPCatalogFile(mpCatalogFileUrl)
{
// Connect to the internet and get the MP Catalog file
var xmlHttp = new ActiveXObject("Microsoft.XmlHttp");

xmlHttp.open("GET", mpCatalogFileUrl, false);
xmlHttp.send();

if (xmlHttp.Status != 200)
{
// Log an error indicating that we could not connect to the internet
CreateEvent(msgSource, E_NO_INTERNET_CONNECTION, EVENT_TYPE_ERROR, E_NO_INTERNET_CONNECTION_MSG + mpCatalogFileUrl);
WScript.Quit(-1);
}

return xmlHttp.responseText;
}

function LoadCatalogFile(fileName)
{
try
{
mpDoc.loadXML(fileName);

if (mpDoc.parseError.errorCode != 0)
{
var myErr = mpDoc.parseError;

// Log an error - parsing failed
CreateEvent(msgSource, E_NO_PARSE_FAILED, EVENT_TYPE_ERROR, E_NO_PARSE_FAILED_MSG + mpCatalogFileUrl + " : " + myErr.reason);
WScript.Quit(-1);
}

if (mpDoc.documentElement.nodeName != "ManagementPacks")
{
// Log an error - parsing failed
CreateEvent(msgSource, E_NO_PARSE_FAILED, EVENT_TYPE_ERROR, E_NO_PARSE_FAILED_MSG + mpCatalogFileUrl);
WScript.Quit(-1);
}
}
catch(err)
{
CreateEvent(msgSource, E_NO_GENERAL_FAILURE, EVENT_TYPE_ERROR, E_NO_GENERAL_FAILURE_MSG + err.message);
WScript.Quit(-1);
}
}

function GetLatestSqlNativeClientDriver()
{
var objShell = new ActiveXObject("WScript.Shell");
var objExec = objShell.Exec("REG QUERY HKEY_LOCAL_MACHINE\\Software\\ODBC\\ODBCINST.INI");
var subKeysStr = objExec.StdOut.ReadAll();
var subKeys = subKeysStr.split("\n");
var strDriverName = "SQLOLEDB";
for (var i = 1; i &lt; subKeys.length; ++i)
{
if(subKeys[i].indexOf("SQL Server Native Client") &gt; 0)
{
var strRegistryPath = subKeys[i].substring(0,subKeys[i].length-1)+ "\\Driver";
var strRegistryValue = objShell.RegRead(strRegistryPath);
strRegistryValue = strRegistryValue.substring(strRegistryValue.lastIndexOf("\\")+1);
var indexOfDot = strRegistryValue.indexOf(".");
strDriverName = strRegistryValue.substring(0,indexOfDot);
}
}

return strDriverName;
}

function GetMPInfo(opsMgrDBServerName, opsMgrDBName)
{
// Create the ADO connection object
var cnADOConnection = new ActiveXObject("ADODB.Connection")

// Create a recordset Object
var rst = WScript.CreateObject("ADODB.Recordset");

// Array of Newer MPs
var newerMPs = "";

try
{
var connectionString;
var strSqlDriver;
strSqlDriver = GetLatestSqlNativeClientDriver();
connectionString = "Provider=" + strSqlDriver + ";Server=" + opsMgrDBServerName + ";" +
"Integrated Security=SSPI;Initial Catalog=" + opsMgrDBName;

cnADOConnection.Open(connectionString);
cnADOConnection.CommandTimeout = 300;

rst = cnADOConnection.Execute("select * from ManagementPack")

// Compare each MP against the MP Catalog
while (!rst.EOF)
{
var mpName = rst.fields("MPName");
var currentVersion = rst.Fields("MPVersion");

var latestVersion;

latestVersion = GetMPVersionFromCatalogFile(mpName);

if (latestVersion != null)
{
var latestVersionParts = latestVersion.split(".");
var currentVersionParts = currentVersion.Value.split(".");

// Now compare the versions
if (latestVersionParts.length == currentVersionParts.length)
{
// compare the respective parts
for (versionPartIndex = 0; versionPartIndex &lt; latestVersionParts.length; versionPartIndex++)
{
var strlatestVersionPart = latestVersionParts[versionPartIndex];
var strcurrentVersionPart = currentVersionParts[versionPartIndex];

var latestVersionPart = parseInt(strlatestVersionPart);
var currentVersionPart = parseInt(strcurrentVersionPart);

if (latestVersionPart &lt; currentVersionPart)
{
break;
}
else if (latestVersionPart &gt; currentVersionPart)
{
// log event indicating the name of the newer MP and the version
CreateEvent(msgSource, LATER_VERSION_MP_FOUND, EVENT_TYPE_INFORMATION, mpName + " " + latestVersion);
break;
}
}
}
}
rst.MoveNext();
}
}
catch(err)
{
CreateEvent(msgSource, E_NO_GENERAL_FAILURE, EVENT_TYPE_ERROR, E_NO_GENERAL_FAILURE_MSG + err.message);
}
finally
{
if (rst.State == adStateOpen)
{
rst.Close();
rst = null;
}
if (cnADOConnection.State == adStateOpen)
{
cnADOConnection.Close();
cnADOConnection = null;
}
}
}

function GetMPVersionFromCatalogFile(mpName)
{
var latestVersion = null;

// Parse the catalog file and find the MP version corresponding to the MP name
var xPathQuery = "//ManagementPacks//MPDownload//MP//ID[.='" + mpName + "']";

var mpIdNode = mpDoc.selectSingleNode(xPathQuery);

if (mpIdNode != null)
{
var mpElementNode = mpIdNode.parentNode;
var nodeList = mpElementNode.selectNodes("./Version");

if (nodeList.length == 1)
{
latestVersion = nodeList.item(0).text;
}
}

return latestVersion;
}

function CreateEvent(strSource, lngEventID, lngEventType, strMsg)
{
oAPI.LogScriptEvent(strSource, lngEventID, lngEventType, strMsg);
}
</Script></Contents>
<Unicode>false</Unicode>
</File>
</Files>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="PerformCheckForMPUpdates"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.TriggerData</InputType>
</WriteActionModuleType>