o
    !~c                    @   s  d Z ddlmZ dZd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ZddlmZ ddlmZ dadadad	az
ddlZddlZW n eyU   daY nw d
Zd	adddddddZdd ZtrrG dd dejZdd Zdadd Zdd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,G d5d6 d6Z-d7d8 Z.dd9d:Z/d;d< Z0d=d> Z1d?d@ Z2dAdB Z3dCdD Z4dEdF Z5dGdH Z6dIdJ Z7dKdL Z8da9dMdN Z:dOdP Z;dQdR Z<dSdT Z=dUdV Z>dWdX Z?dYdZ Z@d[d\ ZAd]d^ ZBd_d` ZCdadb ZDdcdd ZEdedf ZFdgdh ZGdidj ZHg d	fdkdlZIg dfdmdnZJdodp ZKG dqdr drZLG dsdt dteLZMG dudv dveLZNG dwdx dxeMZOG dydz dzeLZPG d{d| d|eMZQG d}d~ d~eLZRG dd deLZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dddZ_dd Z`dddZadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd ZsddÄ Ztddń ZuddǄ ZvddɄ Zwdd˄ Zxdd̈́ Zyddτ Zzddф Z{ddӄ Z|ddՄ Z}ddׄ Z~ddل Zddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d Zdd Zdd Zi dddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'i d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYZi dZd[gd\d]gd^dLgd_dVgd`dagdbdWgdcddgdedfgdgdhdigdjdhdkgdldhdmgdndhdogdpdhdqgdrdhdsgdtdhdugdvdhdwgdxdygi dzdhdygd{d|gd}dhd|gd~dhdgddgddgddgddgddgddgddgddgddgddgddgddgddhdgdhdgdhdgdhdg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Đ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 Zg f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
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dddddd d!d"	Zi dd#eWdgdd$e\dgd0d%e]dgd2d&egdgd'd(ehdgd)d*ekdgd+d,eldgd-d.emdgd/d0eidgd1d2ejdgdd3eZdgdd4e[dgdhd5e^dgd6d7ecdgd8d9eddgd:d;efdgdd<edgi d!d=edgdːd>eydgd?d@edgddAe~dgdBdCedgdDdEendgdFdGedgdHdIedgdJdKedgdLdMedgdNdOedgdPdQedgdRdSedgdTdUedgdVdWedgdXdYedgdZd[edgi d\d]edgd^d_edgd`daedgdbdceodgdVddepdgd deedgdfdgerdgdhdiesdgdjdke}dgdldme{dgdndoetdgdŐdpevdgdqdrewdgdsdtedgdudvedgdwdxedgdydzedgi d{d|edgd}d~edgddedgddedgddedgddedgddedgd^dedgddedgdѐdedgddedgddedgddedgddedgddedgddedgddedgdedgdedgdedgdedgdedgdedgdedgdedgdedgdedgdedgdedgdedgdedg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 Zedkreej dS dS (  a1  
VirtualBox Python Shell.

This program is a simple interactive shell for VirtualBox. You can query
information and issue commands from a simple command line.

It also provides you with examples on how to use VirtualBox's Python API.
This shell is even somewhat documented, supports TAB-completion and
history if you have Python readline installed.

Finally, shell allows arbitrary custom extensions, just create
.VirtualBox/shexts/ and drop your extensions there.
                                               Enjoy.

P.S. Our apologies for the code quality.
    )print_functiona  
Copyright (C) 2009-2020 Oracle Corporation

This file is part of VirtualBox Open Source Edition (OSE), as
available from http://www.virtualbox.org. This file is free software;
you can redistribute it and/or modify it under the terms of the GNU
General Public License (GPL) as published by the Free Software
Foundation, in version 2 as it comes in the "COPYING" file of the
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
z$Revision: 148572 $N)OptionParser)pprintFTzvbox> z[31mz[94mz[92mz[93mz[35mz[36m)redbluegreenyellowmagentacyanc                 C   s,   t s| S t|d}|r|t|  d S | S )zM
    Translates a string to one including coloring settings, if enabled.
    Nz[0m)g_fHasColorsg_dTermColorsgetstr)strgcolorcol r    /usr/lib/virtualbox/vboxshell.pycoloredN   s   r   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )CompleterNGc                 C   s   || _ tj| | d S N)ctxrlcompleter	Completer__init__)selfdicr   r   r   r   r   [   s   zCompleterNG.__init__c                 C   s   	 t j| ||S )zp
            taken from:
            http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496812
            )r   r   complete)r   textstater   r   r   r   _   s   zCompleterNG.completec                 C   s
   | dS )N/)
startswith)r   _phrasewordr   r   r   	canBePathi      
zCompleterNG.canBePathc                 C   s<   | d}t }|dkp||k }|rdS |drdS dS )N ThelpF)findreadline
get_begidxr"   )r   phrase_wordspaceIdxbegIdx	firstWordr   r   r   canBeCommandl   s   

zCompleterNG.canBeCommandc                 C   s   |  || o| || S r   )r%   r2   )r   r-   r$   r   r   r   canBeMachinev   s   zCompleterNG.canBeMachinec              
   C   s  g }t  }z| ||r7tj|\}}t|}t|D ]}|dks,|d| |kr6|tj	|| q| 
||rZt|}| jfD ]}|D ]}|d| |krX|| qIqE| ||rt|}t| jddD ].}	tddt|	j}|d| |kr|| t|	j}|d| |kr|| qkW |S W |S  ty }
 zt| j|
 trt  W Y d}
~
|S W Y d}
~
|S d}
~
ww )z
            Compute matches when text is a simple name.
            Return a list of all names currently defined
            in self.namespace that match.
            r   NFTz(?<!\\) z\ )r+   get_line_bufferr%   ospathsplitlenlistdirappendjoinr2   	namespacer3   getMachinesr   resubr   nameid	ExceptionprintErr
g_fVerbose	traceback	print_exc)r   r   matchesr-   	directoryrestcr$   lstmacher   r   r   global_matchesy   sR   




zCompleterNG.global_matchesN)	__name__
__module____qualname__r   r   r%   r2   r3   rN   r   r   r   r   r   Z   s    

r   c                 C   s   t sd S i }t|  D ]\}}d ||< qt||}t|j t }tt	
dd| td t dkrCtd td td d S )Nz[\./-] zset editing-mode emacsDarwinzbind ^I rl_completezbind ^W ed-delete-prev-wordztab: complete)g_fHasReadlinelistitemsr   r+   set_completerr   get_completer_delimsset_completer_delimsr>   r?   parse_and_bindplatformsystem)cmdsr   compskey_value	completerdelimsr   r   r   autoCompletion   s   




rc   c                 C   s
   t | S r   )shlexr7   )sr   r   r   split_no_quotes   r&   rf     c                 C   s   z4|j s&tdtt|jd dd tj  || | d 	d |j rt
|jdkr2t| | W dS  tyQ   td d	| d
< |jrNtd |  Y dS w )Nz%s %%r   rR   )endglobalr      Interrupted.T	interruptzCanceling task...)	completedprintr   r   percentsysstdoutflushwaitForCompletionwaitForEventsint
resultCodereportErrorKeyboardInterrupt
cancelablecancel)r   progresswaitr   r   r   progressBar   s$   


r}   c                 C   sN   | d }| |rttd||||f d d S ttt|d d S )Nri   %s: %sr   )xcptIsOurXcptKindrn   r   xcptToStringxcptGetMessager   )_ctxrM   oVBoxMgrr   r   r   rC      s   
&rC   c                 C   s,   |j }|rttd|j|jf d d S d S )NzError in module '%s': %sr   )	errorInforn   r   	componentr   )r   r{   	errorinfor   r   r   rw      s   rw   c                 C   
   t |dS )Nr	   r   )r   r   r   r   r   colCat   r&   r   c                 C   r   )Nr   r   )r   vmnamer   r   r   colVm   r&   r   c                 C   r   Nr   r   )r   r6   r   r   r   colPath   r&   r   c                 C   r   )Nr   r   )r   byter   r   r   colSize   r&   r   c                 C   r   r   r   r   pcidevr   r   r   colPci   r&   r   c                 C   r   )Nr
   r   r   r   r   r   colDev   r&   r   c                 C   s   t t|d dS )NMr   )r   r   )r   mbyter   r   r   colSizeM      r   c                 C   sF   | d }| d|g |d}|  td|j || t| d d S )NvbrR   zcreated machine with UUIDT)createMachinesaveSettingsrn   rA   registerMachiner=   )r   r@   kindvboxrL   r   r   r   createVm   s   
r   c                 C   s   |j }td|jd| t| |tdg || d jj}|r:||}t	| |dr5t
|jdkr5td nt| | t| d d S )	Nzremoving machine z	with UUIDALLri   d   r   Success!T)rA   rn   r@   cmdClosedVmdetachVmDevice
unregister	constantsCleanupMode_FulldeleteConfigr}   ru   rv   rw   r=   )r   rL   uuiddisksr{   r   r   r   removeVm   s   


r   c           	   
   C   s   | d }| d }| d   }g }||||}t| |drVt|jdkrX|rPz|dg|gdd W n tyO } zt| | trEt	
  W Y d }~nd }~ww |  d S d S d S )	Nr   perfri   r   r   *
      )getSessionObjectlaunchVMProcessr}   ru   rv   setuprB   rC   rD   rE   rF   unlockMachine)	r   rL   vmtyper   r   sessionasEnvr{   rM   r   r   r   startVm
  s"   
r   c                   @      e Zd Zdd ZdS )
CachedMachc                 C   s"   |j r|j| _nd| _|j| _d S )Nz<inaccessible>)
accessibler@   rA   )r   rL   r   r   r   r     s   
zCachedMach.__init__NrO   rP   rQ   r   r   r   r   r   r         r   c                 C   s$   g }|D ]}t |}|| q|S r   )r   r:   )r   rK   resultrL   elemr   r   r   cacheMachines$  s
   r   c                 C   s^   | d d ur-| d d u s|r#| d  | d d| d< t| | d | d< |r)| d S | d S g S )Nr   	_machlistri   machines_machlistsimple)getArrayr   )r   
invalidatesimpler   r   r   r=   +  s   r=   c                 C   s   | rt ddS t ddS )Nonr   offr   varr   r   r   asState7  s   

r   c                 C   s   | rdS dS )Nyesnor   r   r   r   r   asFlag=     r   c                 C   s   | |\}}t| d|S )NAdditionsFacilityStatus)getFacilityStatus
asEnumElem)r   guestfacilityTypestatus
_timestampr   r   r   r   C     r   c                 C   s<   | d sd S | d  dg|gD ]}t|d |d  qd S )Nr   r   r@   values_as_string)queryrn   )r   rL   metricr   r   r   	perfStatsG  s
   r   c                 C   s   t | d S r   )exec)r   machineconsoler]   r   r   r   	guestExecM  s   r   c                 C   s(   t d|j|j|j|j|j|jf  d S )Nz.Mouse : mode=%d x=%d y=%d z=%d w=%d buttons=%x)rn   modexyzwbuttons)r   mevr   r   r   printMouseEventP  s   (r   c                 C   s   t d| d |d d S )NzKbd: ri   	scancodes)rn   r   )r   kevr   r   r   printKbdEventS     r   c              	   C   s   t d|j|jf  | d |d}| d |d}| d |d}| d |d}td|jD ]}t d||| || || || f  q0d S )	Nz MultiTouch : contacts=%d time=%dri   
xPositions
yPositions
contactIdscontactFlagsr   z  [%d] %d,%d %d %d)rn   contactCountscanTimer   range)r   mtevr   r   r   r   ir   r   r   printMultiTouchEventV  s   (r   c           	         s    fddG  fdddt }|r d |}n| }d}|dkr'd}z>|| d jjg| d	}t | }t |k rd|rL d d
 n||d
}|r^| ||| t |k sBW n   t	
  Y |ry|r{|| d S d S d S )Nc           
         s  | j }tdt|t d|f  | d jjkr1 d | d}|r/td|j|jf  d S d S | d jj	krQ d | d}|rOtd|j|j
