
?F[c           @   s   d  Z  d d l Z d d l Z d d l m Z d d l m Z d d l m Z m	 Z	 d d l
 m Z d d l m Z d d l m Z d d l Z d	 e f d
     YZ d e f d     YZ d S(   s)   
High-level abstraction of an EC2 server
iN(   t   StringIO(   t   IObject(   t   Configt   BotoConfigPath(   t   interactive_shell(   t   Model(   t   StringPropertyt	   ServerSetc           B   s   e  Z d    Z d   Z RS(   c         C   s   g  } t  } xZ |  D]R } y5 t | |  } t |  r@ t } n  | j |  Wq | j d   q Xq W| r | |  _ |  j S| S(   N(   t   Falset   getattrt   callablet   Truet   appendt   Nonet   map_listt   map(   t   selft   namet   resultst   is_callablet   servert   val(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   __getattr__&   s    		c         G   s1   g  } x$ |  j  D] } | j | |    q W| S(   N(   R   R   (   R   t   argsR   t   fn(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR   6   s    (   t   __name__t
   __module__R   R   (    (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR   $   s   	t   Serverc           B   s  e  Z e d     Z e d    Z e d d   Z d8 d  Z e	 d e
 d d  Z e	 d d  Z e	   Z e	 d d	  Z e	 d d
  Z e	 d d d d  Z e	 d d  Z e	 d d  Z e	 d d  Z e	 d d  Z e	   Z d   Z d   Z e e e d8 d  Z d   Z e e e d8 d  Z d   Z e e e d8 d  Z d   Z e e e d8 d  Z d   Z e e e d8 d  Z  d   Z! e e! e d8 d  Z" d   Z# e e# e d8 d  Z$ d    Z% e e% e d8 d!  Z& d"   Z' d#   Z( e e' e( d8 d$  Z) d%   Z* d&   Z+ d'   Z, d(   Z- d)   Z. d8 d* d+ d,  Z/ d-   Z0 d.   Z1 d/   Z2 d8 d0  Z3 d1   Z4 d2   Z5 d8 d8 d8 d8 d8 d3  Z6 d4 d5  Z7 d6   Z8 d7   Z9 RS(9   c         C   s(   |  j  d  k r! t j   |  _  n  |  j  S(   N(   t   _ec2R   t   botot   connect_ec2(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   ec2>   s    c         C   s7   t    } |  j   } x | D] } | j |  q W| S(   sl   
        Returns a list of Server instances, one for each Server object
        persisted in the db
        (   R   t   findR   (   t   clst   lt   rsR   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt	   InventoryD   s
    	t    c         C   s2   |    } | | _  | | _ | | _ | j   | S(   N(   R   t   instance_idt   descriptiont   save(   R!   R   R&   R'   t   s(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   RegisterP   s    				
c         K   sS   t  t |   j | |  d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _	 d  S(   N(
   t   superR   t   __init__R   t   _reservationt	   _instancet   _ssh_clientt   _pkeyt   _configR   (   R   t   idt   kw(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR,   Y   s    					t   uniquet   verbose_namet   Names   Instance IDs   AMI IDs   Availability Zones   Security Groupt   defaults   Key Names
   Elastic IPs   Instance Typet   Descriptionc         C   s
   t   d  S(   N(   t   AttributeError(   R   t   value(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   setReadOnlyn   s    c         C   s{   |  j  st |  j rt y |  j j |  j g  } Wn d  SXt |  d k rq | d |  _ |  j j d |  _  qq qt n  |  j  S(   Ni    (   R.   R&   R   t   get_all_reservationsR   t   lenR-   t	   instances(   R   R#   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getInstanceq   s    		s   The Instance for the serverc         C   s   |  j  r |  j  j Sd  S(   N(   t   instancet   image_id(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getAMI   s    	s   The AMI for the serverc         C   s$   |  j  r  |  j  j   |  j  j Sd  S(   N(   R@   t   updatet   state(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt	   getStatus   s    	s   The status of the serverc         C   s   |  j  r |  j  j Sd  S(   N(   R@   t   public_dns_name(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getHostname   s    	s!   The public DNS name of the serverc         C   s   |  j  r |  j  j Sd  S(   N(   R@   t   private_dns_name(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getPrivateHostname   s    	s"   The private DNS name of the serverc         C   s   |  j  r |  j  j Sd  S(   N(   R@   t   launch_time(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getLaunchTime   s    	s   The time the Server was startedc         C   s   |  j  r |  j  j   Sd  S(   N(   R@   t   get_console_output(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   getConsoleOutput   s    	s&   Retrieve the console output for serverc         C   s   |  j  r |  j  j Sd  Sd  S(   N(   R-   t   groupsR   (   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt	   getGroups   s    	
s5   The Security Groups controlling access to this serverc         C   sH   |  j  sA t } d |  j j } |  j | |  t |  |  _  n  |  j  S(   Ns   %s.ini(   R1   R   R@   R2   t   get_fileR   (   R   t   remote_filet
   local_file(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt	   getConfig   s    	c         C   sP   d |  j  j } t |  } | j |  | j   |  j | t  | |  _ d  S(   Ns   %s.ini(   R@   R2   t   opent   writet   closet   put_fileR   R1   (   R   t   configRR   t   fp(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt	   setConfig   s    
s!   The instance data for this serverc         C   s#   | |  _  |  j  j d |  j  d S(   s&   
        Set SDB based config
        t   botoConfigsN(   R1   t   dump_to_sdbR2   (   R   RX   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt
   set_config   s    	c         C   s,   t  d t  |  _ |  j j d |  j  d  S(   Nt   do_loadR[   (   R   R   R1   t   load_from_sdbR2   (   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   load_config   s    c         C   s   |  j  r |  j  j   n  d  S(   N(   R@   t   stop(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyRa      s    	c         C   s  |  j    t j   } | j d t |  j  g  d } | j d t |  j  g  } |  j sl |  j	   n  |  j j
 d  s |  j j d  |  j j d d | j  |  j j d d | j  n  |  j j
 d  s |  j j d  n  |  j j r/|  j j d d |  j j j  |  j j d d	 |  j  n  t   } |  j j |  | j   } | j d
 d d d d |  j d | d |  j d |  j d |  } | j d } | j |  _ |  j   |  j r| j |  j |  j  n  d  S(   Nt	   image_idsi    t
   groupnamest   Credentialst   aws_access_key_idt   aws_secret_access_keyt   Pyamit   server_sdb_domaint   server_sdb_namet	   min_counti   t	   max_countt   key_namet   security_groupst   instance_typet	   placementt	   user_data(   Ra   R   R   t   get_all_imagest   strt   ami_idt   get_all_security_groupst   security_groupR1   R`   t   has_sectiont   add_sectiont   setRe   Rf   t   _managert   domainR   R    RU   t   getvaluet   runRl   Rn   t   zoneR>   R2   R&   t   putt
   elastic_ipt   associate_address(   R   R   t   amiRN   t   cfgt   rt   i(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   start   s<    
"						
	c         C   s   |  j  r |  j  j   n  d  S(   N(   R@   t   reboot(   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR      s    	s   ~/.ssh/known_hostst   rootc         C   s   d d  l  } |  j s d GHd  S|  j s | sH t   } | j d  } n  | j j |  |  _ | j   |  _ |  j j	   |  j j
 t j j |   |  j j | j    |  j j |  j j d | d |  j n  |  j S(   Nis   No instance yet!s   Path to OpenSSH Key filet   usernamet   pkey(   t   paramikoR@   R/   R   t   get_filenamet   RSAKeyt   from_private_key_fileR0   t	   SSHClientt   load_system_host_keyst   load_host_keyst   ost   patht
   expandusert   set_missing_host_key_policyt   AutoAddPolicyt   connectRF   (   R   t   key_filet   host_key_filet   unameR   t   iobject(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   get_ssh_client   s     			c         C   s,   |  j    } | j   } | j | |  d  S(   N(   R   t	   open_sftpt   get(   R   t
   remotepatht	   localpatht
   ssh_clientt   sftp_client(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyRP     s    c         C   s,   |  j    } | j   } | j | |  d  S(   N(   R   R   R~   (   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyRW     s    c         C   s%   |  j    } | j   } | j |  S(   N(   R   R   t   listdir(   R   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR     s    c         C   s)   |  j  |  } | j   } t |  d  S(   N(   R   t   invoke_shellR   (   R   R   R   t   channel(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   shell  s    c         C   s  d GHd GH|  j    } | j   } t j j |  \ } } d | }	 |  j | |	  t j j |  \ } } d | }
 |  j | |
  d t GHy | j t  Wn n Xd } | d |
 |	 f 7} | d |  j j	 7} | d | 7} | d	 | 7} | d
 7} |  j
 j d k s|  j d k r,| d 7} n
 | d 7} d | GH| j |  } | d j   } d | GHd | d j   GHd GHd  S(   Ns   bundling image...s5   	copying cert and pk over to /mnt directory on servers   /mnt/%ss   	deleting %ss   sudo ec2-bundle-vol s   -c %s -k %s s   -u %s s   -p %s s   -s %d s   -d /mnt s   m1.smalls	   c1.mediums   -r i386s	   -r x86_64s   	%si   i   s   ...complete!(   R   R   R   R   t   splitRW   R   t   removeR-   t   owner_idR@   Rn   t   exec_commandt   read(   R   t   prefixR   t	   cert_filet   sizeR   R   R   R   t   remote_key_filet   remote_cert_filet   commandt   tt   response(    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   bundle_image"  s<    

	
!
		c         C   s   d GHd } | d | 7} | d | 7} | d |  j  j 7} | d |  j  j 7} d | GH|  j   } | j |  } | d j   } d | GHd | d	 j   GHd
 GHd  S(   Ns   uploading bundle...s   ec2-upload-bundle s   -m /mnt/%s.manifest.xml s   -b %s s   -a %s s   -s %s s   	%si   i   s   ...complete!(   R   Re   Rf   R   R   R   (   R   t   bucketR   R   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   upload_bundleD  s    		c         C   s   t    } | s! | j d  } n  | s9 | j d  } n  | sQ | j d  } n  | si | j d  } n  | s | j d  } n  |  j | | | |  |  j | |  d GH|  j j d | | f  |  _ |  j S(   Ns   Name of S3 buckets   Prefix for AMI files   Path to RSA private key files   Path to RSA public cert files   Size (in MB) of bundled images   registering image...s   %s/%s.manifest.xml(	   R   t
   get_stringR   t   get_intR   R   R   t   register_imageRA   (   R   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   create_imageS  s     	s   /dev/sdpc         C   sC   t  | d  r | j } n | } |  j j d | d |  j d |  S(   s   
        Attach an EBS volume to this server

        :param volume: EBS Volume to attach
        :type volume: boto.ec2.volume.Volume

        :param device: Device to attach to (default to /dev/sdp)
        :type device: string
        R2   t	   volume_idR&   t   device(   t   hasattrR2   R   t   attach_volumeR&   (   R   t   volumeR   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR   e  s    
c         C   s=   t  | d  r | j } n | } |  j j d | d |  j  S(   s   
        Detach an EBS volume from this server

        :param volume: EBS Volume to detach
        :type volume: boto.ec2.volume.Volume
        R2   R   R&   (   R   R2   R   t   detach_volumeR&   (   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR   u  s    c         C   sl   d | GHd | } d | GH|  j    } | j |  } | d j   } d | GHd | d j   GHd GHd  S(   Ns   installing %s...s   yum -y install %ss   	%si   i   s   ...complete!(   R   R   R   (   R   t   package_nameR   R   R   R   (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   install_package  s    	
		N(:   R   R   t   propertyR   t   classmethodR$   R*   R   R,   R   R   R   R&   t
   config_uriRs   R}   Ru   Rl   R   Rn   R'   t   logR;   R?   R@   RB   R   RE   t   statusRG   t   hostnameRI   t   private_hostnameRK   RJ   RM   t   console_outputRO   RN   RS   RZ   RX   R]   R`   Ra   R   R   R   RP   RW   R   R   R   R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyR   <   sx   																									#					"		(   t   __doc__R   t
   boto.utilst   boto.compatR    t   boto.mashups.iobjectR   t   boto.pyami.configR   R   t   boto.mashups.interactiveR   t   boto.sdb.db.modelR   t   boto.sdb.db.propertyR   R   t   listR   R   (    (    (    s2   lib/python2.7/site-packages/boto/mashups/server.pyt   <module>   s   