예제 #1
0
    def paste(self):
        logging.debug("copy")
        # maps original node canvas id to copy node canvas id
        copy_map = {}
        # the edges that will be copy over
        to_copy_edges = []
        for canvas_nid in self.to_copy:
            core_node = self.nodes[canvas_nid].core_node
            actual_x = core_node.position.x + 50
            actual_y = core_node.position.y + 50
            scaled_x, scaled_y = self.get_scaled_coords(actual_x, actual_y)

            copy = self.core.create_node(actual_x, actual_y, core_node.type,
                                         core_node.model)
            node = CanvasNode(self.master, scaled_x, scaled_y, copy,
                              self.nodes[canvas_nid].image)
            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:
                if edge.src not in self.to_copy or edge.dst not in self.to_copy:
                    if canvas_nid == edge.src:
                        self.create_edge(node, self.nodes[edge.dst])
                    elif canvas_nid == edge.dst:
                        self.create_edge(self.nodes[edge.src], node)
                else:
                    to_copy_edges.append(tuple([edge.src, edge.dst]))
        for e in to_copy_edges:
            source_node_copy = self.nodes[copy_map[e[0]]]
            dest_node_copy = self.nodes[copy_map[e[1]]]
            self.create_edge(source_node_copy, dest_node_copy)
예제 #2
0
파일: manager.py 프로젝트: ullahhab/core
 def add_core_node(self, core_node: Node) -> None:
     # get canvas tab for node
     canvas_id = core_node.canvas if core_node.canvas > 0 else 1
     logging.info("adding core node canvas(%s): %s", core_node.name, canvas_id)
     canvas = self.get(canvas_id)
     image = nutils.get_icon(core_node, self.app)
     x = core_node.position.x
     y = core_node.position.y
     node = CanvasNode(self.app, canvas, x, y, core_node, image)
     canvas.nodes[node.id] = node
     self.core.set_canvas_node(core_node, node)
예제 #3
0
 def add_node(self, x, y):
     if self.selected is None or self.selected in self.shapes:
         actual_x, actual_y = self.get_actual_coords(x, y)
         core_node = self.core.create_node(actual_x, actual_y,
                                           self.node_draw.node_type,
                                           self.node_draw.model)
         node = CanvasNode(self.master, x, y, core_node,
                           self.node_draw.image)
         self.core.canvas_nodes[core_node.id] = node
         self.nodes[node.id] = node
         return node
예제 #4
0
 def add_core_node(self, core_node: Node) -> None:
     logging.debug("adding node: %s", core_node)
     # if the gui can't find node's image, default to the "edit-node" image
     image = NodeUtils.node_image(core_node, self.app.guiconfig,
                                  self.app.app_scale)
     if not image:
         image = self.app.get_icon(ImageEnum.EDITNODE, ICON_SIZE)
     x = core_node.position.x
     y = core_node.position.y
     node = CanvasNode(self.app, x, y, core_node, image)
     self.nodes[node.id] = node
     self.core.set_canvas_node(core_node, node)
예제 #5
0
 def add_node(self, x: float, y: float) -> None:
     if self.selected is not None and self.selected not in self.shapes:
         return
     actual_x, actual_y = self.get_actual_coords(x, y)
     core_node = self.core.create_node(
         actual_x,
         actual_y,
         self.manager.node_draw.node_type,
         self.manager.node_draw.model,
     )
     if not core_node:
         return
     core_node.canvas = self.id
     node = CanvasNode(self.app, self, x, y, core_node,
                       self.manager.node_draw.image)
     self.nodes[node.id] = node
     self.core.set_canvas_node(core_node, node)
예제 #6
0
 def create_iface(self, canvas_node: CanvasNode) -> Interface:
     node = canvas_node.core_node
     ip4, ip6 = self.ifaces_manager.get_ips(node)
     ip4_mask = self.ifaces_manager.ip4_mask
     ip6_mask = self.ifaces_manager.ip6_mask
     iface_id = canvas_node.next_iface_id()
     name = f"eth{iface_id}"
     iface = Interface(
         id=iface_id,
         name=name,
         ip4=ip4,
         ip4_mask=ip4_mask,
         ip6=ip6,
         ip6_mask=ip6_mask,
     )
     logging.info("create node(%s) interface(%s)", node.name, iface)
     return iface
예제 #7
0
 def add_node(self, x: float, y: float) -> None:
     if self.selected is not None and self.selected not in self.shapes:
         return
     actual_x, actual_y = self.get_actual_coords(x, y)
     core_node = self.core.create_node(actual_x, actual_y,
                                       self.node_draw.node_type,
                                       self.node_draw.model)
     if not core_node:
         return
     try:
         self.node_draw.image = Images.get(
             self.node_draw.image_enum, int(ICON_SIZE * self.app.app_scale))
     except AttributeError:
         self.node_draw.image = Images.get_custom(
             self.node_draw.image_file, int(ICON_SIZE * self.app.app_scale))
     node = CanvasNode(self.app, x, y, core_node, self.node_draw.image)
     self.core.canvas_nodes[core_node.id] = node
     self.nodes[node.id] = node
예제 #8
0
 def add_node(self, x: float, y: float) -> None:
     if self.selected is not None and self.selected not in self.shapes:
         return
     actual_x, actual_y = self.get_actual_coords(x, y)
     core_node = self.core.create_node(actual_x, actual_y,
                                       self.node_draw.node_type,
                                       self.node_draw.model)
     if not core_node:
         return
     try:
         image_enum = self.node_draw.image_enum
         self.node_draw.image = self.app.get_icon(image_enum, ICON_SIZE)
     except AttributeError:
         image_file = self.node_draw.image_file
         self.node_draw.image = self.app.get_custom_icon(
             image_file, ICON_SIZE)
     node = CanvasNode(self.app, x, y, core_node, self.node_draw.image)
     self.nodes[node.id] = node
     self.core.set_canvas_node(core_node, node)
예제 #9
0
 def create_iface(self, canvas_node: CanvasNode, wireless_link: bool) -> Interface:
     node = canvas_node.core_node
     ip4, ip6 = self.get_ips(node)
     if wireless_link:
         ip4_mask = WIRELESS_IP4_MASK
         ip6_mask = WIRELESS_IP6_MASK
     else:
         ip4_mask = IP4_MASK
         ip6_mask = IP6_MASK
     iface_id = canvas_node.next_iface_id()
     name = f"eth{iface_id}"
     iface = Interface(
         id=iface_id,
         name=name,
         ip4=ip4,
         ip4_mask=ip4_mask,
         ip6=ip6,
         ip6_mask=ip6_mask,
     )
     logger.info("create node(%s) interface(%s)", node.name, iface)
     return iface
예제 #10
0
 def create_interface(self, canvas_node: CanvasNode) -> core_pb2.Interface:
     node = canvas_node.core_node
     ip4, ip6 = self.interfaces_manager.get_ips(node)
     ip4_mask = self.interfaces_manager.ip4_mask
     ip6_mask = self.interfaces_manager.ip6_mask
     interface_id = canvas_node.next_interface_id()
     name = f"eth{interface_id}"
     interface = core_pb2.Interface(
         id=interface_id,
         name=name,
         ip4=ip4,
         ip4mask=ip4_mask,
         ip6=ip6,
         ip6mask=ip6_mask,
     )
     logging.info(
         "create node(%s) interface(%s) IPv4(%s) IPv6(%s)",
         node.name,
         interface.name,
         interface.ip4,
         interface.ip6,
     )
     return interface
예제 #11
0
    def paste(self):
        if self.core.is_runtime():
            logging.info("paste is disabled during runtime state")
            return
        # maps original node canvas id to copy node canvas id
        copy_map = {}
        # the edges that will be copy over
        to_copy_edges = []
        for canvas_node in self.to_copy:
            core_node = canvas_node.core_node
            actual_x = core_node.position.x + 50
            actual_y = core_node.position.y + 50
            scaled_x, scaled_y = self.get_scaled_coords(actual_x, actual_y)
            copy = self.core.create_node(actual_x, actual_y, core_node.type,
                                         core_node.model)
            if not copy:
                continue
            node = CanvasNode(self.app, scaled_x, scaled_y, copy,
                              canvas_node.image)

            # copy configurations and services
            node.core_node.services[:] = canvas_node.core_node.services
            node.core_node.config_services[:] = canvas_node.core_node.config_services
            node.emane_model_configs = deepcopy(
                canvas_node.emane_model_configs)
            node.wlan_config = deepcopy(canvas_node.wlan_config)
            node.mobility_config = deepcopy(canvas_node.mobility_config)
            node.service_configs = deepcopy(canvas_node.service_configs)
            node.service_file_configs = deepcopy(
                canvas_node.service_file_configs)
            node.config_service_configs = deepcopy(
                canvas_node.config_service_configs)

            copy_map[canvas_node.id] = node.id
            self.core.canvas_nodes[copy.id] = node
            self.nodes[node.id] = node
            for edge in canvas_node.edges:
                if edge.src not in self.to_copy or edge.dst not in self.to_copy:
                    if canvas_node.id == edge.src:
                        dst_node = self.nodes[edge.dst]
                        self.create_edge(node, dst_node)
                    elif canvas_node.id == edge.dst:
                        src_node = self.nodes[edge.src]
                        self.create_edge(src_node, node)
                else:
                    to_copy_edges.append(edge)

        # copy link and link config
        for edge in to_copy_edges:
            src_node_id = copy_map[edge.token[0]]
            dst_node_id = copy_map[edge.token[1]]
            src_node_copy = self.nodes[src_node_id]
            dst_node_copy = self.nodes[dst_node_id]
            self.create_edge(src_node_copy, dst_node_copy)
            token = create_edge_token(src_node_copy.id, dst_node_copy.id)
            copy_edge = self.edges[token]
            copy_link = copy_edge.link
            options = edge.link.options
            copy_link.options.CopyFrom(options)
            interface_one = None
            if copy_link.HasField("interface_one"):
                interface_one = copy_link.interface_one.id
            interface_two = None
            if copy_link.HasField("interface_two"):
                interface_two = copy_link.interface_two.id
            if not options.unidirectional:
                copy_edge.asymmetric_link = None
            else:
                asym_interface_one = None
                if interface_one:
                    asym_interface_one = core_pb2.Interface(id=interface_one)
                asym_interface_two = None
                if interface_two:
                    asym_interface_two = core_pb2.Interface(id=interface_two)
                copy_edge.asymmetric_link = core_pb2.Link(
                    node_one_id=copy_link.node_two_id,
                    node_two_id=copy_link.node_one_id,
                    interface_one=asym_interface_one,
                    interface_two=asym_interface_two,
                    options=edge.asymmetric_link.options,
                )
            self.itemconfig(
                copy_edge.id,
                width=self.itemcget(edge.id, "width"),
                fill=self.itemcget(edge.id, "fill"),
            )
        self.tag_raise(tags.NODE)
예제 #12
0
    def draw_session(self, session: core_pb2.Session):
        """
        Draw existing session.
        """
        # draw existing nodes
        for core_node in session.nodes:
            logging.debug("drawing node %s", core_node)
            # peer to peer node is not drawn on the GUI
            if NodeUtils.is_ignore_node(core_node.type):
                continue
            image = NodeUtils.node_image(core_node, self.app.guiconfig,
                                         self.app.app_scale)
            # if the gui can't find node's image, default to the "edit-node" image
            if not image:
                image = Images.get(ImageEnum.EDITNODE,
                                   int(ICON_SIZE * self.app.app_scale))
            x = core_node.position.x
            y = core_node.position.y
            node = CanvasNode(self.app, x, y, core_node, image)
            self.nodes[node.id] = node
            self.core.canvas_nodes[core_node.id] = node

        # draw existing links
        for link in session.links:
            logging.debug("drawing link: %s", link)
            canvas_node_one = self.core.canvas_nodes[link.node_one_id]
            node_one = canvas_node_one.core_node
            canvas_node_two = self.core.canvas_nodes[link.node_two_id]
            node_two = canvas_node_two.core_node
            token = create_edge_token(canvas_node_one.id, canvas_node_two.id)

            if link.type == core_pb2.LinkType.WIRELESS:
                self.add_wireless_edge(canvas_node_one, canvas_node_two, link)
            else:
                if token not in self.edges:
                    src_pos = (node_one.position.x, node_one.position.y)
                    dst_pos = (node_two.position.x, node_two.position.y)
                    edge = CanvasEdge(self, canvas_node_one.id, src_pos,
                                      dst_pos)
                    edge.token = token
                    edge.dst = canvas_node_two.id
                    edge.set_link(link)
                    edge.check_wireless()
                    canvas_node_one.edges.add(edge)
                    canvas_node_two.edges.add(edge)
                    self.edges[edge.token] = edge
                    self.core.links[edge.token] = edge
                    if link.HasField("interface_one"):
                        canvas_node_one.interfaces.append(link.interface_one)
                        edge.src_interface = link.interface_one
                    if link.HasField("interface_two"):
                        canvas_node_two.interfaces.append(link.interface_two)
                        edge.dst_interface = link.interface_two
                elif link.options.unidirectional:
                    edge = self.edges[token]
                    edge.asymmetric_link = link
                else:
                    logging.error("duplicate link received: %s", link)

        # raise the nodes so they on top of the links
        self.tag_raise(tags.NODE)
예제 #13
0
    def draw_session(self, session):
        """
        Draw existing session.

        :return: nothing
        """
        # draw existing nodes
        for core_node in session.nodes:
            # peer to peer node is not drawn on the GUI
            if NodeUtils.is_ignore_node(core_node.type):
                continue

            # draw nodes on the canvas
            logging.info("drawing core node: %s", core_node)
            image = NodeUtils.node_icon(core_node.type, core_node.model)
            if core_node.icon:
                try:
                    image = Images.create(core_node.icon, nodeutils.ICON_SIZE)
                except OSError:
                    logging.error("invalid icon: %s", core_node.icon)

            x = core_node.position.x
            y = core_node.position.y
            node = CanvasNode(self.master, x, y, core_node, image)
            self.nodes[node.id] = node
            self.core.canvas_nodes[core_node.id] = node

        # draw existing links
        for link in session.links:
            logging.info("drawing link: %s", link)
            canvas_node_one = self.core.canvas_nodes[link.node_one_id]
            node_one = canvas_node_one.core_node
            canvas_node_two = self.core.canvas_nodes[link.node_two_id]
            node_two = canvas_node_two.core_node
            token = tuple(sorted((canvas_node_one.id, canvas_node_two.id)))

            if link.type == core_pb2.LinkType.WIRELESS:
                self.add_wireless_edge(canvas_node_one, canvas_node_two)
            else:
                if token not in self.edges:
                    edge = CanvasEdge(
                        node_one.position.x,
                        node_one.position.y,
                        node_two.position.x,
                        node_two.position.y,
                        canvas_node_one.id,
                        self,
                    )
                    edge.token = token
                    edge.dst = canvas_node_two.id
                    edge.set_link(link)
                    edge.check_wireless()
                    canvas_node_one.edges.add(edge)
                    canvas_node_two.edges.add(edge)
                    self.edges[edge.token] = edge
                    self.core.links[edge.token] = edge
                    if link.HasField("interface_one"):
                        canvas_node_one.interfaces.append(link.interface_one)
                    if link.HasField("interface_two"):
                        canvas_node_two.interfaces.append(link.interface_two)
                elif link.options.unidirectional:
                    edge = self.edges[token]
                    edge.asymmetric_link = link
                else:
                    logging.error("duplicate link received: %s", link)

        # raise the nodes so they on top of the links
        self.tag_raise(tags.NODE)
