
    Hmd                        d dl Z d dlmZmZ d dlZd dlmZ d dlZd dlm	c m
Z	 d dlmZmZmZ d dlmZm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Zd dlZd dlmZmZmZmZ d dlmZmZm Z  d d	lm!Z!m"Z"m#Z# d dl$Z$d d
l%m&Z& dZ' e(e	d          re	j)        ne*Z) ej+                    Z,da-da.i a/ G d de          Z0d Z1d Z2d Z3e"d             Z4d Z5d Z6d Z7d Z8d Z9ddddZ:d Z;d Z<d Z=d  Z>d! Z?d" Z@d# ZAd$ ZBdS )%    N)ENOENT	ENOTEMPTY)Process)ArgumentParserRawDescriptionHelpFormatterAction)gfind_write_rowgfind_write)datetime)executeis_host_localmkdirpfail)setup_logger
human_timehandle_rm_error)get_changelog_rollover_timecache_outputcreate_file)OutputMergerz
GlusterFS Incremental API

ParseError c                   (     e Zd Zd fd	ZddZ xZS )StoreAbsPathNc                 L     t          t          |           j        ||fi | d S N)superr   __init__)selfoption_stringsdestnargskwargs	__class__s        7/usr/lib/x86_64-linux-gnu/glusterfs/glusterfind/main.pyr   zStoreAbsPath.__init__.   s0    *lD!!*>4JJ6JJJJJ    c                 l    t          || j        t          j                            |                     d S r   )setattrr!   ospathabspath)r   parser	namespacevaluesoption_strings        r%   __call__zStoreAbsPath.__call__1   s*    	49bgoof&=&=>>>>>r&   r   )__name__
__module____qualname__r   r0   __classcell__)r$   s   @r%   r   r   -   sW        K K K K K K? ? ? ? ? ? ? ?r&   r   c           	      v    t           j                            t          j        d          | || d|d          S )Nsession_dir_z_secret.pem)r)   r*   joinconfget_opt)sessionvolumes     r%   get_pem_key_pathr=   5   s?    7<<]33.5ggvvv>@ @ @r&   c                 p   	 t          |          }|r|dk    rdS t          |j        |j                  }|sdddddd|d| z  g|z   }t	          |t
          	          \  }}	}
|d
k    r"t          | d|d|
d|	|t
          	           |                    dd          rp|spdddd|d| d|                    d          t          j	        
                    |                    d                    g}t	          |d| z  t
                     dS dS dS # t          $ r t          j        d           Y dS w xY w)z3
    Runs command via ssh if host is not local
    deleteNsshz-oNumberOfPasswordPrompts=0z-oStrictHostKeyChecking=noz-tz-izroot@%sloggerr   z - z+ failed; stdout (including remote stderr):
z	
stderr:
copy_outfileFscpzroot@z:/node_outfilez%s - Copy command failedexit_msgrB      )r   r=   r;   r<   r   rB   r   getr)   r*   dirnameKeyboardInterruptsysexit)host	host_uuidtaskcmdargsoptslocaldirpem_key_path
returncodeerroutcmd_copys               r%   node_cmdrZ   <   s   0 ++
  	((F'dkBB 	+0/ t#% (++C ")V!<!<!<S#??  tttSSS##/         88NE** 	#8 	#54ll)-txx/G/G/GH(@(@AACH H'AD'H!# # # # # #	# 	# 	# 	#    s   D C2D D54D5c           
         t          |j                  }g }t          |          D ]\  }}|d                             d          \  }}|d         }	g }
i }|                    dd          }t
          j                            t          j	        d          |j
        |j        |d|z            }| dk    rt          d	k    rt          d
|j        z  t                     t          j        d          }d }|j        rFt          j        d          }|j                                        }|dk    rt%          |	          sdnd}t'          t
          j                            |          dt                     |j        }t%          |	          sd|z   dz   }||j
        |j        |||g|j        sDt-          |                    d                    t-          |                    d                    gng z   ||gng z   d|j        gz   |j        rdgng z   |j        rdgng z   |j        rdgng z   d|j        gz   |j        rd|gng z   }
||d<   d|d<   n| dk    rvd }t          j        d          }|j        rFt          j        d          }|j                                        }|dk    rt%          |	          sdnd}t'          t
          j                            |          dt                     |j        }t%          |	          sd|z   dz   }||j
        |j        |||g|j        sDt-          |                    d                    t-          |                    d                    gng z   ||gng z   dgz   d|j        gz   |j        rdgng z   |j        rdgng z   |j        rdgng z   d|j        gz   |j        rd|gng z   }
