
    HmdJ=                        d dl mZ d dlZd dl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 d dlmZmZmZ d dlZd dlmZmZmZmZmZ dZdZedd	d
dfZedddfZd Zd Zd Z G d de          Zd Z  G d de          Z!dS )    )print_functionN)datetime)EACCESEAGAINENOENT)EVENT_GEOREP_ACTIVEEVENT_GEOREP_PASSIVEgf_event!EVENT_GEOREP_CHECKPOINT_COMPLETEDlfzN/A)CreatedStartedPausedStoppedzInitializing...ActivePassiveFaultyzHybrid CrawlzHistory CrawlzChangelog Crawlc                     	 t          j        t          |                                         d          S # t          $ r
 t
          cY S w xY wNz%Y-%m-%d %H:%M:%S)r   fromtimestampfloatstrftime
ValueErrorDEFAULT_STATUStss    E/usr/lib/x86_64-linux-gnu/glusterfs/python/syncdaemon/gsyncdstatus.py
human_timer   +   sT    %eBii0099:MNNN      36 A
	A
c                     	 t          j        t          |                                         d          S # t          $ r
 t
          cY S w xY wr   )r   utcfromtimestampr   r   r   r   r   s    r   human_time_utcr"   2   sZ    ("II x 344	5   r   c                  H    t           t           ddt           ddddt           dddS )Nr   )secondary_nodeworker_statuslast_syncedlast_synced_entrycrawl_statusentrydatametafailurescheckpoint_completedcheckpoint_timecheckpoint_completion_time)r        r   get_default_valuesr2   :   s5    ('& .&') ) )r1   c                        e Zd Zd Zd Zd ZdS )
LockedOpenc                 >    || _         || _        || _        d | _        d S N)filename	open_argsopen_kwargsfileobj)selfr7   argskwargss       r   __init__zLockedOpen.__init__L   s#     !r1   c                    t          | j        g| j        R i | j        }	 t	          j        |t          j                   t          | j        g| j        R i | j        }t          j        	                    |
                                |
                                          r|                                 n|                                 |}|| _        |S )a  
        If two processes compete to update a file, The first process
        gets the lock and the second process is blocked in the fcntl.flock()
        call. When first process replaces the file and releases the lock,
        the already open file descriptor in the second process now points
        to a  "ghost" file(not reachable by any path name) with old contents.
        To avoid that conflict, check the fd already opened is same or
        not. Open new one if not same
        )openr7   r8   r9   fcntlflockLOCK_EXospathsameopenfilefilenocloser:   )r;   ffnews      r   	__enter__zLockedOpen.__enter__R   s     DDDD43CDD	K5=)))KKKK$:JKKDw##AHHJJ>> 

				 r1   c                     t          j        | j        t           j                   | j                                         d S r6   )rA   rB   r:   LOCK_UNrH   )r;   	_exc_type
_exc_value
_tracebacks       r   __exit__zLockedOpen.__exit__i   s2    DL%-000r1   N)__name__
__module____qualname__r>   rK   rQ   r0   r1   r   r4   r4   J   sA            .    r1   r4   c                    t          j        | t           j        t           j        z            }t          j        |           t          | d          5  t          j        dt           j        	                    |           d          5 }|
                    |           |j        }d d d            n# 1 swxY w Y   t          j        ||            t          j        t           j        	                    t           j                            |                     t           j                  }t          j        |           t          j        |           d d d            d S # 1 swxY w Y   d S )Nr+wFdirdelete)rD   r@   O_CREATO_RDWRrH   r4   tempfileNamedTemporaryFilerE   dirnamewritenamerenameabspathO_DIRECTORYfsync)status_filestatusfdtftempnamedirfds         r   set_monitor_statusrl   n   s   	bj294	5	5BHRLLL	K	&	& 
 
