o
    ȷegU                     @   s   d Z ddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZ dd	lmZ ddlZddlZdd
lmZ ddlmZ ddlmZmZ g dZG dd deZ G dd deZ!G dd de	Z"dS )z)
High-level abstraction of an EC2 server
    N)IObject)BotoConfigPathConfig)Model)StringPropertyIntegerPropertyBooleanPropertyCalculatedProperty)propget)Zone)KeyPair)closing)EC2ResponseError)sixStringIO)m1.smallzm1.largez	m1.xlarge	c1.mediumz	c1.xlargez
m2.2xlargez
m2.4xlargec                   @   s<   e Zd ZdddZdd Zdd Zdd	 Z	
	dddZd
S )Bundlerrootc                 C   s*   ddl m} || _|| _|||d| _d S )Nr   	SSHClient)uname)boto.manage.cmdshellr   serverr   
ssh_client)selfr   r   r    r   I/var/www/ideatree/venv/lib/python3.10/site-packages/boto/manage/server.py__init__-   s   zBundler.__init__c                 C   sr   t d | j  tj|\}}d| | _| j|| j tj|\}}d| | _| j|| j t d d S )Nz5	copying cert and pk over to /mnt directory on serverz/mnt/%s...complete!)	printr   	open_sftpospathsplitremote_key_fileput_fileremote_cert_file)r   key_file	cert_filer#   namer   r   r   	copy_x5093   s   


zBundler.copy_x509c                 C   s   d}| j dkr	d}|d7 }|d| j| jf 7 }|d| jjj 7 }|d| 7 }|d| 7 }|d	7 }| jjd
ks<| jjdkrB|d7 }|S |d7 }|S )N r   sudo zec2-bundle-vol z-c %s -k %s z-u %s z-p %s z-s %d z-d /mnt r   r   z-r i386z	-r x86_64)r   r'   r%   r   _reservationowner_idinstance_type)r   prefixsizessh_keycommandr   r   r   bundle_image>   s   
zBundler.bundle_imagec                 C   sZ   d}| j dkr	d}|d7 }|d| 7 }|d| 7 }|d| jjj 7 }|d| jjj 7 }|S )	Nr,   r   r-   zec2-upload-bundle z-m /mnt/%s.manifest.xml z-b %s z-a %s z-s %s )r   r   ec2aws_access_key_idaws_secret_access_key)r   bucketr1   r3   r4   r   r   r   upload_bundleN   s   
zBundler.upload_bundleNTc	                 C   s`  t  }	|s
|	d}|s|	d}|s|	d}|s|	d}|s&|	d}|s-| j }| || |s8t }|dt	  |d |rK|d || 
||| |d	 || ||| |d	 |d
t	  |d | }
td t|
 | j|
}td|d   td|d   td td | jjj|d||f d| _| jS )NzName of S3 bucketzPrefix for AMI filezPath to RSA private key filezPath to RSA public cert filezSize (in MB) of bundled imagezsudo mv %s /mnt/boto.cfg; z0mv ~/.ssh/authorized_keys /mnt/authorized_keys; zhistory -c; z; zsudo mv /mnt/boto.cfg %s; z.mv /mnt/authorized_keys ~/.ssh/authorized_keysz3running the following command on the remote server:z	%sr      r   zregistering image...z%s/%s.manifest.xml)r*   image_location)r   
get_stringget_filenameget_intr   get_ssh_key_filer+   r   writer   r5   r:   getvaluer    r   runr6   register_imageimage_id)r   r9   r1   r(   r)   r2   r3   fpclear_historyiobjectr4   tr   r   r   bundleY   sH   










zBundler.bundler   )NNNNNNNT)__name__
__module____qualname__r   r+   r5   r:   rJ   r   r   r   r   r   +   s    
r   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )CommandLineGetterc                 C   s8   g }| j  D ]}|jddkr||j|f q|S )Npyamir   )r6   get_all_imageslocationfindappend)r   my_amisamir   r   r   get_ami_list   s   zCommandLineGetter.get_ami_listc                 C   sb   | dd }t|trtj|}||d< |s(| jd}tj |tjj	d|d< |d 
 | _d S )Nregionregion_name)choices)get
isinstance
basestringbotor6   
get_regionclsfind_propertyr
   regionsconnect)r   paramsrX   propr   r   r   r_      s   
zCommandLineGetter.get_regionc                 C   .   | dd s| jd}t ||d< d S d S )Nr*   r[   r`   ra   r
   r   rd   re   r   r   r   get_name      zCommandLineGetter.get_namec                 C   rf   )Ndescriptionrg   rh   r   r   r   get_description   rj   z!CommandLineGetter.get_descriptionc                 C   s0   | dd stddtd}t ||d< d S d S )Nr0   Instance Typer*   verbose_namerZ   )r[   r   InstanceTypesr
   rh   r   r   r   get_instance_type   s   z#CommandLineGetter.get_instance_typec                 C   s.   | dd stddd}t ||d< d S d S )NquantityzNumber of Instancesr*   ro   )r[   r   r
   rh   r   r   r   get_quantity   rj   zCommandLineGetter.get_quantityc                 C   s4   | dd stdd| jjd}t ||d< d S d S )NzonezEC2 Availability Zonern   )r[   r   r6   get_all_zonesr
   rh   r   r   r   get_zone   s   zCommandLineGetter.get_zonec                 C   s|   d}|s<| dd }|stddd}t |}z| j|g}t|dkr-d}|d |d< W n	 ty7   Y nw |rd S d S )NFrV   AMIrs   r;   Tr   )r[   r   r
   r6   rQ   lenr   )r   rd   validrV   re   rsr   r   r   
