
    HmdD                     j   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
Z
	 d dlmZ n# e$ r d dlZY nw xY wd dlZd dlZd dlmZmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d dlZd	Zd
ZdZdZd Z d Z! ej"                    Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-e.dk    r e-            Z/ ee j0        1                     ej2        d          e/j3        e/j4                  d           e j0        1                     ej2        d          e/j3        e/j4        d          Z5 ee#e5e/j6                   e j0        1                     ej2        d          e/j3                  Z7e j0        1                    e7e/j4        d ej8        e/j9                  z            Z:e:dz   Z; ee j0        1                    e7e/j4                  de#           d Z<e/j=        re/j>        Z>e/j<        Z<ni	  e?e:          5 Z@ eAe@B                                C                                          Z>ddd           n# 1 swxY w Y   n# eDeEeFf$ r
 e/j>        Z>Y nw xY we<d k    r) eA ej                               ee/j4                  z
  Z<e#G                    e/j9        d!e>d"e<            e,e/j9        e>e<e/          ZHe/j=        sB e?e;d#          5 Z@e@I                     eJeH                     ddd           n# 1 swxY w Y   e#G                    e/j9        d$eH            ejK        d            dS dS )%    N)bytearray_to_str)ArgumentParserRawDescriptionHelpFormatter)mkdirpsymlink_gfid_to_path)failsetup_loggerfind)get_changelog_rollover_time)output_path_prepare)ChangelogData	         z
Changelog Crawler
c                    |                     dddi          D ]}|d         dk    r	 t          | |d                   }t          |t                    }|                    ||d                    X# t
          t          f$ r'}t                              d|z             Y d}~d}~ww xY w|                     dddd	          D ]}|d         dk    r	 t          | |d                   }t          |t                    }|	                    ||d                    X# t
          t          f$ r'}t                              d|z             Y d}~d}~ww xY wdS )
zW
    For all the pgfids in table, converts into path using recursive
    readlink.
    pgfid1path1 r   Error converting to path: %sNpgfid2RENAME)typepath2)
gfidpath_get_distinctr   r   argsgfidpath_set_path1IOErrorOSErrorloggerwarngfidpath_set_path2)brickchangelog_datarowpathes        </usr/lib/x86_64-linux-gnu/glusterfs/glusterfind/changelog.pypgfid_to_pathr(   /   s    33HwmLL  q6R<<	's1v66D&tT22D--dCF;;;;! 	 	 	KK6:;;;HHHH	
 33H=E>@5B 5BC C   q6R<<	's1v66D&tT22D--dCF;;;;! 	 	 	KK6:;;;HHHH	 s1   AA11B)B$$B)ADE.EEc           	      r   |                     ddd          D ]}|d                                         }t          j                            | d|dd         |dd         |          }t          j                            |          r|	 t          | |          }t          |t                    }|	                    d	|id
|i           # t          t          f$ r'}t                              d|z             Y d}~d}~ww xY w	 |                    t          j        |          j        |           t#          j        |          }|D ]T}t'          |          }	|	                    d          r.|                    |	                    d          d                    U# t          t          f$ r Y w xY wdS )z
    For all the DATA/METADATA modifications GFID,
    If symlink, directly convert to Path using Readlink.
    If not symlink, try to get PGFIDs via xattr query and populate it
    to pgfid table, collect inodes in inodegfid table
    r   MODIFYr   r   r   
.glusterfsr         r   gfidr   Nztrusted.pgfid..)gfidpath_getstriposr%   joinislinkr   r   r   gfidpath_updater   r   r   r    inodegfid_addstatst_inoxattrlistr   
startswith	pgfid_addsplit)
r"   r#   r$   r/   pr%   r&   file_xattrsxx_strs
             r'   populate_pgfid_and_inodegfidrD   S   s    **R+J+JKK  1v||~~GLLd1Q3iacDII7>>! 	+E488*466..06~? ? ? ?W%   :Q>???,,RWQZZ->EEE#jmm$ G GA,Q//E''(899 G&00S1A1A"1EFFF	G
 W%    / s+   	?C		DC<<DBFF43F4c                    g }t           j                            | d|dd         |dd         |          }t           j                            |          s.	 t	          j        |          }|D ]}t          |          }|                    d          rt	          j        ||          }t          |          }	|		                    t           j
                  \  }
}	 t          | |
          }t           j                            ||          }t          ||          }|                    |           # t          t          f$ r'}t                               d|z             Y d }~d }~ww xY wn# t          t          f$ r Y nw xY w|S )Nr,   r   r-   r.   ztrusted.gfid2path.r   )r4   r%   r5   isdirr;   r<   r   r=   getxattrr?   sepr   r   appendr   r   r   r    )r"   r/   r   	hardlinksr@   rA   rB   rC   vv_strpgfidbnr%   fullpathr&   s                  r'   enum_hard_links_using_gfid2pathrP   w   s   I
UL$qs)T!A#YEEA7== 	*Q--K  ! !(++##$899 !q%00A,Q//E %BF 3 3IE2!3E5AA#%7<<b#9#9#6x#F#F!((2222#W- ! ! !$BQ$FGGG !!! ! 	 	 	D	s>   BE- AD0/E- 0E(E#E- #E((E- -F Fc                 .   d}|                     ddd          D ]y}|d                                         }t                              d|z             t	          | ||          }d                    |          }|                    d|id|i           zd S )	Nr   r*   r+   r   zProcessing gfid %s,r   r/   )r2   r3   r   debugrP   r5   r7   )r"   r#   r   r%   r$   r/   rJ   s          r'   !gfid_to_all_paths_using_gfid2pathrT      s    D**R+J+JKK H H1v||~~)D01113E4FF	xx	""&&GGGGH H    c                 2   	 t                                          ddi          sdS fd}t                     		fd} fdt          j        d                              d          D             }                                D ]}	 t           |d                   }t          t          j
                             |          |||d	
           L# t          t          f$ r'}t                              d|z             Y d}~d}~ww xY wdS )z
    For all the pgfids collected, Converts to Path and
    does readdir on those directories and looks up inodegfid
    table for matching inode number.
    	convertedr   Nc                     	 t          j        |           }n# t          t          f$ r d }Y nw xY w|r#                    d|j        i          r|j        S d S Ninoder4   lstatr   r   inodegfid_existsr:   r%   str#   s     r'   inode_filterz.gfid_to_path_using_pgfid.<locals>.inode_filter   s    	$BB! 	 	 	BBB	  	.117BI2FGG 	9t    ..c                     |                                  } | dz   d          } t          |           }                     | |                               ddid|i           d S )N   rW   rZ   )r3   r   append_path1inodegfid_update)r%   rZ   r   brick_path_lenr#   s     r'   output_callbackz1gfid_to_path_using_pgfid.<locals>.output_callback   sr     zz||N1$%%&"4..##D%000''a(87E:JKKKKKrU   c                 P    g | ]"}t           j                            |          #S  r4   r%   r5   .0dirnamer"   s     r'   
<listcomp>z,gfid_to_path_using_pgfid.<locals>.<listcomp>   ?     A A A 7<<w// A A ArU   brick_ignore_dirsrR   F)callback_funcfilter_funcignore_dirssubdirs_crawlr   )rD   r]   lenconfget_optr?   	pgfid_getr   r
   r4   r%   r5   r   r   r   r    )
r"   r#   r   r`   rh   rt   r$   r%   r&   rg   s
   ```      @r'   gfid_to_path_using_pgfidrz      s    !777 **K+;<<      ZZN	L 	L 	L 	L 	L 	L 	LA A A A< 344::3??A A AK '')) 
 
		's1v66DeT**.)($	& & & & &
 ! 	 	 	KK6:;;;HHHH	
 
s   ACD-DDc                                           ddi          sd S fd}t                     fd} fdt          j        d                              d          D             }t           |||           d S )	NrW   r   c                     	 t          j        |           }n# t          t          f$ r d }Y nw xY w|r#                    d|j        i          r|j        S d S rY   r[   r^   s     r'   r`   z2gfid_to_path_using_batchfind.<locals>.inode_filter   ra   rb   c                     |                                  } | dz   d          } t          | t                    }                     | |           d S )Nrd   )r3   r   r   re   )r%   rZ   rg   r#   s     r'   rh   z5gfid_to_path_using_batchfind.<locals>.output_callback   sR     zz||N1$%%&"4..##D%00000rU   c                 P    g | ]"}t           j                            |          #S rj   rk   rl   s     r'   ro   z0gfid_to_path_using_batchfind.<locals>.<listcomp>   rp   rU   rq   rR   )rr   rs   rt   )r]   rv   rw   rx   r?   r
   )r"   r#   r`   rh   rt   rg   s   ``   @r'   gfid_to_path_using_batchfindr      s    **K+;<<      ZZN1 1 1 1 1 1A A A A< 344::3??A A AK
 	o! " " " " " "rU   c                    t          j        |d          5 }t          j                            |          }|D ]}|                                                    d          }|d         dk    r!|d         dv r|                     ||           W|d         dv r|j        s| 	                    ||           |d         dk    r!|d         d	v r| 
                    ||           |d         dk    r#|d         d
k    r|                     ||           |d         dk    r |d         dv r|                     ||           		 ddd           dS # 1 swxY w Y   dS )zF
    Parses a Changelog file and populates data in gfidpath table
    zutf-8)encoding r   Er-   )CREATEMKNODMKDIR)DM)LINKSYMLINKr   )UNLINKRMDIRN)codecsopenr4   r%   basenamer3   r?   when_create_mknod_mkdironly_namespace_changeswhen_data_metawhen_link_symlinkwhen_renamewhen_unlink_rmdir)r#   filenamer   fchangelogfilelinedatas          r'   parse_changelog_to_dbr      s    
X	0	0	0 FA((22 	F 	FD::<<%%c**DAw#~~$q'-I"I"I66}dKKKKaJ&&2 G"11-FFFaCDG/B$B$B00EEEEaCDGx$7$7**=$????aCDG/B$B$B00EEE#	FF F F F F F F F F F F F F F F F F Fs   D+EEEc                    t           j                            t          j        d          |j                  }t           j                            ||j        dt          j        |j	                  z            }	 t          |          5 }t          |                                                                          }ddd           n# 1 swxY w Y   n$# t          t          t           f$ r
 |j        }Y nw xY w	 t%          j                     t%          j        | ||t*          t,                     n7# t$          j        $ r%}	t1          | d|	t2                     Y d}	~	nd}	~	ww xY wt5          |j        |          }
t           j                            | d          }	 t%          j        |||t:                    }n?# t$          j        $ r-}	t1          |j        d| d|	t2                     Y d}	~	nd}	~	ww xY wt2                              d	           	 g }t%          j                     d
k    rt%          j!                    }|D ]x}|"                    d|z            r	 tG          |
||           t%          j$        |           B# t           $ r*}	t2          %                    d|d|	           Y d}	~	qd}	~	ww xY w|
&                                 t%          j                     d
k    n7# t$          j        $ r%}	t1          | d|	t2                     Y d}	~	nd}	~	ww xY wt2                              d           t2                              d           tO          | |
           |
&                                 t2                              d           t2                              d           tQ          | |
|           |
&                                 t2                              d           t2                              d           tS          | |
           |
&                                 t2                              d           |S )z
    Makes use of libgfchangelog's history API to get changelogs
    containing changes from start and end time. Further collects
    the modified gfids from the changelogs and writes the list
    of gfid to 'gfid_list' file.
    session_dir	%s.statusNz Changelog register failed: )r   z.glusterfs/changelogsz: z& Historical Changelogs not available: z$[1/4] Starting changelog parsing ...r   z.%szError parsing changelog file z Error during Changelog Crawl: z![1/4] Finished changelog parsing.z.[2/4] Starting 'pgfid to path' conversions ...z+[2/4] Finished 'pgfid to path' conversions.z*[3/4] Starting 'gfid2path' conversions ...z'[3/4] Finished 'gfid2path' conversions.z=[4/4] Starting 'gfid to path using batchfind' conversions ...z:[4/4] Finished 'gfid to path using batchfind' conversions.)*r4   r%   r5   rw   rx   sessionvolumeurllib
quote_plusr"   r   intreadr3   
ValueErrorr   r   startlibgfchangelogcl_initcl_registerCHANGELOG_LOG_LEVELCHANGELOG_CONN_RETRIESChangelogExceptionr   r   r   outfilecl_history_changelogCHANGELOGAPI_NUM_WORKERSnodeinfocl_history_scancl_history_getchangesendswithr   cl_history_doner    commitr(   rT   r   )r"   hash_dirlog_filer   endr   r   status_filer   r&   r#   cl_path
actual_endchangeschanges                  r'   get_changesr     s    ',,t|M::#|- -K',,{DK 6#4TZ#@#@@B BK+ 	*!(())E	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*)   
M   "5(H#68N	P 	P 	P 	P, M M M555!!<VLLLLLLLLLM #4<66N gll5"9::G3#8UC!9; ;

, 3 3 3iii#+1	3 	3 	3 	3 	3 	3 	3 	3 	33 KK6777 ,..22$:<<G! 
- 
- ??55=11 -).&$GGG"26:::: - - -KKK!'!, - - - - - - - -- !!### ,..22  ,   eeeQQ?	 	 	 	 	 	 	 	 	 KK3444 KK@AAA%(((
KK=>>> KK<===%e^TBBB
KK9::: KK " # # # 777
KKLMMMs   9C 4C<C CC CC C54C595D/ /E#>EE#F9 9G5#G00G5A	K& %JK& 
J7 J2-K& 2J77.K& &L5LLc                    |                      d          r| dt          |           dz
           } t          j                            |j                  }t          j        |                                           }t          |
                                          }t          j                            ||          }t          |dt                     t          j                            t          j        d          |j        |j        d|z            }t                              | d|d	|           t'          | |||||          S )
zG
    Init function, prepares working dir and calls Changelog query
    /r   rd   Texit_on_errr   log_dirzchangelog.%s.logz! Started Changelog Crawl. Start: z, End: )r   rv   r4   r%   rn   r   hashlibsha1encodestr	hexdigestr5   r   r   rw   rx   r   r   r   r   )r"   r   r   r   working_dir	brickhashr   s          r'   changelog_crawlr   v  s    ~~c &aE

1n% '//$,//KU\\^^,,II''))**I',,{I66K
;D8888w||DL33 L K.:< <H
 KK55%%%& ' ' 'uk8UCFFFrU   c                     t          t          t                    } |                     dd           |                     dd           |                     dd           |                     d	d
           |                     dd           |                     ddt                     |                     ddt                     |                     ddd           |                     ddd           |                     ddd           |                     ddd           |                     dd            |                     d!d"d#d           |                                 S )$N)formatter_classdescriptionr   zSession Name)helpr   zVolume Namer   z	Node Namer"   z
Brick Namer   zOutput Filer   z
Start Time)r   r   r   zEnd Timez--only-queryzQuery mode only (no session)
store_true)r   actionz--debugDebugz--no-encodezDo not encode path in outfilez--output-prefixzFile prefix in outputr0   )r   defaultz--typeboth)r   z-Nz--only-namespace-changeszList only namespace changes)r   r   PROG_DESCRIPTIONadd_argumentr   
parse_args)parsers    r'   	_get_argsr     s   ,G(8: : :F 	777
}555
[111
l333
	666
l===
JS999
-K+  - - -
	EEE
<+  - - - )0G #  % % %
000
8:+  - - - rU   __main__r   T)r   zchangelog.logr   r   z.prer   r1   z" Started Changelog Crawl - Start: z End: wz! Finished Changelog Crawl - End: )Lr4   systimer;   logginggfind_py2py3r   argparser   r   r   urllib.parseparser   ImportErrorr   r   utilsr   r   r   r	   r
   r   r   changelogdatar   rw   r   r   r   r   history_turnshistory_turn_time	getLoggerr   r(   rD   rP   rT   rz   r   r   r   r   r   __name__r   r%   r5   rx   r   r   r   rS   r   r   r"   r   status_file_prer   
only_queryr   r   r   r   r   r3   r   r   r   r   r   writer   exitrj   rU   r'   <module>r      sq   
			 



    ) ) ) ) ) ) @ @ @ @ @ @ @ @ !!!!!!!   MMMMM      . . . . . . . . * * * * * * * * * * - - - - - - % % % % % % ' ' ' ' ' '        				! ! !H! ! !H  6	H 	H 	H5 5 5p%" %" %"PF F F4[ [ [|G G G2  6 z9;;D
F27<<Y//t{KK   w||LDL33 L K+- -H L4:...',,|t|M::DLIIK',,{DK #46#4TZ#@#@@B BK!F*O
F27<<T[11t    C 
h	k"" .aAFFHHNN,,--. . . . . . . . . . . . . . .GW- 	 	 	JEEE	
 byyc)$)++!<!<T[!I!II
KKDJJJDIEEDGCI J J J !UC>>J? %T/3'' 	%1GGCC
OO$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% KK4:::;E:G H H HCHQKKKKKW sT   / 	;;-I  80H4(I  4H88I  ;H8<I   IIK77K;>K;