("'//+2N2N057 7 7 	:<HHVwH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 		(K((((D(DEE( (


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s7   5EB/#E/B3	3E6B3	7BEE!$E!c                   |    e Zd Z	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd ZddZddZdS )GeorepStatusNc                    || _         |                    d          }|d         | _        |d                             d          d         | _        t          j                            |          | _        || _        t          j        	                    | j        dt          j        |          z            | _        t	          j        | j        t          j        t          j        z            }	t	          j        |	           t	          j        | j        t          j        t          j        z            }	t	          j        |	           || _        || _        || _        t)                      | _        || _        d S )Nz::r      :zbrick_%s.status)primarysplitsecondary_hostsecondary_volumerD   rE   r_   work_dirmonitor_status_filejoinurllib
quote_plusr7   r@   r[   r\   rH   primary_nodeprimary_node_idbrickr2   default_valuesmonitor_pid_file)
r;   rw   r{   r}   r|   rr   	secondaryr   slv_datarh   s
             r   r>   zGeorepStatus.__init__   s   ??4((&qk ( 1 1# 6 6q 9(;<<#6 T]%6'-'8'?'?&@A A WT]BJ$:;;
WT-rzBI/EFF
(.
022 0r1   c           
      j    t          |f| j        | j        | j        | j        | j        | j        d| d S )N)primary_volumer{   r|   rt   ru   
brick_path)r
   rr   r{   r|   rt   ru   r}   )r;   
event_typer=   s      r   
send_eventzGeorepStatus.send_event   sV     	 $"/!%!5 $ 3"&"7 J	 	 	 	 	 	 	r1   c                 4   | j         }t          | j        d          5 }	 |                    t	          j        |                     n# t          $ r Y nw xY w ||          }|s	 d d d            dS t          j        dt          j
                            | j                  d          5 }|                    |           |j        }d d d            n# 1 swxY w Y   t          j        || j                   t          j        t          j
                            t          j
                            | j                            t          j                  }t          j        |           t          j        |           	 d d d            dS # 1 swxY w Y   d S )NrV   FrW   rX   T)r~   r4   r7   updatejsonloadr   r]   r^   rD   rE   r_   r`   ra   rb   r@   rc   rd   re   rH   )r;   
mergerfuncr*   rI   ri   rj   rk   s          r   _updatezGeorepStatus._update   s
   "t,, 	DIaLL))))    :d##D 	 	 	 	 	 	 	 	 ,66 " " " # &(7# # # # # # # # # # # # # # # Ih...GBGOOBGOODM,J,JKKN, ,EHUOOOHUOOO/	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s_   F'AF
AFAF29F+CFC	FC	B$FFFc                 6    d }|                      |           d S )Nc                 p    t           | d<   t           | d<   d| d<   d| d<   d| d<   t          j        |           S )Nr$   r(   r   r)   r*   r+   )r   r   dumps)r*   s    r   mergerz2GeorepStatus.reset_on_worker_start.<locals>.merger   sB    %3D!"#1D DMDLDL:d###r1   r   )r;   r   s     r   reset_on_worker_startz"GeorepStatus.reset_on_worker_start   s+    	$ 	$ 	$ 	Vr1   c                 <    fd}|                      |          S )Nc                 R    |          k    ri S | <   t          j        |           S r6   r   r   r*   keyvalues    r   r   z&GeorepStatus.set_field.<locals>.merger   s0    CyE!!	DI:d###r1   r   r;   r   r   r   s    `` r   	set_fieldzGeorepStatus.set_field   s6    	$ 	$ 	$ 	$ 	$ 	$ ||F###r1   c                 @    |                      t          ||           d S )N)r.   r/   )r   r   )r;   r.   r/   s      r   &trigger_gf_event_checkpoint_completionz3GeorepStatus.trigger_gf_event_checkpoint_completion   s5    9(73M 	 	O 	O 	O 	O 	Or1   c                 D      fd}                      |           d S )Nc           	         d         | d<   dk    s| d         k    rd| d<   d| d<   d| d<   dk    rd         k    r| d         dk    rt          t          j                              }| d<   || d<   d| d<   t          j        t	          dt                    t          |          	                                         |           t          j        |           S )
Nr   r&   r.   r/   Nor-   YeszCheckpoint completed)r.   completion_time)	inttimelogginginfor   r"   r   r   r   )r*   	curr_timer.   r;   r   s     r   r   z,GeorepStatus.set_last_synced.<locals>.merger   s*   "'(D !##$'8"999*+&'5612/3+, ""%('B'B./477 #DIKK 0 0I.=D*+9BD5638D/0L$:4B(759 594B94M4M"O "O "O P P P ??'4 4 4 :d###r1   r   )r;   r   r.   r   s   ``` r   set_last_syncedzGeorepStatus.set_last_synced   sB    	$ 	$ 	$ 	$ 	$ 	$ 	$8 	Vr1   c                 |    |                      d|          r%t          j        t          d|                     d S d S )Nr%   Worker Status Changerg   r   r   r   r   r;   rg   s     r   set_worker_statuszGeorepStatus.set_worker_status   sW    >>/622 	,L2#)+ + + , , , , ,	, 	,r1   c                 |    |                      d|          r%t          j        t          d|                     d S d S )Nr(   zCrawl Status Changer   r   r   s     r   set_worker_crawl_statusz$GeorepStatus.set_worker_crawl_status   sW    >>.&11 	,L1#)+ + + , , , , ,	, 	,r1   c                 <    fd}|                      |           d S )Nc                 6    | d<   t          j        |           S )Nr$   r   )r*   r$   s    r   r   z/GeorepStatus.set_secondary_node.<locals>.merger   s    %3D!":d###r1   r   )r;   r$   r   s    ` r   set_secondary_nodezGeorepStatus.set_secondary_node   s6    	$ 	$ 	$ 	$ 	$ 	Vr1   c                 @    fd}|                      |           d S )Nc                 d    |                      d          z   | <   t          j        |           S Nr   getr   r   r   s    r   r   z&GeorepStatus.inc_value.<locals>.merger  s/    a((50DI:d###r1   r   r   s    `` r   	inc_valuezGeorepStatus.inc_value  s<    	$ 	$ 	$ 	$ 	$ 	$ 	Vr1   c                 @    fd}|                      |           d S )Nc                     |                      d          z
  | <   |          dk     rd| <   t          j        |           S r   r   r   s    r   r   z&GeorepStatus.dec_value.<locals>.merger  sE    a((50DICy1}}S	:d###r1   r   r   s    `` r   	dec_valuezGeorepStatus.dec_value  s<    	$ 	$ 	$ 	$ 	$ 	$ 	Vr1   c                     |                      dd          r?t          j        t          dd                     |                     t
                     d S d S )Nr%   r   r   r   )r   r   r   r   r   r   r;   s    r   
set_activezGeorepStatus.set_active  sf    >>/844 	1L2#+- - - . . .OO/00000	1 	1r1   c                     |                      dd          r?t          j        t          dd                     |                     t
                     d S d S )Nr%   r   r   r   )r   r   r   r   r   r	   r   s    r   set_passivezGeorepStatus.set_passive  sf    >>/955 	2L2#,. . . / / /OO011111	2 	2r1   c                     d}t          | j        d          5 }|                                                                }d d d            n# 1 swxY w Y   |S )N r)r@   rw   readstrip)r;   r*   rI   s      r   get_monitor_statuszGeorepStatus.get_monitor_status"  s    $*C00 	$A6688>>##D	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   'AAAr   c                    | j         }t          | j                  5 }	 |                    t	          j        |                     n# t          $ r Y nw xY wddd           n# 1 swxY w Y   |                                 }|dv r	 t          | j        d          5 }t          j
        |t          j        t          j        z             d}ddd           n# 1 swxY w Y   nH# t          t          f$ r4}|j        t           k    rd}n|j        t"          t$          fv rn Y d}~nd}~ww xY w|dv r||d<   |dk    rd|d<   |dk    rt&          |d	<   t&          |d
<   t&          |d<   nB||d
         k    r6||d         k    rd|d	<   ||d
<   |d         |d<   nd|d	<   ||d
<   t&          |d<   |d
         dt&          fvr,|d
         }t)          |          |d