f  d S d S | d jjkrq d | d}|rotd	|j|jf  d S d S | d jjkr d | d
}|r d |d}|d u rtd d S td|j|jt|f  d S d S | d jjkr d | d}|rt | d S d S | d jjkr܈ d | d}|rt | d S d S | d jjkr d | d}	|	rt |	 d S d S d S )Nzgot event: %s %sVBoxEventTyperi   IMachineStateChangedEventz%machine state event: mach=%s state=%sISnapshotTakenEventz%snapshot taken event: mach=%s snap=%sIGuestPropertyChangedEventz'guest property change: name=%s value=%sIMousePointerShapeChangedEventshapez!pointer shape event - empty shapez+pointer shape event: w=%d h=%d shape len=%dIGuestMouseEventIGuestKeyboardEventIGuestMultiTouchEvent)typern   r   r   r   #VBoxEventType_OnMachineStateChangedqueryInterface	machineIdr    VBoxEventType_OnSnapshotTaken
snapshotId$VBoxEventType_OnGuestPropertyChangedr@   value(VBoxEventType_OnMousePointerShapeChangedr   widthheightr8   VBoxEventType_OnGuestMouser   VBoxEventType_OnGuestKeyboardr   VBoxEventType_OnGuestMultiTouchr   )
eventevtypescevstevgpcevpsevr   r   r   r   r   r   r   handleEventImpla  sR   z&monitorSource.<locals>.handleEventImplc                       s"   e Zd Zdd Z fddZdS )z$monitorSource.<locals>.EventListenerc                 S   s   d S r   r   )r   argr   r   r   r        z-monitorSource.<locals>.EventListener.__init__c                    s0   z d  |d W d S    t  Y d S )Nri   IEvent)r   rE   rF   )r   r  r   r  r   r   handleEvent  s   
z0monitorSource.<locals>.EventListener.handleEventN)rO   rP   rQ   r   r  r   r  r   r   EventListener  s    r  ri   Fr(   順 Ti  )objectcreateListenerregisterListenerr   VBoxEventType_Anytimert   getEventeventProcessedrE   rF   unregisterListener)	r   eventSourceactivedurr  listener
registeredrh   r  r   r  r   monitorSource`  s6   $
r'  c                    s.  t |dd|jj d }| t add  fdd}|j }d}|j|j	j|j
jg}t |dd|jj d }| |d	krMd
}z.|| d jjgd d}t | }	t |	k rz||d}
|
rt||
 t |	k shW n   t  Y   |r|r|| d S d S d S )Nr   zVM=
c                  S   s    t   } t| t d }| a|S )Nrg   )r  ru   g_tsLast)tsCur
timePassedr   r   r   stamp  s   zrecordDemo.<locals>.stampc                    s   | j }| d jjkr0 d | d}|r.d |j|j|j|j|j|j	f }
| d S d S | d jjkrX d | d}|rZd t d |df }
| d S d S d S )Nri   r   z%d: m %d %d %d %d %d %d
r   z	%d: k %s
r   )r   r   r  r   r   r   r   r   r   r   writer	  r   r   )r  r  r   liner   r   demor,  r   r   r    s   $z#recordDemo.<locals>.handleEventImplFr(   r  ri   Trg   )openr   r@   r-  r  r)  r"  r  createAggregatorkeyboardmouser  r   r  r  rE   rF   closer!  )r   r   filenamer$  headerr  r%  r&  aggrh   r  r   r/  r   
recordDemo  s>   




r9  c              
   C   s  t |d}|dkrd}| }td| td}td}td}|j}	|j}
zt | }|D ]}t |kr< n||}|d u rFq2|	 }|d }|d	 }|d
 }t
t|d  |dkrn||}|	| q2|dkr||}|d ur|	 }|d dkr|
t|d t|d t|d t|d t|d  q2|
t|d t|d t|d t|d t|d  q2W n ty   d| d< Y n   t  Y |  d S )Nrr(   r  z	Header isz!(?P<s>\d+): (?P<t>[km]) (?P<p>.*)zK(?P<a>\d+) (?P<x>-*\d+) (?P<y>-*\d+) (?P<z>-*\d+) (?P<w>-*\d+) (?P<b>-*\d+)z\d+re   ptrg   kma1r   r   r   r   bTrl   )r1  r+   rn   r>   compiler3  r4  r  search	groupdictsleepfloatfindallputScancodesputMouseEventAbsoluteru   putMouseEventrx   rE   rF   r5  )r   r   r6  r$  r0  r7  baseremrekrekbdr4  rh   r.  matchrdictr,  paramsrtypecodesmmmdictr   r   r   playbackDemo  sP   







<:rV  c              	   C   s   ddl m} |j}t|dkr|d }nd}t|dkr#t|d }nd}||\}}}	}
}}t|dkr=t|d }n|}t|dkrLt|d }n|}td||||f  ||||td j	}||f}d	}|
||t|d
|dd}||d d S )Nr   )Image/tmp/screenshot.png   rj      .Saving screenshot (%d x %d) screen %d in %s...constRGBArawPNG)PILrW  displayr8   ru   getScreenResolutionrn   takeScreenShotToArrayr   BitmapFormat_RGBA
frombufferr   save)r   r   argsrW  ra  fscreenfbwfbh_fbbppfbxfby_r   hdatasizer   imr   r   r   takeScreenshotOld!  s*   
rt  c                 C   s   |j }t|dkr|d }nd}t|dkrt|d }nd}||\}}}}	}
}t|dkr7t|d }n|}t|dkrFt|d }n|}td||||f  ||||td j}t|d}|	| |
  d S )	Nr   rX  rY  rj   rZ  r[  r\  wb)ra  r8   ru   rb  rn   rc  r   BitmapFormat_PNGr1  r-  r5  )r   r   rg  ra  rh  ri  rj  rk  rl  rm  rn  ro  r   rp  rq  pngfiler   r   r   takeScreenshot=  s&   


rx  c           	      C   s   |d  ddkrtd d S |d d\}}t|dkr#|d }nd}t|dkr2t|d }nd}t|}td	||f  |||||}t| |d
r[t|jdkr[td d S t| | d S )Nr   :r(   z(Use host:port format for teleport targetrj   rR   rZ     zTeleporting to %s:%d...r   r   )	r*   rn   r7   r8   ru   teleportr}   rv   rw   )	r   _sessionr   rg  hostportpasswdmaxDowntimer{   r   r   r   r{  W  s    
r{  c           	      C   s   |j }t|dkr|d }nd}|j|kr(||_ztt|d  W n   Y | d d}d}t| D ]}z|	||| }t
d||f  W q7   Y q7d S )Nr   rj   皙?r\  GuestStatisticTypez%s: %d)r   r8   statisticsUpdateIntervalr  rE  rF  
all_valuesrU   keysgetStatisticrn   )	r   r   rg  r   update	all_statscpure   valr   r   r   
guestStatso  s&   

r  c                 C   &   t |d }td|  || d S )Nr   Adding CPU %d...)ru   rn   
hotPlugCPUr   r   r|  rg  r  r   r   r   plugCpu     r  c                 C   r  )Nr   Removing CPU %d...)ru   rn   hotUnplugCPUr  r   r   r   	unplugCpu  r  r  c                 C   s2   | |d |d |d |d |d  |  d S )Nr   rj   rZ  rY     )mountMediumr   )r   r   r|  rg  r   r   r   mountIso  s   &r  c                 C   s   | r|S |S r   r   )rJ   v1v2r   r   r   cond  r   r  c                 C   s6   t d|jt|jd|j|j|jt| d|jf  d S )Nz0  %s: %s (vendorId=%d productId=%d serial=%s) %sr   USBDeviceState)	rn   rA   r   productvendorId	productIdserialNumberr   r    )r   udr   r   r   printHostUsbDev     6r  c                 C   s*   t d|jt|jd|j|j|jf  d S )Nz-  %s: %s (vendorId=%d productId=%d serial=%s)r   )rn   rA   r   r  r  r  r  )r   r  r   r   r   printUsbDev  s   *r  c              	   C   s6   t d|jt| |jt|jddt|jddf  d S )Nz    name=%s host=%s %s %sr   znot accessiblewritablez	read-only)rn   r@   r   hostPathr  r   r  )r   sfr   r   r   printSf  r  r  c           	      C   s
  |j }|j| d jkr;td|j  tdt| || d j  tdt| || d j  td|j  td|j	  ntd | d 
|d	}td
 |D ]}t| | qM| d 
|d}td |D ]}t| | qctd | d 
|d }}|D ]}t| | q{d S )Nr\  zAdditions active, version %szSupport seamless: %szSupport graphics: %szBalloon size: %dzStatistic update interval: %dzNo additionsri   
USBDeviceszAttached USB:remoteUSBDeviceszRemote USB:zTransient shared folders:sharedFolders)r   additionsRunLevelAdditionsRunLevelType_Nonern   additionsVersionr   AdditionsFacilityType_SeamlessAdditionsFacilityType_GraphicsmemoryBalloonSizer  r   r  r  r  )	r   r   _argsr   usbsr  rusbssfsr  r   r   r   ginfo  s*   r  c                    s   d zd }d j ddW n% ty6 } ztdjt|f  tr+t  W Y d }~d S d }~ww jd j	krOt
djjf    d S d ra|d	krat
d
   d S jfddfddfddfddfdd fdd fdd fddfdd fdd fdd fdd fdd fdd fddd}z||   W n) ty   dd< Y n ty } zt| trt  W Y d }~nd }~ww   d S )Nr   ri   TfPermitSharingzSession to '%s' not open: %sr\  z"Session to '%s' in wrong state: %sremotesome_local_only_commandz/Trying to use local only functionality, ignoredc                            S r   )pauser   r   r   r   <lambda>      zcmdExistingVm.<locals>.<lambda>c                      r  r   )resumer   r  r   r   r    r  c                      r  r   )	powerDownr   r  r   r   r    r  c                      r  r   )powerButtonr   r  r   r   r    r  c                      s
   t  S r   )r   r   )r   rL   r   r   r       
 c                         t  S r   )r   r   rg  r   r   rL   r   r   r        c                         t  S r   )r  r   rg  r   r   r   r   r        c                      s    d  dd  S )Nr   rj   r   r   r  r   r   r        c                      s   t  j S r   )r}   r   	saveStater   )r   r   r   r   r        c                      r  r   )rx  r   r  r   r   r    r  c                      r  r   )r{  r   )rg  r   r   r   r   r   r    r  c                      r  r   )r  r   r  r   r   r    r  c                         t j S r   )r  r   r   rg  r   r   r   r   r    r  c                      r  r   )r  r   r   r  r   r   r    r  c                      r  r   )r  r   r   r  r   r   r    r  )r  r  	powerdownpowerbuttonstatsr   r  guestlambdarf  
screenshotr{  
gueststatsplugcpu	unplugcpumountisorl   )openMachineSessionrB   rC   r@   r   rD   rE   rF   r    SessionState_Lockedrn   r   r   rx   )r   rL   cmdrg  r   rM   opsr   )rg  r   r   rL   r   r   cmdExistingVm  s^   




r  c              
   C   s   | d j |dd}|j}z|| || W n ty3 } zd}t| | tr)t  W Y d }~nd }~ww |rZz|  W n tyY } zt| | trOt  W Y d }~nd }~ww | d | d S Nri   Tr  F)	r  r   rB   rC   rD   rE   rF   r   closeMachineSessionr   rL   r  rg  rf  r   rM   r   r   r   r     s*   

r   c              
   C   s   | d j |dd}|j}z
|| ||j| W n ty5 } zd}t| | tr+t  W Y d }~nd }~ww |r<|  | d 	| d S r  )
r  r   r   rB   rC   rD   rE   rF   r   r  r  r   r   r   cmdAnyVm   s   
r  c                 C   s   | d  |}|S Nr   )findMachine)r   r   rL   r   r   r   machById  s   r  c                   @   r   )	XPathNodec                 C   s   || _ || _|| _d S r   )parentobjntype)r   r  r  r  r   r   r   r     s   
zXPathNode.__init__c                 C   s.   |   }g }|D ]}||r|| q|S r   )enumrG   r:   )r   subpathchildrenrG   rM   r   r   r   lookup  s   

zXPathNode.lookupc                 C   s   g S r   r   r   r   r   r   r    r  zXPathNode.enumc                 C   s|   || j krdS || j sdS td|}d}z |d ur5| }|d }|d }tt| j||k}W |S W |S    Y |S )NTFz@(?P<a>\w+)=(?P<v>[^\'\[\]]+)r?  v)r  r"   r>   rC  rD  r   getattrr  )r   subexprO  rG   xdictattrr  r   r   r   rG      s$   
zXPathNode.matchesc                 C   s   t || j| |  di  d S )N)r  noder   )r   r  getCtx)r   r  r   r   r   apply0  s   zXPathNode.applyc                 C   s   t | dr| jS | j S )Nr   )hasattrr   r  r  r  r   r   r   r  2  s   

zXPathNode.getCtxN)	rO   rP   rQ   r   r  r  rG   r  r  r   r   r   r   r    s    r  c                   @   $   e Zd Zdd Zdd Zdd ZdS )XPathNodeHolderc                 C   s*   t | ||d|  || _|| _|| _d S )Nzhld )r  r   r  	heldClass	xpathname)r   r  r  r  r  r  r   r   r   r   8  s   
zXPathNodeHolder.__init__c                 C   s<   g }|   d | j| jD ]}| | |}|| q|S Nri   )r  r   r  r  r  r:   )r   r  r  nodexmlr   r   r   r  =  s
   zXPathNodeHolder.enumc                 C   
   || j kS r   r  r   r  r   r   r   rG   C  r&   zXPathNodeHolder.matchesNrO   rP   rQ   r   r  rG   r   r   r   r   r  7  s    r  c                   @      e Zd Zdd Zdd ZdS )XPathNodeValuec                 C   s   t | ||d|  || _d S )Nzval )r  r   r  )r   r  r  r  r   r   r   r   G  s   
zXPathNodeValue.__init__c                 C   r  r   r  r  r   r   r   rG   J  r&   zXPathNodeValue.matchesNrO   rP   rQ   r   rG   r   r   r   r   r   F      r   c                   @   r   )XPathNodeHolderVMc                 C   s   t | ||dtd d S )Nr   vms)r  r   XPathNodeVM)r   r  r   r   r   r   r   N  s   zXPathNodeHolderVM.__init__Nr   r   r   r   r   r  M  r   r  c                   @   r  )r  c                 C      t | ||d d S )Nvmr  r   r   r  r  r   r   r   r   R     zXPathNodeVM.__init__c                 C   s   t | | jt| | jjdgS )Nbios)XPathNodeHolderNICr  r   BIOSSettingsr  r   r   r   r  V  s   
zXPathNodeVM.enumNrO   rP   rQ   r   r  r   r   r   r   r  Q  s    r  c                   @   r  )r  c                 C   s2   t | ||dtd |  d j| jj| _d S )Nnicsr   )	r  r   r  r  systemPropertiesgetMaxNetworkAdaptersr  chipsetTypemaxNic)r   r  rL   r   r   r   r   [  s   zXPathNodeHolderNIC.__init__c                 C   s6   g }t d| jD ]}t| | j|}|| q|S Nr   )r   r  XPathNodeNICr  getNetworkAdapterr:   )r   r  r   r  r   r   r   r  ^  s
   zXPathNodeHolderNIC.enumNr  r   r   r   r   r  Z  r  r  c                   @   r  )r  c                 C   r  Nnicr  r	  r   r   r   r   f  r
  zXPathNodeNIC.__init__c                 C   s   |dkS r  r   r  r   r   r   rG   h  s   zXPathNodeNIC.matchesNr  r   r   r   r   r  e  s    r  c                   @   r  )XPathNodeRootc                 C   s   t | d d d || _d S )Nroot)r  r   r   )r   r   r   r   r   r   l  s   
zXPathNodeRoot.__init__c                 C   s   t | | jd gS r  )r  r   r  r   r   r   r  o  r   zXPathNodeRoot.enumc                 C      dS NTr   r  r   r   r   rG   q  r  zXPathNodeRoot.matchesNr  r   r   r   r   r  k  s    r  c           
      C   s   | ddd  }t| g}|D ]6}g }t|dkr)| }|| t|dks|D ]}||}|D ]}	||	 q4q+t|dkrF |S q|S )Nr!   rZ  r   )r7   r  r8   popr:   r  )
r   scope	pathnamesnodesr6   seenr  re   rG   rO  r   r   r   
eval_xpatht  s$   


r"  c                 C   sJ   t |dk rtd|d   d S |d }t| |}|d kr#td|  |S )NrZ  zusage: %s [vmname|uuid]r   rj   zDMachine '%s' is unknown, use list command to find available machines)r8   rn   r  )r   rg  r   rL   r   r   r   
argsToMach  s   
r#  c                 C   s6   |dkrd| d }nd}t dt| d||f  d S )Nr   z [ext from ]rR   z    %s: %s%sr   )rn   r   )r  rp  spspecr   r   r   helpSingleCmd  s   r'  c                 C   s   t |dkr)td tt }|  |D ]}t|t| d t| d  qdS |d }t|}|d kr>td|  dS t||d |d  dS )Nrj   z
Help page:r   rZ  zCommand '%s' not known)r8   rn   rU   commandsr  sortr'  r   )r   rg  namesr   r  rJ   r   r   r   helpCmd  s   
r+  c                 C   sL   | d  |}t| D ]}t|t|| kr t|d  S qtddS )Nr\  r   z	<unknown>)r  rU   r  r   r   )r   r  r   enumValsrM   r   r   r   r     s   
r   c                 C   s   | d  |}||d S )Nr\  )r  r   )r   r  r   r,  r   r   r   enumFromString  r   r-  c                 C   s   t | dD ]C}z$|jrd}nd}td|t| |j|jt| d|jt| d|jf  W q t	yH } zt
| | tr>t  W Y d }~qd }~ww dS )NTz[T] z    z5%sMachine '%s' [%s], machineState=%s, sessionState=%sMachineStateSessionStater   )r=   teleporterEnabledrn   r   r@   rA   r   r    sessionStaterB   rC   rD   rE   rF   )r   r  rL   telerM   r   r   r   listCmd  s   4
r3  c              
   C   s  t |dk rtd dS t| |}|d krdS z
| d |j}W n   d }Y td tdt| |j  td|j  td|j  td	|d urM|jn|j  td
t	| d|j
|j
f  t  td|j  td|j  td|jj  td|jj  tdt	| d|j|jf  t  tdt	| d|j|jf  tdt	| d|j|jf  t  |jrtd|j|jf  t  |j}tdt|j  tdt|j  || d jj}tdt|  || d j}tdt|  || d j}tdt|  tdt|jj  tdt|jj   td t|j!  td!t|j"  |j#j$rFtd"t	| d#|j#j%t	| d$|j#j&f  td%t|j'  td&t	| d'|j(|j(f  td(t	| d)|j)|j)f  td*t*+t*,t-|j.d+   ztd,t|j/j$  W n   Y t  tt0| d- | d 1|d.D ]}td/|jt	| d0|j2|j3f  qt  tt0| d1 td2t|j4  td3|j5  | d 1|d4}	|	rt  tt0| d5 |	D ]}
td6|
jt	| d7|
j6t	| d8|
j7f  q| d 1|d9}|rt  tt0| d: |D ]}td;|j8|j9|j:t	| d<|j2|j2f  |j;}|j2| d jj<krYtd= td>|j  td?t=| |j>  td@|j  tdA|j?  |j2| d jj@krtdB |rtd>|j  td@|j  |jArtdCt=| |j>  |jBrtdD ntdEt=| |j>  tdF|jC  |j2| d jjDkrtdG |rtd>|j  td@|j  |jArtdHt=| |j>  qtdEt=| |j>  tdF|jC  qt  tt0| dI | d 1|dJD ]}tE| | qdS )KNrZ  zusage: info [vmname|uuid]r   r   zN One can use setvar <mach> <var> <value> to change variable, using name in [].z  Name [name]: %sz  Description [description]: %sz  ID [n/a]: %sz  OS Type [via OSTypeId]: %sz"  Firmware [firmwareType]: %s (%s)FirmwareTypez  CPUs [CPUCount]: %dz  RAM [memorySize]: %dMz  VRAM [VRAMSize]: %dMz  Monitors [monitorCount]: %dz   Chipset [chipsetType]: %s (%s)ChipsetTypez)  Clipboard mode [clipboardMode]: %s (%s)ClipboardModez  Machine status [n/a]: %s (%s)r/  z!  Teleport target on port %d (%s)z%  ACPI [BIOSSettings.ACPIEnabled]: %sz'  APIC [BIOSSettings.IOAPICEnabled]: %sri   zw  Hardware virtualization [guest win machine.setHWVirtExProperty(ctx[\'const\'].HWVirtExPropertyType_Enabled, value)]: r\  zi  VPID support [guest win machine.setHWVirtExProperty(ctx[\'const\'].HWVirtExPropertyType_VPID, value)]: zr  Nested paging [guest win machine.setHWVirtExProperty(ctx[\'const\'].HWVirtExPropertyType_NestedPaging, value)]: z2  Hardware 3d acceleration [accelerate3DEnabled]: z=  Hardware 2d video acceleration [accelerate2DVideoEnabled]: z$  Use universal time [RTCUseUTC]: %sz  HPET [HPETEnabled]: %sz3  Audio [via audioAdapter]: chip %s; host driver %sAudioControllerTypeAudioDriverTypez)  CPU hotplugging [CPUHotPlugEnabled]: %sz%  Keyboard [keyboardHIDType]: %s (%s)KeyboardHIDTypez,  Pointing device [pointingHIDType]: %s (%s)PointingHIDTypez  Last changed [n/a]: rg   z&  VRDE server [VRDEServer.enabled]: %sz  USB Controllers:USBControllersz     '%s': type %s  standard: %#xUSBControllerTypez  I/O subsystem info:z%   Cache enabled [IOCacheEnabled]: %sz    Cache size [IOCacheSize]: %dMstorageControllersz  Storage Controllers:z    '%s': bus %s type %s
StorageBusStorageControllerTypemediumAttachmentsz  Media:z5   Controller: '%s' port/device: %d:%d type: %s (%s):
DeviceTypez   HDD:z
    Id: %sz    Location: %sz    Name: %sz    Format: %sz   DVD:z    Host DVD %sz    [passthrough mode]z    Virtual image at %sz    Size: %sz
   Floppy:z    Host floppy %sz  Shared folders:r  )Fr8   rn   r#  getGuestOSTypeOSTypeIdr   r@   descriptionrA   r   firmwareTypeCPUCount
memorySizegraphicsAdapterVRAMSizemonitorCountr  clipboardModer1  r0  teleporterPortteleporterPasswordr  r   ACPIEnabledIOAPICEnabledgetHWVirtExPropertyr   HWVirtExPropertyType_EnabledHWVirtExPropertyType_VPID!HWVirtExPropertyType_NestedPagingaccelerate3DEnabledaccelerate2DVideoEnabled	RTCUseUTCHPETEnabledaudioAdapterenabledaudioControlleraudioDriverCPUHotPlugEnabledkeyboardHIDTypepointingHIDTyper  asctime	localtimeru   lastStateChange
VRDEServerr   r   r   USBStandardIOCacheEnabledIOCacheSizebuscontrollerType
controllerr~  devicemediumDeviceType_HardDiskr   locationformatDeviceType_DVD	hostDrivepassthroughrr  DeviceType_Floppyr  )r   rg  rL   vmosr  hwVirtEnabled
hwVirtVPIDhwVirtNestedPagingoUsbCtrlcontrollersrh  attachesr?  rj  r  r   r   r   infoCmd  s   

("
,(ry  c                 C   sX   t |dk rtd dS t| |}|d krdS t |dkr"|d }nd}t| || dS )NrZ  zusage: start name <frontend>r   gui)r8   rn   r#  r   )r   rg  rL   r   r   r   r   startCmd7  s   

r{  c                 C   sj   t |dkrtd dS |d }|d }z	| d | W n ty,   td| Y dS w t| || dS )NrY  zusage: createvm name ostyper   rj   rZ  r   zUnknown OS type:)r8   rn   rB  rB   r   )r   rg  r@   oskindr   r   r   createVmCmdE  s   
r}  c                 C   s@   t |dk rtd dS t| |}|d krdS t| |dd dS )NrZ  zusage: ginfo [vmname|uuid]r   r  rR   r8   rn   r#  r  r   rg  rL   r   r   r   ginfoCmdS  s   
r  c	                 C   s  t |dk rtd d S |j}	|	||dd}
|}td|d ||f  d}|d ur,d}t|d  |
|d ||g |}td|j  tdkrz	 |d ur|| }|d uryt |}d}|dkrx|	tdd	||d  }|| }|| }|dks`nz
|	tdd	d
 W n   Y |	tdd	d}|rt |dkrt	j
