65 строки
2.4 KiB
Python
65 строки
2.4 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
app_path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path('/opt/virtuality/web/app.py')
|
|
if not app_path.exists():
|
|
raise SystemExit(f'app.py not found: {app_path}')
|
|
|
|
text = app_path.read_text()
|
|
changed = []
|
|
|
|
helper = '''
|
|
|
|
def bridge_exists(name: str) -> bool:
|
|
if not name or not re.fullmatch(r"[a-zA-Z0-9_.:-]+", name):
|
|
return False
|
|
return run_cmd(["ip", "link", "show", name], timeout=5)["ok"]
|
|
'''
|
|
|
|
if 'def bridge_exists(name: str) -> bool:' not in text:
|
|
markers = [
|
|
'\n\ndef default_network_mode() -> str:',
|
|
'\n\ndef valid_vm_name(name: str) -> bool:',
|
|
'\n\ndef parse_virsh_list() -> list[dict[str, str]]:',
|
|
]
|
|
inserted = False
|
|
for marker in markers:
|
|
if marker in text:
|
|
text = text.replace(marker, helper + marker, 1)
|
|
changed.append('bridge_exists helper added')
|
|
inserted = True
|
|
break
|
|
if not inserted:
|
|
print('WARN: bridge helper marker not found, skip helper injection')
|
|
changed.append('bridge_exists helper skipped')
|
|
else:
|
|
changed.append('bridge_exists helper already present')
|
|
|
|
old_validation = ''' elif network_mode == "bridge" and (not bridge or not re.fullmatch(r"[a-zA-Z0-9_.:-]+", bridge)):
|
|
error = "Некорректное имя bridge."
|
|
else:
|
|
iso = Path(iso_path).resolve()
|
|
'''
|
|
new_validation = ''' elif network_mode == "bridge" and (not bridge or not re.fullmatch(r"[a-zA-Z0-9_.:-]+", bridge)):
|
|
error = "Некорректное имя bridge."
|
|
elif network_mode == "bridge" and 'bridge_exists' in globals() and not bridge_exists(bridge):
|
|
error = f"Bridge {bridge} не найден на сервере. Для VPS выбери режим NAT Router — virtuality-nat, либо сначала создай bridge {bridge}."
|
|
else:
|
|
iso = Path(iso_path).resolve()
|
|
'''
|
|
|
|
if old_validation in text:
|
|
text = text.replace(old_validation, new_validation, 1)
|
|
changed.append('bridge existence validation added')
|
|
elif 'Bridge {bridge} не найден на сервере' in text:
|
|
changed.append('bridge existence validation already present')
|
|
else:
|
|
print('WARN: bridge validation marker not found, skip validation injection')
|
|
changed.append('bridge validation skipped')
|
|
|
|
app_path.write_text(text)
|
|
print('vm network guard patch applied:')
|
|
for item in changed:
|
|
print(f'- {item}')
|