get_ami_id   s    
zCommandLineGetter.get_ami_idc                 C   sl   | dd }t|tr | j }|D ]}|j|kr|}||d< q|s4tdd| jjd}t ||d< d S d S )NgroupzEC2 Security Grouprn   )r[   r\   r]   r6   get_all_security_groupsr*   r   r
   )r   rd   r}   
group_listgre   r   r   r   	get_group   s   


zCommandLineGetter.get_groupc                 C   sr   | dd }t|tr"| j }|D ]}|j|kr!|j}|j|d< q|s7tdd| jjd}t |j|d< d S d S )NkeypairzEC2 KeyPairrn   )r[   r\   r]   r6   get_all_key_pairsr*   r   r
   )r   rd   r   key_listkre   r   r   r   get_key   s   



zCommandLineGetter.get_keyc                 C   sr   || _ | | |d  | _| | | | | | | | | | | 	| | 
| | | d S )NrX   )r`   r_   rc   r6   ri   rl   rq   rw   rt   r|   r   r   )r   r`   rd   r   r   r   r[      s   







zCommandLineGetter.getN)rL   rM   rN   rW   r_   ri   rl   rq   rt   rw   r|   r   r   r[   r   r   r   r   rO      s    
rO   c                       s   e Zd ZedddZeddZeddZeddZeddZe	d	d
dZ
ededdZededdZededdZededdZededdZededdZededdZededdZededdZededdZededdZg Zg Zedd ZedUddZedVddZed d! Z dW fd"d#	Z!d$d% Z"d&d' Z#d(d) Z$d*d+ Z%d,d- Z&d.d/ Z'd0d1 Z(d2d3 Z)d4d5 Z*d6d7 Z+d8d9 Z, fd:d;Z- fd<d=Z.d>d? Z/d@dA Z0dBdC Z1dDdE Z2dFdG Z3dHdI Z4dJdK Z5dLdM Z6dXdOdPZ7dYdQdRZ8dSdT Z9  Z:S )ZServerTName)uniquero   Description)ro   zEC2 Region NamezEC2 Instance IDzEC2 Elastic IP AddresszIs This Server ProductionF)ro   defaultzAMI ID)ro   calculated_type
use_methodzAvailability Zone NamezPublic DNS NamezPrivate DNS NamezSecurity GroupszPrimary Security Group NamezKey Namerm   zCurrent StatuszServer Launch TimezConsole Outputc                 C   sj   | ds
|d |dd| |dd| | ds"|d |ddd |dd| jjj d S )NCredentialsr7   r8   	DB_Serverdb_typeSimpleDBdb_name)has_sectionadd_sectionset_managerdomainr*   )r`   cfgr7   r8   r   r   r   add_credentials  s   



zServer.add_credentialsNc              	   K   s  |rt |d}|dr |dD ]}||vr|d|||< qt }|| | |d}| }| ||j|j |d}	|d}
|d}|d}|dkr[|	d	d
|j
 t }|| t|trk|j
}t|
trs|
j
}
|	jd|dd|
|g|d|| d}g }d}|d}|j}|dur| dkr|d }td td | dkrtd | dks|| td|  |D ]<}|  }||_|dkr|dd nt||_
|d|_|j
|_|j|_|r|dkr||_|   |!| |d7 }q|S )aq  
        Create a new instance based on the specified configuration file or the specified
        configuration and the passed in parameters.

        If the config_file argument is not None, the configuration is read from there.
        Otherwise, the cfg argument is used.

        The config file may include other config files with a #import reference. The included
        config files must reside in the same directory as the specified file.

        The logical_volume argument, if supplied, will be used to get the current physical
        volume ID and use that as an override of the value specified in the config file. This
        may be useful for debugging purposes when you want to debug with a production config
        file but a test Volume.

        The dictionary argument may be used to override any EC2 configuration values in the
        config file.
        )r#   EC2rX   rV   r   r}   ru   NEBSlogical_volume_namer;   rr   r0   )	min_count	max_countkey_namesecurity_groupsr0   	placement	user_datar   
elastic_ipzEWaiting for instance to start so we can set its elastic IP address...   runningz.set the elastic IP of the first instance to %sr*   r,   rk   )"r   r   optionsr[   rO   rc   r   r7   r8   r   r*   r   rA   r\   r   r   rC   rB   	instances__len__r    timesleepupdateuse_ipr6   strrk   rY   idinstance_idr   putrT   )r`   config_filelogical_volumer   rd   optiongetterrX   r6   rV   kpr}   ru   cfg_fpreservationlir   r   instancesr   r   r   create  st   














 

zServer.creater,   c           
      C   s   t j }|D ]J}| }z||g}W n   g }Y t|dkrQ|  }||_||_||_|j|_||_	|d |_
|j
jD ]
}	|	j|krH|	|_q>|  |  S qd S Nr;   r   )r^   r6   rb   rc   get_all_reservationsry   r*   rk   rY   r   r.   r   r   	_instancer   )
r`   r   r*   rk   rb   rX   r6   r{   r   r   r   r   r   create_from_instance_id^  s.   


zServer.create_from_instance_idc           	      C   s   g }t j }|D ]P}| }| }|D ]C}|jD ]=}zttj|j	d t j
d|j	  W q tyW   |  }||_|j	|_|j|_|j	|_||_|  || Y qw qq	|S )N)r   zServer for %s already exists)r^   r6   rb   rc   r   r   nextr   rS   r   loginfoStopIterationr*   rY   r   r.   r   rT   )	r`   serversrb   rX   r6   r{   r   r   r   r   r   r   create_from_current_instancesv  s.   

z$Server.create_from_current_instancesc                    sB   t t| j|fi | d | _d | _d | _d | _d | _|   d S N)	superr   r   ssh_key_filer6   	_cmdshellr.   r   
_setup_ec2)r   r   kw	__class__r   r   r     s   zServer.__init__c              	   C   s   | j r| jr| jrd S | jrZ| jr\tj  D ]G}|j| jkrY| | _ | j	rY| jsYz&| j 
| j	g}t|dkrN|d jD ]}|j| j	krM|d | _|| _q=W q tyX   Y qw qd S d S d S r   )r6   r   r.   r   rY   r^   rb   r*   rc   r   r   ry   r   r   )r   rX   r{   r   r   r   r   r     s.   

zServer._setup_ec2c                 C   s    d}| j r| j   | j j}|S Nr,   )r   r   state)r   statusr   r   r   _status  s
   
