├── images ├── step1.png ├── step2.png ├── step3.png ├── step4.png └── web_page_screenshot.png ├── app ├── static │ ├── img │ │ ├── favicon.png │ │ ├── mstile.png │ │ ├── hero-bg-1.jpg │ │ ├── hero-bg-2.jpg │ │ ├── hero-bg-3.jpg │ │ ├── hero-bg-4.jpg │ │ ├── hero-bg-5.jpg │ │ ├── splash-default.jpg │ │ ├── apple-touch-icon.png │ │ └── uikit-1200x630@2x.png │ └── fonts │ │ ├── cui-font.eot │ │ ├── cui-font.ttf │ │ ├── cui-font.woff │ │ ├── cui-font.woff2 │ │ └── CiscoSans │ │ ├── CiscoSansTTBold.woff │ │ ├── CiscoSansTTBold.woff2 │ │ ├── CiscoSansTTHeavy.woff │ │ ├── CiscoSansTTLight.woff │ │ ├── CiscoSansTTThin.woff │ │ ├── CiscoSansTTThin.woff2 │ │ ├── CiscoSansTTHeavy.woff2 │ │ ├── CiscoSansTTLight.woff2 │ │ ├── CiscoSansTTRegular.woff │ │ ├── CiscoSansTTRegular.woff2 │ │ ├── CiscoSansTTExtraLight.woff │ │ ├── CiscoSansTTBoldOblique.woff │ │ ├── CiscoSansTTBoldOblique.woff2 │ │ ├── CiscoSansTTExtraLight.woff2 │ │ ├── CiscoSansTTHeavyOblique.woff │ │ ├── CiscoSansTTHeavyOblique.woff2 │ │ ├── CiscoSansTTLightOblique.woff │ │ ├── CiscoSansTTLightOblique.woff2 │ │ ├── CiscoSansTTThinOblique.woff │ │ ├── CiscoSansTTThinOblique.woff2 │ │ ├── CiscoSansTTRegularOblique.woff │ │ ├── CiscoSansTTRegularOblique.woff2 │ │ ├── CiscoSansTTExtraLightOblique.woff │ │ └── CiscoSansTTExtraLightOblique.woff2 ├── __pycache__ │ ├── user_env.cpython-37.pyc │ └── list_subscribers_and_phones.cpython-37.pyc ├── user_env_default.py ├── device_ip_test.py ├── main.py ├── functions.py ├── axl_request_test.py ├── templates │ └── inventory.html └── schema │ └── AXLEnums.xsd ├── requirements.txt ├── HEADER ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md ├── README.md └── LICENSE /images/step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/images/step1.png -------------------------------------------------------------------------------- /images/step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/images/step2.png -------------------------------------------------------------------------------- /images/step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/images/step3.png -------------------------------------------------------------------------------- /images/step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/images/step4.png -------------------------------------------------------------------------------- /app/static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/favicon.png -------------------------------------------------------------------------------- /app/static/img/mstile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/mstile.png -------------------------------------------------------------------------------- /app/static/img/hero-bg-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/hero-bg-1.jpg -------------------------------------------------------------------------------- /app/static/img/hero-bg-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/hero-bg-2.jpg -------------------------------------------------------------------------------- /app/static/img/hero-bg-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/hero-bg-3.jpg -------------------------------------------------------------------------------- /app/static/img/hero-bg-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/hero-bg-4.jpg -------------------------------------------------------------------------------- /app/static/img/hero-bg-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/hero-bg-5.jpg -------------------------------------------------------------------------------- /app/static/fonts/cui-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/cui-font.eot -------------------------------------------------------------------------------- /app/static/fonts/cui-font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/cui-font.ttf -------------------------------------------------------------------------------- /app/static/fonts/cui-font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/cui-font.woff -------------------------------------------------------------------------------- /app/static/fonts/cui-font.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/cui-font.woff2 -------------------------------------------------------------------------------- /images/web_page_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/images/web_page_screenshot.png -------------------------------------------------------------------------------- /app/static/img/splash-default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/splash-default.jpg -------------------------------------------------------------------------------- /app/static/img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/apple-touch-icon.png -------------------------------------------------------------------------------- /app/static/img/uikit-1200x630@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/img/uikit-1200x630@2x.png -------------------------------------------------------------------------------- /app/__pycache__/user_env.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/__pycache__/user_env.cpython-37.pyc -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTBold.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTBold.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTHeavy.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTHeavy.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTLight.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTThin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTThin.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTThin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTThin.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTHeavy.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTHeavy.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTLight.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTRegular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTRegular.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTRegular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTRegular.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTExtraLight.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTBoldOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTBoldOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTBoldOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTBoldOblique.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTExtraLight.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTHeavyOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTHeavyOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTHeavyOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTHeavyOblique.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTLightOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTLightOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTLightOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTLightOblique.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTThinOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTThinOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTThinOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTThinOblique.woff2 -------------------------------------------------------------------------------- /app/__pycache__/list_subscribers_and_phones.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/__pycache__/list_subscribers_and_phones.cpython-37.pyc -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTRegularOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTRegularOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTRegularOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTRegularOblique.woff2 -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTExtraLightOblique.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTExtraLightOblique.woff -------------------------------------------------------------------------------- /app/static/fonts/CiscoSans/CiscoSansTTExtraLightOblique.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gve-sw/cisco_cucm_AXL_phone_inventory_flask_sample/HEAD/app/static/fonts/CiscoSans/CiscoSansTTExtraLightOblique.woff2 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.3 2 | attrs==19.3.0 3 | beautifulsoup4==4.8.2 4 | bs4==0.0.1 5 | cached-property==1.5.1 6 | certifi==2019.11.28 7 | cffi==1.14.0 8 | chardet==3.0.4 9 | Click==7.0 10 | cryptography==2.8 11 | defusedxml==0.6.0 12 | Flask==1.1.1 13 | github3.py==1.3.0 14 | idna==2.8 15 | isodate==0.6.0 16 | itsdangerous==1.1.0 17 | Jinja2==2.11.1 18 | jwcrypto==0.7 19 | lxml==4.5.0 20 | MarkupSafe==1.1.1 21 | pycparser==2.20 22 | python-dateutil==2.8.1 23 | pytz==2019.3 24 | requests==2.22.0 25 | requests-toolbelt==0.9.1 26 | six==1.14.0 27 | soupsieve==2.0 28 | suds-py3==1.3.4.0 29 | uritemplate==3.0.1 30 | urllib3==1.25.8 31 | Werkzeug==1.0.0 32 | -------------------------------------------------------------------------------- /HEADER: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Cisco and/or its affiliates. 2 | 3 | This software is licensed to you under the terms of the Cisco Sample 4 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 5 | License at 6 | 7 | https://developer.cisco.com/docs/licenses 8 | 9 | All use of the material herein must be in accordance with the terms of 10 | the License. All rights not expressly granted by the License are 11 | reserved. Unless required by applicable law or agreed to separately in 12 | writing, software distributed under the License is distributed on an "AS 13 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 14 | or implied. 15 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Cisco Sample Code 2 | 3 | This project, and the code contained herein, is provided for example and/or demonstration purposes by Cisco for use by our partners and customers in working with Cisco's products and services. While Cisco's customers and partners are free to use this code pursuant to the terms set forth in the [LICENSE][LICENSE], this is not an Open Source project as we are not seeking to build a community around this project and its capabilities. 4 | 5 | 6 | We do desire to provide functional and high-quality examples and demonstrations. If you should discover some bug, issue, or opportunity for enhancement with the code contained in this project, please do notify us by: 7 | 8 | 1. **Reviewing Open Issues** to verify that the issue hasn't already been reported. 9 | 2. **Opening a New Issue** to report the bug, issue, or enhancement opportunity. 10 | 11 | [LICENSE]: ../LICENSE 12 | -------------------------------------------------------------------------------- /app/user_env_default.py: -------------------------------------------------------------------------------- 1 | """ Copyright (c) 2020 Cisco and/or its affiliates. 2 | This software is licensed to you under the terms of the Cisco Sample 3 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 4 | License at 5 | https://developer.cisco.com/docs/licenses 6 | All use of the material herein must be in accordance with the terms of 7 | the License. All rights not expressly granted by the License are 8 | reserved. Unless required by applicable law or agreed to separately in 9 | writing, software distributed under the License is distributed on an "AS 10 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | or implied. 12 | """ 13 | 14 | """Set your Environment Information once, not many times. 15 | The provided sample code in this repository will reference this file to get the 16 | needed information about users and environment context to run the sample. You 17 | provide this info here once and the scripts in this repository will access it 18 | as needed. 19 | 20 | TODO: To setup your `env_user.py` copy this file then edit and save your info 21 | $ cp user_env_default.py env_user.py 22 | """ 23 | 24 | # User Input 25 | 26 | # Example path,location, and credentials from Cisco DCLOUD. Include your information. 27 | 28 | WSDL_PATH = "/app/schema/AXLAPI.wsdl" 29 | CUCM_LOCATION = "" 30 | CUCM_USER = '' 31 | CUCM_PASSWORD = '' 32 | 33 | # End User Input 34 | -------------------------------------------------------------------------------- /app/device_ip_test.py: -------------------------------------------------------------------------------- 1 | """ Copyright (c) 2020 Cisco and/or its affiliates. 2 | This software is licensed to you under the terms of the Cisco Sample 3 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 4 | License at 5 | https://developer.cisco.com/docs/licenses 6 | All use of the material herein must be in accordance with the terms of 7 | the License. All rights not expressly granted by the License are 8 | reserved. Unless required by applicable law or agreed to separately in 9 | writing, software distributed under the License is distributed on an "AS 10 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | or implied. 12 | """ 13 | 14 | from suds.client import Client 15 | from suds.transport.https import HttpAuthenticated 16 | from suds.xsd.doctor import ImportDoctor, Import 17 | from urllib.request import HTTPSHandler 18 | import urllib.error 19 | import urllib.request 20 | import ssl 21 | import user_env 22 | #import phoneQuery 23 | 24 | def get_device_ip(phone_name): 25 | 26 | #Disable HTTPS certificate validation check - not recommended for production 27 | if hasattr(ssl, '_create_unverified_context'):ssl._create_default_https_context = ssl._create_unverified_context 28 | 29 | url = 'https://' + user_env.CUCM_LOCATION + ':8443/realtimeservice/services/RisPort?wsdl' 30 | print (url) 31 | 32 | tns = 'http://schemas.cisco.com/ast/soap/' 33 | imp = Import('http://schemas.xmlsoap.org/soap/encoding/', 'http://schemas.xmlsoap.org/soap/encoding/') 34 | imp.filter.add(tns) 35 | 36 | 37 | t = HttpAuthenticated(username=user_env.CUCM_USER, password=user_env.CUCM_PASSWORD) 38 | t.handler=urllib.request.HTTPBasicAuthHandler(t.pm) 39 | 40 | context = ssl.SSLContext() 41 | 42 | 43 | t1=urllib.request.HTTPSHandler(context=context) 44 | t.urlopener = urllib.request.build_opener(t.handler,t1) 45 | 46 | 47 | c = Client(url, plugins=[ImportDoctor(imp)], transport=t) 48 | 49 | result = c.service.SelectCmDevice('',{'SelectBy':'Name', 'Status':'Any', 'Class':'Phone'}) 50 | 51 | total_phones = result['SelectCmDeviceResult']['TotalDevicesFound'] 52 | list_phones = result['SelectCmDeviceResult']["CmNodes"] 53 | print ('number of devices found', total_phones ) 54 | 55 | 56 | for node in result['SelectCmDeviceResult']['CmNodes']: 57 | for device in node['CmDevices']: 58 | if device["IpAddress"] is None: 59 | print("IP address not assigned for" , device["Name"]) 60 | print("----------------") 61 | continue 62 | else: 63 | print("Name ",device["Name"], "IP Address: ",device["IpAddress"]) 64 | print("----------------") 65 | continue 66 | 67 | # enter name of device to retrieve the ip of the device 68 | get_device_ip("CSFUSER004") -------------------------------------------------------------------------------- /app/main.py: -------------------------------------------------------------------------------- 1 | """ Copyright (c) 2020 Cisco and/or its affiliates. 2 | This software is licensed to you under the terms of the Cisco Sample 3 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 4 | License at 5 | https://developer.cisco.com/docs/licenses 6 | All use of the material herein must be in accordance with the terms of 7 | the License. All rights not expressly granted by the License are 8 | reserved. Unless required by applicable law or agreed to separately in 9 | writing, software distributed under the License is distributed on an "AS 10 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | or implied. 12 | """ 13 | from flask import Flask, render_template, request 14 | import json 15 | import requests 16 | import time 17 | import functions 18 | 19 | app = Flask(__name__) 20 | 21 | @app.route('/') 22 | def main(): 23 | 24 | # this will be the header for the html table to display the set of information 25 | header = ['Name','model','ip_address','serial','network_loc','product','searchSpace','poolName', 'MAC'] 26 | device_list = [] 27 | 28 | # makes call to retrieve a list of devices with several attributes from the CUCM evironment 29 | # axl is for administrative details like phone name, location, model, product etc 30 | # risport of for realtimeservice like ip address 31 | list_of_devices_axl = functions.axl_request() 32 | list_of_devices_risport = functions.risport_request() 33 | 34 | for index1, device_risport in enumerate(list_of_devices_risport): 35 | for index2, device_axl in enumerate(list_of_devices_axl): 36 | 37 | if device_risport["Name"] == device_axl["name"]: 38 | device = {} 39 | print("device created for ",device_axl["name"]) 40 | 41 | device["name"] = device_axl["name"] 42 | device["ip_address"] = device_risport["IpAddress"] 43 | device["model"] = device_axl["model"] 44 | device["networkLocation"] = device_axl["networkLocation"] 45 | device["product"] = device_axl["product"] 46 | device["locationName"] = device_axl["locationName"] 47 | device["callingSearchSpaceName"] = device_axl["callingSearchSpaceName"]["value"] 48 | device["devicePoolName"] = device_axl["devicePoolName"]["value"] 49 | 50 | if device["ip_address"] is None: 51 | device["serial_number"] = "unassigned" 52 | else: 53 | # calling function to retrieve serial number based on IP address (visiting the phone web page) 54 | device["mac"] =functions.get_serial(device["ip_address"])[0] 55 | device["serial_number"] = functions.get_serial(device["ip_address"])[1] 56 | 57 | device_list.append(device) 58 | 59 | return render_template('inventory.html', devices = device_list, num_devices = len(device_list), header = header) 60 | 61 | if __name__ == "__main__": 62 | #you may enter a routable ip address and uncomment the command 63 | #app.run(host='*ip address*') 64 | app.run(debug=True) 65 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as maintainers of this Cisco Sample Code pledge to making participation with our project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Showing empathy towards other people 15 | 16 | Examples of unacceptable behavior include: 17 | 18 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 19 | * Trolling, insulting/derogatory comments, and personal or political attacks 20 | * Public or private harassment 21 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 22 | * Other conduct which could reasonably be considered inappropriate in a professional setting 23 | 24 | ## Our Responsibilities 25 | 26 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 27 | 28 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other interactions with this project that are not aligned to this Code of Conduct, or to ban temporarily or permanently any person for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 29 | 30 | ## Scope 31 | 32 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project. Examples of representing a project include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 33 | 34 | ## Enforcement 35 | 36 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Cisco SE GitHub team at ciscose-github@cisco.com. The team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 37 | 38 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project or Cisco SE Leadership. 39 | 40 | ## Attribution 41 | 42 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 43 | 44 | [homepage]: http://contributor-covenant.org 45 | [version]: http://contributor-covenant.org/version/1/4/ 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cucm_phone_inventory 2 | Flask web app that displays several information details about all the phone endpoints from your CUCM environment 3 | 4 | In this sample, you will be able to see an example of a front-end and back-end solution that utilizes the Administrative XML Layer (AXL) API and Risport (realtimeservice) API for Cisco Unified Communications Manager with python to view a list of all your phone endpoints. 5 | 6 | ### Author: 7 | * Jorge Banegas (jbanegas@cisco.com) 8 | * Feb 2020 9 | *** 10 | 11 | ### Important Notes 12 | * The two test files are include to explore the responses that the api calls returns for the phones 13 | * The serial number will only display for phones that have a routable ip address from which this flask server will be running on. 14 | * The method this script is using, is grabbing the ip address for the phone, and then web scraping the phone's web page to grab the serial numbter. 15 | * If phone does not have an IP address, the serial number will show as "unassigned" and if the ip address is unreachable from the hosted server, the serial number will show as "unaccessible" 16 | 17 | ### Prerequisites 18 | * Python 3 19 | * AXL CUCM Toolkit Files 20 | * Enable AXL on CUCM (https://www.uplinx.com/cleanup-tool/webhelp/index.htm?page=Enable-AXL-on-CUCM.htm) 21 | * CUCM Admin Credentials or user that has AXL API permissions 22 | * CUCM and this code has to be hosted under the same subnet for the communication to go through 23 | 24 | # Setup instructions 25 | 1. Go to CUCM admin page and retrieve the AXL toolkit files from your environment. 26 | 27 | 1a. Click on Applications and then plugins. 28 | ![alt text](images/step1.png) 29 | 30 | 1b. Search for AXL and install the AXL toolkit 31 | ![alt text](images/step2.png) 32 | 33 | 2. install and clone this repo onto a server that has python3 installed 34 | 35 | 3. install and create a virtual environment for your project (https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/) 36 | 37 | 4. enter the virtual environment by entering the terminal command 38 | ```sh 39 | source (venv name)/bin/activate 40 | ``` 41 | 42 | 5. install dependencies by entering the terminal command 43 | ```sh 44 | pip3 install -r requirements.txt file 45 | ``` 46 | 47 | 6. Edit user_env_default.py and add your CUCM environment and user details 48 | ![alt text](images/step3.png) 49 | 50 | 7. After including your information on the user_env_default.py file, enter the terminal command 51 | ```sh 52 | cp user_env_default.py user_env.py 53 | ``` 54 | 55 | 8. In main.py file, change to the desired ip address that is routable so people within the same network can visit the site. 56 | ![alt text](images/step4.png) 57 | 58 | 9. Enter terminal command to start up flask server 59 | ```sh 60 | python3 main.py 61 | ``` 62 | 63 | 10. If steps are complete and the flask server is up and running, user will be able to visit the page on port 5000 on the ip address that was provided. 64 | 65 | ### Screenshots 66 | 67 | ![alt text](images/web_page_screenshot.png) 68 | 69 | ### API Reference/Documentation (VERY USEFUL TO CHECK OUT!): 70 | * [Original code repo from David Staudt using suds python libary (library being used for this project)] (https://github.com/CiscoDevNet/axl-python-suds-sample) 71 | * [AXL reference (uses different python library zeep)] (https://paultursan.com/2016/04/getting-started-with-python-cucm-axl-api-programming/) 72 | * [Risport reference] (https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cucm/devguide/7_1_2/AXL_DevGuide/serviceability.html#wp1053792) 73 | 74 | ## License 75 | Provided under Cisco Sample Code License, for details see [LICENSE](LICENSE) 76 | 77 | ## Code of Conduct 78 | Our code of conduct is available [here](CODE_OF_CONDUCT.md) 79 | 80 | ## Contributing 81 | See our contributing guidelines [here](CONTRIBUTING.md) 82 | 83 | ### DISCLAIMER: 84 | Please note: This script is meant for demo purposes only. All tools/ scripts in this repo are released for use "AS IS" without any warranties of any kind, including, but not limited to their installation, use, or performance. Any use of these scripts and tools is at your own risk. There is no guarantee that they have been through thorough testing in a comparable environment and we are not responsible for any damage or data loss incurred with their use. 85 | You are responsible for reviewing and testing any scripts you run thoroughly before use in any non-testing environment. 86 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CISCO SAMPLE CODE LICENSE 2 | Version 1.1 3 | Copyright (c) 2020 Cisco and/or its affiliates 4 | 5 | These terms govern this Cisco Systems, Inc. ("Cisco"), example or demo 6 | source code and its associated documentation (together, the "Sample 7 | Code"). By downloading, copying, modifying, compiling, or redistributing 8 | the Sample Code, you accept and agree to be bound by the following terms 9 | and conditions (the "License"). If you are accepting the License on 10 | behalf of an entity, you represent that you have the authority to do so 11 | (either you or the entity, "you"). Sample Code is not supported by Cisco 12 | TAC and is not tested for quality or performance. This is your only 13 | license to the Sample Code and all rights not expressly granted are 14 | reserved. 15 | 16 | 1. LICENSE GRANT: Subject to the terms and conditions of this License, 17 | Cisco hereby grants to you a perpetual, worldwide, non-exclusive, non- 18 | transferable, non-sublicensable, royalty-free license to copy and 19 | modify the Sample Code in source code form, and compile and 20 | redistribute the Sample Code in binary/object code or other executable 21 | forms, in whole or in part, solely for use with Cisco products and 22 | services. For interpreted languages like Java and Python, the 23 | executable form of the software may include source code and 24 | compilation is not required. 25 | 26 | 2. CONDITIONS: You shall not use the Sample Code independent of, or to 27 | replicate or compete with, a Cisco product or service. Cisco products 28 | and services are licensed under their own separate terms and you shall 29 | not use the Sample Code in any way that violates or is inconsistent 30 | with those terms (for more information, please visit: 31 | www.cisco.com/go/terms). 32 | 33 | 3. OWNERSHIP: Cisco retains sole and exclusive ownership of the Sample 34 | Code, including all intellectual property rights therein, except with 35 | respect to any third-party material that may be used in or by the 36 | Sample Code. Any such third-party material is licensed under its own 37 | separate terms (such as an open source license) and all use must be in 38 | full accordance with the applicable license. This License does not 39 | grant you permission to use any trade names, trademarks, service 40 | marks, or product names of Cisco. If you provide any feedback to Cisco 41 | regarding the Sample Code, you agree that Cisco, its partners, and its 42 | customers shall be free to use and incorporate such feedback into the 43 | Sample Code, and Cisco products and services, for any purpose, and 44 | without restriction, payment, or additional consideration of any kind. 45 | If you initiate or participate in any litigation against Cisco, its 46 | partners, or its customers (including cross-claims and counter-claims) 47 | alleging that the Sample Code and/or its use infringe any patent, 48 | copyright, or other intellectual property right, then all rights 49 | granted to you under this License shall terminate immediately without 50 | notice. 51 | 52 | 4. LIMITATION OF LIABILITY: CISCO SHALL HAVE NO LIABILITY IN CONNECTION 53 | WITH OR RELATING TO THIS LICENSE OR USE OF THE SAMPLE CODE, FOR 54 | DAMAGES OF ANY KIND, INCLUDING BUT NOT LIMITED TO DIRECT, INCIDENTAL, 55 | AND CONSEQUENTIAL DAMAGES, OR FOR ANY LOSS OF USE, DATA, INFORMATION, 56 | PROFITS, BUSINESS, OR GOODWILL, HOWEVER CAUSED, EVEN IF ADVISED OF THE 57 | POSSIBILITY OF SUCH DAMAGES. 58 | 59 | 5. DISCLAIMER OF WARRANTY: SAMPLE CODE IS INTENDED FOR EXAMPLE PURPOSES 60 | ONLY AND IS PROVIDED BY CISCO "AS IS" WITH ALL FAULTS AND WITHOUT 61 | WARRANTY OR SUPPORT OF ANY KIND. TO THE MAXIMUM EXTENT PERMITTED BY 62 | LAW, ALL EXPRESS AND IMPLIED CONDITIONS, REPRESENTATIONS, AND 63 | WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OR 64 | CONDITION OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON- 65 | INFRINGEMENT, SATISFACTORY QUALITY, NON-INTERFERENCE, AND ACCURACY, 66 | ARE HEREBY EXCLUDED AND EXPRESSLY DISCLAIMED BY CISCO. CISCO DOES NOT 67 | WARRANT THAT THE SAMPLE CODE IS SUITABLE FOR PRODUCTION OR COMMERCIAL 68 | USE, WILL OPERATE PROPERLY, IS ACCURATE OR COMPLETE, OR IS WITHOUT 69 | ERROR OR DEFECT. 70 | 71 | 6. GENERAL: This License shall be governed by and interpreted in 72 | accordance with the laws of the State of California, excluding its 73 | conflict of laws provisions. You agree to comply with all applicable 74 | United States export laws, rules, and regulations. If any provision of 75 | this License is judged illegal, invalid, or otherwise unenforceable, 76 | that provision shall be severed and the rest of the License shall 77 | remain in full force and effect. No failure by Cisco to enforce any of 78 | its rights related to the Sample Code or to a breach of this License 79 | in a particular situation will act as a waiver of such rights. In the 80 | event of any inconsistencies with any other terms, this License shall 81 | take precedence. 82 | -------------------------------------------------------------------------------- /app/functions.py: -------------------------------------------------------------------------------- 1 | """ Copyright (c) 2020 Cisco and/or its affiliates. 2 | This software is licensed to you under the terms of the Cisco Sample 3 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 4 | License at 5 | https://developer.cisco.com/docs/licenses 6 | All use of the material herein must be in accordance with the terms of 7 | the License. All rights not expressly granted by the License are 8 | reserved. Unless required by applicable law or agreed to separately in 9 | writing, software distributed under the License is distributed on an "AS 10 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | or implied. 12 | """ 13 | 14 | """ 15 | Script Dependencies: 16 | suds 17 | Depencency Installation: 18 | $ pip install suds-py3 19 | """ 20 | 21 | import pathlib 22 | import ssl 23 | from suds.client import Client 24 | from suds.xsd.doctor import Import 25 | from suds.xsd.doctor import ImportDoctor 26 | 27 | import os 28 | import sys 29 | from suds.client import Client 30 | from suds.transport.https import HttpAuthenticated 31 | from suds.xsd.doctor import ImportDoctor, Import 32 | from urllib.request import HTTPSHandler 33 | import urllib.error 34 | import urllib.request 35 | import ssl 36 | import user_env 37 | from bs4 import BeautifulSoup 38 | global mac 39 | 40 | # function for api AXL request 41 | def axl_request(): 42 | phone_list = [] 43 | 44 | #Disable HTTPS certificate validation check - not recommended for production 45 | if hasattr(ssl, '_create_unverified_context'):ssl._create_default_https_context = ssl._create_unverified_context 46 | 47 | tns = 'http://schemas.cisco.com/ast/soap/' 48 | imp = Import('http://schemas.xmlsoap.org/soap/encoding/') 49 | imp.filter.add(tns) 50 | 51 | # adding the ip address provided onto the url link for the API call 52 | url = 'https://' + user_env.CUCM_LOCATION + '/axl/' 53 | 54 | # connecting to CUCM device using axl 55 | axl = Client("file:///Users/jbanegas/Repos/cisco_cucm_AXL_phone_inventory_flask_sample/app/schema/AXLAPI.wsdl", 56 | location=url, 57 | faults=False, 58 | plugins=[ImportDoctor(imp)], 59 | username=user_env.CUCM_USER, 60 | password=user_env.CUCM_PASSWORD) 61 | 62 | list_of_devices = [] 63 | 64 | # axl api call being made and filter name with any devices that start with SEP (all phones) 65 | # refer to AXL documentation to see the more phone info you can receive with returnedTags 66 | 67 | res = axl.service.listPhone({'name':"SEP%"}, returnedTags={'name': '', 68 | 'description': '', 69 | 'model': '', 70 | 'networkLocation': '', 71 | 'product': '', 72 | 'class': '', 73 | 'protocol': '', 74 | 'protocolSide': '', 75 | 'callingSearchSpaceName': '' , 76 | 'devicePoolName': '' , 77 | 'commonDeviceConfigName': '', 78 | 'commonPhoneConfigName': '', 79 | 'networkLocation': '', 80 | 'locationName': '' 81 | }) 82 | 83 | # verifying if the response was successful 84 | if (res[0] == 200): 85 | if res[1]['return']: 86 | 87 | phones = res[1]['return']['phone'] 88 | 89 | for phone in list(phones): 90 | phone_list.append(phone) 91 | else: 92 | ("Response Error from AXL API Call") 93 | 94 | return phone_list 95 | 96 | # function for api risport request 97 | def risport_request(): 98 | phone_list = [] 99 | 100 | #Disable HTTPS certificate validation check - not recommended for production 101 | if hasattr(ssl, '_create_unverified_context'):ssl._create_default_https_context = ssl._create_unverified_context 102 | 103 | url = 'https://' + user_env.CUCM_LOCATION + ':8443/realtimeservice/services/RisPort?wsdl' 104 | 105 | tns = 'http://schemas.cisco.com/ast/soap/' 106 | imp = Import('http://schemas.xmlsoap.org/soap/encoding/', 'http://schemas.xmlsoap.org/soap/encoding/') 107 | imp.filter.add(tns) 108 | 109 | 110 | t = HttpAuthenticated(username=user_env.CUCM_USER, password=user_env.CUCM_PASSWORD) 111 | t.handler=urllib.request.HTTPBasicAuthHandler(t.pm) 112 | 113 | context = ssl.SSLContext() 114 | 115 | t1=urllib.request.HTTPSHandler(context=context) 116 | t.urlopener = urllib.request.build_opener(t.handler,t1) 117 | 118 | c = Client(url, plugins=[ImportDoctor(imp)], transport=t) 119 | 120 | result = c.service.SelectCmDevice('',{'SelectBy':'Name', 'Status':'Any', 'Class':'Phone'}) 121 | 122 | total_phones = result['SelectCmDeviceResult']['TotalDevicesFound'] 123 | 124 | list_phones = result['SelectCmDeviceResult']["CmNodes"] 125 | 126 | 127 | for node in result['SelectCmDeviceResult']['CmNodes']: 128 | for device in node['CmDevices']: 129 | phone_list.append(device) 130 | 131 | return phone_list 132 | 133 | # function to extract serial number from the phone's web page 134 | def get_serial(ip_address): 135 | url = 'http://' + ip_address 136 | try: 137 | fhand = urllib.request.urlopen(url).read() 138 | except: 139 | print("unable to reach site") 140 | return "unaccessible" 141 | 142 | soup = BeautifulSoup(fhand, "html.parser") 143 | phoneData = soup.find_all('b') 144 | 145 | searchList = ['MAC Address', 'MAC address','Phone DN', 'UDI'] 146 | 147 | 148 | for bTag in range(len(phoneData)) : 149 | bText = phoneData[bTag].text.strip() 150 | if bText in searchList : 151 | if bText != 'UDI' : 152 | mac=phoneData[bTag + 1].text 153 | else : 154 | #print ('Phone Model: ', phoneData[bTag + 3].text) 155 | #print ('Hardware Revision: ', phoneData[bTag + 7].text) 156 | d=[mac, phoneData[bTag + 3].text] 157 | return d 158 | 159 | #axl_request() 160 | #risport_request() 161 | #get_serial 162 | -------------------------------------------------------------------------------- /app/axl_request_test.py: -------------------------------------------------------------------------------- 1 | """ Copyright (c) 2020 Cisco and/or its affiliates. 2 | This software is licensed to you under the terms of the Cisco Sample 3 | Code License, Version 1.1 (the "License"). You may obtain a copy of the 4 | License at 5 | https://developer.cisco.com/docs/licenses 6 | All use of the material herein must be in accordance with the terms of 7 | the License. All rights not expressly granted by the License are 8 | reserved. Unless required by applicable law or agreed to separately in 9 | writing, software distributed under the License is distributed on an "AS 10 | IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | or implied. 12 | """ 13 | 14 | """ 15 | Script Dependencies: 16 | suds 17 | logging (optional) 18 | Depencency Installation: 19 | $ pip install suds-py3 20 | """ 21 | 22 | import pathlib 23 | import ssl 24 | from suds.client import Client 25 | from suds.xsd.doctor import Import 26 | from suds.xsd.doctor import ImportDoctor 27 | 28 | import os 29 | import sys 30 | 31 | # Get the absolute path for the project root 32 | #project_root = os.path.abspath(os.path.dirname(__file__)) 33 | 34 | # Extend the system path to include the project root and import the env file 35 | #sys.path.insert(0, project_root) 36 | #import user_env 37 | 38 | #Disable HTTPS certificate validation check - not recommended for production 39 | if hasattr(ssl, '_create_unverified_context'):ssl._create_default_https_context = ssl._create_unverified_context 40 | 41 | tns = 'http://schemas.cisco.com/ast/soap/' 42 | imp = Import('http://schemas.xmlsoap.org/soap/encoding/') 43 | imp.filter.add(tns) 44 | 45 | axl = Client("file:///Users/jbanegas/Repos/cisco_cucm_AXL_phone_inventory_flask_sample/app/schema/AXLAPI.wsdl", 46 | location="https://198.18.133.3/axl/", 47 | faults=False,plugins=[ImportDoctor(imp)], 48 | username="amckenzie", 49 | password="dCloud12345!") 50 | 51 | def getSubs(): 52 | res = axl.service.listProcessNode({'name': '%', 'processNodeRole': 'CUCM Voice/Video'}, returnedTags={'name': ''}) 53 | subs = res[1]['return']['processNode'] 54 | for sub in subs: 55 | if sub.name != 'EnterpriseWideData': 56 | print("hello",sub.name) 57 | 58 | 59 | 60 | def listPhones(): 61 | list_of_devices = [] 62 | 63 | res = axl.service.listPhone({'name':"%"}, returnedTags={'name': '', 64 | 'description': '', 65 | 'model': '', 66 | 'networkLocation': '', 67 | 'product': '', 68 | 'class': '', 69 | 'protocol': '', 70 | 'protocolSide': '', 71 | 'callingSearchSpaceName': '' , 72 | 'devicePoolName': '' , 73 | 'commonDeviceConfigName': '', 74 | 'commonPhoneConfigName': '', 75 | 'networkLocation': '', 76 | 'locationName': '', 77 | 'mediaResourceListName': '', 78 | 'networkHoldMohAudioSourceId': '', 79 | 'userHoldMohAudioSourceId': '', 80 | 'automatedAlternateRoutingCssName': '', 81 | 'aarNeighborhoodName': '', 82 | 'loadInformation': '', 83 | 'traceFlag': '', 84 | 'mlppIndicationStatus': '', 85 | 'preemption': '', 86 | 'useTrustedRelayPoint': '', 87 | 'retryVideoCallAsAudio': '', 88 | 'securityProfileName': '', 89 | 'sipProfileName': '', 90 | 'cgpnTransformationCssName': '', 91 | 'useDevicePoolCgpnTransformCss': '', 92 | 'geoLocationName': '', 93 | 'geoLocationFilterName': '', 94 | 'sendGeoLocation': '', 95 | 'numberOfButtons': '', 96 | 'phoneTemplateName': '', 97 | 'primaryPhoneName': '', 98 | 'ringSettingIdleBlfAudibleAlert': '', 99 | 'ringSettingBusyBlfAudibleAlert': '', 100 | 'userLocale': '', 101 | 'networkLocale': '', 102 | 'idleTimeout': '', 103 | 'authenticationUrl': '', 104 | 'directoryUrl': '', 105 | 'idleUrl': '', 106 | 'informationUrl': '', 107 | 'messagesUrl': '', 108 | 'proxyServerUrl': '', 109 | 'servicesUrl': '', 110 | 'softkeyTemplateName': '', 111 | 'loginUserId': '', 112 | 'defaultProfileName': '', 113 | 'enableExtensionMobility': '', 114 | 'currentProfileName': '', 115 | 'loginTime': '', 116 | 'loginDuration': '', 117 | 'currentConfig': '', 118 | 'singleButtonBarge': '', 119 | 'joinAcrossLines': '', 120 | 'builtInBridgeStatus': '', 121 | 'callInfoPrivacyStatus': '', 122 | 'hlogStatus': '', 123 | 'ownerUserName': '', 124 | 'ignorePresentationIndicators': '', 125 | 'packetCaptureMode': '', 126 | 'packetCaptureDuration': '', 127 | 'subscribeCallingSearchSpaceName': '', 128 | 'rerouteCallingSearchSpaceName': '', 129 | 'allowCtiControlFlag': '', 130 | 'presenceGroupName': '', 131 | 'unattendedPort': '', 132 | 'requireDtmfReception': '', 133 | 'rfc2833Disabled': '', 134 | 'certificateOperation': '', 135 | 'authenticationMode': '', 136 | 'keySize': '', 137 | 'keyOrder': '', 138 | 'ecKeySize': '', 139 | 'authenticationString': '', 140 | 'certificateStatus': '', 141 | 'upgradeFinishTime': '', 142 | 'deviceMobilityMode': '', 143 | 'roamingDevicePoolName': '', 144 | 'remoteDevice': '', 145 | 'dndOption': '', 146 | 'dndRingSetting': '', 147 | 'dndStatus': '', 148 | 'isActive': '', 149 | 'isDualMode': '', 150 | 'mobilityUserIdName': '', 151 | 'phoneSuite': '', 152 | 'phoneServiceDisplay': '', 153 | 'isProtected': '', 154 | 'mtpRequired': '', 155 | 'mtpPreferedCodec': '', 156 | 'dialRulesName': '', 157 | 'sshUserId': '', 158 | 'digestUser': '', 159 | 'outboundCallRollover': '', 160 | 'hotlineDevice': '', 161 | 'secureInformationUrl': '', 162 | 'secureDirectoryUrl': '', 163 | 'secureMessageUrl': '', 164 | 'secureServicesUrl': '', 165 | 'secureAuthenticationUrl': '', 166 | 'secureIdleUrl': '', 167 | 'alwaysUsePrimeLine': '', 168 | 'alwaysUsePrimeLineForVoiceMessage': '', 169 | 'featureControlPolicy': '', 170 | 'deviceTrustMode': '', 171 | 'earlyOfferSupportForVoiceCall': '', 172 | 'requireThirdPartyRegistration': '', 173 | 'blockIncomingCallsWhenRoaming': '', 174 | 'homeNetworkId': ''}) 175 | 176 | if (res[0] == 200): 177 | if res[1]['return']: 178 | phones = res[1]['return']['phone'] 179 | 180 | for phone in list(phones): 181 | print(phone["name"]) 182 | print('---------------------') 183 | else: 184 | ("Response Error from AXL API Call") 185 | 186 | x = listPhones() 187 | -------------------------------------------------------------------------------- /app/templates/inventory.html: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | CUCM Inventory Page 62 | 63 | 64 | 65 | 66 | 67 | 87 | 88 | 126 | 127 | 128 | 150 |
151 |
152 |
153 |
154 |

Devices

155 |
156 |

{{num_devices}} Devices total

157 |
158 |
159 |
160 |
161 |
162 |
163 | 164 | 167 |
168 |
169 |
170 | 171 | 172 | 173 | {% for attribute in header %} 174 | 175 | {% endfor %} 176 | 177 | 178 | 179 | {% for device in devices %} 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | {% endfor %} 192 | 193 |
{{attribute}}
{{device.name}}{{device.model}}{{device.ip_address}}{{device.serial_number}}{{device.networkLocation}}{{device.product}}{{device.callingSearchSpaceName}}{{device.devicePoolName}}{{device.mac}}
194 |
195 |
196 |
197 | 211 |
212 | 213 | 214 | -------------------------------------------------------------------------------- /app/schema/AXLEnums.xsd: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | Version 1.00 12 | Copyright (c) 2001, 2005-2013 Cisco Systems, Inc. 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | 1159 | 1160 | 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1198 | 1199 | 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | 1211 | 1212 | 1213 | 1214 | 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 1240 | 1241 | 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | 1264 | 1265 | 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | 1293 | 1294 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | 1313 | 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | 1348 | 1349 | 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | 1366 | 1367 | 1368 | 1369 | 1370 | 1371 | 1372 | 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | 1379 | 1380 | 1381 | 1382 | 1383 | 1384 | 1385 | 1386 | 1387 | 1388 | 1389 | 1390 | 1391 | 1392 | 1393 | 1394 | 1395 | 1396 | 1397 | 1398 | 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | 1460 | 1461 | 1462 | 1463 | 1464 | 1465 | 1466 | 1467 | 1468 | 1469 | 1470 | 1471 | 1472 | 1473 | 1474 | 1475 | 1476 | 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1497 | 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 1672 | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1934 | 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | 2039 | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | 2048 | 2049 | 2050 | 2051 | 2052 | 2053 | 2054 | 2055 | 2056 | 2057 | 2058 | 2059 | 2060 | 2061 | 2062 | 2063 | 2064 | 2065 | 2066 | 2067 | 2068 | 2069 | 2070 | 2071 | 2072 | 2073 | 2074 | 2075 | 2076 | 2077 | 2078 | 2079 | 2080 | 2081 | 2082 | 2083 | 2084 | 2085 | 2086 | 2087 | 2088 | 2089 | 2090 | 2091 | 2092 | 2093 | 2094 | 2095 | 2096 | 2097 | 2098 | 2099 | 2100 | 2101 | 2102 | 2103 | 2104 | 2105 | 2106 | 2107 | 2108 | 2109 | 2110 | 2111 | 2112 | 2113 | 2114 | 2115 | 2116 | 2117 | 2118 | 2119 | 2120 | 2121 | 2122 | 2123 | 2124 | 2125 | 2126 | 2127 | 2128 | 2129 | 2130 | 2131 | 2132 | 2133 | 2134 | 2135 | 2136 | 2137 | 2138 | 2139 | 2140 | 2141 | 2142 | 2143 | 2144 | 2145 | 2146 | 2147 | 2148 | 2149 | 2150 | 2151 | 2152 | 2153 | 2154 | 2155 | 2156 | 2157 | 2158 | 2159 | 2160 | 2161 | 2162 | 2163 | 2164 | 2165 | 2166 | 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 2175 | 2176 | 2177 | 2178 | 2179 | 2180 | 2181 | 2182 | 2183 | 2184 | 2185 | 2186 | 2187 | 2188 | 2189 | 2190 | 2191 | 2192 | 2193 | 2194 | 2195 | 2196 | 2197 | 2198 | 2199 | 2200 | 2201 | 2202 | 2203 | 2204 | 2205 | 2206 | 2207 | 2208 | 2209 | 2210 | 2211 | 2212 | 2213 | 2214 | 2215 | 2216 | 2217 | 2218 | 2219 | 2220 | 2221 | 2222 | 2223 | 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 2230 | 2231 | 2232 | 2233 | 2234 | 2235 | 2236 | 2237 | 2238 | 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 2245 | 2246 | 2247 | 2248 | 2249 | 2250 | 2251 | 2252 | 2253 | 2254 | 2255 | 2256 | 2257 | 2258 | 2259 | 2260 | 2261 | 2262 | 2263 | 2264 | 2265 | 2266 | 2267 | 2268 | 2269 | 2270 | 2271 | 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | 2278 | 2279 | 2280 | 2281 | 2282 | 2283 | 2284 | 2285 | 2286 | 2287 | 2288 | 2289 | 2290 | 2291 | 2292 | 2293 | 2294 | 2295 | 2296 | 2297 | 2298 | 2299 | 2300 | 2301 | 2302 | 2303 | 2304 | 2305 | 2306 | 2307 | 2308 | 2309 | 2310 | 2311 | 2312 | 2313 | 2314 | 2315 | 2316 | 2317 | 2318 | 2319 | 2320 | 2321 | 2322 | 2323 | 2324 | 2325 | 2326 | 2327 | 2328 | 2329 | 2330 | 2331 | 2332 | 2333 | 2334 | 2335 | 2336 | 2337 | 2338 | 2339 | 2340 | 2341 | 2342 | 2343 | 2344 | 2345 | 2346 | 2347 | 2348 | 2349 | 2350 | 2351 | 2352 | 2353 | 2354 | 2355 | 2356 | 2357 | 2358 | 2359 | 2360 | 2361 | 2362 | 2363 | 2364 | 2365 | 2366 | 2367 | 2368 | 2369 | 2370 | 2371 | 2372 | 2373 | 2374 | 2375 | 2376 | 2377 | 2378 | 2379 | 2380 | 2381 | 2382 | 2383 | 2384 | 2385 | 2386 | 2387 | 2388 | 2389 | 2390 | 2391 | 2392 | 2393 | 2394 | 2395 | 2396 | 2397 | 2398 | 2399 | 2400 | 2401 | 2402 | 2403 | 2404 | 2405 | 2406 | 2407 | 2408 | 2409 | 2410 | 2411 | 2412 | 2413 | 2414 | 2415 | 2416 | 2417 | 2418 | 2419 | 2420 | 2421 | 2422 | 2423 | 2424 | 2425 | 2426 | 2427 | 2428 | 2429 | 2430 | 2431 | 2432 | 2433 | 2434 | 2435 | 2436 | 2437 | 2438 | 2439 | 2440 | 2441 | 2442 | 2443 | 2444 | 2445 | 2446 | 2447 | 2448 | 2449 | 2450 | 2451 | 2452 | 2453 | 2454 | 2455 | 2456 | 2457 | 2458 | 2459 | 2460 | 2461 | 2462 | 2463 | 2464 | 2465 | 2466 | 2467 | 2468 | 2469 | 2470 | 2471 | 2472 | 2473 | 2474 | 2475 | 2476 | 2477 | 2478 | 2479 | 2480 | 2481 | 2482 | 2483 | 2484 | 2485 | 2486 | 2487 | 2488 | 2489 | 2490 | 2491 | 2492 | 2493 | 2494 | 2495 | 2496 | 2497 | 2498 | 2499 | 2500 | 2501 | 2502 | 2503 | 2504 | 2505 | 2506 | 2507 | 2508 | 2509 | 2510 | 2511 | 2512 | 2513 | 2514 | 2515 | 2516 | 2517 | 2518 | 2519 | 2520 | 2521 | 2522 | 2523 | 2524 | 2525 | 2526 | 2527 | 2528 | 2529 | 2530 | 2531 | 2532 | 2533 | 2534 | 2535 | 2536 | 2537 | 2538 | 2539 | 2540 | 2541 | 2542 | 2543 | 2544 | 2545 | 2546 | 2547 | 2548 | 2549 | 2550 | 2551 | 2552 | 2553 | 2554 | 2555 | 2556 | 2557 | 2558 | 2559 | 2560 | 2561 | 2562 | 2563 | 2564 | 2565 | 2566 | 2567 | 2568 | 2569 | 2570 | 2571 | 2572 | 2573 | 2574 | 2575 | 2576 | 2577 | 2578 | 2579 | 2580 | 2581 | 2582 | 2583 | 2584 | 2585 | 2586 | 2587 | 2588 | 2589 | 2590 | 2591 | 2592 | 2593 | 2594 | 2595 | 2596 | 2597 | 2598 | 2599 | 2600 | 2601 | 2602 | 2603 | 2604 | 2605 | 2606 | 2607 | 2608 | 2609 | 2610 | 2611 | 2612 | 2613 | 2614 | 2615 | 2616 | 2617 | 2618 | 2619 | 2620 | 2621 | 2622 | 2623 | 2624 | 2625 | 2626 | 2627 | 2628 | 2629 | 2630 | 2631 | 2632 | 2633 | 2634 | 2635 | 2636 | 2637 | 2638 | 2639 | 2640 | 2641 | 2642 | 2643 | 2644 | 2645 | 2646 | 2647 | 2648 | 2649 | 2650 | 2651 | 2652 | 2653 | 2654 | 2655 | 2656 | 2657 | 2658 | 2659 | 2660 | 2661 | 2662 | 2663 | 2664 | 2665 | 2666 | 2667 | 2668 | 2669 | 2670 | 2671 | 2672 | 2673 | 2674 | 2675 | 2676 | 2677 | 2678 | 2679 | 2680 | 2681 | 2682 | 2683 | 2684 | 2685 | 2686 | 2687 | 2688 | 2689 | 2690 | 2691 | 2692 | 2693 | 2694 | 2695 | 2696 | 2697 | 2698 | 2699 | 2700 | 2701 | 2702 | 2703 | 2704 | 2705 | 2706 | 2707 | 2708 | 2709 | 2710 | 2711 | 2712 | 2713 | 2714 | 2715 | 2716 | 2717 | 2718 | 2719 | 2720 | 2721 | 2722 | 2723 | 2724 | 2725 | 2726 | 2727 | 2728 | 2729 | 2730 | 2731 | 2732 | 2733 | 2734 | 2735 | 2736 | 2737 | 2738 | 2739 | 2740 | 2741 | 2742 | 2743 | 2744 | 2745 | 2746 | 2747 | 2748 | 2749 | 2750 | 2751 | 2752 | 2753 | 2754 | 2755 | 2756 | 2757 | 2758 | 2759 | 2760 | 2761 | 2762 | 2763 | 2764 | 2765 | 2766 | 2767 | 2768 | 2769 | 2770 | 2771 | 2772 | 2773 | 2774 | 2775 | 2776 | 2777 | 2778 | 2779 | 2780 | 2781 | 2782 | 2783 | 2784 | 2785 | 2786 | 2787 | 2788 | 2789 | 2790 | 2791 | 2792 | 2793 | 2794 | 2795 | 2796 | 2797 | 2798 | 2799 | 2800 | 2801 | 2802 | 2803 | 2804 | 2805 | 2806 | 2807 | 2808 | 2809 | 2810 | 2811 | 2812 | 2813 | 2814 | 2815 | 2816 | 2817 | 2818 | 2819 | 2820 | 2821 | 2822 | 2823 | 2824 | 2825 | 2826 | 2827 | 2828 | 2829 | 2830 | 2831 | 2832 | 2833 | 2834 | 2835 | 2836 | 2837 | 2838 | 2839 | 2840 | 2841 | 2842 | 2843 | 2844 | 2845 | 2846 | 2847 | 2848 | 2849 | 2850 | 2851 | 2852 | 2853 | 2854 | 2855 | 2856 | 2857 | 2858 | 2859 | 2860 | 2861 | 2862 | 2863 | 2864 | 2865 | 2866 | 2867 | 2868 | 2869 | 2870 | 2871 | 2872 | 2873 | 2874 | 2875 | 2876 | 2877 | 2878 | 2879 | 2880 | 2881 | 2882 | 2883 | 2884 | 2885 | 2886 | 2887 | 2888 | 2889 | 2890 | 2891 | 2892 | 2893 | 2894 | 2895 | 2896 | 2897 | 2898 | 2899 | 2900 | 2901 | 2902 | 2903 | 2904 | 2905 | 2906 | 2907 | 2908 | 2909 | 2910 | 2911 | 2912 | 2913 | 2914 | 2915 | 2916 | 2917 | 2918 | 2919 | 2920 | 2921 | 2922 | 2923 | 2924 | 2925 | 2926 | 2927 | 2928 | 2929 | 2930 | 2931 | 2932 | 2933 | 2934 | 2935 | 2936 | 2937 | 2938 | 2939 | 2940 | 2941 | 2942 | 2943 | 2944 | 2945 | 2946 | 2947 | 2948 | 2949 | 2950 | 2951 | 2952 | 2953 | 2954 | 2955 | 2956 | 2957 | 2958 | 2959 | 2960 | 2961 | 2962 | 2963 | 2964 | 2965 | 2966 | 2967 | 2968 | 2969 | 2970 | 2971 | 2972 | 2973 | 2974 | 2975 | 2976 | 2977 | 2978 | 2979 | 2980 | 2981 | 2982 | 2983 | 2984 | 2985 | 2986 | 2987 | 2988 | 2989 | 2990 | 2991 | 2992 | 2993 | 2994 | 2995 | 2996 | 2997 | 2998 | 2999 | 3000 | 3001 | 3002 | 3003 | 3004 | 3005 | 3006 | 3007 | 3008 | 3009 | 3010 | 3011 | 3012 | 3013 | 3014 | 3015 | 3016 | 3017 | 3018 | 3019 | 3020 | 3021 | 3022 | 3023 | 3024 | 3025 | 3026 | 3027 | 3028 | 3029 | 3030 | 3031 | 3032 | 3033 | 3034 | 3035 | 3036 | 3037 | 3038 | 3039 | 3040 | 3041 | 3042 | 3043 | 3044 | 3045 | 3046 | 3047 | 3048 | 3049 | 3050 | 3051 | 3052 | 3053 | 3054 | 3055 | 3056 | 3057 | 3058 | 3059 | 3060 | 3061 | 3062 | 3063 | 3064 | 3065 | 3066 | 3067 | 3068 | 3069 | 3070 | 3071 | 3072 | 3073 | 3074 | 3075 | 3076 | 3077 | 3078 | 3079 | 3080 | 3081 | 3082 | 3083 | 3084 | 3085 | 3086 | 3087 | 3088 | 3089 | 3090 | 3091 | 3092 | 3093 | 3094 | 3095 | 3096 | 3097 | 3098 | 3099 | 3100 | 3101 | 3102 | 3103 | 3104 | 3105 | 3106 | 3107 | 3108 | 3109 | 3110 | 3111 | 3112 | 3113 | 3114 | 3115 | 3116 | 3117 | 3118 | 3119 | 3120 | 3121 | 3122 | 3123 | 3124 | 3125 | 3126 | 3127 | 3128 | 3129 | 3130 | 3131 | 3132 | 3133 | 3134 | 3135 | 3136 | 3137 | 3138 | 3139 | 3140 | 3141 | 3142 | 3143 | 3144 | 3145 | 3146 | 3147 | 3148 | 3149 | 3150 | 3151 | 3152 | 3153 | 3154 | 3155 | 3156 | 3157 | 3158 | 3159 | 3160 | 3161 | 3162 | 3163 | 3164 | 3165 | 3166 | 3167 | 3168 | 3169 | 3170 | 3171 | 3172 | 3173 | 3174 | 3175 | 3176 | 3177 | 3178 | 3179 | 3180 | 3181 | 3182 | 3183 | 3184 | 3185 | 3186 | 3187 | 3188 | 3189 | 3190 | 3191 | 3192 | 3193 | 3194 | 3195 | 3196 | 3197 | 3198 | 3199 | 3200 | 3201 | 3202 | 3203 | 3204 | 3205 | 3206 | 3207 | 3208 | 3209 | 3210 | 3211 | --------------------------------------------------------------------------------