Re: NMClient.IP4Config get_addresses() not always populated when signal 'notify::ip4-config' is fired



On Mon, 2015-03-23 at 22:39 +0100, Sylvain Garaud wrote:
Hello,

You are perfectly right. I used finally the ip4config and not the dhcp4
config to get the ip. Looking at the dbus-monitor logs I thought I could
save the ip decoding step by using the dhcp4 config. But it is not enough
generic.

Just to rule out some other stuff, can you try the attached Python
program?  Just run it (python notify-ips.py) and then reproduce the
issue with ethernet.  Do you get output like:

notify: <GParamObject 'ip4-config'> ::::: state 80
192.168.1.197/24  192.168.1.1

or do you get something else?

Thanks!
Dan

Here is the log where I simply go from wired ethernet off to on. I think I
get an ip4config signal from the line 204 in the log but it does not
include the addresses. The "real" one is at line 403. Not so sure what is
the expected behavior. I have the following piece of code at line 166 which
seems to work ok for that case.
https://github.com/sgaraud/gnome-extension-show-ip/blob/master/extension.js#L166
at line 173, this is for the case when I sometimes get double notifications
if I put up the ethernet com then down just before it get the dhcp4 config
and up again. At that time it seems I get some old signals.

Regards,

Sylvain



On Mon, Mar 23, 2015 at 5:58 PM, Dan Williams <dcbw redhat com> wrote:

On Fri, 2015-03-20 at 01:31 +0100, Sylvain Garaud wrote:
Hello Dan,

Thank you for the answer.
I am using NM lib version 0.9.10.0
I use the dbus-monitor command you provided.
It helped me greatly to understand my problem.

In most cases the ip info I am interested in was defined when the
IP4Config
propertiesChanges signal was received. But it was not always the case
depending of the network interface type and disconnection time. My
routine
using the  gi.NMClient was also missing to capture some signals that I
saw
with the dbus-monitor as sometimes they were arriving in a burst.

Eventually I implemented the following solution that seems to be working
properly.

1. I register a callback on the device "state-changed" signal
2. Within the callback, I try immediately to get the ip address inside
the
dhcp4 config.
3. If I get it I am done, otherwise it is undefined and I simply
register a
callback on the dhcp4 options signal that hopefully will arrive later.

I tested it with several configuration and it seems to work correctly.

Getting the IP address through the DHCP4 config won't give you user
overrides, secondary IP addresses, or static IP configurations though.
This still sounds like a bug in NM or libnm-glib, and if you still have
the logs from dbus-monitor I'd like to take a look.

Thanks!
Dan

Thank you so much,

Sylvain


On Wed, Mar 18, 2015 at 3:44 PM, Dan Williams <dcbw redhat com> wrote:

On Sun, 2015-03-15 at 12:46 +0100, Sylvain Garaud wrote:
Hello,

I am writing a small javascript for gnome to grab the ip addresses
of my
network interfaces using imports.gi.NMClient;
Basically I get the devices and connect each device to the
notify::ip4-config signal to be able to update the ip address value
when
it
changes

Which version of NM are you using?

this.client = NMC.Client.new();
this.devices = this.client.get_devices();
for each (let device in this.devices) {

 device.connect('notify::ip4-config',Lang.bind(this,this._update));
}

It works fine for the wifi connection but there is a problem with the
ethernet connection.
After turning my ethernet connection up,  the signal
'notify::ip4-config'
is fired, the device state is ACTIVATED, so I try to get the ip4
config.
with ipcfg = device.get_ip4_config();
I get a not null ipcfg object, unfortunately ipcfg.get_addresses()
is not
defined yet.

So that we can narrow the issue down, could you run:

dbus-monitor --system
"type='signal',sender='org.freedesktop.NetworkManager'"

and reproduce the problem?  This will let us know the sequence of D-BUs
events that come directly from NetworkManager, so that we can see the
raw data that libnm/libnm-glib is getting.

Dan


I see in my journalctl log few seconds later, some dhcp network
manager
message.

 _update: function(device) {
      let ipcfg = device.get_ip4_config();
      if (ipcfg != null) {
         for each(let addr in ipcfg.get_addresses()){
            let num = addr.get_address();
         }
      }
   },

How to be sure ipcfg.get_addresses() will return something ?
Could someone tell me which signal to use for being sure the ip
address
is
set when calling ipcfg.get_addresses()? I tried using the
'notify::dhcp4-config' signal instead 'notify::ip4-config' without
much
success.

Thank you very much for your help,

Sylvain
_______________________________________________
networkmanager-list mailing list
networkmanager-list gnome org
https://mail.gnome.org/mailman/listinfo/networkmanager-list







Attachment: notify-ips.py
Description: Text Data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]