o
    pb                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZddlm	Z	 ddl	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Z d#d$ Z!d%d& Z"d'd( Z#d)d* Z$d+d, Z%d-d. Z&d/d0 Z'd1d2 Z(d3d4 Z)dcd5d6Z*d7d8 Z+d9d: Z,d;d< Z-d=d> Z.d?d@ Z/dAdB Z0dCdD Z1dEdF Z2G dGdH dHZ3dIdJ Z4dKdL Z5G dMdN dNZ6dOdP Z7dQdR Z8dSdT Z9dUdV Z:dWdX Z;dYdZ Z<d[d\ Z=d]d^ Z>dcd_d`Z?dadb Z@dS )d    N   )cli)failfail_conflictingprint_stdoutprint_stderr)Network)Guest)logzD--location URL, --cdrom CD/ISO, --pxe, --import, --boot hd|cdrom|...c              	   C   s   | j jD ]<}|j|jkrq|j|jkr dS z|j|j}t|j|	dd}|
 W   S  ty@   tjddd Y  dS w dS )zK
    Return False if we are pretty sure the config doesn't support PXE
    Tr   )parsexmlzError checking if PXE supportedexc_infoF)devices	interfacetype	TYPE_USERTYPE_VIRTUALconnnetworkLookupByNamesourcer   XMLDesccan_pxe	Exceptionr
   debug)guestnicnetobjxmlobj r   //usr/share/virt-manager/virtinst/virtinstall.pysupports_pxe   s   r    c                 C   sB   | j r| jrtdd | j rd| j v rttd | j | _d S d S )N-c--cdromz://zk-c specified with what looks like a libvirt URI. Did you mean to use --connect? If not, use --cdrom instead)cdrom_shortcdromr   r   _optionsr   r   r   check_cdrom_option_error3   s   

r(   c                 C   s   | j r| j | _| ` d S d S N)xmlstepxmlonlyr&   r   r   r   convert_old_printxmlC   s   r,   c                 C   s:   | j sd S t| j D ]\}}| j | d u rd| j |< q
d S )Ndefault)sound	enumerate)r'   idxdummyr   r   r   convert_old_soundI   s   
r2   c                 C   sF   | j sd S | jsdg| _| jd  d| j  7  < td| jd  d S )N z,init=%sz!Converted old --init to --boot %s)initbootr
   r   r&   r   r   r   convert_old_initQ   s   r7   c           
      C   s   t j| j}t j| j}dd }||tdt|}||t|}g }t|D ]:\}}d}	|r7|	d| 7 }	|| rI|	rA|	d7 }	|	d||  7 }	| jdu rX|	rT|	d7 }	|	d	7 }	t	
d
|	 ||	 q)|| _d S )Nc                 S   (   t j| } | |t|  d g  | S r)   virtinstxmlutillistifyextendlenlpadsizer   r   r   padlist^      z&_do_convert_old_disks.<locals>.padlistr   r3   zpath=%s,zsize=%sFz	sparse=noz!Converted to new style: --disk %s)r:   r;   r<   
file_pathsdisksizemaxr>   r/   sparser
   r   appenddisk)
r'   pathssizesrB   disklistsizelistoptsr0   pathoptstrr   r   r   _do_convert_old_disksZ   s*   

rR   c                 C   s   | j r| js| js| jrttd | js| js| js$| jr$ttd | js3| j r/dg| _nt|  | `| `| `| ` t	d| j d S )Nz(Cannot specify storage and use --nodiskszoCannot mix --file, --nonsparse, or --file-size with --disk options. Use --disk PATH[,size=SIZE][,sparse=yes|no]nonezDistilled --disk options: %s)
nodisksrE   rJ   rF   r   r%   rH   rR   r
   r   r&   r   r   r   convert_old_disksy   s&   
rU   c                 C   s    | j sd S ttd | ` d S )Nz?--os-type is deprecated and does nothing. Please stop using it.)old_os_typer
   warningr%   r&   r   r   r   convert_old_os_options   s   rX   c                 C   s$   | j rd S | js
d S t| j| _ d S r)   )memory	oldmemorystrr&   r   r   r   convert_old_memory   s
   r\   c                 C   s@   | j sd S | jp	g }|d| j   || _td| jd  d S )Nz
