Example #1
0
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
Example #2
0
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
Example #3
0
def _add_pydot_nodes(graph, node_dict, n, ilev, level):
    """

    Parameters
    ----------
    graph
    node_dict
    n
    ilev
    level

    Returns
    -------

    """
    if ilev == level:
        return

    if n in node_dict:
        return

    ttl = os.path.basename(n.name)
    pydotnode = pydot.Node(ttl, style="filled", fillcolor="red", label=ttl)
    node_dict[n] = pydotnode
    graph.add_node(pydotnode)
    if len(n.dependencies) > 0:
        for m in n.dependencies:
            _add_pydot_nodes(graph, node_dict, m, ilev + 1, level)
    return
Example #4
0
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
Example #5
0
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
Example #6
0
    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))
Example #7
0
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
Example #8
0
def add_pydot_nodes(graph, node_dict, n, ilev, level):

    if ilev == level:
        return

    if n in node_dict:
        return
    ttl = os.path.basename(n.name)
    pydotnode = pydot.Node(ttl, style="filled", fillcolor="red")
    node_dict[n] = pydotnode
    graph.add_node(pydotnode)
    if len(n.dependencies) > 0:
        for m in n.dependencies:
            add_pydot_nodes(graph, node_dict, m, ilev + 1, level)
    return
Example #9
0
def make_graph_node(c, p_rowid, show_trust=False):
    c.execute(
        '''SELECT pub.*, 
                        uid.uiddata
                   FROM uid JOIN pub 
                     ON uid.pubrowid = pub.rowid 
                  WHERE pub.rowid=? AND uid.is_primary = 1''', (p_rowid, ))
    (kid, val, size, algo, cre, exp, trust, uiddata) = c.fetchone()

    nodename = 'a_%s' % p_rowid
    anode = pd.Node(nodename)
    anode.set('shape', 'record')
    anode.set('style', 'rounded')
    if trust == 'u':
        anode.set('color', 'purple')
    elif trust == 'f':
        anode.set('color', 'red')
    elif trust == 'm':
        anode.set('color', 'blue')
    else:
        anode.set('color', 'gray')

    uiddata = uiddata.replace('"', '')
    name = uiddata.split('<')[0].replace('"', '').strip()
    name = name.split('(')[0].strip()

    try:
        email = uiddata.split('<')[1].replace('>', '').strip()
        try:
            domain = email.split('@')[1]
            show = domain
        except IndexError:
            show = email
    except IndexError:
        show = ''

    if algo in ALGOS.keys():
        keyline = '{%s %s|%s}' % (ALGOS[algo], size, kid)
    else:
        keyline = '{%s}' % kid

    if show_trust:
        anode.set(
            'label', '{{%s\n%s|{val: %s|tru: %s}}|%s}' %
            (name, show, val, trust, keyline))
    else:
        anode.set('label', '{%s\n%s|%s}' % (name, show, keyline))
    return anode
Example #10
0
    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)
Example #11
0
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
Example #12
0
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
Example #13
0
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
Example #14
0
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
Example #15
0
    def draw(self, graph, resolve_dns=False):
        if self.is_on_graph:
            return

        if self.cluster and self.cluster.lb_node is not None:
            # We already drew the LB cluster node
            return

        gnode = pd.Node(self.nodename)
        gnode.set('shape', 'record')
        subnet = get_subnet_by_ip(self.ip)
        if not subnet:
            color = 'gray'
        else:
            color = subnet.color
        gnode.set('color', color)

        # make the ports label
        # we need to add <p_foo> endpoint parts for each port
        pary = []
        for portnum in sorted(self.ports.keys()):
            try:
                service = socket.getservbyport(portnum)
            except OSError:
                service = 'unknown'

            if portnum in self.prodvers and len(self.prodvers[portnum]):
                pary.append(
                    '<p_%s>%s/%s\n[%s]' %
                    (portnum, portnum, service, self.prodvers[portnum]))
            else:
                pary.append('<p_%s>%s/%s' % (portnum, portnum, service))

        plabel = '%s' % '|'.join(pary)
        hlabel = str(self.ip)

        if not self.hostname and resolve_dns:
            try:
                hostname = socket.gethostbyaddr(str(self.ip))[0]
                logger.debug('%s -> %s' % (str(self.ip), hostname))
                self.hostname = hostname
            except socket.herror:
                pass

        hostname = self.hostname

        if self.hostname and self.subnet and len(self.subnet.trimdomain):
            hostname = re.sub('\.%s$' % self.subnet.trimdomain, '',
                              self.hostname)

        if hostname:
            hlabel = '%s\n\%s' % (self.ip, hostname)

        if self.cluster and self.cluster.has_vip(self.ip):
            hlabel = '%s\n%s' % ('VIP', hlabel)

        if self.cluster and self.cluster.type == 'lb':
            # LB clusters replace all nodes with a single one
            # to avoid drawing a bajillion lines.
            # Did we already make a node for this?
            if not self.cluster.lb_node:
                hlabel = '|'.join(self.cluster.rips)
                label = '{{%s}|{cluster ips:|%s}}' % (plabel, hlabel)
                gnode.set('label', label)
                self.cluster.lb_node = self.nodename
        else:
            # on the src node, the ports are on the right
            if self.is_src_node:
                label = '{%s|{%s}}' % (hlabel, plabel)
                gnode.set('label', label)
                self.draw_proxies(graph, resolve_dns)
            else:
                label = '{{%s}|%s}' % (plabel, hlabel)
                gnode.set('label', label)

        # if we're in a cluster, we'll be adding ourselves to a subgraph instead

        if self.cluster is not None:
            self.cluster.subgraph.add_node(gnode)
        else:
            graph.add_node(gnode)

        self.is_on_graph = True