
    Hgf<              	       F   d 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	 ddl
m
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mZmZmZmZmZmZmZmZ ddlm Z m!Z! dZ"dZ#dZ$	 dde%dee%         dee%         de&fdZ' G d de(          Z) G d de(          Z*dS )z
Copyright (C) 2015 Red Hat

This is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License version 2, as published by the Free Software
Foundation.  See file COPYING.
    N)OrderedDict)ioctlfnmatch)PrettyTableHEADER)signalSignalsSIGWINCH)
TIOCGWINSZ)	FrameType)	AnyCallableDictListOptionalSequenceTextIOTupleUnion)parse_json_funcsigsvalidate_command      i    	asok_pathcmdformatreturnc                    dt           dt          dt          fd}	  || d          }n1# t          $ r$}t          dt          |          z             d}~ww xY wt	          |                    d          d	          }t          ||          }|st          d
          |r||d<   	  || t          j        |          	                    d                    }n1# t          $ r$}t          dt          |          z             d}~ww xY w|S )a  
    Send a daemon (--admin-daemon) command 'cmd'.  asok_path is the
    path to the admin socket; cmd is a list of strings; format may be
    set to one of the formatted forms to get output in that form
    (daemon commands don't support 'plain' output).
    path	cmd_bytesr   c                 \   t          j         t           j        t           j                  }|                    |            	 |                    |dz              |                    d          }t          |          dk     rt          d          t          j	        d|          \  }d}d}||k     rJt          ||z
  t                    }|                    |          }||z  }|t          |          z  }||k     Jn1# t          $ r$}	t          dt          |	          z             d}	~	ww xY w|S )	z0 helper: do all the actual low-level stream I/O     r   z"no data returned from admin socketz>I    r   exception: N)socketAF_UNIXSOCK_STREAMconnectsendallrecvlenRuntimeErrorstructunpackminREAD_CHUNK_SIZE	Exceptionstr)
r!   r"   socklen_strlsock_retgotwantbitsock_es
             -/usr/lib/python3/dist-packages/ceph_daemon.py	do_sockiozadmin_socket.<locals>.do_sockio,   s"   }V^V-?@@T	<LLU*+++iillG7||a"#GHHHtW--BAHC'' 1s7O44iiooCs3xx ''  	< 	< 	<}s6{{:;;;	<s    B:C; ;
D)D$$D)s&   {"prefix": "get_command_descriptions"}z(exception getting command descriptions: Nutf-8clizinvalid commandr   r&   )
r4   bytesr3   r.   r   decoder   jsondumpsencode)	r   r   r   r>   cmd_jsonesigdict
valid_dictrets	            r=   admin_socketrK   "   sL     %    2P9YFH H P P PEANOOOP "(//'":":EBBG!'3//J .,--- &%
83i	4:j#9#9#@#@#I#IJJ 3 3 3=3q6612223 Js,   ( 
AAA%1C 
D!D  Dc                   ^    e Zd ZdZd
dZdeeef         fdZd
dZd
dZ	de
fdZde
fd	ZdS )Termsize)   P   r   Nc                 V    |                                  \  | _        | _        d| _        d S NF)_gettermsizerowscolschangedselfs    r=   __init__zTermsize.__init__^   s'    #0022	49r%   c                    	 t           j                                        }t          j        ddddd          }t          j        dt          |t          |                    d d         \  }}||fS # t          $ r
 | j	        cY S w xY w)Nhhhhr      )
