Как контролировать возможность соединения NetworkManager?

Я хочу запустить определенное приложение, когда NetworkManager соединяется с определенным WiFi. Но от DBus, я не мог найти такой сигнал от NetworkManager кроме уведомления о libNotify. Существует ли более прямой путь?

3
задан 7 January 2016 в 07:35

3 ответа

NetworkManager включает nmcli программа, которая имеет monitor команда. Вот то, на что его вывод похож для меня, когда я разъединяю затем подключение к точке доступа Wi-Fi:

$ nmcli monitor
There's no primary connection
wlp4s0: unavailable
Networkmanager is now in the 'disconnected' state
wlp4s0: disconnected
wlp4s0: using connection 'CyberShadowPC'
wlp4s0: connecting (prepare)
Networkmanager is now in the 'connecting' state
wlp4s0: connecting (configuring)
wlp4s0: connecting (need authentication)
wlp4s0: connecting (prepare)
wlp4s0: connecting (configuring)
wlp4s0: connecting (getting IP configuration)
wlp4s0: connecting (checking IP connectivity)
wlp4s0: connecting (starting secondary connections)
wlp4s0: connected
Networkmanager is now in the 'connected' state
'CyberShadowPC' is now the primary connection

похоже, что должно быть легко проанализировать свой вывод и выполнить надлежащие меры по мере необходимости. Вот сценарий удара, который выполняет команду, когда соединение NetworkManager становится активным основным:

#!/bin/bash
set -euo pipefail

connection_name=CyberShadowPC
command=(notify-send "Connected to $connection_name!")

LC_ALL=C nmcli monitor | \
    while read -r line
    do
        if [[ "$line" == "'$connection_name' is now the primary connection" ]]
        then
            "${command[@]}"
        fi
    done
1
ответ дан 2 December 2019 в 01:21

В то время как, конечно, возможно использовать dbus, лично я пошел бы с простым циклом с условием продолжения удара + awk

while [ "$(iwconfig 2> /dev/null |  awk '/Access Point/ && /XX:YY:ZZ:11:22:33/ {print "true" }')" != "true" ]; do : ; sleep 0.25 ;done ; echo DONE

, Что происходит там? Цикл с условием продолжения продолжает бежать, тестируя вывод iwconfig отфильтрованный с awk. Насколько эти awk не находит MAC-адрес доступа, с которым Вы хотите соединиться, цикл продолжает работать. Как только awk видит, что Вы связались с тем конкретным AP, условие испытания [ "String1" != "String2" ] становится ложными, разрывами замкнутой цепи и переходит к эти echo DONE команда. Конечно, echo DONE то, что может быть заменено программой, которую Вы хотите запустить.

Эта команда может быть, работал вручную или поместил в сценарий и сценарий, добавленный к Списку приложений Запуска.

Простой, простой, и делает задание. Как я сказал в начале, это возможно использовать dbus, но не так просто.

-2
ответ дан 2 December 2019 в 01:21

Запустите

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

Затем измените соединение Wi-Fi. Вы получите сигнал это свойство изменилось. Он возвращает «PrimaryConnection», который активирован.

Затем вы можете запросить активированное соединение и посмотреть, соответствует ли оно интересующему вас соединению.

Например:

qdbus --system -- литерал org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/ActiveConnection/Что угодно org.freedesktop.DBus.Properties.GetAll org.freedesktop.NetworkManager.Connection.Active

qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/AccessPoint/Что угодно org.freedesktop.DBus.Properties.Get org.freedesktop.NetworkManager.AccessPoint.Ssid

(вероятно, проще запустить iwgetid -r после обнаружения изменения свойства)

0
ответ дан 19 December 2020 в 07:41

Другие вопросы по тегам:

Похожие вопросы: