OpenWISP的IP地址空间管理模块。
项目描述
可用功能
IPv4 和 IPv6 IP 地址管理
IPv4 和 IPv6 子网管理
自动显示所有子网的空闲空间
特定子网的视觉显示
IP 请求模块
CRUD 操作和主要功能的 REST API
可搜索 IP 或子网
子网及其 IP 的 CSV 导入和导出
项目目标
作为可重用的 Django 应用提供 IP 地址管理的基本功能
将此模块集成到 OpenWISP 生态系统的其余部分
允许独立使用(无需 OpenWISP 的其余部分)
提供扩展核心功能的方法,以创建衍生产品
依赖关系
Python 3.7 或更高版本
Django 3.0 或更高版本
Django REST 框架(用于 REST API)
openwisp-users
swapper
安装稳定版本
pip install openwisp-ipam
安装开发版本
安装 tarball
pip install https://github.com/openwisp/openwisp-ipam/tarball/master
或者您可以通过 pip 使用 git 进行安装
pip install -e git+git://github.com/openwisp/openwisp-ipam#egg=openwisp-ipam
开发版安装
使用以下命令安装用于开发的 openwisp-ipam
git clone https://github.com/openwisp/openwisp-ipam.git
cd openwisp-ipam
pip install -e .
pip install -r requirements-test.txt
启动开发服务器
cd tests/
./manage.py migrate
./manage.py createsuperuser
./manage.py runserver
您可以在 http://127.0.0.1:8000/admin/ 访问管理员界面。
运行测试
安装测试需求
pip install -r requirements-test.txt
然后运行测试套件
# options "--keepdb" & "--parallel" are optional but
# improve time required for running tests.
./runtests.py --keepdb --parallel
# Run tests for the sample_app
SAMPLE_APP=1 ./runtests.py --keepdb --parallel
子网可视显示
openwisp-ipam 提供了子网的图形表示,显示任何子网下的可用空闲空间。
REST API
实时文档
一个通用的实时 API 文档(遵循 OpenAPI 规范)可在 /api/v1/docs/ 获得。
可浏览的Web界面
此外,在浏览器中直接打开以下任何端点 列出,将显示 Django-REST-Framework 可浏览的 API 界面,这使得查找每个端点的详细信息变得更加容易。
身份验证
请参阅 openwisp-users: 使用用户令牌进行认证。
分页
所有 list 端点支持 page_size 参数,允许与 page 参数结合分页结果。
GET /api/v1/<api endpoint url>/?page_size=10
GET /api/v1/<api endpoint url>/?page_size=10&page=2
端点列表
由于详细说明包含在每个端点的 实时文档 和 可浏览网页 中,因此这里我们只提供可用的端点列表,有关更多信息,请打开浏览器中的端点 URL。
API节流
要覆盖默认 API 速率限制设置,请将以下内容添加到您的 settings.py 文件中
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'ipam': '100/hour',
}
}
DEFAULT_THROTTLE_RATES 中使用的速率描述可能包括 second、minute、hour 或 day 作为速率限制周期。
获取下一个可用的IP
一个模型方法,用于获取特定子网下的下一个可用的 IP 地址。此方法也可以通过 REST API 访问:openwisp_ipam/base/models.py
GET
返回子网下的下一个可用 IP 地址。
/api/v1/ipam/subnet/<subnet_id>/get-next-available-ip/
请求 IP
一个模型方法,用于创建和获取特定子网下的下一个可用的 IP 地址记录。
POST
为下一个可用的IP地址创建记录并返回该记录的JSON数据。
POST /api/v1/ipam/subnet/<subnet_id>/request-ip/
参数 |
描述 |
---|---|
描述 |
IP地址的可选描述 |
响应
{
"ip_address": "ip_address",
"subnet": "subnet_uuid",
"description": "optional description"
}
IpAddress-Subnet 列表和创建视图
一个API端点,用于检索或创建特定子网下的IP地址。
GET
返回特定子网下的IP地址列表。
/api/v1/ipam/subnet/<subnet_id>/ip-address/
POST
创建新的IP地址。
/api/v1/ipam/subnet/<subnet_id>/ip-address/
参数 |
描述 |
---|---|
ip_address |
IPv6/IPv4地址值 |
subnet |
子网UUID |
描述 |
IP地址的可选描述 |
子网列表/创建视图
一个API端点,用于创建或检索子网实例的列表。
GET
返回子网实例列表。
/api/v1/ipam/subnet/
POST
创建新的子网。
/api/v1/ipam/subnet/
参数 |
描述 |
---|---|
subnet |
以CIDR格式表示的子网值 |
master_subnet |
主子网UUID |
描述 |
IP地址的可选描述 |
子网视图
一个API端点,用于检索、更新或删除子网实例。
GET
获取子网实例的详细信息
/api/v1/ipam/subnet/<subnet-id>/
DELETE
删除子网实例
/api/v1/ipam/subnet/<subnet-id>/
PUT
更新子网实例的详细信息。
/api/v1/ipam/subnet/<subnet-id>/
参数 |
描述 |
---|---|
subnet |
以CIDR格式表示的子网值 |
master_subnet |
主子网UUID |
描述 |
IP地址的可选描述 |
IP地址视图
一个API端点,用于检索、更新或删除IP地址实例。
GET
获取IP地址实例的详细信息。
/api/v1/ipam/ip-address/<ip_address-id>/
DELETE
删除IP地址实例。
/api/v1/ipam/ip-address/<ip_address-id>/
PUT
更新IP地址实例的详细信息。
/api/v1/ipam/ip-address/<ip_address-id>/
参数 |
描述 |
---|---|
ip_address |
IPv6/IPv4值 |
subnet |
子网UUID |
描述 |
IP地址的可选描述 |
导出子网视图
用于导出子网数据的视图。
POST
/api/v1/ipam/subnet/<subnet-id>/export/
导入子网视图
用于导入子网数据的视图。
POST
/api/v1/ipam/import-subnet/
导出和导入子网
用户可以使用openwisp-ipam轻松导入和导出子网数据及其IP地址。这适用于IPv4和IPv6类型的网络。
导出
可以通过管理界面或使用管理命令导出数据。导出的数据以.csv文件格式。
从管理命令
./manage.py export_subnet <subnet value>
如果数据库中存在子网,则导出子网。
从管理界面
可以通过在子网的管理更改视图中单击导出按钮从管理界面导出数据。
导入
可以通过管理界面或使用管理命令导入数据。导入的数据文件可以是.csv和.xlsx格式。在导入IP地址数据时,系统会检查导入文件中指定的子网是否存在。如果子网不存在,则会在导入数据时创建。
从管理命令
./manage.py import_subnet --file=<file path>
从管理界面
可以通过在子网视图中单击导入按钮从管理界面导入数据。
CSV文件格式
在创建导入数据时,请遵循以下结构。
Subnet Name
Subnet Value
Organization Slug
ip_address,description
<ip-address>,<optional-description>
<ip-address>,<optional-description>
<ip-address>,<optional-description>
设置(集成到现有的Django项目中)
您的项目中的settings.py应包含以下内容
INSTALLED_APPS = [
# openwisp2 modules
'openwisp_users',
'openwisp_ipam',
# admin
'django.contrib.admin',
# rest framework
'rest_framework',
'drf_yasg',
]
AUTH_USER_MODEL = 'openwisp_users.User'
将URL添加到您的主urls.py
from django.contrib import admin
from django.urls import include, path
from openwisp_users.api.urls import get_api_urls as get_users_api_urls
urlpatterns = [
# admin URLs
path('admin/', admin.site.urls),
# IPAM API
path('', include('openwisp_ipam.urls')),
# OpenAPI docs
path('api/v1/', include('openwisp_utils.api.urls')),
# Bearer Authentication API URL
path('api/v1/', include((get_users_api_urls(), 'users'), namespace='users')),
]
然后运行
./manage.py migrate
扩展openwisp-ipam
OpenWISP项目的核心价值观之一是软件重用,因此openwisp-ipam提供了一组可以导入、扩展和重用来创建衍生应用程序的基类。
为了实现您自己的openwisp-ipam版本,您需要执行本节中描述的步骤。
在不确定的情况下,测试项目和示例应用程序将为您提供真实来源:只需复制并修改该代码以使openwisp-ipam的基本衍生版本工作。
如果您想添加新的用户字段,请遵循教程以扩展openwisp-users。例如,我们已经将openwisp-users扩展到sample_users应用程序,并在sample_users/models.py中添加了一个字段social_security_number。
前提:如果您计划使用此模块的定制版本,我们建议从开始就使用它,因为从默认模块迁移数据到您的扩展版本可能需要花费时间。
1. 初始化您的自定义模块
首先,您需要创建一个新的 Django 应用,这个应用将包含您自定义的 openwisp-ipam 版本。
Django 应用实际上就是一个 Python 包(Python 脚本目录),在下面的示例中,我们将这个 Django 应用命名为 myipam,但您可以取任何您想要的名称。
django-admin startapp myipam
请记住,上述命令必须从您的 PYTHON_PATH 目录中调用,这样您就可以将结果导入到您的项目中。
现在,您需要将 myipam 添加到您的 settings.py 文件中的 INSTALLED_APPS,同时确保已经移除了 openwisp_ipam。
INSTALLED_APPS = [
# ... other apps ...
'openwisp_utils.admin_theme',
# all-auth
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
# openwisp2 modules
'openwisp_users',
# 'myipam', <-- replace without your app-name here
# admin
'django.contrib.admin',
# rest framework
'rest_framework',
# Other dependencies
'reversion',
]
有关如何使用 Django 项目和 Django 应用的更多信息,请参阅 Django 文档。
2. 安装 openwisp-ipam
安装(并将 openwisp-ipam 添加到您的项目需求中)
pip install openwisp-ipam
3. 添加 EXTENDED_APPS
将以下内容添加到您的 settings.py
EXTENDED_APPS = ('openwisp_ipam',)
4. 添加 openwisp_utils.staticfiles.DependencyFinder
将 openwisp_utils.staticfiles.DependencyFinder 添加到您的 settings.py 中的 STATICFILES_FINDERS
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'openwisp_utils.staticfiles.DependencyFinder',
]
5. 添加 openwisp_utils.loaders.DependencyLoader
将 openwisp_utils.loaders.DependencyLoader 添加到您的 settings.py 中的 TEMPLATES,但请确保它位于 django.template.loaders.app_directories.Loader 之前。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': {
'loaders': [
'django.template.loaders.filesystem.Loader',
'openwisp_utils.loaders.DependencyLoader',
'django.template.loaders.app_directories.Loader',
],
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
}
]
6. 继承 AppConfig 类
请参考测试项目的示例应用中的以下文件
您需要在您的项目中复制并适配这段代码。
有关 AppConfig 概念的更多信息,请参阅 Django 文档中的“Applications”部分。
7. 创建自定义模型
为了举例说明,我们在测试项目的示例应用的 模型中添加了一个简单的“详细信息”字段。
您可以通过类似的方式在您的 models.py 文件中添加字段。
注意:有关如何使用、扩展或开发模型的问题,请参阅 Django 文档中的“Models”部分。
8. 添加交换配置
创建模型后,将以下内容添加到您的 settings.py
# Setting models for swapper module
OPENWISP_IPAM_IPADDRESS_MODEL = 'myipam.IpAddress'
OPENWISP_IPAM_SUBNET_MODEL = 'myipam.Subnet'
将 myipam 替换为步骤 1 中您选择的名称。
9. 创建数据库迁移
创建并应用数据库迁移
./manage.py makemigrations ./manage.py migrate
有关更多信息,请参阅 Django 文档中的“Migrations”部分。
10. 创建管理员界面
参考示例应用的 admin.py 文件。
要修改 admin,您主要有以下两种方式,如下所述。
注意:有关 Django admin 的工作方式或如何进行自定义的更多信息,请参阅 Django 文档中的“Django admin site”部分。
1. Monkey patching
如果您需要添加的更改相对较小,您可以求助于 monkey patching。
例如
from openwisp_ipam.admin import IpAddressAdmin, SubnetAdmin
SubnetAdmin.app_label = 'sample_ipam'
2. Inheriting admin classes
如果您需要引入重大更改,并且不想求助于 monkey patching,您可以按照以下步骤进行
from django.contrib import admin
from openwisp_ipam.admin import (
IpAddressAdmin as BaseIpAddressAdmin,
SubnetAdmin as BaseSubnetAdmin,
)
from swapper import load_model
IpAddress = load_model('openwisp_ipam', 'IpAddress')
Subnet = load_model('openwisp_ipam', 'Subnet')
admin.site.unregister(IpAddress)
admin.site.unregister(Subnet)
@admin.register(IpAddress)
class IpAddressAdmin(BaseIpAddressAdmin):
# add your changes here
@admin.register(Subnet)
class SubnetAdmin(BaseSubnetAdmin):
app_label = 'myipam'
# add your changes here
将 myipam 替换为步骤 1 中您选择的名称。
11. 创建根 URL 配置
from .sample_ipam import views as api_views
from openwisp_ipam.urls import get_urls
urlpatterns = [
# ... other urls in your project ...
# openwisp-ipam urls
# path('', include(get_urls(api_views))) <-- Use only when changing API views (dicussed below)
path('', include('openwisp_ipam.urls')),
]
有关 Django 中 URL 配置的更多信息,请参阅 Django 文档中的“URL dispatcher”部分。
12. 导入自动化测试
在基于本模块开发自定义应用程序时,建议同时导入并运行基本测试,以确保您引入的更改不会破坏openwisp-ipam的一些现有功能。
如果您需要添加破坏性更改,可以覆盖基类中定义的测试来测试自己的行为。
有关如何进行此操作的示例,请参阅示例应用程序的测试。
您可以使用以下命令运行测试:
# the --parallel flag is optional ./manage.py test --parallel myipam
将 myipam 替换为步骤 1 中您选择的名称。
有关Django中自动化测试的更多信息,请参阅“Django中的测试”。
其他可继承和扩展的基类
以下步骤不是必需的,仅供更高级的自定义使用。
1. 扩展API视图
API视图类也可以扩展到其他Django应用程序中。请注意,将openwisp-ipam扩展到您的应用程序不是必需的,此更改仅在您计划修改API视图时才需要。
创建一个视图文件,如views.py中所示。
有关Django视图的更多信息,请参阅Django文档中的视图部分。
贡献
请参阅OpenWISP贡献指南。
项目详情
下载文件
根据您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。
源分布
构建分布
openwisp-ipam-1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2badb699658191c1bc2f31d75ea1196211d23207e7472a9b4ed7254e9b132951 |
|
MD5 | 10dcb44654a6ff65edd91b9f9aa1a388 |
|
BLAKE2b-256 | db4e3cbce3cca0664027e66b83dc95cd448aa138f39c457ed025a0df5d5fb9fb |
openwisp_ipam-1.0-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 16985135ed195c0a422644064d8c6e210e2120ac0b1f2d1128bb5f866e91a351 |
|
MD5 | 2c407e220de06d44bd21ef45055b4ed5 |
|
BLAKE2b-256 | 3c2a9531123f9864829cd48372b4a16c74419fc87d8c321a07d402372eac6cee |