
    i-                       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	 ddlZddlZd
Zd	adddddddZd Zt&        r G d dej6                        Zd Zdad ZddZ d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d  Z)d! Z*d" Z+d# Z, G d$ d%      Z-d& Z.dd'Z/d( Z0d) Z1d* Z2d+ Z3d, Z4d- Z5d. Z6d/ Z7d0 Z8da9d1 Z:d2 Z;d3 Z<d4 Z=d5 Z>d6 Z?d7 Z@d8 ZAd9 ZBd: ZCd; ZDd< ZEd= ZFd> ZGd? ZHg d	fd@ZIg dfdAZJdB ZK G dC dD      ZL G dE dFeL      ZM G dG dHeL      ZN G dI dJeM      ZO G dK dLeL      ZP G dM dNeM      ZQ G dO dPeL      ZR G dQ dReL      ZSdS ZTdT ZUdU ZVdV ZWdW ZXdX ZYdY ZZdZ Z[d[ Z\d\ Z]d] Z^dd^Z_d_ Z`dd`Zada Zbdb Zcdc Zddd Zede Zfdf Zgdg Zhdh Zidi Zjdj Zkdk Zldl Zmdm Zndn Zodo Zpdp Zqdq Zrdr Zsds Ztdt Zudu Zvdv Zwdw Zxdx Zydy Zzdz Z{d{ Z|d| Z}d} Z~d~ Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zi ddddddddddddddddddddddddddddddddddi ddddddddddddddēddƓddȓddʓdd̓ddΓddГddғddԓdd֓ddؓddddddddddddddddZi ddgddgddgddgddgddgddgddgdddgdddgdddgdddgddd gdddgdddgdddgddgi d	ddgd
dgdddgdddgddgddgddgddgddgddgddgddgdd gd!d"gd#d$gd%d&gd'dd(gdd)gdd*gdd+gd,Zd- Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zd8 Zd9 Zd: Zd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdB ZdC ZdD ZdE ZdF ZdG ZdH ZdI ZdJ ZdK ZdL ZdM ZdN ZdO Zg fdPZdQ ZdR ZdS ZdT ZdU ZdV ZdW ZdX ZÐdY ZĐdZ ZŐd[ ZƐd\ Zǐd] ZȐd^ Zɐd_ Zʐd` Zːda Z̐db Z͐dc Zΐdd Zϐde ZАdf Zѐdg ZҐdh ZӐdi ZԐdj ZՐdkdldmdndodpdpdqdrds	Zi dndteWdgdkdue\dgdvdwe]dgdxdyegdgdzd{ehdgd|d}ekdgd~deldgddemdgddeidgddejdgdmdeZdgdlde[dgdde^dgddecdgddeddgddefdgdodedgi drdedgddeydgddedgdpde~dgddedgddend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i ddedgddedgddedgddeodgddepdgdqdedgdderdgddesdgdde}dgdde{dgdĐdetdgdƐdevdgdȐdewdgdʐdedgd̐dedgdΐdedgdАdedgi 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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d edgdedgdZאd Zؐd Zِd Zڐd Zېd Zܐd Zݐd	 Zސd
 Zߐd Zedk(  r eej                         yy# e$ r daY w xY w(  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-2023 Oracle and/or its affiliates.

This file is part of VirtualBox base platform packages, as
available from https://www.virtualbox.org.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, in version 3 of the
License.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, see <https://www.gnu.org/licenses>.

SPDX-License-Identifier: GPL-3.0-only
z$Revision: 155244 $N)OptionParser)pprintFTzvbox> z[31mz[94mz[92mz[93mz[35mz[36m)redbluegreenyellowmagentacyanc                 h    t         s| S t        j                  |d      }|r|t        |       z   dz   S | S )zM
    Translates a string to one including coloring settings, if enabled.
    Nz[0m)g_fHasColorsg_dTermColorsgetstr)strgcolorcols       /usr/lib/virtualbox/vboxshell.pycoloredr   X   s9     


E4
(C
3t9}Y&&K    c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)CompleterNGc                 R    || _         t        j                  j                  | |       y N)ctxrlcompleter	Completer__init__)selfdicr   s      r   r   zCompleterNG.__init__e   s    DH!!**45r   c                 F    	 t         j                  j                  | ||      S )zp
            taken from:
            http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496812
            )r   r   complete)r   textstates      r   r"   zCompleterNG.completei   s$    
  #,,55dD%HHr   c                 $    |j                  d      S )N/)
startswith)r   _phrasewords      r   	canBePathzCompleterNG.canBePaths   s    ??3''r   c                     |j                  d      }t        j                         }|dk(  xs ||k  }|ry|j                  d      ryy)N ThelpF)findreadline
get_begidxr'   )r   phrase_wordspaceIdxbegIdx	firstWords         r   canBeCommandzCompleterNG.canBeCommandv   sK    {{3'H((*F!R<6H+<I  (r   c                 R    | j                  ||       xr | j                  ||       S r   )r*   r7   )r   r2   r)   s      r   canBeMachinezCompleterNG.canBeMachine   s,    ~~fd33[D<M<MfVZ<[8[[r   c                    g }t        j                         }	 | j                  ||      rt        j                  j                  |      \  }}t        |      }t        j                  |      D ]?  }|dk(  s	|d| |k(  s|j                  t        j                  j                  ||             A | j                  ||      r>t        |      }| j                  fD ]#  }|D ]  }|d| |k(  s|j                  |        % | j                  ||      rt        |      }t        | j                  dd      D ]t  }	t        j                   ddt#        |	j$                              }|d| |k(  r|j                  |       t#        |	j&                        }|d| |k(  sd|j                  |       v |S # t(        $ r;}
t+        | j                  |
       t,        rt/        j0                          Y d}
~
|S d}
~
ww xY 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\ )r0   get_line_bufferr*   ospathsplitlenlistdirappendjoinr7   	namespacer9   getMachinesr   resubr   nameid	ExceptionprintErr
g_fVerbose	traceback	print_exc)r   r#   matchesr2   	directoryrestcr)   lstmaches              r   global_matcheszCompleterNG.global_matches   s    G--/F*>>&$/(*d(;%YD	A "

9 5 J6T"1X%5#NN277<<	4+HIJ $$VT2D	A!%1 5$' 5D#BQx4/ 't 455
 $$VT2D	A +DHHeT B 1  "vvlE3tyy>J8t+#NN40"477|8t+#NN401 N  *1%'')N*s,   A$F+ =A+F+ )B,F+ F+ +	G/40G**G/N)	__name__
__module____qualname__r   r"   r*   r7   r9   rU    r   r   r   r   d   s"    	6	I	(		\*	r   r   c                 
   t         sy i }t        | j                               D ]
  \  }}d ||<    t        ||      }t	        j
                  |j                         t	        j                         }t	        j                  t        j                  dd|             t	        j                  d       t        j                         dk(  r*t	        j                  d       t	        j                  d       t	        j                  d       y )Nz[\./-] zset editing-mode emacsDarwinzbind ^I rl_completezbind ^W ed-delete-prev-wordztab: complete)g_fHasReadlinelistitemsr   r0   set_completerr"   get_completer_delimsset_completer_delimsrE   rF   parse_and_bindplatformsystem)cmdsr   compskey_value	completerdelimss          r   autoCompletionrl      s    Edjjl+ fc
E3'I9--.**,F!!"&&B"?@45H$!67!>? O,r   c                 ,    t        j                  |       S r   )shlexr>   )ss    r   split_no_quotesrp      s    ;;q>r   c                    	 |j                   s}t        dt        t        |j                        d      z  d       t
        j                  j                          |j                  |       | d   j                  d       |j                   s}t        |j                        dk7  rt        | |       y# t        $ r: t        d       d	| d
<   |j                  rt        d       |j                          Y yw xY w)Nz%s %%r   r[   )endglobalr      Interrupted.T	interruptzCanceling task...)	completedprintr   r   percentsysstdoutflushwaitForCompletionwaitForEventsint
resultCodereportErrorKeyboardInterrupt
cancelablecancel)r   progresswaits      r   progressBarr      s    $$)ws8+;+;'<eDE2NJJ&&t,M''*	 $$
 x""#q(X& nK%&OOs   BB0 $B0 0A C32C3c           	          | d   }|j                  |      r9t        t        |j                  |      d|j	                  |      d             y t        t        t        |      d             y )Nrs   : r   )xcptIsOurXcptKindrx   r   xcptToStringxcptGetMessager   )_ctxrT   oVBoxMgrs      r   rJ   rJ      sX    H~H!!!$g("7"7":H<S<STU<VWY^_`gc!fe$%r   c                     |j                   }|r0t        t        d|j                  d|j                  d             y y )NzError in module 'z': r   )	errorInforx   r   	componentr#   )r   r   	errorinfos      r   r   r      s4    ""IgI4G4GXZ_`a r   c                     t        |d      S )Nr
   r   )r   r   s     r   colCatr      s    4##r   c                     t        |d      S )Nr   r   )r   vmnames     r   colVmr          66""r   c                     t        |d      S Nr   r   )r   r=   s     r   colPathr      s    4!!r   c                     t        |d      S )Nr   r   )r   bytes     r   colSizer      s    4r   c                     t        |d      S r   r   r   pcidevs     r   colPcir      s    67##r   c                     t        |d      S )Nr   r   r   s     r   colDevr      r   r   c                 2    t        t        |      dz   d      S )NMr   )r   r   )r   mbytes     r   colSizeMr      s    3u:c>5))r   c                     | d   }|j                  d|g |d      }|j                          t        d|j                         |j	                  |       t        | d       y )Nvbr[   zcreated machine with UUIDT)createMachinesaveSettingsrx   rH   registerMachinerD   )r   rG   kindvboxrS   s        r   createVmr      sV    t9Db$D"5D	
%tww/Tr   c                 z   |j                   }t        d|j                  d|       t        | |t        dg       |j                  | d   j                  j                        }|rN|j                  |      }t        | |d      r$t        |j                        dk(  rt        d       nt        | |       t        | d       y )	Nzremoving machine z	with UUIDALLrs   d   r   Success!T)rH   rx   rG   cmdClosedVmdetachVmDevice
unregister	constantsCleanupMode_FulldeleteConfigr   r   r   r   rD   )r   rS   uuiddisksr   s        r   removeVmr     s    77D	
tyy+t<T>E73OOCM33DDEE$$U+sHc*s83F3F/G1/L*X&Tr   c                    | d   }| d   }| d   j                         }g }|j                  |||      }t        | |d      rCt        |j                        dk(  r*|r	 |j                  dg|gdd       |j                          y y y # t        $ r0}t        | |       t        rt        j                          Y d }~Gd }~ww xY w)	Nr   perfrs   r   r   *
      )getSessionObjectlaunchVMProcessr   r   r   setuprI   rJ   rK   rL   rM   unlockMachine)	r   rS   vmtyper   r   sessionasEnvr   rT   s	            r   startVmr     s    t9Dv;D(m,,.GE##GVU;H3#&3x/B/B+Cq+H *

C54&"b1
 	 ,I&  *a '')*s   B 	B=&B88B=c                       e Zd Zd Zy)
CachedMachc                 p    |j                   r|j                  | _        nd| _        |j                  | _        y )Nz<inaccessible>)
accessiblerG   rH   )r   rS   s     r   r   zCachedMach.__init__'  s&    ??		DI(DI''r   NrV   rW   rX   r   rY   r   r   r   r   &  s    r   r   c                 P    g }|D ]  }t        |      }|j                  |         |S r   )r   rA   )r   rR   resultrS   elems        r   cacheMachinesr   .  s3    F $d Mr   c                     | d   @| d   |r-| d   j                  | d   d      | d<   t        | | d         | d<   |r| d   S | d   S g S )Nr   	_machlistrs   machines_machlistsimple)getArrayr   )r   
invalidatesimples      r   rD   rD   5  sn    
4y{#z"8}55c$iLC%23K8H%IC!"()){##	r   c                 6    | rt        dd      S t        dd      S )Nonr   offr   vars    r   asStater   A  s    
tW%%ug&&r   c                 
    | ryy)NyesnorY   r   s    r   asFlagr   G  s    
r   c                 D    |j                  |      \  }}t        | d|      S )NAdditionsFacilityStatus)getFacilityStatus
asEnumElem)r   guestfacilityTypestatus
_timestamps        r   r   r   M  s'     22<@VZc4f==r   c                 l    | d   sy | d   j                  dg|g      D ]  }t        |d   |d           y )Nr   r   rG   values_as_string)queryrx   )r   rS   metrics      r   	perfStatsr   Q  sD    v;f+##SED62 :fVnf%789:r   c                     t        |       y r   )exec)r   machineconsolerf   s       r   	guestExecr   W  s	    Jr   c           	          t        d|j                  |j                  |j                  |j                  |j
                  |j                  fz         y )Nz-Mouse: mode=%d x=%d y=%d z=%d w=%d buttons=%x)rx   modexyzwbuttons)r   mevs     r   printMouseEventr   Z  s>    	
9SXXsuuceeUXUZUZ\_\a\acfcncn<o
opr   c                 B    t        d| d   j                  |d             y )NzKbd: rs   	scancodes)rx   r   )r   kevs     r   printKbdEventr  ]  s    	'3x=))#{;<r   c           
         t        d|j                  rdnd|j                  |j                  fz         | d   j	                  |d      }| d   j	                  |d      }| d   j	                  |d      }| d   j	                  |d      }t        d	|j                        D ]!  }t        d
|||   ||   ||   ||   fz         # y )Nz"MultiTouch: %s contacts=%d time=%dtouchscreentouchpadrs   
xPositions
yPositions
contactIdscontactFlagsr   z  [%d] %d,%d %d %d)rx   isTouchScreencontactCountscanTimer   range)r   mtevr  r	  r
  r  is          r   printMultiTouchEventr  `  s    	
. ..=J@Q@QSWS`S`
ab cX''l;JX''l;JX''l;Jx=))$?L1d''( h"aA
1zRS}VbcdVe%ffghr   c                 l   	  fd	 G  	fddt               }|r d   j                  |      }n|j                         }d}|dk(  rd}	 |j                  | d   j                  j                  g|       d}t        j
                         |z   }t        j
                         |k  r]|r d   j                  d	       n.|j                  |d	      }|r 	|       |j                  ||       t        j
                         |k  r]|r|r|j                  |       y y y #  t        j                          Y 0xY w)
Nc           
         | j                   }t        dt        |      dt        
d|             |
d   j                  j
                  k(  r>
d   j                  | d      }|r&t        d|j                  d|j                         y y |
d   j                  j                  k(  r>
d   j                  | d      }|r&t        d	|j                  d
|j                         y y |
d   j                  j                  k(  rs
d   j                  | d      }|r[|j                  du rt        d|j                  z         y t        d|j                  d|j                  d|j                  d       y y |
d   j                  j                   k(  rj
d   j                  | d      }|rR
d   j#                  |d      }|t        d       y t        d|j$                  |j&                  t)        |      fz         y y |
d   j                  j*                  k(  r%
d   j                  | d      }|rt-        
|       y y |
d   j                  j.                  k(  r%
d   j                  | d      }|rt1        
|       y y |
d   j                  j2                  k(  r%
d   j                  | d      }	|	rt5        
|	       y y y )Nzgot event: r,   VBoxEventTypers   IMachineStateChangedEventzmachine state event: mach=z state=ISnapshotTakenEventzsnapshot taken event: mach=z snap=IGuestPropertyChangedEventTzproperty %s was deletedzguest property change: name=z value=z flags=''IMousePointerShapeChangedEventshapez!pointer shape event - empty shapez+pointer shape event: w=%d h=%d shape len=%dIGuestMouseEventIGuestKeyboardEventIGuestMultiTouchEvent)typerx   r   r   r   #VBoxEventType_OnMachineStateChangedqueryInterface	machineIdr$   VBoxEventType_OnSnapshotTaken
snapshotId$VBoxEventType_OnGuestPropertyChangedfWasDeletedrG   valueflags(VBoxEventType_OnMousePointerShapeChangedr   widthheightr?   VBoxEventType_OnGuestMouser   VBoxEventType_OnGuestKeyboardr  VBoxEventType_OnGuestMultiTouchr  )eventevtypescevstevgpcevpsevr  r   r  r  r   s             r   handleEventImplz&monitorSource.<locals>.handleEventImpll  s   CKCRX1YZ[S],,PPPx=//7RSDQUQ[Q[\] H//MMMx=//7LMDQUQ`Q`ab H//TTTM008TUE$$,3uzzBC ::u{{EKKA B	  H//XXXx=//7WXDH..tW===>G4::W[WbWbdghmdnJoop  s8}..IIIh-..u6HICS) s8}..LLLh-..u6KLCc3' s8}..NNNx=//7NOD$S$/  Or   c                        e Zd Zd Z fdZy)$monitorSource.<locals>.EventListenerc                      y r   rY   )r   args     r   r   z-monitorSource.<locals>.EventListener.__init__  s    r   c                 t    	  d   j                  |d             y #  t        j                          Y y xY w)Nrs   IEvent)r!  rL   rM   )r   r/  r   r5  s     r   handleEventz0monitorSource.<locals>.EventListener.handleEvent  s<    &H < <UH MN &##%s    7N)rV   rW   rX   r   r<  )r   r5  s   r   EventListenerr7    s    		r   r=  rs   Fr-   順 Ti  )objectcreateListenerregisterListenerr   VBoxEventType_Anytimer~   getEventeventProcessedrL   rM   unregisterListener)
r   eventSourceactivedurr=  listener
registeredrr   r/  r5  s
   `        @r   monitorSourcerL  k  s   &0P
 
 x=//>--/J
by$$XH0G0G0Y0Y/Z\bc
iikCyy{S H++C0#,,Xs;#E*..x? yy{S  J&&x0 xs   B7D D3c                     t        |d      d|j                  j                  z   dz   }j                  |       t	        j                         ad  fd}|j                  j                         }d}|j                  j                  |j                  j                  |j                  j                  g      }t        |d      d|j                  j                  z   dz   }j                  |       |dk(  rd}	 |j                  | d	   j                  j                  gd       d
}t	        j                         |z   }	t	        j                         |	k  r4|j                  |d      }
|
r ||
       t	        j                         |	k  r4j#                          |r|r|j%                  |       y y y #  t        j                           Y @xY w)Nr   zVM=
c                  \    t        j                          } t        | t        z
  dz        }| a|S )N  )rC  r   g_tsLast)tsCur
timePasseds     r   stampzrecordDemo.<locals>.stamp  s+    		%.$./
r   c                     | j                   }|d   j                  j                  k(  rwd   j                  | d      }|r_d        |j                  |j
                  |j                  |j                  |j                  |j                  fz  }j                  |       y y |d   j                  j                  k(  rRd   j                  | d      }|r:d        t        d   j                  |d            fz  }j                  |       y y y )Nrs   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/  r0  r   liner  r   demorT  s        r   r5  z#recordDemo.<locals>.handleEventImpl  s   S],,GGGh-..u6HIC2egsxxPSPUPUWZW\W\^a^c^cehepep5qq

4   s8}..LLLh-..u6KLC#uwCM4J4J3P[4\0]&^^

4   Mr   Fr-   r>  rs   TrP  )openr   rG   rV  rC  rQ  rG  r@  createAggregatorkeyboardmouserA  r   rB  rD  rL   rM   closerF  )r   r   filenamerI  headerr5  rJ  rK  aggrr   r/  rX  rT  s   `          @@r   
recordDemora    s   #DW__)))D0FJJv yy{H! ""113HJ



.
.0@0@0L0LgmmNgNg/h
iC#DW__)))D0FJJv
byXH(?(?(Q(Q'RTYZ
iikCyy{S LL40E& yy{S  	JJLJx( x	s   =BF4 4Gc                    t        |d      }|dk(  rd}|j                         }t        d|       t        j                  d      }t        j                  d      }t        j                  d      }|j
                  }	|j                  }
	 t        j                         |z   }|D ]o  }t        j                         |kD  r nU|j                  |      }|2|j                         }|d   }|d	   }|d
   }t        j                  t        |      dz         |dk(  r#|j                  |      }|	j                  |       |dk(  s|j                  |      }||j                         }|d   dk(  rS|
j                  t        |d         t        |d         t        |d         t        |d         t        |d                |
j!                  t        |d         t        |d         t        |d         t        |d         t        |d                r |j)                          y # t"        $ r d| d<   Y ! t%        j&                          Y 8xY w)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+ro   ptrP  kma1r   r   r   r   bTrv   )rY  r0   rx   rE   compiler[  r\  rC  search	groupdictsleepfloatfindallputScancodesputMouseEventAbsoluter   putMouseEventr   rL   rM   r]  )r   r   r^  rI  rX  r_  baseremrekrekbdr\  rr   rW  matchrdictrT  paramsrtypecodesmmmdicts                        r   playbackDemor    s4   #D
by]]_F	+vZZ<=F
**c
dC
**V
C


CMME%iikC 	ADyy{S MM$'E}OO%E#JE3ZF#JEJJuU|D()|F+  '#ZZ'>LLNESzS( 33Cc
OSs_VYZ_`cZdVegjkpqtkugvx{  }B  CF  }G  yH  I ++Cc
OSs_cRWX[R\o_bchilcm_npstyz}t~p  A9	AH 	JJL   Ks    B8H% H% B?H% %I5Ic           	         ddl m} |j                  }t        |      dkD  r|d   }nd}t        |      dkD  rt	        |d         }nd}|j                  |      \  }}}	}
}}t        |      dkD  rt	        |d         }n|}t        |      dkD  rt	        |d         }n|}t        d||||fz         |j                  |||t        d   j                        }||f}d	}|j                  ||t        |      d
|dd      }|j                  |d       y )Nr   )Image/tmp/screenshot.png   rt      .Saving screenshot (%d x %d) screen %d in %s...constRGBArawPNG)PILr  displayr?   r   getScreenResolutionrx   takeScreenShotToArrayr   BitmapFormat_RGBA
frombufferr   save)r   r   argsr  r  fscreenfbwfbh_fbbppfbxfby_r   hdatasizer   ims                      r   takeScreenshotOldr  0  s   ooG
4y1}G!
4y1}T!W&-&A&A&&I#S#vsC
4y1}QL
4y1}QL	
:aFA=N
NO((As7|7U7UVDq6DD			$c$ia	CBGGAur   c                    |j                   }t        |      dkD  r|d   }nd}t        |      dkD  rt        |d         }nd}|j                  |      \  }}}}	}
}t        |      dkD  rt        |d         }n|}t        |      dkD  rt        |d         }n|}t	        d||||fz         |j                  |||t        d   j                        }t        |d      }|j                  |       |j                          y )	Nr   r  r  rt   r  r  r  wb)r  r?   r   r  rx   r  r   BitmapFormat_PNGrY  rV  r]  )r   r   r  r  r  r  r  r  r  r  r  r  r   r  r  pngfiles                   r   takeScreenshotr  L  s    ooG
4y1}G!
4y1}T!W&-&A&A&&I#S#vsC
4y1}QL
4y1}QL	
:aFA=N
NO((As7|7T7TUD1dmGMM$MMOr   c                    |d   j                  d      dk(  rt        d       y |d   j                  d      \  }}t        |      dkD  r|d   }nd}t        |      dkD  rt	        |d         }nd}t	        |      }t        d	||fz         |j                  ||||      }t        | |d
      r$t	        |j                        dk(  rt        d       y t        | |       y )Nr   :r-   z(Use host:port format for teleport targetrt   r[   r     zTeleporting to %s:%d...r   r   )	r/   rx   r>   r?   r   teleportr   r   r   )	r   _sessionr   r  hostportpasswdmaxDowntimer   s	            r   r  r  f  s    Aw||CB897==%LT4
4y1}a
4y1}$q'lt9D	
#tTl
23dFK@H3#&3x/B/B+Cq+HjC"r   c                    |j                   }t        |      dkD  r|d   }nd}|j                  |k7  r)||_        	 t        j                  t        |      dz          | d   j                  d      }d}t        |j                               D ](  }	 |j                  |||         }t        d||fz         * y #  Y _xY w#  Y 7xY w)Nr   rt   皙?r  GuestStatisticTypez%s: %d)r   r?   statisticsUpdateIntervalrC  rn  ro  
all_valuesr^   keysgetStatisticrx   )	r   r   r  r   update	all_statscpuro   vals	            r   
guestStatsr  ~  s    MME
4y1}a%%/)/&	JJuV}S() G''(<=I
C).."# 	$$c9Q<8C(aX%&		s   !B6 %B=6B:=Cc                 ^    t        |d         }t        d|z         |j                  |       y )Nr   Adding CPU %d...)r   rx   
hotPlugCPUr   r   r  r  r  s        r   plugCpur    s+    
d1g,C	

$%sr   c                 ^    t        |d         }t        d|z         |j                  |       y )Nr   Removing CPU %d...)r   rx   hotUnplugCPUr  s        r   	unplugCpur    s+    
d1g,C	
#
&'r   c                 l    |j                  |d   |d   |d   |d   |d          |j                          y )Nr   rt   r  r     )mountMediumr   )r   r   r  r  s       r   mountIsor    s8    Qa$q'47DGDr   c                     | r|S |S r   rY   )rQ   v1v2s      r   condr    s    		r   c                     t        d|j                  t        |j                  d      |j                  |j
                  |j                  t        | d|j                        fz         y )Nz0  %s: %s (vendorId=%d productId=%d serial=%s) %sr   USBDeviceState)	rx   rH   r   productvendorId	productIdserialNumberr   r$   )r   uds     r   printHostUsbDevr    s    	
<wrzz[aGbdfdodoqsq}q}  @B  @O  @O  Q[  \_  aq  su  s{  s{  Q|  @}  }  ~r   c                     t        d|j                  t        |j                  d      |j                  |j
                  |j                  fz         y )Nz-  %s: %s (vendorId=%d productId=%d serial=%s)r   )rx   rH   r   r  r  r  r  )r   r  s     r   printUsbDevr    sQ    	
9RUUWRZZY_E`bdbmbmoqo{o{}  ~M  ~M  =N  N  Or   c                     t        d|j                  dt        | |j                        dt	        |j
                  dd      dt	        |j                  dd             y )Nz	    name=z host=r,   r   znot accessiblewritablez	read-only)rx   rG   r   hostPathr  r   r  )r   sfs     r   printSfr    sm    	'#r{{2KTRTR_R_amo  NA  CG  HJ  HS  HS  U_  al  Cm  n  or   c           	         |j                   }|j                  | d   j                  k7  rt        d|j                  z         t        dt        | || d   j                        z         t        dt        | || d   j                        z         t        d|j                  z         t        d|j                  z         nt        d       | d   j                  |d	      }t        d
       |D ]  }t        | |        | d   j                  |d      }t        d       |D ]  }t        | |        t        d       | d   j                  |d      x}}|D ]  }t        | |        y )Nr  zAdditions active, version %szSupport seamless: %szSupport graphics: %szBalloon size: %dzStatistic update interval: %dzNo additionsrs   
USBDeviceszAttached USB:remoteUSBDeviceszRemote USB:zTransient shared folders:sharedFolders)r   additionsRunLevelAdditionsRunLevelType_Nonerx   additionsVersionr   AdditionsFacilityType_SeamlessAdditionsFacilityType_GraphicsmemoryBalloonSizer  r   r  r  r  )	r   r   _argsr   usbsr  rusbssfsr  s	            r   ginfor    sW   MME#g,"I"II,0F0FGH$(9#uc'lFqFq(rst$(9#uc'lFqFq(rst E$;$;<=-1O1OPQnx=!!'<8D	/ CM""7,>?E	- !R !	
%&h-((/BBC% Rr   c                 t    d 	  d   } d   j                  d      j                   d   j                  k7  r6t        dj                  dj                         j                          y  d	   r!|d
k(  rt        d       j                          y j                  fdfdfdfd fd fd fd fd fd fd fd fd fd fd fdd}	  ||           j                          y # t        $ rI}t         dj                  dt	        |             t
        rt        j                          Y d }~y d }~ww xY w# t        $ r d d<   Y vt        $ r0}t         |       t
        rt        j                          Y d }~d }~ww xY w)Nr   rs   TfPermitSharingzSession to 'z' not open: r  z' in wrong state: remotesome_local_only_commandz/Trying to use local only functionality, ignoredc                  $     j                         S r   )pauser   s   r   <lambda>zcmdExistingVm.<locals>.<lambda>  s    gmmo r   c                  $     j                         S r   )resumer  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    gnn&6 r   c                  $     j                         S r   )	powerDownr  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    g&7&7&9 r   c                  $     j                         S r   )powerButtonr  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    g&9&9&; r   c                      t               S r   )r   )r   rS   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    iT&: r   c                       t               S r   )r   r  r   r   rS   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    iT7D&I r   c                      t               S r   )r  r  r   r   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    eC$&? r   c                  &      d    dd        S )Nr   rt   rY   r  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    gd1gc4$qr(&K r   c                  L    t         j                  j                               S r   )r   r   	saveState)r   r   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    k#w7P7P7R&S r   c                      t               S r   )r  r  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    nS'4&H r   c                       t               S r   )r  )r  r   r   r   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    hsGWd&K r   c                      t               S r   )r  r  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    jgt&D r   c                  4    t        j                         S r   )r  r   r  r   r   s   r   r  zcmdExistingVm.<locals>.<lambda>  s    gc7??GT&R r   c                  4    t        j                         S r   )r  r   r  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    iW__gt&T r   c                  4    t        j                         S r   )r  r   r  s   r   r  zcmdExistingVm.<locals>.<lambda>  s    hsGOOWd&S r   )r  r  	powerdownpowerbuttonstatsr   r  guestlambdar  
screenshotr  
gueststatsplugcpu	unplugcpumountisorv   )openMachineSessionrI   rJ   rG   r   rK   rL   rM   r$   SessionState_Lockedrx   r   r   r   )	r   rS   cmdr  r   rT   opsr   r   s	   `` `   @@r   cmdExistingVmr    si   G4yh-2242M }}G888diiOP 8} 99?@ooG569;:I?KSHKDRTSC "C
 S  		3q6JK!	D   K "a!"s5   D ?
E/ 	E,#?E''E,/F7?F7&F22F7c                    | d   j                  |d      }|j                  }	  || ||       |r	 |j                          | d   j                  |       y # t        $ r2}d}t        | |       t        rt        j                          Y d }~^d }~ww xY w# t        $ r0}t        | |       t        rt        j                          Y d }~d }~ww xY wNrs   Tr  F)	r  r   rI   rJ   rK   rL   rM   r   closeMachineSessionr   rS   r  r  r  r   rT   s          r   r   r     s    (m..tD.IG??D"Ct 	&
 M%%g.  "a!	"  	&S!##%	&s.   
A B 	B(BB	C&CCc                 <   | d   j                  |d      }|j                  }	  || ||j                  |       |r|j                          | d   j                  |       y # t        $ r2}d}t	        | |       t
        rt        j                          Y d }~]d }~ww xY wr  )
r  r   r   rI   rJ   rK   rL   rM   r   r  r  s          r   cmdAnyVmr    s    (m..tD.IG??D"Cw- M%%g.  "a!	"s   A   	B)(BBc                 .    | d   j                  |      }|S Nr   )findMachine)r   r   rS   s      r   machByIdr    s    t9  &DKr   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)	XPathNodec                 .    || _         || _        || _        y r   )parentobjntype)r   r!  r"  r#  s       r   r   zXPathNode.__init__"  s    
r   c                 ~    | j                         }g }|D ]%  }|j                  |      s|j                  |       ' |S r   )enumrN   rA   )r   subpathchildrenrN   rT   s        r   lookupzXPathNode.lookup&  s@    99; 	"Ayy!q!	" r   c                     g S r   rY   r   s    r   r%  zXPathNode.enum-  s    	r   c                    || j                   k(  ry|j                  | j                         syt        j                  d|      }d}	 |<|j	                         }|d   }|d   }t        t        | j                  |            |k(  }|S #  Y |S xY w)NTFz@(?P<a>\w+)=(?P<v>[^\'\[\]]+)rh  v)r#  r'   rE   rl  rm  r   getattrr"  )r   subexprx  rN   xdictattrr  s          r   rN   zXPathNode.matches/  s    TZZ  ,		:FC	 )SzCjwtxx673> 	s   >B Bc                 V    t        || j                  | | j                         di        y )N)r"  noder   )r   r"  getCtx)r   r  s     r   applyzXPathNode.apply?  s    S$dkkmDbIr   c                 f    t        | d      r| j                  S | j                  j                         S )Nr   )hasattrr   r!  r3  r*  s    r   r3  zXPathNode.getCtxA  s(    488O{{!!##r   N)	rV   rW   rX   r   r(  r%  rN   r4  r3  rY   r   r   r  r  !  s!     J$r   r  c                       e Zd Zd Zd Zd Zy)XPathNodeHolderc                 d    t         j                  | ||d|z          || _        || _        || _        y )Nzhld )r  r   r0  	heldClass	xpathname)r   r!  r"  r0  r:  r;  s         r   r   zXPathNodeHolder.__init__G  s0    4fY.>?	""r   c                     g }| j                         d   j                  | j                  | j                        D ]%  }| j	                  | |      }|j                  |       ' |S Nrs   )r3  r   r"  r0  r:  rA   )r   r'  r2  nodexmls       r   r%  zXPathNodeHolder.enumL  sY    KKM(+44TXXtyyI 	%DnnT40GOOG$	% r   c                      || j                   k(  S r   r;  r   r.  s     r   rN   zXPathNodeHolder.matchesR      ''r   NrV   rW   rX   r   r%  rN   rY   r   r   r8  r8  F  s    #
(r   r8  c                       e Zd Zd Zd Zy)XPathNodeValuec                 H    t         j                  | ||d|z          || _        y )Nzval )r  r   r;  )r   r!  r"  r;  s       r   r   zXPathNodeValue.__init__V  s"    4fY.>?"r   c                      || j                   k(  S r   r@  rA  s     r   rN   zXPathNodeValue.matchesY  rB  r   NrV   rW   rX   r   rN   rY   r   r   rE  rE  U  s    #(r   rE  c                       e Zd Zd Zy)XPathNodeHolderVMc                 @    t         j                  | ||dt        d       y )Nr   vms)r8  r   XPathNodeVM)r   r!  r   s      r   r   zXPathNodeHolderVM.__init__]  s      vtZeTr   Nr   rY   r   r   rJ  rJ  \  s    Ur   rJ  c                       e Zd Zd Zd Zy)rM  c                 4    t         j                  | ||d       y )Nvmr  r   r   r!  r"  s      r   r   zXPathNodeVM.__init__a  s    4d3r   c                 p    t        | | j                        t        | | j                  j                  d      gS )Nbios)XPathNodeHolderNICr"  rE  BIOSSettingsr*  s    r   r%  zXPathNodeVM.enume  s2    "42tTXX%:%:VDH 	Hr   NrV   rW   rX   r   r%  rY   r   r   rM  rM  `  s    4Hr   rM  c                       e Zd Zd Zd Zy)rU  c                     t         j                  | ||dt        d       | j                         d   j                  j                  | j                  j                        | _        y )Nnicsr   )	r8  r   rM  r3  systemPropertiesgetMaxNetworkAdaptersr"  chipsetTypemaxNic)r   r!  rS   s      r   r   zXPathNodeHolderNIC.__init__j  sJ      vtV[&QkkmD)::PPQUQYQYQeQefr   c                     g }t        d| j                        D ]8  }t        | | j                  j	                  |            }|j                  |       : |S Nr   )r  r^  XPathNodeNICr"  getNetworkAdapterrA   )r   r'  r  r2  s       r   r%  zXPathNodeHolderNIC.enumm  sO    q$++& 	"Adhh&@&@&CDDOOD!	" r   NrW  rY   r   r   rU  rU  i  s    gr   rU  c                       e Zd Zd Zd Zy)ra  c                 4    t         j                  | ||d       y NnicrQ  rR  s      r   r   zXPathNodeNIC.__init__u  s    4e4r   c                     |dk(  S re  rY   rA  s     r   rN   zXPathNodeNIC.matchesw  s    r   NrH  rY   r   r   ra  ra  t  s    5r   ra  c                       e Zd Zd Zd Zd Zy)XPathNodeRootc                 B    t         j                  | d d d       || _        y )Nroot)r  r   r   )r   r   s     r   r   zXPathNodeRoot.__init__{  s    4tV4r   c                 6    t        | | j                  d         gS r  )rJ  r   r*  s    r   r%  zXPathNodeRoot.enum~  s    !$788r   c                      yNTrY   rA  s     r   rN   zXPathNodeRoot.matches  s    r   NrC  rY   r   r   ri  ri  z  s    9r   ri  c                 V   |j                  d      dd  }t        |       g}|D ]  }g }t        |      dkD  r0|j                         }|j	                  |       t        |      dkD  r0|D ]+  }|j                  |      }|D ]  }	|j	                  |	        - t        |      dk(  s |S  |S )Nr&   r  r   )r>   ri  r?   poprA   r(  )
r   scope	pathnamesnodesr=   seenr2  ro   rN   rx  s
             r   
eval_xpathru    s    C $I3 E 
%j1n99;DKK %j1n  	$AhhtnG  $U#$	$ u:?L
 Lr   c                     t        |      dk  rt        d|d   z         y |d   }t        | |      }|d k(  rt        d|z         |S )Nr  zusage: %s [vmname|uuid]r   rt   zDMachine '%s' is unknown, use list command to find available machines)r?   rx   r  )r   r  r   rS   s       r   
argsToMachrw    sR    
4y1}'47347DCDt|TX\]^Kr   c                 ^    |dk7  r	d|z   dz   }nd}t        dt        | d      d||       y )Nr   z [ext from ]r[       r   r   )rx   r   )r  r  spspecs       r   helpSingleCmdr}    s3    	QwR#	GC0!T
:;r   c                 d   t        |      dk(  rat        d       t        t        j	                               }|j                          |D ]#  }t        |t        |   d   t        |   d          % y|d   }t        j                  |      }|d k(  rt        d|z         yt        ||d   |d          y)Nrt   z
Help page:r   r  zCommand '%s' not known)r?   rx   r^   commandsr  sortr}  r   )r   r  namesr  r  rQ   s         r   helpCmdr    s    
4yA~lX]]_%

 	=A!Xa[^Xa[^<	=  1gLL9*c23  #qtQqT*r   c                     | d   j                  |      }t        |j                               D ]*  }t        |      t        ||         k(  st	        |d      c S  t	        dd      S )Nr  r   z	<unknown>)r  r^   r  r   r   )r   r%  r   enumValsrT   s        r   r   r     sa    7|&&t,H(--/" 't9HQK((1g&&' ;((r   c                 N    | d   j                  |      }|j                  |d       S )Nr  )r  r   )r   r%  r   r  s       r   enumFromStringr    s'    7|&&t,H<<d##r   c                    t        | d      D ]u  }	 |j                  rd}ncd}t        |dt        | |j                        d|j
                  dt        | d|j                        dt        | d	|j                        	       w y
# t        $ r0}t        | |       t        rt        j                          Y d }~d }~ww xY w)NTz[T] rz  z	Machine 'z' [z], machineState=MachineStatez, sessionState=SessionStater   )rD   teleporterEnabledrx   r   rG   rH   r   r$   sessionStaterI   rJ   rK   rL   rM   )r   r  rS   telerT   s        r   listCmdr    s    C& 
&		&%%QUW\]`bfbkbkWlnrnunu  xB  CF  HV  X\  Xb  Xb  xc  eo  ps  uC  EI  EV  EV  eW  X  Y
& 	  	&S!##%	&s   A2B	B?&B::B?c                    t        |      dk  rt        d       yt        | |      }|d k(  ry	 | d   j                  |j                        }t        d       t        dt        | |j                        z         t        d|j                  z         t        d|j                  z         t        d	||j                  n|j                  z         t        d
t        | d|j                        d|j                  d       t                t        d|j                  z         t        d|j                  z         t        d|j                  j                  z         t        d|j                  j                  z         t        dt        | d|j                         d|j                   d       t                t        dt        | d|j"                        d|j"                  d       t        dt        | d|j$                        d|j$                  d       t                |j&                  r.t        d|j(                  |j*                  fz         t                |j,                  }t        dt/        |j0                        z         t        dt/        |j2                        z         |j5                  | d   j6                  j8                        }t        dt/        |      z          |j5                  | d   j:                        }t        dt/        |      z          |j5                  | d   j<                        }t        dt/        |      z          t        d t/        |j                  j>                        z          t        d!t/        |j                  j@                        z          t        d"t/        |jB                        z         t        d#t/        |jD                        z         |jF                  jH                  rOt        d$t        | d%|jF                  jJ                        d&t        | d'|jF                  jL                               t        d(t/        |jN                        z         t        d)t        | d*|jP                        d|jP                  d       t        d+t        | d,|jR                        d|jR                  d       t        d-tU        jV                  tU        jX                  t[        |j\                        d.z              z          	 t        d/t/        |j^                  jH                        z         t                t        ta        | d0             | d   jc                  |d1      D ]<  }t        d2|j                  t        | d3|jd                        |jf                  fz         > t                t        ta        | d4             t        d5t/        |jh                        z         t        d6|jj                  z         | d   jc                  |d7      }	|	rt                t        ta        | d8             |	D ]J  }
t        d9|
j                  d:t        | d;|
jl                        d<t        | d=|
jn                               L | d   jc                  |d>      }|rt                t        ta        | d?             |D ]  }t        d@|jp                  |jr                  |jt                  t        | dA|jd                        |jd                  fz         |jv                  }|jd                  | d   j6                  jx                  k(  rut        dB       t        dC|j                  z         t        dDt{        | |j|                        z         t        dE|j                  z         t        dF|j~                  z         |jd                  | d   j6                  j                  k(  rt        dG       |rt        dC|j                  z         t        dE|j                  z         |j                  r:t        dHt{        | |j|                        z         |j                  rFt        dI       n:t        dJt{        | |j|                        z         t        dK|j                  z         |jd                  | d   j6                  j                  k(  st        dL       |st        dC|j                  z         t        dE|j                  z         |j                  r$t        dMt{        | |j|                        z         ut        dJt{        | |j|                        z         t        dK|j                  z          t                t        ta        | dN             | d   jc                  |dO      D ]  }t        | |        y#  d }Y 	xY w#  Y xY w)PNr  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]: FirmwareType ()z  CPUs [CPUCount]: %dz  RAM [memorySize]: %dMz  VRAM [VRAMSize]: %dMz  Monitors [monitorCount]: %dz  Chipset [chipsetType]: ChipsetTypez"  Clipboard mode [clipboardMode]: ClipboardModez  Machine status [n/a]: r  z!  Teleport target on port %d (%s)z%  ACPI [BIOSSettings.ACPIEnabled]: %sz'  APIC [BIOSSettings.IOAPICEnabled]: %srs   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]: %sz!  Audio [via audioAdapter]: chip AudioControllerTypez; host driver AudioDriverTypez)  CPU hotplugging [CPUHotPlugEnabled]: %sz  Keyboard [keyboardHIDType]: KeyboardHIDTypez%  Pointing device [pointingHIDType]: PointingHIDTypez  Last changed [n/a]: rP  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    'z': bus 
StorageBusz type 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  )Fr?   rx   rw  getGuestOSTypeOSTypeIdr   rG   descriptionrH   r   firmwareTypeCPUCount
memorySizegraphicsAdapterVRAMSizemonitorCountr]  clipboardModer  r  teleporterPortteleporterPasswordrV  r   ACPIEnabledIOAPICEnabledgetHWVirtExPropertyr   HWVirtExPropertyType_EnabledHWVirtExPropertyType_VPID!HWVirtExPropertyType_NestedPagingaccelerate3DEnabledaccelerate2DVideoEnabled	RTCUseUTCHPETEnabledaudioAdapterenabledaudioControlleraudioDriverCPUHotPlugEnabledkeyboardHIDTypepointingHIDTyperC  asctime	localtimer   lastStateChange
VRDEServerr   r   r  USBStandardIOCacheEnabledIOCacheSizebuscontrollerType
controllerr  devicemediumDeviceType_HardDiskr   locationformatDeviceType_DVD	hostDrivepassthroughr  DeviceType_Floppyr  )r   r  rS   vmosrT  hwVirtEnabled
hwVirtVPIDhwVirtNestedPagingoUsbCtrlcontrollersr  attachesrh  r  r  s                  r   infoCmdr    s   
4y1})*c4 Dt|4y''6 

Z[	
sDII!6
78	
+t/?/?
@A	
dgg
&'	
(@PD,<,<VZVcVc
de	*S.RVRcRc2dfjfwfw
xy	G	
!T]]
34	
#t
78	
"d&:&:&C&C
DE	
)T-A-A-N-N
OP	
3tO_O_0`bfbrbr
st	G	CZ^ZlZl9mos  pB  pB  C  D	z#~tO`O`/acgctct
uv	G1T5H5H$JaJa4bbcD	
1WT=M=M5N
OP	
3wt?Q?Q7R
ST,,S]-D-D-a-abM	  F  IP  Q^  I_  _  `))#g,*P*PQJ	
w  {B  CM  {N  N  O11#g,2`2`a	  A  DK  L^  D_  _  `	
>I]I]IqIqAr
rs	
IGTXThTh  UB  UB  MC  C  D	
0GDNN4K
LM	
$0@0@(A
BC  zRUWlnrnn  oP  oP  HQ  S]  ^a  ct  w{  wH  wH  wT  wT  SU  V  	W	
5AWAW9X
YZ	ZEVX\XlXl5mos  pD  pD  E  F	JsL]_c_s_s<tvz  wK  wK  L  M	
"T\\$..TEYEYAZ[_A_2`%a
ab6'$//BYBY:Z[\ 
G	&*
+,M**41AB j0}}j.A8==QS[SgSghi 	jj 
G	&-
./	
1WT=P=P5Q
RS	
,0@0@
ABh-((/CDKfS234! r
JOOZ\[e[i[i=jlvwz  }T  V`  Vo  Vo  mp  q  	rr 8}%%d,?@HfS*%&  :EWXW]W]_`_g_gistw  zF  HI  HN  HN  jO  QR  QW  QW  IX  X  	Y66S],,@@@),&)),-$V__(EFG.FKK01"fmm4566S],,;;;)lfii01n45##+wsFOO/LMN}}673wsFOO7TUV.FKK8966S],,>>>,lfii01n45##.'#v2OPQ3wsFOO7TUV.FKK89A :D 
G	&)
*+(m$$T?; R ]Zs   g !+g ggc                     t        |      dk  rt        d       yt        | |      }|d k(  ryt        |      dkD  r|d   }nd}t        | ||       y)Nr  zusage: start name <frontend>r   gui)r?   rx   rw  r   )r   r  rS   r   s       r   startCmdr  F  sW    
4y1},-c4 Dt|
4y1}aCvr   c                     t        |      dk7  rt        d       y|d   }|d   }	 | d   j                  |       t	        | ||       y# t        $ r t        d|       Y yw xY w)Nr  zusage: createvm name ostyper   rt   r  r   zUnknown OS type:)r?   rx   r  rI   r   )r   r  rG   oskinds       r   createVmCmdr  T  sr    
4yA~+,7D!WFD	  ( S$	   &)s   A A A c                 x    t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |dd       y)Nr  zusage: ginfo [vmname|uuid]r   r  r[   r?   rx   rw  r  r   r  rS   s      r   ginfoCmdr  b  s@    
4y1}*+c4 Dt|#tWb)r   c	                    t        |      dk  rt        d       y |j                  }	|	j                  ||dd      }
|}t        d|d   d|d|       d}|d}t        |d          |
j	                  |d   ||g |      }t        d	|j
                  z         t        dk7  rg	 	 |a ||       }|>t        |      }d}|dkD  rE|	j                  t        dd||d        }||z   }||z
  }|dkD  r+n	 |	j                  t        ddd       |	j                  t        ddd      }|r.t        |      dkD  r t        j                  j                  |       t        j                  d       | d   j                  d       |	j                  t        ddd      }|r;t        |      dkD  r-|
 || |       nt        j                  j                  |       *t        j                  rn<	 |	j'                  t              \  }}}t        d|z         yt)        | t               y #  Y xY w# t         $ r7 t        d       d
| d<   t        j"                  rt        j%                          Y w xY w)Nrt   z)exec in guest needs at least program namer[   zvboxshell guest execz
executing r   z with args  as zexecuted with pid %dT'  r,      r   rs   ru   rv   zExit code: %d)r?   rx   r   createSessionprocessCreatePIDpidsetProcessInputgetProcessOutputrz   r{   rV  r   r}   r~   rw   r   r   r   getProcessStatusr   )r   r   r  envuserr  tmo	inputPipe
outputPiper   guestSessiongargsr(  processindatarV  r   r   r  _reasoncode_flagss                         r   execInGuestr  l  sN   
4y1}9:MME&&tVR9OPLE	tAwt
DEE	$q'N((a%b#FG	
 GKK
01
ax%	"(&s^F) #F#ai % 5 5c1gvcd| TA"%'C$)AIE $ai!!11#q'3G --c1eTBCIMJJ$$T***3/H++A.--c1a>CIM!-"3-

((.%%= <  #("8"8"=$o&'C"7! " ! 	".!#C""!		"s2   #A	H" -H" /H CH" HH" "=I"!I"c                     |d   }|d   }d}t        d|d|       |j                  j                  |||||      }t        | |       y )Nr   rt   zCopying host z
 to guest )rx   r   copyToGuestr   )	r   r   r  r  r  srcdstr(  r   s	            r   r  r    sL    
q'C
q'CE	3
45}}((c4GHXr   c                     t         j                  }t        |       } | r|j                  |        t         j                  j                         }|st        |d   dk(  r|d d }|S )Nr-   rN  )rz   r{   r   rV  stdinr0   EOFError)promptstreamrW  s      r   nh_raw_inputr    sY    ZZF[FV99DBx4CRyKr   c                     dd l }|j                         }t        d|z        }t        |      dkD  r|}|j                         }||fS )Nr   zUser (%s): )getpassgetuserr  r?   )r   r  r  user_inpr  s        r   getCredr    sG    ??DMT23H
8}q__F&>r   c                     t        |      dk  rt        d       yt        | |      }|d k(  ry|dd  }g t        |       \  |j	                  dfd       t        | |d|       y)Nr  z'usage: gexec [vmname|uuid] command argsr   c           	      &    t        | ||d      S )Nr  r  )r   rS   r   r  r  r  r  s       r   r  zgexecCmd.<locals>.<lambda>  s    [gtUXZ^`fhm5n r   r	  r?   rx   rw  r  insertr  )r   r  rS   r  r  r  r  s       @@@r   gexecCmdr    sm    
4y1}78c4 Dt|HE
CS\NT6	LLno#t]E2r   c                     t        |      dk  rt        d       yt        | |      }|d k(  ry|dd  }t        |       \  |j	                  dfd       t        | |d|       y)Nr  z/usage: gcopy [vmname|uuid] host_path guest_pathr   c                 "    t        | ||      S r   )r  )r   rS   r   r  r  r  s       r   r  zgcopyCmd.<locals>.<lambda>  s    [gtUY[a5b r   r	  r  )r   r  rS   r  r  r  s       @@r   gcopyCmdr    sh    
4y1}?@c4 Dt|HES\NT6	LLbc#t]E2r   c                 >    	 | d   j                         d   S #  Y y xY w)Nr  r   )communicate)r   _hcmds     r   readCmdPiper    s)    9~))+A..s    c                   	 t        |      dk  rt        d       yt        | |      }|d k(  ry|d   |d   }t        |       \  	dd l}|j                  t              |j                        | d<   t        |      }g |j                  d	fd       t        | |d	|       	 | d   j                          d | d<   y#  Y 
xY w)
Nr  zusage: gpipe [vmname|uuid] hostProgram guestProgram, such as gpipe linux  '/bin/uname -a' '/bin/sh -c "/usr/bin/tee; /bin/uname -a"'r   r  r  )r{   r  c                 .    t        | ||dfd      S )Nr  c                     t        |       S r   )r  )r   hcmds    r   r  z,gpipeCmd.<locals>.<lambda>.<locals>.<lambda>  s!      {F  GJ  LP  {Q r   r
  )r   rS   r   r  r  r  r  r  s       r   r  zgpipeCmd.<locals>.<lambda>  s&    [gtUXZ^`fhm  pQ  6R r   r	  )r?   rx   rw  r  
subprocessPopenrp   PIPEr  r  	terminate)
r   r  rS   gcmdr  r  r  r  r  r  s
         @@@@r   gpipeCmdr    s    
4y1}  W  	Xc4 Dt|7D7DS\NT6%%od&;JOO%TC	ND!E
C	LL  R  S#t]E2I  " C	Ns   *C Cc                 @    t        | |      }|d k(  ryt        | |       yr`  )rw  r   r  s      r   removeVmCmdr      s%    c4 Dt|S$r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   rw  r  r  s      r   pauseCmdr#    )    c4 Dt|#tWb)r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   r"  r  s      r   powerdownCmdr&    s)    c4 Dt|#t["-r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   r"  r  s      r   powerbuttonCmdr(    s)    c4 Dt|#t]B/r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   r"  r  s      r   	resumeCmdr*    s)    c4 Dt|#tXr*r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   r"  r  s      r   saveCmdr,  #  s)    c4 Dt|#tVR(r   c                 D    t        | |      }|d k(  ryt        | |dd       y)Nr   r  r[   r"  r  s      r   statsCmdr.  *  r$  r   c           
          t              dk  rt        d       yt        |       }|d k(  ry|j                  | d   j                  k7  rt        | |fd       yt        | |ddj                  dd               y)	Nr  zusage: guest name commandsr   r  c           
      D    t        | |d dj                  dd              S )Nr,   r  )r   rB   )r   rS   rh  r  s      r   r  zguestCmd.<locals>.<lambda>9  s(    IsD$PSPXPXY]^_^`YaPb4c r   r   r,   r  )r?   rx   rw  r$   MachineState_Runningr   r  rB   r  s    ` r   guestCmdr2  1  sz    
4y1}*+c4 Dt|zzS\666Ccd  	c4#((48*<=r   c                 ~    t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |d|dd         y)Nr  z6usage: screenshot vm <file> <width> <height> <monitor>r   r
  r  r  s      r   screenshotCmdr4  >  sF    
4y1}FGc4 Dt|#t\484r   c                 ~    t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |d|dd         y)Nr  z)usage: teleport name host:port <password>r   r  r  r  r  s      r   teleportCmdr6  H  sF    
4y1}9:c4 Dt|#tZab2r   c                 R    |d   }||_         |r|d   }|d   }||_        ||_        y y )Nr   rt   r  )r  r  r  )r   rS   r  r  r  r  s         r   portalsettingsr8  R  s=    1gG$DAwa""(	 r   c                 "   t        |      dk  rt        d       yt        | |      }|d k(  ryt        |d         }t        |      dkD  r|d   }nd}|j                  r|j
                  |k7  s|rt        | |t        d||g       t        | |d       y)Nr  z&usage: openportal name port <password>r   r  r[   Tr  )	r?   rx   rw  r   r  r  r   r8  r   )r   r  rS   r  r  s        r   openportalCmdr:  [  s    
4y1}67c4 Dt|tAw<D
4y1}a!!T%8%8D%@FC~dF/CDCur   c                     t        |      dk  rt        d       yt        | |      }|d k(  ry|j                  rt	        | |t
        dg       y)Nr  zusage: closeportal namer   F)r?   rx   rw  r  r   r8  r  s      r   closeportalCmdr<  l  sK    
4y1}'(c4 Dt|C~w7r   c                 ~    t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |d|dd         y)Nr  z'usage: gueststats name <check interval>r   r  r  r  s      r   gueststatsCmdr>  w  sF    
4y1}78c4 Dt|#t\484r   c                     |d   }|d   }|r t        d|z         |j                  |       y t        d|z         |j                  |       y )Nr   rt   r  r  )rx   r  r  )r   rS   r  plugr  s        r   r  r    sM    7D
q'C C()"c*+#r   c           
      4   t        |      dk  rt        d       yt        | |      }|d k(  ryt        |j                        t        | d   j
                        k7  r-|j                  r t        | |t        dt        |d         g       yt        | |d|d          y)Nr  zusage: plugcpu name cpuidr   r  Tr  r?   rx   rw  r   r  r  r  r   r  r   r  r  s      r   
plugcpuCmdrC    s    
4y1})*c4 Dt|
4S\%E%E!FF!!T7T3tAw<,@A  	c4DG4r   c           
      4   t        |      dk  rt        d       yt        | |      }|d k(  ryt        |j                        t        | d   j
                        k7  r-|j                  r t        | |t        dt        |d         g       yt        | |d|d          y)Nr  zusage: unplugcpu name cpuidr   r  Fr  rB  r  s      r   unplugcpuCmdrE    s    
4y1}+,c4 Dt|
4S\%E%E!FF!!T7UCQL,AB  	c4d1g6r   c                 T    d|d   z   dz   |d   z   }t        d|       t        |       y )Nzmach.r   z = rt   	Executing)rx   r   )r   _machr  exprs       r   setvarrJ    s.    47?5 a(D	+tJr   c                     t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |t        |dd         y)Nr  z&usage: setvar [vmname|uuid] expr valuer   r  )r?   rx   rw  r   rJ  r  s      r   	setvarCmdrL    sF    
4y1}67c4 Dt|T648,r   c                 ~    |d   }|d   }t        |j                  d|d|r|nd        |j                  ||       y )Nr   rt   z
: setting z to )rx   rG   setExtraData)r   rS   r  rh   r'  s        r   
setvmextrarO    s>    
q'CGE	DIIsUE4L
MNc5!r   c                     t        |      dk  rt        d       y|d   }t        |      dk(  r|d   }nd}|d   dk(  r| d	   j                  ||       yt        | |      }|d k(  ryt	        | |t
        ||g       y)
Nr  z0usage: setextra [vmname|uuid|global] key <value>r   r  r  r[   rt   rs   r   )r?   rx   rN  rw  r   rO  )r   r  rh   r'  rS   s        r   setExtraDataCmdrQ    s    
4y1}@A
q'C
4yA~QAw(D	sE*c4 Dt|T:U|4r   c                 ,    t        | d|d|d       y )Nz: 'z' = 'r  )rx   )r"  rh   r'  s      r   printExtraKeyrS    s    	sC
/0r   c                 "   t        |      dk  rt        d       yt        |      dk(  r|d   }nd }|d   dk(  r| d   }nt        | |      }|d k(  ry|d k(  r|j                         }n|g}|D ]!  }t	        |d   ||j                  |             # y)Nr  z*usage: getextra [vmname|uuid|global] <key>r   r  rt   rs   r   )r?   rx   rw  getExtraDataKeysrS  getExtraData)r   r  rh   r"  r  rf  s         r   getExtraDataCmdrW    s    
4y1}:;
4yA~1gAw($id#$;
d{##%w 7d1gq#"2"21"567 r   c                      y)Nrt   rY   )r   r  s     r   quitCmdrY    s    r   c                     t        |      dk(  r|d   t        |d   <   yt        t        j                               D ]  \  }}t	        d|d|d        y)Nr  r  rt   r   r  z' is an alias for ')r?   aliasesr^   r_   rx   )r   r  rh   r'  s       r   aliasCmdr\    sP    
4yA~7QW]]_- :eS%89:r   c                 @    t        |      dkD  r	|d   dk(  ayt         ayNrt   r   r   )r?   rK   r   r  s     r   
verboseCmdr`    s+    
4y1}1gtm
  $^
r   c                 @    t        |      dkD  r	|d   dk(  ayt         ayr^  )r?   r   r_  s     r   	colorsCmdrb    s,    
4y1}Q4  ('r   c           	      d   | d   }	 t        dt        |j                  d      z         |j                  }t        dt        | |j                        z         |j                  }|j                  }t        t        | d             t        d||j                  fz         t        d|      D ]1  }t        d||j!                  |      |j#                  |      fz         3 t        t        | d	             t        d
|j$                  |j&                  fz         t        t        | d             t        d|j(                  d|j*                  d       |j,                  rt        t        | d             nt        t        | d             t        t        | d             | d   j/                  |d      D ](  }t        d|j0                  d|j2                  d       * t        t        | d             | d   j/                  |d      D ]'  }	t        d|	j0                  d|	j4                         ) t        t        | d             | d   j/                  |d      D ]'  }	t        d|	j0                  d|	j4                         ) t        t        | d             | d   j/                  |d      D ]  }
t7        | |
        | d   r.| d   j9                  dg|g      D ]  }t        |d   |d           y# t        $ r1}t	        | |       t
        rt        j                          Y d }~d }~ww xY w)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  r  r  z3D acceleration availablez3D acceleration NOT availablezNetwork interfaces:rs   networkInterfaceszDVD drives:	DVDDrivesz - zFloppy drives:floppyDriveszUSB devices:r  r   r   rG   r   )rx   r   versionrI   rJ   rK   rL   rM   r[  r   defaultMachineFolderr  processorCountr   processorOnlineCountr  getProcessorSpeedgetProcessorDescriptionr  memoryAvailableoperatingSystem	OSVersionacceleration3DAvailabler   rG   	IPAddressr  r  r   )r   r  r   rT   propsr  cntr  niddr  r   s               r   hostCmdrv    s   t9D"%v)FGH
 !!E	.GC)C)CD
EF
 99D


C	&m
$%	
&#t/H/H)I
IJ1c] s/1d6L6LQ6OQUQmQmnoQp2qqrs 
&f
	
1E1EF
FG	&e
	--t~~
>?##fS567fS9:;	&+
,-(m$$T+>? 5RWWbll345 
&m
$%(m$$T;7 7RWWbnn567 
&&
'((m$$T>: 7RWWbnn567 
&n
%&(m$$T<8 !R ! 6{&k''v6 	>F&.&);"<=	> ]  "a!"s   "K5 5	L/>&L**L/c                     t        |      dk  rt        d       yt        | |      }|d k(  rydt        |      dkD  rt        |d         dt	        | |dfdg       y)Nr  z#usage: monitorGuest name (duration)r      Fr	  c                 4    t        | |j                        S r   )rL  rG  r   rS   r   r  rH  rI  s       r   r  z!monitorGuestCmd.<locals>.<lambda>F  s$    }]`bibubuw}  @C  PD r   r?   rx   rw  ro  r  r   r  rS   rH  rI  s      @@r   monitorGuestCmdr}  ;  sp    
4y1}34c4 Dt|
C
4y1}DGnF#t]  .D  -E  Fr   c                     t        |      dk  rt        d       yt        | |      }|d k(  rydt        |      dkD  rt        |d         dt	        | |dfdg       y)Nr  z&usage: monitorGuestKbd name (duration)r   rx  Fr	  c                 H    t        | |j                  j                        S r   )rL  r[  rG  rz  s       r   r  z$monitorGuestKbdCmd.<locals>.<lambda>T  s.    }]`bibrbrb~b~  AG  IL  PM r   r{  r|  s      @@r   monitorGuestKbdCmdr  I  sp    
4y1}67c4 Dt|
C
4y1}DGnF#t]  .M  -N  Or   c                     t        |      dk  rt        d       yt        | |      }|d k(  rydt        |      dkD  rt        |d         dt	        | |dfdg       y)Nr  z(usage: monitorGuestMouse name (duration)r   rx  Fr	  c                 H    t        | |j                  j                        S r   rL  r\  rG  rz  s       r   r  z&monitorGuestMouseCmd.<locals>.<lambda>b  .    }]`bibobob{b{  ~D  FI  PJ r   r{  r|  s      @@r   monitorGuestMouseCmdr  W  sp    
4y1}89c4 Dt|
C
4y1}DGnF#t]  .J  -K  Lr   c                     t        |      dk  rt        d       yt        | |      }|d k(  rydt        |      dkD  rt        |d         dt	        | |dfdg       y)Nr  z-usage: monitorGuestMultiTouch name (duration)r   rx  Fr	  c                 H    t        | |j                  j                        S r   r  rz  s       r   r  z+monitorGuestMultiTouchCmd.<locals>.<lambda>p  r  r   r{  r|  s      @@r   monitorGuestMultiTouchCmdr  e  sp    
4y1}=>c4 Dt|
C
4y1}DGnF#t]  .J  -K  Lr   c                     t        |      dkD  rt        d       yd}t        |      dkD  rt        |d         }| d   }d}t        | |j                  ||       y)Nr  zusage: monitorVBox (duration)r   rx  rt   r   F)r?   rx   ro  rL  rG  )r   r  rI  r   rH  s        r   monitorVBoxCmdr  s  s[    
4y1}-.
C
4y1}DGnt9DF#t''5r   c                    || d   j                   j                  k(  s8|| d   j                   j                  k(  s|| d   j                   j                  k(  ry|| d   j                   j                  k(  s8|| d   j                   j
                  k(  s|| d   j                   j                  k(  ry|| d   j                   j                  k(  ry|| d   j                   j                  k(  ry t        d|z         )Nrs   pcnete1000virtiozUnknown adapter type: )
r   NetworkAdapterType_Am79C970ANetworkAdapterType_Am79C973NetworkAdapterType_Am79C960NetworkAdapterType_I82540EMNetworkAdapterType_I82545EMNetworkAdapterType_I82543GCNetworkAdapterType_VirtioNetworkAdapterType_NullrI   )r   natypes     r   getAdapterTyper    s    #h-))FFF#h-))EEE#h-))EEE
CM++GG
G
CM++GG
G
CM++GG
G
CM++EE
E
CM++CC
C0788r   c                    t        |      dk7  rt        d       yt        | |      }|d k(  ryt        |d         }t        |d         }t        |d         }d}| d   j	                  |d	
      }|j
                  }|j                  |      }t        | |j                        }	|dz   t        |      z   dz   t        |      z   }
