U
    ̋_&                     @   s  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 dlZd dlZed
ZG dd dejZG dd deZG dd deZdddZedkr
edd Ze Zee eej edZe  e Ze  dS )    )Deferredinline_callbacksreturn_value)GObject)Gio)GLib)PackageKitGlibN)DBusGMainLoopT)Zset_as_defaultzAptDaemon.NetMonitorc                   @   sT   e Zd ZdZdejjdejffiZdd Z	dd Z
dd	 Zeee
Zed
d ZdS )NetworkMonitorBasezCheck the network state.network-state-changedNc                 C   s$   t d tj|  tjj| _d S )NzInitializing network monitor)logdebugr   __init__pkNetworkEnumONLINE_stateself r   6/usr/lib/python3/dist-packages/aptdaemon/networking.pyr   2   s    
zNetworkMonitorBase.__init__c                 C   s,   | j |kr(td| || _ | d| d S )NzNetwork state changed: %sr   )r   r   r   emit)r   enumr   r   r   
_set_state7   s    
zNetworkMonitorBase._set_statec                 C   s   | j S N)r   r   r   r   r   
_get_state=   s    zNetworkMonitorBase._get_statec                 C   s   t | j dS zUpdate the network state.N)r   r   r   r   r   r   get_network_stateB   s    z$NetworkMonitorBase.get_network_state)__name__
__module____qualname____doc__r   ZSignalFlagsZ	RUN_FIRSTZTYPE_PYOBJECTZ__gsignals__r   r   r   propertystater   r   r   r   r   r   r
   *   s   
r
   c                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )ProcNetworkMonitorzVUse the route information of the proc filesystem to detect
    the network state.
    c                 C   sX   t d t|  tjj| _tj	
d| _tj	| jtjjd | _| jd| j d S )Nz'Initializing proc based network monitor/proc/net/routeZchanged)r   r   r
   r   r   r   OFFLINEr   r   ZFileZnew_for_pathZ_filemonitorZFileMonitorFlagsZNONEZ_monitorZconnect_on_route_file_changedr   r   r   r   r   N   s    



zProcNetworkMonitor.__init__c                 G   s   |    d S r   r   )r   argsr   r   r   r(   Y   s    z)ProcNetworkMonitor._on_route_file_changedc              
   C   s   t d}| D ]`}|d}|d dkr0qq|d dkr@qqt|dkrPqq|d dkrb qq|d	 dkr qqtjjW  5 Q R  S W 5 Q R X tjjS )
z,Parse the route file - taken from PackageKitr%   	r   ZIfacelo      Z00000000   )open	readlinessplitlenr   r   r&   r   )r   Z
route_filelineZrowsr   r   r   _parse_route_file\   s    

z$ProcNetworkMonitor._parse_route_filec                 C   s   |   | _t| j dS r   )r5   r#   r   r   r   r   r   r   t   s    
z$ProcNetworkMonitor.get_network_stateN)	r   r   r    r!   r   r(   r5   r   r   r   r   r   r   r$   H   s   r$   c                   @   s|   e Zd ZdZdZed Zed ZdZdZdZ	dZ
d	Zd
d Zedd Zedd Zedd Zedd Zedd ZdS )NetworkManagerMonitorz,Use NetworkManager to monitor network state.org.freedesktop.NetworkManagerz.Connection.Activez.Devicer   r.   r/         c                 C   s^   t d t|  t | _| jdd| _| jj	d| j
| jd | jj| jd| jd d S )Nz#Initializing NetworkManager monitorr7   z/org/freedesktop/NetworkManagerZPropertiesChanged)dbus_interface)Zsignal_namer:   )r   r   r
   r   dbusZ	SystemBusbus
get_objectproxyZconnect_to_signal_on_nm_properties_changedNM_DBUS_IFACEZadd_signal_receiver _on_nm_active_conn_props_changedNM_ACTIVE_CONN_DBUS_IFACEr   r   r   r   r      s    


zNetworkManagerMonitor.__init__c                 C   s,   t | d}t }|j|||j|jd |S )z8Small helper to get the property value of a dbus object.zorg.freedesktop.DBus.Properties)Zreply_handlerZerror_handler)r;   Z	Interfacer   ZGetcallbackZerrback)r>   Z	interfacer"   propsZdeferredr   r   r   get_dbus_property   s    z'NetworkManagerMonitor.get_dbus_propertyc                 c   s4   d|kr0|d s&t d tjj| _n
|  V  dS )z.Callback if NetworkManager properties changed.ActiveConnectionsz#There aren't any active connectionsN)r   r   r   r   r&   r#   r   r   rD   r   r   r   r?      s
    
z/NetworkManagerMonitor._on_nm_properties_changedc                 c   s   d|krdS |   V  dS )z8Callback if properties of the active connection changed.DefaultNr)   rG   r   r   r   rA      s    z6NetworkManagerMonitor._on_nm_active_conn_props_changedc              
   c   s  t jj}z| | j| jdV }W n( tjk
rH   t	d t
| Y nX |D ]H}| j| j|}z0| || jdV }|sW qN| || jdV }W n( tjk
r   t	d Y  qY nX d}|D ]}z&| j| j|}	| |	| jdV }
W n. tjk
r   t	d t
t jj Y nX |
|kr,q|
}|
| j| jfkrLt jj}q|
| jkrbt jj}q|
| jkrxt jj}q|
| jkrt jj}qt jj}qqNt
| dS )z-Query NetworkManager about the network state.rF   z#Failed to determinate network staterH   ZDevicesZ
DeviceTypeN)r   r   r&   rE   r>   r@   r;   DBusExceptionr   Zwarningr   r<   r=   rB   NM_DEVICE_DBUS_IFACEZUNKNOWNNM_DEVICE_TYPE_GSMNM_DEVICE_TYPE_CDMAZMOBILENM_DEVICE_TYPE_ETHERNETZWIREDNM_DEVICE_TYPE_WIFIZWIFINM_DEVICE_TYPE_UNKNOWNr   )r   r#   Zactive_connsZconnZconn_objZ
is_defaultZdevsZpriority_device_typeZdevZdev_objZdev_typer   r   r   _query_network_manager   sl    


    

  






z,NetworkManagerMonitor._query_network_managerc                 c   s   |   V | _t| j dS r   )rQ   r#   r   r   r   r   r   r      s    z'NetworkManagerMonitor.get_network_stateN)r   r   r    r!   r@   rB   rK   rP   rN   rO   rL   rM   r   staticmethodrE   r   r?   rA   rQ   r   r   r   r   r   r6   {   s(   
	
	

4r6   Fc                 C   sB   | r
t  S zt W S  tjk
r(   Y nX tjdr<t  S t S )zReturn a network monitor.r%   )r$   r6   r;   rJ   ospathexistsr
   )Zfallbackr   r   r   get_network_monitor   s    rV   __main__c                  c   s   t  V } td|   d S )NzInitial network state: %s)r'   r   print)r#   r   r   r   _call_monitor  s    
rY   )F) Zdeferr   r   r   Zgi.repositoryr   r   r   r   r   r;   Zdbus.mainloop.glibr	   ZloggingrS   Z	getLoggerr   r
   r$   r6   rV   r   rY   ZStreamHandlerZlog_handlerZ
addHandlerZsetLevelDEBUGr'   ZMainLoopZlooprunr   r   r   r   <module>   s0   

3x