예제 #14
0
    def paste(self) -> None:
        if self.core.is_runtime():
            logging.debug("paste is disabled during runtime state")
            return
        # maps original node canvas id to copy node canvas id
        copy_map = {}
        # the edges that will be copy over
        to_copy_edges = set()
        to_copy_ids = {x.id for x in self.to_copy}
        for canvas_node in self.to_copy:
            core_node = canvas_node.core_node
            actual_x = core_node.position.x + 50
            actual_y = core_node.position.y + 50
            scaled_x, scaled_y = self.get_scaled_coords(actual_x, actual_y)
            copy = self.core.create_node(actual_x, actual_y, core_node.type,
                                         core_node.model)
            if not copy:
                continue
            node = CanvasNode(self.app, scaled_x, scaled_y, copy,
                              canvas_node.image)
            # copy configurations and services
            node.core_node.services = core_node.services.copy()
            node.core_node.config_services = core_node.config_services.copy()
            node.core_node.emane_model_configs = deepcopy(
                core_node.emane_model_configs)
            node.core_node.wlan_config = deepcopy(core_node.wlan_config)
            node.core_node.mobility_config = deepcopy(
                core_node.mobility_config)
            node.core_node.service_configs = deepcopy(
                core_node.service_configs)
            node.core_node.service_file_configs = deepcopy(
                core_node.service_file_configs)
            node.core_node.config_service_configs = deepcopy(
                core_node.config_service_configs)

            copy_map[canvas_node.id] = node.id
            self.nodes[node.id] = node
            self.core.set_canvas_node(copy, node)
            for edge in canvas_node.edges:
                if edge.src not in to_copy_ids or edge.dst not in to_copy_ids:
                    if canvas_node.id == edge.src:
                        dst_node = self.nodes[edge.dst]
                        self.create_edge(node, dst_node)
                        token = create_edge_token(node.id, dst_node.id)
                    elif canvas_node.id == edge.dst:
                        src_node = self.nodes[edge.src]
                        self.create_edge(src_node, node)
                        token = create_edge_token(src_node.id, node.id)
                    copy_edge = self.edges[token]
                    copy_link = copy_edge.link
                    iface1_id = copy_link.iface1.id if copy_link.iface1 else None
                    iface2_id = copy_link.iface2.id if copy_link.iface2 else None
                    options = edge.link.options
                    if options:
                        copy_edge.link.options = deepcopy(options)
                    if options and options.unidirectional:
                        asym_iface1 = None
                        if iface1_id is not None:
                            asym_iface1 = Interface(id=iface1_id)
                        asym_iface2 = None
                        if iface2_id is not None:
                            asym_iface2 = Interface(id=iface2_id)
                        copy_edge.asymmetric_link = Link(
                            node1_id=copy_link.node2_id,
                            node2_id=copy_link.node1_id,
                            iface1=asym_iface2,
                            iface2=asym_iface1,
                            options=deepcopy(edge.asymmetric_link.options),
                        )
                    copy_edge.redraw()
                else:
                    to_copy_edges.add(edge)

        # copy link and link config
        for edge in to_copy_edges:
            src_node_id = copy_map[edge.token[0]]
            dst_node_id = copy_map[edge.token[1]]
            src_node_copy = self.nodes[src_node_id]
            dst_node_copy = self.nodes[dst_node_id]
            self.create_edge(src_node_copy, dst_node_copy)
            token = create_edge_token(src_node_copy.id, dst_node_copy.id)
            copy_edge = self.edges[token]
            copy_link = copy_edge.link
            iface1_id = copy_link.iface1.id if copy_link.iface1 else None
            iface2_id = copy_link.iface2.id if copy_link.iface2 else None
            options = edge.link.options
            if options:
                copy_link.options = deepcopy(options)
            if options and options.unidirectional:
                asym_iface1 = None
                if iface1_id is not None:
                    asym_iface1 = Interface(id=iface1_id)
                asym_iface2 = None
                if iface2_id is not None:
                    asym_iface2 = Interface(id=iface2_id)
                copy_edge.asymmetric_link = Link(
                    node1_id=copy_link.node2_id,
                    node2_id=copy_link.node1_id,
                    iface1=asym_iface2,
                    iface2=asym_iface1,
                    options=deepcopy(edge.asymmetric_link.options),
                )
            copy_edge.redraw()
            self.itemconfig(
                copy_edge.id,
                width=self.itemcget(edge.id, "width"),
                fill=self.itemcget(edge.id, "fill"),
            )
        self.tag_raise(tags.NODE)
