blob: 221c49fb8481a7435afac8c125d42c009fac69c2 [file] [log] [blame]
# SPDX-FileCopyrightText: 2020 The Magma Authors.
# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
#
# SPDX-License-Identifier: BSD-3-Clause
from spyne.model import ComplexModel
from spyne.model.complex import XmlAttribute, XmlData
from spyne.model.primitive import (
Boolean,
DateTime,
Integer,
String,
UnsignedInteger,
)
from spyne.util.odict import odict
# Namespaces
XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance'
SOAP_ENV = 'http://schemas.xmlsoap.org/soap/envelope/'
SOAP_ENC = 'http://schemas.xmlsoap.org/soap/encoding/'
CWMP_NS = 'urn:dslforum-org:cwmp-1-0'
class Tr069ComplexModel(ComplexModel):
""" Base class for TR-069 models, to set common attributes. Does not appear
in CWMP XSD file. """
__namespace__ = CWMP_NS
class anySimpleType(Tr069ComplexModel):
""" Type used to transfer simple data of various types. Data type is
defined in 'type' XML attribute. Data is handled as a string. """
_type_info = odict()
_type_info["type"] = XmlAttribute(String, ns=XSI_NS)
_type_info["Data"] = XmlData(String)
def __repr__(self):
"""For types we can't resolve only print the datum"""
return self.Data
# SOAP Header Elements
class ID(Tr069ComplexModel):
# Note: for some reason, XmlAttribute/XmlData pairs MUST be ordered, with
# XmlAttribute coming first. This appears to be a spyne bug (something to do
# with spyne.interface._base.add_class())
_type_info = odict()
_type_info["mustUnderstand"] = XmlAttribute(String, ns=SOAP_ENV)
_type_info["Data"] = XmlData(String)
class HoldRequests(Tr069ComplexModel):
_type_info = odict()
_type_info["mustUnderstand"] = XmlAttribute(String, ns=SOAP_ENV)
_type_info["Data"] = XmlData(Boolean)
# SOAP Fault Extensions
class SetParameterValuesFault(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterName"] = String
_type_info["FaultCode"] = UnsignedInteger
_type_info["FaultString"] = String
class Fault(Tr069ComplexModel):
_type_info = odict()
_type_info["FaultCode"] = UnsignedInteger
_type_info["FaultString"] = String
_type_info["SetParameterValuesFault"] = SetParameterValuesFault.customize(
max_occurs='unbounded',
)
# Type definitions used in messages
class MethodList(Tr069ComplexModel):
_type_info = odict()
_type_info["string"] = String(max_length=64, max_occurs='unbounded')
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class FaultStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["FaultCode"] = Integer
_type_info["FaultString"] = String(max_length=256)
class DeviceIdStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["Manufacturer"] = String(max_length=64)
_type_info["OUI"] = String(length=6)
_type_info["ProductClass"] = String(max_length=64)
_type_info["SerialNumber"] = String(max_length=64)
class EventStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["EventCode"] = String(max_length=64)
_type_info["CommandKey"] = String(max_length=32)
class EventList(Tr069ComplexModel):
_type_info = odict()
_type_info["EventStruct"] = EventStruct.customize(max_occurs='unbounded')
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class ParameterValueStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["Name"] = String
_type_info["Value"] = anySimpleType
class ParameterValueList(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterValueStruct"] = ParameterValueStruct.customize(
max_occurs='unbounded',
)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class ParameterInfoStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["Name"] = String(max_length=256)
_type_info["Writable"] = Boolean
class ParameterInfoList(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterInfoStruct"] = ParameterInfoStruct.customize(max_occurs='unbounded')
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class ParameterNames(Tr069ComplexModel):
_type_info = odict()
_type_info["string"] = String.customize(max_occurs='unbounded', max_length=256)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class ParameterKeyType(anySimpleType):
pass
class AccessList(Tr069ComplexModel):
_type_info = odict()
_type_info["string"] = String.customize(max_occurs='unbounded', max_length=64)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class SetParameterAttributesStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["Name"] = String(max_length=256)
_type_info["NotificationChange"] = Boolean
_type_info["Notification"] = Integer
_type_info["AccessListChange"] = Boolean
_type_info["AccessList"] = AccessList
class SetParameterAttributesList(Tr069ComplexModel):
_type_info = odict()
_type_info["SetParameterAttributesStruct"] = SetParameterAttributesStruct.customize(
max_occurs='unbounded',
)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class ParameterAttributeStruct(Tr069ComplexModel):
_type_info = odict()
_type_info["Name"] = String(max_length=256)
_type_info["Notification"] = Integer
_type_info["AccessList"] = AccessList
class ParameterAttributeList(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterValueStruct"] = ParameterAttributeStruct.customize(
max_occurs='unbounded',
)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
class CommandKeyType(String.customize(max_length=32)):
pass
class ObjectNameType(String.customize(max_length=256)):
pass
# CPE messages
class SetParameterValues(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterList"] = ParameterValueList
_type_info["ParameterKey"] = ParameterKeyType
class SetParameterValuesResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["Status"] = Integer
class GetParameterValues(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterNames"] = ParameterNames
class GetParameterValuesResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterList"] = ParameterValueList
class GetParameterNames(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterPath"] = String.customize(max_length=256)
_type_info["NextLevel"] = Boolean
class GetParameterNamesResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterList"] = ParameterInfoList
class SetParameterAttributes(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterList"] = SetParameterAttributesList
class SetParameterAttributesResponse(Tr069ComplexModel):
# Dummy field required because spyne does not allow 'bare' RPC function with
# no input parameters. This field is never sent by CPE.
_type_info = odict()
_type_info["DummyField"] = UnsignedInteger
class GetParameterAttributes(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterNames"] = ParameterNames
class GetParameterAttributesResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["ParameterList"] = ParameterAttributeList
class AddObject(Tr069ComplexModel):
_type_info = odict()
_type_info["ObjectName"] = ObjectNameType
_type_info["ParameterKey"] = ParameterKeyType
class AddObjectResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["InstanceNumber"] = UnsignedInteger
_type_info["Status"] = Integer
class DeleteObject(Tr069ComplexModel):
_type_info = odict()
_type_info["ObjectName"] = ObjectNameType
_type_info["ParameterKey"] = ParameterKeyType
class DeleteObjectResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["Status"] = Integer
class Download(Tr069ComplexModel):
_type_info = odict()
_type_info["CommandKey"] = CommandKeyType
_type_info["FileType"] = String(max_length=64)
_type_info["URL"] = String(max_length=256)
_type_info["Username"] = String(max_length=256)
_type_info["Password"] = String(max_length=256)
_type_info["FileSize"] = UnsignedInteger
_type_info["TargetFileName"] = String(max_length=256)
_type_info["DelaySeconds"] = UnsignedInteger
_type_info["SuccessURL"] = String(max_length=256)
_type_info["FailureURL"] = String(max_length=256)
class DownloadResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["Status"] = Integer
_type_info["StartTime"] = DateTime
_type_info["CompleteTime"] = DateTime
class Reboot(Tr069ComplexModel):
_type_info = odict()
_type_info["CommandKey"] = CommandKeyType
class RebootResponse(Tr069ComplexModel):
# Dummy field required because spyne does not allow 'bare' RPC function with
# no input parameters. This field is never sent by CPE.
_type_info = odict()
_type_info["DummyField"] = UnsignedInteger
# ACS messages
class Inform(Tr069ComplexModel):
_type_info = odict()
_type_info["DeviceId"] = DeviceIdStruct
_type_info["Event"] = EventList
_type_info["MaxEnvelopes"] = UnsignedInteger
_type_info["CurrentTime"] = DateTime
_type_info["RetryCount"] = UnsignedInteger
_type_info["ParameterList"] = ParameterValueList
class InformResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["MaxEnvelopes"] = UnsignedInteger
class TransferComplete(Tr069ComplexModel):
_type_info = odict()
_type_info["CommandKey"] = CommandKeyType
_type_info["FaultStruct"] = FaultStruct
_type_info["StartTime"] = DateTime
_type_info["CompleteTime"] = DateTime
class TransferCompleteResponse(Tr069ComplexModel):
# Dummy field required because spyne does not allow 'bare' RPC function with
# no input parameters. This field is never sent by ACS.
_type_info = odict()
_type_info["DummyField"] = UnsignedInteger
class GetRPCMethods(Tr069ComplexModel):
_type_info = odict()
_type_info["DummyField"] = UnsignedInteger
class GetRPCMethodsResponse(Tr069ComplexModel):
_type_info = odict()
_type_info["MethodList"] = MethodList
#
# Miscellaneous
#
class ParameterListUnion(Tr069ComplexModel):
""" Union of structures that get instantiated as 'ParameterList' in ACS->CPE
messages. This is required because AcsToCpeRequests can only have one
parameter named 'ParameterList', so that must also be a union """
_type_info = odict()
# Fields from ParameterValueList
_type_info["ParameterValueStruct"] = ParameterValueStruct.customize(
max_occurs='unbounded',
)
_type_info["arrayType"] = XmlAttribute(String, ns=SOAP_ENC)
# Fields from SetParameterAttributesList
_type_info["SetParameterAttributesStruct"] = \
SetParameterAttributesStruct.customize(max_occurs='unbounded')
# arrayType = XmlAttribute(String, ns=SOAP_ENC) - Already covered above
class AcsToCpeRequests(Tr069ComplexModel):
""" Union of all ACS->CPE requests. Only fields for one request is populated
per message instance """
_type_info = odict()
# Fields for SetParameterValues
_type_info["ParameterList"] = ParameterListUnion # See ParameterListUnion for explanation
_type_info["ParameterKey"] = ParameterKeyType
# Fields for GetParameterValues
# _type_info["ParameterList"] = ParameterValueList - Already covered above
# Fields for GetParameterNames
_type_info["ParameterPath"] = String.customize(max_length=256)
_type_info["NextLevel"] = Boolean
# Fields for SetParameterAttributes
# _type_info["ParameterList"] = SetParameterAttributesList - Already covered above
# Fields for GetParameterAttributes
_type_info["ParameterNames"] = ParameterNames
# Fields for AddObject
_type_info["ObjectName"] = ObjectNameType
_type_info["ParameterKey"] = ParameterKeyType
# Fields for DeleteObject
# _type_info["ObjectName"] = ObjectNameType - Already covered above
# _type_info["ParameterKey"] = ParameterKeyType - Already covered above
# Fields for Download
_type_info["CommandKey"] = CommandKeyType
_type_info["FileType"] = String(max_length=64)
_type_info["URL"] = String(max_length=256)
_type_info["Username"] = String(max_length=256)
_type_info["Password"] = String(max_length=256)
_type_info["FileSize"] = UnsignedInteger
_type_info["TargetFileName"] = String(max_length=256)
_type_info["DelaySeconds"] = UnsignedInteger
_type_info["SuccessURL"] = String(max_length=256)
_type_info["FailureURL"] = String(max_length=256)
# Fields for Reboot
# _type_info["CommandKey"] = CommandKeyType - Already covered above
class DummyInput(Tr069ComplexModel):
""" Dummy complex model. Used for 'EmptyHttp' function, because spyne Does
not handle 'bare' function with no inputs """
_type_info = odict()
_type_info["DummyField"] = UnsignedInteger