
    /I_s                        S r SSKrSSKrSSKJr  \R
                  " 5       r " S S5      r " S S5      r " S S	5      r	 " S
 S5      r
 " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S\R"                  5      r " S S\R"                  5      r " S S5      r " S S5      rg) zifupdown2 network interface object

It is modeled based on the 'iface' section in /etc/network/interfaces
file. But can be extended to include any other network interface format
    N)OrderedDictc                   $    \ rS rSrSrSrSrSrSrg)ifaceStatusUserStrs   zThis class declares strings user can see during an ifquery --check
for example. These strings can be overridden by user defined strings from
config file )success)errorunknown N)	__name__
__module____qualname____firstlineno____doc__SUCCESSFAILUREUNKNOWN__static_attributes__r
       &/usr/share/ifupdown2/ifupdown/iface.pyr   r      s     GGGr   r   c                        \ rS rSrSrSrSrSrg)	ifaceType    r         r
   N)r   r   r   r   r   IFACEBRIDGE_VLANr   r
   r   r   r   r       s    GEKr   r   c                   $    \ rS rSrSrSrSrSrSrg)	ifaceRole%   zifaceRole is used to classify the ifaceobj.role of
MASTER or SLAVE where there is a bond or bridge
with bond-slaves or bridge-ports.  A bond in a bridge
is both a master and slave (0x3)
r   r   r   r
   N)	r   r   r   r   r   r   SLAVEMASTERr   r
   r   r   r   r   %   s    
 GEFr   r   c                   H    \ rS rSrSrSrSrSrSrSr	Sr
S	rS	r\S
 5       rSrg)ifaceLinkKind/   zifaceLlinkKind is used to identify interfaces
in the ifaceobj.link_kind attribute. Dependents of the bridge or
bond have an ifaceobj.role attribute of SLAVE and the bridge or
bond itself has ifaceobj.role of MASTER.
r   r   r               c                     XR                   :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gg)NbridgebondvlanvxlanvrfOTHER)BRIDGEBONDVLANVXLANVRF)clskinds     r   to_strifaceLinkKind.to_str@   sE    ::XXXXYYWW_r   r
   N)r   r   r   r   r   r   r0   r1   r2   r3   r4   
BATMAN_ADVr/   classmethodr7   r   r
   r   r   r#   r#   /   sE    
 GFDDECJ E r   r#   c                   \    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSr\S 5       rSrg)ifaceLinkPrivFlagsO   zUThis corresponds to kernel netdev->priv_flags
and can be BRIDGE_PORT, BOND_SLAVE etc r   r   r   r%   r&   r'   r(   i   i   l        l       @ l        c                    / nXR                   -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR
                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S5        XR                  -  (       a  UR                  S	5        XR                  -  (       a  UR                  S
5        SR                  U5      $ )Nzbridge portz
bond slavez	vrf slavezvlan aware bridgezvxlan bridgezaddress virtual slaveloopbackzkeep ling downzes bondzopenvswitch interfacez, )BRIDGE_PORTappend
BOND_SLAVE	VRF_SLAVEBRIDGE_VLAN_AWAREBRIDGE_VXLANADDRESS_VIRTUAL_SLAVELOOPBACKKEEP_LINK_DOWNES_BONDOPENVSWITCHjoin)r5   flagstring_lists      r   get_strifaceLinkPrivFlags.get_stra   s   //!}-.. |,--{+'''23"""~.+++67,,z*$$$/0++y)//!67yy%%r   r
   N)r   r   r   r   r   r   r@   rB   rC   rD   rE   rF   rG   rH   	MGMT_INTFSINGLE_VXLANrI   rJ   r:   rN   r   r
   r   r   r<   r<   O   s^    3  GKJIL$HNILGK!& !&r   r<   c                   $    \ rS rSrSrSrSrSrSrg)ifaceLinkType   r   r         r
   N)	r   r   r   r   LINK_UNKNOWN
LINK_SLAVELINK_MASTERLINK_NAr   r
   r   r   rS   rS      s    LJKGr   rS   c                   (    \ rS rSrSSS.rSSS.rSrg	)
