web-dev-qa-db-fra.com

comment utiliser gdbus pour définir une adresse IP

Je cherche des moyens de modifier les adresses IP (et les paramètres DHCP) à partir d'une application de poste de travail que j'écris. C'est pourquoi je dois/veux utiliser dbus à cette fin.

C'est compliqué! J'essaie donc d'apprendre en utilisant gdbus cli.

L’approche que j’ai choisie consiste à utiliser gdbus pour obtenir les paramètres de l’adaptateur Ethernet que je souhaite modifier. Puis modifiez ces données et renvoyez-les à DBus.

Je suis terriblement proche parce que l'adresse IP change presque. J'ai juste besoin de "donner un coup de pied" en ouvrant l'interface graphique de gnome et en cliquant sur la coche de l'adaptateur en question. Cela provoque les paramètres à prendre.

Je ne sais pas quelle commande dbus en cliquant sur cette coche appelle, mais je suis convaincu que c’est la dernière chose à connaître pour pouvoir utiliser gdbus cli pour modifier les adresses IP.

Voici le script que j'utilise pour définir l'adresse IP, je modifie les champs ipv4.addresses et ipv4.address-data pour qu'ils spécifient la même adresse.

#/bin/bash
gdbus call \
    --system \
    --dest org.freedesktop.NetworkManager \
    --object-path /org/freedesktop/NetworkManager/Settings/1 \
    --method org.freedesktop.NetworkManager.Settings.Connection.Update2 \
 "{\
  '802-3-ethernet':\
   {\
    'auto-negotiate': <false>,\
    'mac-address': <[byte 0x00, 0x0c, 0x29, 0x4e, 0x29, 0xe2]>,\
    'mac-address-blacklist': <@as []>,\
    's390-options': <@a{ss} {}>\
  },\
  'connection':\
   {\
    'id': <'Wired connection 1'>,\
    'uuid': <'d075ed7c-c8cc-3db7-b0fb-d0687331a7a0'>,\
    'type': <'802-3-ethernet'>,\
    'permissions': <@as []>,\
    'autoconnect-priority': <-999>,\
    'timestamp': <uint64 1539968649>\
   },\
  'ipv6':\
   {\
    'method': <'ignore'>,\
    'dns': <@aay []>,\
    'dns-search': <@as []>,\
    'addresses': <@a(ayuay) []>,\
    'routes': <@a(ayuayu) []>,\
    'ip6-privacy': <0>,\
    'address-data': <@aa{sv} []>,\
    'route-data': <@aa{sv} []>\
   },\
  'ipv4':\
   {
    'method': <'manual'>,\
    'dns': <[uint32 4261521600]>,\
    'dns-search': <@as []>,\
    'addresses': <[[uint32 3321997504, 24, 16885952]]>,\
    'gateway': <'192.168.1.1'>,
    'routes': <@aau []>,\
    'address-data': <[{'address': <'192.168.1.198'>, 'prefix': <uint32 24>}]>,\
    'route-data': <@aa{sv} []>\
   },\
  'proxy': {}\
 }"\
 1\
 {}

Et voici ce que je reçois quand je l'invoque ...

$ ./set.sh
(@a{sv} {},)

Si j'ouvre maintenant l'interface graphique de paramètres réseau, un cercle en rotation "en cours" apparaît et l'interface utilisateur affiche l'ancienne adresse. En cliquant sur la coche en regard du nom de la connexion, l'interface graphique s'actualise pour afficher l'adresse mise à jour que j'ai demandée.

Je reçois également une tonne de sorties de surveillance dans un terminal séparé que j'ai configuré pour signaler les modifications apportées à NetworkManager, par exemple:

$ gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager

Si vous pensez que la sortie de surveillance serait utile, je la collerai dans un commentaire.

Alors, quelle est la magie qui se produit sous cette coche (celle à droite de "Connexion filaire 1" dans l'image.

J'utilise Ubuntu 18.04 LTS.

Merci!

enter image description here

1
VorpalSword

J'ai trouvé la réponse.

En exécutant $ Sudo dbus-monitor --system (NB, il s'agit d'un utilitaire différent de gdbus-monitor), j'ai pu détecter le trafic sur le système dbus.

Donc, je ... 1) ai exécuté le moniteur dans un terminal 2) a exécuté mon script set.sh dans un autre 3) a été guidé dans tous les enregistrements dans le terminal 1 et a copié un horodatage à la fin. 4) cliqué sur la coche pour activer la connexion. 5) copié l'horodatage dans un fichier texte. 6) tout sélectionner dans le terminal de surveillance et coller dans le même fichier texte. 7) a recherché l'horodatage (parmi plus de 5000 lignes de journalisation, sans blague!) Pour trouver la commande dbus causée par le clic, puis l'a convertie dans le script activate.sh qui suit.

roulement de tambour....

 #!/bin/bash
 gdbus call \
    --system \
    --dest org.freedesktop.NetworkManager \
    --object-path /org/freedesktop/NetworkManager \
    --method org.freedesktop.NetworkManager.ActivateConnection \
 "/org/freedesktop/NetworkManager/Settings/1"\
 "/org/freedesktop/NetworkManager/Devices/2"\
 "/"

Les paramètres que je transmets /org/freedesktop/NetworkManager/Settings/1, et celui qui suit peuvent être obtenus à partir de dbus pour un périphérique spécifique, je les ai simplement codés en dur pour mon adaptateur Ethernet une fois que je les ai obtenus.

Je peux maintenant ouvrir l'interface graphique de configuration du réseau et exécuter set.sh, suivi de activate.sh et voir la mise à jour de l'interface graphique avec les nouveaux paramètres.

Je pense que dbus est cool, mais pourrait faire avec une documentation plus conviviale. L'ingénierie inverse s'est avérée beaucoup plus efficace que la lecture de la documentation pour parvenir à mes fins.

Merci d'avoir lu!

0
VorpalSword