Exemplo n.º 1
0
    def click_apply(self) -> None:
        error = False

        # update core node
        self.node.name = self.name.get()
        if nutils.has_image(self.node.type):
            self.node.image = self.container_image.get()
        server = self.server.get()
        if nutils.is_container(self.node):
            if server == DEFAULT_SERVER:
                self.node.server = None
            else:
                self.node.server = server

        # set custom icon
        if self.image_file:
            self.node.icon = self.image_file

        # update canvas node
        self.canvas_node.image = self.image

        # update node interface data
        for iface in self.canvas_node.ifaces.values():
            data = self.ifaces[iface.id]
            error = not data.validate(self, iface)
            if error:
                break

        # redraw
        if not error:
            self.canvas_node.redraw()
            self.destroy()
Exemplo n.º 2
0
 def create_node(self, x: float, y: float, node_type: NodeType,
                 model: str) -> Optional[Node]:
     """
     Add node, with information filled in, to grpc manager
     """
     node_id = self.next_node_id()
     position = Position(x=x, y=y)
     image = None
     if nutils.has_image(node_type):
         image = "ubuntu:latest"
     emane = None
     if node_type == NodeType.EMANE:
         if not self.emane_models:
             dialog = EmaneInstallDialog(self.app)
             dialog.show()
             return
         emane = self.emane_models[0]
         name = f"emane{node_id}"
     elif node_type == NodeType.WIRELESS_LAN:
         name = f"wlan{node_id}"
     elif node_type in [NodeType.RJ45, NodeType.TUNNEL]:
         name = "unassigned"
     else:
         name = f"n{node_id}"
     node = Node(
         id=node_id,
         type=node_type,
         name=name,
         model=model,
         position=position,
         image=image,
         emane=emane,
     )
     if nutils.is_custom(node):
         services = nutils.get_custom_services(self.app.guiconfig, model)
         node.config_services = set(services)
     # assign default services to CORE node
     else:
         services = self.session.default_services.get(model)
         if services:
             node.config_services = set(services)
     logger.info(
         "add node(%s) to session(%s), coordinates(%s, %s)",
         node.name,
         self.session.id,
         x,
         y,
     )
     self.session.nodes[node.id] = node
     return node
Exemplo n.º 3
0
 def draw(self) -> None:
     self.columnconfigure(0, weight=1)
     node = self.canvas_node.core_node
     frame = DetailsFrame(self)
     frame.grid(sticky=tk.EW)
     frame.add_detail("ID", str(node.id))
     frame.add_detail("Name", node.name)
     if nutils.is_model(node):
         frame.add_detail("Type", node.model)
     if nutils.is_container(node):
         for index, service in enumerate(sorted(node.services)):
             if index == 0:
                 frame.add_detail("Services", service)
             else:
                 frame.add_detail("", service)
     if node.type == NodeType.EMANE:
         emane = "".join(node.emane.split("_")[1:])
         frame.add_detail("EMANE", emane)
     if nutils.has_image(node.type):
         frame.add_detail("Image", node.image)
     if nutils.is_container(node):
         server = node.server if node.server else "localhost"
         frame.add_detail("Server", server)
Exemplo n.º 4
0
    def draw(self) -> None:
        self.top.columnconfigure(0, weight=1)
        row = 0

        # field states
        state = tk.DISABLED if self.app.core.is_runtime() else tk.NORMAL
        combo_state = tk.DISABLED if self.app.core.is_runtime() else "readonly"

        # field frame
        frame = ttk.Frame(self.top)
        frame.grid(sticky=tk.EW)
        frame.columnconfigure(1, weight=1)

        # icon field
        label = ttk.Label(frame, text="Icon")
        label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY)
        self.image_button = ttk.Button(
            frame,
            text="Icon",
            image=self.image,
            compound=tk.NONE,
            command=self.click_icon,
        )
        self.image_button.grid(row=row, column=1, sticky=tk.EW)
        row += 1

        # name field
        label = ttk.Label(frame, text="Name")
        label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY)
        entry = validation.NodeNameEntry(frame,
                                         textvariable=self.name,
                                         state=state)
        entry.grid(row=row, column=1, sticky=tk.EW)
        row += 1

        # node type field
        if nutils.is_model(self.node):
            label = ttk.Label(frame, text="Type")
            label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY)
            combobox = ttk.Combobox(
                frame,
                textvariable=self.type,
                values=list(nutils.NODE_MODELS),
                state=combo_state,
            )
            combobox.grid(row=row, column=1, sticky=tk.EW)
            row += 1

        # container image field
        if nutils.has_image(self.node.type):
            label = ttk.Label(frame, text="Image")
            label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY)
            entry = ttk.Entry(frame,
                              textvariable=self.container_image,
                              state=state)
            entry.grid(row=row, column=1, sticky=tk.EW)
            row += 1

        if nutils.is_container(self.node):
            # server
            frame.grid(sticky=tk.EW)
            frame.columnconfigure(1, weight=1)
            label = ttk.Label(frame, text="Server")
            label.grid(row=row, column=0, sticky=tk.EW, padx=PADX, pady=PADY)
            servers = [DEFAULT_SERVER]
            servers.extend(list(sorted(self.app.core.servers.keys())))
            combobox = ttk.Combobox(frame,
                                    textvariable=self.server,
                                    values=servers,
                                    state=combo_state)
            combobox.grid(row=row, column=1, sticky=tk.EW)
            row += 1

        if nutils.is_rj45(self.node):
            ifaces = self.app.core.client.get_ifaces()
            logger.debug("host machine available interfaces: %s", ifaces)
            ifaces_scroll = ListboxScroll(frame)
            ifaces_scroll.listbox.config(state=state)
            ifaces_scroll.grid(row=row,
                               column=0,
                               columnspan=2,
                               sticky=tk.EW,
                               padx=PADX,
                               pady=PADY)
            for inf in sorted(ifaces):
                ifaces_scroll.listbox.insert(tk.END, inf)
            row += 1
            ifaces_scroll.listbox.bind("<<ListboxSelect>>", self.iface_select)

        # interfaces
        if self.canvas_node.ifaces:
            self.draw_ifaces()

        self.draw_spacer()
        self.draw_buttons()