,cpuset=%sz#Generated compat cpuset: --vcpus %sr4   )cpusetvcpusrI   r
   r   )r'   newvcpusr   r   r   convert_old_cpuset   s   
r`   c                 C   s(  | j rdg| _tj| j}tj| j}tj| j}|r%|r%tdd |r.dd |D }dd }||tt	|d}||t	|}t
|D ]:\}}|| d u rUd	||< || re||  d
||  7  < dD ]}|| |d r|| |d |d ||< qgqG| `| `| ` || _td| j d S )NrS   --bridgez	--networkc                 S   s   g | ]}d | qS )zbridge:r   ).0br   r   r   
<listcomp>       z(convert_old_networks.<locals>.<listcomp>c                 S   r8   r)   r9   r?   r   r   r   rB      rC   z%convert_old_networks.<locals>.padlistr   r-   z,mac=%s)networkbridge:=zDistilled --network options: %s)
nonetworksrf   r:   r;   r<   macrg   r   rG   r>   r/   
startswithreplacer
   r   )r'   macsnetworksbridgesrB   r0   ignoreprefixr   r   r   convert_old_networks   s:   
rs   c           
      C   s   | j }| j}| j}| j}| j}| j}| j}|r'|s!|s!|s!|s!|r'ttd t	dd ||||fD }|dkr>t
td| jrCd S |dkrId S |rMdpT|oPdpT|oTd	}	|r]|	d
| 7 }	|re|	d| 7 }	|rm|	d| 7 }	td|	 |	g| _d S )Nz5Cannot mix --graphics and old style graphical optionsc                 S   s   g | ]}t |qS r   )bool)rb   gr   r   r   rd      re   z(convert_old_graphics.<locals>.<listcomp>r   zCCan't specify more than one of VNC, SDL, --graphics or --nographicsr   vncsdlrS   z
,listen=%sz,port=%sz
,keymap=%sz--graphics compat generated: %s)rv   vncport	vnclisten
nographicsrw   keymapgraphicsr   r%   sum
ValueErrorr
   r   )
r'   rv   rx   ry   rz   rw   r{   r|   optnumrQ   r   r   r   convert_old_graphics   s:   r   c                 C   sH   | j rd S g }| jr|d | jr|d |r"d|g| _ d S d S )Nzacpi=offzapic=offrD   )featuresnoacpirI   noapicjoin)r'   rO   r   r   r   convert_old_features   s   

r   c                 C   s(   | j dkrtd d| _d | _ d S d S )Nr   z$Treating --wait 0 as --noautoconsolerS   )waitr
   rW   autoconsoler&   r   r   r   convert_wait_zero
  s
   


r   c                 C   s\   |j }t| }|jr|j|j_|jr|j|j_|  tj| |d}t|	|dd d S )N)locationTdo_force)
test_media_detectionr:   r	   archosos_typeset_capabilities_defaults	Installerr   detect_distro)r   r'   urlr   	installerr   r   r   do_test_media_detection  s   


r   c                 C   s   |j  rdS | jp| jS NT)r   is_containerrJ   
filesystemr'   r   r   r   r   storage_specified'  s   
r   c                 C   s   | j p	| jp	| jjS r)   )rY   currentMemorycpucellsr   r   r   r   memory_specified-  s   r   c                 C   sz   d}| j st|s|dtd 7 }t| |s|dtd 7 }|j s3| s3|dtddti  7 }|r;t| d S d S )Nr3   
z"--memory amount in MiB is requiredz<--disk storage must be specified (override with --disk none)z1An install method must be specified
(%(methods)s)methods)		reinstallr   r%   r   r   r   options_specifiedINSTALL_METHODSr   )r'   r   r   msgr   r   r   validate_required_options1  s"   
r   c                 C   s4   | j sd S | sd S ttdd td  d S )NzCDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location. zBSee the man page for examples of using --location with CDROM media)r$   is_textr
   rW   r%   )r   r   r   r   r   show_console_warningsG  s   

r   c                 C   s   | j sd S | j }| j d }|| jjpd}|r5|d | j kr3ttd||d | jj	d d S d S |dk rCttd| d S d S )N   r   zYRequested memory %(mem1)s MiB is less than the recommended %(mem2)s MiB for OS %(osname)s   )mem1mem2osname   zJRequested memory %s MiB is abnormally low. Were you trying to specify GiB?)
r   osinfoget_recommended_resourcesget_minimum_ramr   r   r
   rW   r%   name)r   resrammbminramr   r   r   _show_memory_warningsS  s$   



r   c                 C   s
   | j  S r)   )r   is_hvmr   r   r   r   _needs_accurate_osinfoe  s   
r   c                 C   sT   | j rt|sttd |j r$t|r$ttdj|jj	d t
| d S )Nz5The guest's network configuration may not support PXEz_Using --osinfo {osname}, VM performance may suffer. Specify an accurate OS for optimal results.)r   )pxer    r
   rW   r%   r   
is_genericr   formatr   r   r   r   r   r   show_guest_warningso  s   r   c                 C   s:   t jj|dd}|| jj|}ttdj||d |S )NT)raise_errorzUsing {osname} --location {url})r   r   )	r:   OSDB	lookup_osget_locationr   r   r   r%   r   )r   r   profiler   r   r   r   r   get_location_for_os  s   
r   c                 C   sz  d }d }d }d }t | j}d }| j}	|j}
|j}|j}|j}|j}|j}|jr2|j	r.|j}n|jg}	| j
r;t| j
}|rK|rB|jnd }t|||}n4| jrXt| j\}}}n'| jrd| j}| jrcd}n| jrjd}
n|jrnn| js}| js}| js}| js}| j
rd}tj|j|||||
|||||d}|r|| |	r||	 | jr|| j | j rd|_ | jrt!| j}|"| |S )NTrf   )
r$   r   location_kernellocation_initrdinstall_bootdevinstall_kernelinstall_initrdinstall_kernel_args
no_installis_reinstall)#rt   r   
extra_argsbootdevkernelinitrdkernel_argsr   r   kernel_args_overwrite
unattendedr   parse_unattendedr   r   r   parse_locationr$   livecdr   is_setimport_installr+   r6   
cloud_initr:   r   r   set_unattended_dataset_extra_argsinitrd_injectset_initrd_injections	autostartparse_cloud_initset_cloudinit_data)r'   r   installdatar$   r   r   r   r   unattended_datar   r   r   r   r   
install_osr   r   r   cloudinit_datar   r   r   build_installer  s   




r   c           	      C   s  |j stj|}ttdj|d ||_ |j	 r4t
|s2d}ttdj|d |d |_d S | jrO|j rO|j|jjrO||j|jj |j }||jj}||jj}||jj}|rt
|st|d dd}ttd	j|jj |d
 |d |_|r|| |rt| |sd|d  }ttdj|jj |d |g| _tj||dd  d S d S d S )NzUsing default --name {vm_name})vm_namer   z,Using container default --memory {megabytes})	megabytesr   0.z,Using {os_name} default --memory {megabytes})os_namer   zsize=%di   @z-Using {os_name} default --disk {disk_options})r   disk_optionsr   )r   r:   r	   generate_namer   r   r%   r   r   r   r   r   r   r   
is_windowssupports_unattended_driversr   add_extra_driversget_pre_installable_devicesr   get_recommended_storageget_recommended_ramget_recommended_ncpusr[   rstripsync_vcpus_topologyr   rJ   
ParserDiskparse)	r'   r   default_namembramr   storageramncpusdiskstrr   r   r   set_cli_defaults  s`   




r   c                 C   s   | j r
| j |_ d | _ | jr| j|_d | _| jr| j|_d | _| jr)| j|j_d | _| jr3| j|_d | _| jr>| j|j_d | _| jrK| j|j_d | _d S d S r)   )	r   uuiddescriptionr   r   	virt_typer   r   machiner   r   r   r   set_explicit_guest_options  s,   



r  c              
   C   s  d}z!|  rd}| |   || }| r"|r"d}| | W n ty? } zttdt|  W Y d }~nd }~ww td}|rHd S | rPt| |	 sVd S t