zServer._statusc                 C      d}| j r	| j j}|S r   )r   public_dns_namer   hostnamer   r   r   	_hostname     zServer._hostnamec                 C   r   r   )r   private_dns_namer   r   r   r   _private_hostname  r   zServer._private_hostnamec                 C   r   r   )r   r0   )r   itr   r   r   _instance_type  r   zServer._instance_typec                 C   r   r   )r   launch_time)r   ltr   r   r   _launch_time  r   zServer._launch_timec                 C   s   d}| j r
| j  }|S r   )r   get_console_output)r   cor   r   r   _console_output  s   
zServer._console_outputc                 C   s   g }| j r	| j j}|S r   )r.   groups)r   gnr   r   r   _groups  r   zServer._groupsc                 C   s"   |   }t|dkr|d jS dS )Nr;   r   r,   )r   ry   r   )r   r   r   r   r   _security_group  s   
zServer._security_groupc                 C      d }| j r	| j j}|S r   )r   r   )r   ru   r   r   r   _zone  r   zServer._zonec                 C   r   r   )r   r   )r   knr   r   r   	_key_name  r   zServer._key_namec                    s   t t|   |   d S r   )r   r   r   r   r   r   r   r   r     s   z
Server.putc                    s    | j rtdtt|   d S Nz Can't delete a production server)
production
ValueErrorr   r   deleter   r   r   r   r     s   zServer.deletec                 C   &   | j rtd| jr| j  d S d S r   )r   r   r   stopr   r   r   r   r     
   zServer.stopc                 C   r   r   )r   r   r   	terminater   r   r   r   r     r   zServer.terminatec                 C   s   | j r
| j   d S d S r   )r   rebootr   r   r   r   r     s   zServer.rebootc                 C   s&   | j dkrtd | j dksd S d S )Nr   r   )r   r   r   r   r   r   r   wait   s   

zServer.waitc                 C   sb   | j s.tjd}tj|r"tj|d| j }tj|r"|| _ | j s.t }|	d| _ | j S )Nz~/.sshz%s.pemzPath to OpenSSH Key file)
r   r"   r#   
expanduserisdirjoinr   isfiler   r>   )r   ssh_dirssh_filerH   r   r   r   r@     s   zServer.get_ssh_key_filec                 C   s,   | j sddlm} |   || | _ | j S )Nr   )cmdshell)r   boto.manager   r@   start)r   r   r   r   r   get_cmdshell  s
   zServer.get_cmdshellc                 C   s
   d | _ d S r   )r   r   r   r   r   reset_cmdshell  s   
zServer.reset_cmdshellc                 C   s<   t |  }||}W d    |S 1 sw   Y  |S r   )r   r   rC   )r   r4   cmdr   r   r   r   rC     s   
z
Server.runr   c                 C   s   |    t| |S r   )r@   r   )r   r   r   r   r   get_bundler  s   
zServer.get_bundlerc                 C   s"   ddl m} |   || ||dS )Nr   r   )r   ssh_pwd)r   r   r@   )r   r   r  r   r   r   r   get_ssh_client#  s   zServer.get_ssh_clientc                 C   s   |  d| S )Nzapt-get -y install %s)rC   )r   pkgr   r   r   install(  s   zServer.install)NNN)r,   r   rK   )r   N);rL   rM   rN   r   r*   rk   rY   r   r   r   r   r	   r   ami_idru   r   private_hostnamelistr   security_groupr   r0   r   r   openconsole_outputpackagespluginsclassmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r   r   rC   r  r  r  __classcell__r   r   r   r   r      sj    





P
	

r   )#__doc__boto.ec2r^   boto.mashups.iobjectr   boto.pyami.configr   r   boto.sdb.db.modelr   boto.sdb.db.propertyr   r   r   r	   r   r
   boto.ec2.zoner   boto.ec2.keypairr   r"   r   
contextlibr   boto.exceptionr   boto.compatr   r   rp   objectr   rO   r   r   r   r   r   <module>   s"   Ue