跳转到主要内容

可重用的django应用程序,用于收集和可视化网络拓扑

项目描述

https://travis-ci.org/openwisp/django-netjsongraph.svg https://coveralls.io/repos/openwisp/django-netjsongraph/badge.svg Requirements Status https://badge.fury.io/py/django-netjsongraph.svg https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square

可重用的django应用程序,用于收集和可视化网络拓扑。

https://raw.githubusercontent.com/openwisp/django-netjsongraph/master/docs/images/visualizer.png https://raw.githubusercontent.com/openwisp/django-netjsongraph/master/docs/images/admin.png

当前功能

  • 支持不同格式的网络拓扑收集器
    • NetJSON 网络图

    • OLSR (jsoninfo/txtinfo)

    • batman-adv (jsondoc/txtinfo)

    • BMX6 (q6m)

    • CNML 1.0

    • OpenVPN

    • 可以通过 指定自定义解析器 添加额外的格式

  • 基于 netjsongraph.js 的网络拓扑可视化器

  • 简单的 HTTP API,以 NetJSON 网络图 格式公开数据

  • 管理界面,允许轻松管理、审计、可视化和调试拓扑及其相关数据(节点、链接)

  • 从多个节点接收拓扑

  • 拓扑历史:允许保存每个拓扑的每日快照,在前端查看