||d<   d|d<   n| dk    r	 t          j        |           n4# t:          t<          f$ r  t                              d |z             Y nw xY wt          j	        d!          d|j
        |j        t
          j                            |          g|j        rdgng z   }
n| d"k    r{t          d	k    rt          d
|j        z  t                     t          j	        d!          d"|j
        |j        ||                    d#          g|j        rdgng z   |j         rd$gng z   }
nl| d%k    r1t          j	        d!          d%|j
        |j        |g|j        rdgng z   }
n5| d&k    r/t          j	        d!          d&|j
        |j        g|j        rdgng z   }
|
rTtC          tD          ||	| |
||f'          }|#                                 |$                    |           |tJ          |j&        <   t          |          D ]\  }}|                                 |j'        dk    rt                              d(| d)||         d                    | d*v r"t          d(| d)||         d                    v| dk    s| dk    r)|j(        rtS          j*        d           tJ          |j&        = d S )+N   :r   tmpfilenameBADNAMEworking_dirztmp_output_%spreStartedVolume %s is not onlinerA   	changelog	brickfindr   z""Texit_on_errrB   'startend--output-prefix--debug--no-encode--only-namespace-changes--type--field-separatorrE   rC   queryz--only-querycleanupz#Failed to cleanup temporary file %s	nodeagentcreatetime_to_update--reset-session-timepostr?   )targetrR   zCommand z failed in )rt   r?   )+	get_nodesr<   	enumeratesplitrI   r)   r*   r8   r9   r:   r;   vol_statusStrr   rB   get_change_detectorfulltag_for_full_findstripr   r   rJ   field_separatorstroutput_prefixdebug	no_encodeonly_namespace_changestyperemoveOSErrorIOErrorwarnreset_session_timer   rZ   ri   appendg_pid_nodefile_mappidexitcodedisable_partialrL   rM   )rP   rR   r#   nodespoolnumnoderN   brickrO   rQ   rS   r^   rE   change_detectortagFSps                     r%   run_cmd_nodesr   s   s   dk""EDu%% T5 T5	T1gmmC((eG	 jj	::w||DL$?$?$(L$+$/$3c$9; ;
 5==	)).<"$ $ $ $ #6{CCOCy G"&":;"G"G,2244"99&3I&>&>F$$BC 27??<00#F4 4 4 4 %B ++ $2X^"<;!  9-#fjj))**C

50A0A,B,BCC*,. /#r3 #D$67	8 !%
2)
4 %)N:-< 261L ,-- DI&( /3i?%r**RAC" $0D #'D  W__C"6{CCOy G"&":;"G"G,2244"99&3I&>&>F$$BC 27??<00#F4 4 4 4 %B ++ $2X^"<;!  9-#fjj))**C

50A0A,B,BCC*,. /#r3   	! #D$67
8 !%
2)4 %)N:-< 2;,--8:< DI&(  /3i?%r**R!AC$ $0D #'D  Y	,''''W%   A() * * *
 <,,<;7??<00	2
 !%
2)4CC X	)).<"$ $ $ $
 <,,<;::.//1 !%
2)4 .2-D ())CC V^^<,,<;	
 !%
2)4CC X <,,<;  !%
2)	4C  	5x"ItS$EG G GAGGIIIKKNNN(4qu%D// 
2 
2Q	:??KKKTTT5:a==IJJJ+++$$$c
1FGGGG$'//' 2HQKKKK*151
2 
2s   O)).PPc                 d   ddd| dg}t          |dt                    \  }}}t          j        |          }|                    d          }t          |j                  dk    rt          d	t          
           |                    d          j        a|                    d          j        }g }|                    d          }	 g }	|dk    r+|		                    d           |		                    d           n|		                    d           |	D ]a}
|
                    |
          D ]I}|	                    |                    d          j        |                    d          j        f           Jbn=# t          t          t          f$ r#}t          d|z  t          
           Y d}~nd}~ww xY w|S )zX
    Get the gluster volume info xml output and parse to get
    the brick details.
    glusterr<   info--xml!Failed to Run Gluster Volume InforF   zvolInfo/volumes/countr   zUnable to get volume detailsrA    volInfo/volumes/volume/statusStrzvolInfo/volumes/volume/typeStrzvolInfo/volumes/volumeTierzbricks/hotBricks/brickzbricks/coldBricks/brickzbricks/brickhostUuidnamezFailed to parse Volume Info: %sN)r   rB   etree
