
    kd&                        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mZ	 d dl
Z
d dlmZ  ed	       d dlZd dlZ ej                  d
      Z G d dej
                        Z G d de      Z G d de      ZddZedk(  rved        Z ej.                         Zej3                  e       ej5                  ej6                          ed      Z e         ej:                         Zej?                          yy)    )Deferredinline_callbacksreturn_value)GObject)Gio)GLib)PackageKitGlibN)DBusGMainLoopT)set_as_defaultzAptDaemon.NetMonitorc                       e Zd ZdZdej
                  j                  dej                  ffiZd Z	d Z
d Z eee
      Zed        Zy)NetworkMonitorBasezCheck the network state.network-state-changedNc                     t         j                  d       t        j                  j                  |        t        j
                  j                  | _        y )NzInitializing network monitor)logdebugr   __init__pkNetworkEnumONLINE_stateselfs    6/usr/lib/python3/dist-packages/aptdaemon/networking.pyr   zNetworkMonitorBase.__init__2   s2    		01  &nn++    c                     | j                   |k7  r0t        j                  d|       || _         | j                  d|       y y )NzNetwork state changed: %sr   )r   r   r   emit)r   enums     r   
_set_statezNetworkMonitorBase._set_state7   s8    ;;$II148DKII-t4 r   c                     | j                   S N)r   r   s    r   
_get_statezNetworkMonitorBase._get_state=   s    {{r   c                 .    t        | j                         yzUpdate the network state.N)r   r   r   s    r   get_network_statez$NetworkMonitorBase.get_network_stateB   s     	T[[!r   )__name__
__module____qualname____doc__r   SignalFlags	RUN_FIRSTTYPE_PYOBJECT__gsignals__r   r   r!   propertystater   r$    r   r   r   r   *   sb    "+g.A.A.K.K.2/6/D/D.F.H IL,
5 Z,E" "r   r   c                   2    e Zd ZdZd Zd Zd Zed        Zy)ProcNetworkMonitorzVUse the route information of the proc filesystem to detect
    the network state.
    c                    t         j                  d       t        j                  |        t        j
                  j                  | _        t        j                  j                  d      | _        t        j                  j                  | j                  t        j                  j                  d       | _        | j                  j!                  d| j"                         y )Nz'Initializing proc based network monitor/proc/net/routechanged)r   r   r   r   r   r   OFFLINEr   r   Filenew_for_path_filemonitorFileMonitorFlagsNONE_monitorconnect_on_route_file_changedr   s    r   r   zProcNetworkMonitor.__init__N   s    		;<##D)nn,,XX**+<=
((),)=)=)B)B)-/ 	i"99	;r   c                 $    | j                          y r    r$   )r   argss     r   r>   z)ProcNetworkMonitor._on_route_file_changedY   s     r   c                    t        d      5 }|j                         D ]H  }|j                  d      }|d   dk(  r|d   dk(  r&t        |      dk7  r5|d   dk(  r n/|d	   dk7  sH n$ t        j
                  j                  cd
d
d
       S d
d
d
       t        j
                  j                  S # 1 sw Y   t        j
                  j                  S xY w)z,Parse the route file - taken from PackageKitr3   	r   Ifacelo      00000000   N)open	readlinessplitlenr   r   r5   r   )r   
route_filelinerowss       r   _parse_route_filez$ProcNetworkMonitor._parse_route_file\   s    #$ 	.
",,. .zz$'7g%!W_Y"_!W
*!W
*!.$ ~~--'	. 	. 	.( ~~$$$)	.( ~~$$$s   AB-%B--Cc                 X    | j                         | _        t        | j                         yr#   )rQ   r.   r   r   s    r   r$   z$ProcNetworkMonitor.get_network_statet   s      ++-
TZZ r   N)	r%   r&   r'   r(   r   r>   rQ   r   r$   r/   r   r   r1   r1   H   s*    	;!%0 ! !r   r1   c                       e Zd ZdZdZedz   Zedz   ZdZdZdZ	dZ
d	Zd
 Zed        Zed        Zed        Zed        Zed        Zy)NetworkManagerMonitorz,Use NetworkManager to monitor network state.org.freedesktop.NetworkManagerz.Connection.Activez.Devicer   rG   rI         c                    t         j                  d       t        j                  |        t	        j
                         | _        | j                  j                  dd      | _        | j                  j                  d| j                  | j                         | j                  j                  | j                  d| j                         y )Nz#Initializing NetworkManager monitorrU   z/org/freedesktop/NetworkManagerPropertiesChanged)dbus_interface)signal_namerZ   )r   r   r   r   dbus	SystemBusbus
get_objectproxyconnect_to_signal_on_nm_properties_changedNM_DBUS_IFACEadd_signal_receiver _on_nm_active_conn_props_changedNM_ACTIVE_CONN_DBUS_IFACEr   s    r   r   zNetworkManagerMonitor.__init__   s    		78##D)>>#XX(()I)JL


$$%8%)%C%C484F4F 	% 	H 	$$11+99 	% 	;r   c                     t        j                  | d      }t               }|j                  |||j                  |j
                         |S )z8Small helper to get the property value of a dbus object.zorg.freedesktop.DBus.Properties)reply_handlererror_handler)r\   	Interfacer   Getcallbackerrback)r`   	interfacer-   propsdeferreds        r   get_dbus_propertyz'NetworkManagerMonitor.get_dbus_property   sJ     u&GH:		)X ( 1 1 ( 0 0 	 	2 r   c              #      K   d|v rM|d   s5t         j                  d       t        j                  j                  | _        y| j                          yyw)z.Callback if NetworkManager properties changed.ActiveConnectionsz#There aren't any active connectionsN)r   r   r   r   r5   r.   r$   r   ro   s     r   rb   z/NetworkManagerMonitor._on_nm_properties_changed   sK      %',-		?@^^33
,,.. (s   AAc              #   :   K   d|vry| j                          yw)z8Callback if properties of the active connection changed.DefaultNr@   rt   s     r   re   z6NetworkManagerMonitor._on_nm_active_conn_props_changed   s"      E!$$&&s   c              #   P  K   t         j                  j                  }	 | j                  | j                  | j
                  d      }D ]  }| j                  j                  | j
                  |      }	 | j                  || j                  d      }|sM| j                  || j                  d      }d}|D ]  }	 | j                  j                  | j
                  |      }	| j                  |	| j                  d      }

|k  rP|
}|
| j                   | j"                  fv rt         j                  j$                  }|
| j&                  k(  rt         j                  j(                  }|
| j*                  k(  rt         j                  j,                  }|
| j.                  k(  rt         j                  j                  }t         j                  j0                  }"  t        |       y# t        j                  $ r$ t        j                  d       t        |       Y w xY w# t        j                  $ r t        j                  d       Y  qw xY w# t        j                  $ r< t        j                  d       t        t         j                  j                         Y w xY ww)z-Query NetworkManager about the network state.rs   z#Failed to determinate network staterv   Devices
DeviceTypeN)r   r   r5   rq   r`   rc   r\   DBusExceptionr   warningr   r^   r_   rf   NM_DEVICE_DBUS_IFACEUNKNOWNNM_DEVICE_TYPE_GSMNM_DEVICE_TYPE_CDMAMOBILENM_DEVICE_TYPE_ETHERNETWIREDNM_DEVICE_TYPE_WIFIWIFINM_DEVICE_TYPE_UNKNOWNr   )r   r.   active_connsconnconn_obj
is_defaultdevspriority_device_typedevdev_objdev_types              r   _query_network_managerz,NetworkManagerMonitor._query_network_manager   sZ     &&	 !%!7!7

8<8J8J8K"M ML ! &	2Dxx**4+=+=tDH	#'#9#9d<<i$I I
!!33d<<iI I
 $&  29"hh11$2D2DcJG%)%;%;!:!:L&J  JH 33'/$ 7 7 $ 8 8 : :NN11E!=!==NN00E!9!99NN//E!<!<<NN22ENN11E32&	2N 	UW !! 	 KK=>	  %% AB )) 9KK EF !7!789s   J&)G+ ,J&4!H%J&H%5J&>AIC(J&+3H"J&!H""J&%(IJ&IJ&AJ#J&"J##J&c              #   d   K   | j                         | _        t        | j                         ywr#   )r   r.   r   r   s    r   r$   z'NetworkManagerMonitor.get_network_state   s'       6688
TZZ s   .0N)r%   r&   r'   r(   rc   rf   r}   r   r   r   r   r   r   staticmethodrq   r   rb   re   r   r$   r/   r   r   rT   rT   {   s    64M -0D D(94 ;   / / ' ' 2 2h ! !r   rT   c                     | r
t               S 	 t               S # t        j                  $ r Y nw xY wt        j
                  j                  d      r
t               S t               S )zReturn a network monitor.r3   )r1   rT   r\   r{   ospathexistsr   )fallbacks    r   get_network_monitorr      sW    !##$&& 	ww~~'(!##s   	 ..__main__c               #   T   K   t         j                         } t        d| z         y w)NzInitial network state: %s)r9   r$   print)r.   s    r   _call_monitorr     s%     //11*U24s   &()F) deferr   r   r   gi.repositoryr   r   r   r	   r   r\   dbus.mainloop.glibr
   loggingr   	getLoggerr   r   r1   rT   r   r%   r   StreamHandlerlog_handler
addHandlersetLevelDEBUGr9   MainLooplooprunr/   r   r   <module>r      s   6 ; : !   .  , T "  	 g./" "<0!+ 0!fu!. u!p
  z5 5 (''')KNN;LL!$'GO4==?DHHJ r   