| qItd | d d |	tddd}|rt |dkr|d ur|| | nt	j
| qItjrnqJW n ty   td d| d< tjrt  Y nw |	t\}}}td|  dS t| t d S )Nrj   z)exec in guest needs at least program namerR   zvboxshell guest execzexecuting %s with args %s as %sr   zexecuted with pid %dT'  r'      r   ri   rk   rl   zExit code: %d)r8   rn   r   createSessionprocessCreatePIDpidsetProcessInputgetProcessOutputrp   rq   r-  r{   rs   rt   rm   rx   ry   rz   getProcessStatusrw   )r   r   rg  envuserr  tmo	inputPipe
outputPiper   guestSessiongargsflagsprocessindatar-  r   r   rq  _reasoncode_flagsr   r   r   execInGuest]  st   
r  c           	      C   sF   |d }|d }d}t d||f  |j|||||}t| | d S )Nr   rj   zCopying host %s to guest %s)rn   r   copyToGuestr}   )	r   r   rg  r  r  srcdstr  r{   r   r   r   r    s   r  rR   c                 C   sJ   t j}t| } | r||  t j }|st|d dkr#|d d }|S )Nr(   r(  )rp   rq   r   r-  stdinr+   EOFError)promptstreamr.  r   r   r   nh_raw_input  s   

r  c                 C   s<   dd l }| }td| }t|dkr|}|  }||fS )Nr   zUser (%s): )getpassgetuserr  r8   )r   r  r  user_inpr  r   r   r   getCred  s   r  c                    st   t |dk rtd dS t| |}|d krdS |dd  }g  t| \|d fdd t| |d| dS )NrZ  z'usage: gexec [vmname|uuid] command argsr   c                    s   t | || dS )Nr  r  r   rL   r   rg  r  r  r  r   r   r    s    zgexecCmd.<locals>.<lambda>r  r8   rn   r#  r  insertr  r   rg  rL   r  r   r  r   gexecCmd  s   
r  c                    sn   t |dk rtd dS t| |}|d krdS |dd  }t| \ |d fdd t| |d| dS )NrZ  z/usage: gcopy [vmname|uuid] host_path guest_pathr   c                    s   t | || S r   )r  r  r  r  r   r   r    r  zgcopyCmd.<locals>.<lambda>r  r  r  r   r  r   gcopyCmd  s   
r  c                 C   s    z	| d   d W S    Y d S )Nr  r   )communicate)r   _hcmdr   r   r   readCmdPipe  s   r  c                    s   t |dk rtd dS t| |}|d krdS |d |d }t| \dd l}|jt|jd| d< t|}g  |d fdd	 t	| |d
| z| d 
  W n   Y d | d< dS )Nr  zusage: gpipe [vmname|uuid] hostProgram guestProgram, such as gpipe linux  '/bin/uname -a' '/bin/sh -c "/usr/bin/tee; /bin/uname -a"'r   rZ  rY  )rq   r  c                    s   t | || dfddS )Nr  c                    s
   t |  S r   )r  r  )hcmdr   r   r    r  z,gpipeCmd.<locals>.<lambda>.<locals>.<lambda>r  r  r  r  r  r  r   r   r    s    zgpipeCmd.<locals>.<lambda>r  )r8   rn   r#  r  
subprocessPopenrf   PIPEr  r  	terminate)r   rg  rL   gcmdr  r  r   r  r   gpipeCmd  s*   
r  c                 C   s$   t | |}|d krdS t| | dS r  )r#  r   r  r   r   r   removeVmCmd  s
   

r  c                 C   (   t | |}|d krdS t| |dd dS )Nr   r  rR   r#  r  r  r   r   r   pauseCmd  
   
r  c                 C   r  )Nr   r  rR   r  r  r   r   r   powerdownCmd  r  r  c                 C   r  )Nr   r  rR   r  r  r   r   r   powerbuttonCmd  r  r  c                 C   r  )Nr   r  rR   r  r  r   r   r   	resumeCmd  r  r  c                 C   r  )Nr   rf  rR   r  r  r   r   r   saveCmd  r  r  c                 C   r  )Nr   r  rR   r  r  r   r   r   statsCmd  r  r  c              	      sv   t  dk rtd dS t|  }|d krdS |j| d jkr+t| | fdd dS t| |dd d	d   dS )
NrY  zusage: guest name commandsr   r\  c              	      s   t | |d d dd  S )Nr'   rZ  )r   r;   r   rL   r?  rg  r   r   r  *      zguestCmd.<locals>.<lambda>r   r'   rZ  )r8   rn   r#  r    MachineState_Runningr   r  r;   r  r   r  r   guestCmd"  s   
r  c                 C   H   t |dk rtd dS t| |}|d krdS t| |d|dd   dS )NrZ  z6usage: screenshot vm <file> <width> <height> <monitor>r   r  r~  r  r   r   r   screenshotCmd/     
r  c                 C   sH   t |dk rtd dS t| |}|d krdS t| |d|dd   dS )NrY  z)usage: teleport name host:port <password>r   r{  rZ  r~  r  r   r   r   teleportCmd9  r  r  c                 C   s6   |d }||_ |r|d }|d }||_||_d S d S )Nr   rj   rZ  )r0  rL  rM  )r   rL   rg  rY  r~  r  r   r   r   portalsettingsC  s   
r  c                 C   s   t |dk rtd dS t| |}|d krdS t|d }t |dkr(|d }nd}|jr4|j|ks4|r>t| |td||g t| |d dS )NrY  z&usage: openportal name port <password>r   rZ  rR   Trz  )	r8   rn   r#  ru   r0  rL  r   r  r   )r   rg  rL   r~  r  r   r   r   openportalCmdL  s   

r  c                 C   sH   t |dk rtd dS t| |}|d krdS |jr"t| |tdg dS )NrZ  zusage: closeportal namer   F)r8   rn   r#  r0  r   r  r  r   r   r   closeportalCmd]  s   
r  c                 C   r  )NrZ  z'usage: gueststats name <check interval>r   r  r~  r  r   r   r   gueststatsCmdh  r  r  c                 C   sH   |d }|d }|rt d|  || d S t d|  || d S )Nr   rj   r  r  )rn   r  r  )r   rL   rg  plugr  r   r   r   r  r  s   r  c                 C      t |dk rtd dS t| |}|d krdS t|jt| d jkr5|jr3t| |tdt	|d g dS t
| |d|d  dS )NrZ  zusage: plugcpu name cpuidr   r\  Tr  r8   rn   r#  r   r1  r  r\  r   r  ru   r  r  r   r   r   
plugcpuCmd|     
r  c                 C   r  )NrZ  zusage: unplugcpu name cpuidr   r\  Fr  r  r  r   r   r   unplugcpuCmd  r  r  c                 C   s.   d|d  d |d  }t d| t| d S )Nzmach.r   z = rj   	Executing)rn   r   )r   _machrg  exprr   r   r   setvar  s   
r  c                 C   sH   t |dk rtd dS t| |}|d krdS t| |t|dd   dS )Nr  z&usage: setvar [vmname|uuid] expr valuer   rZ  )r8   rn   r#  r   r  r  r   r   r   	setvarCmd  r  r  c                 C   s<   |d }|d }t d|j||r|nd f  ||| d S )Nr   rj   z%s: setting %s to %s)rn   r@   setExtraData)r   rL   rg  r_   r  r   r   r   
setvmextra  s   r  c                 C   s   t |dk rtd dS |d }t |dkr|d }nd}|d dkr-| d	 || dS t| |}|d kr8dS t| |t||g dS )
NrY  z0usage: setextra [vmname|uuid|global] key <value>r   rZ  r  rR   rj   ri   r   )r8   rn   r  r#  r   r  )r   rg  r_   r  rL   r   r   r   setExtraDataCmd  s   

r  c                 C   s   t d| ||f  d S )Nz%s: '%s' = '%s')rn   )r  r_   r  r   r   r   printExtraKey  s   r  c                 C   s   t |dk rtd dS t |dkr|d }nd }|d dkr$| d }nt| |}|d kr/dS |d kr8| }n|g}|D ]}t|d ||| q=dS )NrZ  z*usage: getextra [vmname|uuid|global] <key>r   rY  rj   ri   r   )r8   rn   r#  getExtraDataKeysr  getExtraData)r   rg  r_   r  r  r=  r   r   r   getExtraDataCmd  s"   



r  c                 C   r  )Nrj   r   )r   r  r   r   r   quitCmd  r  r  c                 C   sJ   t |dkr|d t|d < dS tt D ]\}}td||f  qdS )NrY  rZ  rj   r   z'%s' is an alias for '%s')r8   aliasesrU   rV   rn   )r   rg  r_   r  r   r   r   aliasCmd  s   r  c                 C   &   t |dkr|d dkadS t adS Nrj   r   r   )r8   rD   r   rg  r   r   r   
verboseCmd  
   r  c                 C   r  r  )r8   r   r  r   r   r   	colorsCmd  r  r  c              
   C   sJ  | d }zt dt|jd  W n ty- } zt| | tr#t  W Y d }~nd }~ww |j}t dt	| |j
  |j}|j}t t| d t d||jf  td|D ]}t d|||||f  qVt t| d	 t d
|j|jf  t t| d t d|j|jf  |jrt t| d nt t| d t t| d | d |dD ]}t d|j|jf  qt t| d | d |dD ]}	t d|	j|	jf  qt t| d | d |dD ]}	t d|	j|	jf  qt t| d | d |dD ]}
t| |
 q| d r#| d dg|gD ]}t |d |d  qdS )Nr   zVirtualBox version %sr   zMachines: %szProcessors:z  available/online: %d/%d r   z  processor #%d speed: %dMHz %szRAM:z  %dM (free %dM)zOS:z	  %s (%s)z3D acceleration availablez3D acceleration NOT availablezNetwork interfaces:ri   networkInterfaceszDVD drives:	DVDDrivesz	  %s - %szFloppy drives:floppyDriveszUSB devices:r  r   r   r@   r   )rn   r   versionrB   rC   rD   rE   rF   r  r   defaultMachineFolderr}  processorCountr   processorOnlineCountr   getProcessorSpeedgetProcessorDescriptionrG  memoryAvailableoperatingSystem	OSVersionacceleration3DAvailabler   r@   	IPAddressrD  r  r   )r   rg  r   rM   propsr}  cntr   niddr  r   r   r   r   hostCmd  sP   
 
r  c                    l   t |dk rtd dS t| |}|d krdS dt |dkr%t|d d t| |d fddg dS )	NrZ  z#usage: monitorGuest name (duration)r      Fr  c                    s   t | |j S r   )r'  r"  r  r#  r$  r   r   r  7  r  z!monitorGuestCmd.<locals>.<lambda>r8   rn   r#  rF  r  r  r   r  r   monitorGuestCmd,     
r  c                    r  )	NrZ  z&usage: monitorGuestKbd name (duration)r   r  Fr  c                       t | |jj S r   )r'  r3  r"  r  r  r   r   r  E      z$monitorGuestKbdCmd.<locals>.<lambda>r   r  r   r  r   monitorGuestKbdCmd:  r  r  c                    r  )	NrZ  z(usage: monitorGuestMouse name (duration)r   r  Fr  c                    r  r   r'  r4  r"  r  r  r   r   r  S  r  z&monitorGuestMouseCmd.<locals>.<lambda>r   r  r   r  r   monitorGuestMouseCmdH  r  r  c                    r  )	NrZ  z-usage: monitorGuestMultiTouch name (duration)r   r  Fr  c                    r  r   r  r  r  r   r   r  a  r  z+monitorGuestMultiTouchCmd.<locals>.<lambda>r   r  r   r  r   monitorGuestMultiTouchCmdV  r  r  c                 C   sT   t |dkrtd dS d}t |dkrt|d }| d }d}t| |j|| dS )NrZ  zusage: monitorVBox (duration)r   r  rj   r   F)r8   rn   rF  r'  r"  )r   rg  r$  r   r#  r   r   r   monitorVBoxCmdd  s   r	  c                 C   s   || d j jks|| d j jks|| d j jkrdS || d j jks2|| d j jks2|| d j jkr4dS || d j jkr>dS || d j jkrHdS || d j j	krRd S t
d| )Nri   pcnete1000virtioz
virtio_1.0zUnknown adapter type: )r   NetworkAdapterType_Am79C970ANetworkAdapterType_Am79C973NetworkAdapterType_Am79C960NetworkAdapterType_I82540EMNetworkAdapterType_I82545EMNetworkAdapterType_I82543GCNetworkAdapterType_VirtioNetworkAdapterType_Virtio_1_0NetworkAdapterType_NullrB   )r   natyper   r   r   getAdapterTypep  s   r  c                 C   s  t |dkrtd dS t| |}|d krdS t|d }t|d }t|d }d}| d j|d	d
}|j}||}t| |j}	|d t	| d t	| }
d|	 d }|t	|j
 d |
 }||d | ||d t	| ||d t	| |  |  dS )Nr  z8usage: portForward <vm> <adapter> <hostPort> <guestPort>r   rZ  rY  r  TCPri   Tr  ro  zVBoxInternal/Devices/r!   z/LUN#0/Config/z	/Protocolz	/HostPortz
/GuestPort)r8   rn   r#  ru   r  r   r  r  adapterTyper   slotr  r   r   )r   rg  rL   
adapterNumhostPort	guestPortprotor   adapterr  profile_nameconfigr   r   r   portForwardCmd  s.   

r"  c                 C   s   t |dk rtd dS t| |}|d krdS d}t |dkr#|d }d}	 |||d}t |dkr6	 dS tjt| |t |7 }q&)NrZ  zusage: showLog vm <num>r   Tr  )r8   rn   r#  readLogrp   rq   r-  r   )r   rg  rL   loguOffsetrq  r   r   r   
showLogCmd  s$   
r&  c                 C   s   t |dk rtd dS t| |}|d krdS d}t |dkr#|d }|d }d}	 |||d}t |dkr:	 dS t|d}|D ] }t||}	t |	dkrc|	D ]}
||
t	|
d}qSt| qC|t |7 }q*)	NrY  zusage: findLog vm pattern <num>r   rZ  T   r(  r   )
r8   rn   r#  r#  r   r7   r>   rG  replacer   )r   rg  rL   r$  patternr%  rq  dre   rO  mtr   r   r   
findLogCmd  s4   

r,  c                 C   s   t |dk rtd dS t| |}|d krdS d}t |dkr#|d }d}td}d}d}	 |||d}t |dkr?	 dS t|d}	|	D ]'}
|r\t|
 |dkrWd}n|d	 }qH||
}t |dkrod}d
}t|
 qH|t |7 }q/)NrZ  zusage: findAssert vm <num>r   z(Expression:|\!\!\!\!\!\!)FTr'  r(  rj   2   )	r8   rn   r#  r>   rB  r#  r   r7   rG  )r   rg  rL   r$  r%  erer#  contextrq  r*  re   rO  r   r   r   findAssertCmd  sD   


r0  c              
   C   sl   d |dd  }zt| W dS  ty5 } zt| | tr*t  W Y d }~dS W Y d }~dS d }~ww )Nr'   rj   r   )r;   r   rB   rC   rD   rE   rF   )r   rg  r  rM   r   r   r   evalCmd  s   


r1  c                 C   s   t | tt|  tt|  dS r  )checkUserExtensionsr(  getHomeFolderrc   r  r   r   r   reloadExtCmd	  s   
r4  c              
   C   s   t |dkrtd dS z	t|d d}W n ty1 } ztd|d d| W Y d }~dS d }~ww z:| }d| d< d	| d
< | d t |k rk|| d  }| d d | d< t| |}|dksb| d
 rcn| d t |k sGW n ty } zt| | trt	
  W Y d }~nd }~ww |  dS )NrZ  zusage: runScript <script>r   rj   r:  zcannot open:ry  
scriptLineFrl   )r8   rn   r1  IOError	readlines
runCommandrB   rC   rD   rE   rF   r5  )r   rg  lfrM   linesr.  doner   r   r   runScriptCmd  s<   

r<  c                 C   s>   t |dkrtd dS ztt|d  W dS    Y dS )NrZ  zusage: sleep <secs>r   rj   )r8   rn   r  rE  rF  r  r   r   r   sleepCmd+  s   r=  c                 C   sP   t |dk rtd dS d|dd  }zt| W dS  ty'   Y dS w )NrZ  zusage: shell <commands>r   r'   rj   )r8   rn   r;   r5   r\   rx   )r   rg  r  r   r   r   shellCmd8  s   r>  c              
   C   s  t |dkrtd dS | d d urtd dS t |dkr#|d }nd }t |dkr0|d }nd}t |d	kr=|d	 }nd}|||g| d
< | d j|||| d< ztd| d j  W n tyz } zt| | trpt	  W Y d }~nd }~ww | d 
| d | d< dS )Nr  z&usage: connect url <username> <passwd>r   r   z&Already connected, disconnect first...rj   rZ  rR   rY  wsinfori   Running VirtualBox version %sr   )r8   rn   r[   connectr  rB   rC   rD   rE   rF   getPerfCollectorr   rg  urlr  r  rM   r   r   r   
connectCmdF  s6   



rE  c                 C   s`   t |dkrtd dS | d d u rtd dS z	| d j  W n   d | d<  d | d< dS )Nrj   zusage: disconnectr   r   zNot connected yet.ri   )r8   rn   r[   
disconnectr  r   r   r   disconnectCmdi  s   rG  c              
   C   s   | d d u rt d dS z	| d j  W n   Y | d \}}}| d j|||| d< zt d| d j  W n tyU } zt| | trKt	  W Y d }~nd }~ww | d 
| d | d< dS )Nr?  zNever connected...r   ri   r   r@  r   )rn   r[   rF  rA  r  rB   rC   rD   rE   rF   rB  rC  r   r   r   reconnectCmd{  s&   
rH  c           	      C   s   t |dk rtd dS t| |}|d u rdS |d }t |dkr&|d }nd}t |dkr3|d }nd}| d  }||}|| d	 jj|d
 |||}t	| |rgt
|jdkrgtd||f  dS t| | dS )NrY  z3usage: exportVm <machine> <path> <format> <license>r   rZ  zovf-1.0r  GPLr   ri   rR   zExported to %s in format %s)r8   rn   r#  createApplianceexportaddDescriptionr   $VirtualSystemDescriptionType_Licenser-  r}   ru   rv   rw   )	r   rg  rL   r6   fmtlicappdescr{   r   r   r   exportVMCmd  s,   




rR  r?     rA  0   rJ   .   r*      rM      rh  !   g"   rp  #   r      j$   r=  %   l&   r>  r-  n1   o   r;     q   r:     re      r<     u   r  /   r      r   -   r      r   ,   0   r@  rZ  2rY  3r  4r  5   6   7   	   r   9               '   (   3   4   5   r      )   )89r'   -=[r$  ;',.r!   	r(  `ESCrj   BKSP   SPACETABCAPS:   ENTERLSHIFT*   RSHIFT6   INS   R   DELS   ENDO   HOMEG   PGUPI   PGDOWNQ   LGUI[   RGUI\   LCTR   RCTRLALT8   RALTAPPS]   F1;   F2<   F3=   F4>   F5?   F6@   F7A   F8B   F9C   F10D   F11W   F12X   UPH   K   P   M   )LEFTDOWNRIGHTc                 C   s@   t | d}|dkr|gS t| g }t|dkrtd|  |S )Nr   zbad ext)r   r   extScancodesr8   rn   )chr  extCoder   r   r   keyDown  s   
r  c                 C   s8   t | d d  }t|dkr|t|d   d7  < |S )Nr   rj      )r  r8   )r  rS  r   r   r   keyUp  s   r  c                 C   s  g }d}d}d}| j }|t|k r|| }|d }|dkr d}q|dkr5|D ]	}	|t|	 q&g }d}q|dkr?td q|d	ksO|d
ksO|dksO|dkrl|d	krUd}|d
kr[d}|dkrad}|dkrgd}|skd}n@|dkr|t|k r|| }|d }|dkrd}n%|dkrd}
|t|k r|| }|d }|dkrn
|
|7 }
|t|k s|
}d}|t| |d| |s|r|D ]	}	|t|	 qg }d}t| |t|k sd S d S )NFTr   rj   {}Wg333333?^|$ro  r  r  r  r  \rb  r(  &rR   r  )r3  r8   rH  r  r  rE  r  r  )r   r   delaypressedgroupmodGroupEndr   rN  r  rJ   combor   r   r   typeInGuest  sv   
 
r  c                    sv   t |dk rtd dS t| |}|d u rdS |d t |dkr(t|d  nd  fddg}t| |d| dS )	NrY  z-usage: typeGuest <machine> <text> <charDelay>r   rZ  r  c                    s   t | S r   )r  r  r  r   r   r   r  c  r  ztypeGuestCmd.<locals>.<lambda>r  r   r  r   r  r   typeGuestCmdT  s   
r  c                 C   s   | rd| S dS )Nz: rR   r   )verboser   r   r   r   optIdh  s   r  c                 C   s   |rt | d S t | S )Ni   )ru   )r  inBytesr   r   r   asSizen  s   r  c           	      C   s  t |dkrt|d }nd}| d | d d}tt| d |D ]1}|j| d jjkr1|  tdt	| |j
|jt||jt| t|jdt| t|jdf  q"| d | d d	}tt| d
 |D ])}|j| d jjkrv|  tdt	| |j
|jt||jt| t|jdf  qg| d | d d}tt| d |D ])}|j| d jjkr|  tdt	| |j
|jt||jt| t|jdf  qdS )Nrj   Fri   r   	hardDiskszHard disks:z   %s (%s)%s %s [logical %s]T	DVDImageszCD/DVD disks:z   %s (%s)%s %sfloppyImageszFloppy disks:r   )r8   ru   r   rn   r   r    r   MediumState_CreatedrefreshStater   rl  rm  r  rA   r   r  rr  logicalSize)	r   rg  r  hddshdddvdsdvdfloppysfloppyr   r   r   listMediaCmdt  s,   F66r  c                 C   sF   t |dkrtd dS | d j}| d |dD ]}t| | qdS )Nrj   zusage: listUsbr   r   ri   r  )r8   rn   r}  r   r  )r   rg  r}  r  r   r   r   
listUsbCmd  s   
r  c                 C   s@   | d  |d}|D ]}|j|kr|j|j|jg  S q
g dS )Nri   r@  )Nr   r   )r   r   rh  r~  ri  )r   rL   devtypeattsr?  r   r   r   findDevOfType  s   
r  c                 C   s   t |dk rtd dS t|d }|d }t |dkr!|d }nd}| d ||| d jj| d jj}||| d jjf}t	| |rW|j
rWtd	t| |j|j
f  dS td
|  t| | dS )NrY  z$usage: createHdd sizeM location typer   rj   rZ  vdir   ri   zcreated HDD at %s as %sz#cannot create disk (file %s exist?))r8   rn   ru   createMediumr   AccessMode_ReadWriterk  createBaseStorageMediumVariant_Standardr}   rA   r   rl  rw   )r   rg  rr  locrN  r  r{   r   r   r   createHddCmd  s    
$
r  c           	      C   sj   t |dk rtd dS | d }|d }d}d}d}d}||| d jj| d jjd}td	|j  dS )
NrZ  zusage: registerHdd locationr   r   rj   FrR   ri   zregistered HDD as %s)r8   rn   
openMediumr   rk  r  rA   )	r   rg  r   r  
setImageIdimageIdsetParentIdparentIdr  r   r   r   registerHddCmd  s    r  c                 C   s$   |\}}}}}| ||||| d S r   )attachDevice)r   rL   rg  ctrr~  r  r  r   r   r   r   controldevice  s   r  c                       t |dk rtd dS t| |}|d u rdS | d }|d }z||| d jj| d jjdW n   td|  Y dS t |dkrR|d  |d	 d
\nt| || d jj\ t	| | fdd dS )NrY  z,usage: attachHdd vm hdd controller port:slotr   r   rZ  ri   Fno HDD with path %s registeredr  ry  c                    s   |  | d jjjS r  )r  r   rk  rA   r   rL   rg  r  r  r~  r  r   r   r    r  zattachHddCmd.<locals>.<lambda>)
r8   rn   r#  r  r   rk  r  r7   r  r   r   rg  rL   r   r  r   r  r   attachHddCmd  s&   
$r  c                 C   sT   | d  |d}|d }|D ]}|jr'|dks|jj|kr'||j|j|j qd S )Nri   r@  r   r   )r   rj  rA   detachDevicerh  r~  ri  )r   rL   rg  r  hidr?  r   r   r   r     s   r   c                 C   s   t | t| |t|g d S r   )r   r  r   )r   midrj  r   r   r   detachMedium  r   r  c                 C      t |dk rtd dS t| |}|d u rdS | d }|d }z||| d jj| d jjd}W n   td|  Y dS t| |j| dS )	NrY  zusage: detachHdd vm hddr   r   rZ  ri   Fr  )	r8   rn   r#  r  r   rk  r  r  rA   )r   rg  rL   r   r  r  r   r   r   detachHddCmd     
$r!  c           	   
   C   s   t |dk rtd dS | d }|d }t |dkr!t|d }nd}z||| d jj| d jjd}W n   td|  Y dS |dkrz| d |d	}z|D ]}td
|  t| || qQW n t	yy } ztd| W Y d }~dS d }~ww |
  dS )NrZ  z#usage: unregisterHdd path <vmunreg>r   r   rj   ri   Fr  
machineIdszTrying to detach from %szfailed: )r8   rn   ru   r  r   rk  r  r   r  rB   r5  )	r   rg  r   r  vmunregr  machsrL   rM   r   r   r   unregisterHddCmd	  s6   $
r&  c                 C   s|   t |dkrtd dS | d }|d }z||| d jj| d jjd}W n   td|  Y dS | }t| | dS )	NrZ  zusage: removeHdd pathr   r   rj   ri   Fr  )r8   rn   r  r   rk  r  deleteStorager}   )r   rg  r   r  r  r{   r   r   r   removeHddCmd	  s   $
r(  c                 C   sZ   t |dk rtd dS | d }|d }||| d jj| d jjd}td|j  dS )	NrZ  zusage: registerIso locationr   r   rj   ri   Fzregistered ISO as %s)r8   rn   r  r   rn  AccessMode_ReadOnlyrA   )r   rg  r   r  isor   r   r   registerIsoCmd1	  s    r+  c                 C   s   t |dkrtd dS | d }|d }z||| d jj| d jjd}W n   td|  Y dS | }td	t| |  dS )
NrZ  zusage: unregisterIso pathr   r   rj   ri   Fno DVD with path %s registeredzUnregistered ISO at %s)r8   rn   r  r   rn  r)  r5  r   r   rg  r   r  r  r{   r   r   r   unregisterIsoCmd<	  s   $r.  c                 C   s   t |dkrtd dS | d }|d }z||| d jj| d jjd}W n   td|  Y dS | }t| |rHtd	t| |j	  dS t
| | dS )
NrZ  zusage: removeIso pathr   r   rj   ri   Fr,  zRemoved ISO at %s)r8   rn   r  r   rn  r)  r'  r}   r   rl  rw   r-  r   r   r   removeIsoCmdN	  s    $

r/  c                    r  )NrY  z,usage: attachIso vm iso controller port:slotr   r   rZ  ri   Fr,  r  ry  c                    s   |  | d jjS r  )r  r   rn  r  r  r  r~  r  r   r   r  v	  r  zattachIsoCmd.<locals>.<lambda>)
r8   rn   r#  r  r   rn  r)  r7   r  r   r  r   r0  r   attachIsoCmdb	  s&   
$r1  c                 C   r   )	NrY  zusage: detachIso vm isor   r   rZ  ri   Fr,  )	r8   rn   r#  r  r   rn  r)  r  rA   )r   rg  rL   r   r  r  r   r   r   detachIsoCmdy	  r"  r2  c           	   	   C   s   t |dk rtd dS t| |}|d u rdS | d }|d }z||| d jj| d jjd}W n   td|  Y dS t |dkrR|d }|d	 d
\}}nt| || d jj\}}}t	| |d||||dg dS )NrY  z+usage: mountIso vm iso controller port:slotr   r   rZ  ri   Fr,  r  ry  r  T)
r8   rn   r#  r  r   rn  r)  r7   r  r  )	r   rg  rL   r   r  r  r  r~  r  r   r   r   mountIsoCmd	  s&   
$r3  c              	   C   s   t |dk rtd dS t| |}|d u rdS | d }t |dkr/|d }|d d\}}nt| || d jj\}}}t| |d|||d d	g dS )
NrZ  z)usage: unmountIso vm controller port:slotr   r   rY  ry  ri   r  T)r8   rn   r#  r7   r  r   rn  r  )r   rg  rL   r   r  r~  r  r   r   r   unmountIsoCmd	  s   
r4  c                 C   s,   |\}}}| ||}|d kr||_d S d S r   )addStorageControllerrg  )r   rL   rg  r@   rf  ctrltyper  r   r   r   	attachCtr	  s
   

r7  c                 C   s   t |dk rtd dS t |dkr)t| d|d }|d kr(td|d   dS nd }t| |}|d u r6dS t| d|d }|d u rLtd|d   dS |d	 }t| |t|||g dS )
Nr  z$usage: attachCtr vm cname bus <type>r   r?  zController type %s unknownr>  rY  zBus type %s unknownrZ  )r8   rn   r-  r#  r   r7  )r   rg  r6  rL   rf  r@   r   r   r   attachCtrCmd	  s(   
r8  c                    sN   t |dk rtd dS t| |}|d u rdS |d  t| | fdd dS )NrY  zusage: detachCtr vm namer   rZ  c                    
   |  S r   )removeStorageControllerr  r  r   r   r  	  r  zdetachCtrCmd.<locals>.<lambda>)r8   rn   r#  r   r  r   r;  r   detachCtrCmd	     
r<  c                 C   s.   |d r| |d d d S ||d  d S )Nr   rj   rR   )attachUSBDevicedetachUSBDevicer  r   r   r   usbctr	  s   r@  c                 C   N   t |dk rtd dS t| |}|d u rdS |d }t| |dtd|g dS )NrY  zusage: attachUsb vm deviceuidr   rZ  r  Tr8   rn   r#  r  r@  r   rg  rL   devr   r   r   attachUsbCmd	  r=  rE  c                 C   rA  )NrY  zusage: detachUsb vm deviceuidr   rZ  r  FrB  rC  r   r   r   detachUsbCmd	  r=  rF  c                 C   sX   t |dkrtd dS | d  }tj|d}zt| W dS  ty+   Y dS w )Nrj   z
usage: guir   ri   
VirtualBox)r8   rn   	getBinDirr5   r6   r;   r\   rx   )r   rg  binDirr   r   r   r   guiCmd
  s   rJ  c                    s   t |dk rtd dS t| |}|d u rdS |d |d  dd}t |dkr>|dd  D ]}|dkr7d|d	kr=d}q/|rOt| | fd
dg  dS t| |d fddg dS )Nr  z7usage: shareFolder vm path name <writable> <persistent>r   rZ  rY  Fr  T
persistentc                    s   |  S r   createSharedFolderr  r@   r6   r  r   r   r  '
  r  z shareFolderCmd.<locals>.<lambda>r  c                    s   |  S r   rL  r  rN  r   r   r  )
  r  )r8   rn   r#  r   r  )r   rg  rL   rK  r?  r   rN  r   shareFolderCmd
  s,   
rO  c                    s   t |dk rtd dS t| |}|d u rdS |d  d}| d |dD ]}|j kr;t| | fdd	g  d
} nq%|sJt| |d fdd	g dS )NrY  zusage: unshareFolder vm namer   rZ  Fri   r  c                    r9  r   removeSharedFolderr  r@   r   r   r  8
  r  z"unshareFolderCmd.<locals>.<lambda>Tr  c                    s
   |  S r   rP  r  rR  r   r   r  <
  r  )r8   rn   r#  r   r@   r   r  )r   rg  rL   foundr  r   rR  r   unshareFolderCmd,
  s"   

rT  c                    s  t |dk s|d dkrtd td td dS t| |}|d u r%dS |d }|dkrWt |d	k r9td
 dS |d t |d	krH|d	  nd t| | fdd dS |dkr|t |d	k rgtd dS |d |t| |fdd dS |dkrt |d	k rtd dS | t| |fdd dS |dkrt |d	k rtd dS |d |t| |fdd dS td|  dS )NrZ  rj   r)   z5Take snapshot:    snapshot vm take name <description>z*Restore snapshot: snapshot vm restore namez(Merge snapshot:   snapshot vm merge namer   taker  z*usage: snapshot vm take name <description>rY  rR   c                    s   t | | dd S )NTr   )r}   takeSnapshotr  )rQ  r@   r   r   r  T
  s    zsnapshotCmd.<locals>.<lambda>restorezusage: snapshot vm restore namec                       t | | S r   r}   restoreSnapshotr  snapr   r   r  ]
  r  restorecurrentz!usage: snapshot vm restorecurrentc                    rX  r   rY  r  r[  r   r   r  e
  r  deletezusage: snapshot vm delete namec                    s   t | | jS r   )r}   deleteSnapshotrA   r  r[  r   r   r  n
  r  zCommand '%s' is unknown)r8   rn   r#  r  findSnapshotcurrentSnapshot)r   rg  rL   r  r   )rQ  r@   r\  r   snapshotCmd@
  sX   



rb  c                 C   s   dddd}t |dkrCd}d}t| D ]'\}}	|dkr!d}n|d7 }t|j|	@ r5|d|d	f 7 }q|d|d
f 7 }qd|gfS d|_d|vrvtdt |D ]$}
||
 |vritd||
   ttj  dS t|j|||
  B |_qQdS )a)  This command shows/alters NAT's alias settings.
    usage: nat <vm> <nicnum> alias [default|[log] [proxyonly] [sameports]]
    default - set settings to default values
    log - switch on alias logging
    proxyonly - switch proxyonly mode on
    sameports - enforces NAT using the same ports
    rj   rZ  r  )r$  	proxyonly	sameportsr   rR   , r~   r   r   defaultzInvalid alias mode: rj   Nr   N)	r8   rU   rV   ru   	aliasModer   rn   natAlias__doc__)r   rL   nicnumnatrg  aliasfirstmsg	aliasmodealiaskeyr?  r   r   r   rj  t
  s0   	

rj  c              	   C   s  t |dkr;| \}}}}}	|dkrd}|dkrd}|dkr!d}|dkr'd}|	dkr-d}	d|||||	f }
d|
gfS |d dk rKtd|d   dS td	t |D ]%}||  rjt|| d
k sjt|| dkrwtd||| f   dS qR|d g}t |dk rtd	t |D ]	}|||  qtt |dD ]}|d qntd	t |D ]	}|||  q|t|d t|d t|d	 t|d t|d  dS )aJ  This command shows/alters NAT settings.
    usage: nat <vm> <nicnum> settings [<mtu> [[<socsndbuf> <sockrcvbuf> [<tcpsndwnd> <tcprcvwnd>]]]]
    mtu - set mtu <= 16000
    socksndbuf/sockrcvbuf - sets amount of kb for socket sending/receiving buffer
    tcpsndwnd/tcprcvwnd - sets size of initial tcp sending/receiving window
    rj   r   i  r  z4mtu:%s socket(snd:%s, rcv:%s) tcpwnd(snd:%s, rcv:%s)i>  z0invalid mtu value (%s not in range [65 - 16000])rg  rZ  r}  i   z/invalid %s parameter (%i not in range [8-1024])ry  rY  r  rh  )r8   getNetworkSettingsrn   r   isdigitru   r:   setNetworkSettings)r   rL   rl  rm  rg  mtu
socksndbuf
sockrcvbuf	tcpsndwnd	tcprcvwndrp  r   r?  r   r   r   natSettings
  s0   
,
" ":r{  c                 C   sn   ddd}t |dkr&d|t|j |t|j |t|j f }d|gfS d|v |_d|v |_d	|v |_d
S )a9  This command shows/alters DNS's NAT settings
    usage: nat <vm> <nicnum> dns [passdomain] [proxy] [usehostresolver]
    passdomain - enforces builtin DHCP server to pass domain
    proxy - switch on builtin NAT DNS proxying mechanism
    usehostresolver - proxies all DNS requests to Host Resolver interface
    r   r   r   rj   rj   z+passdomain:%s, proxy:%s, usehostresolver:%sr   
passdomainproxyusehostresolverrh  )r8   ru   DNSPassDomainDNSProxyDNSUseHostResolver)r   rL   rl  rm  rg  yesnorp  r   r   r   natDns
  s   
,



r  c                 C   sR  t |dkrk|j}|du rE|j}|du rdt|d  }|d\}}|ddkr5|d7 }|ddks*|d\}}}	}
d	|||	f }|j}|du rSd
| d j }|j}|du r_d|j	 }d|||f }d|gfS |d }t |dkrt
d| t
tj dS |dkr|d |_dS |dkr|d |_dS |dkr|d |_dS t
d| dS )zThis command shows/alters TFTP settings
    usage nat <vm> <nicnum> tftp [prefix <prefix>| bootfile <bootfile>| server <server>]
    prefix - alters prefix TFTP settings
    bootfile - alters bootfile TFTP settings
    server - sets booting server
    rj   Nz
10.0.%d/24rZ  r!   r  rY  z.0z
%d.%d.%d.4z%s/TFTP/r   z%s.pxez!server:%s, prefix:%s, bootfile:%sr   zinvalid args:rg  prefixbootfileserverzinvalid cmd:rh  )r8   TFTPNextServernetworkru   r7   count
TFTPPrefix
homeFolderTFTPBootFiler@   rn   natTftprk  )r   rL   rl  rm  rg  r  maskr?  rA  rJ   r*  r  r  rp  r  r   r   r   r  
  sB   




r  c              
      sF  t  dkr<dddg }| d d}|D ] }t|d\}}	}
}}}|d|t|	 |
|||f  qd	|fS d	dd
 fdd fddd fdd fddd fdd fddd fdd fdddd d  d  std d  ttj dS  d  d  }dS )aB  This command shows/manages port-forwarding settings
    usage:
        nat <vm> <nicnum> <pf> [ simple tcp|udp <hostport> <guestport>]
            |[no_name tcp|udp <hostip> <hostport> <guestip> <guestport>]
            |[ex tcp|udp <pf-name> <hostip> <hostport> <guestip> <guestport>]
            |[delete <pf-name>]
    rj   udptcpr|  ri   	redirectsre  z%s: %s %s:%s => %s:%sr   )r  r  c                      4    d t  v o d t  v ot dkS )Nrj   rZ  r  rU   r  r8   r   rg  pfcmdr  r   r   r  
     4 z#natPortForwarding.<locals>.<lambda>c                
      s,    d d  dt d dt d S )NrR   rZ  rY  r  addRedirectru   r   rg  rm  r  r   r   r    s   , )validatefuncc                      r  )Nrj   rZ  r{  r  r   r  r   r   r    r  c                
      s4    d d   d t d  d t d S )NrR   rZ  rY  r  r  ry  r  r   r  r   r   r    r  c                      r  )Nrj   rZ  r}  r  r   r  r   r   r    r  c                
      s8     d  d   d t d  d t d S )NrY  rZ  r  r  ry  r{  r  r   r  r   r   r    s   8 c                         t  dkS NrY  r8   r   r  r   r   r    r  c                      s     d S NrZ  )removeRedirectr   )rg  rm  r   r   r    r  )r   no_nameexr^  r  z/invalid port-forwarding or args of sub command rg  r  rh  )	r8   r   r   r7   r:   ru   rn   natPortForwardingrk  )r   rL   rl  rm  rg  rp  pfspfpfnmepfppfhippfhppfgippfgpr?  r   )rg  rm  r  r  r   r  
  s8   
$


r  c                 C   s   t |dkr'|jdurt t|jdkrd|j }ndt|d  }d|gfS |d d\}}|dd	ksCt|dk sCt|d
krItd dS |d |_dS )zdThis command shows/alters NAT network settings
    usage: nat <vm> <nicnum> network [<network>]
    rj   Nr   z'%s'z10.0.%d.0/24rZ  r!   r  rY  rV  zInvalid argumentsrg  rh  )r8   r  r   ru   r7   r  rn   )r   rL   rl  rm  rg  rp  addrr  r   r   r   
natNetwork#  s   
&
r  c                 C   s  t tttttd}t|dk s|d dkr-t|dkr&t||d  j dS tt	j dS t|dks?t|dk s?|d |vrFtt	j dS | d |}|d	krVtd
 dS t|dk sv|d 
 rvt|d ttd| d j|jvrtd|d | d j|jf  dS t|d }g }tdt|D ]	}|||  q|d }d}d	}	t|dkrd}| d j|dd}	|	j}||}
|
j}|| | ||||\}}|dkr|dkr|  |	  dS |d	ur|D ]}d|j|||f }t| qdS )zThis command is entry point to NAT settins management
    usage: nat <vm> <nicnum> <cmd> <cmd-args>
    cmd - [alias|settings|tftp|dns|pf|network]
    for more information about commands:
    nat help <cmd>
    )rn  settingstftpdnsr  r  rZ  rj   r)   r   r  rY  r#  Nplease specify vmr   3please specify adapter num %d isn't in range [0-%d]ri   Fr  z%s nic%d %s: %s)rj  r{  r  r  r  r  r8   rn   rk  natCmdrt  ru   rU   r   r  r  r  r:   r  r   r  	NATEnginer   r   r@   )r   rg  natcommandsrL   rl  cmdargsr   r  	rosessionr   r  	natEnginercreportr:  rp  r   r   r   r  5  s^   		
$
@"

r  c                 C   s~   t |dkrddd}|t| | }d|fS ddd}|d |vr3td|d t| f  dS | |||d   d	S )
Nrj   r   r   r|  r   )r   r   z%%s isn't acceptable, please choose %srg  rh  )r8   ru   __getattr__rn   rU   r  __setattr__)r  r  rg  r  r:  r   r   r   nicSwitchOnOffr  s   

r  c                 C   s\   t |d|\}}t|dkr|dkrd||jf }d|fS t|dkr,|dkr,|d |_dS )z8
    usage: nic <vm> <nicnum> trace [on|off [file]]
    traceEnabledrj   r   z
%s file:%srY  rZ  rh  )r  r8   	traceFile)r   r  rl  r  rg  r  r:  r   r   r   nicTraceSubCmd  s   
r  c                 C   sP   t |dkrd|j }d|fS |d  std|d   dS t|d |_dS )Nrj   z%d kbpsr   z%s isn't a numberrg  rh  )r8   	lineSpeedrt  rn   ru   )r   r  rl  r  rg  r:  r   r   r   nicLineSpeedSubCmd  s   
r  c                 C      t |d|S )z1
    usage: nic <vm> <nicnum> cable [on|off]
    cableConnectedr  r   r  rl  r  rg  r   r   r   nicCableSubCmd     r  c                 C   r  )z2
    usage: nic <vm> <nicnum> enable [on|off]
    rY  r  r  r   r   r   nicEnableSubCmd  r  r  c                 C   s   t |dkr+| d d}t| D ]}t|jt|| kr(dt|f  S qdS | d d}|d t| vrLtd|d t| f  dS ||d  |_dS )z_
    usage: nic <vm> <nicnum> type [Am79c970A|Am79c970A|I82540EM|I82545EM|I82543GC|Virtio]
    rj   r\  NetworkAdapterTyper   rg   %s not in acceptable values (%s)rh  )r8   r  rU   r  r   r  rn   )r   r  rl  r  rg  nictypesr_   r   r   r   nicTypeSubCmd  s   r  c           	         s  t dkrSd jjdd jjdd jjd jfd jjd jfd jjd j	fd jj
di}t jtkrBt j}n j}|| \}}d	d
||f fS fdddd fdddfdddd fdddfdd fddfdddfdd fddfdddfdd fddfdddfdddd fdddd}d t| vrtd d t| f  d!S |d  d"  st|j d!S |d  d#   |d  d$   _d%S )&zp
    usage: nic <vm> <nicnum> attachment [Null|NAT|Bridged <interface>|Internal <name>|HostOnly <interface>
    rj   ri   )NullrR   )NATrR   BridgedInternalHostOnly)GenericrR   r   zattachment:%s, name:%sc                      r  r  r  r   r  r   r   r    r  z%nicAttachmentSubCmd.<locals>.<lambda>c                   S   r  Nz
do nothingr   r   r   r   r   r        c                          d j jS r  )r   NetworkAttachmentType_Nullr   r  r   r   r    r  )r  r;  rh  c                      r  r  r  r   r  r   r   r    r  c                   S   r  r  r   r   r   r   r   r    r  c                      r  r  )r   NetworkAttachmentType_NATr   r  r   r   r    r  c                      r  r  r  r   r  r   r   r    r  c                           dd S )NbridgedInterfacerZ  r  r   r  rg  r   r   r    r  c                      r  r  )r   NetworkAttachmentType_Bridgedr   r  r   r   r    r  c                      r  r  r  r   r  r   r   r    r  c                      r  )NinternalNetworkrZ  r  r   r  r   r   r    r  c                      r  r  )r   NetworkAttachmentType_Internalr   r  r   r   r    r  c                      r  r  r  r   r  r   r   r    r  c                      r  )NhostOnlyInterfacerZ  r  r   r  r   r   r    r  c                      r  r  )r   NetworkAttachmentType_HostOnlyr   r  r   r   r    r  c                      r  r  r  r   r  r   r   r    r  c                   S   r  r  r   r   r   r   r   r    r  c                      r  r  )r   NetworkAttachmentType_Genericr   r  r   r   r    r  )r  r  r  r  r  r  r  rg  r  r;  rh  rh  )r8   r   r  r  r  r  r  r  r  r  r  r   attachmentTyperu   r   rU   r  rn   rk  )	r   r  rl  r  rg  nicAttachmentTyper<  r:  r;  r   )r  rg  r   r   nicAttachmentSubCmd  s^   	












r  c                 C   s  t tttttd}t|dk s!|d dks!t|dkr?|d |vr?t|dkr8|d |v r8t||d  j dS tt	j dS | d |}|du rOtd	 dS t|dk sit
|d ttd| d
 j|jvr|td|d | d
 j|jf  dS t
|d }|dd }|d }d}| d j|dd}|j}||}|| | ||||\}	}
|	dkr|  |
durtd|j||d |
f  |  dS )z
    This command to manage network adapters
    usage: nic <vm> <nicnum> <cmd> <cmd-args>
    where cmd : attachment, trace, linespeed, cable, enable, type
    )
attachmenttrace	linespeedcableenabler   rZ  rj   r)   rY  r   r#  Nr  r   r  ri   Tr  z%s nic %d %s: %s)r  r  r  r  r  r  r8   rn   rk  nicCmdru   rU   r   r  r  r  r  r   r  r   r@   r   )r   rg  	niccomandr  rl  r  r  r   r  r  r  r   r   r   r    sL   
("
r  c                 C   s0   t |dk rtd| d   dS |d | d< dS )NrZ  zCurrent prompt: '%s'r  r   rj   )r8   rn   r  r   r   r   	promptCmd   s
   r  c                 C   sj   t |dk rtd dS |d }|d }t| |}z|D ]}|| qW dS    td t  Y dS )NrY  zZusage: foreach scope command, where scope is XPath-like expression //vms/vm[@CPUCount='2']r   rj   rZ  zError executing)r8   rn   r"  r  rE   rF   )r   rg  r  r  elemsrM   r   r   r   