fromstringfindinttextr   r|   r   findallr   AttributeError
ValueError)r<   rQ   r7   datatreecount_elvol_typeStrr   	volume_elbrick_elemselembes                r%   ry   ry     s    h
8C"E &( ( (JAtQ D!!D yy011H
8=Q+F;;;; II@AAFM))<==BKE		233IC&  788889999~... 	4 	4D&&t,, 4 4affZ005ffVnn13 4 4 4 44	4 
3 C C C.26BBBBBBBBBC Ls   B,E3 3F-
F((F-c                  <	   t          t          t                    } |                     d          }d|_        |                    d          }|                    dd           |                    d	d
           |                    ddd           |                    ddd           |                    ddd           |                    d          }|                    dd           |                    d	d
           |                    ddd           |                    d          }|                    ddd           |                    dd
d           |                    ddd           |                    d          }|                    dd           |                    d	d
           |                    ddt                     |                    ddd           |                    ddd           |                    ddd           |                    d d!d           |                    d"d#d$           |                    d%d&d           |                    d'd(d)d           |                    d*d+d,           |                    d-d.d/g d01           |                    d2d3d4           |                    d5          }|                    d	d
           |                    ddt                     |                    d6d7t          8           |                    d9d:t          8           |                    ddd           |                    ddd           |                    ddd           |                    d d!d           |                    d"d#d$           |                    d'd(d)d           |                    d*d+d,           |                    d-d.d/g d01           |                    d2d3d4           |                    d;          }|                    dd           |                    d	d
           |                    ddd           | 	                                S )<N)formatter_classdescriptionmode)r!   Trt   r;   zSession Name)helpr<   zVolume Namerl   Debug
store_true)r   actionz--forcez$Force option to recreate the sessionrv   z"Reset Session Time to Current Timer?   listz	--sessionr   )r   defaultz--volumera   outfilezOutput Filerm   z!Do not encode path in output filez--fullz	Full findz--disable-partialz.Disable Partial find, Fail when one node failsrk   zFile prefix in output.z--regenerate-outfilezGRegenerate outfile, discard the outfile generated from last pre command-Nrn   zList only namespace changesz--tag-for-full-findzNTag prefix for file names emitted during a full find operation; default: "NEW"NEWro   z>type: f, f-files only d, d-directories only, by default = bothboth)fdr   )r   r   choicesrp   zField separator string rq   z--since-timez/UNIX epoch time since which listing is required)r   r   z
--end-timez/UNIX epoch time up to which listing is requiredrw   )
r   r   PROG_DESCRIPTIONadd_subparsersrequired
add_parseradd_argumentr   r   
parse_args)r,   
subparsersparser_createparser_deleteparser_list
parser_preparser_queryparser_posts           r%   	_get_argsr   E  s   ,G(8: : :F&&F&33JJ ))(33My~>>>xm<<<yw|LLLy 0-5A  C C C5$H&2  4 4 4
 ))(33My~>>>xm<<<yw|LLL ''//K[~rJJJZmRHHHYW\JJJ &&u--JIN;;;H=999IM,OOOIGLIIIM!D#/  1 1 1 H;|LLL/ 77?K  M M M-4K$'  ) ) )2">#/  1 1 1 D"<!>#/  1 1 1 1"G$)  + + + H ,H$*4F4F4F  H H H /6N$'  ) ) )
 ((11Lh];;;im%1  3 3 3n 4:@C  E E El 2:@C  E E Em#F%1  3 3 3 h[NNNiglKKK1 9:BN  P P P/6M&)  + + +d$>#@%1  3 3 3 3$I&+  - - - h .J&,6H6H6H  J J J 1#;&)  + + +
 ''//KY^<<<XM:::YW\JJJr&   c                    t          | j        | j                  }t          j                            |          s>dddd|g}t          |d|z  t                     t                              d|z             	 t          j
        |dz   t          j                            t          j        d	          d
| j        d| j        d                     nj# t          t          f$ rV}t!          dt          j                            t          j        d	          d
          d|t                     Y d }~nd }~ww xY wdddddt          j                            |          z  g}t          |dt                     t                              d           ddddddt          j                            |          z  g}t          |dt                     t                              d           d S )Nz