| s\d S |d }|td7 }td}t|jpp|j}	|	rz|d| 7 }|dtd	 7 }d
d tj D }
tdjd|
d}|
r|d| 7 }d}|dtdj|d 7 }d| }|tjv rt| tdj|d}t| d S t| d S )NFTz%Error validating install location: %szL--os-variant/--osinfo OS name is required, but no value was
set or detected.z

zzThis is now a fatal error. Specifying an OS name is required
for modern, performant, and secure virtual machine defaults.
zIf you expected virt-install to detect an OS name from the
install media, you can set a fallback OS name with:

  --osinfo detect=on,name=OSNAME
r   zXYou can see a full list of possible OS name values with:

   virt-install --osinfo list
c                 S   s   g | ]	}|  r|jqS r   )is_linux_genericr   )rb   or   r   r   rd   M  s    z+installer_detect_distro.<locals>.<listcomp>zPIf your Linux distro is not listed, try one of generic values
such as: {oslist}
z, )oslist"VIRTINSTALL_OSINFO_DISABLE_REQUIREzuIf you just need to get the old behavior back, you can use:

  --osinfo detect=on,require=off

Or export {env_var}=1
)env_varz${env_var} set. Skipping fatal error.)get_nameset_os_namer   	is_detectr~   r   r%   r[   is_require_onis_require_defaultr   rt   r   r$   r:   r   list_osr   r   r   environr
   rW   )r   r   osdataos_set
autodistroer   fail_msg
detect_msgpossibly_detectablegeneric_linux_namesgeneric_linux_msgenvkeymr   r   r   installer_detect_distro  st   

 



r  c                 C   s>   t | }d|_t|| t||d  t|| |  |S r   )r	   skip_default_osinfor  r   parse_option_stringsparse_xmlclir   )r   r'   r   r   r   r   _build_options_guestg  s   
r  c                 C   s   t |j}t |jp|j}|jrt | |j\}}}nt| |}t	|||}|
  t||| |js:t|| || ||D ]	}t |j| qD|jsl|jjD ]}	t |	 qU|jjD ]
}
t |
j|
j qat||| t|| ||fS r)   )r   parse_installinstallparse_os_variant
os_variantr   r   get_domain_and_guestr  r   set_default_os_namer  r   set_install_defaultsget_search_pathscheck_path_searchr   r   rJ   validate_diskr   validate_macmacaddrr   r   )r   r'   r   r  dummy1r   dummy2r   rP   rJ   netr   r   r   build_guest_instancey  s*   



r.  c                 C   s   t j st|  d S d S r)   )r:   r;   in_testsuitetimesleep)secsr   r   r   _sleep  s   
r3  c                 C   s6   |j d us|  s|  sd S ttd d|_ d S )Nz;No console to launch for the guest, defaulting to --wait -1r4   )r   has_console_cb
is_defaultr
   rW   r%   )r   r'   r   r   r   _set_default_wait  s   

r6  c                   @   sT   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dd ZdS )WaitHandlerzP
    Helper class for handling the --wait option sleeping and time tracking
    c                 C   s.   d| _ d| _d| _|d urd| _ || _d S d S )NFr   T)wait_is_requested
_wait_mins_start_time)selfr   r   r   r   __init__  s   
zWaitHandler.__init__c                 C   s   | j  S r)   )r8  r;  r   r   r   wait_for_console_to_exit  s   z$WaitHandler.wait_for_console_to_exitc                 C   s
   | j dk S )Nr   r9  r=  r   r   r   _wait_forever     
zWaitHandler._wait_foreverc                 C   s
   | j d S )N<   r?  r=  r   r   r   
_wait_secs  rA  zWaitHandler._wait_secsc                 C   s   t   | _d S r)   )r0  r:  r=  r   r   r   start  s   zWaitHandler.startc                 C   s&   | j rtdS tdd| jd| ji S )Nz)Waiting for the installation to complete.z<Waiting %(minutes)d minute for the installation to complete.z=Waiting %(minutes)d minutes for the installation to complete.minutes)r@  r%   ngettextr9  r=  r   r   r   get_time_string  s   zWaitHandler.get_time_stringc                 C   sB   t d | jrtj rdS dS t | j }|| jkp tj S )zK
        sleep 1 second, then teturn True if wait time has expired
        r   TF)r3  r@  r:   r;   r/  r0  r:  rC  )r;  time_elapsedr   r   r   r     s   
zWaitHandler.waitN)__name__
__module____qualname____doc__r<  propertyr>  r@  rC  rD  rG  r   r   r   r   r   r7    s    	


r7  c                 C   s   |   }|sd S ttd| ddd tjg}d}tjjs"tj s-tj	 s)d S g }d}tj
td tj
  t|g g | d S )Nz$Password for first root login is: %sTF)r   do_log
   g-C6?zAInstallation will continue in 10 seconds (press Enter to skip)...)get_generated_passwordr   r%   sysstdinclosedisattyr:   r;   r/  stdoutwriteflushselect)r   passwdstdinstimeoutr   r   r   _print_cloudinit_passwd  s$   

r\  c              
   C   s   |  }|sdS || }|sdS z
t|dd }W n ty2 } ztd| W Y d}~nd}~ww |r<ttd |  dS )z|
    Launched the passed console callback for the already defined
    domain. If domain isn't running, return an error.
    Nr   r   zwaitpid error: %sz!Console command returned failure.)	get_console_cbr   waitpidOSErrorr
   r   rW   r%   handle_destroy_on_exit)r   
instdomainr   r   
console_cbchilderrcoder  r   r   r   _connect_console  s   re  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_InstalledDomainzJ
    Wrapper for the domain object after the initial install creation
    c                 C   s*   || _ || _|| _|rtt| d S d S r)   )_domain
_transient_destroy_on_exitatexitregister)r;  domain	transientdestroy_on_exitr   r   r   r<    s   z_InstalledDomain.__init__c                 C   s0   | j r| j rtd | j  d S d S d S )Nz5console exited and destroy_on_exit passed, destroying)ri  rg  isActiver
   r   destroyr=  r   r   r   r`  !  s   
z'_InstalledDomain.handle_destroy_on_exitc                 C   sN   z| j  \}}|tjko|tjtjfv W S  ty&   tjddd Y d S w )Nz!Error checking VM shutdown reasonTr   )	rg  statelibvirtVIR_DOMAIN_SHUTOFFVIR_DOMAIN_SHUTOFF_DESTROYEDVIR_DOMAIN_SHUTOFF_SAVEDr   r
   r   )r;  rq  reasonr   r   r   domain_was_destroyed&  s   
z%_InstalledDomain.domain_was_destroyedc              
   C   s   z| j  }|d }|tjkrttd | j   W S  tjy? } z| jr:|	 tj
kr:td W Y d }~dS  d }~ww )Nr   zDomain has crashed.z&transient VM shutdown and disappeared.T)rg  inforr  VIR_DOMAIN_CRASHEDr   r%   ro  libvirtErrorrh  get_error_codeVIR_ERR_NO_DOMAINr
   r   )r;  dominforq  r  r   r   r   check_inactive/  s   


z_InstalledDomain.check_inactiveN)rI  rJ  rK  rL  r<  r`  rw  r~  r   r   r   r   rf    s    	rf  c                 C   s   |  rdS t| rtd |  rdS d}|td7 }|js:|  s'dS |d7 }|td7 }t| t	d t| t|
  	 |  rQttd dS | }|rbttd	 t	d
 qE)zj
    Make sure domain ends up in expected state, and wait if for install
    to complete if requested
    N   r   z9Domain is still running. Installation may be in progress.zFYou can reconnect to the console to complete the installation process.r   Tz Domain has shutdown. Continuing.zDInstallation has exceeded specified time limit. Exiting application.r   )r~  rt   r]  r3  r%   r8  has_install_phaser   rQ  exitrG  r   )r   ra  r   waithandlerr   doner   r   r   _wait_for_domain@  s8   

r  c                 C   s   t jdr|   d S d S )NVIRTINST_TESTSUITE_HACK_DESTROY)r   r  getrp  )rl  r   r   r   _testsuite_hack_destroys  s   r  c           	      C   s   t | ||}t||||j t|  t|||| ttd |r#dS |  r)dS |s/| s<ttdt	
|  dS | rJ|sJttd dS ttd |   t|||d dS )zO
    Handle the pieces of the install process after the initial VM startup
    zDomain creation completed.Nz,You can restart your domain by running:
  %sz#User stopped the VM. Not rebooting.zRestarting guest.T)rf  re  r>  r  r  r   r%   ro  r  r   virsh_start_cmdrw  create)	rl  r   r   r  r   rm  rn  norebootra  r   r   r   _process_domainy  s0   r  c              
   C   s0  t || |}t|| t|| t|j}t  }ttd t	| |
  z=z|j| ||j |jd}W n   tj| |  t|| ||||j|j|j tj r`|jrct| W d	S W d	S W d	S  tyz   tjddd ttd   ty } zt|dd t |  W Y d	}~d	S d	}~ww )
zc
    Process all the install workflow specific options, and kick off
    the Installer process
    z
Starting install...)meterdobootrm  r3   Tr   zDomain install interrupted.F)do_exitN)r   parse_autoconsoler   r6  r7  r   	get_meterr   r%   r\  rD  start_installr  rm  r:   r   cleanup_created_disksr  rn  r;   r/  ri  KeyboardInterruptr
   r   r   r   r   install_fail)r   r   r'   r   r  r  rl  r  r   r   r   r    sD   



r  c                 C   s   |j | |dd\}}|s|}d }|r|sttd d S |dvr(ttd|  |dkr.|S |dkr<|s:ttd |S |}|rD||7 }|S )	NT)dry
return_xmlzDry run completed successfully)F12allz3Unknown XML step request '%s', must be 1, 2, or allr  r  z/Requested installation does not have XML step 2)r  r   r%   r   )r   r   r+   r  	start_xml	final_xmlxmlr   r   r   xml_to_print  s.   
r  c            	   	   C   s  t jdtddd} t |  | td}|jddtdd	 t j|dd
 t | t | t 	| |jddt
jd	 |jdt
jd	 | td}|jddt
jd |jdtdd	 |jddtdd	 |jddtdd |jdddtdd |jddt
jd |jd d!d"td#d |jd$d"td%d |jd&d'd(td)d* |jd+td,d	 |jd-d.td/d0 |jd1d'd(td2d* |jd3t
jd	 |jd4dt
jd t | |jd5t
jd	 t j| dd6}|jd7d8t
jd | td9}t | t | t | t j|dd: |jd;d<d=d"t
jd> |jd?d@td"dAt
jdB |jdCdDddEt
jdF |jdGdt
jd |jdHdt
jd |jdIdJd"t
jd |jdKdLd"t
jd |jdMdt
jd |jdNtt
jdO |jdPt
jd	 |jdQdRt
jd	 |jdSdt
jd |jdTdt
jd | tdU}t | | tdV}| }|jdWdXdYdZd[td\d] |jd^d_dYd`d[tdad] |jdbdYdcd[tddd] |jdetdfd	 |jdgtdhd	 |jditdjd	 |jdkdt
jd |jdlddmt
jdn |jdoddmt
jdn | tdp}|jdqddmtdrdn |jdsddmtdtdn |jduddmtdvdn |jdwtdxd'tdydz t j|ddddddd{ t |  |  S )|Nz:%(prog)s --name NAME --memory MB STORAGE INSTALL [options]z:Create a new virtual machine from specified install media.T)introspection_epilogzGeneral Optionsz-nz--namezName of the guest instance)help)
backcompatz-uz--uuidz--descriptionzInstallation Method Optionsr!   r#   )destr  r"   zCD-ROM installation mediaz-lz
--locationzUDistro install URL, eg. https://host/path. See man page for specific distro examples.z--pxe
store_truez,Boot from the network using the PXE protocol)actionr  z--importr   z)Build guest around an existing disk image)r  r  r  z--livecdz-xz--extra-argsrI   zIAdditional arguments to pass to the install kernel booted from --locationz--initrd-injectz0Add given file to root of initrd from --locationz--unattended?r   z"Perform an unattended installation)nargsconstr  z	--installz$Specify fine grained install optionsz--reinstallDOMAINzhReinstall existing VM. Only install options are applied, all other VM configuration options are ignored.)metavarr  z--cloud-initz:Perform a cloud image installation, configuring cloud-initz--test-media-detectionz--test-stub-commandz--init)virtinstallz	--os-typerV   zDevice Options)sound_back_compatz-fz--filerE   )r  r  r  z-sz--file-sizerF   )r   r  r  r  z--nonsparsestore_falserH   )r  r-   r  r  z	--nodisksz--nonetworksz-bra   z-mz--macz--vncz	--vncport)r   r  z--vnclistenz-kz--keymapz--sdlz--nographicszGuest Configuration OptionszVirtualization Platform Optionsz-vz--hvmstore_consthvmr   z.This guest should be a fully virtualized guest)r  r  r  r  z-pz
--paravirtxenz,This guest should be a paravirtualized guestz--containerexez&This guest should be a container guestz--virt-typez,Hypervisor name to use (kvm, qemu, xen, ...)z--archz The CPU architecture to simulatez	--machinezThe machine type to emulatez--acceleratez--noapicF)r  r-   r  z--noacpizMiscellaneous Optionsz--autostartz&Have domain autostart on host boot up.z--transientzCreate a transient domain.z--destroy-on-exitz=Force power off the domain when the console viewer is closed.z--waitr4   z(Minutes to wait for install to complete.)r   r  r  r  )promptprintxml	printstepr  dryrunnoautoconsole)r   setupParserr%   add_connect_optionadd_argument_groupadd_argumentadd_memory_optionvcpu_cli_optionsadd_metadata_optionadd_xml_optionargparseSUPPRESSadd_boot_optionsadd_os_variant_optionadd_disk_optionadd_net_optionadd_gfx_optionadd_device_optionsfloatintadd_guest_xml_optionsadd_mutually_exclusive_groupadd_misc_optionsautocomplete
parse_args)	parsergenginsgosgdevggxmlgvirgostypegmiscr   r   r   r    s  


