d|	z   dz   }|t        |j                        z   dz   |
z   }|j                  |dz   |       |j                  |dz   t        |             |j                  |dz   t        |             |j                          |j                          y)Nrx  z8usage: portForward <vm> <adapter> <hostPort> <guestPort>r   r  r  r  TCPrs   Tr  r  zVBoxInternal/Devices/r&   z/LUN#0/Config/z	/Protocolz	/HostPortz
/GuestPort)r?   rx   rw  r   r  r   rb  r  adapterTyper   slotrN  r   r   )r   r  rS   
adapterNumhostPort	guestPortprotor   adapterr  profile_nameconfigs               r   portForwardCmdr    sN   
4yA~HIc4 Dt|T!WJ47|HDGIE(m..tD.IG??D$$Z0G g&9&9:K9S]*3.s9~=L${2S8Fc',,''*::\IFf{*E2f{*CM:f|+S^<r   c                 >   t        |      dk  rt        d       yt        | |      }|d k(  ryd}t        |      dkD  r|d   }d}	 |j                  ||d      }t        |      dk(  r	 yt        j
                  j                  t        |             |t        |      z  }Z)Nr  zusage: showLog vm <num>r   r  )r?   rx   rw  readLogrz   r{   rV  r   )r   r  rS   loguOffsetr  s         r   
showLogCmdr    s    
4y1}'(c4 Dt|
C
4y1}1gG
||C$/t9>
  	

T#3t9 r   c           	         t        |      dk  rt        d       yt        | |      }|d k(  ryd}t        |      dkD  r|d   }|d   }d}	 |j                  ||d      }t        |      dk(  r	 yt	        |      j                  d      }|D ]U  }t        j                  ||      }	t        |	      dkD  s(|	D ]  }
|j                  |
t        |
d            }  t        |       W |t        |      z  })Nr  zusage: findLog vm pattern <num>r   r     rN  r   )
r?   rx   rw  r  r   r>   rE   rp  replacer   )r   r  rS   r  patternr  r  dro   rx  mts              r   
findLogCmdr    s    
4y1}/0c4 Dt|
C
4y1}1g1gGG
||C(3t9>  IOOD! 	AJJw*E5zA~ :B		"gb%&89A:a	 	3t9 r   c                    t        |      dk  rt        d       yt        | |      }|d k(  ryd}t        |      dkD  r|d   }d}t        j                  d      }d}d}	 |j                  ||d      }t        |      dk(  r	 yt        |      j                  d      }	|	D ]L  }
|rt        |
       |dk(  rd}n|d	z
  }|j                  |
      }t        |      dkD  s>d}d
}t        |
       N |t        |      z  })Nr  zusage: findAssert vm <num>r   z(Expression:|\!\!\!\!\!\!)FTr  rN  rt   2   )	r?   rx   rw  rE   rk  r  r   r>   rp  )r   r  rS   r  r  ererH  contextr  r  ro   rx  s               r   findAssertCmdr    s   
4y1}*+c4 Dt|
C
4y1}1gG
**2
3CFG
||C(3t9>" ! IOOD! 	Aaa<"F%kGKKNE5zA~a	 	3t9' r   c                     dj                  |dd        }	 t        |       y# t        $ r0}t        | |       t        rt        j                          Y d }~yd }~ww xY w)Nr,   rt   r   )rB   r   rI   rJ   rK   rL   rM   )r   r  rI  rT   s       r   evalCmdr    sV    88DHD"T

 	  "a!	"s   " 	A&AAc                 X    t        | t        t        |              t        t        |        yr`  )checkUserExtensionsr  getHomeFolderrl   r_  s     r   reloadExtCmdr    s     X}S'9:8S!r   c                    t        |      dk7  rt        d       y	 t        |d   d      }	 |j	                         }d| d<   d	| d
<   | d   t        |      k  r<|| d      }| d   dz   | d<   t        | |      }|dk7  s| d
   rn| d   t        |      k  r<|j                          y# t        $ r}t        d|d   d|       Y d }~yd }~ww xY w# t        $ r0}t        | |       t        rt        j                          Y d }~ld }~ww xY w)Nr  zusage: runScript <script>r   rt   rc  zcannot open:r  
scriptLineFrv   )r?   rx   rY  IOError	readlines
runCommandrI   rJ   rK   rL   rM   r]  )r   r  lfrT   linesrW  dones          r   runScriptCmdr    s   
4yA~)*$q'3
"L K,#e*,\*+D #L 1A 5Cc4(DqyC, ,#e*, HHJ)  nd1gsA.  "a!"s/   B$ A&C $	C-CC	D&C??Dc                     t        |      dk7  rt        d       y	 t        j                  t	        |d                y#  Y yxY w)Nr  zusage: sleep <secs>r   rt   )r?   rx   rC  rn  ro  r_  s     r   sleepCmdr  8  sD    
4yA~#$

5a>" s	   !> Ac                     t        |      dk  rt        d       ydj                  |dd        }	 t        j                  |       y# t
        $ r Y yw xY w)Nr  zusage: shell <commands>r   r,   rt   )r?   rx   rB   r<   re   r   )r   r  r  s      r   shellCmdr  E  sY    
4y1}'(
((48
C
		#   s   A 	AAc                    t        |      dkD  rt        d       y| d   t        d       yt        |      dkD  r|d   }nd }t        |      dkD  r|d   }nd}t        |      d	kD  r|d	   }nd}|||g| d
<   | d   j                  j                  |||      | d<   	 t        d| d   j                  z         | d   j                  | d         | d<   y# t
        $ r0}t        | |       t        rt        j                          Y d }~Od }~ww xY w)Nr  z&usage: connect url <username> <passwd>r   r   z&Already connected, disconnect first...rt   r  r[   r  wsinfors   Running VirtualBox version %sr   )r?   rx   rd   connectrg  rI   rJ   rK   rL   rM   getPerfCollectorr   r  urlr  r  rT   s         r   
connectCmdr  S  s   
4y1}67
4y67
4y1}1g
4y1}Aw
4y1}a$'CMH&&..sD&ACI"-T1B1BCD
 h-00T;CK  "a!"s   C 	D	&DD	c                     t        |      dk7  rt        d       y| d   t        d       y	 | d   j                  j                          d | d<   y#  d | d<    xY w)Nrt   zusage: disconnectr   r   zNot connected yet.rs   )r?   rx   rd   
disconnectr_  s     r   disconnectCmdr  v  sk    
4yA~!"
4y"#H))+
 CID	s   A Ac                    | d   t        d       y	 | d   j                  j                          | d   \  }}}| d   j                  j                  |||      | d<   	 t        d| d   j                  z         | d   j                  | d         | d<   y#  Y gxY w# t
        $ r0}t        | |       t        rt        j                          Y d }~Vd }~ww xY w)Nr  zNever connected...r   rs   r   r  r   )rx   rd   r  r  rg  rI   rJ   rK   rL   rM   r  r  s         r   reconnectCmdr    s    
8}"#H))+ h-S$H&&..sD&ACI"-T1B1BCD
 h-00T;CK  "a!"s#   B B B	C#&CCc                    t        |      dk  rt        d       yt        | |      }|y|d   }t        |      dkD  r|d   }nd}t        |      dkD  r|d   }nd}| d   j                         }|j	                  |      }|j                  | d	   j                  j                  |d
       |j                  ||      }t        | |      r*t        |j                        dk(  rt        d|d|       yt        | |       y)Nr  z3usage: exportVm <machine> <path> <format> <license>r   r  zovf-1.0r  GPLr   rs   r[   zExported to z in format )r?   rx   rw  createApplianceexportaddDescriptionr   $VirtualSystemDescriptionType_LicenserV  r   r   r   r   )	r   r  rS   r=   fmtlicappdescr   s	            r   exportVMCmdr    s    
4y1}CDc4 D|7D
4y1}1g
4y1}1g
d)
#
#
%C;;sDH//TTVY[]^yyd#HC"s8+>+>'?1'DtS9:  	C"r   rh     rj  0   rQ   .   r      rT      r  !   g"   r  #   r     j$   rf  %   l&   rg  r  n1   o   rd     q   rc     ro      re     u   r,  /   r      r   -   r      r   ,   0   ri  r  2r  3r  4rx  5   6   7   	   r   9               '   (   3   4   5   r      )   )89r,   -=[ry  ;r  ,.r&   	rN  `ESCrt   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                     t         j                  | d      }|dk7  r|gS t        j                  | g       }t        |      dk(  rt	        d|        |S )Nr   zbad ext)r  r   extScancodesr?   rx   )chr  extCodes      r   keyDownrl    sM    ==S!Dqyvr2&G
7|qiNr   c                 p    t        |       d d  }t        |      dkD  r|t        |      dz
  xx   dz  cc<   |S )Nr   rt      )rl  r?   )rj  r|  s     r   keyUpro    s7    BKNE
5zA~c%jlt#Lr   c                    g }d}d}d}| j                   }|t        |      k  rj||   }|dz   }|dk(  rd}!|dk(  r&|D ]  }	|j                  t        |	              g }d}L|dk(  rt	        j
                  d       g|d	k(  s|d
k(  s
|dk(  s|dk(  r!|d	k(  rd}|d
k(  rd}|dk(  rd}|dk(  rd}|sed}nb|dk(  r |t        |      k  rM||   }|dz   }|dk(  r>d}n;|dk(  r6d}
|t        |      k  r$||   }|dz   }|dk(  rn|
|z  }
|t        |      k  r$|
}d}|j                  t        |             |j                  d|       |s'|r%|D ]  }	|j                  t        |	              g }d}t	        j
                  |       |t        |      k  riy y )NFTr   rt   {}Wg333333?^|$r  r@  r+  rC  r<  \r  rN  &r[   r  )r[  r?   rq  ro  rC  rn  rl  r  )r   r#   delaypressedgroupmodGroupEndr  rw  rj  rQ   combos              r   typeInGuestr~  $  s   GEK	A


C
c$i-!WaC9E9 +  q*+GE9JJsO#I")rSyB#ISySySySy#Tzs4y=aB!ASy!s3t9naB!ASyRKE 3t9n K%q" +  q*+GK

5k c$i-r   c                     t        |      dk  rt        d       yt        | |      }|y|d   t        |      dkD  rt        |d         ndfdg}t	        | |d|       y)Nr  z-usage: typeGuest <machine> <text> <charDelay>r   r  r  c                     t        |      S r   )r~  )r   rS   r   r  ry  r#   s       r   r  ztypeGuestCmd.<locals>.<lambda>p  s    k'4.O r   r	  r{  )r   r  rS   r  ry  r#   s       @@r   typeGuestCmdr  a  sm    
4y1}=>c4 D|7D
4y1}d1gOPE#t]E2r   c                     | rd|z   S y)Nr   r[   rY   )verboser   s     r   optIdr  u  s    Dyr   c                 8    |rt        |       dz  S t        |       S )Ni   )r   )r  inBytess     r   asSizer  {  s    3x##3xr   c                 l   t        |      dkD  rt        |d         }nd}| d   j                  | d   d      }t        t	        | d             |D ]  }|j
                  | d   j                  j                  k7  r|j                          t        dt        | |j                        d|j                  d	t        ||j                        d
t        | t        |j                   d            dt        | t        |j"                  d            d        | d   j                  | d   d      }t        t	        | d             |D ]  }|j
                  | d   j                  j                  k7  r|j                          t        dt        | |j                        d|j                  d	t        ||j                        d
t        | t        |j                   d                    | d   j                  | d   d      }t        t	        | d             |D ]  }|j
                  | d   j                  j                  k7  r|j                          t        dt        | |j                        d|j                  d	t        ||j                        d
t        | t        |j                   d                    y)Nrt   Frs   r   	hardDiskszHard disks:z   r  r  r,   Tz
 [logical ry  	DVDImageszCD/DVD disks:floppyImageszFloppy disks:r   )r?   r   r   rx   r   r$   r   MediumState_CreatedrefreshStater   r  r  r  rH   r   r  r  logicalSize)	r   r  r  hddshdddvdsdvdfloppysfloppys	            r   listMediaCmdr    s   
4y1}d1g,x=!!#d)[9D	&m
$% F99H//CCCS\\0JCJJX]^egjgmgmXnpxy|  E  FI  FN  FN  PT  U  qV  X`  ad  fl  mp  m|  m|  ~B  fC  XD  E  	FF
 x=!!#d)[9D	&o
&' K99H//CCC73#=szz5QXZ]Z`Z`Kackloqwx{  yA  yA  CG  rH  dI  J  	KK
 (m$$SY?G	&o
&' W<<3x=22FFF!73#@&--QVW^`f`i`iQjltux  {A  BH  BM  BM  OS  {T  mU  V  	WW
 r   c                     t        |      dkD  rt        d       y| d   j                  }| d   j                  |d      D ]  }t	        | |        y)Nrt   zusage: listUsbr   r   rs   r  )r?   rx   r  r   r  )r   r  r  r  s       r   
listUsbCmdr    sU    
4y1}t9>>D(m$$T<8 !R ! r   c                     | d   j                  |d      }|D ]6  }|j                  |k(  s|j                  |j                  |j                  gc S  g dS )Nrs   r  )Nr   r   )r   r  r  r  r  )r   rS   devtypeattsrh  s        r   findDevOfTyper    sU    x=!!$(;<D 466WLL!&&!((334 r   c                 ,   t        |      dk  rt        d       yt        |d         }|d   }t        |      dkD  r|d   }nd}| d   j                  ||| d   j                  j
                  | d   j                  j                        }|j                  || d   j                  j                  f      }t        | |      r<|j                  r0t        d	t        | |j                        d
|j                         yt        d|z         t        | |       y)Nr  z$usage: createHdd sizeM location typer   rt   r  vdir   rs   zcreated HDD at r  z#cannot create disk (file %s exist?))r?   rx   r   createMediumr   AccessMode_ReadWriter  createBaseStorageMediumVariant_Standardr   rH   r   r  r   )r   r  r  locr  r  r   s          r   createHddCmdr    s   
4y1}45tAw<D
q'C
4y1}1g
d)
 
 c3x=+B+B+W+WY\]eYfYpYp  ZE  ZE  FC$$TCM,C,C,Z,Z+]^H3x SVV73s||+DcffMN 	 2c:;3x r   c                    t        |      dk  rt        d       y| d   }|d   }d}d}d}d}|j                  || d   j                  j                  | d   j                  j
                  d      }t        d	|j                  z         y)
Nr  zusage: registerHdd locationr   r   rt   Fr[   rs   zregistered HDD as %s)r?   rx   
openMediumr   r  r  rH   )	r   r  r   r  
setImageIdimageIdsetParentIdparentIdr  s	            r   registerHddCmdr    s    
4y1}+,t9D
q'CJGKH
//#s8}66JJCPXMLcLcLxLxz  AC	
 CFF
+,r   c                 >    |\  }}}}}|j                  |||||       y r   )attachDevice)r   rS   r  ctrr  r  r  r   s           r   controldevicer    s(    '+$S$gtc4w5r   c                    t        |      dk  rt        d       yt        | |      }|y| d   }|d   }	 |j                  || d   j                  j
                  | d   j                  j                  d      t        |      dkD  r|d   |d	   j                  d
      \  n(t        | || d   j                  j
                        \  t        | |fd       y#  t        d|z         Y yxY w)Nr  z,usage: attachHdd vm hdd controller port:slotr   r   r  rs   Fno HDD with path %s registeredr  r  c                 p    |j                  | d   j                  j                  j                        S r=  )r  r   r  rH   )r   rS   r  r  r  r  r  s      r   r  zattachHddCmd.<locals>.<lambda>  sL    43D3DS$PTVYZbVcVmVm  WB  WB  DG  DJ  DJ  4K r   )
r?   rx   rw  r  r   r  r  r>   r  r   )	r   r  rS   r   r  r  r  r  r  s	        @@@@r   attachHddCmdr    s   
4y1}<=c4 D|t9D
q'Cooc3x=#:#:#N#NPST\P]PgPgP|P|  D  E 4y1}1gAw}}S)t)#tS]5L5L5`5`adDT  K  L.#67   AC" "C4c                     | d   j                  |d      }|d   }|D ]_  }|j                  s|dk(  s|j                  j                  |k(  s/|j                  |j                  |j
                  |j                         a y )Nrs   r  r   r   )r   r  rH   detachDevicer  r  r  )r   rS   r  r  hidrh  s         r   r   r     sn    x=!!$(;<D
q'C B88e|qxx{{c1!!!,,ABr   c                 >    t        | t        | |      t        |g       y r   )r   r  r   )r   midr  s      r   detachMediumr    s    Xc3'&Br   c                 H   t        |      dk  rt        d       yt        | |      }|y| d   }|d   }	 |j                  || d   j                  j
                  | d   j                  j                  d      }t        | |j                  |       y#  t        d|z         Y yxY w)	Nr  zusage: detachHdd vm hddr   r   r  rs   Fr  )	r?   rx   rw  r  r   r  r  r  rH   )r   r  rS   r   r  r  s         r   detachHddCmdr    s    
4y1}'(c4 D|t9D
q'Cooc3x=#:#:#N#NPST\P]PgPgP|P|  D  E
 dggs#.#67   AB B!c                    t        |      dk  rt        d       y| d   }|d   }t        |      dkD  rt        |d         }nd}	 |j                  || d   j                  j
                  | d   j                  j                  d      }|dk7  r9| d   j                  |d	      }	 |D ]  }t        d
|z         t        | ||        	 |j                          y#  t        d|z         Y yxY w# t        $ r}t        d|       Y d }~yd }~ww xY w)Nr  z#usage: unregisterHdd path <vmunreg>r   r   rt   rs   Fr  
machineIdszTrying to detach from %szfailed: )r?   rx   r   r  r   r  r  r   r  rI   r]  )	r   r  r   r  vmunregr  machsrS   rT   s	            r   unregisterHddCmdr  	  s   
4y1}34t9D
q'C
4y1}d1g,ooc3x=#:#:#N#NPST\P]PgPgP|P|  D  E
 !|H&&sL9	 -0D9:S$,- IIK.#67  	*a 	s%   AC ""C+ C(+	D
4DD
c                 4   t        |      dk7  rt        d       y| d   }|d   }	 |j                  || d   j                  j                  | d   j                  j
                  d      }|j                         }t        | |       y#  t        d|z         Y yxY w)	Nr  zusage: removeHdd pathr   r   rt   rs   Fr  )r?   rx   r  r   r  r  deleteStorager   )r   r  r   r  r  r   s         r   removeHddCmdr  ,	  s    
4yA~%&t9D
q'Cooc3x=#:#:#N#NPST\P]PgPgP|P|  D  E
   "HX.#67s   AB Bc                     t        |      dk  rt        d       y| d   }|d   }|j                  || d   j                  j                  | d   j                  j
                  d      }t        d|j                  z         y)	Nr  zusage: registerIso locationr   r   rt   rs   Fzregistered ISO as %s)r?   rx   r  r   r  AccessMode_ReadOnlyrH   )r   r  r   r  isos        r   registerIsoCmdr  >	  su    
4y1}+,t9D
q'C
//#s8}66EEs8}G^G^GrGrty
zC	
 CFF
+,r   c                 L   t        |      dk7  rt        d       y| d   }|d   }	 |j                  || d   j                  j                  | d   j                  j
                  d      }|j                         }t        d	t        | |      z         y#  t        d|z         Y yxY w)
Nr  zusage: unregisterIso pathr   r   rt   rs   Fno DVD with path %s registeredzUnregistered ISO at %s)r?   rx   r  r   r  r  r]  r   r   r  r   r  r  r   s         r   unregisterIsoCmdr  I	  s    
4yA~)*t9D
q'Cooc3x=#:#:#I#I3x=KbKbKvKvx}~
 yy{H	
"gc3&7
89.#67s   AB B#c                    t        |      dk7  rt        d       y| d   }|d   }	 |j                  || d   j                  j                  | d   j                  j
                  d      }|j                         }t        | |      r#t        d	t        | |j                        z         yt        | |       y#  t        d|z         Y yxY w)
Nr  zusage: removeIso pathr   r   rt   rs   Fr  zRemoved ISO at %s)r?   rx   r  r   r  r  r  r   r   r  r   r  s         r   removeIsoCmdr  [	  s    
4yA~%&t9D
q'Cooc3x=#:#:#I#I3x=KbKbKvKvx}~
   "H3!!WS#,,%?@A  	C".#67s   AB4 4Cc                    t        |      dk  rt        d       yt        | |      }|y| d   }|d   }	 |j                  || d   j                  j
                  | d   j                  j                  d      t        |      dkD  r|d   |d	   j                  d
      \  n(t        | || d   j                  j
                        \  t        | |fd       y#  t        d|z         Y yxY w)Nr  z,usage: attachIso vm iso controller port:slotr   r   r  rs   Fr  r  r  c                 \    |j                  | d   j                  j                        S r=  )r  r   r  )r   rS   r  r  r  r  r  s      r   r  zattachIsoCmd.<locals>.<lambda>	  s6    43D3DS$PTVYZbVcVmVmV|V|  B  4C r   )
r?   rx   rw  r  r   r  r  r>   r  r   )	r   r  rS   r   r  r  r  r  r  s	        @@@@r   attachIsoCmdr  o	  s    
4y1}<=c4 D|t9D
q'Cooc3x=#:#:#I#I3x=KbKbKvKvx}~ 4y1}1gAw}}S)t)#tS]5L5L5[5[\dDT  C  D.#67r  c                 H   t        |      dk  rt        d       yt        | |      }|y| d   }|d   }	 |j                  || d   j                  j
                  | d   j                  j                  d      }t        | |j                  |       y#  t        d|z         Y yxY w)	Nr  zusage: detachIso vm isor   r   r  rs   Fr  )	r?   rx   rw  r  r   r  r  r  rH   )r   r  rS   r   r  r  s         r   detachIsoCmdr  	  s    
4y1}'(c4 D|t9D
q'Cooc3x=#:#:#I#I3x=KbKbKvKvx}~
 dggs#.#67r  c           
         t        |      dk  rt        d       yt        | |      }|y| d   }|d   }	 |j                  || d   j                  j
                  | d   j                  j                  d      }t        |      dkD  r|d   }|d	   j                  d
      \  }}n(t        | || d   j                  j
                        \  }}}t        | |d||||dg       y#  t        d|z         Y yxY w)Nr  z+usage: mountIso vm iso controller port:slotr   r   r  rs   Fr  r  r  r  T)
r?   rx   rw  r  r   r  r  r>   r  r  )	r   r  rS   r   r  r  r  r  r  s	            r   mountIsoCmdr  	  s    
4y1};<c4 D|t9D
q'Cooc3x=#:#:#I#I3x=KbKbKvKvx}~
 4y1}1gAw}}S)t *#tS]5L5L5[5[\dD#tZ#tT3)EF.#67s   AC C0c           
      ,   t        |      dk  rt        d       yt        | |      }|y| d   }t        |      dkD  r|d   }|d   j                  d      \  }}n(t	        | || d   j
                  j                        \  }}}t        | |d|||d d	g       y)
Nr  z)usage: unmountIso vm controller port:slotr   r   r  r  rs   r  T)r?   rx   rw  r>   r  r   r  r  )r   r  rS   r   r  r  r  s          r   unmountIsoCmdr  	  s    
4y1}9:c4 D|t9D
4y1}1gAw}}S)t *#tS]5L5L5[5[\dD#tZ#tT4)FGr   c                 N    |\  }}}|j                  ||      }|d k7  r||_        y y r   )addStorageControllerr  )r   rS   r  rG   r  ctrltyper  s          r   	attachCtrr  	  s5     T3

#
#D#
.C4% r   c                 @   t        |      dk  rt        d       yt        |      dkD  r't        | d|d         }|d k(  rt        d|d   z         yd }t        | |      }|yt        | d|d         }|t        d|d   z         y|d	   }t	        | |t
        |||g       y)
Nr  z$usage: attachCtr vm cname bus <type>r   r  zController type %s unknownr  r  zBus type %s unknownr  )r?   rx   r  rw  r   r  )r   r  r  rS   r  rG   s         r   attachCtrCmdr  	  s    
4y1}45
4y1}!#'>QHt.$q':;c4 D|
lDG
4C
{#tAw/07DT9tS(&;<r   c                     t        |      dk  rt        d       yt        | |      }|y|d   t        | |fd       y)Nr  zusage: detachCtr vm namer   r  c                 &    |j                        S r   )removeStorageController)r   rS   r  r  s      r   r  zdetachCtrCmd.<locals>.<lambda>	  s    43O3OPS3T r   )r?   rx   rw  r   )r   r  rS   r  s      @r   detachCtrCmdr  	  sG    
4y1}()c4 D|
q'CTTUr   c                 b    |d   r|j                  |d   d       y |j                  |d          y )Nr   rt   r[   )attachUSBDevicedetachUSBDevicer   rS   r   r  s       r   usbctrr  	  s/    AwQ,Q(r   c                     t        |      dk  rt        d       yt        | |      }|y|d   }t        | |dt        d|g       y)Nr  zusage: attachUsb vm deviceuidr   r  r	  Tr?   rx   rw  r  r  r   r  rS   devs       r   attachUsbCmdr  	  sN    
4y1}-.c4 D|
q'C#t]VT3,?@r   c                     t        |      dk  rt        d       yt        | |      }|y|d   }t        | |dt        d|g       y)Nr  zusage: detachUsb vm deviceuidr   r  r	  Fr  r  s       r   detachUsbCmdr  
  sN    
4y1}-.c4 D|
q'C#t]VUC,@Ar   c                     t        |      dkD  rt        d       y| d   j                         }t        j                  j                  |d      }	 t        j                  |       y# t        $ r Y yw xY w)Nrt   z
usage: guir   rs   
VirtualBox)r?   rx   	getBinDirr<   r=   rB   re   r   )r   r  binDirr   s       r   guiCmdr  
  sj    
4y1}l]$$&F77<<-D
		$   s   A% %	A10A1c                    t        |      dk  rt        d       yt        | |      }|y|d   |d   dd}t        |      dkD  r|dd  D ]  }|dk(  rd|d	k(  sd} |rt        | |fd
g        yt	        | |dfdg       y)Nr  z7usage: shareFolder vm path name <writable> <persistent>r   r  r  Fr  T
persistentc                 *    |j                        S r   createSharedFolder)r   rS   r  rG   r=   r  s      r   r  z shareFolderCmd.<locals>.<lambda>4
  s    t7N7NtUY[c7d r   r	  c                 *    |j                        S r   r  )r   rS   r   r  rG   r=   r  s       r   r  z shareFolderCmd.<locals>.<lambda>6
  s"    RYRlRlmqsw  zB  SC r   )r?   rx   rw  r   r  )r   r  rS   r  rh  rG   r=   r  s        @@@r   shareFolderCmdr  !
  s    
4y1}GHc4 D|7D7DHJ
4y1}ab 	"AJL !
		"
 Cdfhi  	c4  2C  1D  	Er   c                 
   t        |      dk  rt        d       yt        | |      }|y|d   d}| d   j                  |d      D ]&  }|j                  k(  st        | |fdg        d	} n |st        | |d
fdg       y)Nr  zusage: unshareFolder vm namer   r  Frs   r  c                 &    |j                        S r   removeSharedFolder)r   rS   r  rG   s      r   r  z"unshareFolderCmd.<locals>.<lambda>E
  s    4;R;RSW;X r   Tr	  c                 &    |j                        S r   r  )r   rS   r   r  rG   s       r   r  z"unshareFolderCmd.<locals>.<lambda>I
  s    RYRlRlmqRr r   )r?   rx   rw  r   rG   r   r  )r   r  rS   foundr  rG   s        @r   unshareFolderCmdr   9
  s    
