-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnet_overlap.py
executable file
·80 lines (63 loc) · 2.4 KB
/
net_overlap.py
1
2
3
4
5
6
7
8
9
10
11
12
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
#!/usr/bin/env python
import ipaddress
from azure.identity import AzureCliCredential
from azure.mgmt.resourcegraph import ResourceGraphClient
from azure.mgmt.resourcegraph.models import QueryRequest
from azure.mgmt.resource import SubscriptionClient
from pprint import pprint
import argparse
def is_valid_ipv4_network(input_str):
try:
ipaddress.ip_network(input_str, strict=False)
return True
except ValueError:
return False
# Instantiate the argument parser
parser = argparse.ArgumentParser(description='Calculate if an IPv4 CIDR overlaps with an existing Azure VNet')
# Required positional argument
parser.add_argument('input_network', type=str,
help='example: 10.1.0.0/16')
# Switch
parser.add_argument('--verbose', action='store_true',
help='print extra information')
args = parser.parse_args()
# convert input string to ip_network type
if is_valid_ipv4_network(args.input_network):
input_network = ipaddress.ip_network(args.input_network, strict=False)
else:
raise argparse.ArgumentTypeError(f'{args.input_network} is not a valid IPv4 CIDR')
# Authenticate to Azure
credential = AzureCliCredential()
# Instantiate a Resource Graph client
client = ResourceGraphClient(credential)
def get_subscriptions():
# Instantiate a Subscription client
client = SubscriptionClient(credential)
# Retrieve subscriptions and save them to a list
subscription_ids = [subscription.subscription_id for subscription in client.subscriptions.list()]
# Print the subscription IDs
if args.verbose:
print(f'Found {len(subscription_ids)} subscriptions\n')
for sub_id in subscription_ids:
print(sub_id)
print()
return subscription_ids
# get ALL subscriptions
subscriptions = get_subscriptions()
# Define the query
q = "Resources | where type =~ 'Microsoft.Network/virtualNetworks' | project name, addressSpace = properties.addressSpace.addressPrefixes"
query = QueryRequest(query=q)
query.subscriptions = subscriptions
# Run the query
response = client.resources(query).as_dict()
vnets = response['data']
if args.verbose:
print(f'Found {len(vnets)} VNets\n')
pprint(vnets)
print()
for vnet in vnets:
for cidr in vnet['addressSpace']:
ip_network = ipaddress.ip_network(cidr)
overlap = input_network.overlaps(ip_network)
if overlap:
print(f'{input_network} overlaps {vnet}')