sysstdinfilenor/   packr0   r   r   IOErrorDEFAULT_SIZE)rW   fdszrS   rT   s        r=   rR   zTermsize._gettermsizeb   s    	%!!##BVQ1a00BvuRR/H/HII"1"MJD$: 	% 	% 	%$$$$	%s   A-A0 0BBc                     |                                  \  }}| j        s| j        | j        f||fk    | _        ||c| _        | _        d S N)rR   rU   rS   rT   )rW   rS   rT   s      r=   updatezTermsize.updatek   sO    &&((
d| 	B Ity1dD\ADL#T	4999r%   c                     d| _         d S rQ   )rU   rV   s    r=   reset_changedzTermsize.reset_changedq   s    r%   c                 <    d| j         | j        | j        | j        fz  S )Nz%s(%dx%d, changed %s)	__class__rS   rT   rU   rV   s    r=   __str__zTermsize.__str__t   s(    &$.*.)TY*N N 	Nr%   c                 <    d| j         | j        | j        | j        fz  S )Nz%s(%d,%d,%s)rj   rV   s    r=   __repr__zTermsize.__repr__x   s(    !%DIt|!E E 	Er%   r   N)__name__
__module____qualname__ra   rX   r   intrR   rf   rh   r4   rl   rn    r%   r=   rM   rM   [   s        L   %eCHo % % % %* * * *   N N N N NE# E E E E E Er%   rM   c            	          e Zd ZdZ ed          \  ZZZZZ	Z
ZZdZdZdZdZdZ	 	 d-d
edeee                  deddfdZdedefdZ	 d.dedededefdZdedefdZdededefdZdedefdZdeeee f         ef         fdZ!deddfdZ"dedeee#f         deee#f         ddfd Z$d!ed"ed#edefd$Z%d/d%Z&d&e'ee(f         d'ee)         ddfd(Z*de+j,        fd)ed*ee         deddfd+Z-e+j,        fdeddfd,Z.dS )0DaemonWatcherz
    Given a Ceph daemon's admin socket path, poll its performance counters
    and output a series of output lines showing the momentary values of
    counters of interest (those with the 'nick' property in Ceph's schema)
    r   z[0mz[1;%dmz[0;%dmz[1mz[4mNr   asokstatpatsmin_prior   c                     || _         d| _        d | _        d | _        || _        t                      | _        || _        t                      | _	        d S rQ   )
r   _colored_stats_schema	_statpatsr   _stats_that_fit	_min_priorM   termsize)rW   rw   rx   ry   s       r=   rX   zDaemonWatcher.__init__   sI     15!0;! 

r%   ostrc                 v    t           j        dv }t          |d          o|                                }|s|sdS dS )zl
        Returns True if the running system's terminal supports color, and False
        otherwise.
        )win32z	Pocket PCisattyFT)r\   platformhasattrr   )rW   r   unsupported_platformis_a_ttys       r=   supports_colorzDaemonWatcher.supports_color   sG    
 !$0F F4**<t{{}} 	x 	5tr%   Fmsgcolordarkc                 D    |r| j         n| j        d|z   z  |z   | j        z   S )zR
        Decorate `msg` with escape sequences to give the requested color
           )COLOR_DARK_SEQ	COLOR_SEQ	RESET_SEQ)rW   r   r   r   s       r=   colorizezDaemonWatcher.colorize   s6     (,?##BJO~& 	&r%   c                 &    | j         |z   | j        z   S )zM
        Decorate `msg` with escape sequences to make it appear bold
        )BOLD_SEQr   )rW   r   s     r=   boldzDaemonWatcher.bold   s     }s"T^33r%   nwidthc                    g d}d}t          dt          |          d|z  z  z            |dz
  k    rH|t          |          dz
  k    rn1|dz  }t          dt          |          d|z  z  z            |dz
  k    H|dk    r0d|d|z  z  z  d|dz
           }|d         d	k    rd
|dd         z   }nd                    |dz
            |z  }|||         }| j        r|dk    r
| j        df}n	| j        df}|                     |                     |dd         |d         |d                             |                     |                     |d         | j        d                    z   S |S )z
        Format a number without units, so as to fit into `width` characters, substituting
        an appropriate unit suffix.
        ) kMGTPEZr   z%si     z%f     @@.r   z%{wid}d)widF)r-   rs   r   r{   BLACKYELLOWr   r   )rW   r   r   unitsunittruncated_float	formattedr   s           r=   format_dimlesszDaemonWatcher.format_dimless   s   
 988$#a&&T4Z0122UQY>>s5zzA~%%AID $#a&&T4Z0122UQY>>
 !88#qFdN';<a	kJOr"c))"%"(="='..57.;;a?O-ouT{{;	= 	Avv
E)U*99T]]9QrT?E!HeAhOOPP))DMM)B-eLLMMN N r%   nickc                 <    t          t          |          d          S )z
        Given the short name `nick` for a column, how many characters
        of width should the column be allocated?  Does not include spacing
        between columns.
        r   )maxr-   )rW   r   s     r=   	col_widthzDaemonWatcher.col_width   s     3t99a   r%   c                    t                      }| j        j        s| j        sd}| j        J | j                                        D ]~\  }}|                                D ]R\  }}||                     |          dz   z  }|| j        j        k    r n!||vrt                      ||<   |||         |<   S|| j        j        k    r n| j                                         t          |          o
|| j        k    }|r|| _        | j        |fS )z
        Get a possibly-truncated list of stats to display based on
        current terminal width.  Allow breaking mid-section.
        r   Nr   )
r   r   rU   r   r|   itemsr   rT   rh   bool)rW   current_fitr   section_namenamesname	stat_datarU   s           r=   get_stats_that_fitz DaemonWatcher.get_stats_that_fit   s9   
 (3}}=  	(< 	E;***'+{'8'8':': 	 	#e',{{}} @ @OD)T^^I66::Et}111#;664?MML16?K-d334=---E . 	##%%%{##M8L)L 	/#.D #W,,r%   c                 T    d}                                  \  }}|                                D ]\  }}t           fd|                                D                       dz
  }t	          |t          |          z
  d          }|dz  }	||	dz  z  }||d|         z  }|||	z
  dz  z  }|dz  }|dz  }|                                         | j        d	                     d}
|                                D ]\  }}|                                D ]T\  }}|
 j	                             |
                                         |                     j                  z   dz   z  }
U|
dd
                              d j                  z   }
|
dz  }
|                    |
           dS )z.
        Print a header row to `ostr`
        r   c                 @    g | ]}                     |          d z   S )r   )r   ).0xrW   s     r=   
<listcomp>z0DaemonWatcher._print_headers.<locals>.<listcomp>  s*    CCCqT^^A&&*CCCr%   r   r   r[   -r   
Tr   |N)r   r   sumvaluesr   r-   writer   BLUEUNDERLINE_SEQljustr   )rW   r   headerstats_r   r   section_widthpad
pad_prefix
sub_header	stat_name	stat_nicks   `            r=   _print_headerszDaemonWatcher._print_headers   s    **,,q#(;;== 	 	L%CCCCELLNNCCCDDqH mc,&7&77;;CJzC'(F|AmO45Fj(C/0FcMFF$

4==D99:::
#(;;== 	J 	JL%(- $ $$	9d0 $$-OODNN94M4M$N$N$(I!/ !// !$	$ $


 $AbD)DMM#ty,I,IIJJd


:r%   dump	last_dumpc           	      B   d}|                                  \  }}|r|                     |           |                                D ]\  }}|                                D ];\  }	}
| j        J | j        |         |	         d         }t	          |t
          z            r,t          ||         |	         ||         |	         z
  d          }nt	          |t          z            rm||         |	         d         ||         |	         d         z
  }|r?||         |	         d         ||         |	         d         z
  t          |          z  }|dz  }nd}n||         |	         }|| 	                    t          |          |                     |
                    z  }|dz  }=|dd	         }||                     d
| j                  z  }|dt          |                     d
| j                                      }|                    d                    |                     dS )zq
        Print a single row of values to `ostr`, based on deltas between `dump` and
        `last_dump`.
        r   Ntyper   avgcountr   r   r   r   r   z{0}
)r   r   r   r}   r   COUNTERr   LONG_RUNNING_AVGfloatr   rs   r   r   r   r-   r   r   )rW   r   r   r   val_rowfitrU   r   r   r   r   	stat_typer   entriess                 r=   _print_valszDaemonWatcher._print_vals  s>    ..00W 	&%%%#&99;; 	5 	5L%(-  $	9|/// L6yA&I		G+,, 6D.y9%l3I>?@AC CAA)&6677 6"<0;JG%l3I>zJKG !,/	:5A&|4Y?FG#Gnn- V\*95A4..s1vv/3~~i/H/HJ J J3admGt}}S$)444GG!SsDI!>!>????@

7>>'**+++++r%   sectr   prioc                     | j         r:d                    |f          t          fd| j         D                       sdS | j        ||| j        k    S dS )a  
        boolean: should we output this stat?

        1) If self._statpats exists and the name filename-glob-matches
           anything in the list, and prio is high enough, or
        2) If self._statpats doesn't exist and prio is high enough

        then yes.
        r   c                 T    g | ]$}t          |          st          |          "|%S rt   r   )r   pr   sectnames     r=   r   z1DaemonWatcher._should_include.<locals>.<listcomp>P  sK       4##'.x';';  r%   FNT)r~   joinanyr   )rW   r   r   r   r   s     ` @r=   _should_includezDaemonWatcher._should_includeD  s     > 	xxt--H     >      u>%$*:DN*+tr%   c                 J   t          j        t          | j        ddg                              d          t
                    | _        t                      | _        | j        J | j                                        D ]\  }}|                                D ]g\  }}|	                    dd          }| 
                    |||          r5|| j        vrt                      | j        |<   |d         | j        |         |<   ht          | j                  st          d	          dS )
z
        Populate our instance-local copy of the daemon's performance counter
        schema, and work out which stats we will display.
        perfschemar?   )object_pairs_hookNpriorityr   r   zno stats selected by filters)rC   loadsrK   r   rB   r   r}   r|   r   getr   r-   r.   )rW   r   section_statsr   schema_datar   s         r=   _load_schemazDaemonWatcher._load_schema[  s7   
 z&();<<CCGLL)+ + +
 "mm|'''+/<+=+=+?+? 	J 	J'L-%2%8%8%:%: J J!k"z155''dDAA J#4;664?MML16A&6IDK-d3J 4; 	?=>>>	? 	?r%   signoframec                 8    | j                                          d S re   )r   rf   )rW   r   r   s      r=   _handle_sigwinchzDaemonWatcher._handle_sigwinchq  s     	r%   intervalcountc                 `   |                                   |                     |          | _        |                     |           t	          j        t          | j        ddg                              d                    }d}	 t          t          | j                   	 t	          j        t          | j        ddg                              d                    }|| j        j        dz
  k    r|                     |           d}|                     |||           ||dz  }|dk    rdS |dz  }|}t          j                    |z   }t          j                    |k     r?t          j        |t          j                    z
             t          j                    |k     ?# t"          $ r Y dS w xY w)	z{
        Print output at regular intervals until interrupted.

        :param ostr: Stream to which to send output
        r   r   r?   r   Tr[   Nr   )r   r   r{   r   rC   r   rK   r   rB   r	   r   r   r   rS   r   timesleepKeyboardInterrupt)rW   r   r   r   r   rows_since_headerr   ends           r=   runzDaemonWatcher.runv  s    	++D11D!!!J|DNVV<LMMTTU\]]^^		8T23332z,t~?O"P"P"W"WX_"`"`aa$(:Q(>>>''---()%  tY777$QJEzz!Q&! 	 ikkH,ikkC''JsTY[[0111 ikkC''2$ ! 	 	 	FF	s   B%F *A5F 
F-,F-c                    t          d          }d|j        d<   d|j        d<   d|j        d<   d|j        d<   |                                  | j        J | j        J | j                                        D ]`\  }}|                                D ]F\  }}| j        |         |                             d	          pd
}|                    ||||f           Ga|                    |	                    t                    dz              dS )zQ
        Show all selected stats with section, full name, nick, and prio
        )sectionr   r   r   r7   r  r   r   rr   Nr   r   )hrulesr   )r   alignr   r|   r}   r   r   add_rowr   
get_stringr   )rW   r   tabler   r   r   r   r   s           r=   listzDaemonWatcher.list  s-    ?@@!$I!F!F!F{&&&|'''+/;+<+<+>+> 	@ 	@'L-+1133 @ @
d|L1$7;;JGGL1|T4>????@ 	

5##6#22T9:::::r%   )Nr   )Fro   )/rp   rq   rr   __doc__ranger   REDGREENr   r   MAGENTACYANGRAYr   r   r   r   r   r4   r   r   rs   rX   r   r   r   r   r   r   r   r   r   dictr   r   r   r   r   r   r   r
   r   r   r\   stdoutr   r  rt   r%   r=   rv   rv   }   s         	a	 II!NHM 6:!"# ###HSM2# # (,# # # #
6 
d 
 
 
 
 $& &&& & ),& & & &4 4 4 4 4 4 C C    <!c !c ! ! ! !-E$sDy/4*?$@ - - - -46 d    <&, &,sCx.&,  $CH~&, 37&, &, &, &,PC s # $    .? ? ? ?, %c7l 3 ( 38<    $(:' ''C=' ' +/' ' ' 'R #&* ; ; ; ; ; ; ; ; ;r%   rv   )r   )+r	  r\   rC   r'   r/   r   collectionsr   fcntlr   r   prettytabler   r   r	   r
   r   termiosr   typesr   typingr   r   r   r   r   r   r   r   r   ceph_argparser   r   r   r   r2   r4   rA   rK   objectrM   rv   rt   r%   r=   <module>r     s    


     # # # # # #             + + + + + + + + , , , , , , , , , ,             V V V V V V V V V V V V V V V V V V V V V V ? ? ? ? ? ? ? ?
 
 *,6 6C 63i6!#6056 6 6 6rE E E E Ev E E EDr; r; r; r; r;F r; r; r; r; r;r%   