VlanProtocols   0x81000x88a8)802.1Q802.1ADr`   ra   )r^   r_   r
   N)r   r   r   r   ETHERTYPES_TO_IDID_TO_ETHERTYPESr   r
   r   r   r\   r\      s"     %-$,
 %-$-r   r\   c                   $    \ rS rSrSrSrSrSrSrg)ifaceDependencyType   a>  Indicates type of dependency.

This class enumerates types of dependency relationships
between interfaces.

iface dependency relationships can be classified
into:
 - link
 - master/slave

In a 'link' dependency relationship, dependency can be shared
between interfaces. example: swp1.100 and
swp1.200 can both have 'link' swp1. swp1 is also a dependency
of swp1.100 and swp1.200. As you can see dependency
swp1 is shared between swp1.100 and swp1.200.

In a master/slave relationship like bridge and
its ports: eg: bridge br0 and its ports swp1 and swp2.
dependency swp1 and swp2 cannot be shared with any other
interface with the same dependency relationship.
ie, swp1 and swp2 cannot be in a slave relationship
with another interface. Understanding the dependency type is
required for any semantic checks between dependencies.

r   r   rU   r
   N)	r   r   r   r   r   r   LINKMASTER_SLAVEr   r
   r   r   re   re      s    2 GDLr   re   c                   L    \ rS rSrSrSrSrSrSrSr	\
S 5       r\
S	 5       rS
rg)ifaceStatus   zEnumerates iface status r   rU   rV         c                     XR                   :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gg )Nr	   r   r   notfound)r   r   ERRORNOTFOUNDr5   states     r   r7   ifaceStatus.to_str   s;    KKkk!iill" #r   c                 p    US:X  a  U R                   $ US:X  a  U R                  $ US:X  a  U R                  $ g )Nr	   r   r   )r   r   rp   r5   	state_strs     r   from_strifaceStatus.from_str   s=    	!;;)#;;'!99 "r   r
   N)r   r   r   r   r   r   r   WARNINGrp   rq   r:   r7   rx   r   r
   r   r   rj   rj      sD    "GGGEH   r   rj   c                   `    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSr\S 5       r\S 5       rSrg)
ifaceState   zEnumerates iface state r   rU   rV   rl   rm            	   
   c                 D   XR                   :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR
                  :X  a  gXR                  :X  a  gXR                  :X  a  gXR                  :X  a  g	XR                  :X  a  g
