ó
ÍÿŠTc           @   sP  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m	 Z	 d  d l
 m Z m Z d  d l m Z m Z d  d l m Z d  d l m Z d  d l m Z m Z m Z d  d l m Z d  d	 l m Z m Z d  d
 l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d „  Z! d „  Z" d S(   iÿÿÿÿN(   t   succeed(   t   url_to_filenamet   fetch_to_files(   t   parse_lsb_releaset   LSB_RELEASE_FILENAME(   t
   gpg_verify(   t	   read_file(   t   PackageTaskHandlerConfigurationt   PackageTaskHandlert   run_task_handler(   t   spawn_process(   t	   SUCCEEDEDt   FAILED(   t   find_reporter_commandt   ReleaseUpgraderConfigurationc           B   s   e  Z d  Z e d „  ƒ Z RS(   s=   Specialized configuration for the Landscape release-upgrader.c         C   s   t  j j |  j d ƒ S(   sV   
        The directory where the upgrade-tool files get stored and extracted.
        s   upgrade-tool(   t   ost   patht   joint   package_directory(   t   self(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   upgrade_tool_directory   s    (   t   __name__t
   __module__t   __doc__t   propertyR   (    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR      s   t   ReleaseUpgraderc           B   s³   e  Z d  Z e Z d Z e Z d Z d Z	 d Z
 d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z e e d „ Z d „  Z d „  Z e d „  ƒ Z d „  Z RS(   s|  Perform release upgrades.

    @cvar config_factory: The configuration class to use to build configuration
        objects to be passed to our constructor.
    @cvar queue_name: The queue we pick tasks from.
    @cvar lsb_release_filename: The path to the LSB data on the file system.
    @cvar landscape_ppa_url: The URL of the Landscape PPA, if it is present
        in the computer's sources.list it won't be commented out.
    @cvar logs_directory: Path to the directory holding the upgrade-tool logs.
    @cvar logs_limit: When reporting upgrade-tool logs to the server, only the
        last C{logs_limit} lines will be sent.
    s   release-upgraders0   http://ppa.launchpad.net/landscape/trunk/ubuntu/s   /var/log/dist-upgradei † c         C   s'   i d d 6| d 6| d 6| d 6| d 6S(   s=   Convenience to create messages of type C{"operation-result"}.s   operation-resultt   types   operation-idt   statuss   result-texts   result-code(    (   R   t   operation_idR   t   textt   code(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   make_operation_result_message7   s
    
c         C   s*   | j  } | d d k r& |  j | ƒ Sd S(   s.   Call the proper handler for the given C{task}.R   s   release-upgradeN(   t   datat   handle_release_upgrade(   R   t   taskt   message(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   handle_task?   s    	c            s†  | d ‰  | d ‰ t  ˆ j ƒ } | d ‰ ˆ  ˆ k ro ˆ j ˆ t d ˆ  d ƒ } t j d ƒ ˆ j | ƒ S| d } | d } | j d t ƒ ‰ | j d	 t ƒ ‰ ˆ j	 j
 } t | d
 | ƒ‰ t | d
 | ƒ‰ ˆ j | | ƒ } | j ‡ ‡ ‡ f d †  ƒ | j ‡ ‡ f d †  ƒ | j ‡ ‡ f d †  ƒ | j ‡  ‡ ‡ ‡ ‡ f d †  ƒ | j ‡ f d †  ƒ | j ˆ j ˆ ƒ | S(   sw   Fetch the upgrade-tool, verify it and run it.

        @param message: A message of type C{"release-upgrade"}.
        s	   code-names   operation-ids!   The system is already running %s.i   sB   Queuing message with release upgrade failure to exchange urgently.s   upgrade-tool-tarball-urls   upgrade-tool-signature-urls   allow-third-partyt   debugt	   directoryc            s   ˆ  j  ˆ ˆ ƒ S(   N(   t   verify(   t   x(   R   t   signature_filenamet   tarball_filename(    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   <lambda>b   s   	c            s   ˆ  j  ˆ ƒ S(   N(   t   extract(   R(   (   R   R*   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR+   d   s    c            s   ˆ  j  ˆ ƒ S(   N(   t   tweak(   R(   (   R   t   current_code_name(    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR+   e   s    c            s   ˆ j  ˆ  ˆ d ˆ d ˆ ƒS(   Nt   allow_third_partyR%   (   t   upgrade(   R(   (   t   target_code_nameR/   R   R   R%   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR+   f   s   	c            s
   ˆ  j  ƒ  S(   N(   t   finish(   R(   (   R   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR+   i   s    (   R   t   lsb_release_filenameR   R   t   loggingt   infot   _send_messaget   gett   Falset   _configR   R   t   fetcht   addCallbackt
   addErrbackt   abort(   R   R#   t   lsb_release_infot   tarball_urlt   signature_urlR&   t   result(    (   R1   R.   R*   R   R)   R/   R%   R   sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR!   E   s6    




				"c         C   s‚   t  j j |  j j ƒ s. t  j |  j j ƒ n  t | | g |  j j d t j ƒ} d „  } d „  } | j	 | ƒ | j
 | ƒ | S(   sŸ   Fetch the upgrade-tool files.

        @param tarball_url: The upgrade-tool tarball URL.
        @param signature_url: The upgrade-tool signature URL.
        t   loggerc         S   s   t  j d ƒ d  S(   Ns'   Successfully fetched upgrade-tool files(   R4   R5   (   t   ignored(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   log_successz   s    c         S   s   t  j d ƒ |  S(   Ns%   Couldn't fetch all upgrade-tool files(   R4   t   warning(   t   failure(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   log_failure}   s    (   R   R   t   existsR9   R   t   mkdirR   R4   RE   R;   R<   (   R   R?   R@   RA   RD   RG   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR:   m   s    		c         C   s?   t  | | ƒ } d „  } d „  } | j | ƒ | j | ƒ | S(   sÕ   Verify the upgrade-tool tarball against its signature.

        @param tarball_filename: The filename of the upgrade-tool tarball.
        @param signature_filename: The filename of the tarball signature.
        c         S   s   t  j d ƒ d  S(   Ns*   Successfully verified upgrade-tool tarball(   R4   R5   (   RC   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyRD      s    c         S   s   t  j d t |  j ƒ ƒ |  S(   Ns.   Invalid signature for upgrade-tool tarball: %s(   R4   RE   t   strt   value(   RF   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyRG      s    	(   R   R;   R<   (   R   R*   R)   RA   RD   RG   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR'   …   s    		c         C   sL   t  j | d ƒ } x- | j ƒ  D] } | j | d |  j j ƒq Wt d ƒ S(   sv   Extract the upgrade-tool tarball.

        @param tarball_filename: The filename of the upgrade-tool tarball.
        s   r:gzR   N(   t   tarfilet   opent
   getmembersR,   R9   R   R    t   None(   R   R*   t   tft   member(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR,   ™   s    c         C   sX   |  j  j } t j j | d ƒ } t | d ƒ } | j |  j d ƒ | j ƒ  t	 d ƒ S(   s•   Tweak the files of the extracted tarballs to workaround known bugs.

        @param current_code_name: The code-name of the current release.
        s   mirrors.cfgt   as   
N(   R9   R   R   R   R   RM   t   writet   landscape_ppa_urlt   closeR    RO   (   R   R.   R   t   mirrors_filenamet   fd(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR-   £   s    	
c         C   sÙ   t  j ƒ  } xF d | f d | f g D], \ } } | r% | j d | | f ƒ q% q% Wxw t t j |  j ƒ ƒ D]] } | j d ƒ s‰ qn n  t j j	 |  j | ƒ } t
 | |  j ƒ } | j d | | f ƒ qn W| j ƒ  S(   s  Return the operation result text to be sent to the server.

        @param out: The standard output of the upgrade-tool process.
        @param err: The standard error of the upgrade-tool process.
        @return: A text aggregating the process output, error and log files.
        t   outputt   errors   === Standard %s ===

%s

s   .logs   === %s ===

%s

(   t	   cStringIOt   StringIORS   t   sortedR   t   listdirt   logs_directoryt   endswithR   R   R   t
   logs_limitt   getvalue(   R   t   outt   errt   buft   labelt   contentt   basenamet   filename(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   make_operation_result_text¶   s    %c      
      s©   ˆ  j  j } t j j | | ƒ } d d g } t j j ƒ  } | rO d | d <n  | rb d | d <n  t | d | d | d | d	 t ƒ}	 ‡  ‡ f d
 †  }
 |	 j	 |
 ƒ |	 S(   sS  Run the upgrade-tool command and send a report of the results.

        @param code_name: The code-name of the release to upgrade to.
        @param operation_id: The activity id for this task.
        @param allow_third_party: Whether to enable non-official APT repo.
        @param debug: Whether to turn on debug level logging.
        s
   --frontendt   DistUpgradeViewNonInteractivet   Truet!   RELEASE_UPRADER_ALLOW_THIRD_PARTYt   DEBUG_UPDATE_MANAGERt   argst   envR   t
   wait_pipesc            sn   |  \ } } } | d k r$ t  } n t } ˆ  j | | ƒ } ˆ  j ˆ | | | ƒ } t j d ƒ ˆ  j | ƒ S(   Ni    sB   Queuing message with release upgrade results to exchange urgently.(   R   R   Ri   R   R4   R5   R6   (   t   .0Rb   Rc   R   R   R   R#   (   R   R   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   send_operation_resultá   s    	(
   R9   R   R   R   R   t   environt   copyR
   R8   R;   (   R   t	   code_nameR   R/   R%   R   t   upgrade_tool_filenameRn   Ro   RA   Rr   (    (   R   R   sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR0   Ì   s    	c         C   sÇ   t  j |  j j ƒ t j ƒ  d k rL t j d ƒ j } t	 j
 d ƒ j } n d
 } d
 } t ƒ  } d g } |  j j d
 k	 r– | j d |  j j ƒ n  t | d | d | d | d t j ƒ  d	 t j ƒS(   sA   Clean-up the upgrade-tool files and report about package changes.i    t	   landscapes   --force-apt-updates   --config=%sRn   t   uidt   gidR   Ro   N(   t   shutilt   rmtreeR9   R   R   t   getuidt   pwdt   getpwnamt   pw_uidt   grpt   getgrnamt   gr_gidRO   R   t   configt   appendR
   t   getcwdRs   (   R   Rx   Ry   t   reporterRn   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR2   ð   s    		c         C   s?   |  j  | t d t | j ƒ d ƒ } t j d ƒ |  j | ƒ S(   s3   Abort the task reporting details about the failure.s   %si   sB   Queuing message with release upgrade failure to exchange urgently.(   R   R   RJ   RK   R4   R5   R6   (   R   RF   R   R#   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR=     s    c           C   s   t  ƒ  S(   N(   t   find_release_upgrader_command(    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   find_command  s    c            s/   ˆ  j  ƒ  } ‡  ‡ f d †  } | j | ƒ | S(   s0   Acquire a session ID and send the given message.c            s   ˆ  j  j ˆ ˆ  j t ƒ d  S(   N(   t   _brokert   send_messaget   _session_idRk   (   t   _(   R   R#   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   send  s    (   t   get_session_idR;   (   R   R#   t   deferredR   (    (   R   R#   sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR6     s    (   R   R   R   R   t   config_factoryt
   queue_nameR   R3   RT   R^   R`   R   R$   R!   R:   R'   R,   R-   Ri   R8   R0   R2   R=   t   staticmethodRˆ   R6   (    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR   "   s*   			(			
		#		c          C   s8   t  j j t  j j t j d ƒ ƒ }  t  j j |  d ƒ S(   s9   Return the path to the landscape-release-upgrader script.i    s   landscape-release-upgrader(   R   R   t   dirnamet   abspatht   syst   argvR   (   R“   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR‡      s    %c         C   s2   t  j ƒ  t  j ƒ  k r% t  j ƒ  n  t t |  ƒ S(   N(   R   t   getpgrpt   getpidt   setsidR	   R   (   Rn   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   main&  s    (#   R   R•   R€   R}   Rz   R4   RL   RZ   t   twisted.internet.deferR    t   landscape.lib.fetchR   R   t   landscape.lib.lsb_releaseR   R   t   landscape.lib.gpgR   t   landscape.lib.fsR   t   landscape.package.taskhandlerR   R   R	   t   landscape.lib.twisted_utilR
   t   landscape.manager.managerR   R   t   landscape.package.reporterR   R   R   R‡   Rš   (    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   <module>   s(   þ	