def draw_proxies(self, graph, resolve_dns=False): method_nodes = {} drawn_edges = [] for portnum, proxies in sorted(self.ports.items()): for proxy in proxies: (method, logic, dst_node, dst_port) = proxy dst_node.draw(graph, resolve_dns) mnode_name = 'method_%s' % mk_dot_name('%s_%s' % (str(self.ip), method)) if mnode_name not in method_nodes: # Make a new method node mnode = pd.Node(mnode_name) mnode.set('shape', 'record') mnode.set('style', 'rounded') mnode.set('color', 'gray') # we use it to track things for us mnode.logics = [logic] graph.add_node(mnode) method_nodes[mnode_name] = mnode else: mnode = method_nodes[mnode_name] if logic not in mnode.logics: mnode.logics.append(logic) left_label = '<m_%s>%s' % (method, method) label_array = [] for logic in mnode.logics: label_array.append('<l_%s>%s' % (mk_dot_name(logic), logic)) right_label = '|'.join(label_array) label = '{%s|{%s}}' % (left_label, right_label) mnode.set('label', label) # Draw edge from mother node to this method if not present already src_from = '%s:p_%s' % (self.nodename, portnum) src_to = '%s:m_%s' % (mnode_name, mk_dot_name(method)) if (src_from, src_to) not in drawn_edges: graph.add_edge(pd.Edge(src_from, src_to, dir='none')) drawn_edges.append((src_from, src_to)) # Draw edge from this logic to the destination node/port tgt_from = '%s:l_%s' % (mnode_name, mk_dot_name(logic)) if dst_node.cluster and dst_node.cluster.lb_node: tgt_to = '%s:p_%s' % (dst_node.cluster.lb_node, dst_port) else: tgt_to = '%s:p_%s' % (dst_node.nodename, dst_port) if (tgt_from, tgt_to) not in drawn_edges: graph.add_edge(pd.Edge(tgt_from, tgt_to, dir='none')) drawn_edges.append((tgt_from, tgt_to))
def TreeToGraph(i, father_node, g): """ 给定起始节点的名字i(用数字记录节点名)、节点、和 标签名字 用i+1,和子节点及标签名作为递归输入 返回的是i和子节点的名称 将所有的节点遍历完成后返回 :param i: 为了避免迭代时子节点重新从零开始计,这里传入参数i用来累加迭代 :param node:根节点 :param df:根节点的数据 """ from pydotplus import graphviz if father_node.attr == None: node_label = 'Node: %d\n好瓜: %s' % (i, father_node.label) else: node_label = 'Node: %d\n好瓜: %s\n属性: %s' % (i, father_node.label, father_node.attr) father_node_name = i node_graph_obj = graphviz.Node(father_node_name, label=node_label, fontname='SimHei') # 创建graphviz.Node对象 g.add_node(node_graph_obj) # 将创建的graphviz节点对象添加到graphviz点图Dot对象 if father_node.attr != None: for value in father_node.attr_down: child_node = father_node.attr_down[value] i, child_node_name = TreeToGraph(i + 1, child_node, g) g_edge = graphviz.Edge(father_node_name, child_node_name, label=value, fontname='SimHei') # 创建edge对象,将父节点与子节点进行连接 g.add_edge(g_edge) # 将edge对象加入到点图dot对象中 return i, father_node_name
def TreeToGraph(i, g, root): '''build a graph from root node via @param i: node number in this tree @param g: pydotplus.graphviz.Dot() object @param root: the root node @return i: node number after modified @return g: pydotplus.graphviz.Dot() object after modified @return g_node: the current root node in graphviz ''' try: from pydotplus import graphviz except ImportError: print("module pydotplus.graphviz not found") if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜%s\nattribute:%s" % (i, root.label, root.attr) g_node = i g.add_node( graphviz.Node(g_node, label=g_node_label, fontname="Microsoft YaHei", fontsize=10)) for value in list(root.sub_attr): i, g_child = TreeToGraph(i + 1, g, root.sub_attr[value]) g.add_edge( graphviz.Edge(g_node, g_child, label=value, fontname="Microsoft YaHei", fontsize=10)) return i, g_node
def TreeToGraph(i, g, root): """ build a graph from root on @param i: node number in this tree @param g: pydotplus.graphviz.Dot() object @param root: the root node @return i: node number after modified @return g: pydotplus.graphviz.Dot() object after modified @return g_node: the current root node in graphviz """ try: from pydotplus import graphviz except ImportError: print("module pydotplus.graphviz not found") if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜:%s\n属性:%s" % (i, root.label, root.attr) g_node = i g.add_node(graphviz.Node(g_node, label=g_node_label, fontname="FangSong")) for value in list(root.attr_down): i, g_child = TreeToGraph(i + 1, g, root.attr_down[value]) g.add_edge(graphviz.Edge(g_node, g_child, label=value, fontname="FangSong")) return i, g_node
def _add_pydot_edges(graph, node_dict, edge_set, n, ilev, level): """ Parameters ---------- graph node_dict edge_set n ilev level Returns ------- """ if ilev == level: return if len(n.dependencies) > 0: for m in n.dependencies: if m not in node_dict: continue tpl = (n.name, m.name) if tpl not in edge_set: edge_set.add(tpl) edge = pydot.Edge(node_dict[n], node_dict[m]) graph.add_edge(edge) _add_pydot_edges(graph, node_dict, edge_set, m, ilev + 1, level) return
def tree2graph(i, g, root): ''' build a graph from root Inputs: i: node id in this tree g: pydotplus.graphviz.Dot() object root: the root node Outputs: i: node id after modified g: pydotplus.graphviz.Dot() object after modified g_node: the current root node in graphviz ''' try: from pydotplus import graphviz except ImportError: print("module pydotplus.graphviz not found") if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜:%s\n属性:%s" % (i, root.label, root.attr) g_node = i g.add_node(graphviz.Node(g_node, label=g_node_label)) for value in sorted(root.branch): i, g_child = tree2graph(i + 1, g, root.branch[value]) g.add_edge(graphviz.Edge(g_node, g_child, label=value)) return i, g_node
def TreeToGraph(root, i, g): if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜:%s\n属性:%s\n" % (i, root.label, root.attr) g_node = i g.add_node(graphviz.Node(g_node, label=g_node_label)) for value in list(root.attr_down): i, g_child = TreeToGraph(root.attr_down[value], i+1, g) g.add_edge(graphviz.Edge(g_node, g_child, label=value)) return i, g_node
def __fill_graph(self, node, father, branch, g, label_title=None): if node.attr is None: if label_title is not None: title = "{}: {}".format(label_title, node.label) else: title = "{}".format(node.label) else: title = "{}".format(node.attr) g_node = graphviz.Node(self.__seq, label=title) g.add_node(g_node) if father is not None: g.add_edge(graphviz.Edge(father, g_node, label=branch)) for val, child in node.branches.items(): self.__seq += 1 self.__fill_graph(child, g_node, val, g, label_title)
def to_pydot(dag, filename='mygraph.png'): # Create the graph graph = pydot.Dot(graph_type='digraph') # Add the nodes node_dict = {} for n in dag.nodelist: pydotnode = pydot.Node(n.name, style="filled", fillcolor="red") node_dict[n] = pydotnode graph.add_node(pydotnode) # Add the edges for n in dag.nodelist: for m in n.dependencies: graph.add_edge(pydot.Edge(node_dict[n], node_dict[m])) graph.write_png(filename) return
def TreeToGraph(i, g, root): try: from pydotplus import graphviz except ImportError: print("module pydotplus.graphviz not found") if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜:%s\n属性:%s" % (i, root.label, root.attr) g_node = i g.add_node(graphviz.Node(g_node, label=g_node_label, fontname="FangSong")) for value in list(root.attr_down): i, g_child = TreeToGraph(i + 1, g, root.attr_down[value]) g.add_edge(graphviz.Edge(g_node, g_child, label=value, fontname="FangSong")) return i, g_node
def TreeToGraph(i, g, root): ''' @param i: 树中节点的数目 @param g: pydotplus.graphviz.Dot() object @param root: 根节点 @return i: node number after modified @return g: pydotplus.graphviz.Dot() object after modified @return g_node: the current root node in graphviz ''' if root.attr == None: g_node_label = "Node:%d\n好瓜:%s" % (i, root.label) else: g_node_label = "Node:%d\n好瓜:%s\n属性:%s" % (i, root.label, root.attr) g_node = i g.add_node(graphviz.Node(g_node, label=g_node_label)) for value in list(root.attr_down): i, g_child = TreeToGraph(i + 1, g, root.attr_down[value]) g.add_edge(graphviz.Edge(g_node, g_child, label=value)) return i, g_node
def to_pydot(dag, filename="mygraph.png"): """Create a png file of a Directed Acyclic Graph Parameters ---------- dag : object directed acyclic graph filename : str path of the graph png Returns ------- """ # evaluate if pydot plus is installed if pydot is None: msg = "pydotplus must be installed to use " + "{}".format( make_plots.__module__ + "." + make_plots.__name__) raise ModuleNotFoundError(msg) # Create the graph graph = pydot.Dot(graph_type="digraph") # Add the nodes node_dict = {} for n in dag.nodelist: pydotnode = pydot.Node(n.name, style="filled", fillcolor="red") node_dict[n] = pydotnode graph.add_node(pydotnode) # Add the edges for n in dag.nodelist: for m in n.dependencies: graph.add_edge(pydot.Edge(node_dict[n], node_dict[m])) graph.write_png(filename) return
def draw_key_paths(c, paths, graph, show_trust): seenactors = {} # make a subgraph for toplevel nodes tl_subgraph = pd.Subgraph('cluster_toplevel') tl_subgraph.set('color', 'white') for path in paths: signer = None for actor in path: if actor not in seenactors.keys(): anode = make_graph_node(c, actor, show_trust) seenactors[actor] = anode if signer is None: tl_subgraph.add_node(anode) else: graph.add_node(anode) else: anode = seenactors[actor] if signer is not None: graph.add_edge(pd.Edge(signer, anode)) signer = anode graph.add_subgraph(tl_subgraph)