<   t+          |          |d<   |d         dt&          fvr,|d         }t)          |          |d<   t+          |          |d<   |d         dk    rt&          |d<   t&          |d<   n,|d         }t)          |          |d<   t+          |          |d<   |d         dk    rxt&          |d<   t&          |d<   t&          |d<   t&          |d<   t&          |d<   t&          |d<   t&          |d<   t&          |d	<   t&          |d
<   t&          |d<   t&          |d<   t&          |d<   |d         dvr
t&          |d<   |                    dd          dk    r
t&          |d<   |                    dd          dk    r
t&          |d<   |                    dd          dk    r
t&          |d<   |S )a  
        Monitor Status --->        Created    Started  Paused      Stopped
        ----------------------------------------------------------------------
        secondary_node                 N/A        VALUE    VALUE       N/A
        status                     Created    VALUE    Paused      Stopped
        last_synced                N/A        VALUE    VALUE       VALUE
        last_synced_entry          N/A        VALUE    VALUE       VALUE
        crawl_status               N/A        VALUE    N/A         N/A
        entry                      N/A        VALUE    N/A         N/A
        data                       N/A        VALUE    N/A         N/A
        meta                       N/A        VALUE    N/A         N/A
        failures                   N/A        VALUE    VALUE       VALUE
        checkpoint_completed       N/A        VALUE    VALUE       VALUE
        checkpoint_time            N/A        VALUE    VALUE       VALUE
        checkpoint_completed_time  N/A        VALUE    VALUE       VALUE
        N)r   r   rV   r   )r   r   r   r%   r   r   r-   r.   r/   r&   r   r   checkpoint_time_utccheckpoint_completion_time_utclast_synced_utcr   r(   r)   r*   r+   r,   checkpoint_completed_time)r   r   r$   )r~   r@   r7   r   r   r   r   r   r   rA   lockfrC   LOCK_NBIOErrorOSErrorerrnor   r   r   r   r   r"   r   )	r;   r.   r*   rI   monitor_statuse
chkpt_timechkpt_completion_timer&   s	            r   
get_statuszGeorepStatus.get_status(  s   " "$-   	ADIaLL))))   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 0022 222$/66 /!K5=5=#@AAA%.N/ / / / / / / / / / / / / / / W% 	 	 	 7f$$%.NNW 000	 ===$2D!R$-D! a+9D'(&4D"#1?D-..$'8"999"d=&99938D/0.=D*+9=m9LD56637D/0.=D*+9GD56!"1n*===/0J&0&<&<D"#*8*D*DD&',-a5HHH$()E$F!1;%2' 2'D-.5C%6' 6'D12 !##"0D&4D"##}-K",["9"9D&4[&A&AD"# H,,"0D&4D"##1D *DM)DL)DL-D+9D'(&4D"#0>D,-*8D&'5CD12 (===%3D!"88%q))Q..&4D"#884a88A==5CD1288)1--22*8D&'sp   A"'AA"
AA"AA""A&)A&C" /C
C" CC" CC" "D'3*D""D'Fc                 2   |                      |          }|rQi }|                                D ]\  }}t          |          ||<   t          t	          j        |                     d S |                                D ]\  }}t          |d|           d S )Nz: )r   itemsstrprintr   r   )	r;   r.   json_output
status_outoutkvr   r   s	            r   print_statuszGeorepStatus.print_status  s    ___55
 	C"((**    1QA$*S//"""F$**,, 	- 	-JCsssEE*,,,,	- 	-r1   r6   )r   )r   F)rR   rS   rT   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r1   r   rn   rn   ~   s-       6:1 1 1 1,    6	 	 		$ 	$ 	$O O O  >, , ,
, , ,
      1 1 12 2 2  n n n n`- - - - - -r1   rn   )"
__future__r   rA   rD   r]   urllib.parseparsery   ImportErrorr   r   r   r   r   r   r   r   
syncdutilsr   r	   r
   r   r   r   MONITOR_STATUSSTATUS_VALUESCRAWL_STATUS_VALUESr   r"   r2   objectr4   rl   rn   r0   r1   r   <module>r      s   & % % % % %  				 !!!!!!!   MMMMM         ( ( ( ( ( ( ( ( ( ( ? ? ? ? ? ? ? ? ? ? ? ? ? ? <"	 &%&(*     ) ) ) ! ! ! ! ! ! ! !H   e- e- e- e- e-6 e- e- e- e- e-s    	''