Skip to content

Commit

Permalink
feat: support for AMT_AlarmClockService and IPS_AlarmClockOccurrence
Browse files Browse the repository at this point in the history
  • Loading branch information
orinem authored and rsdmike committed Aug 10, 2022
1 parent 649377b commit e53e1d6
Show file tree
Hide file tree
Showing 13 changed files with 187 additions and 19 deletions.
3 changes: 2 additions & 1 deletion src/WSMan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ export enum WSManErrors {
CERTIFICATE_BLOB = 'missing certificateBlob',
MP_SERVER = 'missing mpServer',
REMOTE_ACCESS_POLICY_RULE = 'missing remoteAccessPolicyRule',
BOOT_SETTING_DATA = 'missing bootSettingData'
BOOT_SETTING_DATA = 'missing bootSettingData',
ADD_ALARM_DATA = 'missing alarmClockOccurrence'
}

export class WSManMessageCreator {
Expand Down
3 changes: 2 additions & 1 deletion src/amt/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ export enum Actions {
SET_ADMIN_ACL_ENTRY_EX = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AuthorizationService/SetAdminAclEntryEx',
GET_LOW_ACCURACY_TIME_SYNCH = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_TimeSynchronizationService/GetLowAccuracyTimeSynch',
SET_HIGH_ACCURACY_TIME_SYNCH = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_TimeSynchronizationService/SetHighAccuracyTimeSynch',
ADD_WIFI_SETTINGS = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_WiFiPortConfigurationService/AddWiFiSettings'
ADD_WIFI_SETTINGS = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_WiFiPortConfigurationService/AddWiFiSettings',
ADD_ALARM = 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService/AddAlarm'
}
const REQUEST_STATE_CHANGE = (className: string): string => { return `http://intel.com/wbem/wscim/1/amt-schema/1/${className}/RequestStateChange` }

Expand Down
3 changes: 2 additions & 1 deletion src/amt/classes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ export enum Classes {
AMT_TLS_CREDENTIAL_CONTEXT = 'AMT_TLSCredentialContext',
AMT_PUBLIC_PRIVATE_KEY_PAIR = 'AMT_PublicPrivateKeyPair',
AMT_TLS_SETTING_DATA = 'AMT_TLSSettingData',
AMT_REMOTE_ACCESS_POLICY_APPLIES_TO_MPS = 'AMT_RemoteAccessPolicyAppliesToMPS'
AMT_REMOTE_ACCESS_POLICY_APPLIES_TO_MPS = 'AMT_RemoteAccessPolicyAppliesToMPS',
AMT_ALARM_CLOCK_SERVICE = 'AMT_AlarmClockService'
}
38 changes: 38 additions & 0 deletions src/amt/messages.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -610,4 +610,42 @@ describe('AMT Tests', () => {
expect(() => { amtClass.RemoteAccessPolicyAppliesToMPS(Methods.ADD_MPS as any, null, null) }).toThrow(WSManErrors.UNSUPPORTED_METHOD)
})
})
describe('AlarmClockService Tests', () => {
it('should return a valid amt_AlarmClockService ADD_ALARM wsman message', () => {
const instanceID = 'Instance'
const elementName = 'Alarm instance name'
// Start time must be on the minute - seconds must be 00
const startTime = '2022-12-31T23:59:00Z'
// The interval is in minutes
const minutes = 59
const hours = 23
const days = 1
const interval = minutes + hours * 60 + days * 1440
const deleteOnCompletion = true
let correctResponse = `${xmlHeader}${envelope}http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService/AddAlarm</a:Action><a:To>/wsman</a:To><w:ResourceURI>http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService</w:ResourceURI><a:MessageID>0</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header>`
correctResponse += '<Body><p:AddAlarm_INPUT xmlns:p="http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService"><p:AlarmTemplate>'
correctResponse += `<s:InstanceID xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${instanceID}</s:InstanceID>`
correctResponse += `<s:ElementName xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${elementName}</s:ElementName>`
correctResponse += `<s:StartTime xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence"><p:Datetime xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/common">${startTime}</p:Datetime></s:StartTime>`
correctResponse += `<s:Interval xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence"><p:Interval xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/common">P${days}DT${hours}H${minutes}M</p:Interval></s:Interval>`
correctResponse += `<s:DeleteOnCompletion xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${String(deleteOnCompletion)}</s:DeleteOnCompletion>`
correctResponse += '</p:AlarmTemplate></p:AddAlarm_INPUT></Body></Envelope>'
const response = amtClass.AlarmClockService(Methods.ADD_ALARM, { InstanceID: instanceID, ElementName: elementName, StartTime: new Date(startTime), Interval: interval, DeleteOnCompletion: deleteOnCompletion })
expect(response).toEqual(correctResponse)
})
it('should throw error if data is missing from amt_AlarmClockService AddAlarm method', () => {
expect(() => { amtClass.AlarmClockService(Methods.ADD_ALARM, null) }).toThrow(WSManErrors.ADD_ALARM_DATA)
})
it('should return a valid GET message ', () => {
const correctResponse = `${xmlHeader}${envelope}http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>/wsman</a:To><w:ResourceURI>http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService</w:ResourceURI><a:MessageID>${(messageId++).toString()}</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body></Body></Envelope>`
const response = amtClass.AlarmClockService(Methods.GET, null)
expect(response).toEqual(correctResponse)
})
it('should throw error if an unsupported method is called', () => {
expect(() => { amtClass.AlarmClockService(Methods.PUT as any) }).toThrow(WSManErrors.UNSUPPORTED_METHOD)
expect(() => { amtClass.AlarmClockService(Methods.ENUMERATE as any) }).toThrow(WSManErrors.UNSUPPORTED_METHOD)
expect(() => { amtClass.AlarmClockService(Methods.PULL as any) }).toThrow(WSManErrors.UNSUPPORTED_METHOD)
expect(() => { amtClass.AlarmClockService(Methods.DELETE as any) }).toThrow(WSManErrors.UNSUPPORTED_METHOD)
})
})
})
29 changes: 29 additions & 0 deletions src/amt/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { EthernetPortSettings, MPServer, RemoteAccessPolicyRule, EnvironmentDete
import { REQUEST_STATE_CHANGE } from './actions'
import { Classes, Methods, Actions } from './'
import { WiFiEndpointSettings } from '../models/cim_models'
import { AlarmClockOccurrence } from '../ips/models'

type AllActions = Actions

Expand Down Expand Up @@ -425,4 +426,32 @@ export class Messages {
throw new Error(WSManErrors.UNSUPPORTED_METHOD)
}
}