4y1},-c4 D|7DE(m$$T?; 77d?T#XZ\]E	
 c41r0str   c                    t        |      dk  s|d   dk(  r"t        d       t        d       t        d       yt        | |      }|y|d   }|dk(  rGt        |      d	k  rt        d
       y|d   t        |      d	kD  r|d	   ndt        | |fd       y|dk(  rAt        |      d	k  rt        d       y|d   |j	                        t        | |fd       y|dk(  r;t        |      d	k  rt        d       y|j                         t        | |fd       y|dk(  rAt        |      d	k  rt        d       y|d   |j	                        t        | |fd       yt        d|z         y)Nr  rt   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>r  r[   c                 D    t        | |j                  d      d         S )NTr   )r   takeSnapshot)r   rS   r   r  r  rG   s       r   r  zsnapshotCmd.<locals>.<lambda>a
  s&    [dN_N_`dfjlpNqrsNt=u r   restorezusage: snapshot vm restore namec                 :    t        | |j                              S r   r   restoreSnapshotr   rS   r   r  snaps       r   r  zsnapshotCmd.<locals>.<lambda>j
      [dNbNbcgNh=i r   restorecurrentz!usage: snapshot vm restorecurrentc                 :    t        | |j                              S r   r  r	  s       r   r  zsnapshotCmd.<locals>.<lambda>r
  r  r   deletezusage: snapshot vm delete namec                 N    t        | |j                  j                              S r   )r   deleteSnapshotrH   r	  s       r   r  zsnapshotCmd.<locals>.<lambda>{
  s     [dNaNabfbibiNj=k r   zCommand '%s' is unknown)r?   rx   rw  r  findSnapshotcurrentSnapshot)r   r  rS   r  r  rG   r
  s       @@@r   snapshotCmdr  M
  s   D	AaF*EF:;89c4 D|
q'C
f}t9q=>?Awt9q=7DDduv
it9q=34Aw  &dij
t9q=56##%dij
ht9q=23Aw  &dkl	
#s
+,r   c                    dddd}t        |      dk(  rdd}d}t        |j                               D ]?  \  }}	|dk(  rd}n|dz  }t        |j                        |	z  r||dd	z  }6||dd
z  }A d|gfS d|_        d|vrpt        dt        |            D ]X  }
||
   |vr,t        d||
   z          t        t        j                          yt        |j                        |||
      z  |_        Z y)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
    rt   r  r  )r  	proxyonly	sameportsr   r[   , r   r   r   defaultzInvalid alias mode: rt   Nr   N)	r?   r^   r_   r   	aliasModer  rx   natAlias__doc__)r   rS   nicnumnatr  aliasfirstmsg	aliasmodealiaskeyrh  s              r   r  r  
  s    E
 4yA~#'#6 	5Ixzt3==!H,9d339e44	5 C5zD 1c$i( D7%'047:;(**+$ #CMM 2U47^ CD r   c                    t        |      dk(  rP|j                         \  }}}}}	|dk(  rd}|dk(  rd}|dk(  rd}|dk(  rd}|	dk(  rd}	d|d|d|d|d|	d	}
d|
gfS |d   d
k  rt        d|d   z         yt        dt        |            D ]L  }||   j	                         r#t        ||         dk  st        ||         dkD  s9t        d|||   fz          y |d   g}t        |      dk  rZt        dt        |            D ]  }|j                  ||           t        t        |      d      D ]  }|j                  d        n.t        dt        |            D ]  }|j                  ||           |j                  t        |d         t        |d         t        |d         t        |d         t        |d                y)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
    rt   r   i  rS  zmtu:z socket(snd:z, rcv:z) tcpwnd(snd:r  i>  z0invalid mtu value (%s not in range [65 - 16000])r  r  r  i   z/invalid %s parameter (%i not in range [8-1024])r  r  r  r  )r?   getNetworkSettingsrx   r  isdigitr   rA   setNetworkSettings)r   rS   r  r  r  mtu
socksndbuf
sockrcvbuf	tcpsndwnd	tcprcvwndr"  r  rh  s                r   natSettingsr.  
  s    4yA~>A>T>T>V;j*i!84S?J?J>r9>r9HKZYcenpyzC5z7U?DQPQq#d)$ 	!A7??$DGq(8CQL4<OG1dSTg,VW 	! !WIt9q=1c$i(;!((47*;;3t9a(5!((1+51c$i(;!((47*;;s1Q4y#ad)S1YAaD	3qQRt9Ur   c           	         ddd}t        |      dk(  rRd|t        |j                           d|t        |j                           d|t        |j                           }d|gfS d	|v |_        d
|v |_        d|v |_        y)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   rt   rt   zpassdomain:z, proxy:z, usehostresolver:r   
passdomainproxyusehostresolverr  )r?   r   DNSPassDomainDNSProxyDNSUseHostResolver)r   rS   r  r  r  yesnor"  s          r   natDnsr8  
  s     $E
4yA~?DSIZIZE[?\^cdghkhthtdu^vx}  B  CF  CY  CY  Z  y[  \C5z(D0$!2d!:r   c                    t        |      dk(  r|j                  }||j                  }|dt        |      dz   z  }|j	                  d      \  }}|j                  d      dk7  r|dz  }|j                  d      dk7  r|j	                  d      \  }}}	}
d|||	fz  }|j                  }|d	| d
   j                  z  }|j                  }|d|j                  z  }d|d|d|}d|gfS |d   }t        |      dk7  r&t        d|       t        t        j                         y|dk(  r|d   |_        y|dk(  r|d   |_        y|dk(  r|d   |_        yt        d|       y)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
    rt   z
10.0.%d/24r  r&   r   r  z.0z
%d.%d.%d.4z%s/TFTP/r   z%s.pxezserver:z	, prefix:z, bootfile:r   zinvalid args:r  prefixbootfileserverzinvalid cmd:r  )r?   TFTPNextServernetworkr   r>   count
TFTPPrefix
homeFolderTFTPBootFilerG   rx   natTftpr  )r   rS   r  r  r  r<  maskrh  rj  rQ   r  r:  r;  r"  r  s                  r   rC  rC  
  s    4yA~##>[[F~%Vq9#\\#.NVT,,s#q($ ,,s#q(!<<,LQ1a!Q1I-F>3t9#7#78F##499-H5;VXNC5z 1gt9>/4('//"(?T!WCN  J47 0
 	 H_47c0  .#&r   c                     t              dk(  rvdddg }| d   j                  d      }|D ]Q  }t        |      j                  d      \  }}	}
}}}|j	                  |dt        |	         d	|
d
|d|d
|       S d|fS dddfdfddfdfddfdfddfdfddd d      d          s)t        dd          t        t        j                         y d      d          }y)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>]
    rt   udptcpr0  rs   	redirectsr  r   r,   r  z => r   )rF  rG  c                       d   t        j                               v xr.  d   t        j                               v xr t               dk(  S )Nrt   r  rx  r^   r  r?   r  pfcmdr  s   r   r  z#natPortForwarding.<locals>.<lambda>  K    DGtEJJL/A$A$vd1gQUV[V`V`VbQcFc$vhklphquvhv r   c                  l    j                  d d      dt         d         dt         d               S )Nr[   r  r  r  addRedirectr   r  r  r  s   r   r  z#natPortForwarding.<locals>.<lambda>  s9    sr5a>2s4PQ7|UWY\]abc]dYef r   )validatefuncc                       d   t        j                               v xr.  d   t        j                               v xr t               dk(  S )Nrt   r  r	  rJ  rK  s   r   r  z#natPortForwarding.<locals>.<lambda>  rM  r   c                  x    j                  d d       d   t         d          d   t         d               S )Nr[   r  r  r  rx  r  rO  rQ  s   r   r  z#natPortForwarding.<locals>.<lambda>  sE    E$q'NDGSQUVWQX\[_`a[bdghlmnhodp q r   c                       d   t        j                               v xr.  d   t        j                               v xr t               dk(  S )Nrt   r  r  rJ  rK  s   r   r  z#natPortForwarding.<locals>.<lambda>  rM  r   c                  ~    j                   d    d       d   t         d          d   t         d               S )Nr  r  r  rx  r  r	  rO  rQ  s   r   r  z#natPortForwarding.<locals>.<lambda>   sK    QtAwaRUVZ[\V]R^`def`gilmqrsmtiu v r   c                       t               dk(  S Nr  r?   r  s   r   r  z#natPortForwarding.<locals>.<lambda>#  s    CIN r   c                  ,    j                   d         S Nr  )removeRedirect)r  r  s   r   r  z#natPortForwarding.<locals>.<lambda>$  s     2 247 ; r   )r   no_nameexr  rR  z/invalid port-forwarding or args of sub command r  rS  r  )	r?   r   r   r>   rA   r   rx   natPortForwardingr  )r   rS   r  r  r  r"  pfspfpfnmepfppfhippfhppfgippfgprh  rL  r  s      ``          @@r   ra  ra    s.    4yA~e$(m$$S+6 	eB58W]]45H2UCeTJJ%s3x%QUW\^bcd	e 3x!$ wf
 wq
 wv
 3;
& *uT!W~j)+CT!WM#++,"E$q'N6"$r   c                    t        |      dk(  rS|j                  1t        t        |j                              dk7  rd|j                  z  }ndt        |      dz   z  }d|gfS |d   j	                  d      \  }}|j                  d      dkD  st        |      dk  st        |      d	kD  rt        d
       y|d   |_        y)zdThis command shows/alters NAT network settings
    usage: nat <vm> <nicnum> network [<network>]
    rt   r   z'%s'z10.0.%d.0/24r  r&   r   r  r  zInvalid argumentsr  r  )r?   r>  r   r   r>   r?  rx   )r   rS   r  r  r  r"  addrrD  s           r   
natNetworkrl  0  s     4yA~;;"s3s{{+;'<'Ackk*C CK!O4CC5zAw}}S)t::c?Q#d)a-3t9r>%&1gr   c           	         t         t        t        t        t        t
        d}t        |      dk  s|d   dk(  rDt        |      dkD  rt        ||d      j                         yt        t        j                         yt        |      dk(  st        |      dk  s|d   |vrt        t        j                         y | d   |      }|d	k(  rt        d
       yt        |      dk  s\|d   j                         rIt        |d         t        t        d| d   j                  j                  |j                                     vr:t        d|d   | d   j                  j                  |j                         fz         yt        |d         }g }t        dt        |            D ]  }|j#                  ||           |d   }d}d	}	t        |      dkD  r$d}| d   j%                  |d      }	|	j&                  }|j)                  |      }
|
j*                  } ||   | ||||      \  }}|dk(  r&|dk(  r|j-                          |	j/                          y|%|D ]   }d|j0                  |||fz  }t        |       " y)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>
    )r   settingstftpdnsrc  r>  r  rt   r.   r   r  r  rw  Nplease specify vmr   3please specify adapter num %d isn't in range [0-%d]rs   Fr  z%s nic%d %s: %s)r  r.  rC  r8  ra  rl  r?   rx   r  natCmdr'  r   r^   r  r[  r\  r]  rA   r  r   rb  	NATEnginer   r   rG   )r   r  natcommandsrS   r  cmdargsr  rS  	rosessionr   r  	natEnginercreportrc  r"  s                   r   rs  rs  B  s     K 4y1}Q6)t9q=+d1g&../  &..!
4yA~TQ$q'*Dfnn3|T"Dt|!"
4y1}DGOO-T!WT%PQSVW[S\SmSm  TD  TD  EI  EU  EU  TV  KW  FX  2XDQQTUYQZQkQk  RB  RB  CG  CS  CS  RT  HU  U  	Va\FG1c$i   tAw 
 7DIG
7|a	h-2242N$$V,G!!I$;t$S$	7KLRA~7
 	 
	 	A"diiq%AAC#J	 r   c                 
   t        |      dk(  r&ddd}|t        | j                  |               }d|fS ddd}|d   |vr+t        |d   dt	        |j                                      y| j                  |||d             y	)
Nrt   r   r   r0  r   )r   r   z! isn't acceptable, please choose r  r  )r?   r   __getattr__rx   r^   r  __setattr__)r  r0  r  r7  rc  s        r   nicSwitchOnOffr~    s    
4yA~d##g))$/011v1%7%d1gtEJJLGYZ[D%Q.1r   c                     t        |d|      \  }}t        |      dk(  r|dk(  r|d|j                  }d|fS t        |      dk(  r|dk(  r
|d   |_        y)z8
    usage: nic <vm> <nicnum> trace [on|off [file]]
    traceEnabledrt   r   z file:r  r  r  )r~  r?   	traceFile)r   rP  r  r  r  ry  rc  s          r   nicTraceSubCmdr    s`     Wnd;GR
4yA~"'w0011v	TaB!G Gr   c                     t        |      dk(  rd|j                  z  }d|fS |d   j                         st        d|d   z         yt	        |d         |_        y)Nrt   z%d kbpsr   z%s isn't a numberr  r  )r?   	lineSpeedr'  rx   r   )r   rP  r  r  r  rc  s         r   nicLineSpeedSubCmdr    s\    
4yA~))*1vAw &$q'23QLr   c                     t        |d|      S )z1
    usage: nic <vm> <nicnum> cable [on|off]
    cableConnectedr~  r   rP  r  r  r  s        r   nicCableSubCmdr    s     '#3T::r   c                     t        |d|      S )z2
    usage: nic <vm> <nicnum> enable [on|off]
    r  r  r  s        r   nicEnableSubCmdr    s     '9d33r   c                    t        |      dk(  rf| d   j                  d      }t        |j                               D ]5  }t	        |j
                        t	        ||         k(  s(dt	        |      fc S  y| d   j                  d      }|d   t        |j                               vr,t        |d   dt        |j                               d       y||d      |_        y)	z_
    usage: nic <vm> <nicnum> type [Am79c970A|Am79c970A|I82540EM|I82545EM|I82543GC|Virtio]
    rt   r  NetworkAdapterTyper   r   not in acceptable values (r  r  )r?   r  r^   r  r   r  rx   )r   rP  r  r  r  nictypesrh   s          r   nicTypeSubCmdr    s     4yA~w<**+?@( 	%C7&&'3x}+==3s8}$	% w<**+?@7$x}}//QhmmoAVWX&tAw/r   c                     t              dk(  r 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        k7  rt        j                        }nj                  }||   \  }}d	d
|d|fS fdd  fddfdd  fddfdfd fddfdfd fddfdfd fddfdd  fddd}d   t        |j!                               vr,t#        d   d t        |j!                               d!       y" |d      d#          st#        |j$                         y" |d      d$            |d      d%          _        y&)'zp
    usage: nic <vm> <nicnum> attachment [Null|NAT|Bridged <interface>|Internal <name>|HostOnly <interface>
    rt   rs   )Nullr[   )NATr[   BridgedInternalHostOnly)Genericr[   r   zattachment:z, name:c                       t               dk(  S r]  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>      SY!^ r   c                       yNz
do nothingrY   rY   r   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>      r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_Nullr   s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  s    S]44OO r   )r,  rd  r  c                       t               dk(  S r]  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                       yr  rY   rY   r   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_NATr  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  s    S]44NN r   c                       t               dk(  S rY  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                  .     j                  dd         S )NbridgedInterfacer  r}  r  r  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  s    W001CT!WM r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_Bridgedr  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>      S]44RR r   c                       t               dk(  S rY  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                  .     j                  dd         S )NinternalNetworkr  r  r  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  s    W001BDGL r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_Internalr  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>      S]44SS r   c                       t               dk(  S r]  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                  .     j                  dd         S )NhostOnlyInterfacer  r  r  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  s    W001Dd1gN r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_HostOnlyr  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                       t               dk(  S rY  rZ  r[  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                       yr  rY   rY   r   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   c                  6     d   j                   j                  S r=  )r   NetworkAttachmentType_Genericr  s   r   r  z%nicAttachmentSubCmd.<locals>.<lambda>  r  r   )r  r  r  r  r  r  r  r  r  r,  rd  r  r  )r?   r   r  r  r  r  r  r  r  r  r  r  attachmentTyper   r   r^   r  rx   r  )	r   rP  r  r  r  nicAttachmentTypere  rc  rd  s	   `  ``    r   nicAttachmentSubCmdr    s    4yA~M##>>M##=={M##AAIwOgOgChM##BBZQXQhQhDiM##BBZQXQjQjDkM##AA?
 &&'3.G**+A&&A"1%Aq!455 ,)OQ
 ,)NP
 ,MRT
 ,LSU
 ,NSU ,)RT-
6 7$055788QFWF\F\F^A_`a. a)#.0#++,'$q'"3')!@!247!;C!@!Br   c           	         t         t        t        t        t        t
        d}t        |      dk  s|d   dk(  st        |      dkD  rR|d   |vrKt        |      dk(  r#|d   |v rt        ||d      j                         yt        t        j                         y | d   |      }|t        d	       yt        |      dk  sIt        |d         t        t        d| d
   j                  j                  |j                                    vr:t        d|d   | d
   j                  j                  |j                        fz         yt        |d         }|dd }|d   }d}| d   j!                  |d      }|j"                  }|j%                  |      } ||   | ||||      \  }	}
|	dk(  r|j'                          |
t        d|j(                  ||d   |
fz         |j+                          y)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  r  rt   r.   r  r   rw  Nrq  r   rr  rs   Tr  z%s nic %d %s: %s)r  r  r  r  r  r  r?   rx   r  nicCmdr   r^   r  r[  r\  r]  r  r   rb  r   rG   r   )r   r  	niccomandrP  r  rv  rS  r   r  ry  rz  s              r   r  r    s	    * '!I 	D	A7fIMd1gY6t9>Aw)#)DG$,,-  &..!	\	4	 B	z!"
d)a-
d1g,d5CI,F,F,\,\]_]k]k,l#mn
nDtAwPSTXPYPjPj  QA  QA  BD  BP  BP  QQ  GR  R  	Sa\F12hG7DG(m..r$.GG	B""6*G"9T?3FGWELR	Qw
 BGGVT!Wf#EEFr   c                 T    t        |      dk  rt        d| d   z         y|d   | d<   y)Nr  zCurrent prompt: '%s'r   r   rt   )r?   rx   r_  s     r   	promptCmdr  -  s2    
d)a-$H67GCMr   c                     t        |      dk  rt        d       y|d   }|d   }t        | |      }	 |D ]  }|j                  |        	 y#  t        d       t	        j
                          Y yxY w)Nr  zZusage: foreach scope command, where scope is XPath-like expression //vms/vm[@CPUCount='2']r   rt   r  zError executing)r?   rx   ru  r4  rL   rM   )r   r  rq  r  elemsrT   s         r   
foreachCmdr  5  sz    
4y1}jkGE
q'CsE"E 	AGGCL	
  s   A !A/c                     t        |      dk  rt        d       y|dd  }|j                  dd       t        |       D ]  }|j                  |d<   t        | |        y)Nr  zforeachvm command <args>r   rt   r[   )r?   rx   r  rD   rH   runCommandArgs)r   r  rv  rS   s       r   foreachvmCmdr  E  sb    
4y1}()12hGNN1bC  %WW
sG$% r   c                     t        |      dk  rt        d       yt        | |      }|d k(  ry|d   dt        |      dkD  rt        |d         t	        | |dfdg       y)Nr  z(usage: recordDemo vm filename (duration)r   r  r  r	  c                      t        | |      S r   )ra  r   rS   r   r  rI  r^  s       r   r  zrecordDemoCmd.<locals>.<lambda>[  s    zZ]_fhpruOv r   r{  r   r  rS   rI  r^  s      @@r   recordDemoCmdr  P  sk    
4y1}89c4 Dt|AwH
C
4y1}DGn#t]-v,wxr   c                     t        |      dk  rt        d       yt        | |      }|d k(  ry|d   dt        |      dkD  rt        |d         t	        | |dfdg       y)Nr  z*usage: playbackDemo vm filename (duration)r   r  r  r	  c                      t        | |      S r   )r  r  s       r   r  z!playbackDemoCmd.<locals>.<lambda>i  s    |\_ahjrtwOx r   r{  r  s      @@r   playbackDemoCmdr  ^  sk    
4y1}:;c4 Dt|AwH
C
4y1}DGn#t]-x,yzr   c                 B    d|dz	  |dz  dz	  |dz  fz  }t        | |      S )Nz%02x:%02x.%dr     r  r	  )r   )r   rk  r   s      r   pciAddrr  m  s1    TQY(:D1HEED#tr   c                 h   | d   j                  |j                  d      }|D ]^  }|j                  st        t	        | |j
                        dt        | |j                        dt        | |j                               ` | d   j                  |d      }|D ]  }|j                  rPt        t	        | |j
                        dt        | |j                        dt        | |j                               _t        t	        | |j
                        dt        | |j                                y )	Nrs   PCIDeviceAssignmentsz: assigned host device z guest attachedPCIDevicesz: physical, guest z, host z: virtual, guest )	r   r   isPhysicalDevicerx   r   rG   r  hostAddressguestAddress)r   r   assignedrh  r  s        r   lspcir  q  s)   8}%%goo7MNH MF3<OQXY\^_^k^kQlnuvy{|  |J  |J  oK  L  MM x=!!'+?@D avc1667JGTWYZYgYgLhjqruwx  xE  xE  kF  G  HVC-@'#q~~B^_`	a
 r   c                     t        j                  d      }|j                  |       }|y|j                         }t	        |d   d      dz  t	        |d   d      dz  z  t	        |d         z  S )	Nz2(?P<b>[0-9a-fA-F]+):(?P<d>[0-9a-fA-F]+)\.(?P<f>\d)r-   rj  r  r  r  r  r  )rE   rk  rl  rm  r   )r   pcirerx  pdicts       r   parsePcir    sl    JJLMELLE}OOEsR Q&Cc
