Долго мучил гуголь, уже начал перелопачивать механизмы взаимодействия NM и DBus, но тут внезапно наткнулся на готовое решение от тов. coredump с форума французского сообщества Ubuntu (
http://forum.ubuntu-fr.org/viewtopic.php?pid=3170479#p3170479 ). Если вдруг кто из читающих эту тему зарегистрирован и там, передайте ему большое человеческое спасибо!
Напомню, что Network Manager оперирует в первую очередь не устройствами а сохраненными профилями соединений, каждый из которых может быть привязан к определенному устройству, или же наоборот применен к любому из подходящих устройств.
Профили системного уровня хранятся в /etc/NetworkManager/system-connections/
Профили пользовательского уровня хранятся разными способами в зависимости от использующегося фронтенда. Например гномовский апплет хранит их в gconf.
При общении с NM через DBus именование и адресация всех профилей, устройств и прочего совершенно иная, поэтому просто взять какую-нибудь команду за шаблон и подставить в нее имя соединения не получится.
Далее две выжимки из постинга от coredump. Первая будет интересна технически продвинутым, вторая - скрипт для простоейшего управления соединениями:
1. Полезные команды dbus-send для запроса параметров и адресов соединений, а также управления соединениями:
Запросить список профилей соединений:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManagerSystemSettings "/org/freedesktop/NetworkManagerSettings" \
org.freedesktop.NetworkManagerSettings.ListConnections
Чтобы запрашивать среди пользовательских соединений, нужно использовать --dest="org.freedesktop.NetworkManagerUserSettings"
Запросить свойства конкретного профиля:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManagerSystemSettings "/org/freedesktop/NetworkManagerSettings/0" \
org.freedesktop.NetworkManagerSettings.Connection.GetSettings
Чтобы запросить параметры пользовательского соединения, нужно использовать --dest="org.freedesktop.NetworkManagerUserSettings"
Запросить список активных соединений:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager "/org/freedesktop/NetworkManager" \
org.freedesktop.DBus.Properties.Get string:"org.freedesktop.NetworkManager" string:"ActiveConnections"
Запросить конкретное свойство конкретного активного соединения:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager "/org/freedesktop/NetworkManager/ActiveConnection/2" \
org.freedesktop.DBus.Properties.Get string:"org.freedesktop.NetworkManager.Connection.Active" string:"имя_свойства"
Среди полезных имен свойств: "ServiceName" или "Connection"
Активировать соединение на родительском девайсе:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager "/org/freedesktop/NetworkManager" \
org.freedesktop.NetworkManager.ActivateConnection string:"org.freedesktop.NetworkManagerSystemSettings" objpath:"/org/freedesktop/NetworkManagerSettings/0" objpath:"/org/freedesktop/NetworkManager/Devices/0" objpath:"/"
Активировать VPN соединение на родительском активном соединении:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager "/org/freedesktop/NetworkManager" \
org.freedesktop.NetworkManager.ActivateConnection string:"org.freedesktop.NetworkManagerUserSettings" objpath:"/org/freedesktop/NetworkManagerSettings/1" objpath:"/" objpath:"/org/freedesktop/NetworkManager/ActiveConnection/2"
Деактивировать соединение из активных соединений:
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager "/org/freedesktop/NetworkManager" \
org.freedesktop.NetworkManager.DeactivateConnection objpath:"/org/freedesktop/NetworkManager/ActiveConnection/2"
2. Скрипт для простого управления соединениями:#!/bin/bash
############
# SETTINGS #
############
get_connections_paths()
{
dbus-send --system --print-reply --dest="$1" "/org/freedesktop/NetworkManagerSettings" "org.freedesktop.NetworkManagerSettings.ListConnections" \
| grep "object path" | cut -d '"' -f2
}
get_connection_settings()
{
dbus-send --system --print-reply --dest="$1" "$2" org.freedesktop.NetworkManagerSettings.Connection.GetSettings
}
get_connection_string_setting()
{
echo "$1" | grep -A 1 \""$2"\" | grep variant | cut -d '"' -f2
}
get_connection_id()
{
get_connection_string_setting "$1" "id"
}
get_connection_type()
{
get_connection_string_setting "$1" "type"
}
get_device_type_by_connection_type()
{
echo "$1" | grep -q "ethernet" && echo 1 && return
echo "$1" | grep -q "wireless" && echo 2 && return
echo 0
}
find_connection_path()
{
for connection_path in `get_connections_paths "$1"`
do
connection_settings=`get_connection_settings "$1" "$connection_path"`
connection_settings_id=`get_connection_id "$connection_settings"`
[ "$connection_settings_id" = "$2" ] && echo "$1" "$connection_path"
done
}
find_connection_path_everywhere()
{
find_connection_path "org.freedesktop.NetworkManagerSystemSettings" "$1"
find_connection_path "org.freedesktop.NetworkManagerUserSettings" "$1"
}
print_connections_ids()
{
for connection_path in `get_connections_paths "$1"`
do
connection_settings=`get_connection_settings "$1" "$connection_path"`
connection_settings_id=`get_connection_id "$connection_settings"`
echo "$connection_settings_id"
done
}
print_connections_ids_everywhere()
{
print_connections_ids "org.freedesktop.NetworkManagerSystemSettings"
print_connections_ids "org.freedesktop.NetworkManagerUserSettings"
}
###########
# DEVICES #
###########
get_devices_paths()
{
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager" "org.freedesktop.NetworkManager.GetDevices" \
| grep "object path" | cut -d '"' -f2
}
get_device_property()
{
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" "$1" "org.freedesktop.DBus.Properties.Get" string:"org.freedesktop.NetworkManager.Device" string:"$2" \
| grep variant | awk '{print $3}'
}
get_device_type()
{
get_device_property "$1" "DeviceType"
}
get_device_path_by_device_type()
{
device_path_by_device_type="/"
for device_path in `get_devices_paths`
do
device_type=`get_device_type "$device_path"`
[ "$device_type" = "$1" ] && device_path_by_device_type="$device_path"
done
echo "$device_path_by_device_type"
}
#######################
# ACTIVES CONNECTIONS #
#######################
get_actives_connections_paths()
{
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager" "org.freedesktop.DBus.Properties.Get" string:"org.freedesktop.NetworkManager" string:"ActiveConnections" \
| grep "object path" | cut -d '"' -f2
}
get_last_active_connection_path()
{
get_actives_connections_paths | tail -n 1
}
get_parent_connection_path_by_device_type()
{
parent_connection_path="/"
[ "$1" = 0 ] && parent_connection_path=`get_last_active_connection_path`
echo "$parent_connection_path"
}
get_active_connection_property()
{
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" "$1" "org.freedesktop.DBus.Properties.Get" string:"org.freedesktop.NetworkManager.Connection.Active" string:"$2" \
| grep variant | awk -F '"' '{print $2}'
}
get_active_connection_service()
{
get_active_connection_property "$1" "ServiceName"
}
get_active_connection_path()
{
get_active_connection_property "$1" "Connection"
}
get_active_connection_path_by_connection_path()
{
for active_connection_path in `get_actives_connections_paths`
do
service=`get_active_connection_service $active_connection_path`
path=`get_active_connection_path $active_connection_path`
[ "$service" = "$1" ] && [ "$path" = "$2" ] && echo "$active_connection_path"
done
}
print_actives_connections_ids()
{
for active_connection_path in `get_actives_connections_paths`
do
service=`get_active_connection_service $active_connection_path`
path=`get_active_connection_path $active_connection_path`
connection_settings=`get_connection_settings "$service" "$path"`
connection_settings_id=`get_connection_id "$connection_settings"`
echo "$connection_settings_id"
done
}
##############
# START/STOP #
##############
start_connection()
{
my_connection_complete_path=`find_connection_path_everywhere "$1"`
my_connection_settings=`get_connection_settings $my_connection_complete_path`
my_connection_type=`get_connection_type "$my_connection_settings"`
my_connection_device_type=`get_device_type_by_connection_type "$my_connection_type"`
my_connection_service=`echo $my_connection_complete_path | awk '{print $1}'`
my_connection_path=`echo $my_connection_complete_path | awk '{print $2}'`
my_connection_device_path=`get_device_path_by_device_type "$my_connection_device_type"`
my_parent_connection_path=`get_parent_connection_path_by_device_type "$my_connection_device_type"`
echo "connection_service=$my_connection_service"
echo "connection_path=$my_connection_path"
echo "connection_device_path=$my_connection_device_path"
echo "parent_connection_path=$my_parent_connection_path"
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" /org/freedesktop/NetworkManager "org.freedesktop.NetworkManager.ActivateConnection" string:"$my_connection_service" objpath:"$my_connection_path" objpath:"$my_connection_device_path" objpath:"$my_parent_connection_path"
}
stop_connection()
{
my_connection_complete_path=`find_connection_path_everywhere "$1"`
my_active_connection_path=`get_active_connection_path_by_connection_path $my_connection_complete_path`
echo "active_connection_path=$my_active_connection_path"
dbus-send --system --print-reply --dest="org.freedesktop.NetworkManager" /org/freedesktop/NetworkManager "org.freedesktop.NetworkManager.DeactivateConnection" objpath:"$my_active_connection_path"
}
########
# MAIN #
########
invalid_arguments()
{
echo "Usage: `basename "$0"` connexion_name start|stop"
echo "---Available Connections:"
print_connections_ids_everywhere
echo "---Active Connections:"
print_actives_connections_ids
exit 0
}
[ "$#" != 2 ] && invalid_arguments
case "$2" in
"start")
start_connection "$1"
;;
"stop")
stop_connection "$1"
;;
*)
invalid_arguments
;;
esac
Сохраняем скрипт в текстовый файл, скажем, под именем nmcli
далее из папки, куда сохранили, делаем:
sudo cp nmcli /usr/local/bin/
sudo chmod ugo+x /usr/local/bin/nmcli
После чего собственно управление будет таким:
nmcli connection_name start|stop
То есть чтобы, например, активировать соединение c именем "MyNetwork" пишем:
nmcli MyNetwork start
Чтобы деактивировать - соответственно stop
Чтобы посмотреть список доступных соединений - просто вызываем скрипт без параметров.