├── requirements.in ├── NOTICE ├── inventory.yml ├── requirements.txt ├── .github └── workflows │ └── scrape.yml ├── retrieve_configs.py ├── .gitignore ├── README.md ├── configs ├── rtr-branch1-running_config.txt ├── rtr-branch2-running_config.txt ├── rtr-core-running_config.txt └── rtr-branch3-running_config.txt └── LICENSE /requirements.in: -------------------------------------------------------------------------------- 1 | pyyaml 2 | scrapli 3 | scrapli-asyncssh 4 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | network-config-scraper 2 | Copyright (c) 2021 World Wide Technology 3 | 4 | This project includes software developed at World Wide Technology. 5 | 6 | This project includes: 7 | scrapli under the MIT license 8 | -------------------------------------------------------------------------------- /inventory.yml: -------------------------------------------------------------------------------- 1 | 2 | devices: 3 | - hostname: rtr-core 4 | host: 10.255.70.234 5 | platform: cisco_iosxe 6 | - hostname: rtr-branch2 7 | host: 10.255.70.232 8 | platform: cisco_iosxe 9 | - hostname: rtr-branch1 10 | host: 10.255.70.252 11 | platform: cisco_iosxe 12 | - hostname: rtr-branch3 13 | host: 10.255.70.216 14 | platform: cisco_iosxe 15 | 16 | transport: 17 | auth_strict_key: false 18 | transport: asyncssh 19 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile 3 | # To update, run: 4 | # 5 | # pip-compile requirements.in 6 | # 7 | asyncssh==2.7.0 8 | # via scrapli-asyncssh 9 | cffi==1.14.6 10 | # via cryptography 11 | cryptography==3.4.7 12 | # via asyncssh 13 | pycparser==2.20 14 | # via cffi 15 | pyyaml==5.4.1 16 | # via -r requirements.in 17 | scrapli-asyncssh==2020.12.23 18 | # via -r requirements.in 19 | scrapli==2021.1.30 20 | # via 21 | # -r requirements.in 22 | # scrapli-asyncssh 23 | -------------------------------------------------------------------------------- /.github/workflows/scrape.yml: -------------------------------------------------------------------------------- 1 | name: scrape network configs 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | schedule: 9 | - cron: '*/30 * * * *' 10 | 11 | jobs: 12 | scheduled: 13 | runs-on: [self-hosted, atc-runners] 14 | steps: 15 | - name: Check out this repo 16 | uses: actions/checkout@v2 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v2 20 | with: 21 | python-version: '3.9' 22 | 23 | - uses: actions/cache@v2 24 | with: 25 | path: ~/.cache/pip 26 | key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} 27 | restore-keys: | 28 | ${{ runner.os }}-pip- 29 | 30 | - name: Install dependencies 31 | run: | 32 | python -m pip install --upgrade pip 33 | pip install -r requirements.txt 34 | 35 | - name: Fetch latest configs 36 | run: |- 37 | python retrieve_configs.py 38 | env: 39 | SSH_AUTH_USERNAME: ${{ secrets.SSH_AUTH_USERNAME }} 40 | SSH_AUTH_PASSWORD: ${{ secrets.SSH_AUTH_PASSWORD }} 41 | 42 | - name: Commit and push if it changed 43 | run: |- 44 | git config user.name "Automated" 45 | git config user.email "actions@users.noreply.github.com" 46 | git add -A 47 | timestamp=$(date -u) 48 | git commit -m "Latest data: ${timestamp}" || exit 0 49 | git push 50 | -------------------------------------------------------------------------------- /retrieve_configs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Script to collect running and startup configs from devices 3 | 4 | Author: Tafsir Thiam; ttafsir@gmail.com 5 | """ 6 | import asyncio 7 | import os 8 | from pathlib import Path 9 | import typing as t 10 | 11 | import yaml 12 | from scrapli import AsyncScrapli 13 | 14 | 15 | OUTPUT_DIR = Path("configs") 16 | 17 | 18 | async def gather_config( 19 | device: t.Dict, config_type: str = "running" 20 | ) -> t.Tuple[str, str]: 21 | """Function to retrieve device configurations 22 | 23 | :param device: device data with device details 24 | :type device: t.Dict 25 | :return: hostname and config 26 | :rtype: t.Tuple[str, str] 27 | """ 28 | if config_type not in ("running", "startup"): 29 | raise ValueError("config_type must be 'running' or 'startup'") 30 | 31 | device.pop("hostname") 32 | conn = AsyncScrapli(**device) 33 | await conn.open() 34 | prompt_result = await conn.get_prompt() 35 | version_result = await conn.send_command(f"show {config_type}-config") 36 | await conn.close() 37 | return prompt_result[:-1], version_result 38 | 39 | 40 | async def main(inventory: t.Dict) -> None: 41 | """Gather data from multiple devices defined in inventory 42 | 43 | :param inventory: inventory data with device details 44 | :type inventory: t.Dict 45 | """ 46 | devices = inventory.get("devices", []) 47 | for device in devices: 48 | device.update( 49 | { 50 | "auth_username": os.environ["SSH_AUTH_USERNAME"], 51 | "auth_password": os.environ["SSH_AUTH_PASSWORD"], 52 | "transport": inventory.get("transport.transport", "asyncssh"), 53 | "auth_strict_key": inventory.get("auth_strict_key", False), 54 | } 55 | ) 56 | 57 | tasks = [gather_config(device) for device in devices] 58 | results = await asyncio.gather(*tasks) 59 | 60 | # ensure output directory exists 61 | OUTPUT_DIR.mkdir(parents=True, exist_ok=True) 62 | 63 | # write results to file 64 | for hostname, config in results: 65 | filepath = OUTPUT_DIR / f"{hostname}-running_config.txt" 66 | print(f"saving: {filepath}") 67 | Path(filepath).write_text(config.result) 68 | 69 | 70 | if __name__ == "__main__": 71 | inventory = yaml.safe_load(open("inventory.yml")) 72 | asyncio.get_event_loop().run_until_complete(main(inventory)) 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Network Config Scraper 2 | 3 | This repository demonstrates the use of Github Actions and `git-scraping` to build an automated backup solution for network configuration files. **Git** already provides an efficient way to track and manage changes to textual data, and Github Actions provide automation that we can use to fetch and process configuration backups without reliance on any additional infrastructure. The solution in this repository uses both to retrieve configurations from network devices on a defined schedule and commits the detected changes back to the repository. 4 | 5 | This approach is heavily inspired by [Git scraping: track changes over time by scraping to a Git repository](https://simonwillison.net/2020/Oct/9/git-scraping/) by Simon Willison. His post provides an excellent overview of git-scraping data from various sources on the Internet. 6 | 7 | ![config scraper](https://user-images.githubusercontent.com/7189920/127345302-e08d8144-2c97-40b3-973c-637fe0933220.png) 8 | 9 | ## Could I use this? 10 | 11 | Because of the textual nature of network configurations, git-scraping offers a simple yet effective way to backup and version configuration data. It runs entirely on GitHub Actions, so there's no complex infrastructure or orchestrations to manage. 12 | 13 | Because the data we retrieve data from devices in a private lab, the repository uses a self-hosted runner that makes a connection to Github and has access to the lab. You'd have to decide if this is an acceptable model for your environment. 14 | 15 | However, the solution works wonderfully and can be extended to fit into your existing automation. For example, using the webhooks in Github can extend this solution by allowing you to build or set up integrations to external automation systems which can subscribe to certain events on the repository. The configured events can trigger an HTTP POST to a system like Ansible Tower to provide additional automation. 16 | 17 | ## How does it work? 18 | 19 | The configuration scraper is configured and scheduled in the [.github/workflows/scrape.yml](.github/workflows/scrape.yml) action workflow. It's a short and simple workflow that defines all the triggers and steps to run our automation. 20 | 21 | ### trigger 22 | 23 | The workflow can be triggered in 3 different ways: on a push event to the repo, manually using the `workflow_dispatch`, or, most importantly, on a cron schedule. For example, in the snippet below, you can see that we have the workflow triggered every 30 minutes. 24 | 25 | ```yaml 26 | on: 27 | push: 28 | branches: 29 | - main 30 | workflow_dispatch: 31 | schedule: 32 | - cron: '*/30 * * * *' 33 | ``` 34 | 35 | ### self-hosted runner(s) 36 | 37 | Because our use case is slightly different from fetching data from flat files, we need to account for how GitHub would access the devices that we are fetching data from. For example, the devices in the `inventory.yml` are in a lab that sits behind a firewall, so a public Github action runner would not have the required access. For that reason, the repo is configured to use a self-hosted Github action runner that has access to the lab environment. It took about 15 minutes to [provision and to configure a runner](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) in this environment, so it is a relatively easy and painless process. Once configured, the self-hosted runner creates a connection to Github and listens for job requests to execute your actions. 38 | 39 | Within the action workflow, the only things to specify are the fact that we're using a self-hosted runner and we also provide the tags to identify which runner to use for the action. We use the `runs-on` directive in the action to do just that, as shown below. 40 | 41 | ```yaml 42 | jobs: 43 | scheduled: 44 | runs-on: [self-hosted, atc-runners] 45 | ``` 46 | 47 | ## data 48 | 49 | For data gathering, the `retrieve_configs.py` script is used to retrieve and save configuration data from each of the devices listed in the `inventory.yml` file. The script uses an async SSH connection transport from the `scrapli` library to handle parallel sessions to devices. Once the files are saved, the action workflow uses `git` to stage any files in which changes have been detected. A commit is created with a timestamp before the changes are pushed into the repository. 50 | 51 | ```yaml 52 | - name: Fetch latest configs 53 | run: |- 54 | python retrieve_configs.py 55 | env: 56 | SSH_AUTH_USERNAME: ${{ secrets.SSH_AUTH_USERNAME }} 57 | SSH_AUTH_PASSWORD: ${{ secrets.SSH_AUTH_PASSWORD }} 58 | 59 | - name: Commit and push if it changed 60 | run: |- 61 | git config user.name "Automated" 62 | git config user.email "actions@users.noreply.github.com" 63 | git add -A 64 | timestamp=$(date -u) 65 | git commit -m "Latest data: ${timestamp}" || exit 0 66 | git push 67 | ``` 68 | 69 | ## How do I track changes? 70 | 71 | The neat thing about using **Git** to manage your configuration backups is that you get this [commit log](https://github.com/wwt/network-config-scraper/commits/main/configs) showing the history of commits that have been made to your configs. 72 | 73 | ## Author(s) 74 | 75 | * Tafsir Thiam - @ttafsir - tafsir.thiam@wwt.com 76 | -------------------------------------------------------------------------------- /configs/rtr-branch1-running_config.txt: -------------------------------------------------------------------------------- 1 | Building configuration... 2 | 3 | Current configuration : 4804 bytes 4 | ! 5 | ! Last configuration change at 22:09:27 UTC Fri Sep 10 2021 by cisco 6 | ! 7 | version 17.3 8 | service timestamps debug datetime msec 9 | service timestamps log datetime msec 10 | ! Call-home is enabled by Smart-Licensing. 11 | service call-home 12 | platform qfp utilization monitor load 80 13 | platform punt-keepalive disable-kernel-core 14 | platform console serial 15 | ! 16 | hostname rtr-branch1 17 | ! 18 | boot-start-marker 19 | boot-end-marker 20 | ! 21 | ! 22 | ! 23 | no aaa new-model 24 | ! 25 | ip vrf mgmt 26 | ! 27 | ! 28 | ! 29 | ! 30 | ! 31 | ! 32 | ! 33 | ip domain name dev.wwtatc.local 34 | ! 35 | ! 36 | ! 37 | login on-success log 38 | ! 39 | ! 40 | ! 41 | ! 42 | ! 43 | ! 44 | ! 45 | subscriber templating 46 | ! 47 | ! 48 | ! 49 | ! 50 | ! 51 | ! 52 | multilink bundle-name authenticated 53 | ! 54 | ! 55 | ! 56 | ! 57 | ! 58 | ! 59 | ! 60 | ! 61 | ! 62 | ! 63 | ! 64 | ! 65 | ! 66 | ! 67 | ! 68 | crypto pki trustpoint SLA-TrustPoint 69 | enrollment pkcs12 70 | revocation-check crl 71 | ! 72 | ! 73 | crypto pki certificate chain SLA-TrustPoint 74 | certificate ca 01 75 | 30820321 30820209 A0030201 02020101 300D0609 2A864886 F70D0101 0B050030 76 | 32310E30 0C060355 040A1305 43697363 6F312030 1E060355 04031317 43697363 77 | 6F204C69 63656E73 696E6720 526F6F74 20434130 1E170D31 33303533 30313934 78 | 3834375A 170D3338 30353330 31393438 34375A30 32310E30 0C060355 040A1305 79 | 43697363 6F312030 1E060355 04031317 43697363 6F204C69 63656E73 696E6720 80 | 526F6F74 20434130 82012230 0D06092A 864886F7 0D010101 05000382 010F0030 81 | 82010A02 82010100 A6BCBD96 131E05F7 145EA72C 2CD686E6 17222EA1 F1EFF64D 82 | CBB4C798 212AA147 C655D8D7 9471380D 8711441E 1AAF071A 9CAE6388 8A38E520 83 | 1C394D78 462EF239 C659F715 B98C0A59 5BBB5CBD 0CFEBEA3 700A8BF7 D8F256EE 84 | 4AA4E80D DB6FD1C9 60B1FD18 FFC69C96 6FA68957 A2617DE7 104FDC5F EA2956AC 85 | 7390A3EB 2B5436AD C847A2C5 DAB553EB 69A9A535 58E9F3E3 C0BD23CF 58BD7188 86 | 68E69491 20F320E7 948E71D7 AE3BCC84 F10684C7 4BC8E00F 539BA42B 42C68BB7 87 | C7479096 B4CB2D62 EA2F505D C7B062A4 6811D95B E8250FC4 5D5D5FB8 8F27D191 88 | C55F0D76 61F9A4CD 3D992327 A8BB03BD 4E6D7069 7CBADF8B DF5F4368 95135E44 89 | DFC7C6CF 04DD7FD1 02030100 01A34230 40300E06 03551D0F 0101FF04 04030201 90 | 06300F06 03551D13 0101FF04 05300301 01FF301D 0603551D 0E041604 1449DC85 91 | 4B3D31E5 1B3E6A17 606AF333 3D3B4C73 E8300D06 092A8648 86F70D01 010B0500 92 | 03820101 00507F24 D3932A66 86025D9F E838AE5C 6D4DF6B0 49631C78 240DA905 93 | 604EDCDE FF4FED2B 77FC460E CD636FDB DD44681E 3A5673AB 9093D3B1 6C9E3D8B 94 | D98987BF E40CBD9E 1AECA0C2 2189BB5C 8FA85686 CD98B646 5575B146 8DFC66A8 95 | 467A3DF4 4D565700 6ADF0F0D CF835015 3C04FF7C 21E878AC 11BA9CD2 55A9232C 96 | 7CA7B7E6 C1AF74F6 152E99B7 B1FCF9BB E973DE7F 5BDDEB86 C71E3B49 1765308B 97 | 5FB0DA06 B92AFE7F 494E8A9E 07B85737 F3A58BE1 1A48A229 C37C1E69 39F08678 98 | 80DDCD16 D6BACECA EEBC7CF9 8428787B 35202CDC 60E4616A B623CDBD 230E3AFB 99 | 418616A9 4093E049 4D10AB75 27E86F73 932E35B5 8862FDAE 0275156F 719BB2F0 100 | D697DF7F 28 101 | quit 102 | ! 103 | license udi pid CSR1000V sn 971JSPCAEGV 104 | diagnostic bootup level minimal 105 | memory free low-watermark processor 71556 106 | ! 107 | ! 108 | spanning-tree extend system-id 109 | ! 110 | username admin privilege 15 secret 9 $9$Z6UmC9jequgwpE$hHnDour2iEJISaIPEyjRe78G0RFZ140gvX.H2mDBBak 111 | username cisco privilege 15 secret 9 $9$nfDeAMBgveUro.$kQutDXdnWCq0zxjtVSA1TGPBzqHz0oJEptanpH9mhd2 112 | ! 113 | redundancy 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 | interface GigabitEthernet1 140 | description Connection to rtr-core 141 | ip address 10.1.1.2 255.255.255.252 142 | negotiation auto 143 | no mop enabled 144 | no mop sysid 145 | ! 146 | interface GigabitEthernet2 147 | no ip address 148 | shutdown 149 | negotiation auto 150 | no mop enabled 151 | no mop sysid 152 | ! 153 | interface GigabitEthernet3 154 | no ip address 155 | shutdown 156 | negotiation auto 157 | no mop enabled 158 | no mop sysid 159 | ! 160 | interface GigabitEthernet4 161 | description OOB MANAGEMENT INTERFACE 162 | ip vrf forwarding mgmt 163 | ip address dhcp 164 | negotiation auto 165 | no mop enabled 166 | no mop sysid 167 | ! 168 | router ospf 1 169 | max-metric router-lsa on-startup 110 170 | area 0 capability default-exclusion 171 | area 0 authentication 172 | passive-interface default 173 | no passive-interface GigabitEthernet1 174 | no passive-interface GigabitEthernet2 175 | no passive-interface GigabitEthernet3 176 | network 10.1.1.0 0.0.0.3 area 0 177 | ! 178 | ip forward-protocol nd 179 | no ip http server 180 | ip http secure-server 181 | ! 182 | ! 183 | ! 184 | ! 185 | ! 186 | ! 187 | ! 188 | ! 189 | control-plane 190 | ! 191 | ! 192 | ! 193 | ! 194 | ! 195 | banner motd ^C 196 | UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED 197 | 198 | You must have explicit, authorized permission to access or configure this device. 199 | Unauthorized attempts and actions to access or use this system may result in civil 200 | and/or criminal penalties. All activities performed on this device are logged and 201 | monitored. 202 | ^C 203 | ! 204 | line con 0 205 | login local 206 | stopbits 1 207 | line vty 0 4 208 | login local 209 | transport input ssh 210 | ! 211 | call-home 212 | ! If contact email address in call-home is configured as sch-smart-licensing@cisco.com 213 | ! the email address configured in Cisco Smart License Portal will be used as contact email address to send SCH notifications. 214 | contact-email-addr sch-smart-licensing@cisco.com 215 | profile "CiscoTAC-1" 216 | active 217 | destination transport-method http 218 | ntp source GigabitEthernet4 219 | ntp server time.nist.gov 220 | ! 221 | ! 222 | ! 223 | ! 224 | ! 225 | end -------------------------------------------------------------------------------- /configs/rtr-branch2-running_config.txt: -------------------------------------------------------------------------------- 1 | Building configuration... 2 | 3 | Current configuration : 4814 bytes 4 | ! 5 | ! Last configuration change at 22:09:27 UTC Fri Sep 10 2021 by cisco 6 | ! 7 | version 17.3 8 | service timestamps debug datetime msec 9 | service timestamps log datetime msec 10 | ! Call-home is enabled by Smart-Licensing. 11 | service call-home 12 | platform qfp utilization monitor load 80 13 | platform punt-keepalive disable-kernel-core 14 | platform console serial 15 | ! 16 | hostname rtr-branch2 17 | ! 18 | boot-start-marker 19 | boot-end-marker 20 | ! 21 | ! 22 | ! 23 | no aaa new-model 24 | ! 25 | ip vrf mgmt 26 | ! 27 | ! 28 | ! 29 | ! 30 | ! 31 | ! 32 | ! 33 | ip domain name dev.wwtatc.local 34 | ! 35 | ! 36 | ! 37 | login on-success log 38 | ! 39 | ! 40 | ! 41 | ! 42 | ! 43 | ! 44 | ! 45 | subscriber templating 46 | ! 47 | ! 48 | ! 49 | ! 50 | ! 51 | ! 52 | multilink bundle-name authenticated 53 | ! 54 | ! 55 | ! 56 | ! 57 | ! 58 | ! 59 | ! 60 | ! 61 | ! 62 | ! 63 | ! 64 | ! 65 | ! 66 | ! 67 | ! 68 | crypto pki trustpoint SLA-TrustPoint 69 | enrollment pkcs12 70 | revocation-check crl 71 | ! 72 | ! 73 | crypto pki certificate chain SLA-TrustPoint 74 | certificate ca 01 75 | 30820321 30820209 A0030201 02020101 300D0609 2A864886 F70D0101 0B050030 76 | 32310E30 0C060355 040A1305 43697363 6F312030 1E060355 04031317 43697363 77 | 6F204C69 63656E73 696E6720 526F6F74 20434130 1E170D31 33303533 30313934 78 | 3834375A 170D3338 30353330 31393438 34375A30 32310E30 0C060355 040A1305 79 | 43697363 6F312030 1E060355 04031317 43697363 6F204C69 63656E73 696E6720 80 | 526F6F74 20434130 82012230 0D06092A 864886F7 0D010101 05000382 010F0030 81 | 82010A02 82010100 A6BCBD96 131E05F7 145EA72C 2CD686E6 17222EA1 F1EFF64D 82 | CBB4C798 212AA147 C655D8D7 9471380D 8711441E 1AAF071A 9CAE6388 8A38E520 83 | 1C394D78 462EF239 C659F715 B98C0A59 5BBB5CBD 0CFEBEA3 700A8BF7 D8F256EE 84 | 4AA4E80D DB6FD1C9 60B1FD18 FFC69C96 6FA68957 A2617DE7 104FDC5F EA2956AC 85 | 7390A3EB 2B5436AD C847A2C5 DAB553EB 69A9A535 58E9F3E3 C0BD23CF 58BD7188 86 | 68E69491 20F320E7 948E71D7 AE3BCC84 F10684C7 4BC8E00F 539BA42B 42C68BB7 87 | C7479096 B4CB2D62 EA2F505D C7B062A4 6811D95B E8250FC4 5D5D5FB8 8F27D191 88 | C55F0D76 61F9A4CD 3D992327 A8BB03BD 4E6D7069 7CBADF8B DF5F4368 95135E44 89 | DFC7C6CF 04DD7FD1 02030100 01A34230 40300E06 03551D0F 0101FF04 04030201 90 | 06300F06 03551D13 0101FF04 05300301 01FF301D 0603551D 0E041604 1449DC85 91 | 4B3D31E5 1B3E6A17 606AF333 3D3B4C73 E8300D06 092A8648 86F70D01 010B0500 92 | 03820101 00507F24 D3932A66 86025D9F E838AE5C 6D4DF6B0 49631C78 240DA905 93 | 604EDCDE FF4FED2B 77FC460E CD636FDB DD44681E 3A5673AB 9093D3B1 6C9E3D8B 94 | D98987BF E40CBD9E 1AECA0C2 2189BB5C 8FA85686 CD98B646 5575B146 8DFC66A8 95 | 467A3DF4 4D565700 6ADF0F0D CF835015 3C04FF7C 21E878AC 11BA9CD2 55A9232C 96 | 7CA7B7E6 C1AF74F6 152E99B7 B1FCF9BB E973DE7F 5BDDEB86 C71E3B49 1765308B 97 | 5FB0DA06 B92AFE7F 494E8A9E 07B85737 F3A58BE1 1A48A229 C37C1E69 39F08678 98 | 80DDCD16 D6BACECA EEBC7CF9 8428787B 35202CDC 60E4616A B623CDBD 230E3AFB 99 | 418616A9 4093E049 4D10AB75 27E86F73 932E35B5 8862FDAE 0275156F 719BB2F0 100 | D697DF7F 28 101 | quit 102 | ! 103 | license udi pid CSR1000V sn 9LUVKMHI2RS 104 | diagnostic bootup level minimal 105 | memory free low-watermark processor 71556 106 | ! 107 | ! 108 | spanning-tree extend system-id 109 | ! 110 | username admin privilege 15 secret 9 $9$njNz/TuZQS/NG.$hNYU.ugYjcImDwtjnCYttM9MVPLZqkZRf8CWSwGSfVk 111 | username cisco privilege 15 secret 9 $9$PEeM5aVHrU7Fbk$36AxRi102naDB.9M.FWeyXPO2cxTaSGxVB.Svj/LcI6 112 | ! 113 | redundancy 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 | interface GigabitEthernet1 140 | description Connection to rtr-core 141 | ip address 10.1.2.2 255.255.255.252 142 | negotiation auto 143 | no mop enabled 144 | no mop sysid 145 | ! 146 | interface GigabitEthernet2 147 | no ip address 148 | shutdown 149 | negotiation auto 150 | no mop enabled 151 | no mop sysid 152 | ! 153 | interface GigabitEthernet3 154 | no ip address 155 | shutdown 156 | negotiation auto 157 | no mop enabled 158 | no mop sysid 159 | ! 160 | interface GigabitEthernet4 161 | description OOB MANAGEMENT INTERFACE 162 | ip vrf forwarding mgmt 163 | ip address dhcp 164 | negotiation auto 165 | no mop enabled 166 | no mop sysid 167 | ! 168 | router ospf 1 169 | max-metric router-lsa on-startup 110 170 | area 0 capability default-exclusion 171 | area 0 authentication 172 | passive-interface default 173 | no passive-interface GigabitEthernet1 174 | no passive-interface GigabitEthernet2 175 | no passive-interface GigabitEthernet3 176 | network 10.1.2.0 0.0.0.3 area 0 177 | ! 178 | ip forward-protocol nd 179 | no ip http server 180 | ip http secure-server 181 | ! 182 | ! 183 | ! 184 | ! 185 | ! 186 | ! 187 | ! 188 | ! 189 | control-plane 190 | ! 191 | ! 192 | ! 193 | ! 194 | ! 195 | banner motd ^C 196 | UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED 197 | 198 | You must have explicit, authorized permission to access or configure this device. 199 | Unauthorized attempts and actions to access or use this system may result in civil 200 | and/or criminal penalties. All activities performed on this device are logged and 201 | monitored. 202 | ^C 203 | ! 204 | line con 0 205 | login local 206 | stopbits 1 207 | line vty 0 4 208 | login local 209 | length 0 210 | transport input ssh 211 | ! 212 | call-home 213 | ! If contact email address in call-home is configured as sch-smart-licensing@cisco.com 214 | ! the email address configured in Cisco Smart License Portal will be used as contact email address to send SCH notifications. 215 | contact-email-addr sch-smart-licensing@cisco.com 216 | profile "CiscoTAC-1" 217 | active 218 | destination transport-method http 219 | ntp source GigabitEthernet4 220 | ntp server time.nist.gov 221 | ! 222 | ! 223 | ! 224 | ! 225 | ! 226 | end -------------------------------------------------------------------------------- /configs/rtr-core-running_config.txt: -------------------------------------------------------------------------------- 1 | Building configuration... 2 | 3 | Current configuration : 4972 bytes 4 | ! 5 | ! Last configuration change at 22:09:29 UTC Fri Sep 10 2021 by cisco 6 | ! 7 | version 17.3 8 | service timestamps debug datetime msec 9 | service timestamps log datetime msec 10 | ! Call-home is enabled by Smart-Licensing. 11 | service call-home 12 | platform qfp utilization monitor load 80 13 | platform punt-keepalive disable-kernel-core 14 | platform console serial 15 | ! 16 | hostname rtr-core 17 | ! 18 | boot-start-marker 19 | boot-end-marker 20 | ! 21 | ! 22 | ! 23 | no aaa new-model 24 | ! 25 | ip vrf mgmt 26 | ! 27 | ! 28 | ! 29 | ! 30 | ! 31 | ! 32 | ! 33 | ip domain name dev.wwtatc.local 34 | ! 35 | ! 36 | ! 37 | login on-success log 38 | ! 39 | ! 40 | ! 41 | ! 42 | ! 43 | ! 44 | ! 45 | subscriber templating 46 | ! 47 | ! 48 | ! 49 | ! 50 | ! 51 | ! 52 | multilink bundle-name authenticated 53 | ! 54 | ! 55 | ! 56 | ! 57 | ! 58 | ! 59 | ! 60 | ! 61 | ! 62 | ! 63 | ! 64 | ! 65 | ! 66 | ! 67 | ! 68 | crypto pki trustpoint SLA-TrustPoint 69 | enrollment pkcs12 70 | revocation-check crl 71 | ! 72 | ! 73 | crypto pki certificate chain SLA-TrustPoint 74 | certificate ca 01 75 | 30820321 30820209 A0030201 02020101 300D0609 2A864886 F70D0101 0B050030 76 | 32310E30 0C060355 040A1305 43697363 6F312030 1E060355 04031317 43697363 77 | 6F204C69 63656E73 696E6720 526F6F74 20434130 1E170D31 33303533 30313934 78 | 3834375A 170D3338 30353330 31393438 34375A30 32310E30 0C060355 040A1305 79 | 43697363 6F312030 1E060355 04031317 43697363 6F204C69 63656E73 696E6720 80 | 526F6F74 20434130 82012230 0D06092A 864886F7 0D010101 05000382 010F0030 81 | 82010A02 82010100 A6BCBD96 131E05F7 145EA72C 2CD686E6 17222EA1 F1EFF64D 82 | CBB4C798 212AA147 C655D8D7 9471380D 8711441E 1AAF071A 9CAE6388 8A38E520 83 | 1C394D78 462EF239 C659F715 B98C0A59 5BBB5CBD 0CFEBEA3 700A8BF7 D8F256EE 84 | 4AA4E80D DB6FD1C9 60B1FD18 FFC69C96 6FA68957 A2617DE7 104FDC5F EA2956AC 85 | 7390A3EB 2B5436AD C847A2C5 DAB553EB 69A9A535 58E9F3E3 C0BD23CF 58BD7188 86 | 68E69491 20F320E7 948E71D7 AE3BCC84 F10684C7 4BC8E00F 539BA42B 42C68BB7 87 | C7479096 B4CB2D62 EA2F505D C7B062A4 6811D95B E8250FC4 5D5D5FB8 8F27D191 88 | C55F0D76 61F9A4CD 3D992327 A8BB03BD 4E6D7069 7CBADF8B DF5F4368 95135E44 89 | DFC7C6CF 04DD7FD1 02030100 01A34230 40300E06 03551D0F 0101FF04 04030201 90 | 06300F06 03551D13 0101FF04 05300301 01FF301D 0603551D 0E041604 1449DC85 91 | 4B3D31E5 1B3E6A17 606AF333 3D3B4C73 E8300D06 092A8648 86F70D01 010B0500 92 | 03820101 00507F24 D3932A66 86025D9F E838AE5C 6D4DF6B0 49631C78 240DA905 93 | 604EDCDE FF4FED2B 77FC460E CD636FDB DD44681E 3A5673AB 9093D3B1 6C9E3D8B 94 | D98987BF E40CBD9E 1AECA0C2 2189BB5C 8FA85686 CD98B646 5575B146 8DFC66A8 95 | 467A3DF4 4D565700 6ADF0F0D CF835015 3C04FF7C 21E878AC 11BA9CD2 55A9232C 96 | 7CA7B7E6 C1AF74F6 152E99B7 B1FCF9BB E973DE7F 5BDDEB86 C71E3B49 1765308B 97 | 5FB0DA06 B92AFE7F 494E8A9E 07B85737 F3A58BE1 1A48A229 C37C1E69 39F08678 98 | 80DDCD16 D6BACECA EEBC7CF9 8428787B 35202CDC 60E4616A B623CDBD 230E3AFB 99 | 418616A9 4093E049 4D10AB75 27E86F73 932E35B5 8862FDAE 0275156F 719BB2F0 100 | D697DF7F 28 101 | quit 102 | ! 103 | license udi pid CSR1000V sn 9FFRNB259PQ 104 | diagnostic bootup level minimal 105 | memory free low-watermark processor 71556 106 | ! 107 | ! 108 | spanning-tree extend system-id 109 | ! 110 | username admin privilege 15 secret 9 $9$RLFl95.ILDfIu.$RQ97er5WzKIBB6pO9FT6.3RIlQHg0s5UsX802OkgClI 111 | username cisco privilege 15 secret 9 $9$.7vAVv8JcjI.sE$SyXH/tmZHkS1wLd69HDzb3yw7q4HIW2PZJJd9TPlotA 112 | ! 113 | redundancy 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 | interface GigabitEthernet1 140 | description Connection to rtr-branch1 141 | ip address 10.1.1.1 255.255.255.252 142 | negotiation auto 143 | no mop enabled 144 | no mop sysid 145 | ! 146 | interface GigabitEthernet2 147 | description Connection to rtr-branch2 148 | ip address 10.1.2.1 255.255.255.252 149 | negotiation auto 150 | no mop enabled 151 | no mop sysid 152 | ! 153 | interface GigabitEthernet3 154 | description Connection to rtr-branch3 155 | ip address 10.1.3.1 255.255.255.252 156 | negotiation auto 157 | no mop enabled 158 | no mop sysid 159 | ! 160 | interface GigabitEthernet4 161 | description OOB MANAGEMENT INTERFACE 162 | ip vrf forwarding mgmt 163 | ip address dhcp 164 | negotiation auto 165 | no mop enabled 166 | no mop sysid 167 | ! 168 | router ospf 1 169 | max-metric router-lsa on-startup 110 170 | area 0 capability default-exclusion 171 | area 0 authentication 172 | passive-interface default 173 | no passive-interface GigabitEthernet1 174 | no passive-interface GigabitEthernet2 175 | no passive-interface GigabitEthernet3 176 | network 10.1.1.0 0.0.0.3 area 0 177 | network 10.1.2.0 0.0.0.3 area 0 178 | network 10.1.3.0 0.0.0.3 area 0 179 | ! 180 | ip forward-protocol nd 181 | no ip http server 182 | ip http secure-server 183 | ! 184 | ! 185 | ! 186 | ! 187 | ! 188 | ! 189 | ! 190 | ! 191 | control-plane 192 | ! 193 | ! 194 | ! 195 | ! 196 | ! 197 | banner motd ^C 198 | UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED 199 | 200 | You must have explicit, authorized permission to access or configure this device. 201 | Unauthorized attempts and actions to access or use this system may result in civil 202 | and/or criminal penalties. All activities performed on this device are logged and 203 | monitored. 204 | ^C 205 | ! 206 | line con 0 207 | login local 208 | stopbits 1 209 | line vty 0 4 210 | login local 211 | transport input ssh 212 | ! 213 | call-home 214 | ! If contact email address in call-home is configured as sch-smart-licensing@cisco.com 215 | ! the email address configured in Cisco Smart License Portal will be used as contact email address to send SCH notifications. 216 | contact-email-addr sch-smart-licensing@cisco.com 217 | profile "CiscoTAC-1" 218 | active 219 | destination transport-method http 220 | ntp source GigabitEthernet4 221 | ntp server time.nist.gov 222 | ! 223 | ! 224 | ! 225 | ! 226 | ! 227 | end -------------------------------------------------------------------------------- /configs/rtr-branch3-running_config.txt: -------------------------------------------------------------------------------- 1 | Building configuration... 2 | 3 | Current configuration : 5212 bytes 4 | ! 5 | ! Last configuration change at 22:09:27 UTC Fri Sep 10 2021 by cisco 6 | ! 7 | version 17.3 8 | service timestamps debug datetime msec 9 | service timestamps log datetime msec 10 | ! Call-home is enabled by Smart-Licensing. 11 | service call-home 12 | platform qfp utilization monitor load 80 13 | platform punt-keepalive disable-kernel-core 14 | platform console serial 15 | ! 16 | hostname rtr-branch3 17 | ! 18 | boot-start-marker 19 | boot-end-marker 20 | ! 21 | ! 22 | ! 23 | no aaa new-model 24 | ! 25 | ip vrf mgmt 26 | ! 27 | ! 28 | ! 29 | ! 30 | ! 31 | ! 32 | ! 33 | ip domain name dev.wwtatc.local 34 | ! 35 | ! 36 | ! 37 | login on-success log 38 | ! 39 | ! 40 | ! 41 | ! 42 | ! 43 | ! 44 | ! 45 | subscriber templating 46 | ! 47 | ! 48 | ! 49 | ! 50 | ! 51 | ! 52 | multilink bundle-name authenticated 53 | ! 54 | ! 55 | ! 56 | ! 57 | ! 58 | ! 59 | ! 60 | ! 61 | ! 62 | ! 63 | ! 64 | ! 65 | ! 66 | ! 67 | ! 68 | crypto pki trustpoint SLA-TrustPoint 69 | enrollment pkcs12 70 | revocation-check crl 71 | ! 72 | ! 73 | crypto pki certificate chain SLA-TrustPoint 74 | certificate ca 01 75 | 30820321 30820209 A0030201 02020101 300D0609 2A864886 F70D0101 0B050030 76 | 32310E30 0C060355 040A1305 43697363 6F312030 1E060355 04031317 43697363 77 | 6F204C69 63656E73 696E6720 526F6F74 20434130 1E170D31 33303533 30313934 78 | 3834375A 170D3338 30353330 31393438 34375A30 32310E30 0C060355 040A1305 79 | 43697363 6F312030 1E060355 04031317 43697363 6F204C69 63656E73 696E6720 80 | 526F6F74 20434130 82012230 0D06092A 864886F7 0D010101 05000382 010F0030 81 | 82010A02 82010100 A6BCBD96 131E05F7 145EA72C 2CD686E6 17222EA1 F1EFF64D 82 | CBB4C798 212AA147 C655D8D7 9471380D 8711441E 1AAF071A 9CAE6388 8A38E520 83 | 1C394D78 462EF239 C659F715 B98C0A59 5BBB5CBD 0CFEBEA3 700A8BF7 D8F256EE 84 | 4AA4E80D DB6FD1C9 60B1FD18 FFC69C96 6FA68957 A2617DE7 104FDC5F EA2956AC 85 | 7390A3EB 2B5436AD C847A2C5 DAB553EB 69A9A535 58E9F3E3 C0BD23CF 58BD7188 86 | 68E69491 20F320E7 948E71D7 AE3BCC84 F10684C7 4BC8E00F 539BA42B 42C68BB7 87 | C7479096 B4CB2D62 EA2F505D C7B062A4 6811D95B E8250FC4 5D5D5FB8 8F27D191 88 | C55F0D76 61F9A4CD 3D992327 A8BB03BD 4E6D7069 7CBADF8B DF5F4368 95135E44 89 | DFC7C6CF 04DD7FD1 02030100 01A34230 40300E06 03551D0F 0101FF04 04030201 90 | 06300F06 03551D13 0101FF04 05300301 01FF301D 0603551D 0E041604 1449DC85 91 | 4B3D31E5 1B3E6A17 606AF333 3D3B4C73 E8300D06 092A8648 86F70D01 010B0500 92 | 03820101 00507F24 D3932A66 86025D9F E838AE5C 6D4DF6B0 49631C78 240DA905 93 | 604EDCDE FF4FED2B 77FC460E CD636FDB DD44681E 3A5673AB 9093D3B1 6C9E3D8B 94 | D98987BF E40CBD9E 1AECA0C2 2189BB5C 8FA85686 CD98B646 5575B146 8DFC66A8 95 | 467A3DF4 4D565700 6ADF0F0D CF835015 3C04FF7C 21E878AC 11BA9CD2 55A9232C 96 | 7CA7B7E6 C1AF74F6 152E99B7 B1FCF9BB E973DE7F 5BDDEB86 C71E3B49 1765308B 97 | 5FB0DA06 B92AFE7F 494E8A9E 07B85737 F3A58BE1 1A48A229 C37C1E69 39F08678 98 | 80DDCD16 D6BACECA EEBC7CF9 8428787B 35202CDC 60E4616A B623CDBD 230E3AFB 99 | 418616A9 4093E049 4D10AB75 27E86F73 932E35B5 8862FDAE 0275156F 719BB2F0 100 | D697DF7F 28 101 | quit 102 | ! 103 | license udi pid CSR1000V sn 9ODHSXG6KSM 104 | diagnostic bootup level minimal 105 | memory free low-watermark processor 71556 106 | ! 107 | ! 108 | spanning-tree extend system-id 109 | ! 110 | username admin privilege 15 secret 9 $9$QyvErvnOmo3rxU$Z85oo/az0lq9p/AcOSARxazdNtEDSJDHjdxm7PMTOjM 111 | username cisco privilege 15 secret 9 $9$WVLCfIFCYK64m.$4vBj/53sb9NUnY5zbz9kUeyNq5gv.xQTxaP9XAOVWIg 112 | ! 113 | redundancy 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 | interface GigabitEthernet1 140 | description Connection to rtr-core 141 | ip address 10.1.3.2 255.255.255.252 142 | negotiation auto 143 | no mop enabled 144 | no mop sysid 145 | ! 146 | interface GigabitEthernet2 147 | no ip address 148 | shutdown 149 | negotiation auto 150 | no mop enabled 151 | no mop sysid 152 | ! 153 | interface GigabitEthernet3 154 | no ip address 155 | shutdown 156 | negotiation auto 157 | no mop enabled 158 | no mop sysid 159 | ! 160 | interface GigabitEthernet4 161 | description OOB MANAGEMENT INTERFACE 162 | ip vrf forwarding mgmt 163 | ip address dhcp 164 | negotiation auto 165 | no mop enabled 166 | no mop sysid 167 | ! 168 | interface GigabitEthernet5 169 | no ip address 170 | shutdown 171 | negotiation auto 172 | no mop enabled 173 | no mop sysid 174 | ! 175 | interface GigabitEthernet6 176 | no ip address 177 | shutdown 178 | negotiation auto 179 | no mop enabled 180 | no mop sysid 181 | ! 182 | interface GigabitEthernet7 183 | no ip address 184 | shutdown 185 | negotiation auto 186 | no mop enabled 187 | no mop sysid 188 | ! 189 | interface GigabitEthernet8 190 | no ip address 191 | shutdown 192 | negotiation auto 193 | no mop enabled 194 | no mop sysid 195 | ! 196 | router ospf 1 197 | max-metric router-lsa on-startup 110 198 | area 0 capability default-exclusion 199 | area 0 authentication 200 | passive-interface default 201 | no passive-interface GigabitEthernet1 202 | no passive-interface GigabitEthernet2 203 | no passive-interface GigabitEthernet3 204 | network 10.1.3.0 0.0.0.3 area 0 205 | ! 206 | ip forward-protocol nd 207 | no ip http server 208 | ip http secure-server 209 | ! 210 | ! 211 | ! 212 | ! 213 | ! 214 | ! 215 | ! 216 | ! 217 | control-plane 218 | ! 219 | ! 220 | ! 221 | ! 222 | ! 223 | banner motd ^C 224 | UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED 225 | 226 | You must have explicit, authorized permission to access or configure this device. 227 | Unauthorized attempts and actions to access or use this system may result in civil 228 | and/or criminal penalties. All activities performed on this device are logged and 229 | monitored. 230 | ^C 231 | ! 232 | line con 0 233 | login local 234 | stopbits 1 235 | line vty 0 4 236 | login local 237 | transport input ssh 238 | ! 239 | call-home 240 | ! If contact email address in call-home is configured as sch-smart-licensing@cisco.com 241 | ! the email address configured in Cisco Smart License Portal will be used as contact email address to send SCH notifications. 242 | contact-email-addr sch-smart-licensing@cisco.com 243 | profile "CiscoTAC-1" 244 | active 245 | destination transport-method http 246 | ntp source GigabitEthernet4 247 | ntp server time.nist.gov 248 | ! 249 | ! 250 | ! 251 | ! 252 | ! 253 | end -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | --------------------------------------------------------------------------------