ssh-keygenr   r   z-fzUnable to generate ssh key %srF   zSsh key generated %sz.pubr6   .keysr7   z_secret.pem.pubzFailed to copy public key to : rA   r   zsystem::copyfilez/glusterfind/.keys/%s.pubzFailed to distribute ssh keysz*Distributed ssh key to all nodes of Volumer   add_secret_pubrootz.Failed to add ssh keys to authorized_keys filez0Ssh key added to authorized_keys of Volume nodes)r=   r;   r<   r)   r*   existsr   rB   r   shutilcopyfiler8   r9   r:   r   r   r   basename)rR   rU   rQ   r   s       r%   	ssh_setupr     s7   #DL$+>>L7>>,'' ;	
 	8	 	 	 	
 	*\9:::	v-T\-%@%@%,?C|||?C{{{&LM M	N 	N 	N 	N
 W   T\-88'BBBBAAG	 	 	 	 	 	 	 	 	 &)9)9,)G)GG	IC C9&IIII
KK<=== &)9)9,)G)GGIC CE    KKBCCCCCs   9AC D:$AD55D:c                    t          ddd| j        ddgdt                     t                              d| j        z             t          ddd| j        d	dgd
t                     t                              d| j        z             t          ddd| j        ddgdt                     t                              d| j        z             d S )Nr   r<   setzbuild-pgfidonz*Failed to set volume option build-pgfid onrF   z$Volume option set %s, build-pgfid onzchangelog.changelogz2Failed to set volume option changelog.changelog onz,Volume option set %s, changelog.changelog onzchangelog.capture-del-pathz9Failed to set volume option changelog.capture-del-path onz3Volume option set %s, changelog.capture-del-path on)r   r<   rB   r   )rR   s    r%   enable_volume_optionsr     s   Y%[-/A    KK6DEEEY%[/7%-35 5 5 5 KK>+    Y%[6>,4:< < < < KKE+     r&   c           
         t          j        | dd          5 }|                                D ]}|d                             d          }d }|D ]~}|dk    r	|                    dd          }|s|d	                             dd          }||k    rD|r |dk    rt          ||d
         |||           ft          ||d
         ||           	 d d d            d S # 1 swxY w Y   d S )Nazutf-8)encodingr\   ,r   z///rH   r   )codecsopenrI   r{   replacer	   r
   )	r   outfilemergerr   r   rowpaths	row_2_repr   p_reps	            r%   write_outputr     sx   	WcG	4	4	4 C $$&& 	C 	CCFLL%%EI C C77		$,,  : #AtS 9 9II%% Cb#As1vyQQQQ  3q6?EBBBBC		CC C C C C C C C C C C C C C C C C Cs   B6CC #C c                 >   ddd| dg}t          |dt                    \  }}}	 t          j        |          }|                    d          j        }n0# t          t          f$ r}t          d|z             Y d }~nd }~ww xY w|d	k    rt          d
| z             d S d S )Nr   r<   r   r   r   rF   r   z)Invalid Volume: Check the Volume name! %srb   rc   )	r   rB   r   r   r   r   r   r   r   )r<   rQ   r7   r   r   	statusStrr   s          r%   validate_volumer     s    h
8C"E &( ( (JAtQ>%%II@AAF		' > > >81<========>I&/00000 s   .A B $A;;B rH      z0-9a-zA-Z_-)
min_length
max_lengthvalid_charsc                    t          |           t          d         k     r-t          dt          t          d                   z   dz              t          |           t          d         k    r-t          dt          t          d                   z   dz              t	          j        dt          d         z   d	z   |           st          d
t          d         z              d S d S )Nr   zsession_name must be at least z characters long.r   zsession_name must not exceed z characters length.z^[r   z]+$z0Session name can only contain these characters: )lenSESSION_NAME_RULESr   r   rematch)r;   s    r%   validate_session_namer  #  s   
7||(666-'56679LM 	N 	N 	N 7||(666,'56679NO 	P 	P 	P 8E.}==&( ( <?+M:; 	< 	< 	< 	< 	<< <r&   c                    t          |j                   t                              d|j        d|j                   t          | dt                     t          t          j                            | |j                  dt                     t          j                            | |j        d          }t          j        	                    |          r%|j
        st          d|j        z  t                     t          j        	                    |          r|j
        rt          |           t          |           t          t          j                              t!          |j                  z   }t#          d|t%          |          	           t          j        	                    |          r|j        rJt)          |d
          5 }|                    t%          |                     d d d            n# 1 swxY w Y   t,          j                            d|j        d|j        d           t-          j        d           d S )NzInit is called - Session: 
