Integrate claude, improve selenium and support qemu #1
3 changed files with 40 additions and 9 deletions
|
|
@ -1315,6 +1315,10 @@ def main() -> None:
|
||||||
args.memory = min_ram
|
args.memory = min_ram
|
||||||
if args.disk_size is None:
|
if args.disk_size is None:
|
||||||
args.disk_size = min_disk
|
args.disk_size = min_disk
|
||||||
|
# Un nombre nu (« 30 ») serait pris pour des OCTETS par qemu-img et ferait
|
||||||
|
# échouer le resize : on suppose des Go par défaut (« 30 » -> « 30G »).
|
||||||
|
if re.fullmatch(r"\d+", str(args.disk_size)):
|
||||||
|
args.disk_size = f"{args.disk_size}G"
|
||||||
urls = image_candidates(
|
urls = image_candidates(
|
||||||
args.distro, code, args.arch, args.version, args.dry_run
|
args.distro, code, args.arch, args.version, args.dry_run
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -930,19 +930,32 @@ class TODO:
|
||||||
if cmd_no_found:
|
if cmd_no_found:
|
||||||
print(t("Command not found !"))
|
print(t("Command not found !"))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _normalize_disk_size(size):
|
||||||
|
"""« 30 » -> « 30G » (unité par défaut Go). Laisse « 30G », « 1T »… ou
|
||||||
|
vide tels quels. Sans unité, qemu-img interpréterait des OCTETS."""
|
||||||
|
size = size.strip()
|
||||||
|
if re.fullmatch(r"\d+", size):
|
||||||
|
return size + "G"
|
||||||
|
return size
|
||||||
|
|
||||||
def _qemu_deploy_vm(self, dry_run=False):
|
def _qemu_deploy_vm(self, dry_run=False):
|
||||||
script_path = self._qemu_script_path()
|
script_path = self._qemu_script_path()
|
||||||
name = input(t("VM name (required): ")).strip()
|
# Distro + version d'abord : permet de proposer un nom par défaut.
|
||||||
if not name:
|
|
||||||
print(t("VM name is required!"))
|
|
||||||
return
|
|
||||||
distro = self._qemu_prompt_distro()
|
distro = self._qemu_prompt_distro()
|
||||||
version = self._qemu_prompt_version(distro)
|
version = self._qemu_prompt_version(distro)
|
||||||
|
default_name = self._qemu_infra_name(distro, version)
|
||||||
|
name = (
|
||||||
|
input(f"{t('VM name (default: ')}{default_name}): ").strip()
|
||||||
|
or default_name
|
||||||
|
)
|
||||||
# Laisser vide => le script applique le minimum requis par la version
|
# Laisser vide => le script applique le minimum requis par la version
|
||||||
# choisie (libosinfo). On n'envoie alors pas le flag.
|
# choisie (libosinfo). On n'envoie alors pas le flag.
|
||||||
memory = input(t("RAM in MB (blank = version minimum): ")).strip()
|
memory = input(t("RAM in MB (blank = version minimum): ")).strip()
|
||||||
vcpus = input(t("vCPUs (default: 2): ")).strip()
|
vcpus = input(t("vCPUs (default: 2): ")).strip()
|
||||||
disk_size = input(t("Disk size (blank = version minimum): ")).strip()
|
disk_size = self._normalize_disk_size(
|
||||||
|
input(t("Disk size (blank = version min; e.g. 30G, 1T): ")).strip()
|
||||||
|
)
|
||||||
|
|
||||||
default_key = self._qemu_default_ssh_key()
|
default_key = self._qemu_default_ssh_key()
|
||||||
key_hint = default_key or t("none")
|
key_hint = default_key or t("none")
|
||||||
|
|
@ -995,7 +1008,13 @@ class TODO:
|
||||||
print(f"{t('Will execute:')} {cmd}")
|
print(f"{t('Will execute:')} {cmd}")
|
||||||
if password:
|
if password:
|
||||||
print(f"🔑 {t('Console/SSH login:')} erplibre / {password}")
|
print(f"🔑 {t('Console/SSH login:')} erplibre / {password}")
|
||||||
self.execute.exec_command_live(cmd, source_erplibre=False)
|
status = self.execute.exec_command_live(cmd, source_erplibre=False)
|
||||||
|
|
||||||
|
# Arrêt net sur erreur : sinon on enchaînait sur l'attente d'IP d'une
|
||||||
|
# VM jamais créée (blocage infini), l'utilisateur ne voyant rien.
|
||||||
|
if status != 0:
|
||||||
|
print(f"\n❌ {t('Deployment failed (see the error above).')}")
|
||||||
|
return
|
||||||
|
|
||||||
# Proposer d'enregistrer la VM dans ~/.ssh/config (après le 1er boot).
|
# Proposer d'enregistrer la VM dans ~/.ssh/config (après le 1er boot).
|
||||||
if not dry_run:
|
if not dry_run:
|
||||||
|
|
|
||||||
|
|
@ -1359,9 +1359,17 @@ TRANSLATIONS = {
|
||||||
"fr": "vCPU (défaut : 2) : ",
|
"fr": "vCPU (défaut : 2) : ",
|
||||||
"en": "vCPUs (default: 2): ",
|
"en": "vCPUs (default: 2): ",
|
||||||
},
|
},
|
||||||
"Disk size (blank = version minimum): ": {
|
"Disk size (blank = version min; e.g. 30G, 1T): ": {
|
||||||
"fr": "Taille du disque (vide = minimum de la version) : ",
|
"fr": "Taille du disque (vide = min. version ; ex. 30G, 1T) : ",
|
||||||
"en": "Disk size (blank = version minimum): ",
|
"en": "Disk size (blank = version min; e.g. 30G, 1T): ",
|
||||||
|
},
|
||||||
|
"VM name (default: ": {
|
||||||
|
"fr": "Nom de la VM (défaut : ",
|
||||||
|
"en": "VM name (default: ",
|
||||||
|
},
|
||||||
|
"Deployment failed (see the error above).": {
|
||||||
|
"fr": "Échec du déploiement (voir l'erreur ci-dessus).",
|
||||||
|
"en": "Deployment failed (see the error above).",
|
||||||
},
|
},
|
||||||
"SSH public key path": {
|
"SSH public key path": {
|
||||||
"fr": "Chemin de la clé publique SSH",
|
"fr": "Chemin de la clé publique SSH",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue