RPS Packaging Manifest
Last updated on April 20, 2021.
This document describes the Packaging Manifest of the Rapid Provisioning System (RPS).
What is the Package Manifest File
When creating the ZIP file that houses all the data needed to install a package, there also needs to be a package manifest file created with the package. The manifest file lives at the root level of the Zip Archive and has a name of "Package.RPS". This file contains the information such as the Operating System (OS) Type, OS Architecture, Package name, etc. This information is used by RPS to apply the patches and to determine what targets are to receive the packages.
Structure of the Package Manifest File
The internal structure of the Package Manifest file is XML with a predetermined set of elements. The values contained in these elements will be the details applied to the package to be used to transfer, apply, and manage the packages on an RPS enabled system.
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest version="1.0">
<PackageName></PackageName>
<PackageVersion></PackageVersion>
<PackageClassification></PackageClassification>
<OsVersion></OsVersion>
<Architecture></Architecture>
<OsType></OsType>
<ProductName></ProductName>
<ProductType></ProductType>
<ProductVersion></ProductVersion>
<ProductId>ProductId
<InstallerFileName> </InstallerFileName>
<SupressReboot></SupressReboot>
<Products />
<UninstallArguments> </UninstallArguments>
<InstallArguments />
<Description> </Description>
<MsCatalogProductName> </MsCatalogProductName>
<MsCatalogTitle />
<MsCatalogId />
<MsCatalogUpdateId />
<MsCatalogSupercededByKbIds />
<MsCatalogLinkUrls />
</PackageManifest>
Package Manifest XML Attributes
Version Attribute
Type: String
IsRequired: Yes
This is the version of the package manager that will process this manifest file.
Currently the following versions exist:
- 1.0
<PackageManifest version="1.0">
Package Manifest XML Elements
PackageName Element
Type: String
IsRequired: Yes
This is the name of the package to be used by RPS. This name is used in combination with the PackageVersion element to create a unique name.
PackageVersion Element
Type: String
IsRequired: Yes
This is the version of the package to be used by RPS. This name is used in combination with the PackageName element to create a unique name. The value stored in here typically follows Semantic Versioning.
PackageClassification Element
Type: String
IsRequired: Yes
The classification of the package. The acceptable values should be from a preset list of:
Security
Critical
Definition
New
Script
General
OsVersion Element
Type: String
IsRequired: Yes
The Version of the operating system to whom the patch is applicable. A wildcard (*) can be passed into target "any" OS version. Partial wildcard matching is also allowed, which means it will match the values before and after the wildcard. For example:
10.* would match 10.0.0.2, 10.2, etc because they all start with "10."
*.1 would match 10.0.1, 10.1, etc because it they all end with ".1"
Note
The package will only be assigned to Targets who have an OsVersion property that passes the match test on the value provided in this field in addition to the Architecture and OsType values.
Architecture Element
Type: String
IsRequired: Yes
The architecture of the operating system to whom the patch is applicable. A wildcard (*) can be passed into target "any" OS version. Acceptable values are:
x86
x64
*
Note
The package will only be assigned to Targets who have an Architecture property that passes the match test on the value provided in this field in addition to the OsVersion and OsType values.
OsType Element
Type: String
IsRequired: Yes
The type of the operating system. Currently these values should be Windows or Linux.
Note
The package will only be assigned to Targets who have an OsType property that passes the match test on the value provided in this field in addition to the OsVersion and Architecture values.
ProductType Element
Type: String
IsRequired: Yes
The ProductType of the package. This value will be to determine the type of package being installed.
Acceptable values are:
WindowsHotfix
WindowsMsi
WindowsExe
WindowsCabinet
ScriptFramework
LinuxRpm
ProductName Element
Type: String
IsRequired: Conditionally, if ProductType is WindowsMsi or WindowsExe
The name of the product. This value will be used when registering the product with the OS, if needed.
ProductVersion Element
Type: String
IsRequired: Conditionally, if ProductType is WindowsMsi or WindowsExe
The Version of the product. This value will be used when registering the package with the OS, if needed.
ProductId Element
Type: String
IsRequired: Conditionally, if ProductType is WindowsMsi, WindowsExe, WindowsHotfix, or WindowsCabinet
The ID of the product. This value will be used when registering the product with the OS, if needed.
InstallerFileName Element
Type: String
IsRequired: Yes
The name of the file inside of the package zip archive that should be executed to begin the install/uninstall process. This file should live on the root of the package.
SupressReboot Element
Type: Boolean (True/False)
IsRequired: Yes
Whether or not that the machine should reboot after installing/uninstalling the package.
Products Element
Type: Collection of Strings
IsRequired: No
A collection of products a package affects/supports. For example, a Windows update might patch SQL server, Windows 10, and Visual Studio.
<Products>
<String>SQL Server</String>
<String>Windows 10</String>
<String>Visual Studio</String>
</Products>
Conditions Element
Type: Collection of PackageAssignmentCondition
IsRequired: No
A collection of custom conditions for filtering package assignments to a target.
<Conditions>
<PackageAssignmentCondition>
<Property>IsApp</Property>
<Operator>Eq</Operator>
<Value>True</Value>
</PackageAssignmentCondition>
</Conditions>
Known Issue
Package Manifest Conditions element Value field does not support multiple values separated by the pipe delimiter |
Error Details: The following PackageManifest code snippet is an example using pipe delimiter | in Conditions, which will fail:
<InstallerFileName>opera.msi</InstallerFileName> <Conditions> <PackageAssignmentCondition> <Property>Name</Property> <Operator>Eq</Operator> <Value>AD.master.rps|APP.master.rps</Value> </PackageAssignmentCondition> </Conditions>
The resulting behavior: Only the first Value listed will be assigned to; all other Values after the pipe delimiter | are ignored.
In this particular example, AD.master.rps is assigned the opera Package, because it was listed before the pipe delimiter | . APP.master.rps is not assigned the opera Package, because it was listed after the pipe delimiter | .
Current Workaround for pipe delimiter | : Utilize the Match Operator
<Operator>Match</Operator>
, with each value in the Value field wrapped in parentheses () and with a trailing question mark ? . Example:<Conditions> <PackageAssignmentCondition> <Property>ComputerName</Property> <Operator>Match</Operator> <Value>(NFA)?(WNM)?(WNMA)?</Value> </PackageAssignmentCondition> </Conditions>
In this particular example, a Target with a Property of ComputerName will be assigned if its Value contains NFA, WNM, and/or WNMA. This implementation only requires a partial Value match.
For an exact Value match, the full string in the Value field must be enclosed with a caret ^ and a dollar sign $ . Example:
<Conditions> <PackageAssignmentCondition> <Property>ComputerName</Property> <Operator>Match</Operator> <Value>^(NFA)?(WNM)?(WNMA)?$</Value> </PackageAssignmentCondition> </Conditions>
In this particular example, a Target with a Property of ComputerName will be assigned if its Value contains NFA, WNM, and WNMA.
UninstallArguments Element
Type: String
IsRequired: No
Arguments passed into when executing the InstallerFileName in order to uninstall the package.
InstallArguments Element
Type: String
IsRequired: No
Arguments passed into when executing the InstallerFileName in order to install the package.
Description Element
Type: String
IsRequired: No
A description of the package and what it's installing.
MsCatalogProductName Element
Type: String
IsRequired: No
The catalog product name of the package. Used/Populated by updates that come from a Microsoft Catalog.
MsCatalogTitle Element
Type: String
IsRequired: No
The catalog title of the package. Used/Populated by updates that come from a Microsoft Catalog.
MsCatalogId Element
Type: String
IsRequired: No
The catalog ID of the package. Used/Populated by updates that come from a Microsoft Catalog.
MsCatalogUpdateId Element
Type: String
IsRequired: No
The catalog update ID of the package. Used/Populated by updates that come from a Microsoft Catalog.
MsCatalogSupercededByKbIds Element
Type: Collection of Strings
IsRequired: No
The catalog IDs of KBs that supersede the package. Used/Populated by updates that come from a Microsoft Catalog.
<MsCatalogSupercededByKbIds>
<String>4532693</String>
<String>4532695</String>
<String>4528760</String>
</MsCatalogSupercededByKbIds>
MsCatalogLinkUrls Element
Type: Collection of Strings
IsRequired: No
The catalog link URLs for the package. Used/Populated by updates that come from a Microsoft Catalog.
<MsCatalogLinkUrls>
<String>https://www.catalog.update.microsoft.com/ScopedViewInline.aspx?updateid=db57861b-e22b-4107-8c78-1ae8d63310d2</String>
<String>https://www.catalog.update.microsoft.com/ScopedViewInline.aspx?updateid=567d7a0d-7f11-4c75-ba80-e7dd1b88fbe3</String>
<String>https://www.catalog.update.microsoft.com/ScopedViewInline.aspx?updateid=5f46c0b9-c57c-484e-b6e5-80dded34bfa3</String>
</MsCatalogLinkUrls>
Get-RPSPackageManifest
The cmdlet Get-RPSPackageManifest will return the XML Schema for the package manifest file. The cmdlet takes one optional parameter Version. The only valid value that is currently supported is '1.0'. Without the version parameter, this cmdlet will return the most current version of the manifest.
$currentSchema = Get-RPSPackageManifest
Test-RPSPackageManifest
The cmdlet Test-RPSPackageManifest will take the path to a package manifest file and validate the file XML format. The cmdlet takes two parameters: PackageFilePath and, optionally, SchemaVersion. The PackageFilePath parameter is the path to the package manifest file to be validated. The optional SchemaVersion is used to specify a package manifest version to validate against. Currently only '1.0' is a valid value. If the SchemaVersion is not provided, the latest version of the manifest schema will be used to perform the validation.
If the manifest is valid, the cmdlet will return true. Otherwise, if the manifest is invalid, the cmdlet will return false and write out a list of validation exceptions.
$result = Test-RPSPackageManifest -PatchFilePath c:\package\manifest.xml
Examples
3rd Party Application Package Manifest
This is an example of a manifest used to install Firefox to a Windows Machine:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest version="1.0">
<PackageName>Firefox</PackageName>
<PackageVersion>1.0.0</PackageVersion>
<PackageClassification>General</PackageClassification>
<OsVersion>*</OsVersion>
<Architecture>x64</Architecture>
<OsType>Windows</OsType>
<ProductName>Mozilla Firefox 70.0 (x64 en-US)</ProductName>
<ProductType>WindowsMsi</ProductType>
<ProductVersion>70.0</ProductVersion>
<ProductId>{74994757-3b19-4c54-afe4-ae84e398a3f7}</ProductId>
<InstallerFileName>firefox.msi</InstallerFileName>
<SupressReboot>true</SupressReboot>
<Products />
<UninstallArguments>/s</UninstallArguments>
<InstallArguments />
<Description>This will install Firefox v70 on a All windows x64 bit machines</Description>
<MsCatalogProductName>Firefox70</MsCatalogProductName>
<MsCatalogTitle />
<MsCatalogId />
<MsCatalogUpdateId />
<MsCatalogSupercededByKbIds />
<MsCatalogLinkUrls />
</PackageManifest>
Linux Software Package Manifest
This is an example of a manifest used to install Socat to a Linux Machine:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest version="1.0">
<PackageName>socat</PackageName>
<PackageVersion>1.7.3.2</PackageVersion>
<Description>This contains the install for Socat</Description>
<OsVersion>*</OsVersion>
<Architecture>x64</Architecture>
<OsType>Linux</OsType>
<MsCatalogProductName />
<MsCatalogTitle />
<MsCatalogId />
<Products />
<MsCatalogUpdateId />
<PackageClassification>General</PackageClassification>
<MsCatalogSupercededByKbIds />
<MsCatalogLinkUrls />
<UninstallArguments>/s</UninstallArguments>
<InstallArguments />
<SupressReboot>true</SupressReboot>
<ProductName>socat</ProductName>
<ProductType>LinuxRpm</ProductType>
<ProductVersion>1.7.3.2</ProductVersion>
<ProductId>socat</ProductId>
<InstallerFileName>socat-1.7.3.2-2.el7.x86_64.rpm</InstallerFileName>
</PackageManifest>
Appliance Package Manifest
This package will update an ESX environment:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest version="1.0">
<PackageName>windows8.1-kb4519990-x64</PackageName>
<PackageVersion>2019.10.8</PackageVersion>
<Description>This is a test package</Description>
<OsVersion>*</OsVersion>
<Architecture>x64</Architecture>
<OsType>Windows</OsType>
<MsCatalogProductName>kb4519990</MsCatalogProductName>
<MsCatalogTitle />
<MsCatalogId />
<Products />
<MsCatalogUpdateId />
<PackageClassification>General</PackageClassification>
<MsCatalogSupercededByKbIds />
<MsCatalogLinkUrls />
<UninstallArguments>/s</UninstallArguments>
<InstallArguments />
<SupressReboot>false</SupressReboot>
<ProductName>windows8.1-kb4519990-x64</ProductName>
<ProductType>WindowsHotfix</ProductType>
<ProductVersion>2019.10.8</ProductVersion>
<ProductId>kb4519990</ProductId>
<InstallerFileName>windows8.1-kb4519990-x64.msu</InstallerFileName>
</PackageManifest>