, Volume: Trf   statuszSession %s already createdrA   rt   )ru   wSession z created with volume 
r   )r  r;   rB   r   r<   r   r)   r*   r8   r   forcer   r   r   r   timer   r   r   r   r   writerL   stdoutrM   )r6   rR   status_fileru   r   s        r%   mode_creater  4  s?   $,'''
LLLLLL$++/ 0 0 0
;D8888
27<<T[11t   ',,{DKBBK	w~~k"" I4: I)DL8HHHH7>>+&& $$* $$d### %%(C) ) N (D^1D1DEEEE7>>+&& )$*A )+s## 	)qGGC''(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) JlllDKKK1 2 2 2 HQKKKKKs   #G77G;>G;c           
         ddd|j         dg}t          |dt                    \  }}}	 t          j        |          }|                    d          j        }n7# t          t          f$ r#}t          d|z  t          	           Y d }~nd }~ww xY w|d
k    rt          d|j         z  t          	           t          | dt                     t          t          j                            | |j                   dt                     t          t          j                            |j                  dt                     t!          |           t#          |           |j        s|j        dv rt          d           |j        s$|j        s|j        st          dt          	           |j        r$|j        r|j        rt          dt          	           |j        r|j        st          dt          	           d}d}	|j        r|j        }|j        r|j        }	nd}t                              ddd|j         d|d|	           t/          j                                        d          }
|
t5          t7          j                              z   at=          d|||	t:                     |j        r|t?          t@                    dk    rMddgtC          t@          "                                          z   d|j        gz   }t          |d t                     nt          d!t          	           nstG          |j        dt                     tI          |j        d"z   tC          t@          "                                                    }tK          |j        ||j&                   	 t          j'        |j        d"z              n# tP          tR          f$ r Y nw xY wt=          d#|t:          $           tT          j+        ,                    d%|j        z             d S )&Nr   r<   r   r   r   rF   r   zInvalid Volume: %srA   rb   rc   Trf   r   r   #--type can only be used with --fullzHPlease specify either {--since-time and optionally --end-time} or --fullzVPlease specify either {--since-time and optionally --end-time} or --full, but not bothz#Please specify --since-time as wellr   zQuery is called - Session: r   r  , Start time: , End time: %Y%m%d-%H%M%S-%f-rq   ri   rj   r^   sort-u-o1Failed to merge output files collected from nodesQFailed to collect any output files from peers. Looks like all bricks are offline..dbrr   r^   Generated output file %s
)-r<   r   rB   r   r   r   r   r   r   r   r   r)   r*   r8   rJ   r   r   r   r~   r   
since_timeend_timer   r   nowstrftimenexttempfile_get_candidate_namesgtmpfilenamer   r   r   r   r.   r   r   r   r   r   r   r   rL   r  r
  )r6   rR   rQ   r7   r   r   r   r   ri   rj   prefixr   s               r%   
mode_queryr'  V  sq   
 hW
=C"E &( ( (JAtQ6%%II@AAF		' 6 6 6!A%f5555555556 I&4VDDDD
;D8888
27<<T[11t   
27??4<((d6JJJJ dOOO $ 9 4j002333? )4= ) ) !'	) 	) 	) 	)  4= TY  '	 	 	 	 } CT_ C26BBBB E
C = 	 -C
LLLIIt{{{EEE338 9 9 9 \^^$$%899FD!>!@!@AAAL'4u#*, , , , y H!""Q&&4.4(:(A(A(C(C#D#DD&'CC+39; ; ; ; ;  6>DF F F F F 	DLd6BBBB$T\E%9%)*<*C*C*E*E%F%FH HT\=$2FGGG
	$,&''''W    )T|<<<<J1DL@AAAAAs)   .A B)BBN8 8OOc           
         	 t          t          j                              t          |j                  z
  }t          j                            | |j        d          }|dz   }t          t          j                            |j	                  dt                     |j        s|j        dv rt          d           t          j                            |          r|j        st          d           d}	 t!          |          5 }t          |                                                                          }d d d            n# 1 swxY w Y   nE# t&          $ r Y n9t(          t*          f$ r&}t          d	|d
|t                     Y d }~nd }~ww xY wt                              d|j        d|j        d|d|           t1          j                                        d          }|t7          t9          j                              z   at?          d||dt<                     |j        r|tA          tB                    dk    rMddgtE          tB          #                                          z   d|j	        gz   }	tI          |	dt                     nt          dt                     nstK          |j	        dt                     tM          |j	        dz   tE          tB          #                                                    }
tO          |j	        |
|j(                   	 t	          j)        |j	        dz              n# t*          t(          f$ r Y nw xY wt?          d|t<                     t!          |d          5 }|*                    tW          |                     d d d            n# 1 swxY w Y   tX          j-        *                    d|j	        z             d S )Nr  .preTrf   r  r  z@Post command is not run after last pre, use --regenerate-outfiler   zError Opening Session file r   rA   zPre is called - Session: r  r  r  r  ra   r  r  r  r  r  r  rF   r  r  rr   r  r  r  ).r   r	  r   r<   r)   r*   r8   r   rJ   r   rB   r~   r   r   r   regenerate_outfiler   readr   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   rL   r  )r6   rR   endtime_to_updater  status_file_preri   r   r   r&  rQ   r   s              r%   mode_prer.    sz    DIKK((+F, , ',,{DKBBK!F*O
27??4<((d6JJJJ9 4j002333 
w~~o&& )t/F ) ( 	) 	) 	) E0+ 	*!(())E	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*   W 0 0 0QQ (.	0 	0 	0 	0 	0 	0 	0 	0 	00 LLLLLL$+++uuu6G6GI J J J \^^$$%899FD!>!@!@AAAL%UMMMM y H!""Q&&4.4(:(A(A(C(C#D#DD&'CC+39; ; ; ; ;  6>DF F F F F 	DLd6BBBB$T\E%9%)*<*C*C*E*E%F%FH HT\=$2FGGG
	$,&''''W    )T|<<<<	os	#	# (q	%&&'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( J1DL@AAAAAsf   2E 4E5E EE E	E 
FF)F

FL8 8MM6#N%%N),N)c                    t           j                            | |j        d          }t                              d|j        d|j                   |dz   }t           j                            |          rkt          d|           t          j	        ||           t          j                            d|j        d|j        d           t          j        d	           dS t          d
t                     dS )zr
    If pre session file exists, overwrite session file
    If pre session file does not exists, return ERROR
    r  zPost is called - Session: r  r)  rw   r   with volume z	 updated
r   zPre script is not runrA   N)r)   r*   r8   r<   rB   r   r;   r   r   renamerL   r  r
  rM   r   )r6   rR   r  r-  s       r%   	mode_postr2    s    
 ',,{DKBBK
LLLLLL$++/ 0 0 0!F*O	w~~o&& 5fd###
	/;///
,,,5 	6 	6 	6$V444444r&   c                    t          d|           t          j        t          j                            | |j                  t                     t          j	        
                    d|j        d|j        d           	 t          j        |            d S # t          $ r>}|j        t          k    s#t                               d|z             Y d }~d S Y d }~d S d }~ww xY w)Nr?   )onerrorr  r0  z	 deleted
z&Failed to delete session directory: %s)r   r   rmtreer)   r*   r8   r<   r   rL   r  r
  r;   rmdirr   errnor   rB   r   )r6   rR   r   s      r%   mode_deleter8    s    (D!!!
M"',,{DK88)+ + + +JlllDKKK1 2 2 2F
 F F Fw)##KK@1DEEEEEEEEE $#####Fs    B 
C -CCc           
      N   |j         rat          j                            t          j                            | |j                             st          dt                     |j         g}n4g }t          j        |           D ]}|dk    r|                    |           g }|D ]}t          j        t          j                            | |                    }|D ]}|j	        r|j	        |k    rt          j                            | ||d          }d}		 t          |          5 }
|
                                                                }	ddd           n# 1 swxY w Y   n/# t          t          f$ r}|j        t           k    rY d}~ d}~ww xY w|                    |||	f           А	|rt"          j                            d                    d          dd	                    d          dd
                    d          d           t"          j                            d           t"          j                            d           |D ]\  }}}	d}|	r#	 t+          |	          }n# t,          $ r d}Y nw xY wt"          j                            |                    d          d|                    d          d|                    d          d           |sG|j         s|j	        rt          dt                     dS t"          j                            d           dS dS )z_
    List available sessions to stdout, if session name is set
    only list that session.
    zInvalid SessionrA   r   r  NSESSION   r   VOLUMEzSESSION TIMEr  zK---------------------------------------------------------------------------zSession CorruptedzNo sessions found.
)r;   r)   r*   r   r8   r   rB   listdirr   r<   r   r+  r   r   r   r7  r   rL   r  r
  ljustr   	TypeError)r6   rR   sessionsr   outputr;   volnamesvolnamer  last_processedr   r   	sess_times                r%   	mode_listrF    s   
 | #w~~bgll;EEFF 	3"62222L>K(( 	# 	#AG||"""F > >:bgll;@@AA 	> 	>G{ t{g55',,{GWhOOK!N+&& 6!%&VVXX^^%5%5N6 6 6 6 6 6 6 6 6 6 6 6 6 6 6W%   7f$$HHHH	
 MM7G^<====	>   
)<)<)<)<)1););););)7)=)=b)A)A)A)AC 	D 	D 	D 	
   
,2 	? 	?(.'	 	00&~66		 0 0 0/			0
r):):):):)0r):):):):)2)<)<)<)<> 	? 	? 	? 	?  5< 	54; 	5"6222222J344444	5 5sT   E !'EE EE EE  F1FFFI((I76I7c                     d } 	 t                      } t          t          j        d          d           | j        dk    rd| _        | j        dk    rt          j        d          }n7t          j                            t          j        d          | j                  }t          j        	                    |          s | j        dvrt          d| j        z             | j        d	vrt          | j                   | j        d
v r"| j        dk    rt          d| j        z             t          j                            || j                  }t          j        	                    |          s(| j        dvrt          d| j        d| j                   t          t          j                            t          j        d          | j        | j                  d           t          j                            t          j        d          | j        | j        d          }t          t          || j                    t!                      d| j        z            ||            d S # t"          $ rw | ]| j        dk    s| j        dk    rGt$          @t'          j        t&          j        t&          j                   t-          d| t$                     t/          j        d           Y d S w xY w)Nr6   T)rg   rq   r   r   )rt   r   rq   zInvalid session %s)r   )rt   rw   ra   r?   r  z not created with volume log_dirzcli.logmode_ra   rr   r  rH   )r   r   r9   r:   r   r;   r)   r*   r8   r   r   r   r<   r   rB   r   globalsrK   r%  signalSIGINTSIG_IGNr   rL   rM   )rR   r6   vol_dirlog_files       r%   mainrP  [  s    D9{{t|M**==== 9$DL9,}55KK',,t|M'B'B'+|5 5K w~~k** 	6	!<<<%4555 9H$$DK((( 9;;;	))%4555',,{DK88w~~g&& 	.49+,, ,,D,,,- . . . 	rw||DL33 L K) )  	! 	! 	! 	! 7<<Y 7 7 $ $ )+ + 	VXtz222 	'		'DI%&{D99999 
 
 
yE!!TY'%9%9+M&-@@@!)T|LLLL 	
s   II A=KK)CrL   r7  r   r   r	  multiprocessingr   r)   xml.etree.cElementTreer   cElementTreeargparser   r   r   gfind_py2py3r	   r
   loggingr   r#  rK  r   r   r   utilsr   r   r   r   r   r   r   r   r   r   r9   changelogdatar   r   hasattrr   SyntaxError	getLoggerrB   r|   r%  r   r   r=   rZ   r   ry   r   r   r   r   r   r   r  r  r'  r.  r2  r8  rF  rP   r&   r%   <module>r]     s&   


 # # # # # # # #  # # # # # # 				 & & & & & & & & & H H H H H H H H H H 5 5 5 5 5 5 5 5            				 6 6 6 6 6 6 6 6 6 6 6 6 ; ; ; ; ; ; ; ; ; ; H H H H H H H H H H  & & & & & &  ")!=!=NU;
				 ? ? ? ? ?6 ? ? ?@ @ @4 4 4nd2 d2 d2N ' ' 'Td d dN2D 2D 2Dj  ,C C C*1 1 1 !	  < < <"  DYB YB YBxEB EB EBP5 5 5(F F F"95 95 95x> > > > >r&   