Files
proxmox/scripts/map-service-dependencies.py
defiQUG cb47cce074 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.
2026-01-06 01:46:25 -08:00

167 lines
5.5 KiB
Python

#!/usr/bin/env python3
"""
Map all service dependencies that reference IPs that will change
Finds references in: Cloudflare configs, Nginx configs, .env files, firewall rules, DNS records
"""
import os
import re
import glob
from datetime import datetime
from collections import defaultdict
# DHCP containers and their current IPs (from inventory)
DHCP_CONTAINERS = {
'3500': {'name': 'oracle-publisher-1', 'host': 'ml110', 'current_ip': '192.168.11.15'},
'3501': {'name': 'ccip-monitor-1', 'host': 'ml110', 'current_ip': '192.168.11.14'},
'100': {'name': 'proxmox-mail-gateway', 'host': 'r630-02', 'current_ip': '192.168.11.4'},
'101': {'name': 'proxmox-datacenter-manager', 'host': 'r630-02', 'current_ip': '192.168.11.6'},
'102': {'name': 'cloudflared', 'host': 'r630-02', 'current_ip': '192.168.11.9'},
'103': {'name': 'omada', 'host': 'r630-02', 'current_ip': '192.168.11.20'},
'104': {'name': 'gitea', 'host': 'r630-02', 'current_ip': '192.168.11.18'},
'6200': {'name': 'firefly-1', 'host': 'r630-02', 'current_ip': '192.168.11.7'},
'7811': {'name': 'mim-api-1', 'host': 'r630-02', 'current_ip': 'N/A'},
}
# IPs that will change
CHANGING_IPS = {info['current_ip'] for info in DHCP_CONTAINERS.values() if info['current_ip'] != 'N/A'}
# Also include reserved range IPs that are conflicts
CONFLICT_IPS = ['192.168.11.14', '192.168.11.15', '192.168.11.18', '192.168.11.20']
ALL_CHANGING_IPS = CHANGING_IPS | set(CONFLICT_IPS)
print("=== Mapping Service Dependencies ===")
print(f"\nIPs that will change: {sorted(ALL_CHANGING_IPS)}")
print(f"\nScanning for references...\n")
# Track dependencies
dependencies = defaultdict(list)
# Search patterns
search_patterns = [
('*.sh', 'Shell scripts'),
('*.py', 'Python scripts'),
('*.md', 'Documentation'),
('*.conf', 'Configuration files'),
('*.env', 'Environment files'),
('*.yaml', 'YAML configs'),
('*.yml', 'YAML configs'),
('*.json', 'JSON configs'),
('*.toml', 'TOML configs'),
]
base_dir = '/home/intlc/projects/proxmox'
# Search for IP references
for pattern, file_type in search_patterns:
for file_path in glob.glob(os.path.join(base_dir, '**', pattern), recursive=True):
# Skip certain directories
if any(skip in file_path for skip in ['.git', 'node_modules', '__pycache__', '.cursor']):
continue
try:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
lines = content.split('\n')
for line_num, line in enumerate(lines, 1):
for ip in ALL_CHANGING_IPS:
if ip in line:
rel_path = os.path.relpath(file_path, base_dir)
dependencies[ip].append({
'file': rel_path,
'line': line_num,
'content': line.strip()[:100],
'type': file_type
})
except Exception as e:
continue
# Generate output
output_file = f"/home/intlc/projects/proxmox/SERVICE_DEPENDENCIES_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
with open(output_file, 'w') as f:
f.write(f"""# Service Dependencies - IP References
**Generated**: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
**Purpose**: Map all references to IPs that will change during DHCP to static conversion
---
## IPs That Will Change
""")
for ip in sorted(ALL_CHANGING_IPS):
# Find which container uses this IP
container_info = None
for vmid, info in DHCP_CONTAINERS.items():
if info['current_ip'] == ip:
container_info = f"VMID {vmid} ({info['name']}) on {info['host']}"
break
if not container_info and ip in CONFLICT_IPS:
container_info = "IP conflict (reserved range)"
f.write(f"- **{ip}**: {container_info}\n")
f.write(f"""
---
## Dependencies by IP
""")
for ip in sorted(ALL_CHANGING_IPS):
if ip not in dependencies:
continue
f.write(f"""
### {ip}
**Total References**: {len(dependencies[ip])}
| File | Line | Type | Content Preview |
|------|------|------|----------------|
""")
for dep in dependencies[ip]:
f.write(f"| `{dep['file']}` | {dep['line']} | {dep['type']} | `{dep['content']}` |\n")
f.write(f"""
---
## Summary
- **Total IPs changing**: {len(ALL_CHANGING_IPS)}
- **Total references found**: {sum(len(deps) for deps in dependencies.values())}
- **Files affected**: {len(set(dep['file'] for deps in dependencies.values() for dep in deps))}
---
## Action Required
After converting DHCP containers to static IPs, update all references in the files listed above.
**Note**: Pay special attention to:
- Cloudflare tunnel configurations
- Nginx Proxy Manager routes
- Application .env files
- Firewall rules
- DNS records
""")
print(f"\n=== Dependency Mapping Complete ===")
print(f"IPs scanned: {len(ALL_CHANGING_IPS)}")
print(f"Total references found: {sum(len(deps) for deps in dependencies.values())}")
print(f"Files affected: {len(set(dep['file'] for deps in dependencies.values() for dep in deps))}")
print(f"\nOutput file: {output_file}")
# Show summary by IP
print(f"\n=== References by IP ===")
for ip in sorted(ALL_CHANGING_IPS):
count = len(dependencies.get(ip, []))
if count > 0:
print(f" {ip}: {count} reference(s)")