Complete markdown files cleanup and organization
- Organized 252 files across project - Root directory: 187 → 2 files (98.9% reduction) - Moved configuration guides to docs/04-configuration/ - Moved troubleshooting guides to docs/09-troubleshooting/ - Moved quick start guides to docs/01-getting-started/ - Moved reports to reports/ directory - Archived temporary files - Generated comprehensive reports and documentation - Created maintenance scripts and guides All files organized according to established standards.
This commit is contained in:
151
scripts/check-ip-availability.py
Executable file
151
scripts/check-ip-availability.py
Executable file
@@ -0,0 +1,151 @@
|
||||
#!/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}")
|
||||
Reference in New Issue
Block a user