|
Packit Service |
d328f3 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
d328f3 |
/*
|
|
Packit Service |
d328f3 |
* Copyright (C) 2013 Jiri Pirko <jiri@resnulli.us>
|
|
Packit Service |
d328f3 |
*
|
|
Packit Service |
d328f3 |
* Copyright 2013 Jiri Pirko <jiri@resnulli.us>
|
|
Packit Service |
d328f3 |
* Copyright 2013 - 2017 Red Hat, Inc.
|
|
Packit Service |
d328f3 |
*/
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "nm-default.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include <stdlib.h>
|
|
Packit Service |
d328f3 |
#if WITH_JANSSON
|
|
Packit Service |
d328f3 |
#include <jansson.h>
|
|
Packit Service |
d328f3 |
#endif
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#include "page-team.h"
|
|
Packit Service |
d328f3 |
#include "page-infiniband.h"
|
|
Packit Service |
d328f3 |
#include "nm-connection-editor.h"
|
|
Packit Service |
d328f3 |
#include "connection-helpers.h"
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
G_DEFINE_TYPE (CEPageTeam, ce_page_team, CE_TYPE_PAGE_MASTER)
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#define CE_PAGE_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_TEAM, CEPageTeamPrivate))
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
typedef struct {
|
|
Packit Service |
d328f3 |
NMSettingTeam *setting;
|
|
Packit Service |
d328f3 |
NMSettingWired *wired;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
int slave_arptype;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
GtkTextView *json_config_widget;
|
|
Packit Service |
d328f3 |
GtkWidget *import_config_button;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
GtkSpinButton *mtu;
|
|
Packit Service |
d328f3 |
GtkButton *advanced_button;
|
|
Packit Service |
d328f3 |
GtkDialog *advanced_dialog;
|
|
Packit Service |
d328f3 |
GtkNotebook *advanced_notebook;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* General */
|
|
Packit Service |
d328f3 |
GtkSpinButton *notify_peers_count;
|
|
Packit Service |
d328f3 |
GtkSpinButton *notify_peers_interval;
|
|
Packit Service |
d328f3 |
GtkSpinButton *mcast_rejoin_count;
|
|
Packit Service |
d328f3 |
GtkSpinButton *mcast_rejoin_interval;
|
|
Packit Service |
d328f3 |
GtkEntry *hwaddr;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Runner */
|
|
Packit Service |
d328f3 |
GtkComboBox *runner_name;
|
|
Packit Service |
d328f3 |
GtkComboBox *hwaddr_policy;
|
|
Packit Service |
d328f3 |
GtkLabel *hwaddr_policy_label;
|
|
Packit Service |
d328f3 |
GtkFrame *tx_hash_frame;
|
|
Packit Service |
d328f3 |
GtkTreeView *tx_hash;
|
|
Packit Service |
d328f3 |
GtkComboBox *tx_balancer;
|
|
Packit Service |
d328f3 |
GtkLabel *tx_balancer_label;
|
|
Packit Service |
d328f3 |
GtkSpinButton *tx_balancing_interval;
|
|
Packit Service |
d328f3 |
GtkLabel *tx_balancing_interval_label;
|
|
Packit Service |
d328f3 |
GtkToggleButton *active;
|
|
Packit Service |
d328f3 |
GtkToggleButton *fast_rate;
|
|
Packit Service |
d328f3 |
GtkSpinButton *system_priority;
|
|
Packit Service |
d328f3 |
GtkLabel *system_priority_label;
|
|
Packit Service |
d328f3 |
GtkSpinButton *minimum_ports;
|
|
Packit Service |
d328f3 |
GtkLabel *minimum_ports_label;
|
|
Packit Service |
d328f3 |
GtkComboBox *agg_selection_policy;
|
|
Packit Service |
d328f3 |
GtkLabel *agg_selection_policy_label;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Link Watch */
|
|
Packit Service |
d328f3 |
GtkComboBox *link_watcher_name;
|
|
Packit Service |
d328f3 |
GtkSpinButton *delay_up;
|
|
Packit Service |
d328f3 |
GtkLabel *delay_up_label;
|
|
Packit Service |
d328f3 |
GtkLabel *delay_up_ms;
|
|
Packit Service |
d328f3 |
GtkSpinButton *delay_down;
|
|
Packit Service |
d328f3 |
GtkLabel *delay_down_label;
|
|
Packit Service |
d328f3 |
GtkLabel *delay_down_ms;
|
|
Packit Service |
d328f3 |
GtkSpinButton *send_interval;
|
|
Packit Service |
d328f3 |
GtkLabel *send_interval_label;
|
|
Packit Service |
d328f3 |
GtkLabel *send_interval_ms;
|
|
Packit Service |
d328f3 |
GtkSpinButton *init_wait;
|
|
Packit Service |
d328f3 |
GtkLabel *init_wait_label;
|
|
Packit Service |
d328f3 |
GtkLabel *init_wait_ms;
|
|
Packit Service |
d328f3 |
GtkSpinButton *missed_max;
|
|
Packit Service |
d328f3 |
GtkLabel *missed_max_label;
|
|
Packit Service |
d328f3 |
GtkEntry *source_host;
|
|
Packit Service |
d328f3 |
GtkLabel *source_host_label;
|
|
Packit Service |
d328f3 |
GtkEntry *target_host;
|
|
Packit Service |
d328f3 |
GtkLabel *target_host_label;
|
|
Packit Service |
d328f3 |
GtkToggleButton *validate_active;
|
|
Packit Service |
d328f3 |
GtkToggleButton *validate_inactive;
|
|
Packit Service |
d328f3 |
GtkToggleButton *send_all;
|
|
Packit Service |
d328f3 |
} CEPageTeamPrivate;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Get string "type" from a combo box with a ["type", "name"] model. */
|
|
Packit Service |
d328f3 |
static gchar *
|
|
Packit Service |
d328f3 |
get_combo_box (GtkComboBox *combo)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GtkTreeModel *model;
|
|
Packit Service |
d328f3 |
GtkTreeIter iter;
|
|
Packit Service |
d328f3 |
gchar *name;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!gtk_combo_box_get_active_iter (combo, &iter))
|
|
Packit Service |
d328f3 |
g_return_val_if_reached (NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
model = gtk_combo_box_get_model (combo);
|
|
Packit Service |
d328f3 |
gtk_tree_model_get (model, &iter, 0, &name, -1);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return name;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#if WITH_JANSSON
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Set active item to "type" in a combo box with a ["type", "name"] model. */
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
set_combo_box (GtkComboBox *combo, const gchar *value, GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GtkTreeModel *model;
|
|
Packit Service |
d328f3 |
GtkTreeIter iter;
|
|
Packit Service |
d328f3 |
gboolean valid;
|
|
Packit Service |
d328f3 |
const gchar *name;
|
|
Packit Service |
d328f3 |
int i = 0;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!value || !*value) {
|
|
Packit Service |
d328f3 |
gtk_combo_box_set_active (combo, 0);
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
model = gtk_combo_box_get_model (combo);
|
|
Packit Service |
d328f3 |
for (valid = gtk_tree_model_get_iter_first (model, &iter);
|
|
Packit Service |
d328f3 |
valid;
|
|
Packit Service |
d328f3 |
valid = gtk_tree_model_iter_next (model, &iter)) {
|
|
Packit Service |
d328f3 |
gtk_tree_model_get (model, &iter, 0, &name, -1);
|
|
Packit Service |
d328f3 |
if (strcmp (name, value) == 0) {
|
|
Packit Service |
d328f3 |
gtk_combo_box_set_active (combo, i);
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
i++;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit Service |
d328f3 |
"Value of \"%s\" is not known", value);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Set active items to values of "type" in a tree view with a ["type", "name"]
|
|
Packit Service |
d328f3 |
* model (for setting the tx_hash). */
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
select_in_tree (GtkTreeView *tree, json_t *arr, GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GtkTreeModel *model;
|
|
Packit Service |
d328f3 |
GtkTreeIter iter;
|
|
Packit Service |
d328f3 |
gboolean valid;
|
|
Packit Service |
d328f3 |
const gchar *name;
|
|
Packit Service |
d328f3 |
GtkTreeSelection *selection;
|
|
Packit Service |
d328f3 |
size_t i;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
model = gtk_tree_view_get_model (tree);
|
|
Packit Service |
d328f3 |
selection = gtk_tree_view_get_selection (tree);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
gtk_tree_selection_unselect_all (selection);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!arr)
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
for (i = 0; i < json_array_size (arr); i++) {
|
|
Packit Service |
d328f3 |
json_t *val = json_array_get (arr, i);
|
|
Packit Service |
d328f3 |
const char *str;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!json_is_string (val)) {
|
|
Packit Service |
d328f3 |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit Service |
d328f3 |
"Expected a string.");
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
str = json_string_value (val);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
for (valid = gtk_tree_model_get_iter_first (model, &iter);
|
|
Packit Service |
d328f3 |
valid;
|
|
Packit Service |
d328f3 |
valid = gtk_tree_model_iter_next (model, &iter)) {
|
|
Packit Service |
d328f3 |
gtk_tree_model_get (model, &iter, 0, &name, -1);
|
|
Packit Service |
d328f3 |
if (strcmp (name, str) == 0) {
|
|
Packit Service |
d328f3 |
gtk_tree_selection_select_iter (selection, &iter);
|
|
Packit Service |
d328f3 |
break;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!valid) {
|
|
Packit Service |
d328f3 |
g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit Service |
d328f3 |
"Unrecognized value \"%s\".", str);
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Set active items to values of "type" in a tree view with a ["type", "name"]
|
|
Packit Service |
d328f3 |
* model (for setting the tx_hash). */
|
|
Packit Service |
d328f3 |
static json_t *
|
|
Packit Service |
d328f3 |
selected_in_tree (GtkTreeView *tree)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GtkTreeModel *model;
|
|
Packit Service |
d328f3 |
GtkTreeIter iter;
|
|
Packit Service |
d328f3 |
gboolean valid;
|
|
Packit Service |
d328f3 |
const gchar *name;
|
|
Packit Service |
d328f3 |
GtkTreeSelection *selection;
|
|
Packit Service |
d328f3 |
json_t *arr = json_array ();
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
model = gtk_tree_view_get_model (tree);
|
|
Packit Service |
d328f3 |
selection = gtk_tree_view_get_selection (tree);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
for (valid = gtk_tree_model_get_iter_first (model, &iter);
|
|
Packit Service |
d328f3 |
valid;
|
|
Packit Service |
d328f3 |
valid = gtk_tree_model_iter_next (model, &iter)) {
|
|
Packit Service |
d328f3 |
gtk_tree_model_get (model, &iter, 0, &name, -1);
|
|
Packit Service |
d328f3 |
if (!gtk_tree_selection_iter_is_selected (selection, &iter))
|
|
Packit Service |
d328f3 |
continue;
|
|
Packit Service |
d328f3 |
json_array_append_new (arr, json_string (name));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return arr;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#endif
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
team_private_init (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkBuilder *builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
builder = CE_PAGE (self)->builder;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->json_config_widget = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "team_json_config"));
|
|
Packit Service |
d328f3 |
priv->import_config_button = GTK_WIDGET (gtk_builder_get_object (builder, "import_config_button"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "team_mtu"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->advanced_button = GTK_BUTTON (gtk_builder_get_object (builder, "advanced_button"));
|
|
Packit Service |
d328f3 |
priv->advanced_dialog = GTK_DIALOG (gtk_builder_get_object (builder, "advanced_dialog"));
|
|
Packit Service |
d328f3 |
gtk_window_set_modal (GTK_WINDOW (priv->advanced_dialog), TRUE);
|
|
Packit Service |
d328f3 |
priv->advanced_notebook = GTK_NOTEBOOK (gtk_builder_get_object (builder, "advanced_notebook"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* General */
|
|
Packit Service |
d328f3 |
priv->notify_peers_count = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "notify_peers_count"));
|
|
Packit Service |
d328f3 |
priv->notify_peers_interval = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "notify_peers_interval"));
|
|
Packit Service |
d328f3 |
priv->mcast_rejoin_count = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "mcast_rejoin_count"));
|
|
Packit Service |
d328f3 |
priv->mcast_rejoin_interval = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "mcast_rejoin_interval"));
|
|
Packit Service |
d328f3 |
priv->hwaddr = GTK_ENTRY (gtk_builder_get_object (builder, "hwaddr"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Runner */
|
|
Packit Service |
d328f3 |
priv->runner_name = GTK_COMBO_BOX (gtk_builder_get_object (builder, "team_runner"));
|
|
Packit Service |
d328f3 |
priv->active = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "active"));
|
|
Packit Service |
d328f3 |
priv->fast_rate = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "fast_rate"));
|
|
Packit Service |
d328f3 |
priv->system_priority = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "system_priority"));
|
|
Packit Service |
d328f3 |
priv->system_priority_label = GTK_LABEL (gtk_builder_get_object (builder, "system_priority_label"));
|
|
Packit Service |
d328f3 |
priv->minimum_ports = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "minimum_ports"));
|
|
Packit Service |
d328f3 |
priv->minimum_ports_label = GTK_LABEL (gtk_builder_get_object (builder, "minimum_ports_label"));
|
|
Packit Service |
d328f3 |
priv->agg_selection_policy = GTK_COMBO_BOX (gtk_builder_get_object (builder, "agg_selection_policy"));
|
|
Packit Service |
d328f3 |
priv->agg_selection_policy_label = GTK_LABEL (gtk_builder_get_object (builder, "agg_selection_policy_label"));
|
|
Packit Service |
d328f3 |
priv->hwaddr_policy = GTK_COMBO_BOX (gtk_builder_get_object (builder, "hwaddr_policy"));
|
|
Packit Service |
d328f3 |
priv->hwaddr_policy_label = GTK_LABEL (gtk_builder_get_object (builder, "hwaddr_policy_label"));
|
|
Packit Service |
d328f3 |
priv->tx_hash_frame = GTK_FRAME (gtk_builder_get_object (builder, "tx_hash_frame"));
|
|
Packit Service |
d328f3 |
priv->tx_hash = GTK_TREE_VIEW (gtk_builder_get_object (builder, "tx_hash"));
|
|
Packit Service |
d328f3 |
priv->tx_balancer = GTK_COMBO_BOX (gtk_builder_get_object (builder, "tx_balancer"));
|
|
Packit Service |
d328f3 |
priv->tx_balancer_label = GTK_LABEL (gtk_builder_get_object (builder, "tx_balancer_label"));
|
|
Packit Service |
d328f3 |
priv->tx_balancing_interval = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "tx_balancing_interval"));
|
|
Packit Service |
d328f3 |
priv->tx_balancing_interval_label = GTK_LABEL (gtk_builder_get_object (builder, "tx_balancing_interval_label"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Link Watcher */
|
|
Packit Service |
d328f3 |
priv->link_watcher_name = GTK_COMBO_BOX (gtk_builder_get_object (builder, "link_watcher_name"));
|
|
Packit Service |
d328f3 |
priv->send_interval = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "send_interval"));
|
|
Packit Service |
d328f3 |
priv->send_interval_label = GTK_LABEL (gtk_builder_get_object (builder, "send_interval_label"));
|
|
Packit Service |
d328f3 |
priv->send_interval_ms = GTK_LABEL (gtk_builder_get_object (builder, "send_interval_ms"));
|
|
Packit Service |
d328f3 |
priv->init_wait = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "init_wait"));
|
|
Packit Service |
d328f3 |
priv->init_wait_label = GTK_LABEL (gtk_builder_get_object (builder, "init_wait_label"));
|
|
Packit Service |
d328f3 |
priv->init_wait_ms = GTK_LABEL (gtk_builder_get_object (builder, "init_wait_ms"));
|
|
Packit Service |
d328f3 |
priv->missed_max = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "missed_max"));
|
|
Packit Service |
d328f3 |
priv->missed_max_label = GTK_LABEL (gtk_builder_get_object (builder, "missed_max_label"));
|
|
Packit Service |
d328f3 |
priv->source_host = GTK_ENTRY (gtk_builder_get_object (builder, "source_host"));
|
|
Packit Service |
d328f3 |
priv->source_host_label = GTK_LABEL (gtk_builder_get_object (builder, "source_host_label"));
|
|
Packit Service |
d328f3 |
priv->target_host = GTK_ENTRY (gtk_builder_get_object (builder, "target_host"));
|
|
Packit Service |
d328f3 |
priv->target_host_label = GTK_LABEL (gtk_builder_get_object (builder, "target_host_label"));
|
|
Packit Service |
d328f3 |
priv->validate_active = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "validate_active"));
|
|
Packit Service |
d328f3 |
priv->validate_inactive = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "validate_inactive"));
|
|
Packit Service |
d328f3 |
priv->send_all = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "send_all"));
|
|
Packit Service |
d328f3 |
priv->delay_up = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "delay_up"));
|
|
Packit Service |
d328f3 |
priv->delay_up_label = GTK_LABEL (gtk_builder_get_object (builder, "delay_up_label"));
|
|
Packit Service |
d328f3 |
priv->delay_up_ms = GTK_LABEL (gtk_builder_get_object (builder, "delay_up_ms"));
|
|
Packit Service |
d328f3 |
priv->delay_down = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "delay_down"));
|
|
Packit Service |
d328f3 |
priv->delay_down_label = GTK_LABEL (gtk_builder_get_object (builder, "delay_down_label"));
|
|
Packit Service |
d328f3 |
priv->delay_down_ms = GTK_LABEL (gtk_builder_get_object (builder, "delay_down_ms"));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->notify_peers_count, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->notify_peers_interval, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->notify_peers_interval, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->mcast_rejoin_count, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->mcast_rejoin_interval, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->tx_balancing_interval, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->system_priority, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->minimum_ports, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->delay_up, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->delay_down, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->send_interval, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->init_wait, -1);
|
|
Packit Service |
d328f3 |
ce_spin_default_val (priv->missed_max, -1);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
stuff_changed (GtkWidget *w, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
import_button_clicked_cb (GtkWidget *widget, CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkWidget *dialog;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
char *filename;
|
|
Packit Service |
d328f3 |
char *buf = NULL;
|
|
Packit Service |
d328f3 |
gsize buf_len;
|
|
Packit Service |
d328f3 |
GtkWidget *toplevel;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
|
|
Packit Service |
d328f3 |
g_return_if_fail (toplevel);
|
|
Packit Service |
d328f3 |
g_return_if_fail (gtk_widget_is_toplevel (toplevel));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
dialog = gtk_file_chooser_dialog_new (_("Select file to import"),
|
|
Packit Service |
d328f3 |
GTK_WINDOW (toplevel),
|
|
Packit Service |
d328f3 |
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
Packit Service |
d328f3 |
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit Service |
d328f3 |
_("_Open"), GTK_RESPONSE_ACCEPT,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
|
|
Packit Service |
d328f3 |
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
|
Packit Service |
d328f3 |
if (!filename) {
|
|
Packit Service |
d328f3 |
g_warning ("%s: didn't get a filename back from the chooser!", __func__);
|
|
Packit Service |
d328f3 |
goto out;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Put the file content into JSON config text view. */
|
|
Packit Service |
d328f3 |
// FIXME: do a cleverer file validity check
|
|
Packit Service |
d328f3 |
g_file_get_contents (filename, &buf, &buf_len, NULL);
|
|
Packit Service |
d328f3 |
if (buf_len > 100000) {
|
|
Packit Service |
d328f3 |
g_free (buf);
|
|
Packit Service |
d328f3 |
buf = g_strdup (_("Error: file doesn’t contain a valid JSON configuration"));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->json_config_widget);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_set_text (buffer, buf ? buf : "", -1);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_free (filename);
|
|
Packit Service |
d328f3 |
g_free (buf);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
out:
|
|
Packit Service |
d328f3 |
gtk_widget_destroy (dialog);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
runner_changed (GtkComboBox *combo, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (user_data);
|
|
Packit Service |
d328f3 |
gchar *name;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* First hide everything and then show just what we need. */
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->hwaddr_policy));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->hwaddr_policy_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_hash_frame));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_hash));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_balancer));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_balancer_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_balancing_interval));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->tx_balancing_interval_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->active));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->fast_rate));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->system_priority));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->system_priority_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->minimum_ports));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->minimum_ports_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->agg_selection_policy));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->agg_selection_policy_label));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
name = get_combo_box (combo);
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (name, "broadcast") == 0 || g_strcmp0 (name, "roundrobin") == 0) {
|
|
Packit Service |
d328f3 |
/* No options for these. */
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (name, "activebackup") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->hwaddr_policy));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->hwaddr_policy_label));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (name, "loadbalance") == 0 || g_strcmp0 (name, "lacp") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_hash_frame));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_hash));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_balancer));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_balancer_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_balancing_interval));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->tx_balancing_interval_label));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (name, "lacp") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->active));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->fast_rate));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->system_priority));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->system_priority_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->minimum_ports));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->minimum_ports_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->agg_selection_policy));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->agg_selection_policy_label));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
g_return_if_reached ();
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
g_free (name);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
link_watcher_changed (GtkComboBox *combo, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (user_data);
|
|
Packit Service |
d328f3 |
gchar *name;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* First hide everything and then show just what we need. */
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_up));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_up_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_up_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_down));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_down_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->delay_down_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->send_interval));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->send_interval_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->send_interval_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->init_wait));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->init_wait_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->init_wait_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->missed_max));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->missed_max_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->source_host));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->source_host_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->target_host));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->target_host_label));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->validate_active));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->validate_inactive));
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->send_all));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
name = get_combo_box (combo);
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (name, "ethtool") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_up));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_up_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_up_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_down));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_down_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->delay_down_ms));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (name, "arp_ping") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->missed_max));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->missed_max_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->source_host));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->source_host_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->target_host));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->target_host_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->validate_active));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->validate_inactive));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_all));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (name, "nsna_ping") == 0) {
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->send_interval_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->init_wait_ms));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->missed_max));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->missed_max_label));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->target_host));
|
|
Packit Service |
d328f3 |
gtk_widget_show (GTK_WIDGET (priv->target_host_label));
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
g_return_if_reached ();
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
g_free (name);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#if WITH_JANSSON
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
json_to_dialog (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
char *json_config;
|
|
Packit Service |
d328f3 |
json_t *json;
|
|
Packit Service |
d328f3 |
json_error_t json_error;
|
|
Packit Service |
d328f3 |
int ret;
|
|
Packit Service |
d328f3 |
gboolean success = TRUE;
|
|
Packit Service |
d328f3 |
GtkTextIter start, end;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
GError *error = NULL;
|
|
Packit Service |
d328f3 |
/* General */
|
|
Packit Service |
d328f3 |
int notify_peers_count = -1;
|
|
Packit Service |
d328f3 |
int notify_peers_interval = -1;
|
|
Packit Service |
d328f3 |
int mcast_rejoin_count = -1;
|
|
Packit Service |
d328f3 |
int mcast_rejoin_interval = -1;
|
|
Packit Service |
d328f3 |
const char *hwaddr = "";
|
|
Packit Service |
d328f3 |
/* Runner */
|
|
Packit Service |
d328f3 |
const char *runner_name = "";
|
|
Packit Service |
d328f3 |
const char *runner_hwaddr_policy = "";
|
|
Packit Service |
d328f3 |
json_t *runner_tx_hash = NULL;
|
|
Packit Service |
d328f3 |
const char *runner_tx_balancer_name = "";
|
|
Packit Service |
d328f3 |
int runner_tx_balancer_balancing_interval = -1;
|
|
Packit Service |
d328f3 |
int runner_active = TRUE;
|
|
Packit Service |
d328f3 |
int runner_fast_rate = FALSE;
|
|
Packit Service |
d328f3 |
int runner_sys_prio = -1;
|
|
Packit Service |
d328f3 |
int runner_min_ports = -1;
|
|
Packit Service |
d328f3 |
const char *runner_agg_select_policy = "";
|
|
Packit Service |
d328f3 |
/* Link Watch */
|
|
Packit Service |
d328f3 |
const char *link_watch_name = "";
|
|
Packit Service |
d328f3 |
int link_watch_delay_up = -1;
|
|
Packit Service |
d328f3 |
int link_watch_delay_down = -1;
|
|
Packit Service |
d328f3 |
int link_watch_interval = -1;
|
|
Packit Service |
d328f3 |
int link_watch_init_wait = -1;
|
|
Packit Service |
d328f3 |
int link_watch_missed_max = -1;
|
|
Packit Service |
d328f3 |
const char *link_watch_source_host = "";
|
|
Packit Service |
d328f3 |
const char *link_watch_target_host = "";
|
|
Packit Service |
d328f3 |
int link_watch_validate_active = FALSE;
|
|
Packit Service |
d328f3 |
int link_watch_validate_inactive = FALSE;
|
|
Packit Service |
d328f3 |
int link_watch_send_always = FALSE;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->json_config_widget);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
|
|
Packit Service |
d328f3 |
json_config = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (strcmp (json_config, "") == 0) {
|
|
Packit Service |
d328f3 |
/* Initial empty configuration */
|
|
Packit Service |
d328f3 |
json = json_object ();
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
json = json_loads (json_config, 0, &json_error);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!json) {
|
|
Packit Service |
d328f3 |
g_message ("Failed to parse JSON: %s on line %d", json_error.text, json_error.line);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* For simplicity, we proceed with json==NULL. The attempt to
|
|
Packit Service |
d328f3 |
* unpack will produce an error which we'll ignore. */
|
|
Packit Service |
d328f3 |
g_free (json_config);
|
|
Packit Service |
d328f3 |
ret = json_unpack_ex (json, &json_error, 0,
|
|
Packit Service |
d328f3 |
"{"
|
|
Packit Service |
d328f3 |
" s?:s,"
|
|
Packit Service |
d328f3 |
" s?:{s?:i, s?:i !},"
|
|
Packit Service |
d328f3 |
" s?:{s?:i, s?:i !},"
|
|
Packit Service |
d328f3 |
" s?:{s?:s, s?:s, s?:o, s?:{s?:s, s?:i !}, s?:b, s?:b, s?:i, s?:i, s?:s !},"
|
|
Packit Service |
d328f3 |
" s?:{s?:s, s?:i, s?:i, s?:i, s?:i, s?:i, s?:s, s?:s, s?:b, s?:b, s?:b !}"
|
|
Packit Service |
d328f3 |
"!}",
|
|
Packit Service |
d328f3 |
"hwaddr", &hwaddr,
|
|
Packit Service |
d328f3 |
"notify_peers",
|
|
Packit Service |
d328f3 |
"interval", ¬ify_peers_interval,
|
|
Packit Service |
d328f3 |
"count", ¬ify_peers_count,
|
|
Packit Service |
d328f3 |
"mcast_rejoin",
|
|
Packit Service |
d328f3 |
"count", &mcast_rejoin_count,
|
|
Packit Service |
d328f3 |
"interval", &mcast_rejoin_interval,
|
|
Packit Service |
d328f3 |
"runner",
|
|
Packit Service |
d328f3 |
"name", &runner_name,
|
|
Packit Service |
d328f3 |
"hwaddr_policy", &runner_hwaddr_policy,
|
|
Packit Service |
d328f3 |
"tx_hash", &runner_tx_hash,
|
|
Packit Service |
d328f3 |
"tx_balancer",
|
|
Packit Service |
d328f3 |
"name", &runner_tx_balancer_name,
|
|
Packit Service |
d328f3 |
"balancing_interval", &runner_tx_balancer_balancing_interval,
|
|
Packit Service |
d328f3 |
"active", &runner_active,
|
|
Packit Service |
d328f3 |
"fast_rate", &runner_fast_rate,
|
|
Packit Service |
d328f3 |
"sys_prio", &runner_sys_prio,
|
|
Packit Service |
d328f3 |
"min_ports", &runner_min_ports,
|
|
Packit Service |
d328f3 |
"agg_select_policy", &runner_agg_select_policy,
|
|
Packit Service |
d328f3 |
"link_watch",
|
|
Packit Service |
d328f3 |
"name", &link_watch_name,
|
|
Packit Service |
d328f3 |
"delay_up", &link_watch_delay_up,
|
|
Packit Service |
d328f3 |
"delay_down", &link_watch_delay_down,
|
|
Packit Service |
d328f3 |
"interval", &link_watch_interval,
|
|
Packit Service |
d328f3 |
"init_wait", &link_watch_init_wait,
|
|
Packit Service |
d328f3 |
"missed_max", &link_watch_missed_max,
|
|
Packit Service |
d328f3 |
"source_host", &link_watch_source_host,
|
|
Packit Service |
d328f3 |
"target_host", &link_watch_target_host,
|
|
Packit Service |
d328f3 |
"validate_active", &link_watch_validate_active,
|
|
Packit Service |
d328f3 |
"validate_inactive", &link_watch_validate_inactive,
|
|
Packit Service |
d328f3 |
"send_always", &link_watch_send_always);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (success == TRUE && ret == -1) {
|
|
Packit Service |
d328f3 |
g_message ("Failed to parse JSON: %s on line %d", json_error.text, json_error.line);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* We proceed setting the form fields even in case we couldn't unpack.
|
|
Packit Service |
d328f3 |
* That way we'll get at least sensible default values. Editing will
|
|
Packit Service |
d328f3 |
* be disabled anyway. */
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->hwaddr, hwaddr);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->notify_peers_count, notify_peers_count);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->notify_peers_interval, notify_peers_interval);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->mcast_rejoin_count, mcast_rejoin_count);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->mcast_rejoin_interval, mcast_rejoin_interval);
|
|
Packit Service |
d328f3 |
if (!set_combo_box (priv->link_watcher_name, link_watch_name, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read link watcher name: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
if (!set_combo_box (priv->runner_name, runner_name, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read runner name: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
if (!set_combo_box (priv->hwaddr_policy, runner_hwaddr_policy, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read hardware address policy: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
if (!select_in_tree (priv->tx_hash, runner_tx_hash, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read transmission hash: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
if (!set_combo_box (priv->tx_balancer, runner_tx_balancer_name, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read balancer name: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->tx_balancing_interval, runner_tx_balancer_balancing_interval);
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->active, runner_active);
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->fast_rate, runner_fast_rate);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->system_priority, runner_sys_prio);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->minimum_ports, runner_min_ports);
|
|
Packit Service |
d328f3 |
if (!set_combo_box (priv->agg_selection_policy, runner_agg_select_policy, &error)) {
|
|
Packit Service |
d328f3 |
g_message ("Cannot read aggergator select policy: %s", error->message);
|
|
Packit Service |
d328f3 |
g_clear_error (&error);
|
|
Packit Service |
d328f3 |
success = FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->delay_up, link_watch_delay_up);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->delay_down, link_watch_delay_down);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->send_interval, link_watch_interval);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->init_wait, link_watch_init_wait);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->missed_max, link_watch_missed_max);
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->source_host, link_watch_source_host);
|
|
Packit Service |
d328f3 |
gtk_entry_set_text (priv->target_host, link_watch_target_host);
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->validate_active, link_watch_validate_active);
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->validate_inactive, link_watch_validate_inactive);
|
|
Packit Service |
d328f3 |
gtk_toggle_button_set_active (priv->send_all, link_watch_send_always);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (success) {
|
|
Packit Service |
d328f3 |
/* Enable editing. */
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 0), 1);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 1), 1);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 2), 1);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
json_decref (json);
|
|
Packit Service |
d328f3 |
return success;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
maybe_set_str (json_t *json, const char *key, const char *str)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
if (str && *str)
|
|
Packit Service |
d328f3 |
json_object_set_new(json, key, json_string (str));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
maybe_set_int (json_t *json, const char *key, int num)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
if (num != -1)
|
|
Packit Service |
d328f3 |
json_object_set_new(json, key, json_integer (num));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
maybe_set_json (json_t *json, const char *key, json_t *val)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
if ( (json_is_object (val) && json_object_size (val))
|
|
Packit Service |
d328f3 |
|| (json_is_array (val) && json_array_size (val))) {
|
|
Packit Service |
d328f3 |
json_object_set_new (json, key, val);
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
json_decref (val);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
maybe_set_true (json_t *json, const char *key, int set)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
if (set)
|
|
Packit Service |
d328f3 |
json_object_set_new(json, key, json_true ());
|
|
Packit Service |
d328f3 |
else
|
|
Packit Service |
d328f3 |
json_object_set_new(json, key, json_false ());
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
dialog_to_json (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
json_t *json;
|
|
Packit Service |
d328f3 |
json_t *obj;
|
|
Packit Service |
d328f3 |
gchar *tmp;
|
|
Packit Service |
d328f3 |
char *json_config;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* If the JSON is being edited, don't overwrite it. */
|
|
Packit Service |
d328f3 |
if (!gtk_widget_get_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 0)))
|
|
Packit Service |
d328f3 |
return;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Disable editing via form, until converted back from JSON. */
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 0), 0);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 1), 0);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 2), 0);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
json = json_object ();
|
|
Packit Service |
d328f3 |
maybe_set_str (json, "hwaddr", gtk_entry_get_text (priv->hwaddr));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
obj = json_object ();
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "count", gtk_spin_button_get_value_as_int (priv->notify_peers_count));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "interval", gtk_spin_button_get_value_as_int (priv->notify_peers_interval));
|
|
Packit Service |
d328f3 |
maybe_set_json (json, "notify_peers", obj);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
obj = json_object ();
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "count", gtk_spin_button_get_value_as_int (priv->mcast_rejoin_count));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "interval", gtk_spin_button_get_value_as_int (priv->mcast_rejoin_interval));
|
|
Packit Service |
d328f3 |
maybe_set_json (json, "mcast_rejoin", obj);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
obj = json_object ();
|
|
Packit Service |
d328f3 |
tmp = get_combo_box (priv->runner_name);
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "name", tmp);
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (tmp, "roundrobin") == 0) {
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (tmp, "activebackup") == 0) {
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "hwaddr_policy", get_combo_box (priv->hwaddr_policy));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (tmp, "loadbalance") == 0 || g_strcmp0 (tmp, "lacp") == 0) {
|
|
Packit Service |
d328f3 |
json_t *obj2;
|
|
Packit Service |
d328f3 |
gchar *str;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
obj2 = json_object ();
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Glade won't let us have a "" in the model :( */
|
|
Packit Service |
d328f3 |
str = get_combo_box (priv->tx_balancer);
|
|
Packit Service |
d328f3 |
if (strcmp (str, "none"))
|
|
Packit Service |
d328f3 |
maybe_set_str (obj2, "name", str);
|
|
Packit Service |
d328f3 |
g_free (str);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
maybe_set_int (obj2, "balancing_interval", gtk_spin_button_get_value_as_int (priv->tx_balancing_interval));
|
|
Packit Service |
d328f3 |
maybe_set_json (obj, "tx_balancer", obj2);
|
|
Packit Service |
d328f3 |
maybe_set_json (obj, "tx_hash", selected_in_tree (priv->tx_hash));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (tmp, "lacp") == 0) {
|
|
Packit Service |
d328f3 |
maybe_set_true (obj, "active", gtk_toggle_button_get_active (priv->active));
|
|
Packit Service |
d328f3 |
maybe_set_true (obj, "fast_rate", gtk_toggle_button_get_active (priv->fast_rate));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "sys_prio", gtk_spin_button_get_value (priv->system_priority));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "min_ports", gtk_spin_button_get_value (priv->minimum_ports));
|
|
Packit Service |
d328f3 |
str = get_combo_box (priv->agg_selection_policy);
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "agg_select_policy", str);
|
|
Packit Service |
d328f3 |
g_free (str);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
maybe_set_json (json, "runner", obj);
|
|
Packit Service |
d328f3 |
g_free (tmp);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
obj = json_object ();
|
|
Packit Service |
d328f3 |
tmp = get_combo_box (priv->link_watcher_name);
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "name", tmp);
|
|
Packit Service |
d328f3 |
if (g_strcmp0 (tmp, "ethtool") == 0) {
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "delay_up", gtk_spin_button_get_value (priv->delay_up));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "delay_down", gtk_spin_button_get_value (priv->delay_down));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (tmp, "arp_ping") == 0) {
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "interval", gtk_spin_button_get_value (priv->send_interval));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "init_wait", gtk_spin_button_get_value (priv->init_wait));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "missed_max", gtk_spin_button_get_value (priv->missed_max));
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "source_host", gtk_entry_get_text (priv->source_host));
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "target_host", gtk_entry_get_text (priv->target_host));
|
|
Packit Service |
d328f3 |
maybe_set_true (obj, "validate_active", gtk_toggle_button_get_active (priv->validate_active));
|
|
Packit Service |
d328f3 |
maybe_set_true (obj, "validate_inactive", gtk_toggle_button_get_active (priv->validate_inactive));
|
|
Packit Service |
d328f3 |
maybe_set_true (obj, "send_always", gtk_toggle_button_get_active (priv->send_all));
|
|
Packit Service |
d328f3 |
} else if (g_strcmp0 (tmp, "nsna_ping") == 0) {
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "interval", gtk_spin_button_get_value (priv->send_interval));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "init_wait", gtk_spin_button_get_value (priv->init_wait));
|
|
Packit Service |
d328f3 |
maybe_set_int (obj, "missed_max", gtk_spin_button_get_value (priv->missed_max));
|
|
Packit Service |
d328f3 |
maybe_set_str (obj, "target_host", gtk_entry_get_text (priv->target_host));
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
g_return_if_reached ();
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
maybe_set_json (json, "link_watch", obj);
|
|
Packit Service |
d328f3 |
g_free (tmp);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
json_config = json_dumps (json, JSON_INDENT (4));
|
|
Packit Service |
d328f3 |
json_decref (json);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->json_config_widget);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_set_text (buffer, json_config, -1);
|
|
Packit Service |
d328f3 |
free (json_config);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#else /* WITH_JANSSON */
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
json_to_dialog (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
dialog_to_json (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
#endif /* WITH_JANSSON */
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
advanced_button_clicked_cb (GtkWidget *button, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (user_data);
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMSettingTeam *s_team = priv->setting;
|
|
Packit Service |
d328f3 |
GtkWidget *toplevel;
|
|
Packit Service |
d328f3 |
GtkTextBuffer *buffer;
|
|
Packit Service |
d328f3 |
GtkTextIter start, end;
|
|
Packit Service |
d328f3 |
char *json_config = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
|
|
Packit Service |
d328f3 |
g_return_if_fail (toplevel);
|
|
Packit Service |
d328f3 |
gtk_window_set_transient_for (GTK_WINDOW (priv->advanced_dialog), GTK_WINDOW (toplevel));
|
|
Packit Service |
d328f3 |
g_return_if_fail (gtk_widget_is_toplevel (toplevel));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Load in the JSON from settings to dialog. */
|
|
Packit Service |
d328f3 |
buffer = gtk_text_view_get_buffer (priv->json_config_widget);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_set_text (buffer, nm_setting_team_get_config (s_team) ?: "", -1);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Fill in the form fields. */
|
|
Packit Service |
d328f3 |
if (json_to_dialog (self)) {
|
|
Packit Service |
d328f3 |
gtk_notebook_set_current_page (priv->advanced_notebook, 0);
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
/* First disable the pages, so that potentially
|
|
Packit Service |
d328f3 |
* inconsistent changes are not propageated to JSON. */
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 0), 0);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 1), 0);
|
|
Packit Service |
d328f3 |
gtk_widget_set_sensitive (gtk_notebook_get_nth_page (priv->advanced_notebook, 2), 0);
|
|
Packit Service |
d328f3 |
gtk_notebook_set_current_page (priv->advanced_notebook, 3);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
runner_changed (priv->runner_name, self);
|
|
Packit Service |
d328f3 |
link_watcher_changed (priv->link_watcher_name, self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (gtk_dialog_run (priv->advanced_dialog) == GTK_RESPONSE_OK) {
|
|
Packit Service |
d328f3 |
dialog_to_json (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Set the JSON from the dialog to setting. */
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
|
|
Packit Service |
d328f3 |
gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
|
|
Packit Service |
d328f3 |
json_config = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_object_set (priv->setting,
|
|
Packit Service |
d328f3 |
NM_SETTING_TEAM_CONFIG,
|
|
Packit Service |
d328f3 |
g_strcmp0 (json_config, "") == 0 ? NULL : json_config,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
g_free (json_config);
|
|
Packit Service |
d328f3 |
ce_page_changed (CE_PAGE (self));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
gtk_widget_hide (GTK_WIDGET (priv->advanced_dialog));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
switch_page (GtkNotebook *notebook,
|
|
Packit Service |
d328f3 |
GtkWidget *page,
|
|
Packit Service |
d328f3 |
guint page_num,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (user_data);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Keep the JSON and the form in sync if possible. */
|
|
Packit Service |
d328f3 |
if (gtk_notebook_get_current_page (notebook) == 3)
|
|
Packit Service |
d328f3 |
json_to_dialog (self);
|
|
Packit Service |
d328f3 |
else if (page_num == 3)
|
|
Packit Service |
d328f3 |
dialog_to_json (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
populate_ui (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
guint32 mtu_def, mtu_val;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* MTU */
|
|
Packit Service |
d328f3 |
if (priv->wired) {
|
|
Packit Service |
d328f3 |
mtu_def = ce_get_property_default (NM_SETTING (priv->wired), NM_SETTING_WIRED_MTU);
|
|
Packit Service |
d328f3 |
mtu_val = nm_setting_wired_get_mtu (priv->wired);
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
mtu_def = mtu_val = 0;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
ce_spin_automatic_val (priv->mtu, mtu_def);
|
|
Packit Service |
d328f3 |
gtk_spin_button_set_value (priv->mtu, (gdouble) mtu_val);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->import_config_button, "clicked", G_CALLBACK (import_button_clicked_cb), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->runner_name, "changed", G_CALLBACK (runner_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->link_watcher_name, "changed", G_CALLBACK (link_watcher_changed), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->advanced_button, "clicked", G_CALLBACK (advanced_button_clicked_cb), self);
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->advanced_notebook, "switch-page", G_CALLBACK (switch_page), self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
connection_removed (CEPageMaster *master, NMConnection *connection)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (master);
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!ce_page_master_has_slaves (master))
|
|
Packit Service |
d328f3 |
priv->slave_arptype = ARPHRD_VOID;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
connection_added (CEPageMaster *master, NMConnection *connection)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (master);
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME))
|
|
Packit Service |
d328f3 |
priv->slave_arptype = ARPHRD_INFINIBAND;
|
|
Packit Service |
d328f3 |
else
|
|
Packit Service |
d328f3 |
priv->slave_arptype = ARPHRD_ETHER;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
create_connection (CEPageMaster *master, NMConnection *connection)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
NMSetting *s_port;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s_port = nm_connection_get_setting (connection, NM_TYPE_SETTING_TEAM_PORT);
|
|
Packit Service |
d328f3 |
if (!s_port) {
|
|
Packit Service |
d328f3 |
s_port = nm_setting_team_port_new ();
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (connection, s_port);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
connection_type_filter (FUNC_TAG_NEW_CONNECTION_TYPE_FILTER_IMPL,
|
|
Packit Service |
d328f3 |
GType type,
|
|
Packit Service |
d328f3 |
gpointer self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!nm_utils_check_virtual_device_compatibility (NM_TYPE_SETTING_TEAM, type))
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Can only have connections of a single arptype. Note that we don't
|
|
Packit Service |
d328f3 |
* need to check the reverse case here since we don't need to call
|
|
Packit Service |
d328f3 |
* new_connection_dialog() in the InfiniBand case.
|
|
Packit Service |
d328f3 |
*/
|
|
Packit Service |
d328f3 |
if ( priv->slave_arptype == ARPHRD_ETHER
|
|
Packit Service |
d328f3 |
&& type == NM_TYPE_SETTING_INFINIBAND)
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
add_slave (CEPageMaster *master, NewConnectionResultFunc result_func)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (master);
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
GtkWidget *toplevel;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
|
|
Packit Service |
d328f3 |
g_return_if_fail (toplevel);
|
|
Packit Service |
d328f3 |
g_return_if_fail (gtk_widget_is_toplevel (toplevel));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (priv->slave_arptype == ARPHRD_INFINIBAND) {
|
|
Packit Service |
d328f3 |
new_connection_of_type (GTK_WINDOW (toplevel),
|
|
Packit Service |
d328f3 |
NULL,
|
|
Packit Service |
d328f3 |
NULL,
|
|
Packit Service |
d328f3 |
NULL,
|
|
Packit Service |
d328f3 |
CE_PAGE (self)->client,
|
|
Packit Service |
d328f3 |
infiniband_connection_new,
|
|
Packit Service |
d328f3 |
result_func,
|
|
Packit Service |
d328f3 |
master);
|
|
Packit Service |
d328f3 |
} else {
|
|
Packit Service |
d328f3 |
new_connection_dialog (GTK_WINDOW (toplevel),
|
|
Packit Service |
d328f3 |
CE_PAGE (self)->client,
|
|
Packit Service |
d328f3 |
connection_type_filter,
|
|
Packit Service |
d328f3 |
result_func,
|
|
Packit Service |
d328f3 |
master);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
finish_setup (CEPageTeam *self, gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
populate_ui (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (priv->mtu, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
CEPage *
|
|
Packit Service |
d328f3 |
ce_page_team_new (NMConnectionEditor *editor,
|
|
Packit Service |
d328f3 |
NMConnection *connection,
|
|
Packit Service |
d328f3 |
GtkWindow *parent_window,
|
|
Packit Service |
d328f3 |
NMClient *client,
|
|
Packit Service |
d328f3 |
const char **out_secrets_setting_name,
|
|
Packit Service |
d328f3 |
GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self;
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
self = CE_PAGE_TEAM (ce_page_new (CE_TYPE_PAGE_TEAM,
|
|
Packit Service |
d328f3 |
editor,
|
|
Packit Service |
d328f3 |
connection,
|
|
Packit Service |
d328f3 |
parent_window,
|
|
Packit Service |
d328f3 |
client,
|
|
Packit Service |
d328f3 |
"/org/gnome/nm_connection_editor/ce-page-team.ui",
|
|
Packit Service |
d328f3 |
"TeamPage",
|
|
Packit Service |
d328f3 |
_("Team")));
|
|
Packit Service |
d328f3 |
if (!self) {
|
|
Packit Service |
d328f3 |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit Service |
d328f3 |
_("Could not load team user interface."));
|
|
Packit Service |
d328f3 |
return NULL;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
team_private_init (self);
|
|
Packit Service |
d328f3 |
priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->setting = nm_connection_get_setting_team (connection);
|
|
Packit Service |
d328f3 |
if (!priv->setting) {
|
|
Packit Service |
d328f3 |
priv->setting = NM_SETTING_TEAM (nm_setting_team_new ());
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
priv->wired = nm_connection_get_setting_wired (connection);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
return CE_PAGE (self);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ui_to_setting (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
NMConnection *connection = CE_PAGE (self)->connection;
|
|
Packit Service |
d328f3 |
guint32 mtu;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
mtu = gtk_spin_button_get_value_as_int (priv->mtu);
|
|
Packit Service |
d328f3 |
if (mtu && !priv->wired) {
|
|
Packit Service |
d328f3 |
priv->wired = NM_SETTING_WIRED (nm_setting_wired_new ());
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (connection, NM_SETTING (priv->wired));
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
if (priv->wired)
|
|
Packit Service |
d328f3 |
g_object_set (priv->wired, NM_SETTING_WIRED_MTU, mtu, NULL);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static gboolean
|
|
Packit Service |
d328f3 |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeam *self = CE_PAGE_TEAM (page);
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!CE_PAGE_CLASS (ce_page_team_parent_class)->ce_page_validate_v (page, connection, error))
|
|
Packit Service |
d328f3 |
return FALSE;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
ui_to_setting (self);
|
|
Packit Service |
d328f3 |
return nm_setting_verify (NM_SETTING (priv->setting), connection, error);
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_team_init (CEPageTeam *self)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
CEPageTeamPrivate *priv = CE_PAGE_TEAM_GET_PRIVATE (self);
|
|
Packit Service |
d328f3 |
CEPageMaster *master = CE_PAGE_MASTER (self);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
priv->slave_arptype = ARPHRD_VOID;
|
|
Packit Service |
d328f3 |
master->aggregating = TRUE;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
static void
|
|
Packit Service |
d328f3 |
ce_page_team_class_init (CEPageTeamClass *team_class)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
GObjectClass *object_class = G_OBJECT_CLASS (team_class);
|
|
Packit Service |
d328f3 |
CEPageClass *parent_class = CE_PAGE_CLASS (team_class);
|
|
Packit Service |
d328f3 |
CEPageMasterClass *master_class = CE_PAGE_MASTER_CLASS (team_class);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
g_type_class_add_private (object_class, sizeof (CEPageTeamPrivate));
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* virtual methods */
|
|
Packit Service |
d328f3 |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit Service |
d328f3 |
master_class->create_connection = create_connection;
|
|
Packit Service |
d328f3 |
master_class->connection_added = connection_added;
|
|
Packit Service |
d328f3 |
master_class->connection_removed = connection_removed;
|
|
Packit Service |
d328f3 |
master_class->add_slave = add_slave;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
void
|
|
Packit Service |
d328f3 |
team_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL,
|
|
Packit Service |
d328f3 |
GtkWindow *parent,
|
|
Packit Service |
d328f3 |
const char *detail,
|
|
Packit Service |
d328f3 |
gpointer detail_data,
|
|
Packit Service |
d328f3 |
NMConnection *connection,
|
|
Packit Service |
d328f3 |
NMClient *client,
|
|
Packit Service |
d328f3 |
PageNewConnectionResultFunc result_func,
|
|
Packit Service |
d328f3 |
gpointer user_data)
|
|
Packit Service |
d328f3 |
{
|
|
Packit Service |
d328f3 |
NMSettingConnection *s_con;
|
|
Packit Service |
d328f3 |
int team_num, num, i;
|
|
Packit Service |
d328f3 |
const GPtrArray *connections;
|
|
Packit Service |
d328f3 |
NMConnection *conn2;
|
|
Packit Service |
d328f3 |
const char *iface;
|
|
Packit Service |
d328f3 |
char *my_iface;
|
|
Packit Service |
d328f3 |
gs_unref_object NMConnection *connection_tmp = NULL;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
connection = _ensure_connection_other (connection, &connection_tmp);
|
|
Packit Service |
d328f3 |
ce_page_complete_connection (connection,
|
|
Packit Service |
d328f3 |
_("Team connection %d"),
|
|
Packit Service |
d328f3 |
NM_SETTING_TEAM_SETTING_NAME,
|
|
Packit Service |
d328f3 |
TRUE,
|
|
Packit Service |
d328f3 |
client);
|
|
Packit Service |
d328f3 |
nm_connection_add_setting (connection, nm_setting_team_new ());
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
/* Find an available interface name */
|
|
Packit Service |
d328f3 |
team_num = 0;
|
|
Packit Service |
d328f3 |
connections = nm_client_get_connections (client);
|
|
Packit Service |
d328f3 |
for (i = 0; i < connections->len; i++) {
|
|
Packit Service |
d328f3 |
conn2 = connections->pdata[i];
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
if (!nm_connection_is_type (conn2, NM_SETTING_TEAM_SETTING_NAME))
|
|
Packit Service |
d328f3 |
continue;
|
|
Packit Service |
d328f3 |
iface = nm_connection_get_interface_name (conn2);
|
|
Packit Service |
d328f3 |
if (!iface || strncmp (iface, "team", 4) != 0 || !g_ascii_isdigit (iface[4]))
|
|
Packit Service |
d328f3 |
continue;
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
num = atoi (iface + 4);
|
|
Packit Service |
d328f3 |
if (team_num <= num)
|
|
Packit Service |
d328f3 |
team_num = num + 1;
|
|
Packit Service |
d328f3 |
}
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
s_con = nm_connection_get_setting_connection (connection);
|
|
Packit Service |
d328f3 |
my_iface = g_strdup_printf ("team%d", team_num);
|
|
Packit Service |
d328f3 |
g_object_set (G_OBJECT (s_con),
|
|
Packit Service |
d328f3 |
NM_SETTING_CONNECTION_INTERFACE_NAME, my_iface,
|
|
Packit Service |
d328f3 |
NULL);
|
|
Packit Service |
d328f3 |
g_free (my_iface);
|
|
Packit Service |
d328f3 |
|
|
Packit Service |
d328f3 |
(*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data);
|
|
Packit Service |
d328f3 |
}
|