项目目标

  • 简化支持 netdiff 的格式的网络拓扑数据可视化

  • 通过 RESTful 资源以 NetJSON 网络图 格式公开拓扑数据

  • 简化集成到更大的 django 项目中以提高可重用性

  • 通过提供抽象模型(需要改进此点)来简化扩展其模型

  • 提供自定义或替换可视化器的方法(需要改进此点

  • 保持核心非常简单

  • 提供扩展默认行为的方法

  • 鼓励将新功能作为扩展发布

在生产环境中部署

OpenWISP 项目提供自动安装程序:OpenWISPansible-openwisp2

确保遵循以下部分中解释的说明: 启用网络拓扑模块

从PyPI安装稳定版本

从 pypi 安装

pip install django-netjsongraph

安装开发版本

安装 tarball

pip install https://github.com/openwisp/django-netjsongraph/tarball/master

或者您可以使用 pip 通过 git 安装

pip install -e git+git://github.com/openwisp/django-netjsongraph#egg=django-netjsongraph

如果您想贡献,请安装您的克隆分支

git clone git@github.com:<your_fork>/django-netjsongraph.git
cd django-netjsongraph
python setup.py develop

设置(集成到现有的django项目中)

rest_frameworkdjango_netjsongraph 添加到 INSTALLED_APPS

INSTALLED_APPS = [
    # other apps
    'rest_framework',
    'openwisp_utils.admin_theme',
    'django_netjsongraph'
    # ...
]

在您的 urlconf 中包含 URL(您可以根据需要更改前缀)

from django.conf.urls import include, url

from django_netjsongraph.api import urls as netjsongraph_api
from django_netjsongraph.visualizer import urls as netjsongraph_visualizer

urlpatterns = [
    # your URLs ...
    url(r'^api/', include(netjsongraph_api)),
    url(r'', include(netjsongraph_visualizer)),
]

创建数据库表

./manage.py migrate

管理命令

update_topology

在管理界面中添加拓扑 URL(暴露网络拓扑文件的 URL)后,可以使用 update_topology 管理命令收集数据并开始使用网络图

./manage.py update_topology

管理命令接受一个 --label 参数,该参数将用于在拓扑标签中搜索,例如

./manage.py update_topology --label mytopology

save_snapshot

可以使用 save_snapshot 管理命令保存拓扑图数据,这些数据可以在将来某个时间用于查看网络拓扑图

./manage.py save_snapshot

管理命令接受一个 --label 参数,该参数将用于在拓扑标签中搜索,例如

./manage.py save_snapshot --label mytopology

日志记录

update_topology 管理命令将自动尝试记录错误。

有关良好的默认 LOGGING 配置,请参阅 测试设置

策略

主要有两种收集拓扑信息的方法

  • FETCH 策略

  • RECEIVE 策略

每个 Topology 实例都有一个 strategy 字段,可以将其设置为所需的设置。

FETCH策略

拓扑数据将从 URL 获取。

当某些链接不再检测到时,它们将立即标记为“down”。

RECEIVE策略

拓扑数据直接从网络的一个或多个节点发送。

收集器等待接收POST HTTP请求负载中的数据;当接收到此类请求时,首先检查其key参数是否与Topology键匹配。

如果请求被授权,收集器将继续更新拓扑。

如果数据仅从一个节点发送,强烈建议将Topology实例的expiration_time设置为0(秒),这样系统的工作方式就与FETCH策略一样,唯一的区别是数据是由一个节点发送而不是由收集器获取。

如果数据是从多个节点发送的,您必须Topology实例的expiration_time设置为比节点发送拓扑的间隔略高的值,这样只有在一段时间内未检测到链路时,链路才会被标记为“down”。这种机制允许在网络被分成几个部分的情况下可视化拓扑,缺点是检测下线链路将花费更多时间。

设置

NETJSONGRAPH_PARSERS

类型:

列表

默认:

[]

额外的自定义netdiff解析器

NETJSONGRAPH_SIGNALS

类型:

字符串

默认:

None

表示在初始化时导入的python模块的字符串。

用于加载django信号或定义自定义行为。

NETJSONGRAPH_TIMEOUT

类型:

整数

默认:

8

获取拓扑URL的超时时间。

NETJSONGRAPH_VISUALIZER_CSS

类型:

字符串

默认:

netjsongraph/css/style.css

可视化器CSS文件的路径。允许根据用户的偏好自定义CSS。

NETJSONGRAPH_NODE_EXPIRATION

类型:

整数

默认:

False

如果一个节点自指定天数以来没有修改,并且它没有链路,它将被update_topology管理命令删除。这取决于是否启用了NETJSONGRAPH_LINK_EXPIRATION。将False替换为一个整数以启用此功能。

TOPOLOGY_API_URLCONF

类型:

字符串

默认:

None

使用urlconf选项更改接收API URL以指向另一个模块,例如,myapp.urls

TOPOLOGY_API_BASEURL

类型:

字符串

默认:

None

如果您在另一个域上有单独的django-netjsongraph实例,可以使用此选项更改URL的基础,这样就可以将所有API URL指向您的django-netjsongraph API服务器的域,例如值:https://mytopology.myapp.com

覆盖可视化模板

遵循以下步骤以覆盖和自定义可视化器的默认模板

  • 在您的django项目中创建一个目录,并将其实际路径放在TEMPLATES['DIRS']中,这可以在django的settings.py文件中找到

  • 创建一个名为netjsongraph的子目录,并添加所有要覆盖默认netjsongraph/*模板的模板

  • 创建一个与您想要覆盖的模板文件同名的新模板文件

有关django模板中使用的语法的更多信息,请参阅django模板文档

示例:覆盖 <script> 标签

以下是如何更改传递给netjsongraph.js的javascript选项的逐步指南,请记住用您的项目的绝对文件系统路径替换<project_path>

步骤1:在<project_path>/templates/netjsongraph中创建一个目录

步骤2:打开您的settings.py并编辑TEMPLATES['DIRS']设置,使其看起来像以下示例

# settings.py
TEMPLATES = [
    {
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # ... all other lines have been omitted for brevity ...
    }
]

步骤 3:在新的 <项目路径>/templates/netjsongraph/ 目录中创建一个名为 netjsongraph-script.html 的新文件,例如

<!-- <project_path>/templates/netjsongraph/netjsongraph-script.html -->
<script>
    window.__njg_el__ = window.__njg_el__ || "body";
    window.__njg_default_url__ = "{{ graph_url }}";
    window.loadNetJsonGraph = function(graph){
        graph = graph || window.__njg_default_url__;
        d3.select("svg").remove();
        d3.select(".njg-overlay").remove();
        d3.select(".njg-metadata").remove();
        return d3.netJsonGraph(graph, {
            el: window.__njg_el__,
            // customizations of netjsongraph.js
            linkClassProperty: "status",
            defaultStyle: false,
            labelDy: "-1.4em",
            circleRadius: 8,
            charge: -100,
            gravity: 0.3,
            linkDistance: 100,
            linkStrength: 0.2,
        });
    };
    window.graph = window.loadNetJsonGraph();
    window.initTopologyHistory(jQuery);
</script>

扩展 django-netjsongraph

django-netjsongraph 提供了一系列模型、管理类和通用视图,这些可以由第三方应用导入、扩展和重用。

要扩展 django-netjsongraph您绝对不能 将其添加到 settings.INSTALLED_APPS 中,但您必须创建自己的应用(该应用应包含在 settings.INSTALLED_APPS 中),从 django-netjsongraph 导入基本类,并添加您的自定义修改。

扩展模型

本示例提供了一个如何扩展 django-netjsongraph 基础模型的例子。

# models.py of your custom ``network`` app
from django.db import models

from django_netjsongraph.base.link import AbstractLink
from django_netjsongraph.base.node import AbstractNode
from django_netjsongraph.base.snapshot import AbstractSnapshot
from django_netjsongraph.base.topology import AbstractTopology
# the model ``organizations.Organization`` is omitted for brevity
# if you are curious to see a real implementation, check out django-organizations
# https://github.com/bennylope/django-organizations

class OrganizationMixin(models.Model):
    organization = models.ForeignKey('organization.Organization')

    class Meta:
        abstract = True


class Topology(OrganizationMixin, AbstractTopology):
    def clean(self):
        # your own validation logic here
        pass

    class Meta(AbstractTopology.Meta):
        abstract = False


class Node(AbstractNode):
    topology = models.ForeignKey('Topology')

    class Meta:
        abstract = False


class Link(AbstractLink):
    topology = models.ForeignKey('Topology')
    source = models.ForeignKey('Node',
                               related_name='source_link_set')
    target = models.ForeignKey('Node',
                               related_name='source_target_set')

    class Meta:
        abstract = False

class Snapshot(OrgMixin, AbstractSnapshot):
    topology = models.ForeignKey('topology.Topology', on_delete=models.CASCADE)

    class Meta(AbstractSnapshot.Meta):
        abstract = False

扩展管理界面

按照上述示例,您可以通过导入基本管理类并使用 register 方法注册您的模型来避免重复 admin 代码。

# admin.py of your app
from django.contrib import admin
from django_netjsongraph.base.admin import (AbstractLinkAdmin,
                                            AbstractNodeAdmin,
                                            AbstractTopologyAdmin)
# these are you custom models
from .models import Link, Node, Topology


class TopologyAdmin(AbstractTopologyAdmin):
    model = Topology


class NodeAdmin(AbstractNodeAdmin):
    model = Node


class LinkAdmin(AbstractLinkAdmin):
    model = Link


admin.site.register(Link, LinkAdmin)
admin.site.register(Node, NodeAdmin)
admin.site.register(Topology, TopologyAdmin)

扩展 API 视图

如果您的用例与基本用例差异不大,您可能还希望尝试重用 API 视图

# your app.api.views
from ..models import Snapshot, Topology
from django_netjsongraph.api.generics import (BaseNetworkCollectionView, BaseNetworkGraphHistoryView,
                                              BaseNetworkGraphView, BaseReceiveTopologyView)


class NetworkCollectionView(BaseNetworkCollectionView):
    queryset = Topology.objects.filter(published=True)


class NetworkGraphView(BaseNetworkGraphView):
    queryset = Topology.objects.filter(published=True)


class ReceiveTopologyView(BaseReceiveTopologyView):
    model = Topology


class NetworkGraphHistoryView(BaseNetworkGraphHistoryView):
    topology_model = Topology
    snapshot_model = Snapshot

network_collection = NetworkCollectionView.as_view()
network_graph = NetworkGraphView.as_view()
network_graph_history = NetworkGraphHistoryView.as_view()
receive_topology = ReceiveTopologyView.as_view()

API URL

如果您对 API 视图没有进行重大更改,您可以通过使用 get_api_urls 函数来避免重复 URL 逻辑。将此放在您的 api urls.py

# your app.api.urls
from django_netjsongraph.utils import get_api_urls
from . import views

urlpatterns = get_api_urls(views)

扩展可视化视图

如果您的用例与基本用例差异不大,您可能还希望尝试重用 Visualizer 视图

# your app.visualizer.views
from ..models import Topology
from .generics import BaseTopologyDetailView, BaseTopologyListView


class TopologyListView(BaseTopologyListView):
    topology_model = Topology


class TopologyDetailView(BaseTopologyDetailView):
    topology_model = Topology


topology_list = TopologyListView.as_view()
topology_detail = TopologyDetailView.as_view()

可视化 URL

如果您对 visualizer 视图没有进行任何重大更改,您可以通过使用 get_visualizer_urls 函数来避免重复 URL 逻辑。将此放在您的 visualizer urls.py

# your app.visualizer.urls
from django_netjsongraph.utils import get_visualizer_urls
from . import views

urlpatterns = get_visualizer_urls(views)

扩展 AppConfig

您还可能想重用 django-netjsongraphAppConfig

from django_netjsongraph.apps import DjangoNetjsongraphConfig

class MyOwnConfig(DjangoNetjsongraphConfig):
    name = 'yourapp'
    label = 'yourapp'

开发安装

安装 sqlite

sudo apt-get install sqlite3 libsqlite3-dev

安装您的分支仓库

git clone git://github.com/<your_fork>/django-netjsongraph
cd django-netjsongraph/
python setup.py develop

安装测试需求

pip install -r requirements-test.txt

创建数据库

cd tests/
./manage.py migrate
./manage.py createsuperuser

启动开发服务器

./manage.py runserver

您可以通过 http://127.0.0.1:8000/ 访问可视化工具,并通过 http://127.0.0.1:8000/admin/ 访问管理界面。

使用以下命令运行测试

./runtests.py

贡献

首先,感谢您花时间阅读这些指南。

遵循这些指南非常重要,可以最大限度地减少浪费并避免误解。

  1. 确保您的更改符合 项目目标

  2. 如果您发现了一个错误,请发送包含补丁的失败测试

  3. 如果您想添加新功能,请在 问题跟踪器 中宣布您的意图

  4. 在此仓库上进行分支,并按照 开发安装说明 安装

  5. 遵循 PEP8,Python 代码风格指南

  6. 编写代码

  7. 为您的代码编写测试

  8. 确保所有测试通过

  9. 确保测试覆盖率不低于 90%

  10. 记录您的更改

  11. 发送拉取请求

变更日志

查看 变更日志

许可证

查看 许可协议

此项目在其源代码中捆绑了第三方 JavaScript 库

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分布

django-netjsongraph-0.6.3.post1.tar.gz (190.1 kB 查看哈希值)

上传时间 源代码

构建分布

django_netjsongraph-0.6.3.post1-py2.py3-none-any.whl (206.0 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持