web-dev-qa-db-ja.com

gdbusを使用してIPアドレスを設定する方法

私が書いているワークステーションアプリからIPアドレス(およびDHCP設定)を変更する方法を研究しています。そのため、この目的でdbusを使用する必要があります。

それは複雑です!だから私はgdbus cliを使用して学習しようとしています。

私が取ったアプローチは、gdbusを使用して、変更するイーサネットアダプターの設定を取得することです。次に、そのデータを変更してDBusに送り返します。

IPアドレスがほとんど変更されるので、私は興味をそそります。 gnome GUIを開いて「キック」し、問題のアダプターのチェックマークをクリックするだけです。これにより、設定が適用されます。

そのチェックマークをクリックするdbusコマンドが何を呼び出すかはわかりませんが、gdbus cliを使用してIPアドレスを変更できるようにするために最後に知っておく必要があることは確信しています。

IPアドレスの設定に使用するスクリプトを次に示します。ipv4.addressesおよびipv4.address-dataフィールドを変更して、同じアドレスを指定するようにします。

#/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\
 {}

そして、私はそれを呼び出すときに私が得るものです...

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

ネットワーク設定GUIを開くと、「進行中」の回転する円が表示され、UIに古いアドレスが表示されます。接続名の横にあるチェックマークをクリックすると、GUIが更新され、要求した更新されたアドレスが表示されます。

NetworkManagerの変更をレポートするように設定した別のターミナルで、大量のモニタリング出力も取得します。

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

監視出力が役立つと思われる場合は、コメントに貼り付けます。

そのため、そのチェックマーク(画像の「有線接続1」の右側にあるもの)の下で起こる魔法は何ですか。

Ubuntu 18.04 LTSを実行しています。

ありがとう!

enter image description here

1
VorpalSword

答えを見つけました。

$ Sudo dbus-monitor --system(N.B.これはgdbus-monitorとは異なるユーティリティです)を実行することで、システムdbusのトラフィックを傍受することができました。

だから... 1)ある端末でモニターを実行した2)別の端末でset.shスクリプトを実行した3)端末1のすべてのログ記録を調べ、最後にタイムスタンプをコピーした。 4)チェックマークをクリックして、接続を有効にします。 5)タイムスタンプをテキストファイルにコピーしました。 6)モニタリングターミナルですべてを選択し、同じテキストファイルに貼り付けます。 7)タイムスタンプ(5000行以上のログの中で、冗談ではありません!)を検索して、クリックが引き起こしたdbusコマンドを見つけ、それを次のactivate.shスクリプトに変換しました。

ドラムロール....

 #!/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"\
 "/"

/org/freedesktop/NetworkManager/Settings/1とそれに続くパラメーターは、特定のデバイスのdbusから取得できます。取得したら、イーサネットアダプター用にハードコーディングするだけです。

これで、ネットワーク設定GUIを開いてset.shを実行し、続いてactivate.shを実行して、新しい設定でのGUIの更新を確認できます。

Dbusはクールだと思いますが、わかりやすいドキュメントを使用することもできます。リバースエンジニアリングは、目的を達成するためにドキュメントを読むよりもはるかに効果的であることが証明されました。

読んでくれてありがとう!

0
VorpalSword