2008-05-30 Dan Williams <dcbw@redhat.com>

* src/named-manager/nm-named-manager.c
	  src/named-manager/nm-named-manager.h
		- Remove stale/obsolete bits for controlling bind over DBus



git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3714 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams 2008-05-30 18:41:30 +00:00
parent bd583cc8fd
commit a53ebdbd37
3 changed files with 24 additions and 528 deletions

View file

@ -1,3 +1,9 @@
2008-05-30 Dan Williams <dcbw@redhat.com>
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- Remove stale/obsolete bits for controlling bind over DBus
2008-05-29 Dan Williams <dcbw@redhat.com>
* src/dnsmasq-manager/nm-dnsmasq-manager.c

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2004 Red Hat, Inc.
* Copyright (C) 2004 - 2008 Red Hat, Inc.
*
* Written by Colin Walters <walters@redhat.com>
*
@ -20,28 +20,20 @@
*/
#include "config.h"
#include "nm-named-manager.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>
#include <resolv.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <syslog.h>
#include <glib.h>
#include <dbus/dbus.h>
#include <glib/gi18n.h>
#include "nm-named-manager.h"
#include "nm-ip4-config.h"
#include "nm-utils.h"
#include "NetworkManagerSystem.h"
#include "nm-dbus-manager.h"
#ifdef HAVE_SELINUX
#include <selinux/selinux.h>
@ -51,29 +43,14 @@
#define RESOLV_CONF "/etc/resolv.conf"
#endif
#ifndef NAMED_DBUS_SERVICE
#define NAMED_DBUS_SERVICE "com.redhat.named"
#define NAMED_DBUS_INTERFACE "com.redhat.named"
#define NAMED_DBUS_PATH "/com/redhat/named"
#endif
G_DEFINE_TYPE(NMNamedManager, nm_named_manager, G_TYPE_OBJECT)
#define NM_NAMED_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_NAMED_MANAGER, \
NMNamedManagerPrivate))
static gboolean add_all_ip4_configs_to_named (NMNamedManager *mgr);
static gboolean rewrite_resolv_conf (NMNamedManager *mgr, GError **error);
static gboolean remove_ip4_config_from_named (NMNamedManager *mgr, NMIP4Config *config);
struct NMNamedManagerPrivate {
gboolean use_named;
NMDBusManager * dbus_mgr;
NMIP4Config * vpn_config;
NMIP4Config * device_config;
GSList * configs;
@ -108,86 +85,6 @@ nm_named_manager_error_quark (void)
return quark;
}
/*
* nm_named_manager_process_name_owner_changed
*
* Respond to "service created"/"service deleted" signals from dbus for named.
*
*/
static void
nm_named_manager_name_owner_changed (NMDBusManager *dbus_mgr,
const char *name,
const char *old,
const char *new,
gpointer user_data)
{
NMNamedManager *mgr = (NMNamedManager *) user_data;
gboolean handled = FALSE;
gboolean old_owner_good = (old && strlen (old));
gboolean new_owner_good = (new && strlen (new));
g_return_if_fail (mgr != NULL);
g_return_if_fail (name != NULL);
/* Ensure signal is for named's service */
if (strcmp (NAMED_DBUS_SERVICE, name) != 0)
return;
if (!old_owner_good && new_owner_good) {
mgr->priv->use_named = TRUE;
if (!add_all_ip4_configs_to_named (mgr))
nm_warning ("Could not set fowarders in named.");
handled = TRUE;
} else if (old_owner_good && !new_owner_good) {
mgr->priv->use_named = FALSE;
handled = TRUE;
}
if (handled) {
GError *error = NULL;
if (!rewrite_resolv_conf (mgr, &error)) {
nm_warning ("Could not write resolv.conf. Error: '%s'",
error ? error->message : "(none)");
g_error_free (error);
}
}
}
static void
nm_named_manager_dbus_connection_changed (NMDBusManager *dbus_mgr,
DBusConnection *dbus_connection,
gpointer user_data)
{
NMNamedManager *mgr = (NMNamedManager *) user_data;
gboolean handled = FALSE;
g_return_if_fail (mgr != NULL);
if (dbus_connection) {
if (nm_dbus_manager_name_has_owner (dbus_mgr, NAMED_DBUS_SERVICE)) {
mgr->priv->use_named = TRUE;
if (!add_all_ip4_configs_to_named (mgr))
nm_warning ("Could not set fowarders in named.");
handled = TRUE;
}
} else {
mgr->priv->use_named = FALSE;
handled = TRUE;
}
if (handled) {
GError *error = NULL;
if (!rewrite_resolv_conf (mgr, &error)) {
nm_warning ("Could not write resolv.conf. Error: '%s'",
error ? error->message : "(none)");
g_error_free (error);
}
}
}
static char *
compute_nameservers (NMIP4Config *config)
{
@ -262,6 +159,7 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
NMNamedManagerPrivate *priv;
const char *tmp_resolv_conf = RESOLV_CONF ".tmp";
char *searches = NULL, *domain = NULL;
char *nameservers = NULL;
guint32 num_domains, num_searches, i;
NMIP4Config *composite;
GSList *iter;
@ -368,35 +266,19 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
domain = g_string_free (str, FALSE);
}
if (mgr->priv->use_named == TRUE) {
/* Using caching-nameserver & local DNS */
if (fprintf (f,
"%s%s%s",
"; Use a local caching nameserver controlled by NetworkManager\n\n",
searches ? searches : "",
"\nnameserver 127.0.0.1\n") < 0) {
g_set_error (error,
NM_NAMED_MANAGER_ERROR,
NM_NAMED_MANAGER_ERROR_SYSTEM,
"Could not write " RESOLV_CONF ": %s\n",
g_strerror (errno));
}
} else {
/* Using glibc resolver */
char *nameservers = compute_nameservers (composite);
if (fprintf (f, "%s%s%s\n",
domain ? domain : "",
searches ? searches : "",
nameservers ? nameservers : "") < 0) {
g_set_error (error,
NM_NAMED_MANAGER_ERROR,
NM_NAMED_MANAGER_ERROR_SYSTEM,
"Could not write to " RESOLV_CONF ": %s\n",
g_strerror (errno));
}
g_free (nameservers);
/* Using glibc resolver */
nameservers = compute_nameservers (composite);
if (fprintf (f, "%s%s%s\n",
domain ? domain : "",
searches ? searches : "",
nameservers ? nameservers : "") < 0) {
g_set_error (error,
NM_NAMED_MANAGER_ERROR,
NM_NAMED_MANAGER_ERROR_SYSTEM,
"Could not write to " RESOLV_CONF ": %s\n",
g_strerror (errno));
}
g_free (nameservers);
if (fclose (f) < 0) {
if (*error == NULL) {
@ -426,342 +308,6 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
return *error ? FALSE : TRUE;
}
static const char *
get_domain_for_config (NMNamedManager *mgr, NMIP4Config *config, gboolean *dflt)
{
NMNamedManagerPrivate *priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
gboolean is_dflt = FALSE;
const char *domain;
g_return_val_if_fail (config != NULL, NULL);
/* Primary configs always use default domain */
if (config == priv->vpn_config)
is_dflt = TRUE;
/* Any config without a domain becomes default */
if (nm_ip4_config_get_num_domains (config) == 0)
is_dflt = TRUE;
if (is_dflt)
domain = "."; /* Default domain */
else
domain = nm_ip4_config_get_domain (config, 0);
if (dflt)
*dflt = is_dflt;
return domain;
}
static gboolean
add_ip4_config_to_named (NMNamedManager *mgr, NMIP4Config *config)
{
NMNamedManagerPrivate *priv;
const char *domain;
NMIP4Config *ns_config = config;
int i, num_nameservers;
gboolean success = FALSE;
DBusMessage * message;
DBusMessage * reply = NULL;
DBusError error;
gboolean dflt = FALSE;
DBusConnection *dbus_connection;
g_return_val_if_fail (mgr != NULL, FALSE);
g_return_val_if_fail (config != NULL, FALSE);
priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
dbus_error_init (&error);
dbus_connection = nm_dbus_manager_get_dbus_connection (priv->dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get dbus connection.");
goto out;
}
if (!(domain = get_domain_for_config (mgr, config, &dflt)))
goto out;
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
NAMED_DBUS_PATH,
NAMED_DBUS_INTERFACE,
"SetForwarders");
if (!message) {
nm_warning ("could not allocate dbus message.");
goto out;
}
dbus_message_append_args (message,
DBUS_TYPE_STRING, &domain,
DBUS_TYPE_INVALID);
/* If the ip4 config is a secondary config and has no nameservers, use the
* nameservers from the primary config.
*/
if ( (config == priv->vpn_config)
&& !nm_ip4_config_get_num_nameservers (config)) {
ns_config = priv->device_config;
}
g_return_val_if_fail (ns_config != NULL, FALSE);
num_nameservers = nm_ip4_config_get_num_nameservers (ns_config);
for (i = 0; i < num_nameservers; i++) {
dbus_uint32_t server = nm_ip4_config_get_nameserver (ns_config, i);
dbus_uint16_t port = htons (53); /* default DNS port */
char fwd_policy = dflt ? 1 : 2; /* 'first' : 'only' */
dbus_message_append_args (message,
DBUS_TYPE_UINT32, &server,
DBUS_TYPE_UINT16, &port,
DBUS_TYPE_BYTE, &fwd_policy,
DBUS_TYPE_INVALID);
}
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
message, -1, &error);
dbus_message_unref (message);
if (dbus_error_is_set (&error)) {
nm_warning ("Could not set forwarders for zone '%s'. Error: '%s'.",
domain,
error.message);
goto out;
}
if (!reply) {
nm_warning ("Could not set forwarders for zone '%s', did not receive "
"a reply from named.",
domain);
goto out;
}
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
const char *err_msg = NULL;
dbus_message_get_args (reply,
NULL,
DBUS_TYPE_STRING, &err_msg,
DBUS_TYPE_INVALID);
nm_warning ("Could not set forwarders for zone '%s'. "
"Named replied: '%s'",
domain,
err_msg);
}
success = TRUE;
out:
if (dbus_error_is_set (&error))
dbus_error_free (&error);
dbus_message_unref (reply);
return success;
}
static gboolean
add_all_ip4_configs_to_named (NMNamedManager *mgr)
{
NMNamedManagerPrivate *priv;
GSList *iter = NULL;
g_return_val_if_fail (mgr != NULL, FALSE);
priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
if (priv->vpn_config)
add_ip4_config_to_named (mgr, priv->vpn_config);
if (priv->device_config)
add_ip4_config_to_named (mgr, priv->device_config);
for (iter = priv->configs; iter; iter = g_slist_next (iter)) {
NMIP4Config *config = NM_IP4_CONFIG (iter->data);
if ((config == priv->vpn_config) || (config == priv->device_config))
continue;
add_ip4_config_to_named (mgr, config);
}
return TRUE;
}
static gboolean
remove_one_zone_from_named (NMNamedManager *mgr, const char *zone)
{
gboolean success = FALSE;
DBusMessage * message = NULL;
DBusMessage * reply = NULL;
DBusError error;
DBusConnection *dbus_connection;
g_return_val_if_fail (mgr != NULL, FALSE);
g_return_val_if_fail (zone != NULL, FALSE);
dbus_error_init (&error);
dbus_connection = nm_dbus_manager_get_dbus_connection (mgr->priv->dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get dbus connection.");
goto out;
}
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
NAMED_DBUS_PATH,
NAMED_DBUS_INTERFACE,
"SetForwarders");
if (!message) {
nm_warning ("could not allocate dbus message.");
goto out;
}
dbus_message_append_args (message,
DBUS_TYPE_STRING, &zone,
DBUS_TYPE_INVALID);
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
message,
-1,
&error);
dbus_message_unref (message);
if (dbus_error_is_set (&error)) {
nm_warning ("Could not remove forwarders for zone '%s'. "
"Error: '%s'.",
zone,
error.message);
goto out;
}
if (!reply) {
nm_warning ("Could not remove forwarders for zone '%s', did not "
" receive a reply from named.",
zone);
goto out;
}
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
const char *err_msg = NULL;
dbus_message_get_args (reply,
NULL,
DBUS_TYPE_STRING, &err_msg,
DBUS_TYPE_INVALID);
nm_warning ("Could not remove forwarders for zone '%s'. "
"Named replied: '%s'",
zone,
err_msg);
goto out;
}
success = TRUE;
out:
if (dbus_error_is_set (&error))
dbus_error_free (&error);
if (reply)
dbus_message_unref (reply);
return success;
}
static gboolean
remove_ip4_config_from_named (NMNamedManager *mgr, NMIP4Config *config)
{
const char *domain;
g_return_val_if_fail (mgr != NULL, FALSE);
g_return_val_if_fail (config != NULL, FALSE);
if (!(domain = get_domain_for_config (mgr, config, NULL)))
return FALSE;
return remove_one_zone_from_named (mgr, domain);
}
static void
remove_all_zones_from_named (NMNamedManager *mgr)
{
DBusMessage * message;
DBusMessage * reply = NULL;
DBusError error;
DBusMessageIter iter;
GSList * zones = NULL;
GSList * elt = NULL;
DBusConnection * dbus_connection;
g_return_if_fail (mgr != NULL);
if (!mgr->priv->use_named)
return;
dbus_connection = nm_dbus_manager_get_dbus_connection (mgr->priv->dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get dbus connection.");
goto out;
}
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
NAMED_DBUS_PATH,
NAMED_DBUS_INTERFACE,
"GetForwarders");
if (!message) {
nm_warning ("could not allocate dbus message.");
goto out;
}
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
message,
-1,
&error);
dbus_message_unref (message);
if (dbus_error_is_set (&error)) {
nm_warning ("Could not get forwarder list from named. Error: '%s'.",
error.message);
goto out;
}
if (!reply) {
nm_warning ("Could not get forarder list from named, did not receive "
" a reply from named.");
goto out;
}
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
const char *err_msg = NULL;
dbus_message_get_args (reply,
NULL,
DBUS_TYPE_STRING, &err_msg,
DBUS_TYPE_INVALID);
nm_warning ("Could not get forwarder list from named. "
"Named replied: '%s'",
err_msg);
goto out;
}
dbus_message_iter_init (reply, &iter);
do {
/* We depend on zones being the only strings in what
* named returns (obviously)
*/
if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING) {
char *zone = NULL;
dbus_message_iter_get_basic (&iter, &zone);
zones = g_slist_append (zones, g_strdup (zone));
}
} while (dbus_message_iter_next (&iter));
/* Remove all the zones from named */
for (elt = zones; elt; elt = g_slist_next (elt))
remove_one_zone_from_named (mgr, (const char *)(elt->data));
g_slist_foreach (zones, (GFunc) g_free, NULL);
g_slist_free (zones);
out:
if (dbus_error_is_set (&error))
dbus_error_free (&error);
dbus_message_unref (reply);
}
gboolean
nm_named_manager_add_ip4_config (NMNamedManager *mgr,
NMIP4Config *config,
@ -790,12 +336,6 @@ nm_named_manager_add_ip4_config (NMNamedManager *mgr,
if (!g_slist_find (priv->configs, config))
priv->configs = g_slist_append (priv->configs, g_object_ref (config));
/* First clear out and reload configs in named */
if (priv->use_named) {
remove_all_zones_from_named (mgr);
add_all_ip4_configs_to_named (mgr);
}
if (!rewrite_resolv_conf (mgr, &error)) {
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
g_error_free (error);
@ -819,10 +359,6 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
if (!g_slist_find (priv->configs, config))
return FALSE;
/* Deactivate the config */
if (priv->use_named)
remove_ip4_config_from_named (mgr, config);
priv->configs = g_slist_remove (priv->configs, config);
if (config == priv->vpn_config)
@ -833,15 +369,6 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
g_object_unref (config);
/* Clear out and reload configs since we may need a new
* default zone if the one we are removing was the old
* default zone.
*/
if (mgr->priv->use_named) {
remove_all_zones_from_named (mgr);
add_all_ip4_configs_to_named (mgr);
}
if (!rewrite_resolv_conf (mgr, &error)) {
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
if (error)
@ -855,49 +382,15 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
static void
nm_named_manager_init (NMNamedManager *mgr)
{
mgr->priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
mgr->priv->use_named = FALSE;
mgr->priv->dbus_mgr = nm_dbus_manager_get ();
g_signal_connect (G_OBJECT (mgr->priv->dbus_mgr),
"name-owner-changed",
G_CALLBACK (nm_named_manager_name_owner_changed),
mgr);
g_signal_connect (G_OBJECT (mgr->priv->dbus_mgr),
"dbus-connection-changed",
G_CALLBACK (nm_named_manager_dbus_connection_changed),
mgr);
}
static void
nm_named_manager_dispose (GObject *object)
{
NMNamedManager *mgr = NM_NAMED_MANAGER (object);
GSList *elt;
if (mgr->priv->disposed) {
G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object);
return;
}
mgr->priv->disposed = TRUE;
for (elt = mgr->priv->configs; elt; elt = g_slist_next (elt))
remove_ip4_config_from_named (mgr, (NMIP4Config *)(elt->data));
G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object);
}
static void
nm_named_manager_finalize (GObject *object)
{
NMNamedManager *mgr = NM_NAMED_MANAGER (object);
NMNamedManagerPrivate *priv = NM_NAMED_MANAGER_GET_PRIVATE (object);
g_return_if_fail (mgr->priv != NULL);
g_slist_foreach (mgr->priv->configs, (GFunc) g_object_unref, NULL);
g_slist_free (mgr->priv->configs);
g_object_unref (mgr->priv->dbus_mgr);
g_slist_foreach (priv->configs, (GFunc) g_object_unref, NULL);
g_slist_free (priv->configs);
G_OBJECT_CLASS (nm_named_manager_parent_class)->finalize (object);
}
@ -907,7 +400,6 @@ nm_named_manager_class_init (NMNamedManagerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = nm_named_manager_dispose;
object_class->finalize = nm_named_manager_finalize;
g_type_class_add_private (object_class, sizeof (NMNamedManagerPrivate));

View file

@ -57,8 +57,6 @@ typedef struct NMNamedManagerPrivate NMNamedManagerPrivate;
typedef struct {
GObject parent;
NMNamedManagerPrivate *priv;
} NMNamedManager;
typedef struct {