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