Implement support for ChangeDUState method

This commit is contained in:
Zaid Abdulla committed 2021-08-02 13:12:12 -07:00
1 parent 6ce91df127
commit 716f2c6df3
3 files changed
+527 -6

No files matched your search

+129
View File
@@ -48,6 +48,9 @@ import {
GetRPCMethodsRequest,
RequestDownloadRequest,
AcsResponse,
ChangeDUState,
ChangeDUStateResponse,
DUStateChangeCompleteRequest,
} from "./types";
import Path from "./common/path";
@@ -573,6 +576,29 @@ function DownloadResponse(xml: Element): DownloadResponse {
};
}
function ChangeDUState(methodRequest: ChangeDUState): string {
const operations = methodRequest.operations.map((op) => {
if (op.operationType === "install")
return `<Operations xsi:type="cwmp:InstallOpStruct"><UUID>${op.uuid}</UUID><URL>${op.url}</URL><ExecutionEnvRef>${op.executionEnvRef}</ExecutionEnvRef><Username>${op.username}</Username><Password>${op.password}</Password></Operations>`;
else if (op.operationType === "update")
return `<Operations xsi:type="cwmp:UpdateOpStruct"><UUID>${op.uuid}</UUID><URL>${op.url}</URL><Version>${op.version}</Version><Username>${op.username}</Username><Password>${op.password}</Password></Operations>`;
else if (op.operationType === "uninstall")
return `<Operations xsi:type="cwmp:UninstallOpStruct"><UUID>${op.uuid}</UUID><Version>${op.version}</Version><ExecutionEnvRef>${op.executionEnvRef}</ExecutionEnvRef></Operations>`;
return "";
});
return `<cwmp:ChangeDUState><CommandKey>${
methodRequest.commandKey || ""
}</CommandKey>${operations.join("")}</cwmp:ChangeDUState>`;
}
function ChangeDUStateResponse(): ChangeDUStateResponse {
return {
name: "ChangeDUStateResponse",
};
}
function Inform(xml: Element): InformRequest {
let retryCount: number, evnt: string[];
let parameterList: [Path, string | number | boolean, string][];
@@ -719,6 +745,97 @@ function TransferCompleteResponse(): string {
return "<cwmp:TransferCompleteResponse></cwmp:TransferCompleteResponse>";
}
function DUStateChangeComplete(xml: Element): DUStateChangeCompleteRequest {
let commandKey: string,
results: DUStateChangeCompleteRequest["results"],
res: DUStateChangeCompleteRequest["results"][0];
for (const c of xml.children) {
switch (c.localName) {
case "CommandKey":
commandKey = c.text;
break;
case "Results":
if (!results) results = [];
res = {
uuid: null,
deploymentUnitRef: null,
version: null,
currentState: null,
resolved: true,
executionUnitRefList: null,
startTime: null,
completeTime: null,
fault: null,
};
for (const cc of c.children) {
switch (cc.localName) {
case "UUID":
res.uuid = cc.text;
break;
case "DeploymentUnitRef":
res.deploymentUnitRef = cc.text;
break;
case "Version":
res.version = cc.text;
break;
case "CurrentState":
res.currentState = cc.text;
break;
case "Resolved":
res.resolved = parseBool(cc.text);
break;
case "ExecutionUnitRefList":
res.executionUnitRefList = cc.text;
break;
case "StartTime":
res.startTime = Date.parse(c.text);
break;
case "CompleteTime":
res.completeTime = Date.parse(c.text);
break;
case "Fault":
res.fault = {
faultCode: cc.children.find((n) => n.localName === "FaultCode")
.text,
faultString: cc.children.find(
(n) => n.localName === "FaultString"
).text,
};
break;
}
results.push(res);
}
break;
}
}
if (commandKey == null) {
warnings.push({
message: "Missing or invalid XML node",
element: "CommandKey",
});
commandKey = "";
}
if (!results) {
warnings.push({
message: "Missing or invalid XML node",
element: "Results",
});
results = [];
}
return {
name: "DUStateChangeComplete",
commandKey: commandKey,
results: results,
};
}
function DUStateChangeCompleteResponse(): string {
return "<cwmp:DUStateChangeCompleteResponse></cwmp:DUStateChangeCompleteResponse>";
}
function RequestDownload(xml: Element): RequestDownloadRequest {
return {
name: "RequestDownload",
@@ -923,6 +1040,9 @@ export function request(
case "TransferComplete":
rpc.cpeRequest = TransferComplete(methodElement);
break;
case "DUStateChangeComplete":
rpc.cpeRequest = DUStateChangeComplete(methodElement);
break;
case "RequestDownload":
rpc.cpeRequest = RequestDownload(methodElement);
break;
@@ -956,6 +1076,9 @@ export function request(
case "DownloadResponse":
rpc.cpeResponse = DownloadResponse(methodElement);
break;
case "ChangeDUStateResponse":
rpc.cpeResponse = ChangeDUStateResponse();
break;
case "Fault":
rpc.cpeFault = fault(methodElement);
break;
@@ -1009,6 +1132,9 @@ export function response(rpc: {
case "TransferCompleteResponse":
body = TransferCompleteResponse();
break;
case "DUStateChangeCompleteResponse":
body = DUStateChangeCompleteResponse();
break;
case "RequestDownloadResponse":
body = RequestDownloadResponse();
break;
@@ -1051,6 +1177,9 @@ export function response(rpc: {
case "Download":
body = Download(rpc.acsRequest);
break;
case "ChangeDUState":
body = ChangeDUState(rpc.acsRequest);
break;
default:
throw new Error(
`Unknown method request ${(rpc.acsRequest as AcsRequest).name}`