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

Reply via email to