
    HmdQ                        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	Z	d dl
Z
d dl	mZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlZd dl m Z! d dl"m#c m$Z% d dlm&Z' 	 d dl(m)Z) n# e*$ r	 d dl+m)Z) Y nw xY wd d	l,m-Z-m.Z. ej/        0                    d
e-           dZ1	 d dl2m3Z4 d dl2m5Z6 d dl2m7Z8 d dl2m9Z: n# e*$ r dZ1dZ4dZ6dZ8dZ:Y nw xY wd dl;Z<d dl=m=Z= d dl>m?Z?  e@edd          ZAdZBdZCdZDdZEdaFdaGdaHdaIdZJdZKdZL e            ZMd ZNd ZOd ZPd ZQd  ZRd! ZSd" fd#ZTd$ ZUd% ZVdbd&ZWdcd'ZXd( ZYd) ZZ G d* d+e[          Z\ G d, d-e          Z G d. d/e]          Z^ G d0 d1e[          Z_ e_            Z`dbd2Zad3 Zbd4 Zcd5 Zdd6 Zd7 Z d8 Zeeefd9Zfd: Zgd; Zhd< Zid= Zjd> Zkd? Zld@ ZmdA ZnefdBZog g g fdCZpdD ZqdE ZrdF Zs G dG dHe]          Zt G dI dJe]          Zu G dK dLe]          Zv G dM dNew          ZxdO Zy G dP dQe[          ZzdR Z{dS Z|dT Z}dU Z~dV ZdW Z G dX dYe	j                  ZdZ Z G d[ d\e[          Z G d] d^e[          Zddd`Zda ZdS )e    N)PIPE)LockThread)EACCESEAGAINEPIPEENOTCONNENOMEMECONNABORTEDEINTRENOENTESTALEEBUSYENODATA	errorcodeEIOsignalSIGTERM)waitpiderror)PickleError)GLUSTERFS_LIBEXECDIR	UUID_FILE   T)GEOREP_FAULTY)GEOREP_ACTIVE)GEOREP_PASSIVE)GEOREP_CHECKPOINT_COMPLETEDF)rconf)sha256ENOTSUP
EOPNOTSUPPz.gfid/z$00000000-0000-0000-0000-000000000001
   %   z%20z%0Az%25c                      t          t          t          |           |           t          j        d          j        j                  |i |S )zaa rubyesque "super" for python ;)

    invoke caller method in parent class with given args.
    r   )getattrsupertypesys	_getframef_codeco_name)xakws      C/usr/lib/x86_64-linux-gnu/glusterfs/python/syncdaemon/syncdutils.pysupr3   M   sR    
475a!$$=##*24 456>:<> > >    c                 T    |                      dd                              d          S )zlthe chosen flavor of string escaping, used all over
       to turn whatever data to creatable representation/-)replacestripss    r2   escaper<   V   s&     99S#$$S)))r4   c                     |                      dt                                         dt                                         dt                    S )N% 
)r8   PERCENTAGE_ESCAPE_CHARSPACE_ESCAPE_CHARNEWLINE_ESCAPE_CHARr:   s    r2   escape_space_newlinerD   \   s9    99S011WS+,,WT.//0r4   c                     |                      t          d                               t          d                               t          d          S )Nr?   r@   r>   )r8   rB   rC   rA   r:   s    r2   unescape_space_newlinerF   b   s9    99&,,W($//W+S112r4   c                     t          t          j        g dt          t          t
          gt          g          } t          | t                    rt          j
        d           dS |                     d          } | dk    rdS dS )N).zdht.subvol.status   zfailed to get the xattr valuer    1r   )
errno_wrapXattr	lgetxattrr   r#   r   r
   
isinstanceintloggingr   rstrip)rets    r2   gf_mount_readyrT   h   sz    
U_333gw/&; ;C #s }4555a
**V

