Skip to content

Commit

Permalink
Merge branch 'master' into testing
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Aug 20, 2015
2 parents 4a7882b + 3140c5f commit 90b521a
Show file tree
Hide file tree
Showing 5 changed files with 228 additions and 53 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
*.so.*
*.m4
*.diff
*.orig
*.patch
*.rej
.*
compile
core
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.6.20
0.6.21
259 changes: 217 additions & 42 deletions src/teamd.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,15 @@
#include "dbus-objects/model.h"
#include "util_priv.h"
#include "process.h"
#include "buffer.h"
#include "teamd.h"
#include "json.h"

#define NI_TEAMD_VIA_DBUS 0

#define NI_TEAMD_CONFIG_DIR "/run/teamd"
#define NI_TEAMD_CONFIG_DIR_MODE 0700

#define NI_TEAMD_CONFIG_FMT NI_TEAMD_CONFIG_DIR"/%s.conf"

#define NI_TEAMD_BUS_NAME "org.libteam.teamd"
Expand All @@ -61,6 +65,7 @@
#define NI_TEAMD_CALL_PORT_CONFIG_UPDATE "PortConfigUpdate"


#if NI_TEAMD_VIA_DBUS
struct ni_teamd_client {
ni_dbus_client_t * dbus;

Expand Down Expand Up @@ -123,8 +128,6 @@ ni_teamd_client_free(ni_teamd_client_t *tdc)
tdc->dbus = NULL;
}

/* while (tdc->iflist) */

if (tdc->proxy) {
ni_dbus_object_free(tdc->proxy);
tdc->proxy = NULL;
Expand All @@ -134,14 +137,6 @@ ni_teamd_client_free(ni_teamd_client_t *tdc)
}
}

#if 0
ni_dbus_client_t *
ni_teamd_client_dbus(ni_teamd_client_t *tdc)
{
return tdc->dbus;
}
#endif

static void
ni_teamd_dbus_signal(ni_dbus_connection_t *connection, ni_dbus_message_t *msg, void *user_data)
{
Expand All @@ -154,76 +149,70 @@ ni_teamd_dbus_signal(ni_dbus_connection_t *connection, ni_dbus_message_t *msg, v
/*
* teamd instance dbus access methods
*/
const char *
ni_teamd_ctl_config_dump(ni_teamd_client_t *tdc, ni_bool_t actual)
int
ni_teamd_ctl_config_dump(ni_teamd_client_t *tdc, ni_bool_t actual, char **result)
{
const char *method;
char *dump;
int rv;

if (!tdc)
return NULL;
if (!tdc || !result)
return -NI_ERROR_INVALID_ARGS;

method = actual ? NI_TEAMD_CALL_CONFIG_DUMP_ACTUAL :
NI_TEAMD_CALL_CONFIG_DUMP;
rv = ni_dbus_object_call_simple(tdc->proxy,
NI_TEAMD_INTERFACE, method,
0, NULL,
DBUS_TYPE_STRING, &dump);
NI_TEAMD_INTERFACE, method,
0, NULL,
DBUS_TYPE_STRING, result);

if (rv < 0) {
ni_debug_application("Call to %s.%s() failed: %s",
ni_dbus_object_get_path(tdc->proxy), method, ni_strerror(rv));
return NULL;
}

return dump;
return rv;
}

const char *
ni_teamd_ctl_state_dump(ni_teamd_client_t *tdc)
int
ni_teamd_ctl_state_dump(ni_teamd_client_t *tdc, char **result)
{
char *dump;
int rv;

if (!tdc)
return NULL;
if (!tdc || !result)
return -NI_ERROR_INVALID_ARGS;

rv = ni_dbus_object_call_simple(tdc->proxy,
NI_TEAMD_INTERFACE, NI_TEAMD_CALL_STATE_DUMP,
0, NULL,
DBUS_TYPE_STRING, &dump);
NI_TEAMD_INTERFACE, NI_TEAMD_CALL_STATE_DUMP,
0, NULL,
DBUS_TYPE_STRING, result);

if (rv < 0) {
ni_debug_application("Call to %s."NI_TEAMD_CALL_STATE_DUMP"() failed: %s",
ni_dbus_object_get_path(tdc->proxy), ni_strerror(rv));
return NULL;
}

return dump;
return rv;
}

const char *
ni_teamd_ctl_state_get_item(ni_teamd_client_t *tdc, const char *item_name)
int
ni_teamd_ctl_state_get_item(ni_teamd_client_t *tdc, const char *item_name, char **result)
{
char *state_item;
int rv;

if (!tdc || ni_string_empty(item_name))
return NULL;
if (!tdc || ni_string_empty(item_name) || !result)
return -NI_ERROR_INVALID_ARGS;

rv = ni_dbus_object_call_simple(tdc->proxy,
NI_TEAMD_INTERFACE, NI_TEAMD_CALL_STATE_ITEM_GET,
DBUS_TYPE_STRING, &item_name,
DBUS_TYPE_STRING, &state_item);
NI_TEAMD_INTERFACE, NI_TEAMD_CALL_STATE_ITEM_GET,
DBUS_TYPE_STRING, &item_name,
DBUS_TYPE_STRING, result);

if (rv < 0) {
ni_debug_application("Call to %s."NI_TEAMD_CALL_STATE_ITEM_GET"(%s) failed: %s",
ni_dbus_object_get_path(tdc->proxy), item_name, ni_strerror(rv));
return NULL;
}

return state_item;
return rv;
}

int
Expand Down Expand Up @@ -311,6 +300,185 @@ ni_teamd_ctl_port_config_update(ni_teamd_client_t *tdc, const char *port_name, c
return rv;
}

#else /* !NI_TEAMD_VIA_DBUS */

struct ni_teamd_client {
char * ifname;
ni_shellcmd_t * cmd;
};

static const char *
ni_teamdctl_tool_path()
{
static const char *paths[] = {
"/usr/sbin/teamdctl",
NULL
};
return ni_find_executable(paths);
}

ni_teamd_client_t *
ni_teamd_client_open(const char *ifname)
{
ni_teamd_client_t *tdc;
const char *tool;

if (ni_string_empty(ifname))
return NULL;

if (!(tool = ni_teamdctl_tool_path()))
return NULL;

tdc = xcalloc(1, sizeof(*tdc));
ni_string_dup(&tdc->ifname, ifname);

if (!(tdc->cmd = ni_shellcmd_new(NULL)))
goto failure;

if (!ni_shellcmd_add_arg(tdc->cmd, tool))
goto failure;

if (!ni_shellcmd_add_arg(tdc->cmd, "--force-usock"))
goto failure;

if (!ni_shellcmd_add_arg(tdc->cmd, "--oneline"))
goto failure;

if (!ni_shellcmd_add_arg(tdc->cmd, ifname))
goto failure;

return tdc;
failure:
ni_teamd_client_free(tdc);
return NULL;
}

void
ni_teamd_client_free(ni_teamd_client_t *tdc)
{
if (tdc) {
ni_shellcmd_release(tdc->cmd);
ni_string_free(&tdc->ifname);
free(tdc);
}
}

int
ni_teamd_ctl_config_dump(ni_teamd_client_t *tdc, ni_bool_t actual, char **result)
{
ni_buffer_t buf;
ni_process_t *pi;
int rv;

if (!tdc || !result)
return -1;

ni_buffer_init_dynamic(&buf, 1024);
if (!(pi = ni_process_new(tdc->cmd)))
goto failure;

ni_string_array_append(&pi->argv, "config");
ni_string_array_append(&pi->argv, "dump");
if (actual)
ni_string_array_append(&pi->argv, "actual");

rv = ni_process_run_and_capture_output(pi, &buf);
ni_process_free(pi);
if (rv) {
ni_error("%s: unable to dump team config", tdc->ifname);
goto failure;
}

ni_buffer_put(&buf, "\0", 1);
ni_string_free(result);
*result = (char *)buf.base;
buf.base = NULL;
ni_buffer_destroy(&buf);
return 0;

failure:
ni_buffer_destroy(&buf);
return rv;
}

int
ni_teamd_ctl_state_dump(ni_teamd_client_t *tdc, char **result)
{
(void)tdc;
(void)result;
return -1;
}

int
ni_teamd_ctl_state_get_item(ni_teamd_client_t *tdc, const char *item_name, char **result)
{
(void)tdc;
(void)item_name;
(void)result;
return -1;
}

int
ni_teamd_ctl_state_set_item(ni_teamd_client_t *tdc, const char *item_name, const char *item_val)
{
(void)tdc;
(void)item_name;
(void)item_val;
return -1;
}

int
ni_teamd_ctl_port_add(ni_teamd_client_t *tdc, const char *port_name)
{
ni_process_t *pi;
int rv;

if (!tdc || ni_string_empty(port_name))
return -1;

if (!(pi = ni_process_new(tdc->cmd)))
return -1;

ni_string_array_append(&pi->argv, "port");
ni_string_array_append(&pi->argv, "add");
ni_string_array_append(&pi->argv, port_name);

rv = ni_process_run_and_wait(pi);
ni_process_free(pi);
if (rv) {
ni_error("%s: unable to add team port %s", tdc->ifname, port_name);
}
return rv;
}

int
ni_teamd_ctl_port_config_update(ni_teamd_client_t *tdc, const char *port_name, const char *port_conf)
{
ni_process_t *pi;
int rv;

if (!tdc || ni_string_empty(port_name))
return -1;

if (!(pi = ni_process_new(tdc->cmd)))
return -1;

ni_string_array_append(&pi->argv, "port");
ni_string_array_append(&pi->argv, "config");
ni_string_array_append(&pi->argv, "update");
ni_string_array_append(&pi->argv, port_name);
ni_string_array_append(&pi->argv, port_conf ? port_conf : "");

rv = ni_process_run_and_wait(pi);
ni_process_free(pi);
if (rv) {
ni_error("%s: unable to update team port %s config", tdc->ifname, port_name);
}
return rv;
}

#endif /* NI_TEAMD_VIA_DBUS */

static ni_json_t *
ni_teamd_port_config_json(const ni_team_port_config_t *config)
{
Expand Down Expand Up @@ -684,7 +852,7 @@ ni_teamd_discover(ni_netdev_t *dev)
ni_teamd_client_t *tdc = NULL;
ni_json_t *conf = NULL;
ni_team_t *team = NULL;
const char *val;
char *val = NULL;

if (!dev || dev->link.type != NI_IFTYPE_TEAM)
return -1;
Expand All @@ -697,7 +865,7 @@ ni_teamd_discover(ni_netdev_t *dev)
if (!(tdc = ni_teamd_client_open(dev->name)))
goto failure;

if (!(val = ni_teamd_ctl_config_dump(tdc, TRUE)))
if (ni_teamd_ctl_config_dump(tdc, TRUE, &val) < 0)
goto failure;

if (!(conf = ni_json_parse_string(val)))
Expand All @@ -715,12 +883,14 @@ ni_teamd_discover(ni_netdev_t *dev)
ni_netdev_set_team(dev, team);
ni_teamd_client_free(tdc);
ni_json_free(conf);
ni_string_free(&val);
return 0;

failure:
ni_json_free(conf);
ni_team_free(dev->team);
ni_teamd_client_free(tdc);
ni_string_free(&val);
return -1;
}

Expand Down Expand Up @@ -1012,6 +1182,11 @@ ni_teamd_config_file_write(const char *instance, const ni_team_t *config, const
if (ni_string_empty(instance) || !config)
return -1;

if (ni_mkdir_maybe(NI_TEAMD_CONFIG_DIR, NI_TEAMD_CONFIG_DIR_MODE) < 0) {
ni_error("Cannot create teamd run directory \"%s\": %m", NI_TEAMD_CONFIG_DIR);
return -1;
}

if (!ni_teamd_config_file_name(&filename, instance)) {
ni_error("%s: cannot create teamd config file name", instance);
return -1;
Expand Down
Loading

0 comments on commit 90b521a

Please sign in to comment.