AlarmClockService = (method: Methods.ADD_ALARM | Methods.GET, data?: AlarmClockOccurrence | any): string => {
switch (method) {
case Methods.GET:
return this.amtSwitch({ method, class: Classes.AMT_ALARM_CLOCK_SERVICE })
case Methods.ADD_ALARM: {
if (data == null) { throw new Error(WSManErrors.ADD_ALARM_DATA) }
const header = this.wsmanMessageCreator.createHeader(Actions.ADD_ALARM, `${this.resourceUriBase}${Classes.AMT_ALARM_CLOCK_SERVICE}`)
// toIsoString() is adding milliseconds... remove them by taking everything before the '.' and adding back the 'Z'
const startTime = data.StartTime.toISOString().split('.')[0] + 'Z'
let body = `<Body><p:AddAlarm_INPUT xmlns:p="http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService"><p:AlarmTemplate><s:InstanceID xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${data.InstanceID}</s:InstanceID>`
if (data.ElementName != null) {
body += `<s:ElementName xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${data.ElementName}</s:ElementName>`
}
body += `<s:StartTime xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence"><p:Datetime xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/common">${startTime}</p:Datetime></s:StartTime>`
if (data.Interval != null) {
const minutes: number = data.Interval % 60
const hours: number = Math.floor(data.Interval / 60) % 24
const days: number = Math.floor(data.Interval / 1440)
body += `<s:Interval xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence"><p:Interval xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/common">P${days}DT${hours}H${minutes}M</p:Interval></s:Interval>`
}
body += `<s:DeleteOnCompletion xmlns:s="http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence">${String(data.DeleteOnCompletion)}</s:DeleteOnCompletion></p:AlarmTemplate></p:AddAlarm_INPUT></Body>`
return this.wsmanMessageCreator.createXml(header, body)
}
default:
throw new Error(WSManErrors.UNSUPPORTED_METHOD)
}
}
}
3 changes: 2 additions & 1 deletion src/amt/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@ export enum Methods {
GET_LOW_ACCURACY_TIME_SYNCH = 'GetLowAccuracyTimeSynch',
SET_HIGH_ACCURACY_TIME_SYNCH = 'SetHighAccuracyTimeSynch',
GENERATE_KEY_PAIR = 'GenerateKeyPair',
ADD_WIFI_SETTINGS = 'AddWiFiSettings'
ADD_WIFI_SETTINGS = 'AddWiFiSettings',
ADD_ALARM = 'AddAlarm'
}
2 changes: 2 additions & 0 deletions src/amt/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,3 +352,5 @@ export interface RemoteAccessPolicyAppliesToMPS extends CIM.Models.PolicySetAppl
OrderOfAccess: number
MpsType: number
}

export interface AlarmClockService extends CIM.Models.Service { }
3 changes: 2 additions & 1 deletion src/ips/classes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@

export enum Classes {
IPS_OPT_IN_SERVICE = 'IPS_OptInService',
IPS_HOST_BASED_SETUP_SERVICE = 'IPS_HostBasedSetupService'
IPS_HOST_BASED_SETUP_SERVICE = 'IPS_HostBasedSetupService',
IPS_ALARM_CLOCK_OCCURRENCE = 'IPS_AlarmClockOccurrence'
}
Loading

0 comments on commit e53e1d6

Please sign in to comment.