g Nr	   newzpre-upupzpost-upzpre-downdownz	post-downzquery-checkcurrzquery-running
r   NEWPRE_UPUPPOST_UPPRE_DOWNDOWN	POST_DOWNQUERY_CHECKCURRQUERY_RUNNINGrr   s     r   r7   ifaceState.to_str   s    KKggjj ff_kk!ll"hhmm#)))$'''" (r   c                 l   US:X  a  U R                   $ US:X  a  U R                  $ US:X  a  U R                  $ US:X  a  U R                  $ US:X  a  U R                  $ US:X  a  U R
                  $ US:X  a  U R                  $ US:X  a  U R                  $ US	:X  a  U R                  $ US
:X  a  U R                  $ g r   r   rv   s     r   rx   ifaceState.from_str   s    	!;;%77N("::$66M)#;;*$<<& 88O+%== ++&&&/)$$$ *r   r
   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r7   rx   r   r
   r   r   r|   r|      s_    !G
CF	BGHDI OM# #, % %r   r|   c                       \ rS rSrS rSrg)ifaceJsonEncoderi  c                 (   0 n[        / 5      nUR                  (       a3  [        S [        UR                  R	                  5       5       5       5      nUR
                  US'   UR                  (       a5  SUR                  ;   a  SUR                  ;   a  SUS'   OUR                  US'   UR                  (       aG  [        UR                  5      S:  a  UR                  US'   OSR                  UR                  5      US'   UR                  US	'   X#S
'   U$ )Nc              3   V   #    U  H  u  pU[        U5      S :X  a  US   OU4v   M!     g7f)r   r   N)len).0kvs      r   	<genexpr>+ifaceJsonEncoder.default.<locals>.<genexpr>  s/      @(>  #a&A+!A$1>(>s   ')nameinetdhcpaddr_methodr   addr_family autoconfig)r   r   dictlistitemsr   r   r   r   rK   r   )selfo	retconfigretifacedicts       r   defaultifaceJsonEncoder.default  s    	"288 @(,QXX^^-=(>@ @I vvV==&6Q]]+B.4]+./mm]+==1==!A%./mm]+.1hhq}}.E]+ vvV!*Xr   r
   Nr   r   r   r   r   r   r
   r   r   r   r     s    r   r   c                       \ rS rSrS rSrg)ifaceJsonEncoderWithStatusi(  c                    0 n0 n[        / 5      nUR                  (       a  [        UR                  R                  5       5       H  u  pVSn/ nU Hk  n	UR	                  XW5      n
U
S:X  a  [
        R                  nO'U
S:X  a  [
        R                  nO[
        R                  nUR                  SU-  5        US-  nMm     [        U5      S:X  a  US   OUX%'   [        U5      S:X  a  US   OUX5'   M     UR                  [        R                  :X  d  UR                  [        R                  :X  a  [
        R                  nO[
        R                  nUR                  US'   UR                  (       a  UR                  US'   UR                   (       aG  [        UR                   5      S:  a  UR                   US'   OSR#                  UR                   5      US'   UR$                  US'   X$S	'   X4S
'   XS'   U$ )Nr   r   %sr   r   r   r   r   r   config_statusstatus)r   r   r   r   get_config_attr_statusr   rp   r   r   rA   r   r   rj   rq   r   r   r   rK   r   )r   r   r   retconfig_statusr   r   r   idxvitem_statusvitems
status_strr   s                r   r   "ifaceJsonEncoderWithStatus.default)  s   	"288AHHNN,-!E008AAv%8%>%>
a%8%@%@
%8%@%@
 ''j(891HC  (+1v{qt	9<\9Ja9Ol1oUa # .  HH,,,K---)//F)11F vvV==*+--L'==1==!A%./mm]+.1hhq}}.E]+ vvV!*X(8_%!'Xr   r
   Nr   r
   r   r   r   r   (  s    (r   r   c                   $    \ rS rSr\S 5       rSrg)ifaceJsonDecoderiS  c                    [        [        UR                  S[        5       5      R                  5       5       VVs/ s H/  u  p#U[	        U[        5      (       a  UOUR                  5       /4PM1     snn5      US'   [        US9$ s  snnf )Nr   )	attrsdict)r   r   getr   
isinstancestripiface)r5   ifaceattrdictr   r   s       r   json_to_ifaceobj!ifaceJsonDecoder.json_to_ifaceobjT  s    "-+/0A0A(,7M1;;@57,D/E,DCA 12At9L9LA67ggi[0C,D/E #Fh }--	/Es   6B
r
   N)r   r   r   r   r:   r   r   r
   r   r   r   r   S  s    . .r   r   c                      \ rS rSrSrSrSrSrSrSr	Sr
S	r0 4S
 jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S-S  jr" S-S! jr#S-S" jr$S# r%S$ r&S% r'S& r(S' r)S( r*S.S) jr+S.S* jr,S+r-g,)/r   i\  a  ifupdown2 iface object class
Attributes:
    **name**      Name of the interface

    **addr_family**     Address family eg, inet, inet6. Can be None to
                        indicate both address families

    **addr_method**     Address method eg, static, manual or None for
                        static address method

    **config**          dictionary of config lines for this interface

    **state**           Configuration state of an interface as defined by
                        ifaceState

    **status**          Configuration status of an interface as defined by
                        ifaceStatus

    **flags**           Internal flags used by iface processing

    **priv_flags**      private flags owned by module using this class

    **module_flags**    module flags owned by module using this class

    **refcnt**          reference count, indicating number of interfaces
                        dependent on this iface

    **lowerifaces**     list of interface names lower to this interface or
                        this interface depends on

    **upperifaces**     list of interface names upper to this interface or
                        the interfaces that depend on this interface

    **auto**            True if interface belongs to the auto class

    **classes**         List of classes the interface belongs to

    **env**             shell environment the interface needs during
                        execution

    **raw_config**      raw interface config from file
r   r   r%   r&   r'   r(   z0.1c                 t   / U l         U R                  U5        0 U l         [        R                  U l         [        R                  U l         S U l	         SU l
         S U l         0 U l         SU l         S U l         S U l         / U l         S U l         / U l         S U l         [(        R                  U l         S U l        [.        R                  U l        S U l        [4        R6                  U l        [:        R                  U l        [>        R                  U l         [B        R                  U l"        SU l#        g Nr   F)$r   _set_attrs_from_dict_config_statusr|   r   rs   rj   r   r   r   flags
priv_flagsmodule_flagsrefcntlowerifacesupperifacesclassesenv
raw_config	linkstater   type	priv_datar   rolerealnamerS   rW   	link_typer#   	link_kindr<   link_privflagsre   dependency_typeblacklisted)r   r   s     r   __init__iface.__init__  s   !!), 9^^
/!))1@
CKOII6Jc(%%	%%	&33&..088  3:: r   c                 0   UR                  SS5      U l        UR                  S5      U l        UR                  S5      U l        UR                  S[	        5       5      U l        UR                  S5      nU(       a  U R                  R                  U5        g g )Nr   Fr   r   r   r   )r   r   r   r   r   r   r   rA   )r   attrdictr   s      r   r   iface._set_attrs_from_dict  ss    LL/	LL(	#<<6ll8[];ll=1##K0 r   c                 .    U =R                   S-  sl         g)zSincrement refcnt of the interface. Usually used to indicate that
it has dependents r   Nr   r   s    r   
inc_refcntiface.inc_refcnt       	qr   c                 .    U =R                   S-  sl         g)z[decrement refcnt of the interface. Usually used to indicate that
it has lost its dependent r   Nr   r   s    r   
dec_refcntiface.dec_refcnt  r   r   c                 \    U R                   nU(       a  US;   a  gU R                  (       d  gg)zHreturns true if the interface has user provided config,
false otherwise )r   dhcp6r?   TF)r   r   )r   r   s     r   is_config_presentiface.is_config_present  s*     &&;*GG{{r   c                 :    U R                   R                  U5        g)z+appends class to the interfaces class list N)r   rA   )r   	classnames     r   	set_classiface.set_class  s    I&r   c                 <    Xl         X R                  :  a  X l        gg)z&sets state and status of an interface N)rs   r   )r   rs   r   s      r   set_state_n_statusiface.set_state_n_status  s    
KK K  r   c                 0    XR                   :  a  Xl         gg)zsets status of an interface N)r   )r   r   s     r   
set_statusiface.set_status  s    KK K  r   c                 .    U =R                   U-  sl         g Nr   r   rL   s     r   set_flagiface.set_flag  s    

d
r   c                 0    U =R                   U) -  sl         g r   r   r  s     r   
clear_flagiface.clear_flag  s    

te
r   c                     U R                   (       a,  XR                   ;  a  U R                   R                  U5        ggU/U l         g)add to the list of upperifaces N)r   rA   )r   upperifacenames     r   add_to_upperifacesiface.add_to_upperifaces  =    %5%55  ''7 6 !//Dr   c                     U R                   (       a,  XR                   ;  a  U R                   R                  U5        ggU/U l         g)zadd to the list of lowerifaces N)r   rA   )r   lowerifacenames     r   add_to_lowerifacesiface.add_to_lowerifaces  r  r   c                 8    U R                   R                  U5      $ )r  r   r   r   	attr_names     r   get_attr_valueiface.get_attr_value  s    {{y))r   c                 R    U R                   R                  U5      nU(       a  US   $ g)z+get first value of the specified attr name r   Nr  )r   r  attr_value_lists      r   get_attr_value_firstiface.get_attr_value_first	  s%    ++//)4"1%%r   c                 h    U H,  nU R                   R                  U5      nU(       d  M'  US   s  $    g)zpget first value of the first attr in the list.
Useful when you have multiple attrs representing the
same thing.
r   Nr  )r   attrsattrr  s       r   get_attrs_value_firstiface.get_attrs_value_first  s5    
 D"kkood3O&q))  r   c                 r    U R                   R                  U5      nU(       a   X2   $ g! [         a     gf = f)z*get n'th value of the specified attr name N)r   r   	Exception)r   r  
attr_indexr  s       r   get_attr_value_niface.get_attr_value_n  s>    ++//)4&22   s   ) 
66c                 \    U R                   (       d  U R                  5         U R                   $ )z>get shell environment variables the interface must execute in )r   generate_envr   s    r   get_enviface.get_env%  s    xxxxr   c                     0 nU R                   nU R                  US'   [        UR                  5       5       H/  u  p4SUR	                  5       R                  SS5      -  nUS   X'   M1     Xl        g)zugenerate shell environment variables dict interface must execute
in. This is used to support legacy ifupdown scripts
r   zIF_%s-_r   N)r   r   r   r   upperreplacer   )r   r   r   r  
attr_valueattr_env_names         r   r&  iface.generate_env+  sg     yyG $V\\^ 4D#TZZ\%9%9#s%CCM!+AC !5 r   c                 Z    U R                   R                  U/ 5      R                  U5        gz5add attribute name and value to the interface config N)r   
setdefaultrA   r   r  r.  s      r   update_configiface.update_config7  s!    y"-44Z@r   c                 $    U/U R                   U'   gr2  r   r4  s      r   replace_configiface.replace_config;  s    ",Ir   c                 @     U R                   U	 g! [         a     gf = fr2  )r   r!  r  s     r   delete_configiface.delete_config?  s%    	I& 		s    
c                 :    U R                   R                  U5        g r   )r   update)r   r   s     r   update_config_dictiface.update_config_dictF  s    8$r   c                 b   U(       d  SnU R                   R                  U/ 5      R                  U5        U R                  R                  U/ 5      R                  U5        US:X  a  [        R
                  U l        gU R                  [        R
                  :w  a  [        R                  U l        gg)zadd attribute name and value to the interface config and also
update the config_status dict with status of this attribute config  r   N)r   r3  rA   r   rj   rp   r   r   )r   r  r.  attr_statuss       r   update_config_with_statusiface.update_config_with_statusI  s     Jy"-44Z@&&y"5<<[I!%++DK[[K---%--DK .r   c                     U Hq  nUR                  U5      (       d  M  U R                  R                  U/ 5      R                  S5        U R                  R                  U/ 5      R                  U5        Ms     g )NrC  )r  r   r3  rA   r   )r   ifaceobjorig
attr_namesrD  r  s        r   &check_n_update_config_with_status_many,iface.check_n_update_config_with_status_manyW  sb     $I44Y??KK""9b188<**9b9@@M	 $r   c                 @    U R                   R                  U/ 5      U   $ )z[get status of a attribute config on this interface.

Looks at the iface _config_status dict)r   r   )r   r  r   s      r   r   iface.get_config_attr_statusa  s"     ""&&y"5c::r   c                 f  ^ U R                   TR                   :w  a  gU R                  TR                  :w  a  gU R                  TR                  :w  a  gU R                  TR                  :w  a  gU R                  TR                  :w  a  gU R
                  TR
                  :w  a  g[        U R                  5      [        TR                  5      :w  a  g[        U4S jU R                   5       5      (       a  g[        U4S j[        U R                  R                  5       5       5       5      (       a  gg)zcompares iface object with iface object passed as argument

Returns True if object self is same as dstiface and False otherwise Fc              3   J   >#    U  H  oTR                   ;  d  M  S v   M     g7fTNr8  )r   r   dstifaces     r   r    iface.compare.<locals>.<genexpr>t  s     E[X__,Dtt[s   #	#c              3   n   >#    U  H*  u  pUTR                   R                  U5      :w  d  M&  S v   M,     g7frP  r  )r   r   r   rQ  s      r   r   rR  v  s3      48HOO//22 t8s   %5	5T)r   r   r   r   r   r   r   r   anyr   r   )r   rQ  s    `r   compareiface.compareg  s    
 99%e99%ex333Ex333E99%e<<8+++Et{{s8??33ET[[EEE 4tDKK$5$5$78 4 4 4<Ar   c                    UR                   R                  5        Hb  u  p#U R                   R                  U5      (       a   U R                   U   R                  U5        ME  U R                   R	                  X#4/5        Md     U R
                  R                  UR
                  5        U R                  (       d  UR                  (       a  SU l        ggg)zThis squashes the iface object TN)r   r   r   extendr?  r   r   )r   newifaceobjattrnameattrlists       r   squashiface.squashz  s    "-"4"4":":"<H {{x((H%,,X6""X$8#9: #= 	 7 78 yy[--DI .yr   c                     U R                   R                  5       nUS	 US	 US	 US	 US	 US	 US	 US	 US		 US
	 US	 US	 US	 US	 US	 US	 US	 U$ )Nrs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__dict__copy)r   odicts     r   __getstate__iface.__getstate__  s    ""$'N(O- - (O"#'N,.!,+%L++&M#$- r   c                 8   0 U l         [        R                  U l        [        R
                  U l        SU l        SU l        S U l	        S U l
        S U l        S U l        [        R
                  U l        S U l        0 U l        / U l        U =R                  U R$                  -  sl        [&        R(                  U l        [,        R
                  U l        [0        R
                  U l        [4        R
                  U l        SU l        U R:                  R=                  U5        g r   )r   r|   r   rs   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   _PICKLEDrS   rZ   r   r#   r   r<   r   re   r   r   r_  r?  )r   r   s     r   __setstate__iface.__setstate__  s     ^^
!))
%%	

dmm#
&..&..0882:: T"r   c                 
   SnU R                   (       a  [        SU R                  -  5        [        U R                  S   5        [	        S[        U R                  5      5       H  n[        X R                  U   -   5        M     g )Nz  zauto %sr   r   )r   printr   r   ranger   )r   loggerindentis       r   dump_rawiface.dump_raw  s^    99)TYY&'tq!#q#doo./A6OOA..0 0r   c           
         SnUR                  U R                  S-   5        UR                  USSR                  U R                  5      -  -   5        UR                  USU R                  -  -   5        UR                  USU R
                  -  -   5        UR                  US[        R                  U R                  5      -  -   5        UR                  US[        R                  U R                  5      -  -   5        UR                  US	U R                  -  -   5        U R                  nU(       a!  UR                  US
[        U5      -  -   5        OUR                  US-   5        U R                  nU(       a!  UR                  US[        U5      -  -   5        OUR                  US-   5        UR                  U< S[        R                   S[        R"                  S[        R$                  S0R'                  U R(                  5      < 35        UR                  U< S[*        R                   S[*        R,                  S[*        R.                  S0R'                  U R0                  5      < 35        UR                  U< S[2        R                  U R4                  5      < 35        UR                  U< S[6        R9                  U R:                  5      < 35        U R<                  (       a/  U R<                  R>                  (       a  UR                  SU-  5        UR                  US-   5        U R@                  nU(       a  UR                  X"-   [        U5      -   5        UR                  S5        g )N	z : {z
family: %sr   z
method: %sz	flags: %xz	state: %sz
status: %sz
refcnt: %dzlowerdevs: %szlowerdevs: Nonezupperdevs: %szupperdevs: Nonezrole: r   r    r!   ztype: r   r   zlink_kind: zlink_privflags: z%spriv_flags: BUILTINzconfig: })!infor   rK   r   r   r   r|   r7   rs   rj   r   r   r   strr   r   r   r    r!   r   r   r   r   r   r   r#   r   r<   rN   r   r   BUILTINr   )r   rk  rl  dr   s        r   dump
iface.dump  s   DII&'F\CHHT5E5E,FFFGF\4+;+;;;<F[$**445F[""4::./ / 	0F\##DKK01 1 	2F\4;;667KK#a&!889KK!223KK#a&!889KK!223FyOOWh-( ),DII-7 8 	9
 	FyOOW!!=-2 36#dii.-A B 	C
 	1E1Ednn1UVWf6H6P6PQUQdQd6efg??&&3f<=FZ'(KK#f+56Cr   c           	      T   SnSnU(       a!  U R                   (       a  SU R                   -  nOSU R                  -  nU R                  (       a  USU-  -  nSn	U R                  [        R
                  :X  a	  U	SU-  -  n	OU	SU-  -  n	U(       a  U	SU-  -  n	U(       a  U	SU-  -  n	U(       a  S n
U R                  [        R                  :X  d  U R                  [        R                  :X  a7  U R                  (       a  U	SU R                  -  -  n	S	[        R                  -  n
O1U R                  [        R                  :X  a  S	[        R                  -  n
U
(       a  US
R                  X5      S-   -  nOXyS-   -  nU R                  [        R                  :X  a  [        US-   5        g OXyS-   -  nU R                  nU(       a  U(       a  [!        UR#                  5       5       H  u  pSnU H  nS n
U(       a^  U R%                  X5      nUS:X  a  S	[        R&                  -  n
O3US:X  a  S	[        R                  -  n
OUS:X  a  S	[        R                  -  n
U
(       a"  XvSR                  U< SU< 3U
5      -   S-   -  nOU(       a  XvU< SU< S3-   -  nUS-  nM     M     [        U5        g )Nrq  rC  r   zauto %s
zvlan %sziface %sz %sz (%s)z[%s]z{0:65} {1:>8}
r   r   z{0:55} {1:>10}r   )r   r   r   r   r   r   r   rj   rp   rq   r   r   r   formatri  r   r   r   r   r   )r   familyfirstr   with_statususe_realnamerl  outbufr   	ifaceliner   r   cname
cvaluelistr   cvr   s                    r   _dump_prettyiface._dump_pretty  sj   DMM&D?D99k4''F	99	---D(IT))I'I,,IJ{000KK;#7#77??$//!99I#%8%>%>>
 3 33#%8%@%@@
/00G$NNd**{{k222ftm$ 3 $&&Fe%)&,,.%9!$B!%J" 77C7)/1D1L1L)LJ!V)/1D1J1J)JJ!V)/1D1L1L)LJ!,<,C,C(-r2J-@ $@CG#H H "E2/F&FFF1HC! % &:& 	fr   c           	          U R                   (       d  U R                  S SU R                  UUS9  g SnU R                    H8  nU R                  nU(       a  US:X  a  SU;   a  SnU R                  XCUUUS9  SnM:     g )NT)r  r  r   r   )r   r  r  F)r   r  r   )r   r  r  r~  r}  r   s         r   dump_prettyiface.dump_pretty)  s    dD"..*5+7  9& E**".. 6V#3+8M"(K!!&.9.9/; " =  +r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   r   r   r   r   N)r   )FF).r   r   r   r   r   re  HAS_SIBLINGSIFACERANGE_ENTRYIFACERANGE_STARTOLDEST_SIBLINGYOUNGEST_SIBLINGversionr   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r#  r'  r&  r5  r9  r<  r@  rE  rJ  r   rU  r\  rb  rf  rn  rw  r  r  r   r
   r   r   r   r   \  s    )Z "H!L!!!N#G!# ,!\1

	'!!
00*	
A.%. <=N;&",#,1-^9v!r   r   )r   jsonloggingcollectionsr   	getLoggerlogr   r   r   r#   r<   rS   r\   re   rj   r|   JSONEncoderr   r   r   r   r
   r   r   <module>r     s      #  
  @4& 4&n 
 
 < :<% <%|t'' .)!1!1 )V. .n nr   