From 6be1e19d982ca87bee234e15ae159447d61013d5 Mon Sep 17 00:00:00 2001 From: Jeff Ahrenholz Date: Thu, 31 Oct 2019 13:20:28 -0700 Subject: [PATCH 1/4] don't flush IPv6 address if interface is absent --- daemon/core/nodes/netclient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon/core/nodes/netclient.py b/daemon/core/nodes/netclient.py index b201493f..7a9cc2d8 100644 --- a/daemon/core/nodes/netclient.py +++ b/daemon/core/nodes/netclient.py @@ -126,7 +126,7 @@ class LinuxNetClient: :param str device: device to flush :return: nothing """ - self.run(f"{IP_BIN} -6 address flush dev {device}") + self.run(f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || echo") def device_mac(self, device, mac): """ From ddcce82af4b5023651b9ac9736f56cf6e4f5a99f Mon Sep 17 00:00:00 2001 From: Jeff Ahrenholz Date: Thu, 7 Nov 2019 09:01:01 -0800 Subject: [PATCH 2/4] address PR comments and fix pre-commit --- daemon/core/nodes/netclient.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/daemon/core/nodes/netclient.py b/daemon/core/nodes/netclient.py index 7a9cc2d8..4a7250f0 100644 --- a/daemon/core/nodes/netclient.py +++ b/daemon/core/nodes/netclient.py @@ -126,7 +126,10 @@ class LinuxNetClient: :param str device: device to flush :return: nothing """ - self.run(f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || echo") + self.run( + f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || true", + shell=True, + ) def device_mac(self, device, mac): """ From 2d9cf81d0b980cf5788e6adeecff20f8a1b82234 Mon Sep 17 00:00:00 2001 From: Jeff Ahrenholz Date: Thu, 7 Nov 2019 11:38:31 -0800 Subject: [PATCH 3/4] remove shell=True from run command --- daemon/core/nodes/netclient.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/daemon/core/nodes/netclient.py b/daemon/core/nodes/netclient.py index 4a7250f0..4d568a64 100644 --- a/daemon/core/nodes/netclient.py +++ b/daemon/core/nodes/netclient.py @@ -127,8 +127,7 @@ class LinuxNetClient: :return: nothing """ self.run( - f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || true", - shell=True, + f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || true" ) def device_mac(self, device, mac): From 086e3316eb2941d0c6707cd45560128d6fc1431c Mon Sep 17 00:00:00 2001 From: Huy Pham <42948410+hpham@users.noreply.github.com> Date: Fri, 20 Dec 2019 09:55:30 -0800 Subject: [PATCH 4/4] copy over wlan config, emane, mobility config, service config, service file config --- daemon/core/gui/coreclient.py | 30 ++++++++++++++++++++++++++++++ daemon/core/gui/graph/graph.py | 1 + daemon/core/gui/widgets.py | 6 +++--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/daemon/core/gui/coreclient.py b/daemon/core/gui/coreclient.py index 530e0ccf..83062983 100644 --- a/daemon/core/gui/coreclient.py +++ b/daemon/core/gui/coreclient.py @@ -909,3 +909,33 @@ class CoreClient: def set_emane_model_config(self, node_id, model, config, interface=None): logging.info("setting emane model config: %s %s %s", node_id, model, interface) self.emane_model_configs[(node_id, model, interface)] = config + + def copy_node_service(self, _from, _to): + services = self.canvas_nodes[_from].core_node.services + self.canvas_nodes[_to].core_node.services[:] = services + + def copy_node_config(self, _from, _to): + node_type = self.canvas_nodes[_from].core_node.type + if node_type == core_pb2.NodeType.DEFAULT: + services = self.canvas_nodes[_from].core_node.services + self.canvas_nodes[_to].core_node.services[:] = services + config = self.service_configs.get(_from) + if config: + self.service_configs[_to] = config + file_configs = self.file_configs.get(_from) + if file_configs: + for key, value in file_configs.items(): + if _to not in self.file_configs: + self.file_configs[_to] = {} + self.file_configs[_to][key] = value + elif node_type == core_pb2.NodeType.WIRELESS_LAN: + config = self.wlan_configs.get(_from) + if config: + self.wlan_configs[_to] = config + config = self.mobility_configs.get(_from) + if config: + self.mobility_configs[_to] = config + elif node_type == core_pb2.NodeType.EMANE: + config = self.emane_model_configs.get(_from) + if config: + self.emane_model_configs[_to] = config diff --git a/daemon/core/gui/graph/graph.py b/daemon/core/gui/graph/graph.py index 36314a53..ead26669 100644 --- a/daemon/core/gui/graph/graph.py +++ b/daemon/core/gui/graph/graph.py @@ -870,6 +870,7 @@ class CanvasGraph(tk.Canvas): copy_map[canvas_nid] = node.id self.core.canvas_nodes[copy.id] = node self.nodes[node.id] = node + self.core.copy_node_config(core_node.id, copy.id) edges = self.nodes[canvas_nid].edges for edge in edges: diff --git a/daemon/core/gui/widgets.py b/daemon/core/gui/widgets.py index 6e8964af..d5257533 100644 --- a/daemon/core/gui/widgets.py +++ b/daemon/core/gui/widgets.py @@ -19,8 +19,8 @@ INT_TYPES = { } -def file_button_click(value): - file_path = filedialog.askopenfilename(title="Select File") +def file_button_click(value, parent): + file_path = filedialog.askopenfilename(title="Select File", parent=parent) if file_path: value.set(file_path) @@ -111,7 +111,7 @@ class ConfigFrame(ttk.Notebook): file_frame.columnconfigure(0, weight=1) entry = ttk.Entry(file_frame, textvariable=value) entry.grid(row=0, column=0, sticky="ew", padx=PADX) - func = partial(file_button_click, value) + func = partial(file_button_click, value, self) button = ttk.Button(file_frame, text="...", command=func) button.grid(row=0, column=1) else: