Skip to content

Commit 44be9ab

Browse files
committed
Check for hosts in nextsubnet. Fixes #23
1 parent e716fec commit 44be9ab

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

portal/management/commands/nextsubnet.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from ipaddr import IPNetwork
2+
from optparse import make_option
23

34
from django.core.management.base import BaseCommand, CommandError
4-
from portal.models import Subnet
5+
from portal.models import IPAddress, Subnet
56

67

78
prefixlenq = Subnet.objects.extra(select={'masklen': "masklen(network)"}
@@ -12,10 +13,14 @@ def get_next_network(address, prefixlen):
1213
return IPNetwork("/".join(map(str, [address, prefixlen])))
1314

1415

15-
def find_free_network(existing_networks, start, prefixlen):
16+
def find_free_network(existing_networks, start, prefixlen, ignore_hosts=False):
1617
new_network = get_next_network(start, prefixlen)
1718
for net in existing_networks:
18-
if new_network in net or net in new_network:
19+
if any([
20+
new_network in net,
21+
net in new_network,
22+
not ignore_hosts and IPAddress.objects.extra(where=["ip <<= inet '%s'" % new_network]),
23+
]):
1924
return find_free_network(existing_networks,
2025
max(new_network) + 1,
2126
prefixlen)
@@ -28,6 +33,14 @@ class Command(BaseCommand):
2833
'\nSuggested block names:\n ' + \
2934
'\n '.join(prefixlenq.values_list('notes', flat=True)[:10]) + \
3035
'\nBlock names use case-insensitive starts-with matching.'
36+
option_list = BaseCommand.option_list + (
37+
make_option(
38+
'--ignore-hosts',
39+
action='store_true',
40+
dest='ignore_hosts',
41+
default=False,
42+
help='Skips checking for any hosts in the new subnet'),
43+
)
3144

3245
def handle(self, *args, **options):
3346
blockname, prefixlen = args
@@ -40,7 +53,8 @@ def handle(self, *args, **options):
4053
[n.network for n in Subnet.objects.extra(
4154
where=["inet '%s' >> network" % block])],
4255
min(block),
43-
prefixlen)
56+
prefixlen,
57+
options.get("ignore_hosts"))
4458
if found not in block:
4559
raise CommandError(
4660
"No /%ss available in %s" % (prefixlen, str(block)))

0 commit comments

Comments
 (0)