152 lines
4.6 KiB
Python
152 lines
4.6 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
Check IP availability in range 192.168.11.28-99
|
|||
|
|
Excludes reserved range (192.168.11.10-25) and already-assigned static IPs
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import re
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
# Reserved range for physical servers
|
|||
|
|
RESERVED_START = 10
|
|||
|
|
RESERVED_END = 25
|
|||
|
|
|
|||
|
|
# Starting IP for new assignments
|
|||
|
|
START_IP = 28
|
|||
|
|
END_IP = 99
|
|||
|
|
|
|||
|
|
# Get latest inventory
|
|||
|
|
import glob
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
inventory_files = sorted(glob.glob("/home/intlc/projects/proxmox/CONTAINER_INVENTORY_*.md"), reverse=True)
|
|||
|
|
if not inventory_files:
|
|||
|
|
print("Error: No inventory file found. Run scan-all-containers.py first.")
|
|||
|
|
exit(1)
|
|||
|
|
|
|||
|
|
inventory_file = inventory_files[0]
|
|||
|
|
print(f"Using inventory: {inventory_file}\n")
|
|||
|
|
|
|||
|
|
# Read inventory and extract all used IPs
|
|||
|
|
used_ips = set()
|
|||
|
|
reserved_ips = set(range(RESERVED_START, RESERVED_END + 1))
|
|||
|
|
|
|||
|
|
with open(inventory_file, 'r') as f:
|
|||
|
|
for line in f:
|
|||
|
|
# Match IP addresses in the table
|
|||
|
|
# Format: | VMID | Name | Host | Status | IP Config | Current IP | Hostname |
|
|||
|
|
if '|' in line and '192.168.11' in line:
|
|||
|
|
# Extract IP from "Current IP" column (6th column)
|
|||
|
|
parts = [p.strip() for p in line.split('|')]
|
|||
|
|
if len(parts) >= 7:
|
|||
|
|
current_ip = parts[6].strip()
|
|||
|
|
if current_ip and current_ip != 'N/A' and current_ip.startswith('192.168.11.'):
|
|||
|
|
ip_num = int(current_ip.split('.')[-1])
|
|||
|
|
used_ips.add(ip_num)
|
|||
|
|
|
|||
|
|
# Also check IP Config column (5th column)
|
|||
|
|
ip_config = parts[5].strip()
|
|||
|
|
if ip_config and ip_config != 'N/A' and ip_config != 'dhcp' and ip_config != 'auto':
|
|||
|
|
# Extract IP from config like "192.168.11.100/24"
|
|||
|
|
ip_match = re.search(r'192\.168\.11\.(\d+)', ip_config)
|
|||
|
|
if ip_match:
|
|||
|
|
ip_num = int(ip_match.group(1))
|
|||
|
|
used_ips.add(ip_num)
|
|||
|
|
|
|||
|
|
# Also check for IPs in reserved range that are used
|
|||
|
|
reserved_used = used_ips & reserved_ips
|
|||
|
|
|
|||
|
|
# Find available IPs
|
|||
|
|
available_ips = []
|
|||
|
|
for ip_num in range(START_IP, END_IP + 1):
|
|||
|
|
if ip_num not in used_ips and ip_num not in reserved_ips:
|
|||
|
|
available_ips.append(ip_num)
|
|||
|
|
|
|||
|
|
# Output results
|
|||
|
|
output_file = f"/home/intlc/projects/proxmox/IP_AVAILABILITY_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
|
|||
|
|
|
|||
|
|
with open(output_file, 'w') as f:
|
|||
|
|
f.write(f"""# IP Availability Check
|
|||
|
|
|
|||
|
|
**Generated**: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
|
|||
|
|
**Source**: {inventory_file}
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## IP Range Analysis
|
|||
|
|
|
|||
|
|
- **Reserved Range**: 192.168.11.{RESERVED_START}-{RESERVED_END} (Physical servers)
|
|||
|
|
- **Available Range**: 192.168.11.{START_IP}-{END_IP}
|
|||
|
|
- **Total IPs in Available Range**: {END_IP - START_IP + 1}
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Used IPs
|
|||
|
|
|
|||
|
|
### Static IPs in Available Range ({START_IP}-{END_IP})
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
static_in_range = sorted([ip for ip in used_ips if START_IP <= ip <= END_IP])
|
|||
|
|
if static_in_range:
|
|||
|
|
for ip_num in static_in_range:
|
|||
|
|
f.write(f"- 192.168.11.{ip_num}\n")
|
|||
|
|
else:
|
|||
|
|
f.write("- None\n")
|
|||
|
|
|
|||
|
|
f.write(f"""
|
|||
|
|
### Reserved IPs Currently Used by Containers
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
if reserved_used:
|
|||
|
|
for ip_num in sorted(reserved_used):
|
|||
|
|
f.write(f"- 192.168.11.{ip_num} ⚠️ **CONFLICT** (in reserved range)\n")
|
|||
|
|
else:
|
|||
|
|
f.write("- None\n")
|
|||
|
|
|
|||
|
|
f.write(f"""
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Available IPs
|
|||
|
|
|
|||
|
|
**Total Available**: {len(available_ips)} IPs
|
|||
|
|
|
|||
|
|
### First 20 Available IPs (for DHCP conversion)
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
for ip_num in available_ips[:20]:
|
|||
|
|
f.write(f"- 192.168.11.{ip_num}\n")
|
|||
|
|
|
|||
|
|
if len(available_ips) > 20:
|
|||
|
|
f.write(f"\n... and {len(available_ips) - 20} more\n")
|
|||
|
|
|
|||
|
|
f.write(f"""
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Summary
|
|||
|
|
|
|||
|
|
- **Used IPs in range {START_IP}-{END_IP}**: {len(static_in_range)}
|
|||
|
|
- **Available IPs**: {len(available_ips)}
|
|||
|
|
- **Reserved IPs used by containers**: {len(reserved_used)} ⚠️
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Recommendation
|
|||
|
|
|
|||
|
|
Starting from **192.168.11.{available_ips[0] if available_ips else START_IP}** for DHCP to static IP conversion.
|
|||
|
|
|
|||
|
|
**Note**: {len(reserved_used)} container(s) are using IPs in the reserved range and should be moved first.
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
print(f"=== IP Availability Check ===")
|
|||
|
|
print(f"\nReserved range (physical servers): 192.168.11.{RESERVED_START}-{RESERVED_END}")
|
|||
|
|
print(f"Available range: 192.168.11.{START_IP}-{END_IP}")
|
|||
|
|
print(f"\nUsed IPs in available range: {len(static_in_range)}")
|
|||
|
|
print(f"Available IPs: {len(available_ips)}")
|
|||
|
|
print(f"Reserved IPs used by containers: {len(reserved_used)}")
|
|||
|
|
if reserved_used:
|
|||
|
|
print(f" ⚠️ IPs: {', '.join([f'192.168.11.{ip}' for ip in sorted(reserved_used)])}")
|
|||
|
|
print(f"\nFirst 10 available IPs:")
|
|||
|
|
for ip_num in available_ips[:10]:
|
|||
|
|
print(f" - 192.168.11.{ip_num}")
|
|||
|
|
print(f"\nOutput file: {output_file}")
|