ó
½-'Nc           @   s\  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 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 d „ Z d „  Z d „  Z e 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_message8   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 ru ˆ j ˆ t d ˆ d ƒ } t j d ƒ ˆ j j | t ƒ S| d } | d } | j	 d t
 ƒ ‰ | j	 d	 t
 ƒ ‰ d ‰ ˆ  d
 k rÈ d ‰ n  ˆ 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   dappert   servert	   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>k   s   	c            s   ˆ  j  ˆ ƒ S(   N(   t   extract(   R*   (   R   R,   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR-   m   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-   n   s    c      	      s"   ˆ j  ˆ  ˆ d ˆ d ˆ d ˆ ƒS(   Nt   allow_third_partyR%   t   mode(   t   upgrade(   R*   (   t   target_code_nameR1   R   R2   R   R%   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR-   o   s   	c            s
   ˆ  j  ƒ  S(   N(   t   finish(   R*   (   R   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR-   r   s    N(   R   t   lsb_release_filenameR   R   t   loggingt   infot   _brokert   send_messaget   Truet   gett   Falset   Nonet   _configR   R   t   fetcht   addCallbackt
   addErrbackt   abort(   R   R#   t   lsb_release_infot   tarball_urlt   signature_urlR(   t   result(    (	   R0   R   R+   R1   R,   R%   R4   R2   R   sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR!   F   s<    




					%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(   R7   R8   (   t   ignored(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   log_successƒ   s    c         S   s   t  j d ƒ |  S(   Ns%   Couldn't fetch all upgrade-tool files(   R7   t   warning(   t   failure(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   log_failure†   s    (   R   R   t   existsR?   R   t   mkdirR   R7   RK   RA   RB   (   R   RE   RF   RG   RJ   RM   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR@   v   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(   R7   R8   (   RI   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyRJ   –   s    c         S   s   t  j d t |  j ƒ ƒ |  S(   Ns.   Invalid signature for upgrade-tool tarball: %s(   R7   RK   t   strt   value(   RL   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyRM   ™   s    	(   R   RA   RB   (   R   R,   R+   RG   RJ   RM   (    (    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.   R?   R   R    R>   (   R   R,   t   tft   member(    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR.   ¢   s    c   	      C   s®  |  j  j } | d k rbt j j | d ƒ } t j ƒ  } | j | ƒ | j d ƒ sx | j d ƒ | j	 d d d ƒ n  | j d ƒ s— | j d ƒ n  | j
 d d ƒ s¿ | j	 d d d ƒ n/ | j d d ƒ } | d	 7} | j	 d d | ƒ t | d
 ƒ } | j | ƒ | j ƒ  t j j | d ƒ } t | d
 ƒ } | j d ƒ | j ƒ  t j | d ƒ n  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.
        R&   s   DistUpgrade.cfg.dappert   NonInteractivet   ForceOverwritet   not   Distrot   PostInstallScriptss	   ./dbus.shs   , ./dbus.sht   ws   dbus.shs*   #!/bin/sh
/etc/init.d/dbus start
sleep 10
ií  s   mirrors.cfgt   as   
N(   R?   R   R   R   R   t   ConfigParsert   readt   has_sectiont   add_sectiont   sett
   has_optionR<   RS   t   writet   closet   chmodt   landscape_ppa_urlR    R>   (	   R   R0   R   t   config_filenamet   configt   scriptst   fdt   dbus_sh_filenamet   mirrors_filename(    (    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   StringIORd   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 } | rI | j d | g ƒ n  t j j ƒ  }	 | rk d |	 d <n  | r~ d |	 d <n  t | d | d |	 d	 | d
 t	 ƒ}
 ‡  ‡ f d †  } |
 j
 | ƒ |
 S(   sé  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.
        @param mode: Optionally, the mode to run the upgrade-tool as. It
            can be "server" or "desktop", and it's relevant only for dapper.
        s
   --frontendt   DistUpgradeViewNonInteractives   --modeR;   t!   RELEASE_UPRADER_ALLOW_THIRD_PARTYt   DEBUG_UPDATE_MANAGERt   argst   envR   t
   wait_pipesc            st   |  \ } } } | d k r$ t  } n t } ˆ  j | | ƒ } ˆ  j ˆ | | | ƒ } t j d ƒ ˆ  j j | t ƒ S(   Ni    sB   Queuing message with release upgrade results to exchange urgently.(	   R   R   R   R   R7   R8   R9   R:   R;   (   t   .0Rx   Ry   R   R   R   R#   (   R   R   (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   send_operation_result  s    	(   R?   R   R   R   R   t   extendt   environt   copyR
   R=   RA   (   R   t	   code_nameR   R1   R%   R2   R   t   upgrade_tool_filenameRƒ   R„   RG   R‡   (    (   R   R   sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR3   û   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-smart-updates   --config=%sRƒ   t   uidt   gidR   R„   N(   t   shutilt   rmtreeR?   R   R   t   getuidt   pwdt   getpwnamt   pw_uidt   grpt   getgrnamt   gr_gidR>   R   Ri   t   appendR
   t   getcwdR‰   (   R   RŽ   R   t   reporterRƒ   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR5   #  s    		c         C   sE   |  j  | t d t | j ƒ d ƒ } t j d ƒ |  j j | t ƒ S(   s3   Abort the task reporting details about the failure.s   %si   sB   Queuing message with release upgrade failure to exchange urgently.(	   R   R   RP   RQ   R7   R8   R9   R:   R;   (   R   RL   R   R#   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyRC   9  s    c           C   s   t  ƒ  S(   N(   t   find_release_upgrader_command(    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   find_commandD  s    N(   R   R   R   R   t   config_factoryt
   queue_nameR   R6   Rg   Rt   Rv   R   R$   R!   R@   R)   R.   R/   R   R=   R>   R3   R5   RC   t   staticmethodR   (    (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyR   #   s(   			0			
	9	'		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œ   I  s    %c         C   s2   t  j ƒ  t  j ƒ  k r% t  j ƒ  n  t t |  ƒ S(   N(   R   t   getpgrpt   getpidt   setsidR	   R   (   Rƒ   (    (    sE   /usr/lib/python2.7/dist-packages/landscape/package/releaseupgrader.pyt   mainO  s    ($   R   R£   R–   R“   R   R7   RR   Rp   R^   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,   ÿ '	