B,?A+EFUSVZXXr   c                 |    t        |      dk  rt        d       yt        | |      }|d k(  ryt        | |dd g       y)Nr  zusage: lspci vmr   r	  c                     t        | |      S r   )r  r  s       r   r  zlspciCmd.<locals>.<lambda>  s    uUXZaOb r   r  r  s      r   lspciCmdr    sD    
4y1} c4 Dt|#t]-b,cdr   c                 6   t        |      dk  rt        d       yt        | |      }|d k(  ryt        |d         dk(  rt        d|d   z         yt        |      dkD  r%t        |d         dk(  rt        d|d   z         yt	        | |fd       y)	Nr  z&usage: attachpci vm hostpci <guestpci>r   r  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                 *    |j                  d      S rn  )attachHostPCIDevice)r   rS   rh  	guestaddrhostaddrs      r   r  zattachpciCmd.<locals>.<lambda>  s    0H0HS\^b0c r   r?   rx   rw  r  r   )r   r  rS   r  r  s      @@r   attachpciCmdr    s    
4y1}67c4 Dt|Q H2~\`def`ghi
4y1}T!W%	?aeijkelmn	Tcdr   c                     t        |      dk  rt        d       yt        | |      }|d k(  ryt        |d         dk(  rt        d|d   z         yt	        | |fd       y)Nr  zusage: detachpci vm hostpcir   r  r-   r  c                 &    |j                        S r   )detachHostPCIDevice)r   rS   rh  r  s      r   r  zdetachpciCmd.<locals>.<lambda>  s    0H0H0R r   r  )r   r  rS   r  s      @r   detachpciCmdr    sm    
4y1}+,c4 Dt|Q H2~\`def`ghiTRSr   c                 ^    t        |      dk  rt        d       yt        |d         }|| d<   y)Nr  zusage: goto liner   rt   r  )r?   rx   r   )r   r  rW  s      r   gotoCmdr    s3    
4y1} !tAw<DCr   startinfor^   r.   r   quit	typeGuestr  )	ro   r  r  r  rh  r  exittgr,  zPrints help informationz;Start virtual machine by name or uuid: start Linux headlessr   z,Create virtual machine: createVm macvm MacOSr   zRemove virtual machiner  zPause virtual machiner  zResume virtual machiner  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 machiner  z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 verbosityrJ  z=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.vboxrn  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 0r  zaTeleport 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 Win32r  z(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.isor  zIMount 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:1r  z@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))r  colorssnapshotr  rf  r   	foreachvmforeachra  r  r  	attachpci	detachpcigotoc                 
   |d   }t         j                  |d       d k7  r	t         |   }t        j                  |d       }|d k(  rt        d|z         y| d   r"| d   |dvrt        dt	        dd      z         y |d	   | |      S )
Nr   z=Unknown command: '%s', type 'help' for list of known commandsr  r   )r  	reconnectr.   r  z/First connect to remote server with %s command.r  r   rt   )r[  r   r  rx   r   )r   r  rQ   cis       r   r  r    s    QA{{1dt#AJ	a	B	TzMQRST
8}T*<<CwyZ`Gabc2a5dr   c                 T    |syt        |      }t        |      dk(  ryt        | |      S r`  )rp   r?   r  r   r  r  s      r   r  r  -  s+    q3D
4yA~a#t$$r   c                    t         j                  j                  |      sy i }	 t        t	        t        |      j                         |d      ||       t        |d   j                               D ]-  \  }}t        rt        d|d|d          |d   |d   |g||<   / y #  t        d|z         t        j                          Y y xY w)Nr   r  zcustomize: adding "z" - r   rt   z%Error loading user extensions from %s)r<   r=   isfiler   rk  rY  readr^   r_   rK   rx   rL   rM   )r   rf   r^  r  rf  r,  s         r   addExtsFromFiler5  D  s    77>>(#
AWT(^((*Hf=q!D1Z=..01 	-FQAaDABtQqT8,DG	-5BCs   A;B   $Cc           	         t        |      }t        j                  j                  |d      }t	        | ||       t        j                  j                  |d      }t        j                  j                  |      sy t        j                  |      }|D ]?  }|j                  d      st	        | |t        j                  j                  ||             A y )Nzshellext.pyshextsz.py)r   r<   r=   rB   r5  isdirr@   endswith)r   rf   folderrG   shextdirextsrT   s          r   r  r  S  s    [F77<<.DCt$ww||FH-H77=="::hD B::eCrww||Ha'@ABr   c                 2   | d   s| d   dt         j                  v r0t         j                  j                  t         j                  d         S t         j                  j                  t         j                  j	                  d      d      S | d   j
                  S )Nr  r   VBOX_USER_HOME~z.VirtualBox)r<   environr=   rB   
expanduserrA  r  s    r   r  r  a  so    
8}D	)rzz)77<<

+; <==ww||BGG..s3]CC4y###r   c                    | d   r7dt         dgt        d<   dt        dgt        d<   dt        dgt        d<   g d	| d
<   | d   }|	 t	        d|j
                  z         d | d<   nd | d<   t        |       }t        | t        |       t        j                         dv rdat         j"                  j%                  |d      }t'        t        |        t(        r4t         j"                  j+                  |      rt-        j.                  |       | d   r$	 | d   j1                  dg|j2                  gdd       g }t4        t4        j7                  d      }|j9                         }	 	 t:        r
dt<        z  }nEt4        t?        |      }n3t@        jB                  d   dk  rtE        | d         }ntG        | d         }tI        | |      }|dk7  rnt:        rn	 | d   jQ                  d       	 tR        d   r!| d   jU                  dg|j2                  g       t(        rt-        jV                  |       y y # t        $ r1}t        | |       t        rt        j                          Y d }~d }~ww xY w#  Y =xY w# tJ        $ r t	        d       Y tL        $ r Y tN        $ r Y t        $ r0}t        | |       t        rt        j                          Y d }~d }~ww xY w#  Y xY w)Nr  zJConnect to remote VBox instance: connect http://server:18083 user passwordr   r  z$Disconnect from remote VBox instancer  z!Reconnect to remote VBox instancer.  )zhttp://localhost:18083r[   r[   r  r   r  r   )Windows	MicrosoftFz.vboxshellhistoryr   r   r   r  zrunScript %sr  r   z&====== You can type quit or q to leavers   ),r  r  r  r  rx   rg  rI   rJ   rK   rL   rM   r  r  rd   re   r   r<   r=   rB   rl   r]   existsr0   read_history_filer   r  g_sCmdr>   __iter__g_fBatchModeg_sScriptFilenextrz   version_info	raw_inputinputr  r   StopIterationr  r~   ctdisablewrite_history_file)	r   r   rT   home	hist_filerf   itr  r  s	            r   	interpretrV  i  s   
8}kmwyz{"H-YZ![!DlTU V:Ht9D	&1T\\BC
 FFDXt,44T#67I8S!"''..3""9- 6{	Ksedii["b9 D||C 	B
	&$}5#2h##A&!+#CM2CH.Cc3'Dqy%  	H##A&3 4f:K		{3 ##I. A  	&S!##%	&0	, ! 	<:; 	 	 	&S!##%	&sa   H* #I' A&I/ I/ #*K *	I$3&II$'I,/KKKK!&KKKc                 >    |j                  d|       t        | |      S r`  )r  r  r1  s      r   runCommandCbrX    s    KK3#t$$r   c                 h    t        | |      }|d k(  ry|j                  d|       t        | |d|       y)Nr   r	  )r  r  r  )r   r   guestLambdar  rS   s        r   runGuestCommandCbr[    s7    CDt|KK;#t]D1r   c                 	   t               }|j                  dddddd       |j                  dd	d
ddd       |j                  dddddd       |j                  dddd       |j                  ddd       |j                  ddd       |j                         \  }}|j                  a|j
                  }|j                  dadada	|j                  a
|j                  dada	|j                  ad }|j                  ?i }|j                  }|j                  d      }|D ]  }|j                  d       \  }	}
|
||	<    |j                  rt!        j"                         g}t         j$                  j'                  t         j$                  j)                  t*                    }t-        j.                         d!v r/|j1                  t         j$                  j3                  |d"             |j1                  |       t         j4                  j7                  d#      }||D ]  }t         j$                  j9                  t         j$                  j3                  |d$            s>t         j$                  j9                  t         j$                  j3                  |d%            s~t;        d&|       |t         j4                  d#<   |} n |r>t<        j$                  j1                  t         j$                  j3                  |d'd(             t         j4                  j7                  d)      }||D ]  }t         j$                  j9                  t         j$                  j3                  |d'd*d+            sCt         j$                  j3                  |d'      }t;        d,|       |t         j4                  d)<   |} n |rc|}t         j$                  j3                  |d*d-d.      }t         j$                  j?                  |      rt<        j$                  j1                  |       ~~~d/d0l m!}  |||      }||jE                         |jF                  |jH                  |jJ                  fd1fd2fd3fd4fd5tL        d tN        d/dd6tQ               tS        jU                               D ]  }|=  d tW        jX                          |j[                          ~y #  Y xY w)7Nz-vz	--verboser  
store_trueFzswitch on verbose)destactionr  r.   z-az
--autopathautopathzswitch on autopathz-wz--webservicestylestore_const
WEBSERVICEzconnect to webservice)r^  r_  r  r.   z-bz--batch
batch_filezscript file to execute)r^  r.   z-ccommand_linezcommand sequence to executez-oopt_linezoption lineTr  r  )SunOSamd64VBOX_PROGRAM_PATHr  zVirtualBox.exez!Autodetected VBOX_PROGRAM_PATH assdk	installerVBOX_SDK_PATHbindingszVirtualBox.xidlzAutodetected VBOX_SDK_PATH asxpcompythonr   )VirtualBoxManagerc                     t        | |      S r   )rX  )r  r  r   s     r   r  zmain.<locals>.<lambda>  s    ,sC*F r   c                      t        | ||      S r   )r[  )r   rZ  r  r   s      r   r  zmain.<locals>.<lambda>  s    8I#tU`bf8g r   c                     t        |       S r   )r  )r   r   s    r   r  zmain.<locals>.<lambda>  s    Xc4%8 r   c                     t        |       S r   )rw  )r  r   s    r   r  zmain.<locals>.<lambda>  s    ZT%: r   c                     t        |       S r   )r   )rd  r   s    r   r  zmain.<locals>.<lambda>  s    +c1"5 r   )rs   r   r  r  r  runr	  r  rw  r   r~  r   r   r  rv   ).r   
add_option
parse_argsr  rK   ra  rd  rI  r   r]   rJ  re  rG  rf  r>   r`  r<   getcwdr=   dirnameabspath__file__rd   re   rA   rB   r@  r   r3  rx   rz   r8  vboxapirp  getVirtualBoxr   r  r  r~  	g_sPromptrV  r^   r  gccollectdeinit)argvparseoptionsr  ra  rz  	strparamsstrparamliststrparamrh   r'  asLocations
sScriptDirsPathsCurLocsTmprp  r   sKeyr   s                      @r   mainr    s   
 NE	T;Y|UZcvw	T<jW\eyz	T>Ua  kB  C	T9<@XY	T7TU	T
=A&&(OWdJMME%**'%%F#$$	 s+$ 	 H#>>#.LS%F3K	  		&WW__RWW__X-FG
  L0""277<<
G#DEz* 

23=& WW^^BGGLL,$GHWW^^BGGLL:J$KL=wG6=BJJ23#E HHOOBGGLL{CD

/=& 77>>"'',,wzK\"]^ ggll7E:G97C29BJJ/#E G77<<WhGDww}}T"%; * /H  ..0 **  Fg8:5#!C" cN
 SXXZ  I
CJJLOOM 	s   "A S S__main__)rP  )FF)NN)r[   )r  
__future__r   __copyright____version__r  r<   rz   rL   rn   rC  rE   rd   optparser   r   rI  rJ  rG  r]   r0   r   ImportErrorr  r   r   r   r   r   rl   rK   rp   r   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   r   r   r   r   r   r   r  r  rL  rQ  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r8  rE  rJ  rM  rU  ra  ri  ru  rw  r}  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r&  r(  r*  r,  r.  r2  r4  r6  r8  r:  r<  r>  r  rC  rE  rJ  rL  rO  rQ  rS  rW  rY  r\  r`  rb  rv  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ri  rl  ro  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.  r8  rC  ra  rl  rs  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r[  r  r  r  r5  r  r  rV  rX  r[  r  rV   r  rY   r   r   <module>r     sn  
" & , $ 
 	 
    	  !  	 		 Ik++ IV-, 
$&b
$#" $#* $ 
'>:q=	hO1d 6)r6r84#00

~Oo..b &(d /( #%5 /#$ #$J(i ((Y (U UH) H	 	9 I  < )$wr:#x
0)"	
"&122h
9">.>%N8
!F$*82$2$2 $2 $	2
 $2 $2 $2 $2 $2 $2 $2 $2 $2 $2 $2  $!2" $#2$ $%2& $'2( $)2* $+2, $-2. $/20 $122 $324 $526 $728 $92: $;2< $=2> $?2@ $A2B $C2D $E2F 













c2	h&	v&
u& v& 
v	&
 v& v& v& v& 
d|& 
d|& 
d|& d|& d|& d|& d|&  d|!&" v#&$ d|%&& v'&( d|)&* d|+&, 	v-&. 	v/&0 	v1&2 	v3&4 	v5&6 	v7&8 	v9&: 	v;&< 	v=&> 
w?&@ 
vA&B 
vC&D 	d|E&F d|d|d|K&P;z(8	.60BC&:$	$(.&6*&0
)

0(2h +- #J D"'R,\$;z
	;4$8t/d 	Y,	 fRF-w: RRT\^_`RFUVWR 0+qAR ,h:	R
 .	1=R =wJR 0(A>R 5|QGR ;^QOR 2GQ?R +Wa8R *Ha8R 4hBR -x;R 2Ha@R  &!4!R" ):q9#R$ UW`bcd%R&   J  LS  UV  W'R( GWa()R* +Wa8+R, npxz{|-R. fhwyz{/R0 _asuvw1R2  !`bvxy z3R4 %&q  tM  OP  &Q5R6 _aoqrs7R8   R  Tb  de  f9R: A:qQ;R< fhrtuv=R> QS`bcd?R@ >aPARB A<QRSCRD KXWXYERF JHVWXGRH Lk[\]IRJ `boqrsKRL {  ~I  KL  MMRN t  wC  EF  GORP }  @M  OP  QQRR cesuvwSRT Y[jlmnURV egvxyzWRX u  xE  GH  IYRZ A:qQ[R\ x  {G  IJ  K]R^ JLZ[\_R` OQ]_`aaRb `bprstcRd fhxz{|eRf ^`lnopgRh K\[\]iRj acqstukRl giy{|}mRn NP\^_`oRp _amopqqRr Ll\]^sRt dfqstuuRv `boqrswRx \^jlmnyRz FVWX{R| s  vB  DE  F}R~ M|]^_R@ BLRSTARB 0*a@CRD iky{|}ERF 57GKGRH )&!4%y!4OQ\^_`bdjlmn161=.	1=8,J O  Q[  ]^  _E}VWXK_^_`H(TUVUWcefgWYeghi97AFcRh%.B$L/\%l\ zN Uo  Ns   ] ]]