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 <d...@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 <d...@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 > > > > > > > > > > > > > > > > > >
#!/usr/bin/env python # # vim: ft=python ts=4 sts=4 sw=4 et ai # -*- Mode: Python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Copyright (C) 2014 Red Hat, Inc. # import sys, socket, struct from gi.repository import GLib, NetworkManager, NMClient def notify_ip4_config(self, property): print "notify: %s ::::: state %d" % (property, self.get_state()) cfg = self.get_ip4_config() if cfg == None: return; for iaddr in cfg.get_addresses(): addr = iaddr.get_address() prefix = iaddr.get_prefix() gateway = iaddr.get_gateway() addr_struct = struct.pack("=I", addr) gateway_struct = struct.pack("=I", gateway) print(" %s/%d %s") % (socket.inet_ntop(socket.AF_INET, addr_struct), prefix, socket.inet_ntop(socket.AF_INET, gateway_struct)) if __name__ == "__main__": c = NMClient.Client.new() for d in c.get_devices(): print "Connecting to %s" % d.get_iface() d.connect('notify::ip4-config', notify_ip4_config) loop = GLib.MainLoop() loop.run()
_______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list