mirror of
https://github.com/ergosteur/ergo-proxmox-scripts.git
synced 2026-10-28 13:00:37 -04:00
Add OVA/OVF import tools and virtio-win downloader
Two implementations of the same OVA/OVF import flow: a Python version that parses the OVF with ElementTree and detects UEFI, and a shell version using xmllint that handles multi-disk appliances. Both check free space on the target storage before importing. download-virtio-win-progress.py fetches the latest virtio-win ISO, skipping the download when the local copy is already current. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3ef068e846
commit
25b96af194
Executable
+74
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# install libraries
|
||||
# apt install python3-requests python3-bs4 python3-tqdm
|
||||
import os
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import re
|
||||
from tqdm import tqdm
|
||||
import argparse
|
||||
|
||||
# Argument parser to handle --cron flag and directory path
|
||||
parser = argparse.ArgumentParser(description='Download latest virtio ISO.')
|
||||
parser.add_argument('--cron', action='store_true', help='Run in cron-friendly mode with minimal output')
|
||||
parser.add_argument('--dir', type=str, default='.', help='Directory to save the ISO file')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Ensure the directory exists
|
||||
if not os.path.exists(args.dir):
|
||||
os.makedirs(args.dir)
|
||||
|
||||
# URL for the latest virtio ISO downloads
|
||||
url = 'https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/'
|
||||
response = requests.get(url)
|
||||
soup = BeautifulSoup(response.text, 'html.parser')
|
||||
|
||||
latest_iso_link = None
|
||||
version_number = None
|
||||
|
||||
# Find the latest ISO link by matching filenames ending in '.iso'
|
||||
for link in soup.find_all('a', href=True):
|
||||
if link['href'].endswith('.iso'):
|
||||
latest_iso_link = link
|
||||
version_number = re.search(r'\d+\.\d+\.\d+', link['href']).group()
|
||||
iso_name = f"virtio-win-{version_number}.iso"
|
||||
break
|
||||
|
||||
if latest_iso_link and version_number:
|
||||
print(f"Version Number: {version_number}")
|
||||
|
||||
# Construct the download URL
|
||||
iso_url = url + latest_iso_link['href']
|
||||
iso_path = os.path.join(args.dir, iso_name)
|
||||
|
||||
try:
|
||||
response = requests.get(iso_url, stream=True)
|
||||
total_size = int(response.headers.get('content-length', 0))
|
||||
|
||||
if os.path.exists(iso_path):
|
||||
local_size = os.path.getsize(iso_path)
|
||||
if local_size == total_size:
|
||||
if not args.cron:
|
||||
print(f"File {iso_path} already exists and is the same size. Skipping download.")
|
||||
else:
|
||||
if not args.cron:
|
||||
print(f"File {iso_path} exists but has a different size. Redownloading...")
|
||||
else:
|
||||
if not args.cron:
|
||||
print(f"File {iso_path} does not exist. Downloading...")
|
||||
|
||||
if not os.path.exists(iso_path) or local_size != total_size:
|
||||
with open(iso_path, 'wb') as f, tqdm(
|
||||
total=total_size, unit='B', unit_scale=True, desc=iso_name, ncols=80, disable=args.cron) as progress_bar:
|
||||
for chunk in response.iter_content(chunk_size=8192):
|
||||
if chunk:
|
||||
f.write(chunk)
|
||||
if not args.cron:
|
||||
progress_bar.update(len(chunk))
|
||||
|
||||
print(f"Downloaded ISO file successfully. Saved to {iso_path}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error downloading the ISO file: {e}")
|
||||
else:
|
||||
print("No ISO file found or unable to extract version number.")
|
||||
Reference in New Issue
Block a user