Skip to content

Commit

Permalink
Merge pull request #250 from pwieczorkiewicz/nanny_work2
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed May 16, 2014
2 parents 68db8c6 + b4dea77 commit 363afdd
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 33 deletions.
49 changes: 48 additions & 1 deletion client/ifdown.c
Expand Up @@ -35,9 +35,51 @@
#include <wicked/logging.h>
#include <wicked/fsm.h>

#include "client/ifconfig.h"

#include "wicked-client.h"
#include "ifdown.h"

static ni_bool_t
ni_ifdown_fire_nanny(ni_ifworker_t *w)
{
if (w) {
/* Default policy name is interface name.
* In case of any change other parameters
* should be available within ifworker
*/
const char *policy_name = w->name;

if (!ni_nanny_call_device_disable(policy_name)) {
ni_debug_application("Unable to disable policy named %s",
policy_name);
return FALSE;
}

if (!ni_nanny_call_del_policy(policy_name)) {
ni_debug_application("Unable to delete policy named %s",
policy_name);
return FALSE;
}
}

return TRUE;
}

static ni_bool_t
ni_ifdown_stop_policies(ni_ifworker_array_t *array)
{
unsigned int i;

for (i = 0; i < array->count; i++) {
ni_ifworker_t *w = array->data[i];

if (!ni_ifdown_fire_nanny(w))
return FALSE;
}

return TRUE;
}

int
ni_do_ifdown(int argc, char **argv)
Expand Down Expand Up @@ -168,8 +210,13 @@ ni_do_ifdown(int argc, char **argv)
}

/* Mark and start selected workers */
if (ifmarked.count)
if (ifmarked.count) {
/* Disable devices and delete all related policies from nanny */
ni_ifdown_stop_policies(&ifmarked);

/* Start workers to perform actual ifdown */
nmarked = ni_fsm_mark_matching_workers(fsm, &ifmarked, &ifmarker);
}

if (nmarked == 0) {
printf("ifdown: no matching interfaces\n");
Expand Down
28 changes: 20 additions & 8 deletions client/nanny.c
Expand Up @@ -104,6 +104,12 @@ do_nanny_addpolicy(int argc, char **argv)

for (i = 0; i < docs.count; i++) {
rv = ni_nanny_addpolicy(docs.data[i]);
if (rv < 1) {
xml_node_t *root = xml_document_root(docs.data[i]);

ni_error("Unable to add policies from %s file",
xml_node_get_location_filename(root));
}
}

xml_document_array_destroy(&docs);
Expand All @@ -123,8 +129,14 @@ do_nanny_delpolicy(int argc, char **argv)
return rv;
}

while (optind < argc)
(void) ni_nanny_call_del_policy(argv[optind++]);
while (optind < argc) {
const char *policy_name = argv[optind++];

if (!ni_nanny_call_del_policy(policy_name)) {
ni_error("Unable to delete policy named %s", policy_name);
rv = NI_WICKED_RC_ERROR;
}
}

return NI_WICKED_RC_SUCCESS;
}
Expand Down Expand Up @@ -268,7 +280,7 @@ ni_nanny_addpolicy_node(xml_node_t *pnode, const char *origin)
}

if (!ni_nanny_call_add_policy(name, pnode)) {
ni_error("Adding policy %s from %s file failed", name,
ni_debug_ifconfig("Adding policy %s from %s file failed", name,
ni_string_empty(origin) ? "unspecified" : origin);
return -1;
}
Expand Down Expand Up @@ -298,7 +310,7 @@ ni_nanny_addpolicy(xml_document_t *doc)
origin = xml_node_get_location_filename(root);

if (!ni_convert_cfg_into_policy_doc(doc)) {
ni_error("Unable to convert %s from %s to %s",
ni_debug_ifconfig("Unable to convert %s from %s to %s",
NI_CLIENT_IFCONFIG, origin, NI_NANNY_IFPOLICY);
return -1;
}
Expand Down Expand Up @@ -364,7 +376,7 @@ ni_nanny_call_add_policy(const char *name, xml_node_t *node)
policy_path = strdup(buffer);
} else
if (rv < 0) {
ni_error("Call to %s.createPolicy(%s) failed: %s",
ni_debug_application("Call to %s.createPolicy(%s) failed: %s",
ni_dbus_object_get_path(root_object), name,
ni_strerror(rv));
return FALSE;
Expand All @@ -376,7 +388,7 @@ ni_nanny_call_add_policy(const char *name, xml_node_t *node)
proxy = ni_dbus_object_create(root_object, relative_path, NULL, NULL);

if ((doc_string = xml_node_sprint(node)) == NULL) {
ni_error("%s: unable to format <policy> node", __func__);
ni_debug_application("%s: unable to format <policy> node", __func__);
return FALSE;
}

Expand All @@ -385,7 +397,7 @@ ni_nanny_call_add_policy(const char *name, xml_node_t *node)
NI_OBJECTMODEL_MANAGED_POLICY_INTERFACE, "update",
DBUS_TYPE_STRING, &doc_string,
DBUS_TYPE_INVALID, NULL)) < 0) {
ni_error("Call to ManagedPolicy.update() failed: %s", ni_strerror(rv));
ni_debug_application("Call to ManagedPolicy.update() failed: %s", ni_strerror(rv));
return FALSE;
}

Expand All @@ -407,7 +419,7 @@ ni_nanny_call_del_policy(const char *name)
DBUS_TYPE_OBJECT_PATH, &policy_path);

if (rv < 0) {
ni_error("Call to %s.deletePolicy(%s) failed: %s",
ni_debug_application("Call to %s.deletePolicy(%s) failed: %s",
ni_dbus_object_get_path(root_object), name, ni_strerror(rv));
return FALSE;
}
Expand Down
46 changes: 34 additions & 12 deletions client/policy.c
Expand Up @@ -26,6 +26,7 @@
#include <unistd.h>
#include <sys/types.h>

#include <wicked/fsm.h>
#include <wicked/netinfo.h>
#include <wicked/objectmodel.h>
#include <wicked/dbus-errors.h>
Expand All @@ -34,25 +35,46 @@

#include "client/ifconfig.h"

static inline ni_bool_t
ni_ifconfig_is_config(xml_node_t *ifnode)
static xml_node_t *
__ni_policy_add_to_match(xml_node_t *policy, const char *name, const char *value)
{
return ifnode && ni_string_eq(ifnode->name, NI_CLIENT_IFCONFIG);
if (policy && !ni_string_empty(name)) {
xml_node_t *match = xml_node_get_child(policy, NI_NANNY_IFPOLICY_MATCH);

if (match)
return xml_node_new_element(name, match, value);
}

return NULL;
}

static inline ni_bool_t
ni_ifconfig_is_policy(xml_node_t *pnode)
ni_bool_t
ni_ifpolicy_match_add_min_state(xml_node_t *policy, unsigned int state)
{
return pnode &&
(ni_string_eq(pnode->name, NI_NANNY_IFPOLICY) ||
ni_string_eq(pnode->name, NI_NANNY_IFTEMPLATE));
if (ni_ifworker_is_valid_state(state)) {
const char *sname = ni_ifworker_state_name(state);

if (__ni_policy_add_to_match(policy,
NI_NANNY_IFPOLICY_MATCH_MIN_STATE, sname)) {
return TRUE;
}
}

return FALSE;
}

static inline ni_bool_t
ni_ifpolicy_is_valid(xml_node_t *pnode)
ni_bool_t
ni_ifpolicy_match_add_link_type(xml_node_t *policy, unsigned int type)
{
return ni_ifconfig_is_policy(pnode) &&
xml_node_get_attr(pnode, NI_NANNY_IFPOLICY_NAME);
const char *linktype;

linktype = ni_linktype_type_to_name(type);
if (__ni_policy_add_to_match(policy,
NI_NANNY_IFPOLICY_MATCH_LINK_TYPE, linktype)) {
return TRUE;
}

return FALSE;
}

/*
Expand Down
9 changes: 8 additions & 1 deletion client/read-config.c
Expand Up @@ -40,7 +40,9 @@
#include <wicked/util.h>
#include <wicked/logging.h>
#include <wicked/netinfo.h>

#include "wicked-client.h"
#include "client/ifconfig.h"

#if defined(COMPAT_AUTO) || defined(COMPAT_SUSE)
extern ni_bool_t __ni_suse_get_ifconfig(const char *, const char *,
Expand Down Expand Up @@ -278,7 +280,7 @@ __ifconfig_read_get_ifname(xml_node_t *ifnode, unsigned int *ifindex)
/* Check for <name> node */
nnode = xml_node_get_child(ifnode, "name");
if (!nnode || ni_string_empty(nnode->cdata)) {
ni_debug_ifconfig("cannot get interface name -"
ni_debug_ifconfig("cannot get interface name - "
"config has no valid <name> node");
goto error;
}
Expand Down Expand Up @@ -347,6 +349,11 @@ ni_ifconfig_validate_adding_doc(xml_document_t *config_doc, ni_bool_t check_prio
for (src_child = src_root->children; src_child; src_child = src_child->next) {
int rv;

if (ni_ifconfig_is_policy(src_child)) {
ni_debug_ifconfig("ignoring validation on policy nodes");
continue;
}

ifname = __ifconfig_read_get_ifname(src_child, NULL);
if (ni_string_empty(ifname))
return FALSE;
Expand Down
12 changes: 12 additions & 0 deletions include/wicked/fsm.h
Expand Up @@ -290,6 +290,8 @@ extern ni_bool_t ni_ifworker_check_config(const ni_ifworker_t *, const xml_node
extern void ni_ifworker_reset(ni_ifworker_t *);
extern int ni_ifworker_bind_early(ni_ifworker_t *, ni_fsm_t *, ni_bool_t);
extern int ni_ifworker_start(ni_fsm_t *, ni_ifworker_t *, unsigned long);
extern void ni_ifworker_fail(ni_ifworker_t *, const char *, ...);
extern void ni_ifworker_success(ni_ifworker_t *);
extern void ni_ifworker_set_completion_callback(ni_ifworker_t *, void (*)(ni_ifworker_t *), void *);
extern ni_rfkill_type_t ni_ifworker_get_rfkill_type(const ni_ifworker_t *);
extern void ni_ifworker_free(ni_ifworker_t *);
Expand Down Expand Up @@ -374,4 +376,14 @@ ni_ifworker_active(const ni_ifworker_t *w)
return w->fsm.action_table != NULL;
}

/*
* Returns true if a state is one of the FSM defined states
*/
static inline ni_bool_t
ni_ifworker_is_valid_state(unsigned int state)
{
return state > NI_FSM_STATE_NONE &&
state < __NI_FSM_STATE_MAX;
}

#endif /* __CLIENT_FSM_H__ */
8 changes: 7 additions & 1 deletion include/wicked/xml.h
Expand Up @@ -160,10 +160,16 @@ extern void xml_node_array_free(xml_node_array_t *);
/*
* Static inline functions
*/
static inline ni_bool_t
xml_node_is_empty(xml_node_t *node)
{
return (!node || !node->children);
}

static inline ni_bool_t
xml_document_is_empty(xml_document_t *doc)
{
return (!doc || !doc->root || !doc->root->children);
return (!doc || xml_node_is_empty(doc->root));
}

#endif /* __WICKED_XML_H__ */
42 changes: 34 additions & 8 deletions src/client/ifconfig.h
Expand Up @@ -25,19 +25,24 @@
#ifndef __WICKED_CLIENT_IFCONFIG_H__
#define __WICKED_CLIENT_IFCONFIG_H__

#define NI_CLIENT_IFCONFIG "interface"
#define NI_CLIENT_IFCONFIG_MATCH_NAME "name"
#define NI_CLIENT_IFCONFIG "interface"
#define NI_CLIENT_IFCONFIG_MATCH_NAME "name"

#define NI_NANNY_IFPOLICY "policy"
#define NI_NANNY_IFTEMPLATE "template"
#define NI_NANNY_IFPOLICY "policy"
#define NI_NANNY_IFTEMPLATE "template"

#define NI_NANNY_IFPOLICY_MATCH "match"
#define NI_NANNY_IFPOLICY_MATCH_DEV "device"
#define NI_NANNY_IFPOLICY_MATCH_DEV "device"
#define NI_NANNY_IFPOLICY_MATCH_MIN_STATE "minimum-device-state"
#define NI_NANNY_IFPOLICY_MATCH_LINK_TYPE "link-type"
#define NI_NANNY_IFPOLICY_MERGE "merge"

#define NI_NANNY_IFPOLICY_NAME "name"
#define NI_NANNY_IFPOLICY_ORIGIN "origin"
#define NI_NANNY_IFPOLICY_UUID "uuid"
#define NI_NANNY_IFPOLICY_NAME "name"
#define NI_NANNY_IFPOLICY_ORIGIN "origin"
#define NI_NANNY_IFPOLICY_UUID "uuid"

extern ni_bool_t ni_ifpolicy_match_add_min_state(xml_node_t *, unsigned int);
extern ni_bool_t ni_ifpolicy_match_add_link_type(xml_node_t *, unsigned int);

extern xml_node_t * ni_convert_cfg_into_policy_node(xml_node_t *, const char *);
extern xml_document_t * ni_convert_cfg_into_policy_doc(xml_document_t *);
Expand All @@ -54,4 +59,25 @@ extern ni_bool_t ni_nanny_call_device_disable(const char *ifname);
extern ni_dbus_object_t * ni_nanny_call_get_device(const char *);
extern ni_bool_t ni_nanny_call_add_secret(const ni_security_id_t *, const char *, const char *);

static inline ni_bool_t
ni_ifconfig_is_config(xml_node_t *ifnode)
{
return ifnode && ni_string_eq(ifnode->name, NI_CLIENT_IFCONFIG);
}

static inline ni_bool_t
ni_ifconfig_is_policy(xml_node_t *pnode)
{
return pnode &&
(ni_string_eq(pnode->name, NI_NANNY_IFPOLICY) ||
ni_string_eq(pnode->name, NI_NANNY_IFTEMPLATE));
}

static inline ni_bool_t
ni_ifpolicy_is_valid(xml_node_t *pnode)
{
return ni_ifconfig_is_policy(pnode) &&
xml_node_get_attr(pnode, NI_NANNY_IFPOLICY_NAME);
}

#endif /* __WICKED_CLIENT_IFCONFIG_H__ */
4 changes: 2 additions & 2 deletions src/fsm.c
Expand Up @@ -321,7 +321,7 @@ __ni_ifworker_done(ni_ifworker_t *w)
w->done = 1;
}

static void
void
ni_ifworker_fail(ni_ifworker_t *w, const char *fmt, ...)
{
char errmsg[256];
Expand All @@ -341,7 +341,7 @@ ni_ifworker_fail(ni_ifworker_t *w, const char *fmt, ...)
__ni_ifworker_done(w);
}

static void
void
ni_ifworker_success(ni_ifworker_t *w)
{
if (!w->done)
Expand Down

0 comments on commit 363afdd

Please sign in to comment.