
    /I_;                        S SK r S SKrS SKr S SKJr  S SKJr  S SKJs  J	r	  S SK
Js  Jr  S SK7  S SKJr  S SKJr  S SKJr   " S S	\\5      rg! \\4 a2    S SKJr  S SKJr  S SKJ	r	  S SKJr  S SK7  S SKJr  S SKJr  S SKJr   NFf = f)
    N)Addon)
LogManager)*)utils)dhclient)
moduleBasec                       \ 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rg)dhcp%   z6ifupdown2 addon module to configure dhcp on interface r   c                 n   [         R                  " U 5        [        R                  " U /UQ70 UD6  [        S	0 UD6U l        U R                  5       nU(       a  US:X  a  SU l        OSU l        U R                  R                  SU R                  -  5         [        [        R                  R                  U R                  R                  SS95      U l        U R                  S:  a  SU l        U R                  R                  SU R                  -  5        g ! [          a    U R"                  U l         N]f = f)
NmgmtTFzmgmt vrf_context = %sdhclient_retry_on_failuremodule_nameattrr   z-dhclient: dhclient_retry_on_failure set to %s )r   __init__r   r   dhclientcmd_get_vrf_contextmgmt_vrf_contextloggerinfointpolicymanagerpolicymanager_apiget_module_globals	__class____name__r   	ExceptionDHCLIENT_RETRY_ON_FAILURE)selfargskargsvrf_ids       #/usr/share/ifupdown2/addons/dhcp.pyr   dhcp.__init__-   s   tD14151#,e,&&(f&$(D!$)D!0$2G2GGH	L-0//BB $ 7 74 C .D* ))A--.D*H4KiKiij  	L-1-K-KD*	Ls   A D D43D4c                 "    U R                  USS9$ )NTsyntax_check)is_dhcp_allowed_on)r!   ifaceobjifaceobj_getfuncs      r%   r)   dhcp.syntax_checkH   s    &&xd&CC    c                 p    UR                   (       a%  SUR                   ;   a  [        R                  " USS9$ g)Nr
   Tr(   )addr_methodr   is_addr_ip_allowed_on)r!   r+   r)   s      r%   r*   dhcp.is_dhcp_allowed_onK   s.    Fh.B.B$B..xdKKr.   c                 v   [        5       n [        R                  " SSSSU/5      R                  S5      nU Hl  nUR	                  U5      nUS:  a  M  XUR	                  U5      [        U5      -   S-   S  nUS UR	                  S5       nU(       d  M[  UR                  U5        Mn     U$ ! [         a     U$ f = f)	Nipz-oaddrshow
r       )setr   exec_commandlsplitfindlenaddr   )	r!   ifnamefamilyipsaentryfamily_indextmpr4   s	            r%   get_current_ip_configureddhcp.get_current_ip_configuredP   s    e	##T4$HIOOPTUA$zz&1!#JJv.V<q@AB#((3-(2GGBK  
  	
	s   BB* B* *
B87B8c           	          U R                  X5      nU R                  nUS:  a4  U" U40 UD6  U R                  XXVUR                  S5      5      nUS:  a  M3  g g )Nr   
cmd_prefix)rG   r   dhclient_checkget)r!   r@   rA   handlerhandler_kwargsip_config_beforeretrys          r%   dhclient_start_and_checkdhcp.dhclient_start_and_checkd   s]    99&I..qjF-n-''8HQ_QcQcdpQqrE qjr.   c           	         US-  nU R                  X5      R                  U5      nU(       aG  U R                  R                  U< S[	        U5      S:  a  SOS< SSR                  U5      < 35        g US:  a$  U R                  R                  U< S	U< S
35        OYU R                  R                  SU-  5         U R                  R                  SU-  5        U R                  R                  X5        g U R                  R                  SU-  5        U R                  R                  X5        U$ ! U R                  R                  SU-  5        U R                  R                  X5        f = f)Nr8   z: dhclient: new addresses z detected: z, r   z5: dhclient: couldn't detect new ip address, retrying z more times...z7%s: dhclient: timeout failed to detect new ip addressesz#%s: releasing expired dhcp lease...)	rG   
differencer   r   r>   joinerrorr   release)r!   r@   rA   rO   rP   dhclient_cmd_prefixdiffs          r%   rK   dhcp.dhclient_checkl   s@   
--f=HHIYZKK3t9q=4b8$))D/K F19KK%%!5*
 KK%%&_bh&hi  !F!OP  ((E   !F!OP  ((E   !F!OP  ((Es   5AD4 4;E/c                 X
   U R                   R                  UR                  5      nU R                   R                  UR                  5      nU R	                  USU5        U R	                  USU5        UR
                  [        R                  -  (       a)  U R                  R                  SUR                  -  5        g  S n[        R                  R                  U R                  R                  SS9n[        U5      R!                  5       S:X  + n[        R                  R#                  U R                  R                  UR                  SS9n [%        U5      S	-   n[        R                  R#                  U R                  R                  UR                  SS9n	UR)                  S5      n
U
(       aE  U R*                  (       a4  U R,                  R/                  U
5      (       a  U R*                  < SU
< 3nO?U R0                  (       a.  U R*                  < SS< 3nU R                  R                  S5        SUR2                  ;   a  U(       a)  U R                  R                  SUR                  -  5        Ov [4        R6                  R8                  (       d%  U R                   R;                  UR                  5        U R=                  UR                  SU R                   R>                  UUS9  SUR2                  ;   Ga  U(       a)  U R                  R                  SUR                  -  5        g UR)                  S5      nU(       a"  U RA                  SUR                  -  S-   U5        UR)                  S5      nU(       aG  U RA                  SUR                  -  S-   U5         U R                   RC                  UR                  U	S9  US	:  a  [D        RF                  " S	5        U(       a  [H        RJ                  " [H        RL                  < SUR                  < 35      n[N        RP                  " SU5      nU(       a&  U R                   RS                  UR                  UXIS9  g US	-  nU(       a  [D        RF                  " S	5        U(       a  M  g g g ! [&         a    S
n GNBf = f! [&         a     GNf = f! [&         a     Nf = f! [&         a^  nU R                  RU                  UR                  < S[        U5      < 35        URW                  [X        RZ                  5         S nAg S nAff = f)Ninetinet6z.%s: skipping dhcp configuration: link-down yesz	dhcp-waitr   nozdhcp6-ll-waitr   r@   r   r8   
   
dhcp6-duidvrfr9   defaultzBdetected mgmt vrf context starting dhclient in default vrf contextz0dhclient4 already running on %s. Not restarting.)waitrJ   z0dhclient6 already running on %s. Not restarting.	accept_raznet.ipv6.conf.%sz
.accept_raautoconfz	.autoconfduidz -6 addr show zinet6 .* scope link)rg   rJ   rk   z: ).r   
is_runningnameis_running6_down_stale_dhcp_configlink_privflagsifaceLinkPrivFlagsKEEP_LINK_DOWNr   r   r   r   get_attr_defaultr   r   strlowerget_iface_defaultr   r   get_attr_value_firstvrf_exec_cmd_prefixcachelink_existsr   addr_familyifupdownflagsflagsPERFMODEstoprQ   start
sysctl_setstop6timesleepr   exec_commandip_cmdresearchstart6rY   
set_statusifaceStatusERROR)r!   r+   dhclient4_runningdhclient6_runningr[   	dhcp_waitrg   dhcp6_ll_waittimeout
dhcp6_duidre   rh   ri   addr_outputres                   r%   _updhcp._up   sT    ,,77F ,,88G
 	$$Xv7HI$$Xw8IJ""%7%F%FFKKMPXP]P]]^O	3"&%77HH NN33+ I GI9~++-5D);;MMZ^ZhZhZqZq}}? N <Mm,Q. '88JJW[WeWeWnWn}}< K 9J//6C00

&&s++040H0H#&N#&&040H0H)&T#  !ef---$KK$$ &79A&G H,22;; ,,11(--@ 11 ((..!#6 2  (...$KK$$ &79A&G H !) = =k JI (:HMM(I ,)-.79'<<ZHH(:HMM(I +),-57! ,,228==z2R
 {

1!&+&8&8;@<<:X 'YII&;[I ,,33HMM9=?R 4 e #1" JJqM "'/ /C  , % 8  ) ! !$  	3KK(--Q@A 1 122	3s   =BS R DS 4AR  8A1S *A4S $R1 BS )S RS RS  
R.*S -R..S 1
R>;S =R>>S 
T)AT$$T)c                     UR                   n X!R                   ;  a   U(       a  U/Ul         U R                  U5        XAl         g ! [         a     Nf = f! XAl         f = fN)r{   
_dhcp_downr   )r!   r+   rA   dhclientX_runningr{   s        r%   ro   dhcp._down_stale_dhcp_config   s\    **	/1116G(.x$) $/   		 $/ s#   /A 
AA AA Ac                    S nUR                  S5      nU(       aD  U R                  (       a3  U R                  R                  U5      (       a  U R                  < SU< 3n[        R
                  R                  U R                  R                  UR                  SS9nSUR                  ;   aX  U R                  R                  UR                  X$S9  U R                  R                  UR                  [        R                  5        SUR                  ;   a[  U R                  R!                  UR                  U5        U R                  R                  UR                  [        R"                  5        g g )Nre   r9   rd   rb   r`   rj   r_   )rw   rx   ry   rz   r   r   rv   r   r   rm   r{   r   release6force_address_flush_familysocketAF_INET6rZ   AF_INET)r!   r+   r[   re   r   s        r%   r   dhcp._dhcp_down   s   "++E2D,,JJ""3'',0,D,Dc"J"44FFSWSaSaSjSjNVmmbn G p
h***%%hmm5H%ZJJ11(--QX)))$$X]]4GHJJ11(--P *r.   c                 p    U R                  U5        U R                  R                  UR                  5        g r   )r   netlink	link_downrm   )r!   r+   s     r%   _down
dhcp._down   s$    !x}}-r.   c                    [         R                  nSnU R                  R                  UR                  5      nU R                  R                  UR                  5      nU(       a0  SnSUR                  ;  a  U(       d  [         R                  nSUl        U(       a0  SnSUR                  ;  a  U(       d  [         R                  nSUl        UR                  Ul        U(       d  / Ul        [         R                  nX2l	        g )NFTr_   r
   r`   )
r   SUCCESSr   rl   rm   rn   r{   r   r0   status)r!   r+   ifaceobjcurrr   dhcp_runningdhcp_v4dhcp_v6s          r%   _query_checkdhcp._query_check  s    $$""--l.?.?@""..|/@/@ALX111'$**'-L$Lh2227$**'-L$#+#7#7 ')L$ &&F$r.   c                    U R                   R                  UR                  5      (       d  g U R                  R	                  UR                  5      (       a"  UR
                  R                  S5        SUl        U R                  R                  UR                  5      (       a#  UR
                  R                  S5        SUl        g g )Nr_   r
   r`   dhcp6)	ry   rz   rm   r   rl   r{   appendr0   rn   )r!   ifaceobjrunnings     r%   _query_runningdhcp._query_running  s    zz%%o&:&:;;&&';';<<''..v6*0O'''(<(<==''..w7*1O' >r.   )updownzpre-downquery-checkcurrquery-runningc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )list_run_opskeys)r!   s    r%   get_opsdhcp.get_ops*  s    DMM&&())r.   Nc                    U R                   R                  U5      nU(       d  g US:w  a!  UR                  S:w  a  UR                  S:w  a  gU R	                  USS9(       d  g[
        R                  " 5       n[        R                  nSnUS;   a  UR                  5       (       a  UR                  5       nSnOUR                  5         SnU[        R                  :  a  UR                  [        R                  5        U R                  R                  S	UR                  -  5         US
:X  a
  U" XU5        OU" X5        USL a  UR                  5       R!                  5         gUSL a  UR                  U5        gg! [         a     gf = f! USL a  UR                  5       R!                  5         f USL a  UR                  U5        f f = f)a  run dhcp configuration on the interface object passed as argument

Args:
    **ifaceobj** (object): iface object

    **operation** (str): any of 'up', 'down', 'query-checkcurr',
                         'query-running'

Kwargs:
    **query_ifaceobj** (object): query check ifaceobject. This is only
        valid when op is 'query-checkcurr'. It is an object same as
        ifaceobj, but contains running attribute values and its config
        status. The modules can use it to return queried running state
        of interfaces. status is success if the running state is same
        as user required state in ifaceobj. error otherwise.
Nr   r
   r   Fr(   )r   r   Tz*%s: enabling syslog for dhcp configurationr   )r   rL   r0   r   r*   r   get_instanceloggingINFOis_syslog_enabledget_syslog_log_levelenable_syslogset_level_syslogr   r   rm   disable_syslog)	r!   r+   	operationquery_ifaceobj
extra_args
op_handlerlog_managersyslog_log_leveldisable_syslog_on_exits	            r%   rundhcp.run.  s   " ]]&&y1
	_,((F2++w6 &&xe&D --/"<<!%&,,..#.#C#C#E ).& ))+)-&  7<</,,W\\:KKIHMMYZ
	?--4>:4* &-((*99;'50,,-=> 1M  		H &-((*99;'50,,-=> 1s   &E9 %F	 9
FF	=G)r   r   r   r   )r   
__module____qualname____firstlineno____doc__r    r   r)   r*   rG   rQ   rK   r   ro   r   r   r   r   r   r   r   __static_attributes__r   r.   r%   r
   r
   %   sr    A
 !"k6D
(s2^3@	/Q.%.2 !#/!/	2H*@?r.   r
   )r   r   r   ifupdown2.lib.addonr   ifupdown2.lib.logr    ifupdown2.ifupdown.policymanagerifupdownr    ifupdown2.ifupdown.ifupdownflagsr|   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   !ifupdown2.ifupdownaddons.dhclientr   #ifupdown2.ifupdownaddons.modulebaser   ImportErrorModuleNotFoundError	lib.addonlib.logifupdown.policymanagerifupdown.ifupdownflagsifupdown.ifaceifupdown.utilsifupdownaddons.dhclientifupdownaddons.modulebaser
   r   r.   r%   <module>r      sr    
  5),<<<<*.:>I?5* I? 	() 5"22 $045s   5A 7B
	B