C
czza1r4   c                 6    | r|                      dd          S d S )Nr7   _)r8   r:   s    r2   normrW   u   s(     #yyc"""# #r4   c                     dS NT )fs    r2   <lambda>r\   z   s     r4   c                 f   dx}}	 t          j        | t           j        t           j        z            }	 t          j        |d          }n#  t          j        |            xY wt          j        |t          j                    ||          s 	 ||fD ]}|r|                                 dS | dz   t          t          j
                              z   }t          j        |t           j        t           j        z  t           j        z            }	 t          j        |dd          }n#  t          j        |            xY w ||           t          j        |           t          j        ||            ||fD ]}|r|                                 dS # ||fD ]}|r|                                 w xY w)z*update a file in a transaction-like mannerNzr+bz.tmp.wbr   )osopenO_CREATO_RDWRfdopenclosefcntllockfLOCK_EXstrgetpidO_EXCLO_WRONLYfsyncrename)pathupdatermergerfrfwfdfxtmpps           r2   update_filerv   z   s    NBWT2:	122	2u%%BB	HRLLLB&&&vbzz 	 r( 	 	B 


	 	 g~BIKK 0 00WT2:	1BK?@@	2tQ''BB	HRLLL

	$r( 	 	B 


	 	2r( 	 	B 


	sA   ,F A	 F 	A  -F -AF D$ #F $D;;7F F0c                 0   d}	 t          j        | t           j        t           j        z            }	 t          j        ||           n#  t          j        |            xY w	 |t          j        |           dS dS # |t          j        |           w w xY w)z3
    Create manifest file for SSH Control Path
    N)r_   r`   ra   rb   writerd   )fnamecontentrs   s      r2   create_manifestr{      s     
B	WUBJ233	HR!!!!	HRLLL "
 >HRLLLLL >2>HRLLLL s"   ,A< A A< AA< <Bc                 |   | t           _        d|d|}|                                }t          |          }	 |dd         }t          j                            t           j        d|z            }t          ||           t          j                            t           j        d|z            }dd|gt           _        dS )	z1
    Setup GConf ssh control path parameters
    zSECONDARY_HOST=z
SECONDARY_RESOURCE_URL=N    z%s.mftz%s.sockz-oControlMaster=autoz-S)	r!   ssh_ctl_direncode	sha256hexr_   rn   joinr{   ssh_ctl_args)ctldremote_addrresource_urlrz   encoded_contentcontent_sha256ry   ssh_ctl_paths           r2   setup_ssh_ctlr      s     E@K8DFGnn&&O//N $CRC(NGLL*!N24 4E E?+++7<< 1 )N :< <L0$EEr4   c                    t          j        | t           j        t           j        z            }t          j        |d          }	 t          j        |t
          j        t
          j        z             n`#  t          j
                    d         }|                                 t          |t                    r|j        t          t           fv rY dS  xY w|rY	 |                                 |                    |           |                                 n#  |                                  xY wt(          j                            |           |S )zaopen @fname + contest for its fcntl lock

    @content: if given, set the file content to it
    zr+r   N)r_   r`   ra   rb   rc   re   rf   rg   LOCK_NBr+   exc_inford   rO   IOErrorerrnor   r   truncaterx   flushr!   permanent_handlesappend)ry   rz   rs   r[   exs        r2   grabfiler      s    

RY.	/	/B
	"dAAu}u}45555\^^A				b'"" 	rxFF3C'C'CFF 	JJLLLGGGGGIIII	GGIII	""1%%%Hs   ,A0 0ACC=D D(c                     | st          j        d          } d}|r#t          t          j                              dz   }t          | |          S )z%.grabfile customization for pid fileszpid-fileNr@   )rz   )gconfgetrh   r_   ri   r   )ry   setpidrz   s      r2   grabpidfiler      sQ     &	*%%G *bikk""T)E7++++r4   c                     t                                            t          j        d          rt          j        }t          j        rkd}	 t          d          }|snUt          j	        t          j        t          j
                  d         t          j        k    rd}nt          j        d           h|rR	 t          j        t          j                   n2#  t          j                    d         }|j        t$          k    rn Y nxY wt          j        r/t          j        s#d }t)          j        t          j        |	           	 t          j        rt          j        rt          j        t          j        d
gz   }nddt          j        g}t3          j        |t2          j        d          }|                                \  }}	|j        dk    r0	 t          j        t          j                   n# t>          $ r Y nw xY w	 t          j         rtC          j"        d           t          j#        $                                 t          j%        $                                 t          j&        |                    dd                     dS )zvall those messy final steps we go trough upon termination

    Do away with pidfile, ssh control dir and logging.
    pid_fileFT)r   r   皙?r   c                 B    |d         j         t          k    rd S |d         )Nr   )r   r   )funcrn   r   s      r2   handle_rm_errorz!finalize.<locals>.handle_rm_error  s#    { F**1+r4   )onerrorlazyumountz-l)stderruniversal_newlineszexiting.exvalN)'
final_lockacquirer   r   r!   pid_file_ownedcpidr   r_   r   WNOHANGtimesleepunlinkr   r+   r   r   r   r~   shutilrmtreemount_pointmountbrokermbr_umount_cmd
subprocessPopenr   communicate
returncodermdirOSErrorlog_exitrQ   infostdoutr   r   _exit)
argskwargsrm_pidfr[   r   r   
umount_cmdp0rV   errdatas
             r2   finalizer      sX    y &: 	 G	 u--- :ej"*55a8EJFF"G
3	   		%.))))\^^A&8v%% D  B B	 	 	
 	e'AAAA  	=-1BF0KKJJ"D%*;<Jj157 7 7^^%%
7=A*++++    ~ !Z   JJHVZZ##$$$$$s   4C -DG' '
G43G4c                    d}t          j                    j        D ]B}t          t          |dd          dd          }|rt	          j         |                      sd}Ct          j                    d         }t          |t                    r|j
        pd| _         d}t          |t                    rS|rt          j        |j        d                    t          j                            d|j        d         z   d	z              nt          |t"                    sOt          |t$                    s:t          |t&                    st          |t(                    r|j        t,          k    rt          j        d
           t/          t0          d          ryt0          j                                         t0          j        j        dk    r(t          j        d           t          j        d           t0          j                                         nt          |t&                    rI|j        t:          t<          fv r4t          j        t?          dt@          |j                                      nRt          |t&                    r;|j        tB          k    r+t          j        d           t          j        d           d}nd}|s2t          j                    "                    t           j#                  rd}|rOt          j$        |dz              t          j                            dtK          |          j&        d|d           d| _        t          j'        | j                   dS )ztop-level exception handler

    Try to some fancy things to cover up we face with an error.
    Translate some weird sounding but well understood exceptions
    into human-friendly lingo
    FstreamNfilenoTr   r   z	failure: r@   zconnection to peer is broken	transport   zgetting "No such file or directory"errors is most likely due to MISCONFIGURATION, please remove all the public keys added by geo-replication from authorized_keys file in secondary nodes and run Geo-replication create command again.zIf `gsec_create container` was used, then run `gluster volume geo-replication <PRIMARYVOL> [<SECONDARYUSER>@]<SECONDARYHOST>::<SECONDARYVOL> config remote-gsyncd <GSYNCD_PATH> (Example GSYNCD_PATH: `/usr/libexec/glusterfs/gsyncd`)zGluster Mount process exitedr   z\Getting "Input/Output error" is most likely due to a. Brick is down or b. Split brain issue.zThis is expected as per design to keep the consistency of the file system. Once the above issue is resolved geo-replication would automatically proceed further.FAILzFULL EXCEPTION TRACEz: zfailed with z.
)(rQ   	getLoggerhandlersr(   r_   isattyr+   r   rO   
SystemExitcoder   GsyncdErrorr   r   r   rx   r   EOFErrorr   r   r   r   hasattrr!   r   waitr   terminate_geterrr	   r   lfr   r   isEnabledForDEBUG	exceptionr*   __name__exit)excont
is_fileloghfnoexclogtags         r2   log_raise_exceptionr   *  s?    J  )  ga400(DAA 	ry'' 	J
,..
C#z"" 5x}1c;'' )	 +chqk***J[38A;6=>>>>[)) %	ZX-F-F %	g&&%	*4S'*B*B%	Y%M8999uk** 3$$&&&?-44M #3 4 4 4 M #E F F F 00222W%% 	#)8D8F +F +FM";#,SY#79 9 9 : : : :W%% 	#)s*:*:M 2 3 3 3 M - . . .
 FFF 	,'+--::7=II 	,+F 	Rftm,,,JS		8J8J8JCCCPQQQr4   c                       e Zd ZdZd ZdS )
FreeObjectz1wildcard class for which any attribute can be setc                 \    |                                 D ]\  }}t          | ||           d S N)itemssetattr)selfr1   kvs       r2   __init__zFreeObject.__init__u  s<    HHJJ 	  	 DAqD!Q	  	 r4   Nr   
__module____qualname____doc__r   rZ   r4   r2   r   r   q  s)        ;;         r4   r   c                       e Zd ZdZd ZdS )r   zthread class flavor for gsyncd

    - always a daemon thread
    - force exit for whole program if thread
      function coughs up an exception
    c                     |                     d          r
