可重用的django应用程序,用于收集和可视化网络拓扑
项目描述
可重用的django应用程序,用于收集和可视化网络拓扑。
当前功能
- 支持不同格式的网络拓扑收集器
NetJSON 网络图
OLSR (jsoninfo/txtinfo)
batman-adv (jsondoc/txtinfo)
BMX6 (q6m)
CNML 1.0
OpenVPN
可以通过 指定自定义解析器 添加额外的格式
基于 netjsongraph.js 的网络拓扑可视化器
简单的 HTTP API,以 NetJSON 网络图 格式公开数据
管理界面,允许轻松管理、审计、可视化和调试拓扑及其相关数据(节点、链接)
从多个节点接收拓扑
拓扑历史:允许保存每个拓扑的每日快照,在前端查看
项目目标
简化支持 netdiff 的格式的网络拓扑数据可视化
通过 RESTful 资源以 NetJSON 网络图 格式公开拓扑数据
简化集成到更大的 django 项目中以提高可重用性
通过提供抽象模型(需要改进此点)来简化扩展其模型
提供自定义或替换可视化器的方法(需要改进此点)
保持核心非常简单
提供扩展默认行为的方法
鼓励将新功能作为扩展发布
在生产环境中部署
OpenWISP 项目提供自动安装程序:OpenWISP: ansible-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_framework 和 django_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_LINK_EXPIRATION
类型: |
整数 |
默认: |
60 |
如果链路下线超过这个天数,它将被update_topology管理命令删除。
将此设置为False将禁用此功能。
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-netjsongraph 的 AppConfig 类
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
贡献
首先,感谢您花时间阅读这些指南。
遵循这些指南非常重要,可以最大限度地减少浪费并避免误解。
变更日志
查看 变更日志。
许可证
查看 许可协议。
此项目在其源代码中捆绑了第三方 JavaScript 库
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分布
构建分布
哈希值 for django_netjsongraph-0.6.3.post1-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5b20c710c36049ef140b6036686be69b2cd9b0541823f03f1686f3bae7b30be7 |
|
MD5 | 38c3fa4486dc1e815544a9ffc650b2a4 |
|
BLAKE2b-256 | 340690d5d54dc3e0ffb5a15878f1091e6e4d82f5267376e78685fbc27223ca97 |