auto reconectar VPN ao acordar

5

Quando eu acordo meu computador, a internet é reconectada automaticamente, mas a VPN não.
É possível reconectar-se automaticamente (usando o gerenciador de rede no KDE, ou pelo menos de uma forma que o gerente da rede esteja ciente se estiver conectado via VPN)?

    
por Asaf 27.09.2012 / 22:18

1 resposta

3

Encontrei esta solução em fóruns do Ubuntu (por exemplo, aqui ):

  1. Inicie um editor de texto com privilégios elevados. Por exemplo, insira no prompt de comando:

    gksudo gedit
    

    Você precisa que seu editor seja executado com privilégios elevados porque você salvará um arquivo em uma pasta na qual não poderá fazer alterações com um nível de acesso "normal".

  2. Crie um arquivo chamado autovpn e salve-o no diretório /etc/NetworkManager/dispatcher.d . Neste arquivo autovpn , coloque o seguinte código:

    #!/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()
    
  3. Vá para o prompt de comando. Execute o seguinte comando:

      nmcli con status
    

    Anote os valores de UUID fornecidos, por exemplo, copy & cole-os em um arquivo de texto.

  4. Voltar para o script autovpn : preencha os UUIDs para a conexão VPN que você deseja usar e a conexão que precisa estar ativa antes de se conectar à VPN.

    Para a maioria dos usuários, o segundo é sua conexão de rede padrão, geralmente uma conexão Ethernet com fio.

    Observe que os valores do UUID serão exclusivos do seu sistema. Eles não devem mudar de login para login, no entanto, ou este script não funcionaria. Para sua referência, aqui está o que vejo:

    $ 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
    
  5. Salve o arquivo autovpn .

  6. Efetue logout e login novamente ou reinicialize. Sua conexão VPN deve ser ativada assim que sua conexão de rede regular estiver ativada.

    Próximo passo: implemente o script para detectar automaticamente se a VPN ainda está conectada e reconecte-se, caso contrário.

Espero que isso seja de alguma ajuda para você.

    
por 27.09.2012 / 22:30