Cisco Unified Call Manager AXL Methods Collection.
Project description
tinyCUCM
Cisco Unified Call Manager AXL Methods Collection.
Table of Contents
About The Project
This project is for informational purposes only and is intended to study the capabilities of the Cisco Unified Call Manager's API.
Methods have been tested on CUCM ver. 11.5.
Cisco UCM AXL Schemas & SQL Data Dictionaries Documentation
Installation
Installation is as simple as:
pip install tinyCUCM
Usage
Cisco UCM WSDL Services:
WSDL File | Path |
---|---|
SOAPMonitorService | https://x.x.x.x:8443/realtimeservice/services/SOAPMonitorService?wsdl |
RisPort | https://x.x.x.x:8443/realtimeservice/services/RisPort?wsdl |
RisPort70 | https://x.x.x.x:8443/realtimeservice/services/RisPort70?wsdl |
RisService70 | https://x.x.x.x:8443/realtimeservice2/services/RISService70?wsdl |
PerfmonPort | https://x.x.x.x:8443/perfmonservice/services/PerfmonPort?wsdl |
ControlCenterServices | https://x.x.x.x:8443/controlcenterservice/services/ControlCenterServicesPort?wsdl |
LogCollectionService | https://x.x.x.x:8443/logcollectionservice/services/LogCollectionPort?wsdl |
CDRonDemand | https://x.x.x.x:8443/CDRonDemandService/services/CDRonDemand?wsdl |
DimeGetFile | https://x.x.x.x:8443/logcollectionservice/services/DimeGetFileService?wsdl |
Download Cisco AXL Toolkit
from the station (Application
-> Plugins
) and put it into the folder with your project.
Copy RISService70
and create RISService70.xml
file, put file it into axlsqltoolkit
folder.
Create an Cisco UCM application account or local end user with Standard CCM Super Users
privileges
(Assign access control group to Your-CUCM-Account
).
Instance Create
Create a new instance of the CucmAxlClient
class and assigns this object to the local variable cucm
.
Don't store sensitive information in source code. For example use ".env" file.
Code Example:
from pathlib import Path
from tinyCUCM import CucmAxlClient
BASE_DIR = Path(__file__).resolve().parent
settings = {
"pub_fqdn": "cucm.example.com",
"pub_version": "11.5",
"user_login": "Your-CUCM-Account",
"user_password": "You%wILL#&neVeR!gUEss",
"toolkit_path": BASE_DIR / "axlsqltoolkit",
"cert_path": BASE_DIR / "cucm.crt",
"session_verify": False,
"session_timeout": 15,
"ris_wsdl_filename": "wsdlRISService70_test.xml",
}
if __name__ == "__main__":
cucm = CucmAxlClient(**settings)
# Get All AXL Method Names
print("Result:", cucm.axlAllMethods())
# Result: (
# 'addAarGroup',
# 'addAdvertisedPatterns',
# 'addAnnouncement',
# 'addAppServerInfo',
# 'addAppUser',
# ...,
# 'updateWifiHotspot',
# 'updateWirelessAccessPointControllers',
# 'updateWlanProfileGroup',
# 'wipePhone'
# )
AXL Collection
Add Methods
Code Example:
Do Methods
axlDoAuthenticateUser
- required keywords args: (userid
,password
) or (userid
,pin
)axlDoDeviceLogin
- required keywords args: (deviceName
,loginDuration
,profileName
,userId
)- Arg
loginDuration: str
values:"0"
- Logout disabled"36000"
- Logout after 10h
- Arg
axlDoDeviceLogout
- required keywords args:deviceName
axlDoLdapSync
- required keywords args: (uuid
,sync
) or (name
,sync
)- Arg
sync: bool
values:True
- Start SynchronizationFalse
- Cancel the Synchronization which is currently under process
- Arg
Code Example:
cucm = ...
print("Result:", cucm.axlDoAuthenticateUser(**{"userid": "...", "password": "..."}))
# Result: {'return': {'userAuthenticated': 'true', 'code': 0, 'daysToExpiry': 0, 'isWarningNeeded': 'false'}, 'sequence': None}
# Result: {'return': {'userAuthenticated': 'false', 'code': 1, 'daysToExpiry': 0, 'isWarningNeeded': 'false'}, 'sequence': None}
print("Result:", cucm.axlDoDeviceLogin(**{"deviceName": "SEP...", "loginDuration": "...", "profileName":"...", "userid": "..."}))
# Result {'return': '{........-....-....-....-............}', 'sequence': None}
print("Result:", cucm.axlDoDeviceLogout(**{"deviceName": "SEP..."}))
# Result {'return': '{........-....-....-....-............}', 'sequence': None}
print("Result:", cucm.axlDoLdapSync(**{"uuid": "........-....-....-....-............", "sync": True}))
# Result: {'return': 'Sync initiated successfully', 'sequence': None}
Get Methods
axlGetCallPickupGroup
- required keywords args:uuid
orname
orpattern
or (pattern
,routePartitionName
)axlGetDeviceProfile
- required keywords args:uuid
orname
axlGetLine
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)axlGetLineGroup
- required keywords args:uuid
orname
axlGetPhone
- required keywords args:uuid
orname
axlGetRemoteDestination
- required keywords args:uuid
ordestination
axlGetRemoteDestinationProfile
- required keywords args:uuid
orname
axlGetTranslationPattern
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)axlGetUser
- required keywords args:uuid
oruserid
Code Example:
cucm = ...
print("Result:", cucm.axlGetPhone(**{"uuid": "........-....-....-....-............"}))
# Result: {
# 'name': '...',
# ...,
# 'lines': {
# 'line': [
# {
# 'index': 1,
# ...,
# 'dirn': {
# 'pattern': '...',
# 'routePartitionName': {'_value_1': '...', 'uuid': '{........-....-....-....-............}'},
# 'uuid': '{........-....-....-....-............}'
# },
# 'uuid': '{........-....-....-....-............'
# }
# ],
# 'lineIdentifier': None
# },
# 'uuid': '{........-....-....-....-............}'
# }
Remove Methods
axlRemoveCallPickupGroup
- required keywords args:uuid
orname
orpattern
or (pattern
,routePartitionName
)axlRemoveDeviceProfile
- required keywords args:uuid
orname
axlRemoveLine
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)axlRemoveLineGroup
- required keywords args:uuid
orname
axlRemovePhone
- required keywords args:uuid
orname
axlRemoveRemoteDestination
- required keywords args:uuid
ordestination
axlRemoveRemoteDestinationProfile
- required keywords args:uuid
orname
axlRemoveTranslationPattern
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)axlRemoveUser
- required keywords args:uuid
oruserid
Code Example:
cucm = ...
print("Result:", cucm.axlRemoveLine(**{"uuid": "........-....-....-....-............"}))
# Result: {
# 'return': '{........-....-....-....-............}',
# 'sequence': None
# }
Reset Methods
axlResetPhone
- required keywords args:uuid
orname
Code Example:
Restart Methods
axlRestartPhone
- required keywords args:uuid
orname
Code Example:
RIS Methods
RIS - Real-time Information Server retrieve information stored in all RIS nodes in the cluster. https://developer.cisco.com/docs/sxml/#!risport70-api
risGetCti
- required keywords args:collection_name
,items_collection
,cti_mgr_class
- Arg
collection_name
values:DevNames
orDirNumbers
- Arg
items_collection
: Collection of Dictionaries. Depending on the type of collection, dictionaries should contain the keyname
forDevNames
or the keypattern
forDirNumbers
- Arg
cti_mgr_class
values:Provider
orDevice
orLine
- Arg
risGetPhone
- required keywords args:phone_name
risGetPhones
- required keywords args:devices_collection
- Arg
devices_collection
- Collection of Dictionaries. Dictionaries should contain the keyname
- Arg
Code Example:
cucm = ...
print("Result:", cucm.risGetCti(
collection_name="DirNumbers",
items_collection=({"pattern": "..."}, {"pattern": "..."}, ...),
cti_mgr_class="Line"
))
# Result: {
# 'SelectCtiItemResult': {
# 'TotalItemsFound': 6,
# 'CtiNodes': {...}
# },
# 'StateInfo': '<StateInfo><Node Name="cucm.example.com" ...'
# }
print("Result:", cucm.risGetPhone(phone_name="CSF...", is_raw_resp=False))
# Result: {
# 'DeviceName': 'CSF...',
# 'Status': 'Registered',
# 'Model': 503,
# 'Product': 390,
# 'IP': 'xxx.xxx.xxx.xxx',
# 'NodeName': 'cucm.example.com',
# 'ActiveLoadID': '...',
# 'InactiveLoadID': '...'
# }
print("Result:", cucm.risGetPhones(devices_collection=({"name": "TCT..."}, {"name": "CSF..."}, ...), is_raw_resp=False))
# Result = (
# {
# 'name': 'TCT...',
# 'ris': {
# 'DeviceName': 'TCT...',
# 'Status': 'UnRegistered',
# 'Model': 562,
# 'Product': 449,
# 'IP': 'xxx.xxx.xxx.xxx',
# 'NodeName': 'cucm.example.com',
# 'ActiveLoadID': '...',
# 'InactiveLoadID': '...'
# }
# },
# {
# 'name': 'CSF...',
# 'ris': {
# 'DeviceName': 'CSF...',
# 'Status': 'Registered',
# 'Model': 503,
# 'Product': 390,
# 'IP': 'xxx.xxx.xxx.xxx',
# 'NodeName': 'cucm.example.com',
# 'ActiveLoadID': '...',
# 'InactiveLoadID': '...'
# }
# },
# {
# 'name': 'SEP...',
# 'ris': {'DeviceName': None, 'Status': None, ...}
# },
# {
# 'name': 'RDP...',
# 'ris': {'DeviceName': None, 'Status': None, ...}
# },
# {
# 'name': 'UDP...',
# 'ris': {'DeviceName': None, 'Status': None, ...}
# }
# )
Update Methods
-
axlUpdateCallPickupGroup
- required keywords args:uuid
orname
orpattern
or (pattern
,routePartitionName
)expected keywords args:
newPattern
description
newRoutePartitionName
removeMembers
addMembers
members
pickupNotification
pickupNotificationTimer
callInfoForPickupNotification
newName
-
axlUpdateDeviceProfile
- required keywords args:uuid
orname
expected keywords args:
newName
description
userHoldMohAudioSourceId
vendorConfig
mlppDomainId
mlppIndicationStatus
preemption
lines
phoneTemplateName
speeddials
busyLampFields
blfDirectedCallParks
addOnModules
userLocale
singleButtonBarge
joinAcrossLines
loginUserId
ignorePresentationIndicators
dndOption
dndRingSetting
dndStatus
emccCallingSearchSpace
alwaysUsePrimeLine
alwaysUsePrimeLineForVoiceMessage
softkeyTemplateName
callInfoPrivacyStatus
services
featureControlPolicy
-
axlUpdateLine
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)expected keywords args:
newPattern
description
newRoutePartitionName
aarNeighborhoodName
aarDestinationMask
aarKeepCallHistory
aarVoiceMailEnabled
callForwardAll
callForwardBusy
callForwardBusyInt
callForwardNoAnswer
callForwardNoAnswerInt
callForwardNoCoverage
callForwardNoCoverageInt
callForwardOnFailure
callForwardAlternateParty
callForwardNotRegistered
callForwardNotRegisteredInt
callPickupGroupName
autoAnswer
networkHoldMohAudioSourceId
userHoldMohAudioSourceId
alertingName
asciiAlertingName
presenceGroupName
shareLineAppearanceCssName
voiceMailProfileName
patternPrecedence
releaseClause
hrDuration
hrInterval
cfaCssPolicy
defaultActivatedDeviceName
parkMonForwardNoRetrieveDn
parkMonForwardNoRetrieveIntDn
parkMonForwardNoRetrieveVmEnabled
parkMonForwardNoRetrieveIntVmEnabled
parkMonForwardNoRetrieveCssName
parkMonForwardNoRetrieveIntCssName
parkMonReversionTimer
partyEntranceTone
directoryURIs
allowCtiControlFlag
rejectAnonymousCall
patternUrgency
confidentialAccess
externalCallControlProfile
enterpriseAltNum
e164AltNum
pstnFailover
callControlAgentProfile
useEnterpriseAltNum
useE164AltNum
active
-
axlUpdateLineGroup
- required keywords args:uuid
orname
expected keywords args:
distributionAlgorithm
rnaReversionTimeOut
huntAlgorithmNoAnswer
huntAlgorithmBusy
huntAlgorithmNotAvailable
removeMembers
addMembers
members
newName
autoLogOffHunt
-
axlUpdatePhone
- required keywords args:uuid
orname
expected keywords args:
newName
description
callingSearchSpaceName
devicePoolName
commonDeviceConfigName
commonPhoneConfigName
networkLocation
locationName
mediaResourceListName
networkHoldMohAudioSourceId
userHoldMohAudioSourceId
automatedAlternateRoutingCssName
aarNeighborhoodName
loadInformation
vendorConfig
versionStamp
traceFlag
mlppDomainId
mlppIndicationStatus
preemption
useTrustedRelayPoint
retryVideoCallAsAudio
securityProfileName
sipProfileName
cgpnTransformationCssName
useDevicePoolCgpnTransformCss
geoLocationName
geoLocationFilterName
sendGeoLocation
removeLines
addLines
lines
phoneTemplateName
speeddials
busyLampFields
primaryPhoneName
ringSettingIdleBlfAudibleAlert
ringSettingBusyBlfAudibleAlert
blfDirectedCallParks
addOnModules
userLocale
networkLocale
idleTimeout
authenticationUrl
directoryUrl
idleUrl
informationUrl
messagesUrl
proxyServerUrl
servicesUrl
services
softkeyTemplateName
defaultProfileName
enableExtensionMobility
singleButtonBarge
joinAcrossLines
builtInBridgeStatus
callInfoPrivacyStatus
hlogStatus
ownerUserName
ignorePresentationIndicators
packetCaptureMode
packetCaptureDuration
subscribeCallingSearchSpaceName
rerouteCallingSearchSpaceName
allowCtiControlFlag
presenceGroupName
unattendedPort
requireDtmfReception
rfc2833Disabled
certificateOperation
authenticationMode
keySize
keyOrder
ecKeySize
authenticationString
upgradeFinishTime
deviceMobilityMode
remoteDevice
dndOption
dndRingSetting
dndStatus
isActive
mobilityUserIdName
phoneSuite
phoneServiceDisplay
isProtected
mtpRequired
mtpPreferedCodec
dialRulesName
sshUserId
sshPwd
digestUser
outboundCallRollover
hotlineDevice
secureInformationUrl
secureDirectoryUrl
secureMessageUrl
secureServicesUrl
secureAuthenticationUrl
secureIdleUrl
alwaysUsePrimeLine
alwaysUsePrimeLineForVoiceMessage
featureControlPolicy
deviceTrustMode
earlyOfferSupportForVoiceCall
requireThirdPartyRegistration
blockIncomingCallsWhenRoaming
homeNetworkId
AllowPresentationSharingUsingBfcp
confidentialAccess
requireOffPremiseLocation
allowiXApplicableMedia
cgpnIngressDN
useDevicePoolCgpnIngressDN
msisdn
enableCallRoutingToRdWhenNoneIsActive
wifiHotspotProfile
wirelessLanProfileGroup
elinGroup
-
axlUpdateRemoteDestination
- required keywords args:uuid
ordestination
expected keywords args:
newName
newDestination
answerTooSoonTimer
answerTooLateTimer
delayBeforeRingingCell
ownerUserId
enableUnifiedMobility
remoteDestinationProfileName
enableExtendAndConnect
ctiRemoteDeviceName
dualModeDeviceName
isMobilePhone
enableMobileConnect
lineAssociations
timeZone
todAccessName
mobileSmartClientName
mobilityProfileName
singleNumberReachVoicemail
dialViaOfficeReverseVoicemail
removeRingSchedule
addRingSchedule
ringSchedule
accessListName
-
axlUpdateRemoteDestinationProfile
- required keywords args:uuid
orname
expected keywords args:
newName
description
callingSearchSpaceName
devicePoolName
networkHoldMohAudioSourceId
userHoldMohAudioSourceId
lines
callInfoPrivacyStatus
userId
ignorePresentationIndicators
rerouteCallingSearchSpaceName
cgpnTransformationCssName
automatedAlternateRoutingCssName
useDevicePoolCgpnTransformCss
userLocale
networkLocale
primaryPhoneName
dndOption
dndStatus
mobileSmartClientProfileName
-
axlUpdateTranslationPattern
- required keywords args:uuid
orpattern
or (pattern
,routePartitionName
)expected keywords args:
dialPlanName
routeFilterName
newPattern
description
newRoutePartitionName
blockEnable
calledPartyTransformationMask
callingPartyTransformationMask
useCallingPartyPhoneMask
callingPartyPrefixDigits
newDialPlanName
digitDiscardInstructionName
patternUrgency
prefixDigitsOut
newRouteFilterName
callingLinePresentationBit
callingNamePresentationBit
connectedLinePresentationBit
connectedNamePresentationBit
patternPrecedence
provideOutsideDialtone
callingPartyNumberingPlan
callingPartyNumberType
calledPartyNumberingPlan
calledPartyNumberType
callingSearchSpaceName
resourcePriorityNamespaceName
routeNextHopByCgpn
routeClass
callInterceptProfileName
releaseClause
useOriginatorCss
dontWaitForIDTOnSubsequentHops
isEmergencyServiceNumber
-
axlUpdateUser
- required keywords args:uuid
oruserid
expected keywords args:
firstName
displayName
middleName
lastName
newUserid
password
pin
mailid
department
manager
userLocale
associatedDevices
primaryExtension
associatedPc
associatedGroups
enableCti
digestCredentials
phoneProfiles
defaultProfile
presenceGroupName
subscribeCallingSearchSpaceName
enableMobility
enableMobileVoiceAccess
maxDeskPickupWaitTime
remoteDestinationLimit
passwordCredentials
pinCredentials
enableEmcc
ctiControlledDeviceProfiles
patternPrecedence
numericUserId
mlppPassword
customUserFields
homeCluster
imAndPresenceEnable
serviceProfile
lineAppearanceAssociationForPresences
directoryUri
telephoneNumber
title
mobileNumber
homeNumber
pagerNumber
removeExtensionsInfo
addExtensionsInfo
extensionsInfo
selfService
userProfile
calendarPresence
ldapDirectoryName
userIdentity
nameDialing
ipccExtension
convertUserAccount
accountType
authenticationType
enableUserToHostConferenceNow
attendeesAccessCode
zeroHop
Code Example:
cucm = ...
print("Result:", cucm.axlUpdatePhone(**{"uuid": "........-....-....-....-............", "description": "New Description"}))
# Result: {
# 'return': '{........-....-....-....-............}',
# 'sequence': None
# }
SQL Collection
Execute Query
Code Example:
cucm = ...
sql_query = """
SELECT d.pkid, d.name, d.description
FROM device d
WHERE d.name LIKE '%value%'
"""
print("Result:", cucm.sqlExecuteQuery(sql_query=sql_query))
# Result: (
# {'pkid': '........-....-....-....-............', 'name': 'SEP...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'RDP...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'UDP...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'TCT...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'BOT...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'CSF...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'TAB...', 'description': '...'},
# {'pkid': '........-....-....-....-............', 'name': 'CIPC...', 'description': '...'},
# )
Update Query
Code Example:
cucm = ...
sql_query = """
UPDATE device d
SET d.description = 'New Description via SQL'
WHERE d.name LIKE '%value%'
"""
print("Result:", cucm.sqlUpdateQuery(sql_query=sql_query))
# Result: {
# 'return': {
# 'rowsUpdated': 1
# },
# 'sequence': None
# }
Predefined Queries
List
Methods:sqlListCallingSearchSpace
sqlListCredentialPolicy
sqlListDevicePool
sqlListDirGroup
sqlListMediaResourceGroup
sqlListMediaResourceList
sqlListPhoneTemplate
sqlListProcessNode
sqlListRecordingProfile
sqlListRegion
sqlListRoutePartition
sqlListSoftkeyTemplate
sqlListTelecasterService
sqlListTypeClass
sqlListTypeCountry
sqlListTypeModel
sqlListTypeUserLocale
sqlListUcServiceProfile
sqlListUcUserProfile
Search
Methods:sqlSearchCallPickupGroup
- required keywords args:criterion
,value
- Arg
criterion
:Name
,Description
,Pattern
,Member Line Number
,Member Line Description
- Arg
sqlSearchDevice
- required keywords args:criterion
,value
- Arg
criterion
:Name
,Description
,Line Number
,Line Description
,Userid
,Device Pool
,Device Type
- Arg
sqlSearchEndUser
- required keywords args:criterion
,value
- Arg
criterion
:Userid
,Display Name
,Last Name
,First Name
,Phone Number
,Mobile Number
,Email
,Directory URI
- Arg
sqlSearchLineGroup
- required keywords args:criterion
,value
- Arg
criterion
:Name
,Member Line Number
,Member Line Description
- Arg
sqlSearchTranslationPattern
- required keywords args:criterion
,value
- Arg
criterion
:Pattern
,Description
,Partition
,Calling Search Space
,Called Party Transform Mask
,Prefix Digits Out
- Arg
Validate
Methods:sqlValidateDeviceEndUserDesignation
- required keywords args:device
(Type Class: Any)sqlValidateLine
- required keywords args:pattern
(Type Pattern Usage: Device Only)sqlValidatePattern
- required keywords args:pattern
(Type Pattern Usage: Any)
Create Your Own Methods
Don't store sensitive information in source code. For example use ".env" file.
Code Example:
from pathlib import Path
from typing import Union
from tinyCUCM import CucmSettings, cucm_logging
BASE_DIR = Path(__file__).resolve().parent
settings = {
"pub_fqdn": "cucm.example.com",
"pub_version": "11.5",
"user_login": "Your-CUCM-Account",
"user_password": "You%wILL#&neVeR!gUEss",
"toolkit_path": BASE_DIR / "axlsqltoolkit",
"cert_path": BASE_DIR / "cucm.crt",
"session_verify": False,
"session_timeout": 15,
"ris_wsdl_filename": "wsdlRISService70_test.xml",
}
class CucmAxlCustom(CucmSettings):
def __init__(self, **kwargs):
super().__init__(**kwargs)
@cucm_logging
def axlYourOwnGetMethod(self, **kwargs: dict) -> Union[dict, None]:
"""
AXL Your Own Get Method.
:param kwargs: Expected Fields:
`kwargs = {"uuid": "uuid"}`
or
`kwargs = {"name": "name"}`
:return:
"""
return self._axl.getCallManager(**kwargs)["return"]
if __name__ == "__main__":
cucm = CucmAxlCustom(**settings)
print("Result:", cucm.axlYourOwnGetMethod(**{"uuid": "........-....-....-....-............"}))
# Result: {
# 'callManager': {
# 'name': 'CM_...',
# 'description': '...',
# 'autoRegistration': {...},
# 'ports': {...},
# 'processNodeName': {...},
# 'lbmGroup': {...},
# 'ctiid': ...,
# 'uuid': '{........-....-....-....-............}'
# }
# }
License
Distributed under the MIT License. See LICENSE
for more information.
Contact
Luarvick - lu.luarvick@gmail.com
Project Link: https://github.com/luarvick/tinyCUCM
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.