foreachCmd(  s   

r  c                 C   sV   t |dk rtd dS |dd  }|dd t| D ]}|j|d< t| | qdS )NrZ  zforeachvm command <args>r   rj   rR   )r8   rn   r  r=   rA   runCommandArgs)r   rg  r  rL   r   r   r   foreachvmCmd8  s   
r  c                    p   t |dk rtd dS t| |}|d krdS |d d t |dkr)t|d  t| |d fddg dS )	NrY  z(usage: recordDemo vm filename (duration)r   rZ  r  r  c                       t | | S r   )r9  r  r$  r6  r   r   r  N  r  zrecordDemoCmd.<locals>.<lambda>r   r  r   r  r   recordDemoCmdC     
r  c                    r  )	NrY  z*usage: playbackDemo vm filename (duration)r   rZ  r  r  c                    r  r   )rV  r  r  r   r   r  \  r  z!playbackDemoCmd.<locals>.<lambda>r   r  r   r  r   playbackDemoCmdQ  r  r  c                 C   s(   d|d? |d@ d? |d@ f }t | |S )Nz%02x:%02x.%dr}     rY  r{  )r   )r   r  r   r   r   r   pciAddr`  s   
r  c                 C   s   | d  |jd}|D ]}|jr%tdt| |jt| |jt| |jf  q| d  |d}|D ]+}|jrKtdt| |jt| |jt| |jf  q0tdt| |jt| |jf  q0d S )Nri   PCIDeviceAssignmentsz$%s: assigned host device %s guest %sattachedPCIDevicesz%s: physical, guest %s, host %sz%s: virtual, guest %s)	r   r   isPhysicalDevicern   r   r@   r  hostAddressguestAddress)r   r   assignedr?  r  r   r   r   lspcid  s   *,"r  c                 C   sX   t d}|| }|d u rdS | }t|d dd> t|d dd> B t|d B S )	Nz2(?P<b>[0-9a-fA-F]+):(?P<d>[0-9a-fA-F]+)\.(?P<f>\d)r(   rA  rh  r}  r*  rY  rh  )r>   rB  rC  rD  ru   )r   pcirerO  pdictr   r   r   parsePcir  s   

0r  c                 C   sF   t |dk rtd dS t| |}|d krdS t| |ddd g dS )NrZ  zusage: lspci vmr   r  c                 S   s
   t | |S r   )r  r  r   r   r   r    r  zlspciCmd.<locals>.<lambda>r~  r  r   r   r   lspciCmdz  s   
r  c                    s   t |dk rtd dS t| |}|d krdS t|d dkr+td|d   dS t |dkrFt|d   dkrEtd|d   dS n t| | fdd	 dS )
NrY  z&usage: attachpci vm hostpci <guestpci>r   rZ  r(   Linvalid host PCI %s, accepted format 01:02.3 for bus 1, device 2, function 3zMinvalid guest PCI %s, accepted format 01:02.3 for bus 1, device 2, function 3c                    s   |  dS r  )attachHostPCIDevicer  	guestaddrhostaddrr   r   r    r  zattachpciCmd.<locals>.<lambda>r8   rn   r#  r  r   r  r   r  r   attachpciCmd  s&   
r  c                    sn   t |dk rtd dS t| |}|d krdS t|d   dkr+td|d   dS t| | fdd dS )	NrY  zusage: detachpci vm hostpcir   rZ  r(   r  c                    r9  r   )detachHostPCIDevicer  r
  r   r   r    r  zdetachpciCmd.<locals>.<lambda>r  r  r   r  r   detachpciCmd  s   
r  c                 C   s0   t |dk rtd dS t|d }|| d< dS )NrZ  zusage: goto liner   rj   r5  )r8   rn   ru   )r   rg  r.  r   r   r   gotoCmd  s   r  startinforU   r)   rn  quit	typeGuestr  )	re   r   r`  rp  r?  rg  exittgr  zPrints help informationz;Start virtual machine by name or uuid: start Linux headlessz,Create virtual machine: createVm macvm MacOSzRemove virtual machiner  zPause virtual machiner  zResume virtual machinerf  z'Save execution state of virtual machiner  zStats for virtual machiner  zPower down virtual machiner  zEffectively press power buttonzShows known virtual machineszShows info on machinezShows info on guestgexeczExecutes program in the guestgcopyzCopy file to the guestgpipezPipe between host and guestzControl aliaseszToggle verbosityz=Set VMs variable: setvar Fedora BIOSSettings.ACPIEnabled TrueevalzqEvaluate arbitrary Python construction: eval 'for m in getMachines(ctx): print(m.name, "has", m.memorySize, "M")'Exitsr}  zShow host informationr   zUExecute command for guest: guest Win32 'console.mouse.putMouseEvent(20, 20, 0, 0, 0)'monitorGuestzHMonitor what happens with the guest for some time: monitorGuest Win32 10monitorGuestKbdz>Monitor guest keyboard for some time: monitorGuestKbd Win32 10monitorGuestMousez=Monitor guest mouse for some time: monitorGuestMouse Win32 10monitorGuestMultiTouchzIMonitor guest touch screen for some time: monitorGuestMultiTouch Win32 10monitorVBoxzBMonitor what happens with VirtualBox for some time: monitorVBox 10portForwardztSetup permanent port forwarding for a VM, takes adapter number host port and guest port: portForward Win32 0 8080 80showLogz(Show log file of the VM, : showLog Win32findLogzMShow entries matching pattern in log file of the VM, : findLog Win32 PDM|CPUM
findAssertz5Find assert in log file of the VM, : findAssert Win32	reloadExtz#Reload custom extensions: reloadExt	runScriptz&Run VBox script: runScript script.vboxrE  z4Sleep for specified number of seconds: sleep 3.14159shellz3Execute external shell command: shell "ls /etc/rc*"exportVmz2Export VM in OVF format: exportVm Win /tmp/win.ovfr  zDTake VM screenshot to a file: screenshot Win /tmp/win.png 1024 768 0zaTeleport VM to another box (see openportal): teleport Win anotherhost:8000 <passwd> <maxDowntime>zWType arbitrary text in guest: typeGuest Linux "^lls\n&UP;&BKSP;ess /etc/hosts\nq^c" 0.7
openportalzaOpen portal for teleportation of VM from another box (see teleport): openportal Win 8000 <passwd>closeportalzFClose teleportation portal (see openportal, teleport): closeportal Wingetextraz?Get extra data, empty key lists all: getextra <vm|global> <key>setextrazKSet extra data, empty value removes key: setextra <vm|global> <key> <value>r  zYPrint available guest stats (only Windows guests with additions so far): gueststats Win32z(Add a CPU to a running VM: plugcpu Win 1r  z]Remove a CPU from a running VM (additions required, Windows cannot unplug): unplugcpu Linux 1	createHddz.Create virtual HDD:  createHdd 1000 /disk.vdi 	removeHddz3Permanently remove virtual HDD: removeHdd /disk.vdiregisterHddzBRegister HDD image with VirtualBox instance: registerHdd /disk.vdiunregisterHddzFUnregister HDD image with VirtualBox instance: unregisterHdd /disk.vdi	attachHddzBAttach HDD to the VM: attachHdd win /disk.vdi "IDE Controller" 0:1	detachHddz/Detach HDD from the VM: detachHdd win /disk.vdiregisterIsozCRegister CD/DVD image with VirtualBox instance: registerIso /os.isounregisterIsozGUnregister CD/DVD image with VirtualBox instance: unregisterIso /os.iso	removeIsoz2Permanently remove CD/DVD image: removeIso /os.iso	attachIsozCAttach CD/DVD to the VM: attachIso win /os.iso "IDE Controller" 0:1	detachIsoz0Detach CD/DVD from the VM: detachIso win /os.isozIMount CD/DVD to the running VM: mountIso win /os.iso "IDE Controller" 0:1
unmountIsozCUnmount CD/DVD from running VM: unmountIso win "IDE Controller" 0:1z@Attach storage controller to the VM: attachCtr win Ctr0 IDE ICH6	detachCtrz*Detach HDD from the VM: detachCtr win Ctr0	attachUsbzWAttach USB device to the VM (use listUsb to show available devices): attachUsb win uuid	detachUsbz1Detach USB device from the VM: detachUsb win uuid	listMediaz&List media known to this VBox instancelistUsbzList known USB devicesshareFolderzJMake host's folder visible to guest: shareFolder win /share share writableunshareFolderzRemove folder sharingzStart GUI frontendzToggle colorsz5VM snapshot manipulation, snapshot help for more infozMNAT (network address translation engine) manipulation, nat help for more infozNetwork adapter managementzControl shell promptzPerform command for each VMzqGeneric "for each" construction, using XPath-like notation: foreach //vms/vm[@OSTypeId='MacOS'] "print(obj.name)"z)Record demo: recordDemo Win32 file.dmo 10z-Playback demo: playbackDemo Win32 file.dmo 10z0List PCI devices attached to the VM: lspci Win32z9Attach host PCI device to the VM: attachpci Win32 01:00.0z;Detach host PCI device from the VM: detachpci Win32 01:00.0z"Go to line in script (script-only))rz  colorssnapshotrm  r  r  	foreachvmforeachr9  rV  r  	attachpci	detachpcigotoc                 C   s   |d }t |d d krt | }t|d }|d kr"td|  dS | d r;| d d u r;|dvr;tdtdd  dS |d	 | |S )
Nr   z=Unknown command: '%s', type 'help' for list of known commandsr  r   )rA  	reconnectr)   r  z/First connect to remote server with %s command.rA  r   rj   )r  r   r(  rn   r   )r   rg  rJ   cir   r   r   r    s   r  c                 C   s*   |sdS t |}t|dkrdS t| |S r  )rf   r8   r  r   r  rg  r   r   r   r8     s   
r8  c                 C   s   t j|sd S i }z5ttt| |d|| t|d  D ]\}}t	r1t
d||d f  |d |d |g||< q!W d S    t
d|  t  Y d S )Nr   r(  zcustomize: adding "%s" - %sr   rj   z%Error loading user extensions from %s)r5   r6   isfiler   rB  r1  readrU   rV   rD   rn   rE   rF   )r   r]   r6  r*  r=  r  r   r   r   addExtsFromFile7  s   rL  c                 C   sx   t |}tj|d}t| || tj|d}tj|s d S t|}|D ]}|dr9t| |tj|| q'd S )Nzshellext.pyshextsz.py)r   r5   r6   r;   rL  isdirr9   endswith)r   r]   folderr@   shextdirextsrM   r   r   r   r2  F  s   

r2  c                 C   sP   | d s
| d d u r#dt jv rt jt jd S t jt jddS | d jS )Nr  r   VBOX_USER_HOME~z.VirtualBox)r5   environr6   r;   
expanduserr  r  r   r   r   r3  T  s
   

r3  c           	   
   C   s  | d rdt dgtd< dtdgtd< dtdgtd< g d	| d
< | d }|d urSz	td|j  W n tyM } zt| | trCt	
  W Y d }~nd }~ww d | d< nd | d< t| }t| t| t dv ridatj|d}tt|  trtj|rt| | d rz| d dg|jgdd W n   Y g }td urtd}| }	 z5trdt }ntd urt|}nt j!d dkrt"| d }nt#| d }t$| |}|dkrW nItrW nEW n; t%y   td Y n/ t&y   Y n/ t'y   Y n' ty } zt| | trt	
  W Y d }~nd }~ww | d (d qzt)d r4| d *dg|jg W n   Y trDt+| d S d S )Nr  zJConnect to remote VBox instance: connect http://server:18083 user passwordr   rA  z$Disconnect from remote VBox instancerF  z!Reconnect to remote VBox instancerG  )zhttp://localhost:18083rR   rR   r?  r   r@  r   )Windows	MicrosoftFz.vboxshellhistoryr   r   r   r  TzrunScript %srZ  r  z&====== You can type quit or q to leaveri   ),rE  r(  rG  rH  rn   r  rB   rC   rD   rE   rF   r3  r2  r[   r\   r   r5   r6   r;   rc   rT   existsr+   read_history_filer   r}  g_sCmdr7   __iter__g_fBatchModeg_sScriptFilenextrp   version_info	raw_inputinputr8  rx   StopIterationr  rt   ctdisablewrite_history_file)	r   r   rM   home	hist_filer]   itr  r;  r   r   r   	interpret\  s   









rj  c                 C   s   | d| t| |S r  )r  r  rI  r   r   r   runCommandCb  s   
rk  c                 C   s4   t | |}|d krdS |d| t| |d| dS )Nr   r  )r  r  r  )r   r   guestLambdarg  rL   r   r   r   runGuestCommandCb  s   
rm  c                    s6  t  }|jddddddd |jdd	d
dddd |jddddddd |jddddd |jdddd |jdddd | \}}|ja|j}|jd urWdadada	|ja
|jd urcdada	|jad }|jd uri }|j}|d}|D ]}|d \}	}
|
||	< qv|jrGt g}ztjtjt}W n   Y nt d!v r|tj|d" || tjd#}|d u r|D ]&}tjtj|d$stjtj|d%rtd&| |tjd#< |} nq|rtjtj|d'd( tjd)}|d u r)|D ]&}tjtj|d'd*d+r'tj|d'}td,| |tjd)< |} nq|rE|}tj|d*d-d.}tj|rDtj| ~~~d/d0l m!} |||}||" |j#|j$|j% fd1d2 fd3d2 fd4d2 fd5d2 fd6d2t&d t'd/dd7 t(  t) * D ]} |= qd  t+,  |-  ~d S )8Nz-vz	--verboser  
store_trueFzswitch on verbose)destactionrf  r)   z-az
--autopathautopathzswitch on autopathz-wz--webservicestylestore_const
WEBSERVICEzconnect to webservice)ro  rp  r\  r)   z-bz--batch
batch_filezscript file to execute)ro  r)   z-ccommand_linezcommand sequence to executez-oopt_linezoption lineTr  r  )SunOSamd64VBOX_PROGRAM_PATHrG  zVirtualBox.exez!Autodetected VBOX_PROGRAM_PATH assdk	installerVBOX_SDK_PATHbindingszVirtualBox.xidlzAutodetected VBOX_SDK_PATH asxpcompythonr   )VirtualBoxManagerc                    s   t  | |S r   )rk  )r  rg  r  r   r   r    r  zmain.<locals>.<lambda>c                    s   t  | ||S r   )rm  )r   rl  rg  r  r   r   r    r  c                    
   t  | S r   )r  )r   r  r   r   r    r  c                    r  r   )r#  r  r  r   r   r    r  c                    r  r   )r}   )r;  r  r   r   r    r  )ri   r   r\  r  r   runr  r  r#  r}   r  r   r  r5  rl   ).r   
add_option
parse_argsr  rD   rr  ru  r]  r   rT   r^  rv  r[  rw  r7   rq  r5   getcwdr6   dirnameabspath__file__r[   r\   r:   r;   rU  r   rJ  rn   rp   rN  vboxapir  getVirtualBoxr   r  r   r  	g_sPromptrj  rU   r  gccollectdeinit)argvparseoptionsrg  rr  rQ  	strparamsstrparamliststrparamr_   r  asLocations
sScriptDirsPathsCurLocsTmpr  r   sKeyr   r  r   main  s   



















r  __main__)rg   )FF)NN)rR   )rk  
__future__r   __copyright____version__r  r5   rp   rE   rd   r  r>   r[   optparser   r   r]  r^  r[  rT   r+   r   ImportErrorr  r   r   r   r   r   rc   rD   rf   r}   rC   rw   r   r   r   r   r   r   r   r   r   r   r   r   r=   r   r   r   r   r   r   r   r   r'  r)  r9  rV  rt  rx  r{  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r  r  r"  r#  r'  r+  r   r-  r3  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r"  r&  r,  r0  r1  r4  r<  r=  r>  rE  rG  rH  rR  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r!  r&  r(  r+  r.  r/  r1  r2  r3  r4  r7  r8  r<  r@  rE  rF  rJ  rO  rT  rb  rj  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r  r8  rL  r2  r3  rj  rk  rm  r  rO   r  r   r   r   r   <module>   sJ  K	
N991%		
y
<


	


	4'
#	
 !"#
4







	













 
!"
#


(	=4%").=:2
		
 !"#$%&'()*+,-./0123456789:;<=>?@ABC
D













TNn