r  c              
   C   s|   zt | o|  }|r|   W d S W d S  tjy= } z| tjkr2tjddd W Y d }~d S W Y d }~d S d }~ww )Nz%Error invoking atexit destroy_on_exitTr   )	rt   ro  rp  rr  rz  r{  r|  r
   r   )rl  isactiver  r   r   r   ri  r  s   ri  c                 C   s`   | j sd S d| _| jsd| _| jsd| _| jsd| _| js d| _| js&d| _| js.d| _d S d S )NTztest:///defaultztest-stub-command256rS   fedora27)test_stub_commandr   connectr   rY   rJ   r|   r"  r&   r   r   r   set_test_stub_options}  s    
r  c                 C   sN  t   t }t| |jp|jp|j|_t d|j|j t 	|r%dS t 
|r,dS t| t | t |j t |j t| t| t| t| t| t| t| t| t| t| t| t j|j| d} |jrt| | dS t| |\}}|js|j rt!|||j|j }|rt"|dd dS t#||| dS )Nzvirt-installr   )r   Tr   )$r   earlyLoggingr  r,   r+   r   quietsetupLoggingr   check_option_introspectioncheck_osinfo_listr(   convert_old_forceparse_checkcheck
set_promptr  r\   r2   rs   r   rU   r   r`   r7   r   r  rX   getConnectionr  r   r.  r  r  r   r  )r   r'   r   r   r  r   r   r   main  sP   



r  c               
   C   s   z	t t  W d S  ty" }  zt | j W Y d } ~ d S d } ~ w ty8   tjddd tt	d Y d S  t
yN } zt| W Y d }~d S d }~ww )Nr3   Tr   z$Installation aborted at user request)rQ  r  r  
SystemExitcoder  r
   r   r   r%   r   r   )sys_emain_er   r   r   runcli  s   r  r)   )Ar  rj  r   rQ  r0  rX  rr  r:   r3   r   r   r   r   r   r   r   r	   loggerr
   r   r    r(   r,   r2   r7   rR   rU   rX   r\   r`   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r.  r3  r6  r7  r\  re  rf  r  r  r  r  r  r  ri  r  r  r  r   r   r   r   <module>   sx   	
,&

I1L'2+3".! 	
0