I was trying to keep update_proxy() together with dns & routes update
because the state changes are clearly visible in policy.c. .But the
later really uses more information from policy. Whereas update_proxy()
has just to do with states of Device / VPN. Will edit to update
PacRunnerManager directly from nm-device.c & nm-vpn-connection.c.

On 6/29/16, Dan Williams <[email protected]> wrote:
> On Fri, 2016-06-24 at 00:42 +0530, Atul Anand wrote:
>> src/policy.c fixed to update pacrunner with connection activation
>> and deactivation.Previous sent configs are destroyed before updating
>> PacRunner with new cofigs.
>> ---
>>  libnm-core/nm-vpn-dbus-interface.h |  3 ++
>>  src/nm-logging.c                   |  3 +-
>>  src/nm-logging.h                   |  1 +
>>  src/nm-policy.c                    | 75
>> +++++++++++++++++++++++++++++++++++++-
>>  src/nm-types.h                     |  2 +
>>  5 files changed, 82 insertions(+), 2 deletions(-)
>>
>> diff --git a/libnm-core/nm-vpn-dbus-interface.h b/libnm-core/nm-vpn-
>> dbus-interface.h
>> index 9226458..e557e81 100644
>> --- a/libnm-core/nm-vpn-dbus-interface.h
>> +++ b/libnm-core/nm-vpn-dbus-interface.h
>> @@ -183,6 +183,9 @@ typedef enum {
>>  /* string: VPN interface name (tun0, tap0, etc) */
>>  #define NM_VPN_PLUGIN_CONFIG_TUNDEV      "tundev"
>>
>> +/* string: Proxy PAC */
>> +#define NM_VPN_PLUGIN_CONFIG_PROXY_PAC   "pac"
>> +
>>  /* string: Login message */
>>  #define NM_VPN_PLUGIN_CONFIG_BANNER      "banner"
>>
>> diff --git a/src/nm-logging.c b/src/nm-logging.c
>> index 15e1492..0aa2b2b 100644
>> --- a/src/nm-logging.c
>> +++ b/src/nm-logging.c
>> @@ -129,7 +129,7 @@ static struct {
>>      char *logging_domains_to_string;
>>      const LogLevelDesc level_desc[_LOGL_N];
>>
>> -#define _DOMAIN_DESC_LEN 38
>> +#define _DOMAIN_DESC_LEN 39
>>      /* Would be nice to use C99 flexible array member here,
>>       * but that feature doesn't seem well supported. */
>>      const LogDesc domain_desc[_DOMAIN_DESC_LEN];
>> @@ -185,6 +185,7 @@ static struct {
>>              { LOGD_AUDIT,     "AUDIT" },
>>              { LOGD_SYSTEMD,   "SYSTEMD" },
>>              { LOGD_VPN_PLUGIN,"VPN_PLUGIN" },
>> +            { LOGD_PROXY,     "PROXY" },
>>              { 0, NULL }
>>              /* keep _DOMAIN_DESC_LEN in sync */
>>      },
>> diff --git a/src/nm-logging.h b/src/nm-logging.h
>> index 655f675..655175d 100644
>> --- a/src/nm-logging.h
>> +++ b/src/nm-logging.h
>> @@ -66,6 +66,7 @@ typedef enum  { /*< skip >*/
>>      LOGD_AUDIT      = (1LL << 34),
>>      LOGD_SYSTEMD    = (1LL << 35),
>>      LOGD_VPN_PLUGIN = (1LL << 36),
>> +    LOGD_PROXY      = (1LL << 37),
>>
>>      __LOGD_MAX,
>>      LOGD_ALL       = (((__LOGD_MAX - 1LL) << 1) - 1LL),
>> diff --git a/src/nm-policy.c b/src/nm-policy.c
>> index 0c63b1c..29ea05c 100644
>> --- a/src/nm-policy.c
>> +++ b/src/nm-policy.c
>> @@ -34,6 +34,7 @@
>>  #include "nm-setting-ip4-config.h"
>>  #include "nm-setting-connection.h"
>>  #include "nm-platform.h"
>> +#include "nm-pacrunner-manager.h"
>>  #include "nm-dns-manager.h"
>>  #include "nm-vpn-manager.h"
>>  #include "nm-auth-utils.h"
>> @@ -78,6 +79,7 @@ struct _NMPolicyPrivate {
>>      GResolver *resolver;
>>      GInetAddress *lookup_addr;
>>      GCancellable *lookup_cancellable;
>> +    NMPacRunnerManager *pacrunner_manager;
>>      NMDnsManager *dns_manager;
>>      gulong config_changed_id;
>>
>> @@ -414,6 +416,64 @@ update_default_ac (NMPolicy *self,
>>              set_active_func (best, TRUE);
>>  }
>>
>> +static void
>> +update_proxy (NMPolicy *self)
>> +{
>> +    NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
>> +    NMDevice *device = NULL;
>> +    const GSList *connections = NULL, *iter;
>> +
>> +    connections = nm_manager_get_active_connections (priv-
>> >manager);
>> +    if (!connections)
>> +            return;
>> +
>> +    for (iter = connections; iter; iter = g_slist_next (iter)) {
>> +            NMActiveConnection *active = iter->data;
>> +            NMProxyConfig *proxy_config = NULL;
>> +            NMIP4Config *ip4_config = NULL;
>> +            NMIP6Config *ip6_config = NULL;
>> +            const char *ip_iface = NULL;
>> +
>> +            if (NM_IS_VPN_CONNECTION (active)) {
>> +                    ip_iface = nm_vpn_connection_get_ip_iface
>> (NM_VPN_CONNECTION (active), TRUE);
>> +                    nm_pacrunner_manager_remove (priv-
>> >pacrunner_manager, ip_iface);
>> +
>> +                    proxy_config =
>> nm_vpn_connection_get_proxy_config (NM_VPN_CONNECTION (active));
>> +                    ip4_config =
>> nm_vpn_connection_get_ip4_config (NM_VPN_CONNECTION (active));
>> +                    ip6_config =
>> nm_vpn_connection_get_ip6_config (NM_VPN_CONNECTION (active));
>> +
>> +                    if (!nm_pacrunner_manager_send (priv-
>> >pacrunner_manager,
>> +                                                    ip_iface,
>> +                                                    proxy_config
>> ,
>> +                                                    ip4_config,
>> +                                                    ip6_config,
>> +                                                    NM_PROXY_IP_
>> CONFIG_TYPE_VPN))
>> +                            _LOGI (LOGD_PROXY, "Couldn't update
>> pacrunner for %s",ip_iface);
>> +
>> +                    continue;
>> +            }
>> +
>> +            device = nm_active_connection_get_device (active);
>> +            if (!device)
>> +                    continue;
>> +
>> +            ip_iface = nm_device_get_ip_iface (device);
>> +            nm_pacrunner_manager_remove (priv-
>> >pacrunner_manager, ip_iface);
>> +
>> +            proxy_config = nm_device_get_proxy_config (device);
>> +            ip4_config = nm_device_get_ip4_config (device);
>> +            ip6_config = nm_device_get_ip6_config (device);
>> +
>> +            if (!nm_pacrunner_manager_send (priv-
>> >pacrunner_manager,
>> +                                            ip_iface,
>> +                                            proxy_config,
>> +                                            ip4_config,
>> +                                            ip6_config,
>> +                                            NM_PROXY_IP_CONFIG_T
>> YPE_DEFAULT))
>> +                    _LOGI (LOGD_PROXY, "Couldn't update
>> pacrunner for %s",ip_iface);
>> +    }
>> +}
>> +
>
> I feel like the bits that update the proxy should really be done in
> NMDevice and NMVPNConnection instead of in the Policy.  It doesn't look
> like update_proxy() uses any special information the policy has, like
> whether the connection is the default one or not.
>
> Instead, could we just have each NMDevice grab a reference to the
> PACRunnerManager singleton and then push the proxy info (if any) at the
> right state changes from nm-device.c?
>
> Maybe I'm just missing something and its necessary to do it from the
> policy, but I can't quite see it.  Any thoughts here?
>
> Dan
>
>>  static NMIP4Config *
>>  get_best_ip4_config (NMPolicy *self,
>>                       gboolean ignore_never_default,
>> @@ -1204,6 +1264,8 @@ device_state_changed (NMDevice *device,
>>                      nm_connection_clear_secrets (NM_CONNECTION
>> (connection));
>>              }
>>
>> +            update_proxy (self);
>> +
>>              /* Add device's new IPv4 and IPv6 configs to DNS */
>>
>>              nm_dns_manager_begin_updates (priv->dns_manager,
>> __func__);
>> @@ -1247,8 +1309,10 @@ device_state_changed (NMDevice *device,
>>              if (reason == NM_DEVICE_STATE_REASON_CARRIER &&
>> old_state == NM_DEVICE_STATE_UNAVAILABLE)
>>                      reset_autoconnect_all (self, device);
>>
>> -            if (old_state > NM_DEVICE_STATE_DISCONNECTED)
>> +            if (old_state > NM_DEVICE_STATE_DISCONNECTED) {
>> +                    update_proxy (self);
>>                      update_routing_and_dns (self, FALSE);
>> +            }
>>
>>              /* Device is now available for auto-activation */
>>              schedule_activate_check (self, device);
>> @@ -1440,6 +1504,8 @@ vpn_connection_activated (NMPolicy *self,
>> NMVpnConnection *vpn)
>>      NMIP6Config *ip6_config;
>>      const char *ip_iface;
>>
>> +    update_proxy (self);
>> +
>>      nm_dns_manager_begin_updates (priv->dns_manager, __func__);
>>
>>      ip_iface = nm_vpn_connection_get_ip_iface (vpn, TRUE);
>> @@ -1466,6 +1532,8 @@ vpn_connection_deactivated (NMPolicy *self,
>> NMVpnConnection *vpn)
>>      NMIP4Config *ip4_config;
>>      NMIP6Config *ip6_config;
>>
>> +    update_proxy (self);
>> +
>>      nm_dns_manager_begin_updates (priv->dns_manager, __func__);
>>
>>      ip4_config = nm_vpn_connection_get_ip4_config (vpn);
>> @@ -1871,6 +1939,8 @@ constructed (GObject *object)
>>      priv->fw_started_id = g_signal_connect (priv-
>> >firewall_manager, NM_FIREWALL_MANAGER_STARTED,
>>                                              G_CALLBACK
>> (firewall_started), self);
>>
>> +    priv->pacrunner_manager = g_object_ref
>> (nm_pacrunner_manager_get ());
>> +
>>      priv->dns_manager = g_object_ref (nm_dns_manager_get ());
>>      nm_dns_manager_set_initial_hostname (priv->dns_manager,
>> priv->orig_hostname);
>>      priv->config_changed_id = g_signal_connect (priv-
>> >dns_manager, NM_DNS_MANAGER_CONFIG_CHANGED,
>> @@ -1933,6 +2003,9 @@ dispose (GObject *object)
>>              g_clear_object (&priv->firewall_manager);
>>      }
>>
>> +    if (priv->pacrunner_manager)
>> +            g_clear_object (&priv->pacrunner_manager);
>> +
>>      if (priv->dns_manager) {
>>              nm_clear_g_signal_handler (priv->dns_manager, &priv-
>> >config_changed_id);
>>              g_clear_object (&priv->dns_manager);
>> diff --git a/src/nm-types.h b/src/nm-types.h
>> index 1fbf043..4e80200 100644
>> --- a/src/nm-types.h
>> +++ b/src/nm-types.h
>> @@ -42,11 +42,13 @@ typedef struct _NMDefaultRouteManager
>> NMDefaultRouteManager;
>>  typedef struct _NMDevice             NMDevice;
>>  typedef struct _NMDhcp4Config        NMDhcp4Config;
>>  typedef struct _NMDhcp6Config        NMDhcp6Config;
>> +typedef struct _NMProxyConfig        NMProxyConfig;
>>  typedef struct _NMIP4Config          NMIP4Config;
>>  typedef struct _NMIP6Config          NMIP6Config;
>>  typedef struct _NMManager            NMManager;
>>  typedef struct _NMPolicy             NMPolicy;
>>  typedef struct _NMRfkillManager      NMRfkillManager;
>> +typedef struct _NMPacRunnerManager   NMPacRunnerManager;
>>  typedef struct _NMRouteManager       NMRouteManager;
>>  typedef struct _NMSessionMonitor     NMSessionMonitor;
>>  typedef struct _NMSleepMonitor       NMSleepMonitor;
>
_______________________________________________
networkmanager-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to