Blob


1 #!/usr/bin/env python3
2 #
3 # Copyright 2022, Mischa Peters <mischa AT alkira DOT net>, Alkira.
4 # clean.py
5 # Version 0.1 - 20220617 - initial release
6 # Version 0.2 - 20220621 - simplified structure, prepare for -i remove for single ID
7 #
8 # Permission to use, copy, modify, and distribute this software for any
9 # purpose with or without fee is hereby granted, provided that the above
10 # copyright notice and this permission notice appear in all copies.
11 #
12 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #
20 import os
21 import sys
22 import re
23 import json
24 import time
25 import logging
26 import requests
27 import configparser
28 import argparse
30 # Parse all arguments
31 parser = argparse.ArgumentParser(description="Clean Alkira tenant config with AlkiraAPI")
32 parser.add_argument("-t", "--tenant", type=str, default='alkira.cnf', help="location of alikira.cnf (default: alkira.cnf)")
33 #parser.add_argument("-i", "--id", type=str, help="remove specific id")
34 parser.add_argument("-v", "--verbose", type=int, default=0, help="Verbose level 0 or 1 (default: 0)")
35 parser.add_argument("-p", "--pretty", help="make the JSON pretty!", action="store_true")
37 try:
38 args = parser.parse_args()
39 ALKIRA_CONFIG = args.tenant
40 except argparse.ArgumentError as e:
41 print(str(e))
42 sys.exit()
44 try:
45 loglevel = {
46 0: logging.INFO,
47 1: logging.DEBUG
48 }[args.verbose]
49 except KeyError:
50 loglevel = logging.INFO
52 ###############################################
54 # Set logging.INFO to logging.DEBUG for debug information
55 logging.basicConfig(level=loglevel)
56 logging = logging.getLogger('AlkiraAPI')
58 # Tenant config
59 if not os.path.isfile(ALKIRA_CONFIG):
60 logging.error(f"The config file {ALKIRA_CONFIG} doesn't exist")
61 sys.exit(1)
62 alkira = configparser.RawConfigParser()
63 alkira.read(ALKIRA_CONFIG)
65 ALKIRA_TENANT = alkira.get('alkira', 'ALKIRA_TENANT')
66 ALKIRA_USERNAME = alkira.get('alkira', 'ALKIRA_USERNAME')
67 ALKIRA_PASSWORD = alkira.get('alkira', 'ALKIRA_PASSWORD')
68 ALKIRA_BASE_URI = f'https://{ALKIRA_TENANT}/api'
70 ###############################################
72 # Set default headers
73 headers = {'Content-Type': "application/json"}
75 # Naming exceptions
76 url_exceptions = {
77 "ocivcn": "oci-vcn-",
78 "saas": "internet",
79 "pan": "panfw",
80 "ftntfw": "ftnt-fw-",
81 "chkpfw": "chkp-fw-",
82 "remoteaccess": "",
83 }
85 def alkira_login():
86 body = {'userName': ALKIRA_USERNAME,
87 'password': ALKIRA_PASSWORD}
88 session = requests.session()
89 response = alkira_post(session, '/login', body)
90 return session
92 def alkira_post(session, uri, body):
93 url = f'{ALKIRA_BASE_URI}{uri}'
94 try:
95 response = session.post(url, data=json.dumps(body), headers=headers)
96 response.raise_for_status()
97 except Exception as e:
98 logging.error(f'Error: {str(e)}')
99 sys.exit(1)
100 return response
102 def alkira_get(session, uri):
103 url = f'{ALKIRA_BASE_URI}{uri}'
104 try:
105 response = session.get(url, headers=headers)
106 response.raise_for_status()
107 except Exception as e:
108 logging.error(f'Error: {str(e)}')
109 sys.exit(1)
110 return response
112 def alkira_delete(session, uri):
113 url = f'{ALKIRA_BASE_URI}{uri}'
114 try:
115 response = session.delete(url, headers=headers)
116 response.raise_for_status()
117 except Exception as e:
118 logging.error(f'Error: {str(e)}')
119 sys.exit(1)
120 return response
122 # Authenticate
123 logging.info('=== Authenticating')
124 s = alkira_login()
125 logging.debug(s)
127 # Get TenantID
128 logging.info('=== Fetching Tenant Info')
129 r = alkira_get(s, '/tenantnetworks')
130 data = r.json()
131 tenantNetworkId = data[0]['id']
132 tenantName = data[0]['name']
133 logging.info(f'Tenant Name: {tenantName}')
134 logging.info(f'Tenant ID: {tenantNetworkId}')
136 to_clean = [
137 'connectors',
138 'services',
139 'global-cidr-lists',
140 'alkira-remote-access-connector-templates'
143 for i in to_clean:
144 logging.info(f'=== Collecting {i}')
145 r = alkira_get(s, f'/tenantnetworks/{tenantNetworkId}/{i}')
146 data = r.json()
147 if args.pretty:
148 logging.debug(json.dumps(data, indent=4))
149 else:
150 logging.debug(json.dumps(data))
152 for item in data:
153 name = item.get('name')
154 id = item.get('id')
155 if 'type' in item:
156 type = item.get('type').lower().replace('_', '')
157 else:
158 type = ""
159 if type in url_exceptions.keys():
160 type = url_exceptions[type]
162 logging.debug(f'/tenantnetworks/{tenantNetworkId}/{type}{i}/{id}')
163 logging.info(f'=== Removing {name[:30]} ({type})')
164 r = alkira_delete(s, f'/tenantnetworks/{tenantNetworkId}/{type}{i}/{id}')
165 logging.info(r.status_code)