예제 #15
0
    def paste(self):
        if self.app.core.is_runtime():
            logging.info("paste is disabled during runtime state")
            return
        # maps original node canvas id to copy node canvas id
        copy_map = {}
        # the edges that will be copy over
        to_copy_edges = []
        for canvas_nid in self.to_copy:
            core_node = self.nodes[canvas_nid].core_node
            actual_x = core_node.position.x + 50
            actual_y = core_node.position.y + 50
            scaled_x, scaled_y = self.get_scaled_coords(actual_x, actual_y)

            copy = self.core.create_node(actual_x, actual_y, core_node.type,
                                         core_node.model)
            node = CanvasNode(self.master, scaled_x, scaled_y, copy,
                              self.nodes[canvas_nid].image)

            # add new node to modified_service_nodes set if that set contains the to_copy node
            if self.app.core.service_been_modified(core_node.id):
                self.app.core.modified_service_nodes.add(copy.id)

            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:
                if edge.src not in self.to_copy or edge.dst not in self.to_copy:
                    if canvas_nid == edge.src:
                        self.create_edge(node, self.nodes[edge.dst])
                    elif canvas_nid == edge.dst:
                        self.create_edge(self.nodes[edge.src], node)
                else:
                    to_copy_edges.append(edge)
        # copy link and link config
        for edge in to_copy_edges:
            source_node_copy = self.nodes[copy_map[edge.token[0]]]
            dest_node_copy = self.nodes[copy_map[edge.token[1]]]
            self.create_edge(source_node_copy, dest_node_copy)
            copy_edge = self.edges[EdgeUtils.get_token(source_node_copy.id,
                                                       dest_node_copy.id)]
            copy_link = copy_edge.link
            options = edge.link.options
            copy_link.options.CopyFrom(options)
            interface_one = None
            if copy_link.HasField("interface_one"):
                interface_one = copy_link.interface_one.id
            interface_two = None
            if copy_link.HasField("interface_two"):
                interface_two = copy_link.interface_two.id
            if not options.unidirectional:
                copy_edge.asymmetric_link = None
            else:
                asym_interface_one = None
                if interface_one:
                    asym_interface_one = core_pb2.Interface(id=interface_one)
                asym_interface_two = None
                if interface_two:
                    asym_interface_two = core_pb2.Interface(id=interface_two)
                copy_edge.asymmetric_link = core_pb2.Link(
                    node_one_id=copy_link.node_two_id,
                    node_two_id=copy_link.node_one_id,
                    interface_one=asym_interface_one,
                    interface_two=asym_interface_two,
                    options=edge.asymmetric_link.options,
                )
            self.itemconfig(
                copy_edge.id,
                width=self.itemcget(edge.id, "width"),
                fill=self.itemcget(edge.id, "fill"),
            )