コンピューターをウェイクアップすると、インターネットは自動的に再接続しますが、VPNは再接続しません。
自動的に再接続することは可能ですか(KDEのネットワークマネージャーを使用するか、少なくともネットワークマネージャーがVPN経由で接続されているかどうかを認識できる方法で)?
私はUbuntuフォーラムでこの解決策を見つけました(たとえば、 ここ ):
昇格された特権でテキストエディタを起動します。たとえば、コマンドプロンプトで次のように入力します。
gksudo gedit
「通常の」アクセスレベルでは変更できないフォルダにファイルを保存するため、昇格された権限でエディタを実行する必要があります。
autovpn
というファイルを作成し、ディレクトリ/etc/NetworkManager/dispatcher.d
に保存します。このautovpn
ファイルに、次のコードを配置します。
#!/usr/bin/python
import sys
import os
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop
# The uuid of the VPN connection to activate
VPN_CONNECTION_UUID = "FILL IN YOUR OWN"
# The uuid of the connection that needs to be active to start the VPN connection
ACTIVE_CONNECTION_UUID = "FILL IN YOUR OWN"
# some service, path and interface constants
NM_DBUS_SERVICE = "org.freedesktop.NetworkManager"
NM_DBUS_PATH = "/org/freedesktop/NetworkManager"
NM_DBUS_INTERFACE = "org.freedesktop.NetworkManager"
NM_DBUS_IFACE_CONNECTION_ACTIVE = "org.freedesktop.NetworkManager.Connection.Active"
NM_DBUS_SERVICE_SYSTEM_SETTINGS = "org.freedesktop.NetworkManagerSystemSettings"
NM_DBUS_SERVICE_USER_SETTINGS = "org.freedesktop.NetworkManagerUserSettings"
NM_DBUS_IFACE_SETTINGS = "org.freedesktop.NetworkManagerSettings"
NM_DBUS_PATH_SETTINGS = "/org/freedesktop/NetworkManagerSettings"
NM_DBUS_IFACE_SETTINGS_CONNECTION = "org.freedesktop.NetworkManagerSettings.Connection"
DBusGMainLoop(set_as_default=True)
nm_dbus_settings_services = (NM_DBUS_SERVICE_SYSTEM_SETTINGS, NM_DBUS_SERVICE_USER_SETTINGS)
def get_connections(bus, service):
proxy = bus.get_object(service, NM_DBUS_PATH_SETTINGS)
iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS)
return iface.ListConnections()
def get_connection_by_uuid(bus, uuid):
for service in nm_dbus_settings_services:
for c in get_connections(bus, service):
proxy = bus.get_object(service, c)
iface = dbus.Interface(proxy, dbus_interface = NM_DBUS_IFACE_SETTINGS_CONNECTION)
settings = iface.GetSettings()
if settings['connection']['uuid'] == uuid:
return (c, service)
return None
def list_uuids(bus):
for service in nm_dbus_settings_services:
for c in get_connections(bus, service):
proxy = bus.get_object(service, c)
iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION)
settings = iface.GetSettings()
conn = settings['connection']
print " %s: %s - %s (%s)" % (service, conn['uuid'], conn['id'], conn['type'])
def get_active_connection_path(bus, uuid):
proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH)
iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties')
active_connections = iface.Get(NM_DBUS_INTERFACE, 'ActiveConnections')
connection_and_service = get_connection_by_uuid(bus, uuid)
if connection_and_service == None:
return None
for a in active_connections:
proxy = bus.get_object(NM_DBUS_SERVICE, a)
iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties')
path = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'Connection')
service = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'ServiceName')
if service != connection_and_service[1]:
continue
proxy = bus.get_object(connection_and_service[1], path)
iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION)
settings = iface.GetSettings()
if settings['connection']['uuid'] == uuid:
return a
return None
def activate_connection(bus, vpn_connection, active_connection):
def reply_handler(opath):
print "<<SUCCESS>>"
sys.exit(0)
def error_handler(*args):
print "<<FAILURE>>"
sys.exit(1)
proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH)
iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_INTERFACE)
iface.ActivateConnection(NM_DBUS_SERVICE_USER_SETTINGS,
vpn_connection[0],
dbus.ObjectPath("/"),
active_connection,
reply_handler=reply_handler,
error_handler=error_handler)
bus = dbus.SystemBus()
#print "connections:"
#list_uuids(bus)
if len(VPN_CONNECTION_UUID) < 1 or len(ACTIVE_CONNECTION_UUID) < 1:
print "you need to set the uuids"
sys.exit(0)
vpn_connection = get_connection_by_uuid(bus, VPN_CONNECTION_UUID)
if not vpn_connection:
print "Configured VPN connection is not known to NM, check VPN_CONNECTION_UUID."
sys.exit(1)
active_connection = get_connection_by_uuid(bus, ACTIVE_CONNECTION_UUID)
if not active_connection:
print "Configured active connection is not known to NM, check ACTIVE_CONNECTION_UUID."
sys.exit(1)
if get_active_connection_path(bus, VPN_CONNECTION_UUID) != None:
print "VPN connection already activated"
sys.exit(0)
active_connection_path = get_active_connection_path(bus, ACTIVE_CONNECTION_UUID)
if not active_connection_path:
print "The required connection isn't active at the moment"
sys.exit(0)
print "connecting...." # to:\n '%s'\nwith active connection:\n '%s'" % (vpn_connection, active_connection)
activate_connection(bus, vpn_connection, active_connection_path)
loop = gobject.MainLoop()
loop.run()
コマンドプロンプトに移動します。次のコマンドを実行します。
nmcli con status
指定されたUUID値をメモします。たとえば、それらをコピーしてテキストファイルに貼り付けます。
autovpn
スクリプトに戻る:使用するVPN接続と、VPNに接続する前にアクティブにする必要がある接続の両方のUUIDを入力します。
ほとんどのユーザーにとって、2番目はデフォルトのネットワーク接続であり、通常は有線イーサネット接続です。
UUID値はシステムに固有であることに注意してください。ただし、ログインごとに変更しないでください。変更しないと、このスクリプトは機能しません。参考までに、これが私が見るものです:
$ nmcli con status
NAME UUID DEVICES DEFAULT VPN
Wired connection 1 e9908d28-ffec-41cd-babb-c0cefb38ae6a eth0 yes no
VPN Connection 699f17f2-0ab0-4d1d-94d3-24136ef81603 -- no yes
autovpn
ファイルを保存します。
ログアウトして再度ログインするか、再起動します。 VPN接続は、通常のネットワーク接続がオンになるとすぐにアクティブになります。
次のステップ:VPNがまだ接続されているかどうかを自動的に検出し、接続されていない場合は再接続するスクリプトを実装します。
これがお役に立てば幸いです。