fd}||d<   t          j        | g|R i | |                     d           d S )Ntargetc                      t          d          }	  |   d S #  	 t          |           t          |j                   Y d S # t          |j                   w xY wxY w)Nr   r   )r   r   r   r   )aargsr   tfs     r2   twrapzThread.__init__.<locals>.twrap  sx    #!,,,5BJJJJ55+F333 v|4444444v|44444s    AAAAAT)r   
baseThreadr   	setDaemon)r   r   r   r   r   s       @r2   r   zThread.__init__  sz    ZZ!! 
	%5 5 5 5 5  %F8D242226222tr4   Nr   rZ   r4   r2   r   r   z  s-             r4   r   c                       e Zd ZdS )r   Nr   r   r   rZ   r4   r2   r   r             Dr4   r   c                       e Zd ZdZd ZdS )
_MetaXattra<  singleton class, a lazy wrapper around the
    libcxattr module

    libcxattr (a heavy import due to ctypes) is
    loaded only when when the single
    instance is tried to be used.

    This reduces runtime for those invocations
    which do not need filesystem manipulation
    (eg. for config, url parsing)
    c           	          ddl m} d t          |          D             }||vrd S |D ]!}t          | |t	          ||                     "t	          | |          S )Nr   )rM   c                 *    g | ]}|d          dk    |S )r   rV   rZ   ).0ms     r2   
<listcomp>z*_MetaXattr.__getattr__.<locals>.<listcomp>  s!    777q1Q43;;;;;r4   )	libcxattrrM   dirr   r(   )r   methLXattrxmethr  s        r2   __getattr__z_MetaXattr.__getattr__  s{    ------77CKK777uF 	1 	1AD!WVQ//0000tT"""r4   N)r   r   r   r   r  rZ   r4   r2   r   r     s-        
 
# # # # #r4   r   c                 ^    | t          j                    } t          j        |           j        S r   )r_   geteuidpwdgetpwuidpw_name)uids    r2   getusernamer    s%    
{jll<$$r4   c                  0    t          j                    dk    S Nr   )r_   r
  rZ   r4   r2   
privilegedr    s    :<<1r4   c                     g d}g d}t          | t                    r| S d}|                                 }||v rd}n'||vr#t          j        t          d|                      |S )z
    Generic string to boolean converter

    return
    - Quick return if string 's' is of type bool
    - True if it's in true_list
    - False if it's in false_list
    - Warn if it's not present in either and return False
    )trueyesrK   on)falseno0offFTzEUnknown string in "string to boolean" conversion, defaulting to False)rh   )rO   boollowerrQ   warnr   )r;   	true_list
false_listrvlstrs        r2   boolifyr"    s     +**I,,,J!T 	B7799Dy	Z		R .   	  	  	  Ir4   c                     	 	  | | S # |$ r3 t          j                    d         }|j        d         t          k    s Y nw xY wB)zN
    wrapper around syscalls resilient to interrupt caused
    by signals
    Tr   r   )r+   r   r   r   )r   r   r   r   s       r2   
eintr_wrapr$    sd    
	4; 	 	 	"B71:&& '&	s    5A A c                  F    t          t          j        t          j        g| R  S r   )r$  oselectselectr   r   s    r2   r'  r'    s    gngm;d;;;;r4   c                  2    t          t          t          g| R  S r   )r$  owaitpidr   r(  s    r2   r   r     s    h/$////r4   c                 *    t          | |d           d S )Nr   r   )r   )signumframes     r2   term_handler_default_hookr.    s    VU!$$$$$$r4   c                 0    t          t          |            d S r   r   )hooks    r2   set_term_handlerr1    s    
7Dr4   c                  ^   t           t           S da t          t                    5 } | D ]F}|                    d          r/|                                                    d          d         a  nGd d d            n# 1 swxY w Y   t           dk    rt          dt          z            t           S )N zUUID==zFailed to get Host UUID from %s)NodeIDr`   r   
startswithr9   splitr   )r[   lines     r2   get_node_uuidr:    s    F	i A 	 	Dw'' ++C004               ||;iGHHHMs   A
A;;A?A?c                 &    | t                      k    S r   )r:  )host_ids    r2   is_host_localr=    s    moo%%r4   c                 :    t          | dd           }|s| j        }|S )N	func_code)r(   __code__)r[   fcs     r2   funcoderB    s'    	K	&	&B ZIr4   c                 B     t                     }|j         fd}|S )Nc                 t    t          | dz   d           }|  | g|R i |}t          | dz   |           |S )NrV   )r(   r   )r   r0   r1   r   r[   fns       r2   ffzmemoize.<locals>.ff  sW    T38T**:4"!"""r""BD#(B'''	r4   )rB  r.   )r[   rA  rF  rE  s   `  @r2   memoizerG    s;    	B	B      Ir4   c                  *    t          j        d          S r  )r_   umaskrZ   r4   r2   rI  rI  !  s    8A;;r4   c                 .    |                      dd          S )Nr6   r   )rsplites    r2   entry2pbrN  %  s    88Cr4   c                      t           S r   )_CL_AUX_GFID_PFXrZ   r4   r2   gauxpfxrQ  )  s    r4   c                 D    t          |                                           S r   )r"   	hexdigestr:   s    r2   r   r   -  s    !99   r4   c                 R    t          j        t          j                    |            d S r   )r_   killri   )sigs    r2   selfkillrW  1  s     GBIKKr4   c           	      L   d}	 	  | | S # t           $ r t          j                    d         }|j        |v r	|j        cY S |j        |vr |dz  }|t          k    r2t          j        t          dt          |          |                      t          j
        d           Y nw xY w)z/ wrapper around calls resilient to errnos.
    r   Tr   zreached maximum retries)r   r   g      ?)r   r+   r   r   GF_OP_RETRIESrQ   r  r   reprr   r   )callargerrnosretry_errnosnr_triesr   s         r2   rL   rL   5  s     H	4: 	 	 	"Bx6!!xx|++MH=((R 9%)#YY&(* * * + + + Ju	s   
 3B"A B"!B"c                 `    t          t          j        | gt          gt          t
          g          S r   )rL   r_   lstatr   r   r   rL  s    r2   ra  ra  L  s     bhfX???r4   c                 b    t          t          j        | dt          gt          gt
          g          S )Nzglusterfs.gfid.string)rL   rM   rN   GX_GFID_CANONICAL_LENr   r   )gfidpaths    r2   get_gfid_from_mntre  O  s2    eo!8,.06x&C C Cr4   c                 b    t          |          }t          |t                    rdS | |k    sdS dS )NFT)re  rO   rP   )gfidentry	disk_gfids      r2   matching_disk_gfidrj  U  s;    !%((I)S!! u9u4r4   c                       e Zd ZdS )NoStimeAvailableNr   rZ   r4   r2   rl  rl  `  r   r4   rl  c                       e Zd ZdS )PartialHistoryAvailableNr   rZ   r4   r2   rn  rn  d  r   r4   rn  c                       e Zd ZdS )ChangelogHistoryNotAvailableNr   rZ   r4   r2   rp  rp  h  r   r4   rp  c                       e Zd ZdS )ChangelogExceptionNr   rZ   r4   r2   rr  rr  l  r   r4   rr  c                 6    t           rddlm}  || fi | d S d S )Nr   )gf_event)EVENTS_ENABLEDgfevents.gf_eventrt  )
event_typer   gfevents      r2   rt  rt  p  sD     &999999
%%f%%%%%& &r4   c                   6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )GlusterLogLevelr   r                        	   N)r   r   r   NONEEMERGALERTCRITICALERRORWARNINGNOTICEINFOr   TRACErZ   r4   r2   rz  rz  v  s@        r4   rz  c                 B    t          t          | t          j                  S r   )r(   rz  r  )lvls    r2   get_changelog_log_levelr    s    ?C)=>>>r4   c                     d }d }| D ]G}|                     d          r|                    dd          }d|v r|                    dd          }H||fS )N:r3  z::zssh://)r7  r8   )r   primary_namesecondary_datar\  s       r2   (get_primary_and_secondary_data_from_argsr    sj    LN 7 7>># 	0;;sB//L3;; [[266N.))r4   c                      t           t           S da t          j        ddgt          j        t          j        d          } |                                 \  }}| j        dk    rd|v rda t           S )NFunsharez--helpTr   r   r   r   propagation)unshare_mnt_propagationr   r   r   r   r   )pouterrs      r2   unshare_propagation_supportedr    sv    *&&#)X. * *,0	2 	2 	2A }}HC|qC&*#""r4   c                    t           t           S da t          j        | dgt          j        t          j        d          }|                                \  }}|j        dk    r|                    dd          d         a t           S )	Nr  z	--versionTr  r   r?   r}  r|  )rsync_versionr   r   r   r   r   r8  )	rsync_cmdr  r  r  s       r2   get_rsync_versionr    s|     M)[1 * *,0	2 	2 	2A }}HC|q		#q))!,r4   c           
         t           }t                      }t          st          || d          }|j        at          D ]"}t          t          j        j        |d         d|dd         |dd         |gt           gt          g          }|t           k    r	 t          t          j
        |gt           gt          g          }t          |t                    sJ|                    d          }|d	         }	|d
         }
t          j                            ||	|
          }|c S # t          $ r3 t          t          j                            ||                    }t          t           j        |dgt           gt          g          }t          |t                    st          j                            |                              d          }
t          j                            |          }|dk    rt*          }	n=|                    d          }t/          |          }	t          |	t                    rY  d S t          j                            ||	|
          }|cY c S Y w xY w$d S )NF)primaryr  z
.glusterfsr   r{  r}  r6   r5  zglusterfs.gfid2pathrJ   )r   rQ  
slv_bricksVolinfobricksrL   r_   rn   r   r   readlinkrO   rP   r8  r   rF   rM   lgetxattr_bufbasenamerR   dirname	ROOT_GFIDr9   re  )slv_host
slv_volumerg  dir_pathpfxslv_infobrickrealpathrealpath_partspargfidr  	dir_entryrd  dirpaths                 r2   get_slv_dir_pathr    sO    H
))C %:x???_
   %  %bgl$U|+T!A#Y#AaCy#% (.h	: :
 v%%bkH:'-h: :!(C00 %%-^^C%8%8N,R0G-b1H "S'8 D DI$$$$%  % % %1"',,sD2I2IJJ%e&9!67&F8M M!(C00 %!w//99@@HHH gooh77G#~~"+")--"4"4"3G"<"<%gs33 (#'444 "S'8 D DI$$$$$$% %% 8 4s   BDDI1#IIc                     g }|                                 D ]!\  }}|                    d|d|d           "| dd                    |          dS )z
    Log Format helper function, log messages can be
    easily modified to structured log format.
    lf("Config Change", sync_jobs=4, brick=/bricks/b1) will be
    converted as "Config Change [{brick=/bricks/b1}, {sync_jobs=4}]"
    {r4  }z [z, ])r   r   r   )eventr   msgpartsr   r   s        r2   r   r     si     H , ,1QQQ*++++tyy222233r4   c                   X    e Zd ZdZed             Zed             Zd Zd Zd Z	d
dZ
d	S )r   zXcustomized subclass of subprocess.Popen with a ring
    buffer for children error outputc                 v     i  _          fd}t          |          }|                                 | _        dS )z6start the thread which handles children's error outputc                  b   	 	j                                         } 	 t          d | D             g g d          \  }}}n+# t          t          f$ r t          j        d           Y cw xY w| D ]}|j        |vr|j        	                                 	 |j
        r	 |j                                         I| |         }	 |j                                        }n=# t          $ r0 t          j        d           Y |j                                         w xY w	 t          j        |d          }n=# t          $ r0 t          j        d           Y |j                                         w xY w|s	 |j                                         t!          |          }|D ]}|t!          |          z  }|dk    r/|r-|t!          |                    d                    z  }|dk    r|-|                    |           |j                                         # |j                                         w xY w.)NTc                     g | ]	}|j         
S rZ   )r   )r   pos     r2   r  z9Popen.init_errhandler.<locals>.tailer.<locals>.<listcomp>  s    666r666r4   r   g      ?   i   r   )errstorecopyr'  
ValueErrorSelectErrorr   r   r   lockr   on_death_rowreleaser   r_   readr   lenpopr   )
r  poerV   r  lars   ltotslxclss
            r2   tailerz%Popen.init_errhandler.<locals>.tailer  sj   '*<,,.. &66X666B!C !CICAA"K0    JsOOOH	
 # * *By++ GOO%%%*? %$. ))))- &b\%!#!1!1!3!3BB) % % % JsOOO$" ))))'%% "D 1 1AA& % % % JsOOO$ ))))%  ! %$ ))))  #1vv"$ , ,B CGGODD"Wnnn Cq		NN2D #Wnnn		!))))))))O'*sp    > %A&%A&H4H=CHD5HDHD+*H+E%	H$E%%HA0HH,)r   N)r  r   start
errhandler)r  r  ts   `  r2   init_errhandlerzPopen.init_errhandler  sP     (	* (	* (	* (	* (	*R &!!!				r4   c                 X    t          j                    }|s|                                  |S )z5fork wrapper that restarts errhandler thread in child)r_   forkr  )r  pids     r2   r  z
Popen.fork)  s.     gii 	"!!!
r4   c                    || _         d|vrd|d<   t          j                    | _        d| _        g | _        	 t          | |g|R i | n#  t          j                    d         }t          |t                    s t          d|d         dt          j        |j                 dt          j        |j                  d	          xY w|                    d
          t"          j        k    rt'          | dd          sJ g | j        | <   dS dS )zcustomizations for subprocess.Popen instantiation

        - 'close_fds' is taken to be the default
        - if child's stderr is chosen to be managed,
          register it with the error handler thread
        	close_fdsTFr   zexecution of "r   z" failed with z ()r   r  N)r   	threadingr   r  r  elinesr3   r+   r   rO   r   r   r   r   r_   strerrorr   r   r   r(   r  )r   r   r0   r1   r   s        r2   r   zPopen.__init__1  s*    	b  "B{ON$$	!	7d%Q%%%"%%%%	7"Bb'** +#Awww(A(A(A!{2844446 7 7 7 66(z..4t44555"$DM$ /.s   A
 
A<Cc                 X    t          j        t          dd                     j                   j                             d} fd} j        D ]I}|                    d          }||d         z   |d<   |                                }|D ]} ||           J|r ||           dS dS )	z&make a log about child's failure eventzcommand returned errorr?   )cmdr   r3  c                 R    t          j        j        d         dz   | z              d S )Nr   z> )rQ   r   r   )r  r   s    r2   logerrzPopen.errlog.<locals>.logerrR  s)    M$)A,-122222r4   r@   r   N)	rQ   r   r   r   r   r   r  r8  r  )r   lpr  r  lslls   `     r2   errlogzPopen.errlogK  s    b1 XXdi00#0 0 0 	1 	1 	1 	3 	3 	3 	3 	3 	 	ABAJBqEB  r



 	F2JJJJJ	 	r4   c                 N    |                                   t          d           dS )z3fail nicely if child did not terminate with successr   r   N)r  r   r   s    r2   errfailzPopen.errfail]  s&    qr4   Tc                 V   | j                                          	 d| _        | j                                          n# | j                                          w xY w| j                            |           }|                                 d|                                  |                                 <t          j	        d           | 
                                 |                                  	 t          | j        gg g d          d         snXt          j        | j                                        d          }|r(|                    |                                           nnw| j                                         || _        |r!| j        dk    r|                                  dS dS dS )zkill child, finalize stderr harvesting (unregister
        from errhandler, set up .elines), fail on error if
        asked for
        TNr   r   r  )r  r   r  r  r  r  poll	terminater   r   rU  r   r'  r   r_   r  r   r   decoderd   r  r   r  )r   fail_on_errr  bs       r2   r   zPopen.terminate_geterrb  s   
 			  $DIDI""4((99;;NNyy{{"
3					4;-R55a8 **,,d33A ahhjj))))	 	 	4?a//LLNNNNN	 	//s	   < AN)T)r   r   r   r   classmethodr  r  r   r  r  r   rZ   r4   r2   r   r     s        ( ( / / [/b   [% % %4  $  
     r4   r   c                 ~    |                      d          }|d         }|dd         }d                    |          |fS )z
    IPv6 compatible way to split and get the host
    and brick information. Example inputs:
    node1.example.com:/exports/bricks/brick1/brick
    fe80::af0f:df82:844f:ef66%utun0:/exports/bricks/brick1/brick
    r  r5  r   )r8  r   )valuepartsr  	hostpartss       r2   host_brick_splitr    sB     KKE"IEadIHHY''r4   c                       e Zd Zdg dfdZd Zd Zd Zeed                         Z	eed                         Z
d	 Zd
 Zd Zeed                         Zd ZdS )r  	localhostTc           	         |rt          j        d          }nt          j        d          }t          j                            |d          }t          ||dd|z   dd|gz   t          t          d	          }|j                                        }|	                                 |
                                 t          j        |          }	|	                    d
          j        dk    rL|rdd                    |          z  }
nd}
t          d||
d|	                    d          j                  |	| _        || _        || _        d S )Nzgluster-command-dirzsecondary-gluster-command-dirglusterz--xmlz--remote-host=volumer   T)r   r   r   opRetr  z	(via %s) r?   zgetting volume info of z failed with errorcode opErrno)r   r   r_   rn   r   r   r   r   r  r   r   XET
fromstringfindtextr   treer  host)r   volr  preluder  gluster_cmd_dirgluster_cmdr  vixvivias              r2   r   zVolinfo.__init__  sV    	I#i(=>>OO#i(GHHOgll?I>>7k74Dt4K&5 5tF F F inn
			
^C  777 C'' !CHHW$5$55+"sCCC););)@)@B C C C 				r4   c                 <    | j                             d|z             S )Nz.//)r  findall)r   elems     r2   r   zVolinfo.get  s    y  ...r4   c                 J    |                      d          d         j        dk    S )NtypeStrr   Tier)r   r  r  s    r2   is_tierzVolinfo.is_tier  s!    ##A&+v56r4   c                 \    t          j        dt          |          z              || j        v S )Nzbrickpath: )rQ   debugrZ  
hot_bricksr   	brickpaths     r2   is_hotzVolinfo.is_hot  s*    md9oo5666DO++r4   c                 L    d fd|                      d          D             S )Nc                     t          |                     d          j                  \  }}|||                     d          j        dS )NnamehostUuidr  r  uuid)r  r  r  )r  r  dirps      r2   bparsezVolinfo.bricks.<locals>.bparse  s?    )!&&..*=>>JD$ qvvj7I7I7NOOOr4   c                 &    g | ]} |          S rZ   rZ   )r   r  r!  s     r2   r  z"Volinfo.bricks.<locals>.<listcomp>  s!    555aq		555r4   r  r   )r   r!  s    @r2   r  zVolinfo.bricks  s=    	P 	P 	P 6555488G#4#45555r4   c                     |                      d          }t          |          dk    r t          d| j        d| j        d          |d         j        S )Nidr   zvolume info of z obtained from z: ambiguous uuidr   )r   r  r   r  r  r  )r   idss     r2   r  zVolinfo.uuid  s\     hhtnns88q==+26+++tyyyJ K K K1v{r4   c                     |r/|r-t          |                     d          d         j                  S |r/|s-t          |                     d          d         j                  S t          |                     d          d         j                  S )NzhotBricks/hotreplicaCountr   zcoldBricks/coldreplicaCountreplicaCountrP   r   r  r   tierhots      r2   replica_countzVolinfo.replica_count  s     	9S 	9txx ;<<Q?DEEE 	93 	9txx =>>qAFGGGtxx//27888r4   c                     |r|rdS |r/|s-t          |                     d          d         j                  S t          |                     d          d         j                  S )Nr   zcoldBricks/colddisperseCountdisperseCountr)  r*  s      r2   disperse_countzVolinfo.disperse_count  sl     	:S 	: 1 	:3 	:txx >??BGHHHtxx0038999r4   c                     |r/|r-t          |                     d          d         j                  S |r/|s-t          |                     d          d         j                  S t          |                     d          d         j                  S )NzhotBricks/hotdistCountr   zcoldBricks/colddistCount	distCountr)  r*  s      r2   distribution_countzVolinfo.distribution_count  s     	6S 	6txx 899!<ABBB 	63 	6txx :;;A>CDDDtxx,,Q/4555r4   c                 @    d |                      d          D             S )Nc                     g | ]	}|j         
S rZ   )r  r   r  s     r2   r  z&Volinfo.hot_bricks.<locals>.<listcomp>  s    <<<1<<<r4   zhotBricks/brickr#  r  s    r2   r  zVolinfo.hot_bricks  s%     =<): ; ;<<<<r4   c                 d    |r-t          |                     d          d         j                  S dS )NzhotBricks/hotbrickCountr   r)  r   r+  s     r2   get_hot_bricks_countzVolinfo.get_hot_bricks_count  s2     	txx 9::1=BCCC1r4   N)r   r   r   r   r   r  r  propertyrG  r  r  r-  r0  r3  r  r9  rZ   r4   r2   r  r    s       !,b$    4/ / /7 7 7, , , 6 6 W X6   W X9 9 9	: 	: 	:6 6 6 = = W X=    r4   r  c                       e Zd ZddZd Zd Zd Zd Zee	d                         Z
ee	d	                         Zd
 Zd Zd Zee	d                         Zd ZdS )VolinfoFromGconfr  Tc                 0    || _         || _        || _        d S r   )r  r  r  )r   r  r  r  s       r2   r   zVolinfoFromGconf.__init__  s    	r4   c                     dS NFrZ   r  s    r2   r  zVolinfoFromGconf.is_tier      ur4   c                     dS r?  rZ   r  s     r2   r  zVolinfoFromGconf.is_hot  r@  r4   c                 ^    	 t                               |           dS # t          $ r Y dS w xY wNTF)r  UUIDr  r   r  s     r2   is_uuidzVolinfoFromGconf.is_uuid  s@    	IIe4 	 	 	55	s    
,,c                 
    d|v S )Nr6   rZ   rE  s     r2   possible_pathzVolinfoFromGconf.possible_path  s    e|r4   c                    | j         rdnd}t          j        |dz             }|g S |                    d          }d |D             }g }|D ]}|                    d          }d }|                     |d                   r|d         }|dd          }|                     |d	                   r|d	         }|dd	         }|                    d                    |          ||d
           |S )Nzprimary-z
secondary-r  ,c                 6    g | ]}|                                 S rZ   )r9   r6  s     r2   r  z+VolinfoFromGconf.bricks.<locals>.<listcomp>  s     666Qqwwyy666r4   r  r   r   r5  r  )r  r   r   r8  rF  rH  r   r   )r   r  bricks_datar  r  r  b_uuidbpaths           r2   r  zVolinfoFromGconf.bricks  s    !L:jjlih//I!'',,66+666 	 	AGGCLLEF||E!H%% "qabb	!!%),, $b	adJJ      
r4   c                 `    | j         rt          j        d          S t          j        d          S )Nzprimary-volume-idzsecondary-volume-id)r  r   r   r  s    r2   r  zVolinfoFromGconf.uuid.  s0     < 	49011192333r4   c                 *    t          j        d          S )Nzprimary-replica-countr   r   r*  s      r2   r-  zVolinfoFromGconf.replica_count6  s    y0111r4   c                 *    t          j        d          S )Nzprimary-disperse-countrQ  r*  s      r2   r0  zVolinfoFromGconf.disperse_count9  s    y1222r4   c                 *    t          j        d          S )Nzprimary-distribution-countrQ  r*  s      r2   r3  z#VolinfoFromGconf.distribution_count<  s    y5666r4   c                     g S r   rZ   r  s    r2   r  zVolinfoFromGconf.hot_bricks?  s	     	r4   c                     dS r  rZ   r8  s     r2   r9  z%VolinfoFromGconf.get_hot_bricks_countD  s    qr4   N)r  T)r   r   r   r   r  r  rF  rH  r:  rG  r  r  r-  r0  r3  r  r9  rZ   r4   r2   r<  r<    s          
           W X< 4 4 W X42 2 23 3 37 7 7   W X    r4   r<     c                     t          j         t           j        t           j                  }	 |                    | |f           d}n# t           j        $ r d}Y nw xY w|                                 |S rC  )socketAF_INETSOCK_STREAMconnectr   rd   )r  portr;   flags       r2   can_sshr^  H  st    fnf&899A			4,<    GGIIIKs   A AAc                 j    g }| D ]-}t          |d         |          r|                    |           .|S r  )r^  r   )hostsr\  up_nodesr   s       r2   get_up_nodesrb  T  sD    H  1Q4 	OOAOr4   r   rY   )rV  )r_   r+   r  r   re   r   rQ   r   r  r   rX  r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r'  r&  r   r*  xml.etree.ElementTreeetreeElementTreer   r   r  cPickler   ImportErrorpickleconfr   r   rn   insertru  gfevents.eventtypesr   EVENT_GEOREP_FAULTYr   EVENT_GEOREP_ACTIVEr   EVENT_GEOREP_PASSIVEr    !EVENT_GEOREP_CHECKPOINT_COMPLETEDgsyncdconfigr   r!   hashlibr"   r(   r#   rP  r  rY  rc  r6  r  r  r  rB   rC   rA   r   r3   r<   rD   rF   rT   rW   rv   r{   r   r   r   r   r   objectr   	Exceptionr   r   rM   r  r  r"  r$  r.  r1  r:  r=  rB  rG  rI  rN  rQ  r   rW  rL   ra  re  rj  rl  rn  rp  r   rr  rt  rz  r  r  r  r  r  r   r   r  r  r<  r^  rb  rZ   r4   r2   <module>rt     sq   
			 



 



                     0 0 0 0 0 0 0 0J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J " " " " " " " "     " " " " " " # # # # # # # # # ' ' ' ' ' '######## # # #""""""""# 1 0 0 0 0 0 0 0 ' ( ( (-HHHHHHHHHHHHJJJJJJ- - - - - - - - - -N(,%%%-           $ $ $ $ $ $
'%L
1
1  2	 	 
   TVV
> > >* * *0 0 02 2 2  # # #
 '5n    >  "F F F4   :, , , ,<% <% <%~D D DN                   Z   4	 	 	 	 	) 	 	 	# # # # # # # #0 	
% % % %    8  < < <0 0 0% % % 4      "& & &  
 
 
      ! ! !      BR    .@ @ @C C C  	 	 	 	 	y 	 	 		 	 	 	 	i 	 	 		 	 	 	 	9 	 	 		 	 	 	 	 	 	 	& & &
 
 
 
 
f 
 
 
? ? ?	* 	* 	*# # #$  "- - -`
4 
4 
4L L L L LJ L L L^
( 
( 
([ [ [ [ [f [ [ [|Y Y Y Y Yv Y Y Yx	 	 	 	    s$   ;B BB9C C$#C$