From 80850ccf02af4cee73ed15b4fe0f0f3e1babf04b Mon Sep 17 00:00:00 2001 From: xuehaoweng <13721113750@163.com> Date: Sun, 26 Feb 2023 14:55:30 +0800 Subject: [PATCH 01/19] =?UTF-8?q?'=E4=BF=AE=E5=A4=8D=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E6=9B=B4=E6=96=B0bug'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/open_ipam/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netaxe/apps/open_ipam/views.py b/netaxe/apps/open_ipam/views.py index ed14d8b..3bb3a76 100644 --- a/netaxe/apps/open_ipam/views.py +++ b/netaxe/apps/open_ipam/views.py @@ -363,7 +363,7 @@ class IpAmHandelView(APIView): return JsonResponse(res, safe=True) if description: - Subnet.objects.update(description=description) + Subnet.objects.filter(id=subnet_id).update(description=description) res = {'message': '网段描述更新成功', 'code': 200, } return JsonResponse(res, safe=True) -- Gitee From 3b21e4442df7a1aba667bf099b97e97a4e3d6e2c Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 16:22:55 +0800 Subject: [PATCH 02/19] =?UTF-8?q?cmdb=E6=9B=BF=E6=8D=A2=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 19 +- netaxe/apps/asset/migrations/0001_initial.py | 397 +++ .../0002_historicalnetworkdevice.py | 64 + netaxe/apps/asset/migrations/__init__.py | 0 netaxe/apps/asset/models.py | 2 + netaxe/apps/asset/views.py | 31 +- netaxe/apps/automation/views.py | 4 +- .../config_center/migrations/0001_initial.py | 93 + .../migrations/0002_auto_20230227_1057.py | 23 + .../apps/config_center/migrations/__init__.py | 0 .../apps/open_ipam/migrations/0001_initial.py | 92 + netaxe/apps/users/migrations/0001_initial.py | 73 + .../migrations/0002_userprofile_jwt_secret.py | 19 + netaxe/apps/users/migrations/__init__.py | 0 netaxe/apps/users/models.py | 6 +- netaxe/netboost/settings.py | 17 +- netaxe/requirements.txt | 6 +- netaxe/utils/custom/exception.py | 3 - netaxe/utils/custom/nacos.py | 46 +- web/README.md | 1 + web/index.html | 6 +- web/src/assets/logo.png | Bin 25313 -> 4950 bytes web/src/components/logo/index.vue | 2 +- web/src/views/ip_manage/ipam.vue | 3044 ++++++++--------- 24 files changed, 2343 insertions(+), 1605 deletions(-) create mode 100644 netaxe/apps/asset/migrations/0001_initial.py create mode 100644 netaxe/apps/asset/migrations/0002_historicalnetworkdevice.py create mode 100644 netaxe/apps/asset/migrations/__init__.py create mode 100644 netaxe/apps/config_center/migrations/0001_initial.py create mode 100644 netaxe/apps/config_center/migrations/0002_auto_20230227_1057.py create mode 100644 netaxe/apps/config_center/migrations/__init__.py create mode 100644 netaxe/apps/open_ipam/migrations/0001_initial.py create mode 100644 netaxe/apps/users/migrations/0001_initial.py create mode 100644 netaxe/apps/users/migrations/0002_userprofile_jwt_secret.py create mode 100644 netaxe/apps/users/migrations/__init__.py diff --git a/.gitignore b/.gitignore index 9a78f64..ee695dd 100644 --- a/.gitignore +++ b/.gitignore @@ -16,22 +16,14 @@ netaxe/logs netaxe/__pycahe__ netaxe/netboost/conf.py netaxe/netboost/__pycache__/ -netaxe/apps/users/migrations/00*.py netaxe/apps/users/__pycache__/ -netaxe/apps/system/migrations/00*.py netaxe/apps/system/__pycache__/ -netaxe/apps/asset/migrations/00*.py netaxe/apps/asset/__pycache__/ -netaxe/apps/automation/migrations/00*.py netaxe/apps/automation/__pycache__/ netaxe/apps/automation/tools/__pycache__/ -netaxe/apps/config_center/migrations/00*.py netaxe/apps/config_center/__pycache__/ -netaxe/apps/route_backend/migrations/00*.py -netaxe/apps/int_utilization/migrations/00*.py netaxe/apps/route_backend/__pycache__/ netaxe/__pycache__/ -netaxemedia netaxe/media/automation netaxe/media/device_config/current-configuration docker/server/logs/ @@ -54,14 +46,7 @@ netaxe/apps/int_utilization/__pycache__/ netaxe/apps/route_backend/__pycache__/ netaxe/apps/system/__pycache__/ netaxe/apps/users/__pycache__/ -netaxe/apps/api/migrations/ -netaxe/apps/asset/migrations/ -netaxe/apps/automation/migrations/ -netaxe/apps/config_center/migrations/ -netaxe/apps/int_utilization/migrations/ -netaxe/apps/route_backend/migrations/ -netaxe/apps/system/migrations/ -netaxe/apps/users/migrations/ docker/server/conf/apisix_log/access.log docker/server/conf/apisix_log/error.log -docker/server/conf/apisix_conf/config.yaml \ No newline at end of file +docker/server/conf/apisix_conf/config.yaml +netaxe_alert/ \ No newline at end of file diff --git a/netaxe/apps/asset/migrations/0001_initial.py b/netaxe/apps/asset/migrations/0001_initial.py new file mode 100644 index 0000000..a887ff9 --- /dev/null +++ b/netaxe/apps/asset/migrations/0001_initial.py @@ -0,0 +1,397 @@ +# Generated by Django 3.2.17 on 2023-02-27 15:53 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('automation', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='AdminRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('admin_server', models.CharField(max_length=32, verbose_name='登录主机')), + ('admin_remote_ip', models.GenericIPAddressField(verbose_name='远程地址')), + ('admin_start_time', models.CharField(max_length=64, verbose_name='开始时间')), + ('admin_login_status_time', models.CharField(max_length=16, verbose_name='登录时长')), + ('admin_record_file', models.CharField(max_length=256, verbose_name='操作记录')), + ('admin_record_mode', models.CharField(choices=[('ssh', 'ssh'), ('guacamole', 'guacamole')], default='ssh', max_length=10, verbose_name='登录协议')), + ], + options={ + 'verbose_name': '登录管理用户记录表', + 'verbose_name_plural': '登录管理用户记录表', + 'db_table': 'asset_admin_record', + }, + ), + migrations.CreateModel( + name='AssetAccount', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=50, unique=True, verbose_name='管理账户')), + ('username', models.CharField(blank=True, default='', max_length=50, null=True, verbose_name='登录用户名')), + ('password', models.CharField(blank=True, default='', max_length=200, null=True, verbose_name='登录密码')), + ('protocol', models.CharField(choices=[('ssh', 'ssh'), ('telnet', 'telnet'), ('netconf', 'netconf')], default='ssh', max_length=20, verbose_name='协议名')), + ('port', models.IntegerField(default=22, verbose_name='端口号')), + ('role', models.CharField(choices=[('3', '超级管理员'), ('2', '管理员'), ('1', '普通用户'), ('0', '查看')], default=3, max_length=20, verbose_name='用户角色')), + ('en_pwd', models.CharField(blank=True, default='', max_length=200, null=True, verbose_name='特权密码')), + ], + options={ + 'verbose_name_plural': '设备管理账户', + 'db_table': 'asset_account', + }, + ), + migrations.CreateModel( + name='AssetIpInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=200, null=True, verbose_name='标识名')), + ('ipaddr', models.GenericIPAddressField(verbose_name='IP')), + ], + options={ + 'verbose_name_plural': '设备关联IP表', + 'db_table': 'asset_ip', + }, + ), + migrations.CreateModel( + name='Attribute', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='网络属性')), + ], + options={ + 'verbose_name_plural': '网络属性表', + 'db_table': 'asset_attribute', + }, + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='设备类型')), + ], + options={ + 'verbose_name_plural': '设备类型表', + 'db_table': 'asset_category', + }, + ), + migrations.CreateModel( + name='Framework', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='网络架构')), + ], + options={ + 'verbose_name_plural': '网络架构表', + 'db_table': 'asset_framework', + }, + ), + migrations.CreateModel( + name='Idc', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='机房名称')), + ('address', models.CharField(default='', max_length=100, verbose_name='机房地址')), + ('tel', models.CharField(default='', max_length=30, verbose_name='机房电话')), + ], + options={ + 'verbose_name_plural': '数据中心表', + 'db_table': 'asset_idc', + }, + ), + migrations.CreateModel( + name='IdcModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=30, verbose_name='模块名')), + ('floor', models.CharField(default='', max_length=30, verbose_name='楼层号')), + ('area', models.CharField(default='', max_length=30, verbose_name='区域号')), + ], + options={ + 'verbose_name_plural': '机房模块表', + 'db_table': 'asset_idc_model', + }, + ), + migrations.CreateModel( + name='Model', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='硬件型号')), + ], + options={ + 'verbose_name_plural': '硬件型号表', + 'db_table': 'asset_model', + }, + ), + migrations.CreateModel( + name='NetworkDevice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('serial_num', models.CharField(max_length=200, unique=True, verbose_name='序列号')), + ('manage_ip', models.GenericIPAddressField(default='0.0.0.0', verbose_name='管理地址')), + ('name', models.CharField(default='', max_length=100, verbose_name='资产名称')), + ('soft_version', models.CharField(default='', max_length=200, verbose_name='软件版本')), + ('patch_version', models.CharField(default='', max_length=200, null=True, verbose_name='补丁版本')), + ('u_location_start', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(50), django.core.validators.MinValueValidator(1)], verbose_name='机架位起始')), + ('u_location_end', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(50), django.core.validators.MinValueValidator(1)], verbose_name='机架位结束')), + ('uptime', models.DateField(default=django.utils.timezone.now, null=True, verbose_name='上线时间')), + ('expire', models.DateField(blank=True, null=True, verbose_name='维保日期')), + ('memo', models.TextField(default='', null=True, verbose_name='备注')), + ('status', models.PositiveSmallIntegerField(choices=[(0, '在线'), (1, '下线'), (2, '挂牌'), (3, '备用')], default=0, verbose_name='状态')), + ('ha_status', models.PositiveSmallIntegerField(choices=[(1, '主设备'), (2, '从设备'), (0, '独立设备')], default=0, verbose_name='HA状态')), + ('chassis', models.IntegerField(default=0, verbose_name='机框编号')), + ('slot', models.IntegerField(default=0, verbose_name='槽位编号')), + ('auto_enable', models.BooleanField(default=True, verbose_name='自动化纳管')), + ], + options={ + 'verbose_name': '网络设备表', + 'verbose_name_plural': '网络设备表', + 'db_table': 'asset_networkdevice', + }, + ), + migrations.CreateModel( + name='NetZone', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=20, unique=True, verbose_name='区域名')), + ], + options={ + 'verbose_name_plural': '网络区域表', + 'db_table': 'asset_netzone', + }, + ), + migrations.CreateModel( + name='Rack', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=30, verbose_name='机柜编号')), + ('rack_row', models.CharField(default='', max_length=30, verbose_name='机柜排')), + ], + options={ + 'verbose_name_plural': '机柜表', + 'db_table': 'rack', + }, + ), + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=30, unique=True, verbose_name='设备角色')), + ], + options={ + 'verbose_name_plural': '设备角色表', + 'db_table': 'asset_role', + }, + ), + migrations.CreateModel( + name='Vendor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, unique=True, verbose_name='供应商')), + ('alias', models.CharField(default='', max_length=30, unique=True, verbose_name='别名')), + ], + options={ + 'verbose_name_plural': '设备供应商表', + 'db_table': 'asset_vendor', + }, + ), + migrations.AddIndex( + model_name='vendor', + index=models.Index(fields=['name'], name='asset_vendo_name_1285d0_idx'), + ), + migrations.AddIndex( + model_name='role', + index=models.Index(fields=['name'], name='asset_role_name_69d477_idx'), + ), + migrations.AddField( + model_name='rack', + name='idc_model', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='asset.idcmodel', verbose_name='关联模块'), + ), + migrations.AddIndex( + model_name='netzone', + index=models.Index(fields=['name'], name='asset_netzo_name_c26a83_idx'), + ), + migrations.AddField( + model_name='networkdevice', + name='account', + field=models.ManyToManyField(blank=True, to='asset.AssetAccount', verbose_name='管理账户'), + ), + migrations.AddField( + model_name='networkdevice', + name='attribute', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='attribute_asset', to='asset.attribute', verbose_name='网络属性'), + ), + migrations.AddField( + model_name='networkdevice', + name='category', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='category_asset', to='asset.category', verbose_name='设备类型'), + ), + migrations.AddField( + model_name='networkdevice', + name='framework', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='framework_asset', to='asset.framework', verbose_name='网络架构'), + ), + migrations.AddField( + model_name='networkdevice', + name='idc', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='idc_asset', to='asset.idc', verbose_name='所属机房'), + ), + migrations.AddField( + model_name='networkdevice', + name='idc_model', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='idc_model_asset', to='asset.idcmodel', verbose_name='模块'), + ), + migrations.AddField( + model_name='networkdevice', + name='model', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='model_asset', to='asset.model', verbose_name='硬件型号'), + ), + migrations.AddField( + model_name='networkdevice', + name='plan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='releate_device', to='automation.collectionplan', verbose_name='采集方案'), + ), + migrations.AddField( + model_name='networkdevice', + name='rack', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rack_asset', to='asset.rack', verbose_name='机柜编号'), + ), + migrations.AddField( + model_name='networkdevice', + name='role', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='role_asset', to='asset.role', verbose_name='设备角色'), + ), + migrations.AddField( + model_name='networkdevice', + name='vendor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vendor_asset', to='asset.vendor', verbose_name='供应商'), + ), + migrations.AddField( + model_name='networkdevice', + name='zone', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='zone_asset', to='asset.netzone', verbose_name='网络区域'), + ), + migrations.AddField( + model_name='model', + name='vendor', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='asset.vendor', verbose_name='供应商'), + ), + migrations.AddField( + model_name='idcmodel', + name='idc', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='asset.idc', verbose_name='所属机房'), + ), + migrations.AddIndex( + model_name='idc', + index=models.Index(fields=['name'], name='asset_idc_name_187da9_idx'), + ), + migrations.AddIndex( + model_name='framework', + index=models.Index(fields=['name'], name='asset_frame_name_7528f7_idx'), + ), + migrations.AddIndex( + model_name='category', + index=models.Index(fields=['name'], name='asset_categ_name_cb6153_idx'), + ), + migrations.AddIndex( + model_name='attribute', + index=models.Index(fields=['name'], name='asset_attri_name_5328a7_idx'), + ), + migrations.AddField( + model_name='assetipinfo', + name='device', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bind_ip', to='asset.networkdevice', verbose_name='关联设备'), + ), + migrations.AddIndex( + model_name='assetaccount', + index=models.Index(fields=['name'], name='asset_accou_name_5b4ba2_idx'), + ), + migrations.AddField( + model_name='adminrecord', + name='admin_login_user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin_record', to=settings.AUTH_USER_MODEL, verbose_name='用户'), + ), + migrations.AddIndex( + model_name='rack', + index=models.Index(fields=['name'], name='rack_name_2a7200_idx'), + ), + migrations.AlterUniqueTogether( + name='rack', + unique_together={('name', 'idc_model')}, + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['manage_ip'], name='asset_netwo_manage__7c873a_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['serial_num'], name='asset_netwo_serial__f349e5_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['name'], name='asset_netwo_name_7b8151_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['soft_version'], name='asset_netwo_soft_ve_f5cb8c_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['patch_version'], name='asset_netwo_patch_v_6b2281_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['uptime'], name='asset_netwo_uptime_da13a6_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['expire'], name='asset_netwo_expire_587d66_idx'), + ), + migrations.AddIndex( + model_name='networkdevice', + index=models.Index(fields=['status'], name='asset_netwo_status_a07fec_idx'), + ), + migrations.AlterUniqueTogether( + name='networkdevice', + unique_together={('rack', 'u_location_start', 'u_location_end')}, + ), + migrations.AlterIndexTogether( + name='networkdevice', + index_together={('manage_ip', 'name')}, + ), + migrations.AddIndex( + model_name='model', + index=models.Index(fields=['name'], name='asset_model_name_c7c498_idx'), + ), + migrations.AlterUniqueTogether( + name='model', + unique_together={('name', 'vendor')}, + ), + migrations.AddIndex( + model_name='idcmodel', + index=models.Index(fields=['name'], name='asset_idc_m_name_570a3b_idx'), + ), + migrations.AlterUniqueTogether( + name='idcmodel', + unique_together={('name', 'idc')}, + ), + migrations.AddIndex( + model_name='assetipinfo', + index=models.Index(fields=['name'], name='asset_ip_name_6c7b10_idx'), + ), + migrations.AlterUniqueTogether( + name='assetipinfo', + unique_together={('name', 'device')}, + ), + ] diff --git a/netaxe/apps/asset/migrations/0002_historicalnetworkdevice.py b/netaxe/apps/asset/migrations/0002_historicalnetworkdevice.py new file mode 100644 index 0000000..8c61934 --- /dev/null +++ b/netaxe/apps/asset/migrations/0002_historicalnetworkdevice.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.17 on 2023-02-27 15:53 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('automation', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('asset', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalNetworkDevice', + fields=[ + ('id', models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('serial_num', models.CharField(db_index=True, max_length=200, verbose_name='序列号')), + ('manage_ip', models.GenericIPAddressField(default='0.0.0.0', verbose_name='管理地址')), + ('name', models.CharField(default='', max_length=100, verbose_name='资产名称')), + ('soft_version', models.CharField(default='', max_length=200, verbose_name='软件版本')), + ('patch_version', models.CharField(default='', max_length=200, null=True, verbose_name='补丁版本')), + ('u_location_start', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(50), django.core.validators.MinValueValidator(1)], verbose_name='机架位起始')), + ('u_location_end', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(50), django.core.validators.MinValueValidator(1)], verbose_name='机架位结束')), + ('uptime', models.DateField(default=django.utils.timezone.now, null=True, verbose_name='上线时间')), + ('expire', models.DateField(blank=True, null=True, verbose_name='维保日期')), + ('memo', models.TextField(default='', null=True, verbose_name='备注')), + ('status', models.PositiveSmallIntegerField(choices=[(0, '在线'), (1, '下线'), (2, '挂牌'), (3, '备用')], default=0, verbose_name='状态')), + ('ha_status', models.PositiveSmallIntegerField(choices=[(1, '主设备'), (2, '从设备'), (0, '独立设备')], default=0, verbose_name='HA状态')), + ('chassis', models.IntegerField(default=0, verbose_name='机框编号')), + ('slot', models.IntegerField(default=0, verbose_name='槽位编号')), + ('auto_enable', models.BooleanField(default=True, verbose_name='自动化纳管')), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField(db_index=True)), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('attribute', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.attribute', verbose_name='网络属性')), + ('category', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.category', verbose_name='设备类型')), + ('framework', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.framework', verbose_name='网络架构')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('idc', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.idc', verbose_name='所属机房')), + ('idc_model', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.idcmodel', verbose_name='模块')), + ('model', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.model', verbose_name='硬件型号')), + ('plan', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='automation.collectionplan', verbose_name='采集方案')), + ('rack', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.rack', verbose_name='机柜编号')), + ('role', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.role', verbose_name='设备角色')), + ('vendor', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.vendor', verbose_name='供应商')), + ('zone', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='asset.netzone', verbose_name='网络区域')), + ], + options={ + 'verbose_name': 'historical 网络设备表', + 'verbose_name_plural': 'historical 网络设备表', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': ('history_date', 'history_id'), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/netaxe/apps/asset/migrations/__init__.py b/netaxe/apps/asset/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netaxe/apps/asset/models.py b/netaxe/apps/asset/models.py index b9650f6..b5fe2b2 100644 --- a/netaxe/apps/asset/models.py +++ b/netaxe/apps/asset/models.py @@ -2,6 +2,7 @@ from django.db import models from django.core.validators import MaxValueValidator, MinValueValidator from django.utils import timezone from utils.crypt_pwd import CryptPwd +from simple_history.models import HistoricalRecords # Create your models here. @@ -420,6 +421,7 @@ class NetworkDevice(models.Model): plan = models.ForeignKey("automation.CollectionPlan", verbose_name='采集方案', blank=True, null=True, related_name='releate_device', on_delete=models.SET_NULL) # bgbu = models.ManyToManyField("users.BgBu", verbose_name='BGBU', blank=True) + history = HistoricalRecords() def __str__(self): return '{}_{}_{}'.format(self.manage_ip, self.name, self.idc.name) diff --git a/netaxe/apps/asset/views.py b/netaxe/apps/asset/views.py index 1e92443..bb775e8 100644 --- a/netaxe/apps/asset/views.py +++ b/netaxe/apps/asset/views.py @@ -7,7 +7,6 @@ from django.views import View from django.http import JsonResponse, FileResponse, Http404 from django_filters.rest_framework import DjangoFilterBackend from rest_framework.views import APIView -from rest_framework_tracking.mixins import LoggingMixin from rest_framework import viewsets, permissions, filters from netboost.settings import MEDIA_ROOT @@ -368,11 +367,10 @@ class NetworkDeviceFilter(django_filters.FilterSet): fields = '__all__' -class NetworkDeviceViewSet(LoggingMixin, viewsets.ModelViewSet): +class NetworkDeviceViewSet(viewsets.ModelViewSet): """ 处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE """ - logging_methods = ['POST', 'PUT', 'PATCH', 'DELETE'] queryset = NetworkDevice.objects.all().order_by('-id') queryset = NetworkDeviceSerializer.setup_eager_loading(queryset) serializer_class = NetworkDeviceSerializer @@ -417,30 +415,3 @@ class NetworkDeviceViewSet(LoggingMixin, viewsets.ModelViewSet): print('更新', super().update(request, *args, **kwargs)) return super().update(request, *args, **kwargs) - # 拼接log记录中data字段前后变化 - def handle_log(self): - # Do some stuff before saving. - print('before', self.log['data']) - # print(self.request) - if self.request.POST.get('serial_num'): - # print('PUT记录写入') - for key in self.request.POST.keys(): - if key == 'serial_num': - continue - self.log['data'][key] += " => " + str(self.request.POST[key]) - self.log['data'].pop('serial_num') - if self.log['data'].get('id'): - self.log['data'].pop('id') - if self.log['view_method'] == 'create': - tmp = json.loads(self.log['response']) - if isinstance(tmp['data'], dict): - if 'id' in tmp['data'].keys(): - self.log['path'] += str(tmp['data']['id']) + '/' - elif self.request.data.get('serial_num'): - print('PATCH记录写入') - for key in self.request.data.keys(): - if key == 'serial_num': - continue - self.log['data'][key] += " => " + str(self.request.data[key]) - self.log['data'].pop('serial_num') - super(NetworkDeviceViewSet, self).handle_log() diff --git a/netaxe/apps/automation/views.py b/netaxe/apps/automation/views.py index e5320ab..fd3df25 100644 --- a/netaxe/apps/automation/views.py +++ b/netaxe/apps/automation/views.py @@ -1,7 +1,6 @@ import django_filters from django_filters.rest_framework import DjangoFilterBackend -from rest_framework_tracking.mixins import LoggingMixin from rest_framework import viewsets, permissions, filters, pagination from apps.route_backend.views import LimitSet @@ -23,11 +22,10 @@ class CollectionPlanFilter(django_filters.FilterSet): fields = '__all__' -class CollectionPlanViewSet(LoggingMixin, CustomViewBase): +class CollectionPlanViewSet(CustomViewBase): """ 处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE """ - logging_methods = ['POST', 'PUT', 'PATCH', 'DELETE'] queryset = CollectionPlan.objects.all().order_by('-id') queryset = CollectionPlanSerializer.setup_eager_loading(queryset) serializer_class = CollectionPlanSerializer diff --git a/netaxe/apps/config_center/migrations/0001_initial.py b/netaxe/apps/config_center/migrations/0001_initial.py new file mode 100644 index 0000000..2edc2c5 --- /dev/null +++ b/netaxe/apps/config_center/migrations/0001_initial.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.15 on 2022-11-08 10:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='ConfigCompliance', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='名称')), + ('vendor', models.CharField(choices=[('H3C', 'H3C'), ('Huawei', 'Huawei'), ('Cisco', 'Cisco')], default='H3C', max_length=50, verbose_name='厂商')), + ('category', models.CharField(choices=[('switch', 'switch'), ('firewall', 'firewall'), ('router', 'router')], default='交换机', max_length=50, verbose_name='类型')), + ('pattern', models.CharField(choices=[('match-compliance', 'match-compliance'), ('mismatch-compliance', 'mismatch-compliance')], default='match-compliance', max_length=50, verbose_name='模式')), + ('regex', models.TextField(default='', verbose_name='表达式')), + ('is_repair', models.BooleanField(default=False, verbose_name='是否修正')), + ('repair_cmds', models.TextField(default='', verbose_name='修复命令')), + ('datetime', models.DateTimeField(auto_now=True, verbose_name='创建日期')), + ], + options={ + 'verbose_name': '配置合规表', + 'verbose_name_plural': '配置合规表', + 'db_table': 'config_compliance', + }, + ), + migrations.CreateModel( + name='ConfigTemplate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('vendor', models.CharField(choices=[('H3C', 'H3C'), ('HUAWEI', 'HUAWEI'), ('CISCO', 'CISCO'), ('Ruijie', 'Ruijie'), ('Hillstone', 'Hillstone')], default='H3C', max_length=100, verbose_name='厂商')), + ('name', models.CharField(max_length=100, unique=True, verbose_name='配置项名称')), + ('config_yaml', models.TextField(blank=True, default='', verbose_name='yaml内容')), + ('config_jinja2', models.TextField(blank=True, default='', verbose_name='jinja2内容')), + ('config_text', models.TextField(blank=True, default='', verbose_name='配置命令')), + ('datetime', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '配置片段表', + 'verbose_name_plural': '配置片段表', + 'db_table': 'config_template', + }, + ), + migrations.CreateModel( + name='TTPTemplate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('vendor', models.CharField(choices=[('H3C', 'H3C'), ('HUAWEI', 'HUAWEI'), ('CISCO', 'CISCO'), ('Ruijie', 'Ruijie'), ('Hillstone', 'Hillstone')], default='H3C', max_length=100, verbose_name='厂商')), + ('name', models.CharField(max_length=100, unique=True, verbose_name='名称')), + ('ttp_content', models.TextField(blank=True, default='', verbose_name='模板内容')), + ('datetime', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '配置片段表', + 'verbose_name_plural': '配置片段表', + 'db_table': 'ttp_template', + }, + ), + migrations.AddIndex( + model_name='ttptemplate', + index=models.Index(fields=['name', 'vendor'], name='ttp_templat_name_1944b9_idx'), + ), + migrations.AlterUniqueTogether( + name='ttptemplate', + unique_together={('vendor', 'name')}, + ), + migrations.AddIndex( + model_name='configtemplate', + index=models.Index(fields=['name', 'vendor'], name='config_temp_name_09cec8_idx'), + ), + migrations.AlterUniqueTogether( + name='configtemplate', + unique_together={('vendor', 'name')}, + ), + migrations.AddIndex( + model_name='configcompliance', + index=models.Index(fields=['vendor'], name='config_comp_vendor_292331_idx'), + ), + migrations.AddIndex( + model_name='configcompliance', + index=models.Index(fields=['category'], name='config_comp_categor_4829f4_idx'), + ), + migrations.AddIndex( + model_name='configcompliance', + index=models.Index(fields=['datetime'], name='config_comp_datetim_5e0126_idx'), + ), + ] diff --git a/netaxe/apps/config_center/migrations/0002_auto_20230227_1057.py b/netaxe/apps/config_center/migrations/0002_auto_20230227_1057.py new file mode 100644 index 0000000..47d6837 --- /dev/null +++ b/netaxe/apps/config_center/migrations/0002_auto_20230227_1057.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.17 on 2023-02-27 10:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('config_center', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='configtemplate', + name='vendor', + field=models.CharField(choices=[('H3C', 'H3C'), ('HUAWEI', 'HUAWEI'), ('Cisco_ios', 'Cisco_ios'), ('Ruijie', 'Ruijie'), ('Hillstone', 'Hillstone')], default='H3C', max_length=100, verbose_name='厂商'), + ), + migrations.AlterField( + model_name='ttptemplate', + name='vendor', + field=models.CharField(choices=[('H3C', 'H3C'), ('HUAWEI', 'HUAWEI'), ('Cisco_ios', 'Cisco_ios'), ('Ruijie', 'Ruijie'), ('Hillstone', 'Hillstone')], default='H3C', max_length=100, verbose_name='厂商'), + ), + ] diff --git a/netaxe/apps/config_center/migrations/__init__.py b/netaxe/apps/config_center/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netaxe/apps/open_ipam/migrations/0001_initial.py b/netaxe/apps/open_ipam/migrations/0001_initial.py new file mode 100644 index 0000000..a6d3747 --- /dev/null +++ b/netaxe/apps/open_ipam/migrations/0001_initial.py @@ -0,0 +1,92 @@ +# Generated by Django 3.2.17 on 2023-02-27 10:57 + +import cidrfield.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='TagsModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('bg_color', models.CharField(blank=True, max_length=100, verbose_name='bg_color')), + ('compress', models.CharField(blank=True, max_length=100, verbose_name='compress')), + ('fg_color', models.CharField(blank=True, max_length=100, verbose_name='fgcolor')), + ('locked', models.CharField(blank=True, max_length=100, verbose_name='locked')), + ('type', models.CharField(blank=True, max_length=100, verbose_name='type')), + ('show_tag', models.BooleanField(verbose_name='showtag')), + ], + options={ + 'verbose_name': '网络地址标签表', + 'verbose_name_plural': '网络地址标签表', + 'db_table': 'ipam_tags', + }, + ), + migrations.CreateModel( + name='Subnet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('subnet_id', models.IntegerField(default=0, verbose_name='网段ID')), + ('name', models.CharField(db_index=True, max_length=100, verbose_name='名称')), + ('subnet', cidrfield.models.IPNetworkField(db_index=True, unique=True, verbose_name='子网段')), + ('mask', models.IntegerField(default=24, verbose_name='掩码')), + ('freehosts_percent', models.FloatField(blank=True, default=0, null=True, verbose_name='空闲率')), + ('description', models.CharField(blank=True, max_length=300, null=True, verbose_name='描述')), + ('master_subnet', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_subnet_set', to='open_ipam.subnet', verbose_name='上一级子网段')), + ], + options={ + 'verbose_name': '子网网段表', + 'verbose_name_plural': '子网网段表', + 'db_table': 'ipam_subnet', + 'ordering': ['subnet'], + }, + ), + migrations.CreateModel( + name='IpAddress', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ip_address', models.GenericIPAddressField(unique=True, verbose_name='IP地址')), + ('description', models.CharField(blank=True, max_length=500, null=True, verbose_name='描述信息')), + ('tag', models.PositiveSmallIntegerField(choices=[(1, '空闲'), (2, '已分配已使用'), (3, '保留'), (4, '未分配已使用'), (6, '已分配未使用'), (7, '自定义空闲')], default=1, verbose_name='状态标签')), + ('editDate', models.DateField(auto_now=True, null=True, verbose_name='编辑时间')), + ('lastScan', models.DateField(auto_now=True, null=True)), + ('lastDiscovery', models.DateField(auto_now=True, null=True)), + ('lastOnlineTime', models.DateField(auto_now=True, null=True, verbose_name='最近在线时间')), + ('subnet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='open_ipam.subnet', verbose_name='归属子网段')), + ], + options={ + 'verbose_name': '网络地址表', + 'verbose_name_plural': '网络地址表', + 'db_table': 'ipam_ip_address', + 'ordering': ['ip_address'], + }, + ), + migrations.AddIndex( + model_name='subnet', + index=models.Index(fields=['subnet'], name='subnet_idx'), + ), + migrations.AddIndex( + model_name='subnet', + index=models.Index(fields=['name'], name='name'), + ), + migrations.AddIndex( + model_name='ipaddress', + index=models.Index(fields=['ip_address'], name='ipam_ip_add_ip_addr_20df1b_idx'), + ), + migrations.AddIndex( + model_name='ipaddress', + index=models.Index(fields=['description'], name='ipam_ip_add_descrip_ad47a9_idx'), + ), + migrations.AddIndex( + model_name='ipaddress', + index=models.Index(fields=['lastOnlineTime'], name='ipam_ip_add_lastOnl_d2352c_idx'), + ), + ] diff --git a/netaxe/apps/users/migrations/0001_initial.py b/netaxe/apps/users/migrations/0001_initial.py new file mode 100644 index 0000000..5408d6c --- /dev/null +++ b/netaxe/apps/users/migrations/0001_initial.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.17 on 2023-02-21 16:01 + +import django.contrib.auth.models +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('username', models.CharField(db_index=True, help_text='用户账号', max_length=150, unique=True, verbose_name='用户账号')), + ('nick_name', models.CharField(blank=True, max_length=30, null=True, verbose_name='昵称')), + ('mobile', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号码')), + ('email', models.EmailField(blank=True, help_text='邮箱', max_length=255, null=True, verbose_name='邮箱')), + ('image', models.ImageField(default='images/default.png', upload_to='images/%Y/%m/%d/')), + ('login_status', models.SmallIntegerField(choices=[(0, '在线'), (1, '离线'), (2, '忙碌')], default=0, verbose_name='登录状态')), + ('gender', models.IntegerField(blank=True, choices=[(0, '未知'), (1, '男'), (2, '女')], default=0, help_text='性别', null=True, verbose_name='性别')), + ('user_type', models.IntegerField(blank=True, choices=[(0, '后台用户'), (1, '前台用户')], default=0, help_text='用户类型', null=True, verbose_name='用户类型')), + ], + options={ + 'verbose_name': '用户表', + 'verbose_name_plural': '用户表', + 'db_table': 'ops_user', + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='BgBu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20, unique=True, verbose_name='业务名称')), + ], + options={ + 'verbose_name': '业务表', + 'verbose_name_plural': '业务表', + 'db_table': 'bgbu', + }, + ), + migrations.AddIndex( + model_name='bgbu', + index=models.Index(fields=['name'], name='bgbu_name_7454a1_idx'), + ), + migrations.AddField( + model_name='userprofile', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='userprofile', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + ] diff --git a/netaxe/apps/users/migrations/0002_userprofile_jwt_secret.py b/netaxe/apps/users/migrations/0002_userprofile_jwt_secret.py new file mode 100644 index 0000000..ebbb16a --- /dev/null +++ b/netaxe/apps/users/migrations/0002_userprofile_jwt_secret.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.17 on 2023-02-21 16:01 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='userprofile', + name='jwt_secret', + field=models.UUIDField(default=uuid.uuid4), + ), + ] diff --git a/netaxe/apps/users/migrations/__init__.py b/netaxe/apps/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netaxe/apps/users/models.py b/netaxe/apps/users/models.py index fa20590..fdee708 100644 --- a/netaxe/apps/users/models.py +++ b/netaxe/apps/users/models.py @@ -1,7 +1,7 @@ import hashlib from django.db import models from django.contrib.auth.models import AbstractUser - +import uuid class UserProfile(AbstractUser): username = models.CharField( @@ -36,6 +36,10 @@ class UserProfile(AbstractUser): user_type = models.IntegerField( choices=USER_TYPE, default=0, verbose_name="用户类型", null=True, blank=True, help_text="用户类型" ) + jwt_secret = models.UUIDField(default=uuid.uuid4) + + def jwt_get_secret_key(self): + return self.jwt_secret # post = models.ManyToManyField( # to="system.Post", blank=True, verbose_name="关联岗位", db_constraint=False, help_text="关联岗位") # role = models.ManyToManyField( diff --git a/netaxe/netboost/settings.py b/netaxe/netboost/settings.py index 0402f34..8ab0b1e 100644 --- a/netaxe/netboost/settings.py +++ b/netaxe/netboost/settings.py @@ -54,7 +54,8 @@ INSTALLED_APPS = [ "django_celery_beat", "django_celery_results.apps.CeleryResultConfig", "rest_framework", - "rest_framework_tracking", + "simple_history", + # "rest_framework_tracking", # "rest_framework.authtoken", # "rest_framework.apps.RestFrameworkConfig", @@ -127,7 +128,6 @@ AUTH_USER_MODEL = "users.UserProfile" # Internationalization # https://docs.djangoproject.com/en/4.0/topics/i18n/ -# LANGUAGE_CODE = "en-us" LANGUAGE_CODE = "zh-hans" TIME_ZONE = "Asia/Shanghai" @@ -276,9 +276,13 @@ STATICFILES_FINDERS = ( DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # simple jwt 设置 SIMPLE_JWT = { - "ACCESS_TOKEN_LIFETIME": timedelta(days=1), # access token 有效期 30分钟 - "REFRESH_TOKEN_LIFETIME": timedelta(days=2), # refresh token 有效期 2 天 + "ACCESS_TOKEN_LIFETIME": timedelta(hours=1), # access token 有效期 30分钟 + "REFRESH_TOKEN_LIFETIME": timedelta(days=1), # refresh token 有效期 2 天 "ROTATE_REFRESH_TOKENS": True, + 'ALGORITHM': 'HS256', + 'SIGNING_KEY': SECRET_KEY, + 'VERIFYING_KEY': None, + 'AUTH_HEADER_TYPES': ('Bearer',), } # restful api 配置 @@ -298,7 +302,7 @@ REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ( # "rest_framework.authentication.BasicAuthentication", # "rest_framework.authentication.SessionAuthentication", - "rest_framework.authentication.TokenAuthentication", + # "rest_framework.authentication.TokenAuthentication", "rest_framework_simplejwt.authentication.JWTAuthentication", # "apps.api.authentication.ExpiringTokenAuthentication", ), @@ -347,7 +351,8 @@ CACHES = { # 认证配置 AUTHENTICATION_BACKENDS = ( # "django_auth_ldap.backend.LDAPBackend", - "utils.custom.backends.CustomBackend", + # "utils.custom.backends.CustomBackend", + "django.contrib.auth.backends.ModelBackend", "guardian.backends.ObjectPermissionBackend", # 这是guardian的 ) diff --git a/netaxe/requirements.txt b/netaxe/requirements.txt index cbbbcd9..396d168 100644 --- a/netaxe/requirements.txt +++ b/netaxe/requirements.txt @@ -87,8 +87,6 @@ wrapt==1.14.1 zipp==3.8.0 zope.interface==5.4.0 pymongo==3.10.1 -# rest api 日志记录模块 -drf-api-tracking==1.8.0 xmltodict==0.13.0 requests==2.28.1 pycryptodome==3.15.0 @@ -119,4 +117,6 @@ django-restql==0.15.2 user-agents==2.2.0 drf-yasg==1.21.4 xlrd==1.2.0 - +pandas==1.5.2 +django-restql==0.15.2 +django-simple-history==3.2.0 diff --git a/netaxe/utils/custom/exception.py b/netaxe/utils/custom/exception.py index fb867d6..227ddfd 100644 --- a/netaxe/utils/custom/exception.py +++ b/netaxe/utils/custom/exception.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- """ -@author: 猿小天 -@contact: QQ:1638245306 -@Created on: 2021/6/2 002 16:06 @Remark: 自定义异常处理 """ import logging diff --git a/netaxe/utils/custom/nacos.py b/netaxe/utils/custom/nacos.py index 2cd8f06..79884e9 100644 --- a/netaxe/utils/custom/nacos.py +++ b/netaxe/utils/custom/nacos.py @@ -3,13 +3,13 @@ import urllib import logging import hashlib import threading -import requests,time +import requests, time logger = logging.getLogger('server') class nacos: - def __init__(self,ip="127.0.0.1",port=8848): + def __init__(self, ip="127.0.0.1", port=8848): self.ip = ip self.port = port self.__registerDict = {} @@ -17,7 +17,7 @@ class nacos: def __healthyCheckThreadRun(self): while True: - #检查registerThread + # 检查registerThread try: time.sleep(5) serviceIp = self.__registerDict["serviceIp"] @@ -30,20 +30,22 @@ class nacos: metadata = self.__registerDict["metadata"] weight = self.__registerDict["weight"] enabled = self.__registerDict["enabled"] - self.registerService(serviceIp,servicePort,serviceName, - namespaceId,groupName,clusterName, - ephemeral,metadata,weight,enabled) + self.registerService(serviceIp, servicePort, serviceName, + namespaceId, groupName, clusterName, + ephemeral, metadata, weight, enabled) except: - logging.exception("服务注册心跳进程健康检查失败",exc_info=True) + logging.exception("服务注册心跳进程健康检查失败", exc_info=True) def healthyCheck(self): t = threading.Thread(target=self.__healthyCheckThreadRun) t.start() logging.info("健康检查线程已启动") - def registerService(self,serviceIp,servicePort,serviceName,namespaceId="public", - groupName="DEFAULT_GROUP",clusterName="DEFAULT", - ephemeral=True,metadata={},weight=1,enabled=True): + def registerService(self, serviceIp, servicePort, serviceName, namespaceId="public", + groupName="DEFAULT_GROUP", clusterName="DEFAULT", + ephemeral=True, metadata=None, weight=1, enabled=True): + if metadata is None: + metadata = {} self.__registerDict["serviceIp"] = serviceIp self.__registerDict["servicePort"] = servicePort self.__registerDict["serviceName"] = serviceName @@ -56,7 +58,6 @@ class nacos: self.__registerDict["enabled"] = enabled self.__registerDict["healthy"] = int(time.time()) - registerUrl = "http://" + self.ip + ":" + str(self.port) + "/nacos/v1/ns/instance" params = { "ip": serviceIp, @@ -72,14 +73,29 @@ class nacos: } try: re = requests.post(registerUrl, params=params) - if (re.text == "ok"): + if re.text == "ok": logging.info("服务注册成功。") else: - logging.error("服务注册失败 "+re.text) + logging.error("服务注册失败 " + re.text) except: - logging.exception("服务注册失败",exc_info=True) + logging.exception("服务注册失败", exc_info=True) + def fallbackFun(): return "request Error" + + def timeOutFun(): - return "request time out" \ No newline at end of file + return "request time out" + + +# class NacosManage: +# def __init__(self, server_addr,name_space, data_id, group): +# self.SERVER_ADDRESS = server_addr +# self.NAMESPACE = name_space +# self.data_id = data_id +# self.group = group +# +# def getNacosConf(self): +# try: +# client = nacos.NacosClietn \ No newline at end of file diff --git a/web/README.md b/web/README.md index e69de29..f2a81e2 100644 --- a/web/README.md +++ b/web/README.md @@ -0,0 +1 @@ +NetAxe 前端模块 diff --git a/web/index.html b/web/index.html index 99cc008..a7d1375 100644 --- a/web/index.html +++ b/web/index.html @@ -6,10 +6,10 @@ - Net-axe + NetAxe
@@ -24,7 +24,7 @@
-
Net-Axe
+
NetAxe
diff --git a/web/src/assets/logo.png b/web/src/assets/logo.png index 450eab97f01b0fbe2e43980b3228829cd6127ffc..76d42e8b8b3d5b5670380d85762913ac580c9105 100644 GIT binary patch literal 4950 zcmai2XIN8Nx5m$kgCZg@6s4n-fH4Fnpr9fpgrXFYj$t?(=4VoAEL!25D zQOQ7kkEitep;TXbWFqQ(>CA>_mEF2#I6GFB@8r&2dD$aVU1s({WCr=83WkE5+;!p> z*$BK$!TS-wv>JoCN5oCzhi&x zNjS+w0AI?`SyHi&{L7NtK|k7pm(FEfyC#OF9+tb7MQzYK&6cx(xHHuaP;z&XF%NR~ zL9Pb}7(usg+fVtcX4#ja5LQKibL4I?%ya;TLQRAhj8QytNp?Qtw5{RrbF< z0M-SrW6>~&LoZTxzVm0h=PM(35Gx6ebgxbs){*_Vc}`d+?8FB3D{Xb8)Y<6ynzuQK zwOQn3LHbj!I146N1{gU+IIDl*rR9w+N0f0)tP?x4tUajrHdz{916)6e^zik`R0rz= zJnkg}kWOqDe)FtNi+s+g!aEnXUPIlhA2EzeW6>33+nl0yTs{JnV-sB$ zII_7TUnBbL%SILUxv>9u*(LweS40p?jfzNH{&UAa@-*aE8DNb7JJRdIk=xQwKHTKP zD_4RbjXZuFDqlOaEmql`<}hwBTsjg^P1Qap7t z4p<_2WwK3?%D5(-9J|dfTP*S9JcCrEdEoC)sHEq{4ejlo;^Zc&rQ+ zB&fxdLsg!NH%dt(zmV8KR5O!p#RhK zImpVgBgZ{TVhUVbWtRi95_M&qD`D_p%)ADQ@bzE-*My<9mW(q)sv7$#U3mjKTh`i9 zi|RytM6harJ|y>PnixXq)2uV`w=&F*MDcg{8kS^CU~8S&RtuZ}fmS+^wF|4NKKALG z#)ll@dR;{MD4WRr)^GMU@VA&`Ojj?xs}r4YUfokUP92`%G8Dzo!a;}$;7QllxAG4M zXS-8v+sR6lo*Q}^p_Et1LnWP_eHS|e)Hu&5^-k%<5M2yhOcyk|vY#|tV^k@*#rR!R zX8f&U2vSl-hz=R^gZ1>iv7+rntTxVArPyKyv=n^4yNRSc&f>t-`*;wIA(=qaPXKRt+j%E8|Io!Gw=~wwO%QrwKI8<{wL2cZ>WE&81#qjq;Pm82TO5a#jWK*g z({&4%E4pMAwA$eW#vAFI_iZa3{x$@ERE!}g%EK{Mn`eWV7Z7%@sQYH^&_cW4&YlV@FMyk47Ix$;=j#NGq0-tn_ig`qYdQ9yuAla7MKdM(aUi>9t zZk|1M1Z9FqUe=8$*p$#%Tv>P__H~AWUjs}7j0uV5=?Hy>+X$m?&ww!qmaaE$^Gc#+ zW4MN`G-9bW81C;nILhIm1>)X#CTeZIkXnYYzzcM#g*n05Q>N{Z{#$VYJ z1X7E>k1ZfoD^mu5*1wP*AkbtDFeVVyW%*+Qc&T_>X>3jnQ0g>eon9}HY(xBA(i~Yn z7rHhxr(AzmCCh(5%}ue$7-`O;Kau^E=HhN|TrrZ@Ijt4IHm(yq7!`Gsr!2vPmoMMs zVcrJO!-9bj+6sO7ACJ{;$@42LFv*#-QG7}#2`O_cQu@|juH^f%(bOYQec%>$ud%S# zM;#Ziw}Mn|0Ep54Fa9ie{#jhOuJLcWcAr@>#WE${qN=^<^Q~~F54K{eQI@|KJ?Kl= z(v_yAzz}uYTQe%50#Rgtql{;3h+mlF4VhbIbnl?3^#tA(VMFaAs9{?Yzev;5Em9BH2HHublwBb(0TpUd`VCF5Mc8JF^1spP2x;K4#dxC`f)_eApMm$MJCdT(m< z^-~}k z$mZ5*vl=5|{$!R{tegWoxxeuQ^zMi6{}O^>$uDWQW~+rwvU8zvCqb0-TYy(}YrCT6 zDfS)Gv(s6y{s9Z6CLJlED>aWe1;wKa0@)4zJbc7>hS>OQ6D~Hev@ekt^XU7Ao9U;4 zUb>m#)l-Y0mM43_ra`ehBY=Z4_bhA;YRSEcCy2b&aE)kK-Kg1CTc>JE3^_b{L{!^k zY@!M-Eoo(SeEq;MTd~VBDJDAXnb~D{u}VtnCWiC%RN|vj&F2>1ctc&1xQ)S^LCaDj zBXIUfK{rrv6nTDH;WlyIfjYK??YK*jdTP)C*Un{&^#2~u{bQ+^DJylc7w!-F!dPz3WVx1dz6{2Js`rO?6 z-;45V$@WF6lop`%EHZ(=?~Q@HHJoi+D|ldZG*@ciO>>2&fH=-0zX@E~4Tz@&NXe6F zEgbUDOyvjH=X@Nd__8;H91xJ#Aa54llM)>l)7C^3SUy_cs2(s7+SpXHT*iHkHNd9% zI5SRYgml-K;rm}V$Lo&>M~AU)f%P{JAB&;ogk z`}1_STl=#c>I4_OC|a{eK6XX#KKO!+;knfS9m4i7qm2gGFZJlkj zOIHHc-`^~Woc!hR?FYfunu&CZU2fF!gY_h~MyH$ZMTQ9flLB~Ut6QAe?yf8=sYoA+ zp!i8Y!xx6XPIF1Ct5?>9&z6UpSQFTXw~iaBg1;ng2M2l&CR5IXiwes@!n)dsa%|_q zsF_zt-*U+^pGoV`6bfo+(dX6d+hca5T>kR-G)z%)sJvnkYB3Y5jZ)DU?#QI(0j>E+ zZXha85CkyX0wiy?3BOHu_1Fh^N+wo5YC_x>rK)*>tR!57uC!8;a43&1dB3M%#k*cw z)x~v_*94~o$I6KCK|GN9vfNl$_oMd_&2I?ucf;bI(-lqx7p^yT`oq=;!4RTW+!HI> znW`**gJ~Le_#@o6n4(1SgU!iXwG)j|`atwTqx+;n6;!H^LGA9xwv~V2!_VL z>mL|KW5B3d@wqX{sS{~^a84#{C7GfMR;vX*kUM3!pXFNMV-Nv&g#LPH`WOgdjG#W< z`#v`>ulM(~xEig>*E2!t;)|VlH`J%}iSEv9r#L+nL*&B^U<4JD!bQV-<7s*`XrwB- zh%kGfN#t_>c3##x{%J}{*7T1`rV-M_$>h5@=)~OJGBGzTcVW~Gt_ik{-Z5eTl&6Da z?Zd+w?dl(8L~B2GU=O=jboD(oDIAYR{PSigtrDWyH5VH2xVhbmzU+Do%U$eu9(HC! z8?7<>DLQ(lg%rt$;~QJ_8Ot8ZUmpKbuYiV$!4;6~q>XqA_1ZK3+H_!FbO2$i3jo`s z;#OzNl+(_^ZEu5oGVH@vR*v2vV)AhZcV5()`+Ib0E!pwUCviX#0i`(tt0bXRaC6MV z+`&-0sP!y6d9`tlL!T6&5Jpo7al)-ARBq4D^83AFos!?Rhh+sVBCOy2=;q57|FT4yp2!W8203y^Zl1`p zshmvg`VE<2hH64KBe?O^hK55Xb2cv#GnV*O?UAwv#HCPM=qH6a;`ZRf_ci|7N0|kV za*#ZONX}^qXzoFK5HP9O%DGfXtW6KxOMTe0V54#>W7<2Hc(BEKP)C^mN1o%$Sq#@o z5UJ*61j^7HDZ4`qoV!b!POp795N750GLv6K4&VRfY0bg~QxC_1=Iz12qzW1)yF#w? zA4hfjdDv*H%s;?Ql+;k-BcqiEO{ycD#vl9MJ{K33X@tJ3yg>Um{g?k&L;Am@rl0cDPetmd{PaVS`YAu@IBh8Q XY7*TD(8N}mOAhYnai;ln*dPA|hAYn# literal 25313 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 diff --git a/web/src/components/logo/index.vue b/web/src/components/logo/index.vue index 5a40591..e524c56 100644 --- a/web/src/components/logo/index.vue +++ b/web/src/components/logo/index.vue @@ -45,7 +45,7 @@ align-items: center; border-bottom: 1px dashed var(--border-color); .logo-img { - width: 30px; + width: 40%; } .logo-title { font-weight: bold; diff --git a/web/src/views/ip_manage/ipam.vue b/web/src/views/ip_manage/ipam.vue index 5efc9d1..4456b48 100644 --- a/web/src/views/ip_manage/ipam.vue +++ b/web/src/views/ip_manage/ipam.vue @@ -4,32 +4,30 @@ - + 搜索 清除

导出网段 - + >导出网段 + 新增网段 - + >新增网段 + @@ -39,13 +37,14 @@
详情
-
因ipv6网段地址较多,下图仅展示单次请求结果数据-可滚动查询下一分页 +
因ipv6网段地址较多,下图仅展示单次请求结果数据-可滚动查询下一分页
@@ -70,7 +69,7 @@ {{ subnet_info.desc }} - +
@@ -106,73 +105,67 @@
{{ ip_info.address }}
- -
@@ -180,61 +173,54 @@ @@ -245,19 +231,19 @@ 选中网段即为父节点网段,若需要新建一级网段则需要选择空白处 - + @@ -276,19 +262,19 @@ - + @@ -306,16 +292,16 @@ @@ -324,759 +310,691 @@ \ No newline at end of file + .roll_div { + height: calc(100% - 191px); + padding: 10px 24px; + position: relative; + background-color: #fbfcfe; + overflow-y: auto; + } + + .bold-attribute { + font-weight: bold; + padding-right: 5px; + } + + .used { + background-color: #409eff; + } + + .reserved { + background: #22dd22; + } + + .dist_and_used { + /*已分配已使用*/ + background: #e6b600; + } + + .not_dist_and_used { + /*未分配已使用*/ + background: #1695c4; + } + + .free { + background-color: #67c23a; + } + + .empty { + background-color: #f4f4f4; + } + + .dist_and_not_used { + background-color: #11eec2; + } + + .custom_empty { + background: #f4f4f4; + } + + .chart-item { + //height: 500px; + width: 400px; + //padding-left:300px; + //padding-top: 30px; + height: 300px; + } + + .button_border { + border: 1px solid black; + } + -- Gitee From 5abe14c27036452aeedefc6553be3a1978a462a0 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 16:49:37 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=8B=93=E6=89=91=E5=9B=BE=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/topology/__init__.py | 0 netaxe/apps/topology/admin.py | 19 + netaxe/apps/topology/apps.py | 6 + netaxe/apps/topology/icon_manage.py | 72 ++++ netaxe/apps/topology/migrations/__init__.py | 0 netaxe/apps/topology/models.py | 90 +++++ netaxe/apps/topology/tasks.py | 327 ++++++++++++++++++ netaxe/apps/topology/tests.py | 3 + netaxe/apps/topology/urls.py | 11 + netaxe/apps/topology/views.py | 244 +++++++++++++ netaxe/apps/users/models.py | 1 + netaxe/media/topology/img/AC.png | Bin 0 -> 22611 bytes netaxe/media/topology/img/DS.png | Bin 0 -> 31480 bytes netaxe/media/topology/img/L2.png | Bin 0 -> 29353 bytes netaxe/media/topology/img/L3.png | Bin 0 -> 28107 bytes .../topology/img/bridge/bridge_mango.svg | 12 + .../img/bridge/bridge_mango_large.png | Bin 0 -> 3429 bytes .../img/bridge/bridge_mango_medium.png | Bin 0 -> 2594 bytes .../img/bridge/bridge_mango_small.png | Bin 0 -> 855 bytes .../media/topology/img/bridge/bridge_pool.svg | 12 + .../topology/img/bridge/bridge_pool_large.png | Bin 0 -> 3484 bytes .../img/bridge/bridge_pool_medium.png | Bin 0 -> 2652 bytes .../topology/img/bridge/bridge_pool_small.png | Bin 0 -> 870 bytes .../media/topology/img/bridge/bridge_red.svg | 12 + .../topology/img/bridge/bridge_red_large.png | Bin 0 -> 3468 bytes .../topology/img/bridge/bridge_red_medium.png | Bin 0 -> 2670 bytes .../topology/img/bridge/bridge_red_small.png | Bin 0 -> 861 bytes netaxe/media/topology/img/cisco/test.png | Bin 0 -> 4968 bytes netaxe/media/topology/img/default.png | Bin 0 -> 18613 bytes netaxe/media/topology/img/firewall.png | Bin 0 -> 41558 bytes .../topology/img/firewall/firewall_mango.svg | 22 ++ .../img/firewall/firewall_mango_large.png | Bin 0 -> 4246 bytes .../img/firewall/firewall_mango_medium.png | Bin 0 -> 2049 bytes .../img/firewall/firewall_mango_small.png | Bin 0 -> 1031 bytes .../topology/img/firewall/firewall_pool.svg | 22 ++ .../img/firewall/firewall_pool_large.png | Bin 0 -> 4327 bytes .../img/firewall/firewall_pool_medium.png | Bin 0 -> 3141 bytes .../img/firewall/firewall_pool_small.png | Bin 0 -> 1058 bytes .../topology/img/firewall/firewall_red.svg | 22 ++ .../img/firewall/firewall_red_large.png | Bin 0 -> 4343 bytes .../img/firewall/firewall_red_medium.png | Bin 0 -> 3146 bytes .../img/firewall/firewall_red_small.png | Bin 0 -> 1035 bytes netaxe/media/topology/img/group4.png | Bin 0 -> 31480 bytes netaxe/media/topology/img/leaf.png | Bin 0 -> 964 bytes .../img/load_balancer/load_balancer_mango.svg | 26 ++ .../load_balancer_mango_large.png | Bin 0 -> 5608 bytes .../load_balancer_mango_medium.png | Bin 0 -> 4083 bytes .../load_balancer_mango_small.png | Bin 0 -> 1235 bytes .../img/load_balancer/load_balancer_pool.svg | 26 ++ .../load_balancer_pool_large.png | Bin 0 -> 5690 bytes .../load_balancer_pool_medium.png | Bin 0 -> 4133 bytes .../load_balancer_pool_small.png | Bin 0 -> 1257 bytes .../img/load_balancer/load_balancer_red.svg | 26 ++ .../load_balancer/load_balancer_red_large.png | Bin 0 -> 5681 bytes .../load_balancer_red_medium.png | Bin 0 -> 4139 bytes .../load_balancer/load_balancer_red_small.png | Bin 0 -> 1246 bytes netaxe/media/topology/img/logo/h3c.png | Bin 0 -> 12836 bytes netaxe/media/topology/img/logo/huawei.png | Bin 0 -> 12719 bytes .../topology/img/routers/router_mango.svg | 18 + .../img/routers/router_mango_large.png | Bin 0 -> 5213 bytes .../img/routers/router_mango_medium.png | Bin 0 -> 3765 bytes .../img/routers/router_mango_small.png | Bin 0 -> 1190 bytes .../topology/img/routers/router_pool.svg | 18 + .../img/routers/router_pool_large.png | Bin 0 -> 5271 bytes .../img/routers/router_pool_medium.png | Bin 0 -> 3809 bytes .../img/routers/router_pool_small.png | Bin 0 -> 1213 bytes .../media/topology/img/routers/router_red.svg | 18 + .../topology/img/routers/router_red_large.png | Bin 0 -> 5271 bytes .../img/routers/router_red_medium.png | Bin 0 -> 3787 bytes .../topology/img/routers/router_red_small.png | Bin 0 -> 1182 bytes .../topology/img/servers/server_mango.svg | 28 ++ .../topology/img/servers/server_pool.svg | 28 ++ .../img/servers/server_rack_mango.svg | 70 ++++ .../img/servers/server_rack_mango_large.png | Bin 0 -> 6248 bytes .../img/servers/server_rack_mango_medium.png | Bin 0 -> 4479 bytes .../img/servers/server_rack_mango_small.png | Bin 0 -> 1340 bytes .../topology/img/servers/server_rack_pool.svg | 70 ++++ .../img/servers/server_rack_pool_large.png | Bin 0 -> 6323 bytes .../img/servers/server_rack_pool_medium.png | Bin 0 -> 4546 bytes .../img/servers/server_rack_pool_small.png | Bin 0 -> 1365 bytes .../topology/img/servers/server_rack_red.svg | 70 ++++ .../img/servers/server_rack_red_large.png | Bin 0 -> 6352 bytes .../img/servers/server_rack_red_medium.png | Bin 0 -> 4543 bytes .../img/servers/server_rack_red_small.png | Bin 0 -> 1361 bytes .../media/topology/img/servers/server_red.png | Bin 0 -> 2787 bytes .../media/topology/img/servers/server_red.svg | 30 ++ netaxe/media/topology/img/spine.png | Bin 0 -> 971 bytes .../topology/img/switches/switch_mango.svg | 18 + .../img/switches/switch_mango_large.png | Bin 0 -> 3714 bytes .../img/switches/switch_mango_medium.png | Bin 0 -> 2710 bytes .../img/switches/switch_mango_small.png | Bin 0 -> 971 bytes .../topology/img/switches/switch_pool.svg | 18 + .../img/switches/switch_pool_large.png | Bin 0 -> 3705 bytes .../img/switches/switch_pool_medium.png | Bin 0 -> 2711 bytes .../img/switches/switch_pool_small.png | Bin 0 -> 964 bytes .../topology/img/switches/switch_red.svg | 18 + .../img/switches/switch_red_large.png | Bin 0 -> 3718 bytes .../img/switches/switch_red_medium.png | Bin 0 -> 2700 bytes .../img/switches/switch_red_small.png | Bin 0 -> 971 bytes netaxe/media/topology/img/test.png | 0 .../tor/Ansible-Networking-Switches-01.png | Bin 0 -> 66350 bytes .../tor/Ansible-Networking-Switches-02.png | Bin 0 -> 66471 bytes .../tor/Ansible-Networking-Switches-03.png | Bin 0 -> 66425 bytes netaxe/netboost/settings.py | 3 +- netaxe/utils/db/mongo_ops.py | 23 ++ 105 files changed, 1381 insertions(+), 2 deletions(-) create mode 100644 netaxe/apps/topology/__init__.py create mode 100644 netaxe/apps/topology/admin.py create mode 100644 netaxe/apps/topology/apps.py create mode 100644 netaxe/apps/topology/icon_manage.py create mode 100644 netaxe/apps/topology/migrations/__init__.py create mode 100644 netaxe/apps/topology/models.py create mode 100644 netaxe/apps/topology/tasks.py create mode 100644 netaxe/apps/topology/tests.py create mode 100644 netaxe/apps/topology/urls.py create mode 100644 netaxe/apps/topology/views.py create mode 100644 netaxe/media/topology/img/AC.png create mode 100644 netaxe/media/topology/img/DS.png create mode 100644 netaxe/media/topology/img/L2.png create mode 100644 netaxe/media/topology/img/L3.png create mode 100644 netaxe/media/topology/img/bridge/bridge_mango.svg create mode 100644 netaxe/media/topology/img/bridge/bridge_mango_large.png create mode 100644 netaxe/media/topology/img/bridge/bridge_mango_medium.png create mode 100644 netaxe/media/topology/img/bridge/bridge_mango_small.png create mode 100644 netaxe/media/topology/img/bridge/bridge_pool.svg create mode 100644 netaxe/media/topology/img/bridge/bridge_pool_large.png create mode 100644 netaxe/media/topology/img/bridge/bridge_pool_medium.png create mode 100644 netaxe/media/topology/img/bridge/bridge_pool_small.png create mode 100644 netaxe/media/topology/img/bridge/bridge_red.svg create mode 100644 netaxe/media/topology/img/bridge/bridge_red_large.png create mode 100644 netaxe/media/topology/img/bridge/bridge_red_medium.png create mode 100644 netaxe/media/topology/img/bridge/bridge_red_small.png create mode 100644 netaxe/media/topology/img/cisco/test.png create mode 100644 netaxe/media/topology/img/default.png create mode 100644 netaxe/media/topology/img/firewall.png create mode 100644 netaxe/media/topology/img/firewall/firewall_mango.svg create mode 100644 netaxe/media/topology/img/firewall/firewall_mango_large.png create mode 100644 netaxe/media/topology/img/firewall/firewall_mango_medium.png create mode 100644 netaxe/media/topology/img/firewall/firewall_mango_small.png create mode 100644 netaxe/media/topology/img/firewall/firewall_pool.svg create mode 100644 netaxe/media/topology/img/firewall/firewall_pool_large.png create mode 100644 netaxe/media/topology/img/firewall/firewall_pool_medium.png create mode 100644 netaxe/media/topology/img/firewall/firewall_pool_small.png create mode 100644 netaxe/media/topology/img/firewall/firewall_red.svg create mode 100644 netaxe/media/topology/img/firewall/firewall_red_large.png create mode 100644 netaxe/media/topology/img/firewall/firewall_red_medium.png create mode 100644 netaxe/media/topology/img/firewall/firewall_red_small.png create mode 100644 netaxe/media/topology/img/group4.png create mode 100644 netaxe/media/topology/img/leaf.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_mango.svg create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_mango_large.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_mango_medium.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_mango_small.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_pool.svg create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_pool_large.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_pool_medium.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_pool_small.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_red.svg create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_red_large.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_red_medium.png create mode 100644 netaxe/media/topology/img/load_balancer/load_balancer_red_small.png create mode 100644 netaxe/media/topology/img/logo/h3c.png create mode 100644 netaxe/media/topology/img/logo/huawei.png create mode 100644 netaxe/media/topology/img/routers/router_mango.svg create mode 100644 netaxe/media/topology/img/routers/router_mango_large.png create mode 100644 netaxe/media/topology/img/routers/router_mango_medium.png create mode 100644 netaxe/media/topology/img/routers/router_mango_small.png create mode 100644 netaxe/media/topology/img/routers/router_pool.svg create mode 100644 netaxe/media/topology/img/routers/router_pool_large.png create mode 100644 netaxe/media/topology/img/routers/router_pool_medium.png create mode 100644 netaxe/media/topology/img/routers/router_pool_small.png create mode 100644 netaxe/media/topology/img/routers/router_red.svg create mode 100644 netaxe/media/topology/img/routers/router_red_large.png create mode 100644 netaxe/media/topology/img/routers/router_red_medium.png create mode 100644 netaxe/media/topology/img/routers/router_red_small.png create mode 100644 netaxe/media/topology/img/servers/server_mango.svg create mode 100644 netaxe/media/topology/img/servers/server_pool.svg create mode 100644 netaxe/media/topology/img/servers/server_rack_mango.svg create mode 100644 netaxe/media/topology/img/servers/server_rack_mango_large.png create mode 100644 netaxe/media/topology/img/servers/server_rack_mango_medium.png create mode 100644 netaxe/media/topology/img/servers/server_rack_mango_small.png create mode 100644 netaxe/media/topology/img/servers/server_rack_pool.svg create mode 100644 netaxe/media/topology/img/servers/server_rack_pool_large.png create mode 100644 netaxe/media/topology/img/servers/server_rack_pool_medium.png create mode 100644 netaxe/media/topology/img/servers/server_rack_pool_small.png create mode 100644 netaxe/media/topology/img/servers/server_rack_red.svg create mode 100644 netaxe/media/topology/img/servers/server_rack_red_large.png create mode 100644 netaxe/media/topology/img/servers/server_rack_red_medium.png create mode 100644 netaxe/media/topology/img/servers/server_rack_red_small.png create mode 100644 netaxe/media/topology/img/servers/server_red.png create mode 100644 netaxe/media/topology/img/servers/server_red.svg create mode 100644 netaxe/media/topology/img/spine.png create mode 100644 netaxe/media/topology/img/switches/switch_mango.svg create mode 100644 netaxe/media/topology/img/switches/switch_mango_large.png create mode 100644 netaxe/media/topology/img/switches/switch_mango_medium.png create mode 100644 netaxe/media/topology/img/switches/switch_mango_small.png create mode 100644 netaxe/media/topology/img/switches/switch_pool.svg create mode 100644 netaxe/media/topology/img/switches/switch_pool_large.png create mode 100644 netaxe/media/topology/img/switches/switch_pool_medium.png create mode 100644 netaxe/media/topology/img/switches/switch_pool_small.png create mode 100644 netaxe/media/topology/img/switches/switch_red.svg create mode 100644 netaxe/media/topology/img/switches/switch_red_large.png create mode 100644 netaxe/media/topology/img/switches/switch_red_medium.png create mode 100644 netaxe/media/topology/img/switches/switch_red_small.png create mode 100644 netaxe/media/topology/img/test.png create mode 100644 netaxe/media/topology/img/tor/Ansible-Networking-Switches-01.png create mode 100644 netaxe/media/topology/img/tor/Ansible-Networking-Switches-02.png create mode 100644 netaxe/media/topology/img/tor/Ansible-Networking-Switches-03.png diff --git a/netaxe/apps/topology/__init__.py b/netaxe/apps/topology/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netaxe/apps/topology/admin.py b/netaxe/apps/topology/admin.py new file mode 100644 index 0000000..ddec41d --- /dev/null +++ b/netaxe/apps/topology/admin.py @@ -0,0 +1,19 @@ +from django.contrib import admin +from .models import Topology, TopologyHost +# Register your models here. + + +class AdminTopologyHost(admin.ModelAdmin): + """拓扑图子表""" + list_display = ['name', 'host'] + search_fields = ['name', 'host'] + + +class AdminTopology(admin.ModelAdmin): + """拓扑图总表""" + list_display = ['name', 'bgbu_list', 'add_datetime'] + search_fields = ['name', 'bgbu_list', 'add_datetime'] + + +admin.site.register(TopologyHost, AdminTopologyHost) +admin.site.register(Topology, AdminTopology) \ No newline at end of file diff --git a/netaxe/apps/topology/apps.py b/netaxe/apps/topology/apps.py new file mode 100644 index 0000000..680cc3a --- /dev/null +++ b/netaxe/apps/topology/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TopologyConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'topology' diff --git a/netaxe/apps/topology/icon_manage.py b/netaxe/apps/topology/icon_manage.py new file mode 100644 index 0000000..34a5dd4 --- /dev/null +++ b/netaxe/apps/topology/icon_manage.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +""" +------------------------------------------------- + File Name: icon_manage + Description: + Author: Lijiamin + date: 2022/11/21 20:19 +------------------------------------------------- + Change Activity: + 2022/11/21 20:19 +------------------------------------------------- +""" +from pathlib import Path + +from netboost.settings import BASE_DIR + +ICON_PATH = BASE_DIR + '/media/topology/img/' + + +class IconTree: + def __init__(self): + self.tree_data = {} + self.tree_final = [] + self.pathname = Path(BASE_DIR + '/media/topology/img/') + self.tree_str = '' + self.key = 0 + self.root_path = 'img/' + + def _second_path(self, root_name, pathname): + # self.tree_data[root_name]['children'] = [] + self.key += 1 + data = { + 'id': self.key, + 'key': root_name + '/' + pathname.name, + # 'children': [], + 'label': pathname.name, + } + if pathname.is_dir(): + data['children'] = [] + for cp in pathname.iterdir(): + self.key += 1 + if cp.name.endswith('.png'): + sub_data = { + 'id': self.key, + 'key': data['key'] + cp.name, + 'label': cp.name, + } + data['children'].append(sub_data) + self.tree_data[root_name]['children'].append(data) + + def root_tree(self): + black_list = ['.git', '__pycache__', 'favicon.ico', '.DS_Store', 'background.css'] + # 遍历根目录下所有文件 + for root in self.pathname.iterdir(): + if root.name not in black_list: + self.key += 1 + data = { + 'id': self.key, + 'key': root.name, + # 'children': [], + 'label': root.name, + } + self.tree_data[root.name] = data + if root.is_dir(): + self.tree_data[root.name]['children'] = [] + for cp in root.iterdir(): + if cp.name.endswith('.png'): + self._second_path(root.name, cp) + + def produce_tree(self): + self.root_tree() + self.tree_final = [self.tree_data[k] for k in self.tree_data.keys()] diff --git a/netaxe/apps/topology/migrations/__init__.py b/netaxe/apps/topology/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netaxe/apps/topology/models.py b/netaxe/apps/topology/models.py new file mode 100644 index 0000000..0eee30b --- /dev/null +++ b/netaxe/apps/topology/models.py @@ -0,0 +1,90 @@ +from django.db import models +# import mongoengine +# Create your models here. +# from django.core.exceptions import ValidationError +# from django.core.validators import MaxValueValidator, MinValueValidator +""" +------------------------------------------------- + Description: Topology + Author: jmli12 + date: 2021/12/17 + Soft: PyCharm + CodeStyle: PEP8 + +------------------------------------------------- + Change Activity: + +------------------------------------------------- +""" + +# Create your models here. + + +# 设备层级选择 +class DeviceLevelChoise(object): + + ONE = '1' + TWO = '2' + THREE = '3' + FOUR = '4' + FIVE = '5' + + CHOICES = ( + (ONE, ONE), + (TWO, TWO), + (THREE, THREE), + (FOUR, FOUR), + (FIVE, FIVE), + ) + + +# 拓扑主机子表 +class TopologyHost(models.Model): + name = models.CharField(verbose_name='主机名', null=True, blank=True, max_length=32) + host = models.GenericIPAddressField(verbose_name='主机IP', null=True, blank=True, max_length=32) + + def __str__(self): + return '%s(%s)' % (self.name, self.host) + + class Meta: + # unique_together = (("name", "host", "group"),) + db_table = 'topology_host' + verbose_name = '拓扑主机表' + verbose_name_plural = '拓扑主机表' + + +class TopologyStatus(object): + + FINISHED = 'Finished' + PENDING = 'Pending' + + CHOICES = ( + (FINISHED, FINISHED), + (PENDING, PENDING), + ) + + +class Topology(models.Model): + """ + 拓扑表 + Topology + """ + name = models.CharField( + verbose_name='名称', + max_length=50, + null=False, + unique=True) + bgbu = models.ManyToManyField("users.BgBu", verbose_name='关联业务', blank=True, related_name='bgbu_topology_group') + # group_hosts = models.ManyToManyField("TopologyHost", related_name='to_topology_group', verbose_name='组内主机') + memo = models.TextField(verbose_name='描述', null=True, blank=True) + + def bgbu_list(self): + return ','.join([i.name for i in self.bgbu.all()]) + + def __str__(self): + return self.name + + class Meta: + verbose_name_plural = '拓扑表' + db_table = 'topology' # 通过db_table自定义数据表名 + indexes = [models.Index(fields=['name'])] \ No newline at end of file diff --git a/netaxe/apps/topology/tasks.py b/netaxe/apps/topology/tasks.py new file mode 100644 index 0000000..60a4d33 --- /dev/null +++ b/netaxe/apps/topology/tasks.py @@ -0,0 +1,327 @@ +# -*- coding: utf-8 -*- +# @Time : 2021/12/21 16:02 +# @Author : jmli12 +# @Site : +# @File : tasks.py +# @Software: PyCharm +# redis-json more : https://github.com/RedisJSON/redisjson-py + +from __future__ import absolute_import, unicode_literals +import math +from apps.topology.models import Topology +from utils.db.mongo_ops import MongoOps, MongoNetOps + +# import json + +# graph_mongo = MongoOps(db='Topology', coll='graph') +lldp_mongo = MongoOps(db='Automation', coll='LLDPTable') +interface_mongo = MongoOps(db='Automation', coll='layer2interface') +layer3int_mongo = MongoOps(db='Automation', coll='layer3interface') +cmdb_mongo = MongoOps(db='XunMiData', coll='networkdevice') +lagg_mongo = MongoOps(db='Automation', coll='AggreTable') + + +# 拓扑数据生成 +class TopologyTask: + def __init__(self, name): + # 初始化待处理的数据模型 + self.topology = Topology.objects.get(name=name) + self.host_q = MongoNetOps.get_topology(self.topology.name) + self.NODE_HIERARCHY = [ + ('^.*.AS..*', "1", "AC.png"), + ('^.*.AR..*', "4", "L3.png") + ] + self.speed_map = { + "1G": 1, + "10G": 10, + "25G": 25, + "40G": 40, + "100G": 100, + } + + # 获取拓扑 + def get_graph(self): + return MongoNetOps.get_topology(self.topology.name) + + # 删除拓扑 + def del_graph(self): + self.topology.delete() + MongoNetOps.del_topology(self.topology.name) + return + + # 保存拓扑 + def save_graph(self, obj): + MongoNetOps.topology_ops(**obj) + + # 根据设备IP和接口返回接口速率 + def foo_speed(self, hostip, interface_name): + tmp = interface_mongo.find(query_dict={"hostip": hostip, "interface": interface_name}, fileds={"_id": 0}) + speed = tmp[0]['speed'] if tmp else '1G' + return self.speed_map[speed] if speed in self.speed_map.keys() else 1 + + # 根据IP 和接口返回当前接口三层IP信息 + def foo_layer3_ip(self, hostip, interface_name): + tmp = layer3int_mongo.find(query_dict={"hostip": hostip, "interface": interface_name}, fileds={"_id": 0}) + # 如果没有IP,则查询是否聚合口,再查聚合口IP + if not tmp: + tmp_1 = lagg_mongo.find(query_dict={"hostip": hostip, "memberports": {"$in": [interface_name]}}, + fileds={"_id": 0, "aggregroup": 1}) + if tmp: + aggre_interface = tmp_1[0]['aggregroup'] + tmp_2 = layer3int_mongo.find(query_dict={"hostip": hostip, "interface": aggre_interface}, + fileds={"_id": 0}) + if tmp_2: + return aggre_interface + ' ' + tmp_2[0]['ipaddress'] + '/' + tmp_2[0]['ipmask'] if tmp else '' + # print('tmp', tmp) + try: + return tmp[0]['ipaddress'] + '/' + tmp[0]['ipmask'] if tmp else '' + except Exception as e: + return tmp[0]['ipaddress'] + '/32' + + # 生成连线 + def foo_link(self, nodes, manual_links, strict=True): + """ + { + "highest_utilization": 0, + "source": "B3.MG.OB.DS.X01S", + "source_interfaces": [ + "Ten-GigabitEthernet1/0/1" + ], + "source_interfaces_indes": [ + 1 + ], + "speed": "10", + "target": "B3.MG.OB.AS.G12A", + "target_interfaces": [ + "Ten-GigabitEthernet1/0/52", + "Ten-GigabitEthernet1/0/51" + ], + "target_interfaces_indes": [ + 52, + 51 + ] + }, + :return: + """ + + # 排除重复连线 + def is_duplicate(links): + tmp_result = [] + for a in links: + source = a['source_manage_ip'] + a['source_interfaces'] + target = a['target_manage_ip'] + a['target_interfaces'] + # 正向和反向都去重 + if source + '-' + target not in [x['name'] for x in tmp_result] \ + and target + '-' + source not in [x['name'] for x in tmp_result]: + a['name'] = source + '-' + target + tmp_result.append(a) + # 节点信息补充多条连线信息 需要验证测试两个节点的数据 + # 计算两个节点之间的连线总数 + # 假设到这一步,已经不存在A-B B-A的重复连线数据 + result = [] # 最终数据 + for out_link in tmp_result: + # 两个节点之间的连线总数 + out_link['sameTotal'] = 0 + out_link['sameIndex'] = 0 + for in_link in tmp_result: + if in_link['source_manage_ip'] == out_link['source_manage_ip'] and in_link['target_manage_ip'] == \ + out_link['target_manage_ip']: + out_link['sameTotal'] += 1 + tmp_index = [x['sameIndex'] for x in result + if x['source_manage_ip'] == out_link['source_manage_ip'] + and x['target_manage_ip'] == out_link['target_manage_ip']] + if tmp_index: + out_link['sameIndex'] = max(tmp_index) + 1 + else: + out_link['sameIndex'] += 1 + + out_link['sameTotalHalf'] = out_link['sameTotal'] / 2 + out_link['sameUneven'] = True if out_link['sameTotal'] % 2 else False + out_link['sameMiddleLink'] = out_link['sameUneven'] and math.ceil(out_link['sameTotal']) == out_link[ + 'sameIndex'] + out_link['sameLowerHalf'] = out_link['sameIndex'] <= out_link['sameTotalHalf'] + out_link['sameArcDirection'] = 0 if out_link['sameLowerHalf'] else 1 + out_link['sameIndexCorrected'] = out_link['sameIndex'] \ + if out_link['sameLowerHalf'] else out_link['sameIndex'] - math.ceil(out_link['sameTotalHalf']) + result.append(out_link) + return result + + links = [] + # 遍历节点 + for node in nodes: + neighbor_q = lldp_mongo.find(query_dict={"hostip": node['manage_ip']}, fileds={"_id": 0}) + if neighbor_q: + # 遍历节点的LLDP信息 + for _neighbor in neighbor_q: + if strict: # 严格模式 只计算相关 + # 排除自己连接自己 + if _neighbor['neighbor_ip'] == node['manage_ip']: + continue + if _neighbor['neighbor_ip'] in [x['manage_ip'] for x in nodes]: + data = { + "highest_utilization": 0, + "source": node['id'], + "source_manage_ip": node['manage_ip'], + "source_interface_ip": self.foo_layer3_ip(node['manage_ip'], + _neighbor['local_interface']), + "source_interfaces": _neighbor['local_interface'], + "source_interfaces_indes": '', + "speed": self.foo_speed(node['manage_ip'], _neighbor['local_interface']), + "target": _neighbor['neighborsysname'], + "target_manage_ip": _neighbor['neighbor_ip'], + "target_interfaces": _neighbor['neighbor_port'], + "target_interfaces_indes": '', + "target_interface_ip": self.foo_layer3_ip(_neighbor['neighbor_ip'], + _neighbor['neighbor_port']), + "method": "auto" # 自动计算标识 手动添加的连线为 manual + } + links.append(data) + else: # 开放模式 计算不相关 + data = { + "highest_utilization": 0, + "source": node['id'], + "source_manage_ip": node['manage_ip'], + "source_interfaces": '', + "source_interfaces_indes": '', + "speed": self.foo_speed(node['manage_ip'], _neighbor['local_interface']), + "target": _neighbor['neighborsysname'], + "target_manage_ip": _neighbor['neighbor_ip'], + "target_interfaces": _neighbor['neighbor_port'], + "target_interfaces_indes": '', + "method": "auto" # 自动计算标识 手动添加的连线为 manual + } + links.append(data) + return is_duplicate(links + manual_links) + + # 排除重复的设备和接口 + def is_link_duplicate(self, source_ip, source_interface, target_ip, target_interface): + for link in self.host_q['links']: + if source_ip == link['source_manage_ip'] and source_interface == link['source_interfaces']: + return False + elif source_ip == link['target_manage_ip'] and source_interface == link['target_interfaces']: + return False + elif target_ip == link['source_manage_ip'] and target_interface == link['source_interfaces']: + return False + elif target_ip == link['target_manage_ip'] and target_interface == link['target_interfaces']: + return False + return True + + # 增加手动连线 + def add_manual_link(self, source_ip, source_name, source_interface, target_ip, target_name, target_interface): + result = { + "links": self.host_q['links'], + "nodes": self.host_q['nodes'], + "name": self.topology.name, + "cmdb": '', + "interface": [] + } + if self.is_link_duplicate(source_ip, source_interface, target_ip, target_interface): + data = { + "highest_utilization": 0, + "source": source_name, + "source_manage_ip": source_ip, + "source_interface_ip": self.foo_layer3_ip(source_ip, source_interface), + "source_interfaces": source_interface, + "source_interfaces_indes": '', + "speed": self.foo_speed(source_ip, source_interface), + "target": target_name, + "target_manage_ip": target_ip, + "target_interfaces": target_interface, + "target_interfaces_indes": '', + "target_interface_ip": self.foo_layer3_ip(target_ip, target_interface), + "method": "manual" # 自动计算标识 手动添加的连线为 manual + } + result['links'].append(data) + # 严格模式,只匹配相关的连线, strict 用来开关严格模式, strict=False则是开放模式 + result['links'] = self.foo_link(result['nodes'], result['links'], strict=True) + # 存储拓扑计算结果 + MongoNetOps.topology_ops(**result) + return True + return False + + # 本地计算生成拓扑 + def local_graph(self): + # 最终结果格式 + result = { + "links": [], + "nodes": self.host_q['nodes'], + "name": self.topology.name, + "cmdb": '', + "interface": [] + } + # 保留手动连线 + if self.host_q['links']: + for link in self.host_q['links']: + if link['method'] == 'manual': + result['links'].append(link) + # 完善/更新节点信息 + for host in self.host_q['nodes']: + host['image'] = "AC.png" + tmp_info = cmdb_mongo.find(query_dict={"manage_ip": host['manage_ip']}, fileds={"_id": 0}) + if tmp_info: + tmp_info = tmp_info[0] + host['name'] = tmp_info['name'] + host['id'] = tmp_info['name'] + host['device_id'] = tmp_info['id'] + host['serial_num'] = tmp_info['serial_num'] + host['location'] = tmp_info['idc_name'] + '_' + tmp_info['idc_model_name'] + '_' + tmp_info[ + 'rack_name'] + '_' + str(tmp_info['u_location_start']) + '_' + str(tmp_info['u_location_end']) + host['vendor_model'] = tmp_info['vendor_name'] + '_' + tmp_info.get('model_name', ' ') + host['expire'] = tmp_info['expire'] + # tmp_node = { + # "id": host.name, # 设备名 + # "manage_ip": host.host, # 设备IP + # "image": self.hostname_to_image(host.name) # 设备图标 + # } + + result['links'] += self.foo_link(result['nodes'], result['links'], strict=True) + + MongoNetOps.topology_ops(**result) + + self.topology.save() + return result + + # 增加节点 + def add_node(self, add_nodes: list): + # 先把原有的node变成IP为key的列表用于判断是否重复 + node_ip_dict = dict() + if self.host_q is not None and isinstance(self.host_q, dict): + # if 'nodes' in self.host_q.keys(): + node_ip_dict = {x['manage_ip']: x for x in self.host_q['nodes']} + else: + self.host_q = { + "links": [], + "nodes": [], + "name": self.topology.name, + "cmdb": '', + "interface": [] + } + # 开始添加新节点,并判断去重 + for node in add_nodes: + if node['manage_ip'] not in node_ip_dict.keys(): + self.host_q['nodes'] += [node] + # 重新计算 + self.local_graph() + return + + # 删除节点 + def del_node(self, del_nodes: list): + for del_node in del_nodes: + for node in self.host_q['nodes']: + if del_node['manage_ip'] == node['manage_ip']: + self.host_q['nodes'].remove(node) + # 重新计算 + self.local_graph() + + # 删除连线 只能删除手动连线 + def del_link(self, del_link: dict): + links = [x for x in self.host_q['links'] if x['method'] == 'manual'] + for link in links: + if del_link['source_manage_ip'] == link['source_manage_ip'] \ + and del_link['source_interfaces'] == link['source_interfaces'] \ + and del_link['target_manage_ip'] == link['target_manage_ip'] \ + and del_link['target_interfaces'] == link['target_interfaces']: + self.host_q['links'].remove(link) + # 重新计算 + self.local_graph() + diff --git a/netaxe/apps/topology/tests.py b/netaxe/apps/topology/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/netaxe/apps/topology/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/netaxe/apps/topology/urls.py b/netaxe/apps/topology/urls.py new file mode 100644 index 0000000..6fba5a8 --- /dev/null +++ b/netaxe/apps/topology/urls.py @@ -0,0 +1,11 @@ +from django.contrib.auth.decorators import login_required +from django.urls import path + +from apps.topology.views import Topology, IconView + +app_name = 'topology' + +urlpatterns = [ + path('show/', Topology.as_view(), name='show'), + path('topology_icon/', IconView.as_view(), name='topology_icon'), +] diff --git a/netaxe/apps/topology/views.py b/netaxe/apps/topology/views.py new file mode 100644 index 0000000..f8e160d --- /dev/null +++ b/netaxe/apps/topology/views.py @@ -0,0 +1,244 @@ +import json +import os +from collections import OrderedDict +from datetime import datetime, date +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage +from django.http import JsonResponse +from django.shortcuts import render +from django.views import View +from rest_framework.permissions import IsAuthenticated +from rest_framework.views import APIView +from apps.topology.icon_manage import IconTree +from apps.topology.tasks import TopologyTask +from utils.db.mongo_ops import MongoOps, MongoNetOps + +# Create your views here. +# 设备二层接口表 +interface_mongo = MongoOps(db='Automation', coll='layer2interface') + +ICON_PATH = 'topology/img/' + + +class DateEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime): + return obj.strftime('%Y-%m-%d %H:%M:%S') + elif isinstance(obj, date): + return obj.strftime("%Y-%m-%d") + else: + return json.JSONEncoder.default(self, obj) + + +# 拓扑显示NEW +class Topology(APIView): + permission_classes = (IsAuthenticated,) + + def get(self, request): + get_param = request.GET.dict() + if get_param.get('graph'): + content = MongoNetOps.get_topology(get_param['graph']) + if content: + return JsonResponse(dict(code=200, data=content, msg='获取拓扑数据成功'), content_type="application/json", + safe=False) + else: + return JsonResponse(dict(code=400, msg='没有拓扑数据'), content_type="application/json", safe=False) + if get_param.get('get_interface_by_manage_ip'): + content = interface_mongo.find(query_dict={"hostip": get_param['get_interface_by_manage_ip']}, + fileds={"_id": 0}) + if content: + return JsonResponse(dict(code=200, data=content, msg='success'), content_type="application/json", + safe=False) + else: + return JsonResponse(dict(code=400, data='没有匹配的数据', msg='success'), content_type="application/json", + safe=False) + + data = { + "code": 400, + "data": [], + "msg": "没有匹配的操作" + } + return JsonResponse(data) + + def post(self, request): + # post_param = request.body + post_param = request.data + # print(post_param, type(post_param)) + # 保存拓扑图 + if all(k in post_param for k in ("name", "graph")): + _TopologyTask = TopologyTask(post_param['name']) + graph_data = post_param['graph'] + # 只有link 连线需要重写source 和 target ,d3.js会把source和target改成对应node的字典格式, 默认给到前端是字符串格式的设备ID + for i in graph_data['links']: + i['target'] = i['target']['id'] + i['source'] = i['source']['id'] + _TopologyTask.save_graph(graph_data) + MongoNetOps.topology_ops(**graph_data) + data = { + "code": 200, + "data": [], + "msg": "保存拓扑图成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + # 新建节点 + if all(k in post_param for k in ("name", "add_nodes")): + _TopologyTask = TopologyTask(post_param['name']) + graph_data = _TopologyTask.get_graph() + if not graph_data: + nodes = post_param['add_nodes'] + result = OrderedDict() + # 多字典合并去重 + for item in nodes: + result.setdefault(item['manage_ip'], {**item}) + result = list(result.values()) + # print(result) + _TopologyTask.add_node(result) + else: + _TopologyTask.add_node(post_param['add_nodes']) + data = { + "code": 200, + "data": [], + "msg": "新建节点成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + # 删除节点 + if all(k in post_param for k in ("name", "del_nodes")): + _TopologyTask = TopologyTask(post_param['name']) + del_nodes = json.loads(post_param['del_nodes']) + _TopologyTask.del_node(del_nodes) + data = { + "code": 200, + "data": [], + "msg": "删除节点成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + # 删除拓扑图 + if all(k in post_param for k in ("name", "del_graph")): + _TopologyTask = TopologyTask(post_param['name']) + _TopologyTask.del_graph() + data = { + "code": 200, + "data": [], + "msg": "删除拓扑图成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + # 增加手动连线 + if all(k in post_param for k in + ("name", "a_name", "b_name", "a_device", "b_device", "a_interface", "b_interface")): + _TopologyTask = TopologyTask(post_param['name']) + tmp = dict(source_ip=post_param['a_device'], + source_name=post_param['a_name'], + source_interface=post_param['a_interface'], + target_ip=post_param['b_device'], + target_name=post_param['b_name'], + target_interface=post_param['b_interface']) + res = _TopologyTask.add_manual_link(**tmp) + if res: + data = { + "code": 200, + "data": [], + "msg": "增加手动连线成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + data = { + "code": 400, + "data": [], + "msg": "增加手动连线失败" + } + return JsonResponse(data, content_type="application/json", safe=False) + # 删除手动连线 + if all(k in post_param for k in ("name", "del_link")): + _TopologyTask = TopologyTask(post_param['name']) + _TopologyTask.del_link(post_param['del_link']) + data = { + "code": 200, + "data": [], + "msg": "删除手动连线成功" + } + return JsonResponse(data, content_type="application/json", safe=False) + # # 修改单个节点信息(比如图标) + # if all(k in post_param for k in ("name", "edit_node")): + # _TopologyTask = TopologyTask(post_param['name']) + # data = { + # "code": 200, + # "data": [], + # "msg": "删除手动连线成功" + # } + # return JsonResponse(data, content_type="application/json", safe=False) + + data = { + "code": 400, + "data": [], + "msg": "删除手动连线失败" + } + return JsonResponse(data, content_type="application/json", safe=False) + + +# 图标库 +class IconView(APIView): + permission_classes = (IsAuthenticated,) + + def get(self, request): + get_param = request.GET.dict() + # print(get_param) + if get_param.get('get_tree'): + _tree = IconTree() + _tree.produce_tree() + res = _tree.tree_final + if res: + return JsonResponse(dict(code=200, data=res, msg='获取图标库成功'), content_type="application/json", + safe=False) + else: + return JsonResponse(dict(code=400, msg='没有数据'), content_type="application/json", safe=False) + data = { + "code": 400, + "data": [], + "msg": "没有匹配的操作" + } + return JsonResponse(data) + + def post(self, request): + post_param = request.data + # print(post_param) + # 新建目录 + if all(k in post_param for k in ("dir_name", "current_path")): + data = { + "code": 400, + "data": [], + "msg": "" + } + if post_param['current_path'] == '/': + # print('根目录新建') + if os.path.exists(ICON_PATH + post_param['dir_name']): + data['msg'] = '已经存在该目录' + else: + os.mkdir(ICON_PATH + post_param['dir_name']) + data['code'] = 200 + data['msg'] = '新建完成' + else: + if os.path.exists(ICON_PATH + post_param['current_path'] + '/' + post_param['dir_name']): + data['msg'] = '已经存在该目录' + else: + os.mkdir(ICON_PATH + post_param['current_path'] + '/' + post_param['dir_name']) + data['code'] = 200 + data['msg'] = '新建完成' + return JsonResponse(data, content_type="application/json", safe=False) + # 上传图标 + if post_param.get('upload_path'): + icons = request.FILES['icons'] + # print(ICON_PATH + post_param['upload_path'] + post_param['filename']) + path = default_storage.save(ICON_PATH + post_param['upload_path'] + '/' + post_param['filename'], + ContentFile(icons.read())) + # print(path) + data = { + "code": 200, + "data": [], + "msg": "上传完成" + } + return JsonResponse(data, content_type="application/json", safe=False) + data = { + "code": 400, + "data": [], + "msg": "没有匹配的动作" + } + return JsonResponse(data, content_type="application/json", safe=False) diff --git a/netaxe/apps/users/models.py b/netaxe/apps/users/models.py index fdee708..7208adb 100644 --- a/netaxe/apps/users/models.py +++ b/netaxe/apps/users/models.py @@ -3,6 +3,7 @@ from django.db import models from django.contrib.auth.models import AbstractUser import uuid + class UserProfile(AbstractUser): username = models.CharField( max_length=150, unique=True, db_index=True, verbose_name="用户账号", help_text="用户账号") diff --git a/netaxe/media/topology/img/AC.png b/netaxe/media/topology/img/AC.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf78b7e1ec31722ba4c52674b4c4e6ea723dcde GIT binary patch literal 22611 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 Vi1*W22JL?VGZRbWDkE&<{{fny&UpX; literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/DS.png b/netaxe/media/topology/img/DS.png new file mode 100644 index 0000000000000000000000000000000000000000..3486b04b5ba618f82566f53b79399a8c199bacbc GIT binary patch literal 31480 zcmY&<1yoe;^ZwEx4HD8VB1=e1EFuaB2#Rz{NJ|PxEhs6C(v5-A-Q7qmh|$0YN{YC?oWPO(R<(%GIw=jFA#{F9`_dyl$p&8d`RN0q5XhlnVgM63Y>g% zfe{4a0%@q;d*(N{+vb~YZvT4!GQe;)04aG|exoUrvXSRHX(&Axi5P$X301$R@AtHB zjX~eBw7{Ekn_*^&VK0p92fobq6BB$1A6L-^af^w6nelKLRp*VHJIQD>41jSumrcYb zx;oCy1t2e5%Byy(KFtP{)h%rX=bkm?P3vyDES#_2z_vM``H;AW*v?Pot~Fu}@udlL z#@fdS9}`G}NsX@45x(`I9diYxbBhZNDG`=UY;}u_k8Jk z6Wr?RoREXOWaxa*DG_Q9(jjUNHBcN@A?4mk^2n$51EIJPLGYsadL)HTj0Ukg>jR3P zDWG%?l#VyI1h>1iyEwucE)&9V6ICLd$acn|tr)|>9Yzyw!?|jBCLWAk)}ja`Lft`F z<$h8!STWI2$rpLEY(t3gn+p%5LpZ^uI>QHk$MT`?3lN7Wsv9$X@5KPn3a8*6$cj!f8|_ zLzvx*`eq_SSwl?$6Uq4pj@*7qD(u9ic+V>@tE4~}fyHxYuT0KBqptl0Y{Q~Wp_O16 zDZ!1v083D<>mL9=R<@w-;^CczM88(6gPE*=NB5iF-^=Ob#Dl8Oji*^Qn(^bd828A6 zVKBUt7OvPy0<3i-E0Hfu$)P{)d#;BjmDJ&3I#fZQF+vXG=BTFv6gnhz`ZqdR&5q#LY9{5>ozxI%qfi$ zLjnrhFv19QCzJ%kCMaH0r31Ky!_v#dGJ;!Pb{4PL%(i zhY`Kx&6!E-5I2N{09F-v;jeHZ1Fr`5$gxlt&@zAzqe`D1K@;*rZ<1r?HH!EZ-~Q}5 z5JZs!kI-nW6&tcd7+mXohHP+~pQFcn%%}+k_fMsOWZQ=!^F0Wky~V}*cPY3<&jTDP zEP=-v6gPH>4V8xXwD`DTX&jf#lI1ryObJIcxs*gu0mf4uHyR_oEugATeqTW^Sw~lX9z0eqNk>(>i3W#-Up}x}u7yYt*pikmtk`nFZ`;|2j5D zlvb>$;fT2l`@nc(X-wP_+x-Idy3?0}_^mcwvY-If{X!FUwy?10QE}GEvH}`(l{7bp zJQ(l+GmM7qG+T9gu(3_|`H2J%4V(tGRwtMqO&-WoF~(?rA$t>EL9@nVMe4T>*nBBl zhgNLI5DP4n(rF&jk>3T0ne7*69>8;sev{~4{m9kjjaBs{Bl4(^%&a$O-5_5UM@||l zz<9t>TI^PldhBuvC>l(?a#v*PFf06NQm|l9@N@3X4%$j9Q%k^yBgXL4}PUafcia*C$oJ+2BtQ7wHg&IC@pir;|o7SCz$ ziY^{;-aN*hydlEw7Tzt7iL)vGxEf0xuglJU^V&z7Um@QvS&3c)wmKH3x+88?Q@V7l zD8%ksTW0pK=_A8xBcDgBu8LJNso!YeGyKO}3`!3X9n7degTl&VmWv`H4BxwSX13?M zgEV!~8l~E2F7DS6Kqw2hb5%z736S+GHScm_K+=#zCVFV!vBw8-H^%L!KUoD=BEUCKpd#_ zDI45Srz;Hy_MYQx@T0k!KK5UlZwS{0HMaRJ1~eqPxF#0LT-aL?n(i{=m=yDms> z100faD*r6<;SE0r>d1gI`k(l0qI-29G(0sh*}{jxQ^xwgw|aL@QSq3lTVlvK6&{aILn z8j@B`ynJ(un@)vvBALDhdFVkhhk@88=AkpVe3S0+lx%fT-Zo0LIPn7lKpvw<%<6^dj{QOOdRY5fU)J8I4cMAc4xLK0(N$(2$%1yNskP|N}>XusrAcV{81_t z?0#iFx`~5aNvRO=UXR!Vbg7an{d&CgieM%+ZQ{V18-B<8Y0liQoN(KE(2+70QVoY} z24NLYI&ADK@Se6_k5V{bcxw%tvc6a5z}A4zv?!=n{TBm!m1JT@VFZgAM3|eglN)5! z*w&K{1{87ps%%^@le<(j^XTc)&9N z*Hu8Mn&ORVT!e$5X+&7R#W&CcjAL%FA~oPlnV+vGZh;2e{d6F!Y7rYB>8z@mf2a2C z-t2vyy}LAu#E9OkyD{Rp1ofZAsxJk{?)>4V0ghs!FGP!QWYQ-jt8Y7PA2>NmW1^)T zj`_Sw{6r~CAK++~co%1m+t&3HoYP+4s1iK=bg)$;IP7-tp|yHStINs`%XarFCj?!r z1Fk<`ZS*p?5?@T4du<6z0Qdf}@n-gcYgXcmw`M7YZtN=>%YajrKk(+?Azz z&g^Nc1N9LYGvg-$VPU|^hW0nlG6zaQ*<9!jDx)kr?29S4@2{BWd=s}(VWq*iE2F#Z zUeIQdIRiK7H!erJW06b&G^^g)~A)!5TXOrrd-uY}Y*^aQ~bUxYhR6@^?< zceAvl`)V0%Y#GiFWsa7L-*o}#cl4+DY!#$O5ceCE5lu6g?2~65AJN2};zDR#GQ646 z!5Y8M%0lY&#Wv_%lu)5sm)hN(M& z@NqM9yw}3effMXvtu@h_(*8i4Q#V8jBDb2w3iof@`3UYQ$C1Ij#&`u)#bW zX5O?Xxs)5L#U2*!F6jgv-XM1d=WbSEb|=MhWwKn63iSshV~YS&krc(|hK64lVN%r#W@~%p^b_|teDO7qTjcq`eXGW2AVCS#ppwmZp84dCBRnBgOk?`` zfI5XbD609|MSG}SdqJuZRb*-vVW5@y(D**fLz~+SqG5jBr@f%zpdLS$SxzIB{K-&# z{o77tIy{xA z0aAaFg`j9SjRe*S z%L8*wPSf2qwL}`yV>Td8xa$KqbfXSFIX|_Y+*6;Bbs*2j8-zT|$>pw16=jcZY!Zcc zRoQO8)tK5nbAB|zQ9`<~$ocpiabTe66-A1Mar^)$}TfMqe8vDk#+0D23x+Ur6!GJtn;flw3}LTG;J)rj;}Y20Le{ zxqw&2nLpmCAq0R5(V99% zhlKzS#a*R+wmhfM!}}|2o`bUSOj$i~_S~$eRr27Qh8pSN&QRp%R4`SIInPmD-)KEe zyDZJ&X%B5$`EirWdsr%Cr1&Te5IGVA9rjiaHrAJ#WZ?9d+#jDfZDn1%xV8X5OF5wy z_LYdUi3p*Scwix9EsyF!tH(!JmNcsLkdil(n+tDzH*`t7azQhwRuPS_R4uxuyJrN~ z5w6}P<7V-R8=kIC8uwhy4S`XFnYB0des)$&wWEJjmSUrfpRbYra*MolT_RHD`O zM3NvtQd6%ZWx3reoz5ZHC#(CH+=j1G{3e8$V762D7Z&X4Vt_%hUpbA7003zMTHEL zzwLfvJddseD`^W8#@A2_KSWn?)YL2f**(oB^uhJSTd0nsnba+k{(w)8tKg)YhCbL&|7#@0_H48xa=*VFt zWzdXQ@Vz(C7Eqbc~As+uE^wPjy% zi?uyLltl6_w%=k0w~lD4k?Sy#tKeH%3=Lnhi>P)g0#2|%UtMw6D{n~%kV$%5CE6fX zlC^>GiI4yip7P&MS3Z}R$A*iak^nfaiaX5R8|@Ib<4{GsGs*!c1aO!SEE0;yL)(YK zd@rlND-N3nLp7sab42th>5@U|qJ3L-=nJfPM&-wb{xs?be3Qs?oZA#Kb0?CVb5i!1 zDJcvMPro+%t-s=pTVy14D;QHSbJV^VlCU>Se9pXgOwO&USoSMk<3U#&2~WER-$u3e z78f_}%h}1r+54N=i{&WlJ+ePpT9RFWinMJ;y7o3q3E|MWN&WC*F_li#Wc|4mL>V7` z7zO^o=5R~_xe@nzDK~_ZqCXRUGmM6^Hh$9?nHwDjxqOhaWU_S>Y5FL8dVf0*k1WK} zFuuPN05q=3R(qYe0AyrXH1ZsH{0Z512s}W|#)ne-s5wr_&_$@K-j=wHrZd|XnE9FE(1yuwtZPdyhfqpjFyEWLM5~ZhH)|K(}k}HE7fmrM807l}0v~2CNs4 z)jP`zR=;0re~mbREYm-3UtXX!`Jk1o=z)O@luk(*^V~g{H@!};s<`X)zpMG(t>KT2E zbEYWa-0rNq#&1qKyla^AkP0r1x6f;mjNIe2hgY?Y$THf&G<=m_I-S#0Y8MR>j}&~H z272jU(w(HvMaoreJ!vE94#S@3Nh$eq;b%51Kok)KfoBfA2mA3^cL=1Ft)A<}^pNEJ zP>D$*)kWx(SxsZDlS4B<+h%%cj^o7>`aGhM{+%xp>DTC6tn+SDgL zX~hGZ&BYLshjej&86_e}@fKNli* zp!eu8=O23e?$I$dWOysUXuc$KS2hc1GhKwfBkxF8Z~O?!Hqp#Hmm7a7r^lAumq?&L zoQEm=K0WQEpWbF;PAb>0FIsEJb7{XsCsO1 zV%*cqQh8Q96E*XR6CcJ5BxWsDpMJ*YHNnyJ1L+DG7e#MrD>~eg0kUDVpH-XiwM#U6 zGC$9JrL+gi6Y8sEv~J!}D$YFftrRj*b2}G)|FS7G>L8)l+m8-!)CW7S*y9_?gE_bQ zWP4BHd7U69qi^Gj*PEintvdxm`sD1n+)i-&0mt4fyviRkf%bwclxNzAzEB4zorj#Z z9(UG$FUtE9s5oa;qg#wUD4)>}Q?@O~+TV+MUq-wTz_p?c$yp=e6~7%MVFykH8Npd~ zr5$UQ0+57eSmhMVc2%imm1TBq;s{Gnu;lgQ@cXnmxk-L5$q!n4BygdKNivEIjy5(V z_$xqP-VRMZJ0q@b)^+O4t%;xoJux_fTsJQF&;Jf?!y`Wb+qXMJ9oYO0$j=UkajI*{ z?Mt5|xTpxpWX^~ra`Cty>#J`(4rLF(FTZ@9vOFWbkQy>6$Q1C|4b`PSVj6sRsJy_h z*imiUe1xB?kr??{Ag~nj$-E7uDIZWXzQLl@Dr%dbYC!d>rOzz4sP!8PK%~WsNsVBI z%$H=6kDhKzc0aJ#V%=vUZQ8JZ&sO|xO?2bz9KX@Va!~XpolrT8dfHkLv57hAtSY?) z87Z;fM&qTya|8~()E`bc(>cnxPkWn1mGEaBNL|?bZv=Y)0cN|4#iKB}!zf*-Q`Kd5 zmI==KIb8GfVM~8yjp!%FqMfLhHR+ zLi8#)XCA{4eLb`XP`>o-pTF!4gs(R-?A~wVu2WqNO`|IhJ?yRiC^Pu7zC7B9S=iC$ z8v%|)TPkMWjosFFzkBM37et`OJ4|v$DA6w3t5WPc-3fbWt>h(Ecwaw+|NW(}e}oQ| z>V=bVh7$*)HMfnC$Q=lfL)6VWD2rYh<005&nfXo(-+${fj_RYq0|5ufMoRZ6KFt23 zXs;c~UnjDL7xj=berxgR)pew`%Jl`{}F>2#-LD>ViV z?$c-rxN?GN`JMBhSyoTU#62Bhj@Kh|%_Gl)nu4j>N`|i~x6@$HZ`h^UX&Yl=ZKQ*(^RQ6M@VL@guI@!WS5gjl1WOMYZk^V|rB0I(+1d zaz)qFZC}4A8jdfj)0(}-hu^D0Z*ShZq`-CM;H*X-fPzdqOHPJ{17@(fQ=rOl63xIfI2;K%<&(5qsf0Fv1yV@?BCKCcY1 zx00>j9b~~i>!KxZd$!hv-Svs2&NEzoz%t^Fsml7gjLcyt6(S2+fumxxQ zSe`t~q zs}LTyAO;r+V}gfg_6@o`dzQ{08rLL$^u-IuK1f|U5b{`UVvw$5b|s4UK-JPm$!a=i>2LL)_OY81!}!qjaf3@JB%j3ZB{*JBkR(djIH3G z)V!BM8J>FDzInZHbqO?ZuI2~{mxK67>zAD z7B`KD&2f}unp#cbkqpmeh|E!)*!3E9{#maRgkSefAf47U^;&&B2c6Q?rk+RSE`}^d ze;S81|D{SbNd90uv>G$*e=+39FP+97(c}FU`}BMvKy&?z+-wf(HSkVg4|>dTnLLsg zgGpi`arP0~ah>{M#Ua~b%AVWS&9BaKGhj5bg(4!gg8kh!N@)=1BI{A1J_qZg(||!W zJwj;yO6Oa8GR_i$`8;t%p%llk!hKuTo#SVtFNpZbclDVicBqMQt#u~LcIoxVn zrzZ7S=hW2c&625;jJv-SJoy&~%xvSRYcT}IMp~3fm{s*Ng;UofII^cD@7W7JCpHG> zqUhG)LXBWCqY)*ym*i|z;D+5Kl9zt}n*|_0&#L+UOrJ<_zo`=55|I<&9Ba=%%X0^D zVH`O2DD5n7Qsu)QWd`xN%jcf=@V#GQ1i$>8${hMjArP6BQ`VsJ1Cgrl5)}6A7|lbk zeQ;lvoIYigFuTabsIi@h#ol4AniGJST|+pNuGymTH$}WaNt$o{K_> zEjzk40kr8FUy+$Pwu-OO$rA97_!2X8yCrC`wyP-ixjUKtWk;&8=w(QnzZ5S?1%=xL&;jUh&YCzK|wyTW4@^jxZd)DO*q2Q{an$fJkD)A2;r*2YKl1{S=%8Ah! zy&QXtzWp7U1_?0qPMI3k~%y;^$0t^l*I($u{N;kp<&o87(ownN4`ub^cDF%J ziXX0_lO_}gkfQK2#kz2bdA7Lg<;Q4gI^$sb&jZH>ulcT<5;4aJ%byXW;%|9h`<*=S zg|bv0tx`OjR8pV62}}0JKm)?7vHnySi7zgJ{iDX49GjqCw_J~EOqQ}tL2K0S?DI3( z$c22(beE}hL?@P=P4mlFL+i{Y_g3Yq@gdoq~(#S!TbDek*^uM?q6LVt>xuDSwSA(zCa$;E?DY^8{)%NnRsBrRqmr3 zbiU?B%gLwT^Z;e#YYX+cAH`-vOY6(~Rg|Gkl!%DM#Li;+z=G=iXxlG)6<;^0;G?XX z3U#B;d8T+wbevW8Nj)f9{olfVGwIK?e^V{=>>%tM5|K>x_UXL41Y`iG<*8#Kv)Yjq z*Geh~g1%~21?8p#gj4$q(mUomMy8&5vH3}Thd;OI z*}O|0blww4^CgIB`xN8#&+C{#S0*~p%}eEVz2n@)W%v0e@I^(2@Pg+{^34W$ityBNr<_z!`YM4m$9<^?!}7x>boaICm$xRizd`aj1|t>P z{L2QKa{A`+(Iu$~CnU8^)kI^4uRgD^yqst9{Ay6TCtBscd?!tF%1>|I_K7Y$b7S)W zLD>N{iEaV>_UIP}{gb;=&r(dtLe2wbs%wY>;ndBOn2@vzJ*cuGjp{hMp!aIabrrer7T(yuT>jZ6@`*0#a$%=M^F!HxaE9_7 zq2*+gmO4gFkg!pGMk12LMfe70e+azb9~^EkYzV9XG{76WS06aHcJC^l!^-;IZ7f6V zB{|&7nQZ_Cj!)~I>CfZh9zZ%#2xuC1_|%4d0Hu;;MA4JO%$7api5M_v@4uHGPX=KK zQ_%b%#^rn26P)AwT}ZnWY_oSYFiaF!b=|%jMj+AjNr8b2}`V$Dy?J>Z}JYdE~S+O zW=-FEe=`~QO$u->X>(eT>}i0f+L#l-Zu5U?3O*Z|<~zfgK9ZeL3^K}Q?MyGz(ng_@eM1K4h_^%>h|sy9R;a$~Vw?)2EQePY05?^qM`^P9;in!vz60_*WGLteyT z9pI5-PS?#!iR9I-T!-B4rf7_wHAzz&DFzTAf6>k2>u{q*lJhL_^C!YOZSi{w)-#69UIv+vLwz5U7d6P~g({;B z$*%{3Kg2FK?_0ZuzMjPbdhc0WUu}~*p~5{J<5c4n&r{L`;)5xE+NTJ4XBNZwGN*R- zH27&&Pe9&W_vmJQWgV|8VsasvEF_}6@!Zkl7qdnE94?1k%x2h4eTZWtAWv_LdziXp zvVTG_cia=nf3A&MOXKj!oDjVxq~mCI^~FDOo{InP(kbD?)j2-_cY$ zU(1>ArqU=rC&YV@LqsH0tQH{AH%)&;zo}S+ugW>pA`~Dq@5vOJel3?}y{jYI_->Y5u9RF^aWBfu} zx=Yjmo(6J|{-Sf8jRI`naJTg!oAISmMR)y(I2X6rnKPS-(fW<@{l_Js2lM!D^Q=b> zQU$`MR{rK8j3gYHTBwNtBZ^|SW=rJ7*Q%shBcm;=d09mz0$PrHc3w{$X zpX=3#xEP&r?(CN5FaYvBdZw~PJsG|`Ry9QI)1B%rueY4s9vLw>0u!pjiUIe9s)@c# z_o>WEEi5pJnbhu4`vDA;smwF$Z*51D8Fm#Mq_g9WqbZGBjtser`(kV+0`x?|WS~Q5 z86IB>EmcH!3I`{oq8l6NnNdD&UpERW)GZ&Rs{8xpHTu_55IxL?u{~ZgO$0 zzOz>)(izpToDSoR{lbEH=MOG_KZnVzl3cZNI39WS^v=Ahz*4tD+plG4p81B&rlB9^ zows+zT>ve6HEekvOOFWDBQjqp`I_tE%4%ap>Zz`M#-gp4%{ErT5lcoJo?CaJ+kY8O zP3Xww{oj6p2+c5)Rsn)9$aDdzg%NJ`X@fmr7g^PQ0nipb^L0JT8;@ICWH%GdgREF+C4?2Ix}|4v|GuF zf?4P9Imk&h`MX%(HDJX2u9QmkJ&4AO0ss64fh*O;bKmF|(PG5Zs1n23T9~p$W`I*< z&jWU<_hi~lgZlKcZGFpoSuud`lkWmWTY*3=kx8eFyI?KQ=*#sUHx_(OTG>{jYB*ak z6;=GmLh>* z_s?h%DMl1iD)Fb?Q0bH!sHban%=q={H@`{thO5%>O~Q7MHdu!1*iVhP2ZYMgoxJp9 zzWZ)UrdHMkza;`&A+`s$PaRe*U6uj)V7mM`v;I)D0#w@)QPL702g_}bU)y=af$|c? znll-oY9_x6pV@8!yN}@^JnD&%PNBf=l-|L`j^>oVUQgIcDZ%vI$=kiV2(03_kz)ft z?VwMN?c=YS1zeFrvZVNd-j;(s@5#X0*5q0t{}k1>4y$=fq*uk#)52el`($x11>!9M zI^B_D+;6)w_`+GEz1)wg)g@;jCnF7d-*Mx);=9YZ@FLCeMis6~T}rUMKE;7tOL(5! zyYmgJ5!gfe_=wbMg3Vevv*xkQYy-8o+Oj?-aB{;Y1^ds#z6p#q*la_*hbqI`fEEWc z20zQH%dc-Mj=l6Er60C(C@LlZn)=uI2nFcVqrf^&uVfp3^VjRvY`rm%j&QPOxX_^q zt=JPeyzJ5_#CHuPMlC4!-k$2eco5bjv zE!X;O8o&0e|6&EumgW7sB=$Bu?mpvX#@jpP0;#P2JvIkz`DkiHf1J{0U5i$)328!y z&bi6cIBu;Ud!d2gq%=!><)2kFgGIy}>vF%>=t)9{W~zf~V8u@l>pOvVQ{eLW4@IyT z3GfVCL z3MX`UwT!7s*SYR;RrUCyKV&T+ZvwLxx(r+;_^npq0|%u@b;0^;VzkCDcgYcPw@S5? zmfS|9B3RKXPR0_&;6F;HaDHdS+#0jl4&1;7h&ifkeOn~Y(?`XUwu;+L_2Q^2>VV>b zx1`^Ft3}jV+(+6aS+-?emsQKGw8zclW#&I#lH(>pWW%YuR4D+1w?4;J9j~pL3uHcJ zO8TU3v!tsF%UAb9fJ(j%Xt2(fQN6Fe#BHqigiD;mbg_NN-dwY)9*EmZfK({XH0p;a zpgRB!KJDXHE0(7QTmG)cRQj*B;x$v;lnDo~E+H9URkNxlNnTb_6+#e@E8Mx%1*K-> z@E8TO2vnID2aCh~cBew$Jb#a!{6Kka9{B{Ok z4+gogmE6!n_k43UQRnZ*7f?LzvWadK!mViiyaWU@-}g8)aT8({Extx0Pzfl(Qk0S$ zPTR0w9Of)No|UCT&uvHfWq^OJ2WQ4zs&hf+E!TbZL)%uvFq-=GQ>L_ z++u*TcB9>sPh>ZJT?_iDqEE)Gu1Qt9%Mxdp$H@EQH+tmC95-dJ`(;`K1AFvhPX_9h z$^D2UY=+|(;WIKZjnG*s|9OEtiQ82AqrkurzH*cv8IMiUI+!&`+AzD@HME08voV0H zbbb>5{Rr|b`jQ(fmphBOW-@M#qlT@HZ((0uptw07kK$-whv#)}jY9I^N(WPTSrB(y zU6^OiEIxRAr4tx?pgy?mvj{E!QNATqH6o?@-Nq64zFtH>*Ed^++y zkqdX(jT(Z9X9N~cD*D77krm&N#avWCq>j19BFVo-3EHrVI%>9jPlHT-@X z-poq9#!5b~krH6x-6j_c_cs-UWL#x6cPa^=` z2Erl)B+^3L8NhF!)?ax?dId;N8$R-`XI`4Yg?t1ky{!1^{fPD&Oo1%OSG_QkC5@SV z;|e{P*{%89S0FH-hdbyI`@|b@!ftbLFOw1psZaJ3C7@61`;i0m`wBEamKi2#(v2L> zC>jo^x3aXZxn9J86`Fo8pYA-J&ttiAXKRZRP!f)lo(h^&PvL7W3wX;2I$6fJjX@G$ZIqT3^u@ftfsM1-r}E0s-{Y!qzmu zPS=wX&^%(*h~_aNOBU;gmWKY{G2u8zUWP~lYMt1Z#t|7e40>02kUG+4j%kQ7UFQP5 zs5_Fj-HF_kb9ZgfDg21J^8A9Du`1?zpXOHoHi-TW!R?sJRJnu^% zbU4f}?Z}|a#`o`t{IiJgLwHUs*w6)O{6uJm(E%R$R^0L~+r*YgDOe1$cd+=D_KcFr z4Q*;J-D>k5*7(mms*Lcyrgj1oGrle&0NXKaciSeHqcgrBnoDR<9twRMy1vnF)ejR< z3Bfa)(6`o`5Ajmo&hh&g)6z;VXEDG02(t50?z2*Maj8GJ!4rH zK99kPjKy`i8<*rb)LJpbD-;&AnAE?^7)Q=UjpAHlIvQ71>C0I9=trObE1aa?X8(`q z6f(__9gs#RwtsF;4B`T&s@J1Ns1s_we%PwdLDpx0*UvLN)`rJFFyi)l@r^SDPG1ra zx5EO-d6^|)$%6ZzQLe|PKujfv8D&AY+`3^>TJO^WMm682{79hknQwN!it zsE61lu!z~bK2Nm)D;Brj6FA9W=RYAR*ajyA@gGDihIEeU*ta@c-Kp9l3%hQQ9$p&G zl1}w|l+~kJ+NX&#%eFG1R&VOC^xx83Om5_@Zn7I*k%e-3jOq5+GYVA&vCJ{F=nrH= zRo}8JYf!%}njQxt{+*zE_^iWJ^EDBj0Eo2V6dT9XO+usmU1cb^z}`)aU+h{_`)pln z^{~C`5Y6|iEJbswvPgp}uH(?z5nN~K1FfGW=m!^qTypPBUlRV~%8Yq@7`%Y}9# zX+UoSH$!-;?o#ke+^pd-sHDl4bhieD6UDVvtL0yzf|{||55*S z-|c){s72i@#=k&%CNPy9eyKhzEC&5z#-+oNZ$$_F%s|B%rs1=pd~bRZU(|B*aM$iX z+<7v<996nrTu#T(&=}Equ^D`-+bcuz@qInf#xbTNSn~hZJ!l2$#Yo;7C$$10yX0Z1+sO(jzHecy1QBeCZ)J&DO`j+Bks2uo|jIY znR!|Y9+yHKPlN>!=QdtTw5{)GAy(mFxecJs=U>aCtbzSJvsW=zh&SjO>Z}<7undXn zLmpL7CpduMuQS>DKqb*eeTO0rg24dS?Jxk!g3=S5;DAfJsvqGv2u>?KY;@0%2Y{z) zh!vlDTDW1K{F_1qSghglcdLx8nBXGvY=l8X)O=5zuH^74Vpw8(Rfd?$cOI(|GTD)j z3}bu`sL!{Iw6f$ST6BbgviM_CI?#o%zsTSz&k+B%2LmHAaVv(U>oHhKRx1Q#3=B^( z*prV)>$$v;`2K3?ds`gpjqJX0Lbu zkTZ`WrxXe9PgG4}1i!B3TD~8a21@Z2-CwOx940!Ts53&V29HuHm425!UjAQg?dU~W zR=ylhz#SlPXWsH&jIPV_2ym*UXE##*VMr=IF)6t8gwoLWvwldSYp7xnccjX2yGgez z0HL1cdm`c_PciAz)QaM7gb7$fPHkMfg4NW*2B z&<&BLU5Q)&A+Q~Vt~UIHF>+X%$%S0lh!oFkQNOTcSNHwD=gH(o0hlRMekS)3Tt{?Q z8;P+YxA&E8eUVetf0YUya)p#_3nrz^vT_(_p4pS{KaF$b_fA&_~D zx01)%O!3Yu3pOi|ewb?sPwcKhYvRMq?wY*b1y^pkfZN4wId}609T%xXHJmXr4}0u^ z{%p)$GmDn4yzhx=M`$9yo`-o}^JW6pU}f9_6TLh@b!pZ|BS0LQi>n@Fcqk%{JNZ|hkty|wKafP1pN8WD! z5urR85-I^5HS{?zMN$?NUs;!%BM;c&4=Ik#SIvBsFUY;CtNLL^`$tDo|M^?52ED1E ze8f)kq(#WXY9fxB%M^r|=Jy|hIPA6VDggmh5!jK4Mb;cXD|gJ8E40Gs;II^EzOkI& z#(ihyx;Q{yfq62Mw!dzqBdplFK|R1|?9b~LI2xfcvfm?jqX#Gf+!l?nzyZ{?xxR-P zGej2u%dKJQLAvZQ!fvyFYMNGl;@*b9=(xS|TP4nW@;^I+D)lWb_qRq_WMPgSC%7UBR+SSO9apqi+%^4Q>Qq+>P@YL1^8= zI4kH>igH}s@zqL1dr11<>}P^kNr$@z3yjOm;#k$d)>_+LR>C#r87bytV1Op4{9B2@ zgR7~1%1EL|R1}1%rhk9*clf(B!z?GY+ql(uV%&bx{Bw)Pv#+w8Q4Y{fjMG!U)umN3 zhG}J>u*Fd+MJd8-R|&uzL1JR=XQi+_h5_p7o4f`frFzk|uIR9L@7qbP)>*ke=`@W? z%U}C{x+0;03|0!&3#~HwYs`|o>bUUly_GnRX;)-Eth;||gO<;jb`24wPz`jGE$q>| z|1ZtI@0Suw`dPGh5ItzQ6AyH~wnMmZ@J@3x=K*eZhcnjCN)l*Pe2QoWaOnMVI?#Ic zF22Tf<++Dd%Cn(B36tAyC6q6{fF86s24A(FG&TuIahveF*lqf+GxTDo{qW#0EY>+6 zAT8=p<*YHXE0Z72bajk|=f(F2dP1Gh&TBtjb07|O6Hw=VDkZl~|2-r<@IsNArF!}} zV$|z3Lq3ZsuxIzUeu967x(5{5b-c8IO1)eu`S{ncEAW27^~17zv-tl4Xz+s~!N)2) zwJFp9UG*4y4H2;xpQGhl-0D$ZZVp9Y78GfY#*J2IF^@Mcn}|7>wNWP_E}>U$^~D7m zP)ydaSB8C!^`gZC{cBJVlRVx0-z>m?tIR_Cq)v7zZ&0vIBYp3v3`n_uebMyFQoZEg zjV4CAI(~6E7QN5eVCEwKK5!{L)Yq zD8v-4f_z5*y_yJT<=&^%fp*itFq)OH&=k^M@Fm;|n2Wdu%tcUs8)Uq?g{Bd7B}o@N0=3XF8mu=M(B$E&nW0bzPiT#kq+)>&)^4xkz3gc0*gKVjd1d zEf$I@XP}n>!X3u{itryTv?;m_+Slz(xa#ogN2c)i$OF`SKp>B5Nh@crVP@@^x*fuN ztfS^_a%CrBZecj9>~)iu`|(R2BBx7_0om?-)jH))(3pc)l&d&7j(Pu4?ao2l z{dXnJ)%<5RF#q|VS_zPsjZdGEgWY$g-OYW!xhD}Kl7hIYbp&evvr$}Z9h|i%E(q^E z(H!RJ`F&BNy~7Izj*qj>9+a`FsZ8ab=Vd7(WPL6~Yrv?$xaZ_zNcDdX^mPqj&=S`V zVI(nE-R`wcAeTlf-W$jZ-)YwTrd!!(E=myil4}LsBhC)Il!Hs{QH{jK(d!Y5wI^=Z zYUl89FFQ23iqId9P`BFvw4lhhv9;dHG++E1^XvpGjrBz6mD5kS&q9mr8_%qIFL^zl zXS~Y2thmi8GQTFlF;Ab0VkZEa*+-*FC653t0t!rWo&%GdK#%rnK`x^oo&nHA_u)k= zp-P5~OG}`9G#}ztf6O*RsjHb^vg`iZ(6K+y{A4H1yd(>#Rvs`~*8g*0LOODQIPwCY zJ#$?KSj1g(izcMe>XJ>83}O3=oPpWB3~*&4)PL zyQj8TD;za#y64TF}gYrZd5}P zVs#>2$F9DkQGGs7LkI1Zkyn1+t1>HYHowP-zCmPwx4%t&K5L})A2vRbC4RX}8I`<} zxqejKb9?Hwf^){OkphI$s~lHgEUa@dRh$AvC{HmcUZaR%{|~vxf7q{jZ!Hdr4dmNs zQCsbHh32#`e;?&{I#lo-W+eqQ*>buvi!PvliS?9Sv5f!z52lE$@L)g}ZFZLRI+}Z| z@Ni!GJlojgtH3d9KD*VO2rm;o`>vBbNAtE7-2uKS^Nz8C4k?v-O5|IXJnECJV{64+c`*FBwX{<_?iyOg94J{#nCBE^$Fh+n&Mg_54%i|pvvDx5qb(v{po7?Mrq%-v(y>0C4wT)9h%UE0fn%c2#<-@(k z{`1B+i-~?irAX?A;DFb9n>84KqPWZ7_|IhudL3YYVPYTj!~{O8InT2$|0VRLLn7?W zr4(9vQ`0qe;Vs=F$ct&1iiDxVXU1Wk|2<^{c?t@KwkR)Cf~TPUTi(aH!hUl#X#T5J z@aB+=&gb&GweSljLZN}M|NNfqlb47$)U`3UgU(e&jb8SzRn?J|{T33OeB&xqce!j` z0NK^goMO3`c7b$8nR#%Xm*H>Z@Fr4>K3+1%L8U)ba2T=2mxXnC&Kj4*$L>cHt(8QC z#J$u*YB1|nx5X@~8d9h0sfp(0KKX58fmCm#y1N3iuI`-qGlq8|NqsLLuQ_Ht`1&<+ zNtWzZ{PIvHtTY5)gUJFdc@DA<{)=-26`8kbX(E&KxAfQuySETdE%*#2Wpg&pTRTH! zHYD%uWSf3@?)*%5L){$TEE8umQ|u*YB)W(2K528sR+a;Dn#2VQb^ol>V*W@q^^TSb-C& zuiv6JMCfSfADJ%Z(V~_BT;!z>_UT^k|GXoQ*tlAYn1zg?gLn`2;BY}WF4<4Gd1I>! zoUh7%KYKBkdgewfi;ZZ4#{ADU2Sp7mrt z?>yb?8mA*Ydv@)k#(%~(#beB}+IMmS-?w%k*U;|3`vbir+@QS3pjgnm+{=E>nk5z2 zZ!2V>V0gW6$Leq5;nsIN=pT^brmeTTrv3AL#rf2H+{WLewttCn8n1V4JBhbDPf3|G z9IPN&h>zsL&(!3Dk%8ZlCQn2e~24Gy@&1Q6H;u)Y=CE+5BIzVnRz* z*D|EfEt0!MIbZrJnJh?Tc%N(Oy_DZln1LvR~rkZcXqpmY&M0^Nd%>!Va(_ zo=^0zjNekNIYgWrBx)5Wz5Fjme>FL2o8VIC<$=l3?%Tr)DHhKz({@iB9NOE{qCDns zUdAp!-+~>wR}PGxjQ!8uv7e<`PAD_)B%T9-|1o*sXJieBRME!)$fYA-Y$KrQ)g zX^cMQya}svX*VG^=dY^03g`gnVuhqc`s=nAjjvX*frE}&5~&>8JHP$qfG2oamC7mn z%ZjT83f7 z%*-j-i4k=Es@v^zM*>*(Tb)6^`ptXz0yl)RW#*MH0^J9Gys!ec){~d>l~#z3!}LfB zNZsSlKjyRr&9lLJ6kp5LmFRLkE9wm?(|JClYT!)^>~5^_UhTP(UrcxLctEsfag`)U zA7Q`DElzH1j=arO49jxC8MN=mL%k4 z?_;QTMpc=~8)`IH%+VBzs3km&Mde89;*$Z8K5Y@?HpiJ9lDl%harTX;Nbw1-tZwte zusI*}j67o0p(tTfw0xOZI^_2Iv0u!5+0H9&U~XLm7d&ll%10DPD>OQUc1{Wj=jQy( z8MkV1@iQrad2&H9Qc>GSi!sXmPoA?<8vEHja-m{v$%flw;tbc#<$myj+7d?e zr@NHwY#gl~9lT_Rq%-myeWv$lJ;$Bf2=esX_yS4K`CG1{3TC|28=3Rwk?J8Kl0Srw zoMI51&GSQCS=xr&hwYa?YbJFEP@Vb9+VXyVIBle3^#U3q&ao4E^$KESRg7`0R)WXn z^?6V8Eka$ce6HFa{q|liL#X<8q>Ga9+72+Kd5q@T_jy0RH!o4VHfL;#ixa$b??L9N zTi0$g`H#lMK1LOJ4m}^a2EO1c!-!gD{6RdGisHMYthMTy50iLMq_8$LjNiSb4*V0R zl5&Bx{QJcdQ&rCFORZZ#)V|7Do7?!dlusHt2v++0D01IWpjcCgRL9TP8bxPVX>mw2 zm9;U4_}^IisGxl|9{FQkaN52Y)3eSB;yPOt2|Ae!4|s+xp=ZtJ8#k`w9T2KgnOvnOw@*J$!cH;%JqH!9^5xfqYE*Mc;@;aTXH{*8*qK|S ze8=ghPHttf@q8Ho1y-hfHJJVjaG*_+BRN6?`Q(q!10-!bZ=Zb{7Okr8kTQrBBs7ZP zX0Y#%zL(v~yO~vGNbT3uI24@E2HjYaxe6@iH>wC7>C^YTz4qT> z9&(iyV{5~kX%_4-P7<^%+fI4p+G#rS*n)76B4tErd%(ZvbW7lQ*Q`T`^t-yZsTNXH z+K>^s$u~pJ@0uzVI_=6DYuiTslIvY0Q>o4#^z1csG^5l}%inT7?TC0xW3M;C1K2oj zRRj&2eYx4``82mxAz-%}?%3bq(?AkCS}){zh17_zh=YV6##pgYCT@Z?`8gMrasg}b zme|s7MS{+HbmD6y$nF27M`25FXG`m2A&Vvo@t8S>xqtgO7#gVKRThJY50^0K?3=`m zx-DWaT4q%Y?AF96>p#(RMd|5n<-6Fd*!LtKkozb}*j0pKN?Wh6U_bQGPnakA7{Ib) zzcbfJHP7F1K3?Nw>cd(s{0x0OM4yL2ds5SNeQG=9vu&=EahkS1IkcKI$?h6t_}W!_W9~Oi2l7$}d*fHh=d3K@s#+ zKk<2O^3ho)@>#%%c}XPVv0WJ)d#wij;5~X{3vd}&ed|c8 z(Mj9C!s4Zw^8^m++J4mU-Vm`)iXbEF$3<*O<9l{U4^Eon_B)?S zks9=7)v>6nM%`K==F5!=+Ch7ss-X$4v#Up-f1l|bsqb?D!p~o2jEEhZaHUl%?@~5q z>MUJj+it0bgdud-;3G0meEt&deb*h4nFP!7D2mM4-@9YFU=q3kYJ=4c#iV0D4`=|n zq$kaKX7q8@sX*i2rnm}wl=EJGocOr>P3RX}u3sfBTg_c5#ajYi`$`U*td{;dSpdc) zti?slNU<#^-E}mIq>YL2b3OR*c4I3{L-l5*>&DKiAPD8p_A6ec(T&!EWXD)P9u_i_Ch7mjl>2YJ@ME;|d~S7vKOd!Dz5pK8%IpIwRGE8*|$txe7gH z4RW(dG2*mmW}((L^NS4$Vkt5kboqL#4{_Gt;GZU?&H$1W%9PfyvGu|2f`>&x2Rh-p z3x%RnZvO|NzUYfW$&U=aksSc5ixx>qwdYS#r4SANjWaobr#CdURRaVj3nfPjoUY>d7=ox;uv?$eO)wWDla4O=4a$Lgeh>@w%}|Zilog+)@53 zmJaxZ7OK+`T=H6s7bvREL2Ap}sl=^iQKC&s5B(oURuYaaI)SRa(~C&xy{^e;k+(Ip)DlcD7M&9_Sat*CW>_SFmQ4XIFv}?zl?eME1@iHcEWcM7|(;aGmS&L^1L_DD>WMTK}dMTZ)KW3g|c3M^TOx0 zqTfpzZn-=dv~udbOJ~5TIi!^g{-%2iF-?h#`EYt>El=;+cW~F8gX**6#j{IC&sm&6 zJe(g2J&bFwpT-BgzQE#p8XZ}AF7*C$>MKEFMNQ5XYho>b+2AV=t_Msu^%PJUCEeYK zS);yLc`S}2iAoe zt1O?wtG9O$kHd_lB4Xf?-2v1RWj!9lBzAS2{X7zS0jj8-w7=k!ZF zUUvR;k^DO3=YgsNprt5U*5|(Q{MhpPCYKKRaW?r=IR~i5xM&@}O2lw-lAlh_lsmG7NHFhIle9#;+H|pGvrT8keQRUUNs*C_ zC_Xu39ak*Bg-JdnpONDlyk?H8G;fvgI?4#Wvf?JP)0MLt8u2wk2f|^Z#5`Poj%C&3 zO4Z*edO%g(4;t{hN)AN(%H;%$P=K7`Okgm_Zco zTMnetSrPY)308)R8rY4>FzQ3+0veXEufK>S8B-B zikm6X$HRf$7Qxn0TG~_0pIxBz5|*3grblTRT{HMB&iE`uy&Vx5v#)pelfowR$0)OS z9LSaaG8k(lXjqqMGo(*0Z6AQ+{bWqDuSp{1BrJJ9AU@`uFU^^~?81iMz1?|BBiL6V z+{j|9fp_+#M9`_{_xfp_8QDwpZM%Er6gx>%;^-hATzu5XLGtjMi)OOblk;b~%6339 zKm1~&69QuT=TgRu8|pBwbH>}C0A3d6b9IgGv!-ZD=H%||{HK@0rUlb5pR16k4X50~ zW@UA?ZRA@bRcJ-aO%t3o9#%Gp;#^MY-{=}Y=zPCXt{Uk=;c#kR+0A8Yy24(w&u4^e zbVFsa7Ks~1J$WnSsX>7%LD++s=KL_R{-jx4p}VU_wWgFG`sGI@Ub>$iN~kOT5$<=d zXa=ojJ*PSDd2WEY^A`BZ;|yT{#Yk--qPp~`gEr*j@UdrZC=il49gs?PG1q;xRdZx- z^pRb9xp7@t*%01pC{@7ao>x0ng(o9_ojKpBrKa4N`y;mNa)Bd5d3PkY4ynM8GG+i| zpFNdaU?<n~UkKV}w>z{4Z-!rj@dej%XTGZ6 z%@p^T!0pTl!KIlwG>0lOiz_Uef0L>@=X62GrGmgAy3^N~wM3C_cWcly8miYTE#@BLun|`^Nzy3V)8|UF zxMS-6WDdP{rT9ZLBg3_F;4Tz-?P}4a_Q_Aw+bqtQqlAZ4jb0i0QZ?@vp2S~+exWfc zsfa2d%s=SCp4If|$K8JTqijyWyUGKBn5;x|luc}1?LQRh{xdhaI6VH#({K{8*{>!S zF$_$p+rjZt-|rEnA8Xf7SL2;WOPKc4Z`6}rFcC!HRm05z1xj+kCE4o1`H5S_WF=Hk z`bW;s67pmFH>v9!O%iufZ-!K^^jJumJRM6dczBgskO(LCky*zex<6C>hbHc2XsP?^ zb<`U|D_0~GMC|j(RD=>K@AuXaL&s^Yt7UT!aG;Lt?m zOjG>HJQczB+ERbk5T>yG6Wf<}aPAVEwx)eTM2#`vhaiD^fY8)L>*|Y>_K)@-KyM5Y zm;C(|y{zf0hbjJMfzOsuG0!&580oukG#USjdh^E4Xee}}xy5`w>gVfAko)o-ho<%~ z`p+HkzjLTAu3nP{Z?YAHG?SS8IX30ouXU}GBCji|HK=8_t^mn-5FzD|3!JT-c1LS< z%^*F)l|2NsA#JNMri<($L6WR<+l#F^l_3?MC$D2(%qsUk_4@GYy`^w>xL`H>ptc^+ zQmHJ?QC7U|Qax~;eRgB%r2^ma>YdxkSsWzILuv!B89*KAOOz&ya%1t2hOL`>&h2_W zM*;_L!uhJsOI<`8tEQdQYS0cMFzxu|O0F!a@H0K?OZ)d}J!#hk%*z@Z+BzeOBwq-4 z=-6mbAP4wDZ*}n2?aqmZHh^r9Km#0t>vfprE7pphh5H#Kw#od4qH1bU6NP zsbAvc!`DW;EIMjqYXE>leay|ZGI_wn^L5}iTiLqMCz*%i8iEUtTK*(qV!KjwHU+&- zO>cKnrBKwn!d1ss5o?2Q4`<9Xp;I8z&<(xW+IlFm(kIoyQUrmg4BC^78dPX!El?Kc>7lK#zS*lWy@J*M6lykxZk(d z2d}~(tjC8t_J1j@Rh6o|tYlrhs~I^~34Ynh7a7%>3EG#u7LxoHL6!xVtQjVL{-Df4>K`zUVk4rt&utJ6~NUIQ(} z#j_b~v$xu!%Gk}i2wxo|*)z@Tr+>m0bFN#Ux_-TW^Fgm@DUzgHHLW{2r1pE7^vOeh z(x(h8{A#WV>svpXVZxOWqti_yms>|G;jiWF&*Q_NHv~6(`o=p|%W_b@D{TdbLu1#W zbT`UNNWxY$8GdIq#?@JJcoaej-60hb$ADMTe65ex3b6XUfd|;z3ds2T0+C;6tHSqc zM8;)}evj01!8j}@o^fB)GC6s}5#K}Y?@-XWRsAi<-Xxsp>c2_Y6)$33y2y-1_71tt zer?laoxup~zo{Lg4jt0C6iLxrMsf%b=atQmYM%}XPGT@us>TkAV=d4u!L*-eCR zK^Kq@Xq*7-SvR@zu%Rg1N3G`(KQDEYMkJkL9;RDfiBGMes3R<}csZh;PfneunCwq& zeNd2JVmUbaro)QJREwP^CQP&Vb6FF-QGPOP0HSeO$YOp0;JRb>;1DG?ug|tS87CLN zOE)o}YA1Ecs{~X_uldn7g3cxoZcWXOChV638o35G1Ig{=0;%mE!f|Nq{rQ$1*(W@b z`-QtzN+m0P--3<`W1?P{4pY6#QYPs>PIs@6T+<+xl=IveW}{piA!8%y6}Is4_>jdF zmCqr*U#B_swQK81=>=}tY7|IyMweHXAV#T>tSzzjFL8TQmc$M2-=IF~F;Kl(9XKfo z8FBb&H_YwBb}rue>LvR7ZDhqr9#5ZP#lt=6k?FvAw~JcLsfw+6O(0_5z4_^(vx)f_ z`ZrwFP0B{l$bD;5XuDE44l!|m9vgStXZG6Vf)AcbP8ce@?Ln16T)T(De(TtBu;0@n z6k=j|rvOARxm}MXzeaZ!V>uT}57N?o4!9@<3#8e~f&=2y=*WXyof6L-%#(Fr=KqYO z|JdBFuSAtK#fQ%P*cu2l=C^PhPYn>x`_20U9P6Xq>YJ=LI+4|lUZwri@`?Z-{Q*z~ zQm+%$k)0Yqa66)dixZNR^$dyY&r7@Lf_0uET^POZXlOG0JmU{kHc6Tie_Ti#w7Jep z!nrwOjMQVjr1okwnN)8-B(HbC+TS>yE^|m#eM)w7WM1|~ITv@t6kiKS-MIT}UX|gd z0$8WFIr0Mu51`mBnb}uf+r(OU`}Zfo$}QIz%oLyc0K;%>~9>o9Ppzh~(u@2-MZz1t~FKn}%^KR-?vC z508$@kXba552+rghXIadhiiV-OfvwRAb!qCS}r;=Dc)dM*zm z&Y@Ye7eyIO|31_m-P6uwX8KSR;81cNx%z`*(S=eIi*hLSI4T}y_a6?3 zi`y#NEw&r{L&$XlS5TOWJ8ta}{we5gIHgi-7|pvhS@=+y=?t9a&$H`+w@$?DHV9o9 zSILbxkGQH_U;Lx*?mju-ettlPcg-UFaf}qGz2vV^5LxYOlsN$oThU>d+fUhpbdx)& z6)c*;0kNYA+F6v!4VL4LMrjrrg#Mp8S7u_Ad-a~KsiUl6Ht}5t>6%YZNUW;*>^uSQ zARVb8IPOziVGinz5tOX!QYKta3;s4795Q)w4f5=Mt{Fl#+39HD2`%UZ@04mFao1fT zze7PJ`Gz5CLYiGmI}?N9eNTN;28d(`b0Y`jfJax~P5USL*^=pZsfOYir6S^*$xix= z7Me-)yZhCDE5}ezS*jf$Uxy?W(|`X--uSt7@x_KPR{7HIY7VmLIwe>s*+C4jmqPLu zgDZQf)m)i(4~}DCfG6Zxo^J@!4wp`=4C1GwAv{uKU6-6PNAsU6VV~PeDbHM}BHqaG zhX%=8v^v}0G$%4Blw?P;zT1Nbkr356!iOtsl6^adWc45QLQ_DAO8?P4AwQKeBu2Q= zA-7+F_$&w$E55e$-#7x#-ZAR_!;?doF@`ahxponb@Rx0S`Z1gSqZJ9_+ol|uRdwIu zZYE6M#WyATE1**NqMb5(!(TI@Rjc21iRCIo)|BP)`0DL{z?5z)!9$S1)zyD2$86Qs z8`^5UWd9beEHiN{jkR!Ff|utiCRa+?gU9^u;>Pa=GeUgy zOYO2-Fh))AIglaEI)Kl7Rrz$OOa4ZfY0!E}`JUNuB?h~|+Bdo6HJ@+qy=9uhF_B9N zhG#pbb1`0$$~PcFMWGs1>%M*5Gj|IcEO`y^*NXP&Q^*FahSA4$P0+@yE{Kj_|9J2v z^Ch^G=55cqN~x^UHxuF%7rdEQHt$%B zlFcdN9nZ>8y0p*V^i*4gbOP#z0E@B3y&mS|cR*B-DQWbdO>e-H3S{Jh1gkGtp$mS9 z#AP=6h@M(!&Mo|SdLt~QUfI-N^NoaEsca6$x(a^=G_z(7M&c%n5(Gb(2PCG zoZb{2uv!|+y^_VHeSuw`;R@~(!3~rR$hiT2;89~xtN!%-Mtc&$vOeEyp?4a4 z^lma<|H-q7sl~nD)m$2#qReL6@+DeesI%Qv!xE%(HG?ZmmRu^AFVs88F6Bg}RL}>J zG-klbSfCS1)=rK9h#6Jdww%!&G-ET81CiuIzj{M^(SSiV7Y9cC`ayzeeMo3xh z)d}D;EG^5i6^b(!G6E-Wz|ZB0+PT31r#g|FE0E2v$cx%9@MxK;kMuNx7~j?4i6~q} z>ALU2%-=OBW#kEk$>v0hp3A>;mnhro9a)dx8L<5)Ht>j-i%u(<$SDufkpC~4Jh3tx{1H?${QvpqO}k*26tk87 zzc&;ZQA6x#$`npVoQeNkf~Nvb8!+NVeEqeV@*;BUHOc!GD=1{#>)n}k0r3tp`Zsa# zPN~awKaU!qDc;B(GqgV=BCMrO_`%Rp|=$v~@KB01m_3)w&`9_y>i#U*q&!%aA zuuNx?o0;BBJk(>S9JqKnBS>`1qcxD(~F z6+Z6Ue+O&|`BIk|xp+F^ujeI`K%>Bk!~fymw77&^Y&fC~Kfc94oVnuNUo~S3GSaw! zO$)+%S0pBQk{QEMie$Fqpwew0dCdbSE~?;1Shj)dz0U0{Z#d5>trp7i!WZ@lDSjxj z#rBD_FkcLEij25^%#o6-?#{yb)0@xTAv00~Ds`Q#zqq53fh*S_G@zl)`Dxo;@ILhK z@R$igRxPa}(tSSDN_yxy_;4T;ooNo|xqq!}Yj|KLMe>?63vs7SO`}^nk|KWc&AcSv zX=L2A9;ZTP6`8Yfo|wPkyh#u)hT z%t#b*^eSM?sNp4Od1A8H8Z~(10 zeJu)yziij{z|sRMHiPGw_yGb zpP#Ac;H_e~>1r`7^iC}_9n4(o^CWkQITKHQVO2~=60h`YNoL}n$*%fqKQQue%bysO z&RSP_vy5f`#m%8@7t9Mea64^EMPER&JDr~`RY!RJny8C)-6Bqeo}WdB(+>QWRyuN0 zey~tc5sa%l~^2dH$%I5hi!Y?lC2L683An)w# zlBqAHq-S@`i9z?h-XDh9WFrRVd{2!%vJqckGX@F${ma7_JChDJeU8Fm6`)`W>`;`( zhHU=8gz9O&&-09v&XUU^!QV!=F8raJD%st#&qKcdoNwrftd}O?!$RF#oO*xKcICit z!Tt`IzDCGJ+5@xGRIhj5{Sr-01GP@cIPd=q88L*;faPfgGU423gcSV<)~9Aaqb;Wf z_E!Mu((bOJgM&?mj#xDJy6{yK!LvZ_?j)Uan-HHB5BH??d|Q8ytb_@A|DM)iz-uAh z+rP>G3JLpJE_hva_`&9W+kHvw5Sn})T2>shAyt8|=p>B&fvuA(%a`9$JrIk|ap`sp z!s?$uKS7CKUA32s-C+-suk{vb%SySv%gyzRTQR-kPv^B=2~vz#092V$G5uClz1!_i z&!cBMU@rQrdbc2zWJH5`Hdd z{>y{r4_$Mi?{Dn-I>Ac-(#b%88KXIu34$AXj^y3uGIUUV4-|;n~6b zx>xu1(ZlVt1g>AdZJm>o^2CFfU1 z9$Ryp{`R06f4NzS5^19|5GA}IU)H^Cm77pc4u-c!CP%`=%^~(& zl1MOO!Fw2eLcH|0!^-3lJj>Rcx;Mk^QfiuL>|GMVM^`ha7Bo$xFBrF0H79|e{S3Hi z;ujc>k~JY{o8L)8{h@0`2M3|%lQMA`K6&G!${#VG6=UkbB(Uio+gVi*e;C7d08ZfA zG?ZF`9|x$7&LbCbvRym>-lu1L|HF_^+mK&}H1QVr)#(+$z452kbx9bgl$gY)kq$~b za2=%uw$;NG1SFqw>R(yAw(Tp4(swd5_w^I}?JK-t{)@nr(y{O!_3JoR40ka5+_wrQ`z+x_w##QqqtogtbHS`c$E9OZ3{8KxFlAQ(lFBD8ofby?qy zBxRM*@{uwWY^x)gx}BpNNzcqymbP?qSx|a=ANdfDfKekOz!`wKf_~8O>z(i~UyuTDd!9V|2TI*k!M?<&ResRxyFdoQF z;M__phNK9=9$b0rMp=hBMH2eH8V!88EI~qaF3UO_HAke|SY#a0bxxk1gT$7io|H|| zdoN(wv#5eN{51lgwnPAd-sjR$hU8{2x&Ic}sjE-kxem7mGYf5tL_uU@DMUvkC1!k2 z$DSk6S1PEr!6`WGb25g&vu#awLXM7a*W~Hb#=qe_OTG94JqygF9HMUL+c6Owz5$VXb~5C+fPFr$HG#@H6?em z0U1olyV5Ov;zF0|hPfaXAHWIMSs-x_X;bc>)PdlO6QgmhiX`*LAJpr|x<;zDz&o@( zqdqZX-WqEw3qn)x^yOLrqQb3bO4m`oEgK>!%hiknrb*0c!5AQLOfMwm~ zO`A$?FOT-ZG2;Sokw7V0)-NYJ;jEbfiEEhZiAykso5TZ}NiEs)z_JRCx{U(!3h&!? zayqWA$cLT1vnR#NfQ2|zwz}7?uq`40-6mDzN#nabes=N%(~UBLB2Xk1i9aQJ`Ht1}dq_rfqWXhymlLBr?JYs`1 zprQ#`P|Iqqc?Fg#7bz$nUh)da%gj*7*RobJm6i1P#<%TDh;c^zka^;Ks#+Q3`1voP zw90MjSFdjwHw4vXo0(r^NW(Gjvp&mdB?#|926GTm1s!KfhA1m4FL>s3A_ zpcDhKV&n;ezNB2CgE1=+xXZCyJCD^wmnAV1NN&=l*;n)fm+1)@=_onqwo2lIMkuiZ z$gVqLLNh{Hy`|xeW#$T{)z-YD_4f8d9&>yJ*9D z#4GUq_m`1CtPDPHYKGF1$V9PX?>eyao ze1o^zQ*@$4_xbGBJeFNq)GlqU057Y;mtEMx+bJZLW2X_^;$U}Amwv_3d_mNvxx-## z?Gm!gf$Rz+4DBxSJaFOcdu}sHN*mPfMFjVrMc_@s3>9A`;{7ZWH`slB-F2;n8VS5# zer%_m=Hv=1C#<^pNmG3+YIh1uq)&4(w#8tony@X&N8$CPFjEN5#nQR#_2{$JqaK|J#zaqeX%%R9e_8a8lVh8o4dc zrt{)MFwmPOidQEL_t6+r*!Q)ukb9_K2Gj;_iUF$2OQ_|OQ}g%ur(7O=oR{jtP}hr? z$xV)t@owtV8bol0#`!jhMCa|}=tNa$Lw#1P?~7PYlVXb}qckEhv84Mh z3}S&CpZ=^1J9Gz%U@5pcqsSS0&}wcfbSAD5XIg>@iv8y2ONYDt8!n*CPY7GpkzJ2V)pGa|k8p*46NuFy@Kg!8 zJsH=h-SVzT{e7?c2Qr3lRlLOQEJe`;4bg855!@f}gt9hX0wyp#-EIv9HcvDVH(}kn z;pvoXHR18`hgT?_tN3SuaL%Z~4o8a#6inocb|c1p ztrfmRfAobz_l)CxV`>8_H7Rjoe|Rl{Go%gi=L@5gYWL=^UYTApYMnhxigKs;L5XpJ zfciV8ty&w5u2u2h{|>%4if9s$KDlWy6kPMxo|YG7ZcCALbMD8JDt8_;JCSs;nIp=i z1tyfFv^lph*@+F+?R;0<4TNSUdMRsc%v3Uss zTNJeBEX3khRl55kHfmSBn<}XyC&O$Qo~^(w-?Lm!{wnbbc{VUiT)LQ37y3v_kBQ^< z(-=Z(jAF1Z5;}HAkB)rkp&JPywiWYG330YNh|#Ppelxx7`pyz}(T?h)NqYU{r8lGN zc2NF#EL&-_BN())T0xJZEW7+4StNkM)JfMMG20Xq;klnPh@A^P(FQx2#tj>yD?orL zCodJ`hmTc1)DR+V&j*vHNp^=}O*j+L3tuQ|n$T9bM$f=K*EMx!42_7FK~NCy;t4zA zz_R+N^-srKzn~I#AdP=xpDI+moYFKikDerd?j}U`tiYSNHVV?~t+SSr%Uf>{b5z~< z&CRE%DjF>MiTUU_<$i!I;rHF^>cJs(_*B^ug$Yh=d^jm$v)T(AXmcfixi%<+&)Y(w zRyiYwbp}^vv26OMqK0*sZRA6NXgA^YIF?=flf`XZFt7ra8Kss!E1@7^y7w%}n*>{F zQ9-7@f7a#B??`FjDiMFu+6TOe`yJTv8N(>ss^OX6c)#{aK-`xwY(>+e3FZ1Rmoco# zH;@f{23fhJf%-}Ci3{0H!@G>^R}T|r-+Ue1Zy;AJSh)rp z^cBG>Jb4$zi^gHZg2A2#+pA7TDAT`lw>C4hO_vP8;K2A1Wh`IrpVC7vGX!t1D-d;u zl}{1exugFlq0c2GFmv4;3_+_s!mLP}UsrQPGu-d}4$(7Xvya?vm7ynK34s z?esn@zp-Z|Z#=V#H#k!S>X<`y@{hQLH{u=1rL`rtsvD=iETB`J_F)T~CP3<^>j+#0mxksWEm-PZP-_SgyqdvenukGE6<&E{Xdg zxfkZtO>J=am3*Ff=WIt>X@vEX6tq6ADA@F80r|9UHo~mYhMUR_tl6$zN~`eTx=fHX z%I3oi#*R~K(nfLjf0Raei^eQHY4WGT!xP;o)7_Hz!2EafHFf30nyp{{U2k^*b*42o{cG{J zY7~Oi?{J|&G7QPjvC9`8sm*O9N8A@`dWK}Kl|#Aava;93T$mQq_>C4J{G$P;{2oQJ z_rRi+qw4xDE^}spQy};(>3#*OknG0fdwz%V z3{W@R$0&WA&TxJaqkNr6oNy53U$S4*yvrJO`YNJW+tVVe3O5$yQL?^NpeOKf`z z58yAM<}6yOG$ZkWr@tUb{wjnbCjq3kibg#If!%yodG0Rm;6ffGQnY`L^vtI?k!D{c zhkHtMf7L>C6xYoafzkM5#E62sg$i;Um(Cx2JsiEFgs`b1#~Ov@?h&S&D>5+xL@2_0 zuNAB44stV|xp2~8zOa%tTUHh6IaG#FJ_X)%j`XPPTW$CG8lw)j>8w5y*;;yIO>o2b zS!+NPY5E;eM&t+y8h{CHVaB-=)7mv^1`Ri*uo;igBuhm2PvZ#`4T_Qc7YH|kv*1VG zqP6I)$MAiN6`Bs+8rc}tAV8p%=s_13H5=r2`1l8`4rnC|=b1moPe?JmT#UM~d|G9_ zcLW$-{qbWO^hhvgH-S2QsPhKU9K7+t^OgCKgX>U=_&>-IywS7{ZWu~{!7qye!C(6l z`TzZd$wLfH7R;$AB|i6b+f$j;C#jsMwyL~AZs-0t>a*eLlDG6myW{%ew%t}|DKzd>2HVk6sj6V1I_4ic|%dY9(w%O?>Svd@Z(lu zG~$!=^m5;7%bY!|v4>F_L-ncC=c=T}>2beFL{%vml@fB5GzfJpgR@Q`oJrpHxw0ZH zQTD2n%7-#S(~~433<~$(kDR-YpbgU85i7h|9J3+6k&f8@_ zHNqQ3UV8sl(}h5(^J)7CbLRQU;{>of-@Z=MnhXx*)5w0#GqOG>wk&3ODpaSE*7fo& zkBih6?pU7}v1y-~9~8CNyURWy4_0hO(2Dn#)8DvQrjv|58uPgoKpdc~E<}z>dxa9t z*_Uvnst(1Q_Uf%r=XU@KA`x=T_dvSKLigk!h3HKS5h`%K?w?j5l%cFw3@KvWNvetR zdr7y}tl2H2j?x;Y`80$bnEZ~(RTu8xE;S6Q(cwL!te(TI7|Q7{v6OSS>_>7=O>EB) z1xxh0Ik(^A7!=%|Y}Y2lRLfpjf6G&jZ6^4{IhHLlE>C%>B(gY8QiG-8AUzk7T;5I# zzPm{W*OTtvk`C=$zU4?!O{wPgwD0RhQmztiB2^`22m!}s&#$72D6MLxd$HY>IIbL(nGyu$BvB+U@wnu- z%8fG7#EQ`U*0MVaejyKo;npjdM9D2D%C#p>UC^1COJD_>6+d_hB*`Za@~NZDIHq!S zA(S&G8*`gf`unRLmw7_tejOor^Dwyn#?p_~_cV`swfp;j&(owM2K^)j>9$;o4X}VU z@lU84p0i6otU{nD3g+QAeBODN3HaEktlU#5Q+T%1_eVYoaXw`>3Sw zve?|I(6|If0;M-(_`QQvb?5FM+mBCK%>%(RwvUUurzpJ6R`Pny?6l7}uuaDGT6xMA zvDBlc=&$M z*}dH^;);BMKUayKT#($NQ&wjr4f?u|aev%=$8tjsf1A`@B;ojAkzb!w&D69lela@X zw50r32gm=gv1pilE^nQ9)-pC(h@flzuNbG5yWmzInO?Z)N<%Y`XMmUp-t3TM-*IX9 z^*mOTJ&^gd=TXg83d|P*w`zqGZ*%f^wzyM`*RMkI`?3c(Mx_tA^rYa`4~gRKSLdXB z*awd6AzGXGtIxB%8Qwf!GdpZrv|ccB4IGM>sLG8rFIPIcBWSdksy`VKsoW_tqK6b` zHz_+qx>(Srwzdk+y+Dq_M?=12$Wz<%O=j6Nte&N3MhV>HNBxT`Yv2WZkB(#XseAgt zsn+9(lpzwV*+!UrS;664@BWfhrE%ha6k-!++BXJ_cS(L2F2Fnd)ZdAHxE%<@{V7p+c` z!J=@?L&0-DXc_H1w|+(iBf9$1bC2^>MLkGqxuVXl$rRte6ij5&J6i}%kSP-_nr!q@ z2tJLSI^y#4?(F5OQe@<~-cx>wYYi@BpU!zPINz^2m%+)E`3C!l(7jR#omQlCW?&no z+r{&WH%bHXH6c$Q`podx8OQj6lZe=ZFM}d4Z%=BuC8)yxWP5q7&^A{Txd3;gfw^LH z-*YkiezAHoX|@`Rc7;pFnrOTzNgAH3ATYDp%X(B_6m&)oc2Dnd+V(V2oEkbnRC_?U zOrP3ZV+Kvx^cNey%Rt~6$*10O+a8LfMS{bz$3zzL%u_GA>HO)0Qt$dpuH5i{&i=0a zHs+>)lpwrwg34g;+A(mH_P?!`Lqp3)olk^|8bA9frkx3u4mx|Nmk&dfJ~7>BXZh)+ znqTuvD*t=|VVdSH&)3@-8CfWezb{JCzZDwMLkuhnuJtosKTez6-6{iKTtO-7Z>?99VEWjyQp5GBUkZGcU1H_55+x%-1Xw*UFJ@_+Xt>Qf z52O!d;ZN23<1ZU~JL~<_4Mh@m`@1!=3BJ|6&N(VQPq~z0OLx+$pzHBzBBN^Kl`nJq zBoJUKdK!8ia@s2dP`<57PRIlc|J0gWG7>&>>b7<#e{E;jJv&!PmA+N>Cr96;+ZMEy zP#XsepWQiSokzTNjLyGkeG}-18xq{<8EEL2TkKDRLro+|)SO=$yrtY`hz9R7`7!WP zrs=OD<@kb%_7@JAC3pBc<5%&WE-F$ zjF+X4W51X8^~xRvg#voe(%5i`0&`d%h+YW0Z~6aXgZaI+ivP zNFgmG;nIs%)>AHbfdZ_X>&Z7`NPU@+o0Ndum+8Z(Q}Ny-Mw91tJekl*h_FnFCU|k#C7dSzF1P~56 zrjhbBx38!P0cR^~VR z7a#YSKc=zX=l127v3ZbiK3%gl>cRZg-L?MfSAI2}CTMB1ifzmtU2IVTimU5p!qtYz z$qUye*pOOsYQqAo!t-PGUCzfERX0w)U>w=iXCz23rjKj6_A|3A#=>LcbJYzLnPIM= zwv;%4USI%KjLjshalS{5RfM@-XBSA)@>rGse9XFgFd0-zY;vRP_ zgCZ-nxm8x-^H6JANAhd9j~M|1`?K6?{+-|h0txt?xVde;!|Eaz*O!EKw(gbR4GKTk zw#I8kD9@?t_cibqd?y~}st{qBtA8*Y7-YqDfle`TuiX7ofX9W69wq~H@Kp)78SGT4VO_OG;`HkMQ(tt^ zP&(@%Zo$PJ+8873cN_p)yv3fe!C4Iv)NDK66J2H9Uzwu0BP>SnbTY3^=xyWeYO=@~ zCCx8bctdRUO3f<`jNshrNiu2=W~ZRnXO9q~xS@&Y4-yO&yx5=C7w>*&dU4#S;GI#L zRQY$8Fpaf|C;-||S?lnTT5lt!YlUWs32ZMq2I+lKVA78@{`cj+7z*J_Jd|n2 zz=3V&KD~Y#1e%WJ-+O_dvyX<~`14sLI>~40mr;eiO^BJ%RqVHv8hpn#t$&a0mbCb_ zjy^H5?VXP)pUB_0H7SXSf8S^fy+9~O*9F+-5Fsuo+;tK0J84xM_m@p1)dzCz(oXI8KkZS9!Xhh|2;hx?tVo8$J zvLvFpJ6|OgHo>pQ*l@Dvc)fJbw~zZyMdZv?*_4-yRWUD(@A-XH)kDoQSV0odpG2Pg zTy-1}<07YT($;sK?KD-v80dCnxXUxJ`p-S*fs`{F5c7?SD(zYz2B0+nVu^x&Qz?j- zqu3`^E%vNcftyP!)^4O-68mQ%a{;X*5?$fnqNWtA@rMbm=sBbZ8DsintYwE7n^UFN zRF@OYVqJ-CU;|(!-`^WjRANeCoiD6I-0(q|j{1(7rc8Rz91> z^ow#gnA5;`JN3Eu5!fv))oUG6J8dNamRB=tz5gB!@SVGsFR?~n@j1_!H6-OoxYJKk z8F7^l73sfdP4KSA{NP#-oqx|pbRM*)WzGBXb>q2SY-gd;PLCd`OuY{@f*H485&xG4 zJQgr|+7-upvV@Y@;@(H`Jvz!6iInv&<^WH(SByR2?RX9#Cs`rClL0%1>ht8Vu6yuu z(B5I3r1I?f(QZ86BgSc_GTGhOsDXL{{j{-0|I}}n`V}u=EjoF16WNpewrYG<{a8|E zoE9XFg*UHfXR=WvKpz4i(;VBT(;VG)XrEj%KJW6WDj`;oU!CEk2!pKr(x>mDD}?T) zii>3Vg@A$}rRTN;`D}j9mA2-)OJ8)mieCe_&ay={1L*KZ`JF2HjkG&|I%DJb+iQ8Z zol`Yi#`q$6}s&TA+ zkN{tm4o^4~yxOIRLEohgi3wqP+Yi1{AAO%owfpIHyPcEW7OV1HC1KGp4byNwqnY;~ zEx?}vC*F_FUM-@@L{#;)&`Ef&PHlb^)KXJQPq*z+*p@_gI{l;w_cyvfke+t%Ho}s_ zyo^+Kz`}UO+PElib$a94aR6w1`&pd7#lGyhjP9a{E$`8C_E)IaL98q}Ab1Z;2|3~K>hQe8B+Y~x|>@Ss@X6-z-f>NWA>SrLBs?#$kUy~+{8Ub2?su{mq2*qrb@ zcI7df`{dt37_f56>2zOkB}%@!uFKSejhwGo{a z!e8;bP(%RdqO!oUbOn|lyY z1yO?UJbZ-et%JzR6(VOKl#AfmC8JC;fcmR{FuuDGql-C9CeYUcjL%Y)O7;9@(naeF zuJS!yZf@wR&9`X^nQvU7%l39(+ktFJ8a`84a_I>{dXosHWvY`a=UoDqvEAdqa2P#i zxR0q;QWhfzdSobxD@nl%ToKr)>)l0F(i(tQ8P){#%KM?IxgYtlY_H%*_sj1#^43^k z!)Yl>f2f>e?0cWq7n9w^*~CsGiNAgjPW>g+zRy}EyKlN&WPA~bv!;C{c_~W81DubQ zr}d@JW?PKIBQ-P>E|zXqzC`{{FJB3KrMToeIJV^_bcd(WiV9EUA=*1?}p68??QjxfZyZHW?a*Ey=OETR6(CbI29WdvuUzY%j9o3u3qe! z9s2A}kSG%4BNRgQNfQ8Vep~h3TVKrPPq5(}8O)|OsxudNB?h*?5N)FPR7y#pwh`ZP z*f=W_>__`>K1Acszs7pMmVly6>};EEov=xnurWI01?G83~F zz`IN|cvm<)bFAKD-&r?xL!W{*5UQd7E<?Cj9!=h%knUJg#fh#_YRM~{*W@Jy$msMe3`;-#Utfb$x*dSYAO0dSBf>an<&4vE zW$H}xwF@|wv=JPcn^D-@E(6lHLYusYf|7pDXZqr~J3GRId>?}+@*t<`a62Y>BHnU0jDF=CRuYdapE zZhyt6@Ciq=TAKTd@YYoHXAy9<5lxeVjobNRkDn01(@D$~r#lQ0=vIaTKJy^{kGAls zEK9qz74D=l%OEu9GM&E~U;CT47fKM?MFAM5o3DWm<^2=Xg zcf4@NaUQGTcoZ7UsYUwa&I`t#kf<9Rox`tNW1^ugz?0PYwg9Wr)LguWPB^&}Y9y+7 z^;Z)L;Tt85%LT+Y(YO;E>JQ|`XGxR#19Pm@bUMK#K1 zG>Z4D1i@hdDkqo6Ojr&SbXFcSd2|cF^8jR&4~XxoYx(i~#H zMSfcwT+ecV!`?vWC|k4kQ&(UE8CpBA#V!1oe=lY}9ui%1EA!vZxA9e~#ChVGkq0F=Pn7$IB z?&7@?@9zbtKYr<-AD6rC#@SEuQj_AHg`NpG;39XM$jHGVa7KF##O5i#57TbJ#298E2Zmjl}-=-Y#u?irYPYq|ZB|%XbCI zOl^|l|GeR4Jw*xGf3|bOHs;=04%4q&2}XYd&O&NPoeAet@BjUvSX%k+QWe)9Q` z_r2Z@Ydb6vDbLD;ek-54y1I1D%0-!;-E;bqlvB`Mm$}=yex>m8FxB@Fy75#)*5)@3 zd=v)HdZ7zT{wd%0+ozgW+C4vgj-l<5Oi6VzN1ZCs3AsNxXCGn|MWP&;|HhJDKG z;>Gu9QI$AGecMjOUR}QU=D)|Seoe(zrK-t!*=P0S&)ccSd<(1Fc$C8Hq3D0`G(_3W=!G*M@MF8n<6!|>Hq>dJmM0@?X z{qx31S9E`|P`BV-8Mvotx0nm1BOSNz@es9Pj`4?is+b#pxMA>kaWjDOl56`q(UW#w z%3X;yO*hip8l*tS15pEWG_H#5V`b;+?#cI-LyrU;e$GnK+$S>Ho+Hu*t3fUP7drO# z7fSa`Qny)-3?(OCO!2>W=8@Vj2X`_;1vK&=`*eVkJIs99`d<6F*5D)4mYI+G;!B4K zlI4?^9n(M9un~032fCX{C5_BEmF>OxW>48X{>wh_g$4|n-(LhKHT!6pOxi*z8q5}c zk^0-D>W5h$?_abqGFm-fWHJt#jG(piSYv=Dg77|BWLcUh<*A~gXrFz_ zIDKfV47%D|(pHrVO93_vFjF}Afh(!HNe$9}eEAeoTPjcAj;VpUL+BF;2~Q(4r7k=J zT}otHEU_aMxL7{e^-|^652Mgkj&RI3KgL?F3fB+bZs|2^R)(8lSFy|>miP#K&rfxU#340DET`RRp< zMBuO#vt2s5zhJN7hwTW!DZp;oq{f^gUYeK_=dxt9p5HCZRnOxso@eicDpu>Ue})Z* zAGTWs#6iS|O)LS=WL+tg-&%bT4lb$m!9U zc`G7RU1w-VWe=64g+io_|Yj4uWR`8r0&WZ7K{cR zj8hp}@__2QQBbPbyHUow#eMWeN55#Zz?o-}$y8UTmwtX-yXd&f18Ri0Msx}A-)6hV zj6Wd#_Ca`V??+@YI?MMss+k`M>CVb2MrNcjvK4BZkC4hR2Y&T}pU9W3EogziD3vNH zKcOJQv%}xXWcPg^)(;qE*eTHRy#|!*Fz)i_hwJ$%LQ}*Vu|D+asXXFH_9+7J9mATV z+DC#bFetM<0=ZxaupWUEXMZ!vQ@mUwG0dC=NL9cWjU~_B_1@ash7Fq(qxIUhNbyl^ zw{s~H!N(A!BfFi0mHZ)MHgvTBGrJkJ-8D9Y;i%-6jFahvEcI<**a7*nlnyc3eT9Zv#be0#SjEe_(?0kopv`5Aa6pFu%KCS`Pe?QbuKiy; zasmGKvSs4XA-h&5X`F7q12P6Gm`@HrRfCz@$FuHXr3wez|293-I@_IK-pI04lY(*y z;CUO9ar%EaGF@N@is%XfpeMV`5hkVXxZN%APJ?!GXv!+aC{3)r9X+u z(UWyAdI^*7kIyUYcH$3&EZjsPT;p)=5sN6>`OE#PFMwwl!y^7#;hr0K5}c&hnXveI!f#hIqg)+?U6zA zZhvUq1hVsm*aoe6@j|1o8xLIo+zw*L%jYxENe=^|`3B`h5d^Mw=6^0%V`2ouu|%en zN*s|ST)ymBf0z<0xJjn=94iaKvX|Pk?tI@r$O_gWafc}pELSQ;M4WKa(PgWtaEPFz zspcPJc!o_RoMA597*0m_QZAevTdL9ch)P^Vx*P zI;@S!q49B9cT@uDi{D1xtPdrFQ{X&^^FUZMEaDUd6$Z$*o~kQ-xs>In+-SKc3vY%y z+ksff_b82SgKZ^LQCKH<_j!MO>{pU9;0(~@wV=nCVEC4-q~{A`&S%1r}Ft6;LFT~ z*n{URTk|ho4Fo7yYSTW|H43w4^Jyc7wfP%+eoC~!aT)wF3Xj32Ms5j$-e*SZ-`=-n z697_Le4S@;LfYzHNA7=Vfi&M(0?3iv)j%~ZJPaJ5x5e`a^M`9ngXR7I)02Ny zz-Kxgn!D{ak5&MU3)-lK$+uy3_wR$z*^V zh8P#AKV$a0Yl=Rs#4RL{Blv#fu*a2K4nN2%`a}_NqAaoxsuBz2i*8L1hXI8$XLRMm zD6qW6-rt>EcE8x4rfk$yVR~^`d(}O8qR8K_dfmD6m$_6A)$Uj!;8ts7JU~SScrmp_ z3CYiybdG7&+GPO9e;AjqC9@FVwi@5lh(4}ysT2~KzZn&SJ^t9YX}RorbLWChEcU{ce@pLwW5l>Z;pG z5A%U`<+Eub*W}^6zucX@8yE4YV;xlE2eh_=H6X6V`9Kjof&Jnz`M;0FW&)Rzx=#ev z+~IMm@84Y@8x9+he{~B);zVR#c zOZ^EI4ZR1M^YwW;P7BU{+qvVr0x~~H>2>5|K@`KKXf<%)zTY??wcN5H0!2yb*-4|$ zeH8Xjdoyrf^;{KOv5$g>XP&oBh3=id9_Okc770}6p(BJE2xpX>+9#XaELj^u z(t+=h(fRky6Ps4*p8Lk{HSk&ZUJlcFW(3bR0iHTEvhwi;5jc+_$}$&{HSNHCJA&;3Z$ovmvsO-p89)7LCnY#51XVw8z_7vqD>!@;Qe-*HHw|X5l4;Djo%^2f3}K z*NlZ&wS^^O9gy^g47`=yjL211Zj3A)es2M255~>VQr~LSN3}b!y*&(xmaidMhlu0E zpT~?QXc&gzhi@>+IYiT;Pk8d*_7M?JEa|}hV5pHphWQ^#i*wUOeY!$vA$Kq5r(;mX zOC?Oi@OuF~5fnLTvvH6QU$c`2BZR(c-wCcNedUlv1>GRWXT7*TaIOV9EBw^eVoFS4 zH8*sg0|Dame*!@{k!KK$4U1qb>O4bE5AqZ+{9y&4Exh@xwDz(cY4OHRY>H}zh|<5k zOK7PQK~Nc`)0h<@`#ljt|<`FNSbUiZpta!&424XlJ5tAc{>^Fp@aMOpkxL_jW+_=dmjT z-ePnWxc(Y(rwRgr{2p>37#5Vs&$>W8%yuhiobLVB1SaJ2ky0stLLd1Ke&oP>joSag zAip9z_BpZ%9BHZ};|jw{6%UpcRVRnMll@9zsFRhEoeR?7)`!6GLDcIa2j5>yzKWOK z$QuKNpy$7VGh;NnVJ2l%m0Zqn(C19ri`idtP0w73Ti>}|aTfu;S~;{m?C|Ck9T_0y zfTpTv=624x;c?|$Qz>!0vJI9CLRdfo%1khz1*8z6m%re`#f>~GLi_%rWg|Fnbh*>6 zu(p&(_mG4cc>}HK~`*^r*>u~H!>x2}HYEkLAmw&u% zEC8#3_*y6qzvfv!SlA#yEa0vnR^PqS@42}ML&OZ8kKu=Y^PUDG2F95wRC$J|g5zqm z2&|FTHT&NUZYwOmzd(&w45=?xoC$=TdpddX$-kdk6DcX)x@MVEMhHsoq0~Kx3#g>) zfSB^7m*pS`>?jVpg71)bBjS1(14i303vE>>Xef7}k!jj+phJ`4l|CpgeDiSBzbEnl z_2Ua_-^Qtf=*N@g+k^I##ZPhuK)-(2AY3x$#0SJTCg`eoNNA~+$_Ua@hHx;hIcr33 z??epg1CJ{TW*)F-?|dS~d;j~o`9K&};Tx$h3qauFk8~KiDl@%+7a=|AKXn+yR88YaQ2hp(d(xRIw) za&O>2jZ{K~l}S`N&yW8U+Ma#~570f|H_bfUnk?BZ&_*80;G7&bgvtL~W{XQFO0o!P zMQP`Xs-@}hl-A3kq6hzMuG#*0sr|pa6U=4LsSZ>rNKq0(@dL5=&D8C|4F^Wfj8ksQ zFO}~f6k}a0Trz>Yom*a+e39n+UKnvw7`mPp{|K9D==#(Dp!d&{}HW#De_H0x&DCm=I?G*(E)eps8@F0UF9v-zh0d5ovxV5k#av)Zz^&n)ChNyu$Q*)(3@ z=@L-%xd4v-%~cKiXdaZj!I0<2ye|4W)lefWslGITQlbj?!Z@D zumex3N+lb~Xz`3UTdO%=yq{rSV>W^RbCw40zex+FijXToM)>bByU$8%fG;Z6$1Gfv z5~pnVtGBlL)QAdC@DgpBf!qKsuc3diZb6PIC25<9w9(QU7%jL8i)l+j$vt0lIQ$&2 z=^Q#w>~1T(W~6a=3Mr9yPH@H$#K3UYaro1Cpq_@sxqas$r$7p_Dm=fk`>k;En4CT3 ze>G))jKVYyN>8C&P}ganocZy^z5Q^D%tw4z1fv#~E`hoL+FQzDM+))ZF>7c1XowCH zuKh+DRFi*%)aFhsOuO6KpIaC02~Em?dGRWtlY!%sq9+tXo$X*3dYKLi;IE5)s~};? zhv3E2Qa!-O+3sk1Pc4Q_Nu%x#6TJGd2Myd|p;g}|h_+$qKIF}uci2*@G58>US_Q)% z?*GeQrN|v7(l*9jz$U<n9*sZyzw8iAspD-9fJ_?MyH*d}sY z;Rl{IWpgqJ7D!6~{x?O3#~%aBvUwIH@hk5aEOl=8WQVRC6ej-8eJNsJIG|wT7nZD@ zd53F1im_}@=)^J}sTTCY*{NZv3%6H_Ckz9nt{rBk#+L_7JJ!;_sUu z_wGGZ`AF?QJP|IE_{s4D`c55wbc1LAq<6|oF2$w{dzxb)hgc8)zGg*=m-mrl)OOiAH$C(LpZ!zA+?e! zd?qV$MeLBqlH0qa7Htm97`K%q5gtFayeev{N^P2|b%yCIBxGI+(VH)PYkmR}J8)pv zU6a?}?16iC7-55HPW>SumSflLsy`J@mqR-|4z*u<)|Xv_rq!NOfHp_xwErUYC7&j5iifbbvE2l4TTF_;rC z$AUvcLNA#eJNAW!P3MU`-sx7SRr}mk!cDG3vh@BBQhkZ1>*Ay-XFvg>NY7p>l>-L> z8W+AX@?~UZZ59E=0adzS%^Jo8Q}-^&<^rGTanTo41WHPfiQ*~(QAA|_6`^2Iqy1MT z@~lNzWDPwZ2F5bzg8+L zO+IM003i6E-wRsMMUWYLIV*=Z2c!)@*MITu|BzEUCGZdme8Omazxhb80q8tn{0pS> zlS>spOUJ1w&N6~F7i)0e&MJ+ObH4owiN(DZ`}awdmk%0XOOd-@p)^UC_Ozh3CLxx< z6yNmpjK5r!%FG1}B*xm&BFzd^Yg9*M_jmeh!` zvT%B92@0QEYYCUarJo)ga)6;plEyi`l8|<;cl($6D7PMV+Ac@CPylMh##d>1GTzvh z{djioG*Hz5e6vau5|TmRnvFPK6geBX2y#gf09!clTJU~AK!XH)8B;PrrPDD#XrKhX zMtLpn@|uRxUp z3S!Gs_;Fg~WU13U)raQRBd2!Cs)E|$EzjEy zj>gotO9mPdG&_E9b_7o0{rJ+r*?BFc=^Ji*tem*nGj(&%t8>Ui5Fy}1#c^|zGpI$< zJ4GVAmy5rBPgL*8n2gsxne!#uA$HGO|;qnCtDWv=eL@3ohGE_sIil)ao&lG0=E zjD`f>NP1qw(i4{%T7K;X98p{jM(1zNNoR88+m>V0BO9E&3UK4mVJccg%+vR}c5n(^ zJ910OtnqYlC|Y;kU7;Y}Y=?XC30Gqob{ebI)-F)I-?Wu?GG@7wnr*nU$-S6bDpX9A z_~e>5c{tTWo3L|qL$XWX_nn(}iQ0){qW2?rlKOk;4YW(Qu^%O)W@Wrxe@ve{SD5)W zdT>&7C0VJz%;|K}tK@37v5nR}q1eKV_sNfYXwJ#~p~xtAI7`r1dUBRd=aU`k^#Y61 zheyp!E)(0iORI`sCXU=HHYR(%X}eHoE%@G4bFAZ=71y<~)|li>wO>vl ztb*Q_F-|ZNC4!LAWbU!}4)cJOak@FnvbVOyC~#cDf;d!c zvCEsztW!?S{6F{T&mybJTh%jr_x)OVdzd4H-o za)5cKU9rP4!G|vJM!Kg_SJxe~a;%@;x#R2l%Ig6hYk2Z3S6mtEF5JzdMZn*J! z=1$3;y*be6Ld<$ObxLQlzA*Noy@A}WVxL$~UGVxuU?mub;Wcyf+^;1^gN}NquKd>l+o9;|_QmfNhKr9`dVaZ(*q@gjQCbrs z@omFP_VZi``iyCQqRfYa|5wv>$5Z|N|2uS%SwuG^DayKLW;BcxQYw37%g$c+UWJrU zWMrq1$R>n)v$v2P*UHGcRxYl4f9HO_kKbRR^FH@=UgP!kyajtSvbG`!sOckuOsU4 zC8lXPG{xocd-@`WBoBy>uA?3vqX#2WXtAeA-%ETWxfe^qUBNA2q9o+X&{SWZ%%t^pQji?+xTMI31NHkbWLVfMYo4HrX~gT58U1|N+uk^_uE;(W9h!gT^W7i^$uSVV z4o!c{z8x!i5)c+29+mQ>-o~aXqtp-4)Ov9u0HDYc+s5pTRfd?PAwySx)DI`w zv9N9ZDI)w~y5q;Wm)&*wb|t%R3hCA2Q4%=y;Xi-1CtvWn(Uq$+Fvo*|5X9xDoJb?fJF`x@h63IOMquaAp7NL`MuUoaN@g#*zd@p&z%(MH(mo`tiGF8U2}HPlzPlJ zwK}F3bqjdT%nxe|3i^&rVk6cY(UapEmbUlIUyQ@LZ0Y{qcDrFdMwYBf72L4hb?bn< zbFdCvro==%RPpQ6J4H%BHc5JTF6CpZ)UY!BXo-t=MGi7sy>?QsO9;hy2%xK10fCjd zb$4Y@+S^X{vBi~zj+o-D)vJVsqJvXk*xo>s4__u%*#JZu`@PQs?2v9<`d-L-zxCqc zr{yPPu`ceyqhE*J4u|FQ>0ZX*jIV1)a>DNX2T6f8&a!AcpAM zA>Gqq+yD0Y9Rt$Vx^QhEEg9wBZM3{T2hyVE`17vLsejx(tX?jw<~bAxeg6|i{Ty%+DMgcap4X#Yl4dEgTg>QVuQ#o`gR~kyZ z>H8+j<8yXJAM&4rOYSlzRN06TQPu{FBLTi+ey`~F-+5t-gP#^|xkdQ6-c6|Nn=-YH zh|5#txtg_v;mU9a&h}tluqapJUA?$RDCPuPrD}c0F_;kxzgCqM!{BNJ-YS}Afaaugh+$ulIN()i`P7|3?ACKC`Or|@w z?~xK-onE0gJ?r3E5|tJ|JpJG&?`63c1u62x;E}zk%Ij0(61EUkq&8RYnkC3C+vWs^ zkO>*mSEaRWLrDqNm5C}H1=mvE69V}B_7}_-@2(6a8~4J%4_-p!YBOU=bLFIN2%t%} zB$3|?bcKOeD%9GxfwAg!+1`2$)LLFcSY@Z~^{!C|z^fOzy~W&z`;~o`HFJrT2EV^s z@pYXUc~`%NvJqC0+^X$8%!JR#ZF*YG@0M`|ypITvYT7#HT$AS+eY{sBIAl-a%s9=5 z*U3VFtc`Ph_JL359O^dBg8W6=x{7NnYnA)ESe)qi^NT}>K&4@CAJoHf$MyVJ!IQ&O zc(6UTznlGq7D2+93*Q9*KPa~ldC4EBIP`kWIZYLCCI+vCg&cJ(l&x=X96FqX~jps#oQjQ<_QiT_JuRK*c&=cx= z#Rr|_U0%re}IdE7T##wNfuwLBj+5H_EIDUm2WhP?C`Q!{2{H0A=EZ=#n zA<+ZWO|EH|9mvg&K|6OQW)s~)=b+oJp%1GP{a2_!-%*n=2|Zmqui$M9$uu!zVQs@X zhp}o~WuWtF1vwNMAv9FAn*e|g00GFbi9`88QEimQAF|oZ+ar=5<}WBji45oJ;`3lb zSp5*G$2Kkh{9(=6U)hXAoiw|H(VrAv(bVB>N+r%l(i4_>&u}=Z#TJrVa}6+Grr@tG zM&wxIp}NO6b{-Y@@W(jEml{AG4i;T$7>&gY)3Cw7|Bum5J!Vhc7G-#Uu`>{IPkgRc z0xi?7za^U|$p0Tz%;W%$OZ z7fTuRef?Z8=+{3(s8^%IFW|5~wZMe{Q!CsUo{VNI@frKp{@}507aKb6w$<_LUJ;3J{%&*|( zEfGCY2O|;(=h?vfE@IvHO$pKAh2xe#pT4BtvVX(zw*JXsK~@bfAZe=qRQKfFvo4mX zZvY}~n&3v4h%)LLI5-t7OBQJp+~_HAxi-Xu9r#Rr`5hhI8!;rZH5jETy3O1=L3yfI zTWHQO8^5h+BTVBcAR{Ck-FB41EhPF8M>+hCl+2k_n}Q52&&Sm(p`@|)m25h_+O(3! zWh3w{nCtH{clpU7WU^T#|H2J&$v8zsipgroOVu~>NAt_Fs$;MAonUp1AeB1P7&=>p ziYlsz=SqRkHEG{xSwrm$z3#;Q9Lx6}p0VsQR|ziiZJ|WBNrdst&I>;$KKAl6-owVx z!RTefQGgnM3lF}4m%v2~%PaWiGFs(aOeuZF4OU;X(NYEd7xAT~el>{=pC>3HoWnR9o#(5ae) z8#N(PE87xp`R9o3DBu~#?0bM`0KV;{oa=MFyY{Ty{sicN5o}~Xa3x;8jpnAV=7b!@pB8dHQ2QLU-xYixfm_lD8sMt8_oEb3gCIvu#n#^ydul{@ zzJttijl_aYY1lCDcD(`|B@9IP$M4vxS5oN7Vyc8woU!5;uvdOX zr@+l5^+qLzz%25ruu2U3uy3Dq9h8e)rqyA|OdRYLDWkQkredzu#j`TdQ%(@(rgMv* zoY*964BAFsX)1BAOMHzqQ_PzpHU@kcY}ozszu@=y@w3%$kVAY{_w6QR`{ zpcKQ;1N`UQk1A8AYPF#|ZrPWJ6#JeUnSd4Npq>V=9x>X8Hk;YORKM8mIwIGRf8#(=i`=u+9 z#`$ch_px#9u^ly0im?>7FaqEP1``AoyaOU~QH$Z!aad(yWR2OK)-prwKXa#?RYj{1 z=T|T7h`DzSvqOJ-@l;GWxPTzKMah2Di5(_w5O(Msn(-A@&=KH3A z3^OFNoHD)T@@VTOz;xcTA*p-C4YD)L_5${SMbNaD|74OC?)9SzlgCL1J?G#Zb7@iG zV3Ee=TFgz;lcH*WmPS#cluoPi0shYpuqoaH!hCw+eShmm=bH=Dtug-Jj#C#dTR8Mn zi0iXT=bLq&B#fw%7jkf)k8c+H!}XuQdesjD?54HU%bTR3)~)7;Z%ZvD6YC2baRILh z%+hhldGG-V$Jk{gC~sFET2M$YfB;`^kP8|i?^3YN%TaaYO*Z5$UeOdteY16KKjuPE zg5XEo{TWLZv0thmV}Oa+yTZW)gBf=-NR|LH{={P1Z`nrz)O|910z{-Q-sPN4p1&)x zZ&aSVJqs(+Fx3%0An;F_pIY>dTAq`EU)Zu~34&GlMlP!##W-*OsLb4K&B=UIDf7_J zrP?@}Eri^=F?++{MaO&HBKahpaFMe9o{iTLt!Oy#3=f=r@J1xCb(Ql%G zw4ik$!CJI3{OJTyX!qKdg1f~56YNn)&w5Z7^Q-$$^%6%A)Iy+a@ zLQmbE20%h=P9t(3OQoH)+5oKOQb6F8#?kgT#2?N$R|y3?io80@zd5FnnFq>J0MQCR zD-Rk+lulwc8BhE&(H}g4`zA4;CJV}0MWq8#v$O!@ZeI{wU#TR+OPPJD2N>vz#8fND z|8jhcfeURK%kBc|u2Hx=DEI6O8hijU#Ss%D zgfZ>mV*LB_fUiqEatwL73m!Kiti zL7Z;B1ZNCm1<){n;8LF-3E1YiyKsbsG9x81Lv&8oI|$g zhK`wjzxMI`6rH^;$Ztq7_mtN&nj^)(Wg7!b5-<#dv|G~PGRu2cXDv-8aqgtW*Y*)l zlqOMd4<0uuN4XOn7Jqi{P~(eQ`?hW!KH?hkX=eZnPhh|~83Fmn{MJq(;@X^xYAq2~ zXE@rW$>1)~mgW#N@Uz@5@=hWxTStAG+GWg$*XpuT0-81vY zsju}9A&`?NY2OiGqWfvfbE<}HnD#ojU2x5G=*p!qb~}sA`bs}Z&u4&51Gt%y`TK4? z37WkBl1nxfP*8??M$gS#lZHv?VHaD99)aM1LL&G0sdR<(T-~Wq)%D6U*913lx*3q_ zy$(S$K~Ecn?Au8_A%1^2?A-C*!!nz=h61zf!4 zWxGY0?{OTmSvvS6_>8~ryFHH3q41eWkRZ49SK?c4Tt|Y_NyD8h2}j>Vh}*A&cBiO1;zok(qj z5ein>KsQ&Xg8xOZC*M0_7vvXb{9R6!69KWHtEo~=^eQyp33&D>9(aqj1p~&(4%4c~ zF3CegLK$()Sc{X%qf#D9TPK`Naro!ru?05Q817XzW>y;T#@4m<_gkJ41(jtIl>M6| z%t`qN4H`(Jhd>>m-FH^3Nlh^PS>SRQyL@BD!nkBj&W6q^$cuFv7lIzrR5Pph+v}$b zcn9y#S{J6HztnPIuqwRhSmqCWTH=XY3m@lDB0>^@C&EAb)X81U;7P9{Di`(a`$vK@ zt2(ja60k4(pd1YJ-uPGwmfR-QX>im}PCp$wvjaioo-JXwe#Qs}`nNehSUvz$=Lgsv zkjU!=I7eGsGNT~)NvFyBQb5Xwd8c(JvzvY^gB%h(wFxIYJSAD8j3l}fe$_A1 zv>HWZc6F2kvLJiFHT9Ngshw_v@s|glI5Z#(KWD#kao5CNRgV{xudn{-X6AhN84Q!5 z6XJnxI7dLWGzkKrXVj2&g8@1%18?3I1l#M$~nkmnVz{BzsfI4+=`Uri5om|`feK=<^KoIAdyX2#@X zhs8zNvKQt3@KHBb9P+`POt8qVq*JN^5qJ=T#{E0&U=QlEC_{)W_rmDtcfb;wq{)H) zHzHH5&v4=D$nwk=`^xNRIAjke!176U1-}mp&VG?LwOUA~(tp|}aIPEOKJ0B0&uBSOS4*5$JsQk0K z;PmVpp8?y|2b*?}`ZL*Q^@wFr9l;gVF{B==Qak;Xmtc^-pp}*N=}dAh`;FfnCihL~ zmTHT7S>HQ+7BB-h?Sh>-aK&yI^M5z(+Jfs>!EbPYM>iOdw9A2Sw1We_;2#8lgfMpL z|1RhK-y`Y|kq~bBo2s;@Kl8z-Yb64Ni}L`i-uPwmztLXLqu|)4isu`z89(Kbucxi> zHy-NKh9{fzj%;k-*gUHM(=4Y5_?C; z!(IdlDPBS?e)2Rkb%4?q;e}mWXg~FA!-;b`Q!3QU!1w%uKjPemy(II^kLPI;*dy?g zC6l~J2;}{ZKbY3UkI&tM)dcEGb5%S>Yr87)LdOS@J6=5!5}o2amzWFnH2m_d75DXFcTZ z9BL;#kiNS?znFzL{S_2Miw+3a`Lv3^G<$#w1QKz5SUaxF=Jdk5>%Dpo|mtPvWsS949t?m5V-<8W` zpMnS5J#pUn%Epbn3KsUBh|6vN)rv)e21!4-ZZF94f=6(81iANIc7aQ(KzndsN6E9)<#o$ zF7J2&56yRyk#+d-!BHo~SaAShSnMUql70&td)Wn^oOm6S;R&%%{x|Hy5uB0ti2Ep*6O=RR-0BAP?pRQ!`d0E%RJVU zex4iwe)-RTlt9xFv?8qE-xKRf(c5u{2}~zwn_wm(z?~-fCY3{gL70hoEqzigZ0^Z( z#@Mv@N2Xb{M^lp{G={aGDhBv|$)iYVH&H*847u-y2b!a{-2?NnFkkI2)6xcFh#fT6 zOts5u>ysWmCy>z%^a%jX+4@%zGqU%Js*0dkKiyFifa}K{D>=AP-*nL!67z2%F9B)6C0L?{P7_|qr`(F%iC!wZhbh@pX<=+*gKW=>MLr-kBsg!Nz##LyvraK zB27N#63uMfD^Ob)%_m>J#ek(rp}mC~a)isMHK}zaMRjyn^gqC`y;hE|xO>^MAx?0r5IeMh7`FqCAJ=uet2K|lVgp31u z#RHrZVj6*%v6PBdh6y>qGz|>FF|0@@qtg)|QfL4z_dM$Pv6+Grt2lR>SO_wmp^dj$7@ z9D-j5@?ykY2#a~35_)&c1Nw3LLIYeqdEwEue8xzJHic7@hAP7U!9c8k2qo`4e~;~t z%%lT0IL?riB4ym=-kdi@GQ7{ew8FHz0Pu#4ATH{ZpCca7gA)!sO_EDsJ0I+kO7xOO zeo25Flim3dJy;?sS(BpLm(!fTxfHZe)o@ju65XKho|!k4DMb0!4bjOxM*&9L6Tap? z!{6Qas|gBj-Iz8LQ}5O0E{BeDfk3zy-MFD~q$u1oHi|~rI4?YlpkxEDxK6aQ~2mcP)acz1|Ha%eW5k*%k!UD;ToHO5nD{H}`p zD?8HAW#IMMv*84=ziUB#@2Cb21CFl0j=~x4_%V~7e9-Kx=GX)xU322fdc#PIxPQQ} zR^#0tMhf$cH|6J3Zx(bXxf{6c^hkkz&@2dvX$Tun0yba+DFL(QU6RJ{(evHFBl4<%Rf7ux@LiV+1@eYF2dVPOmmc z535WZ66`ZJ`6P?apiWU`iGP5PWemKcDxacWMq*8qv5TR&3~>(0F$M@J1PTtdRM3q( z5#>M?FT|X@Qpcv|S@|zUV|>bX=E1TRF5`n4B}4d8}c8 z`|r{BDp{FP~{bOWEH;3D1cZiZ_gxUz_aM-7nOM;y@O@j2m}%2;hbCdeyRD+8 z)03f)%s;|bLo@Qvf4ye`+koU_H^EzH3#(``;73E}cjf`Z1KX%I$fv#$uj4N)e(D%U zZuzd)E^w+-HI1JegM{RKY!l<2+l(1UOmhiMm*WZWy`FH!WEaG%U5GrA=jIp&Om*?M z4oats6xPsvBEvW1QY7`|drm4+>OT`lO@r%Gs?kPo0HiexBv#_p z>7qvXcK0>oUhpO-gFr5}%Rf3*_y8fqB{oqzmJMITr-J5HStHT(7Cn$mId2_gnO-2XJ^P_z~DyOF_&bNsBY z_r?y~5{7=UY5gN24)<44=sl>m+5a>uSN08}VikyIh{AXtV5Q%-(V}@o!!T$ypP)X; zgqsK>uHZGZ+~QVJTo`PR1H*NDhp8!cqJ~nKOOiGPiI#tvc3G!%20O*cr|ckZkLl_L z>C)qhi|H~DRj^nY3zUb9!-C#{V)Sit4aoZs!tjKp5z|wj*q|G*@7NKVJ#SZZb}=X< z2$8{-gqtnhakhc^gADC_q!C1gPUR8FUA%CR`CjDYWXDl%s83#<{G0;BT;Yn0D*k`6$R^D@ZjY t&A!foD(0~-RBNNdb#$8x9ZO|9Bf_9Hnd(RcUn&XF*3eTgx?%O~{{ZW=z|a5y literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/L3.png b/netaxe/media/topology/img/L3.png new file mode 100644 index 0000000000000000000000000000000000000000..88984ff1bbb63f709aa2c7a2391723ec2fe5ca62 GIT binary patch literal 28107 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/bridge/bridge_mango.svg b/netaxe/media/topology/img/bridge/bridge_mango.svg new file mode 100644 index 0000000..2a016b1 --- /dev/null +++ b/netaxe/media/topology/img/bridge/bridge_mango.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/netaxe/media/topology/img/bridge/bridge_mango_large.png b/netaxe/media/topology/img/bridge/bridge_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..472c30808bcd0ed68818589a873e1ce1e55746b5 GIT binary patch literal 3429 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 + + + + + diff --git a/netaxe/media/topology/img/bridge/bridge_pool_large.png b/netaxe/media/topology/img/bridge/bridge_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..947e31afc0ab386a637e083afe51015a876de271 GIT binary patch literal 3484 zcmc&%c{mhW|39-Bld+{N4Pk0WzNKIii}Sw3ESRg}<5 z000$&n~N_15P25@kO+AbbfzLq-mHsp3-}8Fl*U?t^bC{5a%V4si<4jC%^$I<9LntCNl&i?9+=ez#+g@QAjt2|HDbeVK~;K+xfF4NqU z4s8P(vel0##vUmw;BQN6QQNdk^78U*ECWV983jk5D_Nc`hh0^!sVz)0? zHtIgEi1Jd!fO8kTvBAr;ma*C0?zDW%!ZB5hIsyeaf*PzRHdxsgZt>tQ;|62d=g+QW za4g*e8|<;tJEaTD{E^8hw)G6UMH&c{j~BZYxu4~H(1pI8IMQS3ogZL8>PwQ3Kc~fR zMca41Ze~o`dX5LT5W*o;%^Bb0t+M|2y1;6vQu(~A_OH_FE7~1O_yS?x39)0Kfstf% z&@Xm>GLTj{YzSXW!)-J2Jo*pf&LR*K>`l-PT?Ht@r~0SA+!2DuuR5?P(Gq7cxk4|0 z&-iiWi4x^OO!)T-HRa=`rtjHf7@@-XOkhb4jrmOFZj&2ON}HNqHWAZh4NizzFW0H2 z?SVLsDykBFkd{9n*4?7C-Ep@c=kyVG0r6dXv_nik?p)x*yF?($QVilN=C<;i^3%WF zROFT~**tPri`hps<0Gd_tb)oFEjHvBSX-5w4bB`%hOszluNw@ky|hWgt_^=7xzDAt zSf7m)vLyVAPiTl5_g>jiAdCzT{DubPO}}dW1Z^W_BzDd8BqTr7Y{_rKod1j;nE-n1_KfH$XR}6E@d5xtc&Z z4}?>@7q`9Y&}a31fP+2Z!+m&IXiw^9fUvkPjad+h+?EV#`Mc@H2?x~-H$Bz>%^r+$ z3>ZyiT{E9B1+d!BKv=6t{xXaRarGjMGZ|3H#Kp83+w7m zb|F?DW6lD~pKuVW1L^X~#~H7@X^F@MRN8G6D^y8lB5mF$NE6aQja!C52g{@*6Z@uwT@4D{%GRTSoHM;;vEKVH>|5srC3* zTEDB_R%q$QGrzz4x5KzMaEG&sn14KYX6vbsl?d*kE$3QiuM8B;O#QYM(1R3CwOWKG zVpa{0g~(IRVb}GC;UY8}ReS3-MrA}K#YEe)MrF0yq?t1E5!NK*({N3ue33fnOpjF| z-SJOra<)%ylIbETd}B}iJN7ZmgcaE|vGt*By13{yZtVJc(78h&k;r}*$Bkm&)9sR^ z=77W>O%n*R5&A4d(x?(7DW7lIybH>GO5nz`FYO3rMsVZvFYU;NLgoe{hz$gGjzB?Z zED+2tO+*M!=ITLegHQOM)~G|C+OcjZcSfcKXT@t{*shZ8_e0A3FSLK543ewvGjECq z&x8Ib^yB?>;{%Tzk859()~T#-8WyYv&r?pFX1~K8-TaHEv(>^Xb(bvO5d4EG;_*!? zEH+-^M{*ekS!J>#a28n`;}2&n`cSH%KZY~nC6bm=0aFn&_e{RAE?!y9>w&bWA@i7- z7EU<3;&ZmTd}c}M#l^8%zvmkD%9)1XY$m z=eH7ah-7^ueg76PS)3j%2(M1bBEA=;L@YBn0Sucxd7xr;i}{dc?5M40*cSMt=(|Ie zA=%)!iE?9T=?(5}iVL#0>)AYek#q^1i2nAy(oqx2%-V3Fm`Ec>eie1TUO1Jr9&|MO zfA}qoZv0mP>VO867fuy*GIDNMPjPf0>f;BBe?odzCRvTAIQZJDvEPnfyTw>+kR7;s zIeX`_WcF6xZtc^r59b7!2aH5xCG{yg_woYi#t%u|i**v|$&g%6AsAS$>L9$lOhPi- z+o+*N6JOkNWWEpDhm;^)^eY>oUOXx{aPW&wD90~;Ie1We;a1~@D)Ez7>V~OA7!l-oULgihTDcl?_8FYy*v6-b0#OUYznXEev7sLk5jH)}{#i1vPm zz<~Cwop_rrb!zVK$UFFRre{Y(2u)Xoq>Eo{4&Q`PXEu@)ZXIy7F{w3`lMCILZ`L|V z{i4%wFzNW1n5E0adOG)M>*+!rr?PfF@@hGVQJ1JX8o;v{YGzY*7oQ?#4)!fzyz{Z~ zt%X=wfX$moF=xv@TeLz3;2D{k$dP*Ud$r+Drmd$<^FCf)w!gHhW`5e2_hc|>dgPNw zz(}=`WYfG6DdiHehP1LIE4+=ew)p(FF>&__8{ajhg$kVJ>2jUD&9#lp-agA}|8O~~ zQ+KFJ&v>WIzPd{G!C02s__uK9_Yb%?1InFUuzmr=ZA#G%w{b~>?aRAf$1daH>@R-u zL%dqnbs+PZ`iSa;dkuC)1&j}cqvR<&0Oh&@x02xSBlm6p`1J9q-MPZlO3^JzU)3Ld zFiJipP!w|2<#hQty;4u3fwh;KcbM4lSE}l`_hPTe2~79yN4oI{ZRrj@PE%!4=lR09 zd-KdR(BCTizHg%gyz(3C&Kq`S?h#@G)_ll$K5xahu@kXt_RKaU1t0q&@ohTeR=~*k zwG4%p=MII!1H(a0*-ziSljCkjthHXnIhv3}Z1{Tp0t+v`(LPZhyq)V*&xAlr@98@` zn$;xvJ5ggr_RR~yk{j(A20xpm9+uLK>&RY5x-rUO`(pT8(qcdl|3QpLLH?iPDf?Qo z-g}QV`YvCjw}kzIaM<_S49cwyt_Yf$Y|FdB&$O>zgao9VW=hkxg51{o^s@@)%Soci zh{H4Xy6n6N;oeKY+J4G{ignl*BaQ4{++Hok9*?VW+A@kdsV9GwM8TpOnLBM39ch6`?fb`f@%FK4+*ibFEm=KqKzfhJ>nDCD62X`^!655@`Av)lin9z5oK^ zx66qiCnx?>r{z+k;z5iW%`3AS;YcDT72Q1e6AV!cfS@FwZVc_ntb(z?c+UaQuqHWx z$ufAiMv-S&a(xs&F(|G}hJ;PuNSW0T>)b(u=H>lyvb$gE zVH{x~ibA)G99ywJGgVH}acS?m&%IW^E*AftGx0VpH%T&=Z zq-EvVi_f1hjz)6O^tet}g4pOA@%=A&gzBIg0WX(g_M9h6YZJQ) zWAC2nhE}6lckZ@Vh5hV!8@Cuy3;M@e4fk(CW--{150IwEv@t*Xn{1WO0{mtd@L~)$ xa%ObuW2%Wxj53j?Mbj5Ar8C}OEJcM$DR6B>B|37Nk6UG1l literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/bridge/bridge_pool_medium.png b/netaxe/media/topology/img/bridge/bridge_pool_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ce4891991fe13ff20c3e51405e8df38b047f38 GIT binary patch literal 2652 zcmcIm=UWr@7XBr&62yQ8kTAk1I52=HAVZ0)1SwR)9${Y@WvL*LTOd^|BeE5cphzKQ z6hm4;RtPATq97Z>G$6=c$~1&!8 zmTw{=bf^jA!NP|C3&*?M20+C6n?RJ3lzs*Pe$3MBs(p09%EZLYu{KoO=jMy`PBwxc z%ds|suEmhI>{kzB&N6-w^gf&9esx}EoO(`iz2dH!WM0Ljv*f(HSD-B#DXn-VDYlUF z;Kn%wp7qNPM2hm)mw7(_DQkunMLwc7HOH() zDP33aglYjJ#%b-^#YIyC7}kSp<&}bJs`iC-QaUlCanp|9oZ+41{-F={Gp{gO>e_l? zOJZ&??EF}_ZEJ4aIJ94vF1Zaqj4Uiiu^J4t6I30NfUwfwIpXBIb#Tvqu@&RL{1#2Nf%<#X*pu{v&byo%545l>8`3 zLaxoRIl}f4zWYN66}RaFOgMq}+rFxbMYYV(GK)fp&-8bc7+ z-wR(C2bbCEL+(IspUZYiT;-)$ho#%@;FfRwZBH3UalU8^-u(IYJn5s=vOySAy8sVI zg7el8@&11i;!q7_sh@-#4PV|2kX&w{Lz;c5uyxkPHG_vHVAgz=_oM6#t*{6Te4=!| z_ZU;uZ1SCfF!}_!S0W%Pem;dRuoh!eX)P1AZ5KEsTw*NmQhv?38-?|B%DgKaGF;wX zkX-CStz3SAgib2gHZJ^`^ybZ~I{QBov3Mnr-M;d@T(9f##ws;{d5lqY=cYWn zSM&lzBtmK!a|d0oL7BHY3%QieJeC(l#6xErbw&0JlFL=g1;FGjwvczQTWitSgjw3b z+Bnu8gYm%< zt01l0sd1;sZRGp`zkkr z+I*!(A|qN{c0O&MssUKPRt;^vQqppF!xBT&r_-R)SNx37q>*OqatQZKINKYOxSAG( zUPf*Q9``+<5{?41ZU0uxflKKlxtA_8)x!9Q-AjX@;BR+PfPCBt&6&u#osl!eVc8Am zzLnosngG})l_8{CR8m;dGFQM-VP9zl6nvtkqy7|CQM3zoM~p-I^K8*%1|l2vb>!hK z0B*!AoH{T2i@sJ`wQ0C;-SAv&D~lTG($hmgw7_&$xoQe`T~m$o>{eR+XbPZABgy{{ z*;A;yqp6&CK_sceDY-3|i5tPM!uwT2%Q?I9>u&y%^5W_c;QYn|(ULCC^d66*RQ;@{ zBYPlV`a>5@SDutBTT$%&{Lx2~D6e4L8%`7^bk9C-aoI9@VD5~SKPcn-#!g7z|7BBj zy3Q&52#-+vSy;g|6}|ifGIT}yF;zFl`=oT?&FEs4D0@3u)I{|=D`Wo|t0#JyuVtRS zwf!2qi>Sg}WWd%96VDSOa1I@Q%@C zTL0U~Ph&7Q?Iyb~e^_d^-s`P`iG{vyCFP%ZT2;yXIMu=DLmY{fy=aY(2gB1C{)?{y zkD*#jG=%JEaUo|Q52G(t)Nw&rV>_DaU+nLTz`~2M=?MqVVl7T-kR2{jzfRFiN9U>Ll}j-ToEh4V{lx27jn3>~UPiz-J2n!s7v;f?c@kr0+F@l3 zBfe@LIZ!qlX+yw-L0rP5ooLvW!tR~yH}rGeV28`g|4lfJsP_SVXHyUOx-`SbSiUJ^1uKR{J^-|cm)RvDUpEc0q~ zv`C9joq?IqA7t^vxv39`9XHG=dT-ot!U$c0%;dlShsokkf_GNUP@BCfT!~(-`K;QK z=hH61{4LiM{J|j!8W|iRcR{nNak%*C7~T2mT!I-_FP1Ca4ZZHyRV<-o*{xl@f_r%x zp(VK5P-#(uiwa&CVV*p!$Ej_?`X&5UWNrLnE198uTXfRSUp0Ai+Ag3&lcWpZwD%w( z3ToXS;?ZcZjnnTi9;$*DXD1N>0m9h4e1nC;xaREQS`CdS{Sw?5%Ro z4Ivm&Mg71?k}fGX_}7NO`}0}vbOup1>Mgaswdq^&-bP~kZ6Ro%!*>x_n%kJsO}y^@ E4+&eg`2YX_ literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/bridge/bridge_pool_small.png b/netaxe/media/topology/img/bridge/bridge_pool_small.png new file mode 100644 index 0000000000000000000000000000000000000000..aacbbf6740d661796eb328bdf271d578b03dcce6 GIT binary patch literal 870 zcmV-s1DX7ZP)%84o5_R;%BZwcd>f+wGP*(n3#wF`$5>+J^hd z2GGDVPt?4w(V$9zw9sQ<2K@de=i258nC6LEzCKVAAT9I|Gw}2Fd~1~jMu=zk!HWQP z@ESM{;#zyG0p&!9yaO{1fAC<&ICK9Dw%e_n^S9xA3c{Z}QA>9P%-(H!n9KkMXLt7# z;BQ!8f^iXH*7>e7jxa$^S5Xl^FT#`LDEhd~Vbco`+JVsY0)%!TG`#?!9SBV?KxhX- z^Gm?S0(i9hR|58S;oANk(J*@@A;3IOl!ljF;&&%i)_I~b+n=JL01{JR=@6q{J_hCueJn9J zySuNikAIB~#_0$5fsNQQ;ABS|Delw=00O&@FfWmdnV(JM=G4R}0|i!t3+@0OF$qPlsUNg8%>k07*qoM6N<$g2=Fu<^TWy literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/bridge/bridge_red.svg b/netaxe/media/topology/img/bridge/bridge_red.svg new file mode 100644 index 0000000..0fc50c2 --- /dev/null +++ b/netaxe/media/topology/img/bridge/bridge_red.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/netaxe/media/topology/img/bridge/bridge_red_large.png b/netaxe/media/topology/img/bridge/bridge_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..cbea19dbfd59630f6bf69c0c1ca282bebfdcb16f GIT binary patch literal 3468 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 Zp-h5UfNw4P?&$*wT(NerdT!yL{%>;*z)t`G literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/bridge/bridge_red_small.png b/netaxe/media/topology/img/bridge/bridge_red_small.png new file mode 100644 index 0000000000000000000000000000000000000000..80002a2a395806a7f5dc87bda65abf1e3d3c3c26 GIT binary patch literal 861 zcmV-j1ETziP)?8_SgZVLWIaWFyrzE4|a^R;vX@_6xaOka6Sd$XJX8e5ZZyz^a6x-AT-|; zY%G9hxBsAE?-(B4-ysdNSF(Zntmtw4NQ_wlWFlL>KB=-xjEP-;Bj8UHV;Yyhz}w%~ zw$j7zV^G`bNHhe9z5SJfy^rwwi0c|1i-rJxKH**3`3vy-Xq?N?5a2o!83H86Y=O0c z%{tbu4_u#(?>Ac0;KbWcm26hw+n&_4`4n0LOkG_8HzPbL+4XtyW}5*p)iA0hz!l}p za*8cLXtAUG>(5ZiWNAi%x30c`tGbNP5usGcaeb(j?zBVUc_tD=NrXiMdke~gkAZnZ zA4_ONf;r{WF~>T+Ek1A&TMFD9X>$#v#WnA2#Ml@>HHoVd3iCc3&4J0=afju98QzQ`0|HRuS#g^iP## z@y^gQm-CL`vAiV442zqfN~!tGn1Y)HTnVd55%b(w6lFVq8l0kA(?3;qcxU{p07~WT nQ>RpJhyLa1Y5@wm@cR5;DTDwlC>q6b00000NkvXXu0mjfR^o~M literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/cisco/test.png b/netaxe/media/topology/img/cisco/test.png new file mode 100644 index 0000000000000000000000000000000000000000..a060798b321afddaf538be2cb10d7af14c28dfda GIT binary patch literal 4968 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/default.png b/netaxe/media/topology/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..6b09ff509ee2b1d434146e70a7293de3d746dd65 GIT binary patch literal 18613 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 EHzAJe9smFU literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_mango.svg b/netaxe/media/topology/img/firewall/firewall_mango.svg new file mode 100644 index 0000000..cbf14af --- /dev/null +++ b/netaxe/media/topology/img/firewall/firewall_mango.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/firewall/firewall_mango_large.png b/netaxe/media/topology/img/firewall/firewall_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..696fb18b342f9cc27d4e0265bcd8c3ffef962f31 GIT binary patch literal 4246 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 CNWZ24 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_mango_medium.png b/netaxe/media/topology/img/firewall/firewall_mango_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3bdd124687f893cad3b41be2c4697c39839129 GIT binary patch literal 2049 zcmV+c2>$npP)aRloO))T=p z5sdc45gfsa2n-Pn&cHtZX5H?3RnWmu6c-V2w-pYDRAqwEyZkrh>nQCZvlisYV>c8TT+)NAY#5) zx^Boh{1ZSJ+#p7O06w{Gj4@t-86t*P*Nw^Ij{wB*56PG9j+`rYh!AGJ2*JGo`eFEE zyb*$10Z5FWaXGHODlfo;%RYh|0Z6Yt!k=NBYgWM2#i(J>_6-SxN8mSV{48IA-^t&m zRoe3a^3*T!e;n_c4RF_%H)zKLguxV0%QpC ztIo|7>)bP6L{&aeO#rf_yGA>GzOqC51KYA6s2T#6sPTPfh}ft!z@wWP&i9?U2p*t`FT&w7llf^P?m(j7WmuI{XZc#d_4Dt^C4iLvegvp8yh{x z_3!_X*zzQKeSkjY>e<7666lbe2l=!B%su^zADs09=lTFsY(D+6o-nd@eSrDm(ZPMU zRp;VcVu;xELpVAo0NYRh6#GNVM+f&^;qRQu11ALVF$BoiQP=q|k58xO1y1z=ruN&S zIAVJI!l3|U&cCY#nUrF_B{qKN*aP%+!lq9g*!Wlg)Arh-IAWUpVJ`r24Z7Zc`P^p1 zK-L4O`|l6$w!S{~Vhb3}aP{cEu70noq}ACn%fVq_t60z?M6xyVvEH+%Ac!2Kx?=wRU0X?TEH_#L-%*|^@2CsFB?U~nq zSiEQ6eXVl!_WjQGnK6A%4sDLznZQ<#jB%YDspO!20H0}LpN0y+Z>%Tiw$%wdq;JWg z_09vF(82jC{L-l!b% zIzUhS>ND{*ZdRc*In)ofk{lWauh`odqRF9kkXg$a_Uy7_zPL$80bNt>u}J_=yISRw}wDwoAeV%r1GZ3~|P z|JZF$Z6Y)|v<@dz^v($&LRO;us~zC#RIXErCf#Ajnb3ZEQ>Ywvs7ald!|dDvmU+8^ zXSmK8$T{**V{CeYTjBBX z`2v9SAjw6;hA3_bP7VFC6bk^-weU+?4($Ug=8H+uo64q!O&c{ualy3Ao5~45=8tVp zged0tQTDKjav>lk4A$t`g1)n1z9_wAu4;Dh9j@mFlstA+JpQkm0K~2IeQfSC4^__@ zs$L&J=Hh=={+wc)pLNzrs`UY~Xn(*bD#iUQO)7*;(0v0w@Ir%Qf9eZBrWdtS=oabp zkH~StSB@9N$=1vU> z`D~Ecy=@yeYfk_va(s%nCulh4N81@l?F#@>ZxEpyO;c9Dw5_K;iyHx?$d>aNZu1UY z@`7yQa8{VZtpFe$EMu;G8*jE;>B97F^B>%o5 f2H$q=2`}P*tqzAr@c9ne00000NkvXXu0mjfcMak9 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_mango_small.png b/netaxe/media/topology/img/firewall/firewall_mango_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3d257b1983ba14df97670fc0afaa8e808c50b797 GIT binary patch literal 1031 zcmV+i1o-=jP)tlVh5HGEATA_5~3(~E*Ayj|D2qd$Xw zc&g8i3hzKvR}l6B5LKVk{1dOj5}4T@4Lbn@{uEdM_ck|e06QQgPF7mNq54*VzW@^2 zvw09+l8iSM%r!t%KBd}?T^k#~Gd&V!8ql51gYcMUJXfMx17x8s?NWIY?0_+GvORav zc@6k}@?G0J2+yl3O{h8oDcw-}Q;_3u2B!re7PZTp&+&N9JCxf1@$*S@JY5BTS)6bz zfbJT-D(ryKp?fSl0(1Jed5}HL5C8d710=EeTd|OYo!~SrHAG1L++$KqpzaR7jEtDD zh`Ajh4{++#86u=W0~7@yPv0b^{miZ(Ar&5To1AdJVMO9!1RjDTnkgU3E;~H*cg?x#?70c9i!XFGr(Z~ zGWDqT{Y8|9l&yfo{2E&}8B*|xhFD}J@b)22LM4TFhp3JQ_rN~_zwEm=;v@nf@U_)e zH?%s8hiC(meql7EA347*9`$AMp5ZVVGR21SY;arn{H|Qn6|D+`{mWEqa5ltAJG}s? z4XDi#m|4(V1{R$m+amyhAEM15V$pvqHbZK- zkRD(=*uP98bmgf@)010PkOVD7SJHnQqR-7k<@J|=6gfjBRVsY}efG6Rs7#t*A=ZP*6{5H+gagh7Av?3AQOOeOqbW>=E7L! zUE*RW?0V>NqP%|Vh}Hy){KH{)IHg{ky(Uhs*JCgn?0El5tSIjeYf9vYc+OJNMU6FV z@nCr0sQ5?Ogvf&a_6e7VrSr0EaE1&)^bI>oiaEyu5bGE=&(FmXmW|Jr*8`;W)hD;O zJk`!SKPnseA9TNOaJGnBRT1*&cELm@$IrlISbBtHeq9@#E1e5GM0HJ2rmaVGOA|I2 zY#vODqOy=jH-w;iVM71TP`d-Aqd=z$`m(s(z^7fo(hiwi3AKcFeF5>QBia!wERpkW zRnxe=IO*`!Sr0eE%vD$d^L*5`E^aSR|Mu7C{{yk?V{XnDWbXg~002ovPDHLkV1gvz B+@}Bl literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_pool.svg b/netaxe/media/topology/img/firewall/firewall_pool.svg new file mode 100644 index 0000000..3be3ec9 --- /dev/null +++ b/netaxe/media/topology/img/firewall/firewall_pool.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/firewall/firewall_pool_large.png b/netaxe/media/topology/img/firewall/firewall_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..858e835f54c7e8d1b5dc3ca780a768b4151e34ac GIT binary patch literal 4327 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 Pxd2w?wq})olM?<1a$XJ~ literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_pool_medium.png b/netaxe/media/topology/img/firewall/firewall_pool_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..c44e90b4113c6e87fe0b5af684916c6c8ab4d0dc GIT binary patch literal 3141 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_pool_small.png b/netaxe/media/topology/img/firewall/firewall_pool_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2afe3206259ec37a2830cacab1f8be3a3591535f GIT binary patch literal 1058 zcmV+-1l{|IP)401X2sZ$H;~8869bD*u5|SDJ zlN5jv6&&dx*TJQN+=pb&=Qy!eR^r(3W*8vJ%B#&8&=?mc2{@er_b^*+Rc^audfyM*^8X(T}7yu1<*&rJ1}W#2yX*eSAXX4-*_D};L-Qi@G?N0>04k5ocmn#0IY!|jnrH! zIFt&+nVteKoX+II=<;H96XEOu*5x(zVXSSIfO5ShoIIdIlLw=twmR2R>j8G46{qF$ zF06rZ8mZO35AF4U!Z+Ww$%D~(UgrsQw}7S_Zoi95%p7*I(*Slw?egSvF84);$~C~o z`IiGK)dqJ}`-Ck6ba>ILV-1YT;j!u#c&2}o2Q#PV@{9j@fK6=PY6e;Z2@o_bbtIvA z?r~jApw3EfP8=8!hsUtr%+}PKsE%ARtK{PTDNLDuRkUa`3^CU0=F$H(-ybzZGg`; zz-Lj>4K98N*)g(t+yD&jU*8nTA^phteYq5u#rsA%8FJ+}re;v4_}aU0 z%uuo-d<@`p6qQCwd1=&8R*KjFX{3?^=n;xUD&Tty5NA4(UNHY=4CkBkfo_$*aS@@E9pNC5$5JTO$f)p zrs#=KOb<4jjZgNqz*J|q1}s#5CsJja$~vBFe3C|LkcYtq@@mSi&ujZzTJ;Sj>&gQD zg+Xz1Q4g5Iw*ia+Y+^HORh{E9%agg{RycIi9C|kUgpN`6Q&Ku@a4ksx|8BRRUINz`g=||E7vosvcX486GY!wW9IfB zTL!SJV{!zAj!jZk#;dFc*lwymg~i#fPV&92vT>$A=>ECEGL6*E)33UUkfPfKlO;80 zpDxYPBTVMkwbr@HzQ8iIH9^~LJ)&Elu*6~V;8+y311Y*;1knQ%;%A0Ve516r(WygR z7Pl9;W|O=1 + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/firewall/firewall_red_large.png b/netaxe/media/topology/img/firewall/firewall_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..31c6b5aca9f0d88d326b003b6a4420cbcc080d28 GIT binary patch literal 4343 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 D3|rH= literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_red_medium.png b/netaxe/media/topology/img/firewall/firewall_red_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7a377a1d4a2906ed9a714daa805b4a16d2350e GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/firewall/firewall_red_small.png b/netaxe/media/topology/img/firewall/firewall_red_small.png new file mode 100644 index 0000000000000000000000000000000000000000..140c5b134bc2557340baca8ca5450901cf91ee7c GIT binary patch literal 1035 zcmV+m1oZofP)bD$%C2Gc>Bx$Jirz6Il#X)WiVK zrBeNB9(51Mgac*3521{TAR7a3RtFOVty^8Xu0JPUs~uvM1%?+?=295K-2j^y5E4|1 z1~)&2Y#-S?z5}RFlM-CHzm9JgOoK;Z_xzGrHt0~xiJmAd1%7o%w9bSg=>x`fBzOdV zm1=KRdQY?-0hCHf+14nsLi9TbHzYTPZim~b`9skY)8e;=?PACmzcHM_HtOHag=5B& z6+wN1G~kGM_j5xUK*b)AXnmC_5H|Y&5ki*$rBWHf3Nq0;J)!Iq0RcVO0GRX{dL(`+ z*&TfOEYQIOwXce0hXyI+2C!0}h9vZ+rxLAWQd7}j3$y|mrT^YRSeu8WnsdOG=$TNg zP+IGd>T8B!XLkmyF~1|JGEHSY&owqkv{qFboFQjZ4qac^PbupgOV$@N_?HI7%|$nW zDclWU3}6eJ{G#fd7kO38)wja2n;r+k>sOIveK4v1*%%__JZt8N}UtgJ{oT?A7Hzw zZYeG1hdRlRw#t@DEolF_!SWc7>0*RZ+D(`&ah!enG)s3em0#O};@+UQ4JRjPyREyl z%M+G(OddQ*Q9DpdJB%PYxDmfIbmbeRosEtQVp`nZ;03eBt_5pMGjt{u3_2IEIkn4m z>=km%dJp0>?k`S8e04S@PBXI$IWUgZsC9pN`m4V_{}-ZEr~KZ>57htw002ovPDHLk FV1mBj$fy7S literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/group4.png b/netaxe/media/topology/img/group4.png new file mode 100644 index 0000000000000000000000000000000000000000..3486b04b5ba618f82566f53b79399a8c199bacbc GIT binary patch literal 31480 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 + + + + + + + + + + + diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_mango_large.png b/netaxe/media/topology/img/load_balancer/load_balancer_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1907148c72515607e35ef371f9479b13bac3bc GIT binary patch literal 5608 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_mango_small.png b/netaxe/media/topology/img/load_balancer/load_balancer_mango_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b747b49262b46a934c60dbcb726f7817466445bc GIT binary patch literal 1235 zcmV;^1T6cBP)sFN0SQ1R4~v1Q^7(7*@r8|!We%=GI+@UoSYch(v_~Rr2D0-x3@Q(A`E=M2gbk% z_)=424QzlFkddUBv%UdW))^26H^4;weY4c+E3g0-Btn}AIQguxh?0pIO3coZ=( zwo0bwu!=D>9qq7JYFrX=a2 zZAGs&sW6xWDd#hIkiMj`W=0z~99>W{HgV-5ICmqarO2!j#B7(7THGc{qgsFwg~ zXv2Ald=u<|F-f|q`lwn0aaI^GK~SbA95SH4P4AUlJjb}#D0jf9cs%}5^5HY?2Y)ylBBl$6w6Bq|P0hl6 z2@u2PhocT?Jd&i5lC&uxHbs(d34;ju$1(k{rU6yl1S7}9L1qDDwx5szFADEmA~JvE z43OD(Z_?&#(4=)+c;^zg%69?mOTe@T;##c+cri*}3h!KFrXM^-_=f)MdLf>qGvF(- zCTDx^+~d2}5VZtMdLj&PPZ($>kW< zr*{9#L>TxU612Ef_#UE%Un<5P60W*b+<5#RHh)*#UcLQ2u^AkEK@6LX#Wr(@rf5}P zu*rZ2lC%$FMk`HL^oI6alqXX1)+@a1xO`RAsaMG+!6&9dFW8xzI zuR|kdm}?Ad-&NHx$S4oAyu7=?wL32N3`dl!#A}jttiBl|;k1u@~GCFNo8tm^zw&mgIHWr$Rr3Gh?ZTM-5~$}rls?0KxCP^Kn$ zjQBAuRi}LRohsVrU%sqzUx8`J+!x*zk*WVvqwFtocV640e6AmI28b9gTQp)4H)kLN zFyn7~$a8i~TFb(_W3)1(Y)3xuHh#^et?2MIVW9KzeBcqdGnU1%FqbZ$Ae-1Dxs_L4 zN5uV3)$!FH;M30fjLaWp86tC<#|euzx^80%{994)jwGEI>iASANE~{cn)@C!Vv=-f z7T8LWiB(7RU4bTHcAX-lC8!D0m#WUDMIDXO6q$=pk}CHH$cOEZ#q&jc>{O~wl?{Ux z!;c%}N>mBzJVHLhc9=-!cmQE5yiV*U72#d2!O>)mb00 x*Za6S`+Q)4b;Rf8=`*}OzeFs=6+K*^{~ri@!mq+=&h7vJ002ovPDHLkV1k + + + + + + + + + + + diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_pool_large.png b/netaxe/media/topology/img/load_balancer/load_balancer_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..9c76f2c5f66cff921a48cfd0734a246e81653cb8 GIT binary patch literal 5690 zcmX9?c|4Te`##SMW6!>1OBhm?v1V&bNcIroB_<(j$WFu9wOESm3=$%1S(0U>LcEkE zV<&6&?7Q#0zuzCv=bYzx?sLv{?)(0n>pJ%nBg2~vwA{1+00tdxO%nhhau)*B2y$cn zsMwL*(0FQFdILbm^4|mXjfWfqz`mlRdEGQ1Yju3xYqY)rvGL&A(ReevMG@>%gn)~{ zMDHD0^UJZd;SQJUA5p$=+{UfK&cV$*S82^lrZm}S9}}-+zCbbyKrjKqhv&O}ZA#e+AId_R`Zj-vhC3 zCN7k>AKyWpKb5h2)KD2ggW$&7#J!5o$OyX+7SmLxUp1m{80ahKY;Z7Hs4p_XF;pUN znj<!L08aD87F~P!c(>jd}sqd5up7#4+mL@Zcc;Y&qy?jFWL64V&{wY z)*!c8{`1eTCxZej4~S#0vxl4LLp>hdBn9c~UW>2{i%uuF;lPIYo?*pKEro#Z$xYPE zZ53DGk8|f)bfCd-%#iTugpniAui(k4a`EDJ2?dcOgmwig?5e!_CTxNNSjIgF+vT~( zl)VM($B>?xJqa?VOf2VNa15bcN8s1={O|2TSd%3syvGz*$Wjjy@9}8eL1OeWusRT9 zw%lW}w}d4gqK|gPD37G!bu~9dE`0(5Nda<-!3lj{4E>V1cA{U*%pnZ7O>@K!PPZ3{ zU;ik7&XE;}yphCmAH|yN8mtY9+yA6i6x)IEj%fs1mVa~MR$=yiDFvanZWpf2O&I*s z2a$InllquRyP8%2cg)Q@eDh=jhIylCF7S~B$g1u92-)8-TZ!b=l>}tV!#{}m2}4~I z2(zTueLQgI>f0I`VOBtzx(R<_+JgS!% z)7Vv--?jeD!e4^~>J41jzUwN`HI6id>Zb6$Hyp1@@>fvWf&ku?yW) z?efoXX?oanAs|5IZ{oxz+b(kTZ_6T zolvy&Vl!AmO%gv8W<{y!rox_znvB~FG^s#>_+7p4=P+bA=67{AvwK=|b7(7GQ#4V6 z+C$MfO2^*AxP+um|0C+!1-@4cgGTmkP{=;_nOTk`pDI<{S17T6ma_&(NY!&p zn8DA%rrxxSFjyCL52HHZ*%h7)g zRICl=&lO7Q{(YR-IHX$&1mZMqjA|OWGTzna8&BGeGUP1Jef_jn7BLzRPYXNwQnfn8 z6*i1@AEP@XZuGOtJ*2R&vz19Pk*Yw()zD@2d{9X% zi5w((50idNW!@J{GanCkF9EWsts-K{CCOXM>xySznkhEwG{zs@3*?RRep0RnWG2oC zg%@-uR?P34Sy8zusb{)_`;A!NAnm1#$n%kBUusV&2`g+u8{dv~d^%sN@)Jt@Da;ezh+1`kp zjMngAiebjbWSF%suok&|ttS0eLv)7z#PB~o3UtkZlu92XHRQ*UfUQR-?}rqoJ7pLa22Pitr^&8u7+Qn;(ODIDslxZdYDEGFjiNW>|q9NGJ;S_0DN5sgyM z9O3=IU3wm0!4ZQd^+y6 zJrz?Ld_DTPoMia|M$i&$KXwWRWJd=>-xzz2>}n{nE7IK_(C2vn7FM||g)8HX_H2#9 zRvTyf_aeY~x}Hmf=G>!pK544;XS~)!|1K0?fj0gS5*VxPJd8}XA7mP#d*-Jb0MUG+ zaqN~ZpIaGv?Kt_(`@nsBkd~Ywbhf#T)YQSGoY~Fy_P&{&d)>1GBag2LetTpvTFxO3 zkK>ra6SBsqHF=ofn9y;sf2Q*`6_pwJ(0W4rd<$4U!gm6S%%>ihCUZw@vyH5etq(%=C; zF(+_Mhg%pXZ{_;6B-HIXf+HeTccE0^SeEb{dgcE^4?VIgI#kMjU=E z2Ru(Z=)XAmRRSN=q0`y3K6MGh8A|30eii2J372;vAk9Gcgnr6uW!wJu63p>JV98#3 zx*E=ed!JW@FTMUAJF(~Gjnl^+{yPs=d}i@b?nIZ%yTU5g>kkV))W&DW4@iT7%&&$( zULopFRURuB=&>sQrrT~vAun`amh{jY0Vf7F25#2HX5*8kLDp_Hcj*G@Nv>Z3+XkBo z-&?XIaA#J5X8*mvLQ(KEDa_D2 z4`m84^mIQ?>J;Pt<8X@ph}hUG82CPCV8Vd)ATrZ~c6Xk}2Z*)uu~#B@-@ElHg+o*I z1`&In&NXYrWT8NZ0HG$OQhSz3FH?52W6@Y3z>Ok@4!Te7RMG({^4>I!8?C`UvkJQ= z+gC<&C>F5-`}eT%$)!*pvf=bdB`rn{%Q;0YmY>)6U+_tkih56-igTpwZ?X$=rwv*( z#lxo#|7f;VBPQlym24O}aW#A$Ao`ILBoOgmrY@y|$|tGk1fOEz+F%O7MKj5_0C7qthBjB52V_wE|Dg-M01AxpqoT|^qva!up^7|-Z$N&?5i;Qd0*v2P zj=coC`~SJ^vlC+r!!M_hG?P=?R72cuABcu z+eiocZq}~~%4-g!uU6@V7MW9q&}VT8F8%tcin|OJJ^u*gQ*T$<@-u+as-Q2Z7|M0< zm=fi_F_EC{UAlwJxZ7(wk(nXUJvlPSJO7Dq7AFySm^~SCdK|dTmt-OZ#;Ej7U2;G- zSuHwyztnlV0Gb1Ij8&vSp*v@AdU6m27MhBPk*leRJc#F(vQrV;Vb@1-^))qF#|>_i z)UxP+KR7*?R-F9UCT{TaP^ZY79N7N+@?!>7vZ$QjiX@XZI41OZD<68xn|s@eCLIMs zQ+-29th+JZG=MCbPQyaZ!u)_~Eb^xy0;*_zSK=`wC$=M@KVCnyx9{?<-0g`+<5<-3^Nya=lO6<~pOH35(M)vHUEZAXvs8V9#`~00tpeP|ZCurj zn?u5^_6@WHca@d*i@rMsZ#2Jx)qKI$Y}aRUc$OC@|JEH zb78P&6Ze(5#CT@>`EL2~jtYO&j_tCmZtmWcY-(E`m%6-rIvoG5Um$(=yyMDOgE@laUq6F{O#v0X zwYX+EYDsrpBLy=cFvdA9UmDb+TIP<}I(EpsSMY(!t}H6*-|H`XTEx$t2o8A&X{vnx zRf{X!{8GOB?TF%NdX=tg#-y%NspB%xW-ejec|F3T_waIR{vqev%K-=_NYrR^}QA)8~8Je~fu31<5lhvBT3fgO*p^L%JLu&+&JjplwO~ZhT;tG08hM_uu}_ z+OG#UQ`&u-XqJn=2D_i~+fdyertf)F{D@DsT2W--L^^A;SdRu9x|#L*e)dSp@384f zAt{wedSF7kxOI#-SfLPhWL1GgeXcEvaVC^U6j|#5OmkdV-m~|$>#IRFxJ6eJiJr4~ zgTKvl=#;$DaB22(56^R;FY(n3F}JIM1N*TmW8f#jO|Zg1BTvZ8A74<~xgSw8XD>E6 z82Mt(%Ro23=05!_f2UW_MzxNRcM=Oo^bo^X^4?a=@urfc9~>e(3up50)ae&-@r2v) z3p>8eB186D*M>tvT%L+}xUd1?J|B7HK+%XZK?eWXq32VVj9qh4w#|2Z+IwM~o!w^p$$O}+Fo zd=DWdj@F%R1xNNQENyQWzK2@Ao6c*EAn;ex%m+nYFW7lypqC@qUJ;nfy*iHsbA6Sm zPcM9$C<`)KVvzZi3XRoTUd=OL$J#Pp8Oag~cWrlWM0YdSIvhMRu)<5dI@r4?;a0eD zD7dF-n0^7}YVv`b_2*>(Dtx=jW9n*m?%X-AmC}FCcu&nT9kwq6lM-h|V=x$YuG4>&GYp@I{QU61)Iay%c`axtt;i(H%(!CEA ztRj`yNOaxu?vJzHZ6-hec#XuWU%AUdD%jqOJzhFd0YbK+R2~rMsO523ha`B+?0JuP zomGwfP(%GC{1TJSi(2|tR%u~(%AT&I``NAsjw3r=0SGT=8;v^2efsf!XnpwGq&ETM zM-D&k9_<&QBJ4~W3+20ATIfcvntt

sWu=vY?92H;e@+brO2LT(xz8kpQ`se0A>J z5K0RZr41Z2Qb}9>i5l9rW}v1T@`+JxZaL|jIWU-0U2lWLV0E$g1N&Fc52QkDOXHAm2 z;OLc=a(0Dba+PK5fmpi_3&0OKw<(niX%D=iB52^2DR`(nY1^rovf19XoF(_@0(Sq! zcJmocv^#UMt~bcKe1L0b`ztUpuZsE;QI%r%YM07>yU2^HeNk znu`DoS~BSuvhuZ9sTy(By0BEr%mtyxX$1KBk~Tc*se{$LGn*GqcA@J2pG;V&P+uXq|W>$YVn`TlS!Bbp7qJ4cbsVkD%Ikf7rr-BREpZh!uI%cJyTF| zxF#~X1YKZ8wrovCkj%8vD|Jh>4aN`Xo9F>Rk>y2q0Q68@-TfW2bLX1mwgOl&AlHS4 z9bUbG9#z4O$f|;$T=m&O13)Yo5K6lY>A~&qGu)n?{9>r>6hRGwWm2){QV@&veBC{b zavKtOs6SbO^y>k@(B$rl$D8@I0%wfgRtK$S)`os1zLxhY@|p zl8xGHQRhRMRW3?1kk_fW8!a1Hh0C4vL#<-An*CNkVnJ~+MRvBc`1u-j~Iw3WckVop}-wo z=`oPG=X^b$#06k4Zs_bvAtD@i(@(1so_Q6JZvb!>dNzF&R(`rsLcegRdwW_M_~@6= z=-LqSMMU^+0XhA`2Y;J2=)nsekI$#R&ra`f`hlFkDbv0K1N6Lbj9o#b5pE8BH;^G| zngFS8(GWNgczSIku4#!&))$+Im52?vM>?*pI|q%xKkwv&2n{Y`2PU$FLBxc literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_pool_medium.png b/netaxe/media/topology/img/load_balancer/load_balancer_pool_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..79e632cda8f231c050cc74b58c8852bc9900d9a0 GIT binary patch literal 4133 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_pool_small.png b/netaxe/media/topology/img/load_balancer/load_balancer_pool_small.png new file mode 100644 index 0000000000000000000000000000000000000000..389e6a320c478a7e488aba1adf95f158eeb42bbd GIT binary patch literal 1257 zcmV=P) zvoQh2RY}H&86YAa0=E_PrwC?1_)$ibW`KzLi27$d4-;Tmc4?GiKoILbFb1y6G+G1J zz##I~v?!rhlpu)p79E(Lo7t#J+8V2h-0kWgE zdGHoDhfasoJwVR+ml`{D3Vch`6ZRO;;HLM=Ry=#uuTidnZt{5iBjv*p^$&h;HbhLP zHMV_?8QZ`u+>rn=Y~E_>fW>3vt576u0Ca#+>k#;-=Jvn122^qr3~O#2%q)PJ z?I+BDr-^rUB6NRj7$CD>yGiS;LAR~j#Jf6iE4~Y0R{{nNG;Y;ufM=)pIq|M;4DEv_ z4R>hHt{(zKz8V5wFl%z?zH0#At%hhNpx;o#0QW(xEfY3QPbs@^upfOm4Fdq4WXA_U zo}U`-!wv(g^4_)yUjaPX{Vx(htd)leT3jlWhtb0?6+I6VuDVooJbn+GzbtOA{{Hu^ z%HZHL#;{pdSmy?!DORd4RLOvc$X87mGgfJ;L~ke@7|Fn|rUnlnZT+gEt~7^88El*z zVrgme9UG64uR@^-$@c@SF#(Uc)8>blLRAvrnz4QA@#-kmA0qA>q&cZ8oa{x7%ZGzk%oE%AW2vd;In7D}lD^ZCX=IQ|}tEvXE)}#koo~;|)y5k(ra7emJyoh|& zlW%&MaN1nLX=M$gKOIpc70-_P_8DJ)p!wEQ19Wq+}C z=M_E5$M#{v01?AkflA!Q-5JoZ5!F37IXiA!v&6fswzN~WW;^gAe$81`(c$YL);1qc z0gu3)vn;a0T(-QA*~A{%T6qU)MBML$M#&zaC}w?z?vJz#kuk@|36nOutz!WEI6!w7 z`D&b?Q5;T?*z-6Q@I6>eB3}*Mf~rzvCejgmSKyd1yG@a?5_AmHXF{_qKx2`bB6IOc zQmOs``LOV@c*dAyok|B&WrJAHX@A^cqeP`4&m*L0x5H#XPVDoTWa%#Eylq>)aO$R) zM6ORzw6iYll7s~&Q#{vmeDN113f~zjs3U>_Dtnlir!r1FgT%8>y4Y0EKygYq|*XLvo^Z*XRESl6MF$ TA!fsc00000NkvXXu0mjf{}V)R literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_red.svg b/netaxe/media/topology/img/load_balancer/load_balancer_red.svg new file mode 100644 index 0000000..983840f --- /dev/null +++ b/netaxe/media/topology/img/load_balancer/load_balancer_red.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/load_balancer/load_balancer_red_large.png b/netaxe/media/topology/img/load_balancer/load_balancer_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..93176d692322efb59100e8929a7f103a67dbd099 GIT binary patch literal 5681 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 IM6N<$g1GWG$^ZZW literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/logo/h3c.png b/netaxe/media/topology/img/logo/h3c.png new file mode 100644 index 0000000000000000000000000000000000000000..ce01685a405b4c01c94abd6943bc46f6f40cb878 GIT binary patch literal 12836 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/logo/huawei.png b/netaxe/media/topology/img/logo/huawei.png new file mode 100644 index 0000000000000000000000000000000000000000..735c9ceb7aa91c8df0479c4366d3849fa12c1b79 GIT binary patch literal 12719 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

n^d@ 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/routers/router_mango.svg b/netaxe/media/topology/img/routers/router_mango.svg new file mode 100644 index 0000000..d97d743 --- /dev/null +++ b/netaxe/media/topology/img/routers/router_mango.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/netaxe/media/topology/img/routers/router_mango_large.png b/netaxe/media/topology/img/routers/router_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..1d88f7de4ee15b5e3f7745f9e691c9e275a20748 GIT binary patch literal 5213 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 Eg5 + + + + + diff --git a/netaxe/media/topology/img/routers/router_pool_large.png b/netaxe/media/topology/img/routers/router_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b8b24b3fc5fb25ce51ec8f1d8422373fe3bc88 GIT binary patch literal 5271 zcmX9?c|4Tg_rK4qm@zZicSeQ!5Rxoertm3AOe&ORDk)@NvkrwaC9P5leU$7=A^V8Q zmZj|bkY$?EAj??dH~qeUJg@t_p6A|k-uK*d&-;ZN0Dz$RG1F53K)hE7 z@S%8vgWp?M-oWp3%-$aWjL_c)`Z^l934n;Xx#{84A*pktqrQ{PQYdDBK~0k~ENrKS zq+LAXNsZH)l-m@&9d}Y8;d+wjY8#^HnG!q|a-k?b_5YGqbZ700)%J0YjoI7~s;a4P z_3Nm6saNEmb!39gv)n_#WKHA#wox-2`~n7Lo0^4SY-+oF5rEy>qpC++q*adVV5#%3 zE2NHyFI&q6gO}lD-*0LMSYMkec1(P5cUTrE-R5R=AgGls5c~wXbm>G*a+V4Y41glP_@JH zuIN9(_Qkf=vhZ}+_Zh3{`r?Rzm9B;xk~f(8C_2)uKrVg!jBd7g+QqLL=Mx{~&z2!* zkk66qdA(Xr98vf8gs)%%)Vf_!-HR2VycnrKPBmB z6Yr0)%Kicbm8J&5D()ixs*3hvEzB*WD1gBqEusLG|4*LBJICmus?C*1qjvXlqQLlX}M$*!T!eU-ZOKf=E5`4jieB#nnH&79+MOrn{9SG{rPg+Meq%RO0 z7X=It58QUVt*?nlve6MxjV$5ppt4)Pe`LWG+Iz9|U>`x_3N0}2m{{}H>=1&fYK&B5 zzeA8$fJ=3!|At7+#di8UTMI7Y2%60d1gb;tee}f}swZ*1jyaN%)DzX4h^7sZmk>3r z*b?`zFmNl_&uTGxl@yVDNn3z?0`{ij*$rBl%0Ak(N($GjQM-N>*lmhrU(pM?Ar=6N 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/routers/router_pool_medium.png b/netaxe/media/topology/img/routers/router_pool_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..593c81f2f04cbbddbc8db4f057695820e24cc475 GIT binary patch literal 3809 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/routers/router_red.svg b/netaxe/media/topology/img/routers/router_red.svg new file mode 100644 index 0000000..9e167c4 --- /dev/null +++ b/netaxe/media/topology/img/routers/router_red.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/netaxe/media/topology/img/routers/router_red_large.png b/netaxe/media/topology/img/routers/router_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdc4d0386963754f4ac63e27e20bf72106b30ca GIT binary patch literal 5271 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/routers/router_red_medium.png b/netaxe/media/topology/img/routers/router_red_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2ee92bbd033e53a2f16e1b0b0a1eede1c69dec GIT binary patch literal 3787 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 B)sFxG literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/routers/router_red_small.png b/netaxe/media/topology/img/routers/router_red_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdc4f0e37aad1b8e48e1a9445f6c1d40a0e3b06 GIT binary patch literal 1182 zcmV;P1Y!G$P)MD0?}IHc$*g_p8`LWSHL=$qehb{nXR9#(1+W^Dgf9b=6zGWk7N@6cfYO*XI*h)O zc_&>1Iwe3Xsygui@;pUH60Z8ZL#quCKmVw(nFHb*>rT*9xgTwD!hr;c&g2RkXo`JW zTQdc9NyyvmL7NKP6aOD*5~$+`Td$%G3WZF|^bfFw2=vHiM1{6ou_hXxZ`)#Q!1 z5gK=BdVz()q5zk&@C5j`XWWB`=^F3~WJX|tlQ5vh0NJ2cN_z$T^c>sApcwdC8Z)UR zvaSL%<%LfP^Xegio#j7vUjLrBsXRg@0oO;|%&~9{X9nyT5UYCok?NX#{iHiQm#)eybZnwPI=T;iv~fh)?N` z6`CcoDGJ5X1h?Usn0pWpu1@$W|8kdgZ!%#Pb*HdN@Ym@e1nPVrc1$3?fqY4bUw!>q z8e@rDVS11`ed~(8SSL8+@>x+N+I@JZjLh1i@&Zps-N|wA1b^IMaC6aLfEAn>;20o& zd)Yhu@4~W*RqByoew@7=1$p(bV}N)ApL}}^Hn@7;oyXWa85=u7t?*p;d~K)0v4ahO zS6Q?ujd`WJFj7x|w9?{5{mWi5B%9Q*1ry2W`iiB^>@Rk;8l3JI^&bv;gcSP%4_aiZ z9=^u2R_eP2(q;$gxk;*Rqzu$hg$tY=I1q1T;+I{W + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/servers/server_pool.svg b/netaxe/media/topology/img/servers/server_pool.svg new file mode 100644 index 0000000..5b99803 --- /dev/null +++ b/netaxe/media/topology/img/servers/server_pool.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/servers/server_rack_mango.svg b/netaxe/media/topology/img/servers/server_rack_mango.svg new file mode 100644 index 0000000..499dfc5 --- /dev/null +++ b/netaxe/media/topology/img/servers/server_rack_mango.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/servers/server_rack_mango_large.png b/netaxe/media/topology/img/servers/server_rack_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..12379723d115ce8bcdf0a90f97841ca447530b7c GIT binary patch literal 6248 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 N^p_c?6pelGe*niZrq}=g literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_rack_mango_medium.png b/netaxe/media/topology/img/servers/server_rack_mango_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..43014613fb87ba547702422a08fa0806ac492c4f GIT binary patch literal 4479 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/servers/server_rack_pool_large.png b/netaxe/media/topology/img/servers/server_rack_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..f147e121ff44e942be7d7427f95d47ee22924dc8 GIT binary patch literal 6323 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 DTq#@b literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_rack_pool_medium.png b/netaxe/media/topology/img/servers/server_rack_pool_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2c17c233e4f4e178fb4b1610192542ba17042f GIT binary patch literal 4546 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_rack_pool_small.png b/netaxe/media/topology/img/servers/server_rack_pool_small.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf379f0b953ceeed371c751616d30d4be1a5763 GIT binary patch literal 1365 zcmV-b1*-aqP)BKe9~{LA0wj@1fq%*G1aQvK)NwvLV5GknU`E~v z&QzO`IgNm4EkBkMLMJ0$Nl+kiKm35>PyDxk$Dw3ib1m}E|RK$}1qX3lU~RvXX(Ih(-Fc=3!Zm3H%uz*7dCP4| zhP0npuS+W+1s>J?9r+BZO<3>TkQJVuV>TzoRQs&lDIm$rPqu4+ZNMAun}(ql{$+*F zJ%Mwhh!y_2g^@V3PvlR6HsV>A)Bm!?_(d2a9qc#Jcfb1wTr zh!3CZFM**fpo62z{OL6E>9@S$ekiYkeZCbAiBXS7IYOJl${07eTtu_NcdE@o?&Mm_ zkHrdi*e;x&f)&>6ZxJgz3FK)VLZr?P2uX)2&If2VrfhdqhOkaQfLoyNx3m22i~NV@ z{Q~)I-QrAbMo6JAKivj>6r#+A<;^at%B!FWE8Jr{aGLEi35|gLeMOGrODT;#HEgc} zOJ2#BQ5pk~&r6CvrCZ@NZwuP$qOKEc#0u+Nz_M{-FG*xf*&m69hjQ!7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/servers/server_rack_red_large.png b/netaxe/media/topology/img/servers/server_rack_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..734f114ca0a38d24569f91dac94d541a968d1a50 GIT binary patch literal 6352 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 VogE_uPs%R}U}RvbUxBfY{C|GHPsRWM literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_rack_red_medium.png b/netaxe/media/topology/img/servers/server_rack_red_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..05892cb5b6f29d67721002391cf980cefef0dde4 GIT binary patch literal 4543 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_rack_red_small.png b/netaxe/media/topology/img/servers/server_rack_red_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4ca938ab1986ffe81323b94de6a45099419429 GIT binary patch literal 1361 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/servers/server_red.svg b/netaxe/media/topology/img/servers/server_red.svg new file mode 100644 index 0000000..aed1dcd --- /dev/null +++ b/netaxe/media/topology/img/servers/server_red.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/netaxe/media/topology/img/spine.png b/netaxe/media/topology/img/spine.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba053ab81cc58b9280fe9e484c5a6091b9190c7 GIT binary patch literal 971 zcmV;+12p`JP)tbCD9gqrwD+sB; zaM4Nc1y>Nc1Kfe>z)}O`uv$GqAjZ41l7M^{{}cOmex9A3nbmeSn+=D^qi_TafdJ?p ze6XElKng7VIGG=MsIyOiJPL=v47hSMxw=^c6F*LtyMNdcAdkWx%J7H!=2j~Ulo0Rw z7o`A&@hNcA$kgiN6$rElUgZxn&fj=YHqP`9oy}&W*Zi;M=F|wcew-||2h9HY=y@^& z=w$bIBjBmoxirSuL+$gI%Fsh4IhRV{ae5h^Bwg?0XBuY!+@exjalW`1R1!Zanf&fTAG7kCPQDUWs}_>jeOwT#9fC0)Rsinur14fR(}L$_mbpla*9V=w$bI zhdUzjJo<4ml^QIM!a0_ud))$Lz=+C!^Ao%m?hlmZ`x}-XQ1=q(VqSHQDV9#9cVWFH zN(R9UctN$Fq#5hJo^<0zN`MU2WeI?}(3l!$#)FIi+IYP_djeyYxHKN@gW#6&#a=Dl zTNo5yowV$1f?yrS1N?R{W{If)yThn? z9M$^AV7dgRD3=GyC1BcHoX}ub%4Qc>_;E7QKS<=|O<8XxozMro0FS`4 z)PS~$&^{5wCbx&wkCUk%Cqsn9mdFIRM8K@pKbF4!M#|$P%i(8~@d0l4cG1{VcRxT1 zF%g;;AjAA%cDd6anPVVAljj1vRirIb3P7SsDxsy8Kpn<|dUaRy^<4=8)>MoySYZ|bd#H1T+8QJh0;D^} zW0T$GQ8)v>ThHo9Bx1lC=vPH3f|SVtNgw!OIiF7<;Q?1bnnz)E8T2`kmoKHZ!5fqa zJt&W}#zJE|MKTXKNfD$Ip?xB>8W*Xs7GdIGY;jywgEu%n)Re-b!DFcwka?)0;!;UH z;IFG>7sOKE8G7Ss+K-cKy$zm3#1>`(MIKPxsC0d>*(MhH7HKsRnxN|XbLW+c t$Cm;Wg-pPCd%}X9-o^jR)0cjI{tw7ZdHQDjL|Om<002ovPDHLkV1m_PyM6!w literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/switches/switch_mango.svg b/netaxe/media/topology/img/switches/switch_mango.svg new file mode 100644 index 0000000..4149f9c --- /dev/null +++ b/netaxe/media/topology/img/switches/switch_mango.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/netaxe/media/topology/img/switches/switch_mango_large.png b/netaxe/media/topology/img/switches/switch_mango_large.png new file mode 100644 index 0000000000000000000000000000000000000000..28775cd0775614cf1971cbaf2dd7cf46beb1f70a GIT binary patch literal 3714 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 Da6aB# literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/switches/switch_mango_small.png b/netaxe/media/topology/img/switches/switch_mango_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba053ab81cc58b9280fe9e484c5a6091b9190c7 GIT binary patch literal 971 zcmV;+12p`JP)tbCD9gqrwD+sB; zaM4Nc1y>Nc1Kfe>z)}O`uv$GqAjZ41l7M^{{}cOmex9A3nbmeSn+=D^qi_TafdJ?p ze6XElKng7VIGG=MsIyOiJPL=v47hSMxw=^c6F*LtyMNdcAdkWx%J7H!=2j~Ulo0Rw z7o`A&@hNcA$kgiN6$rElUgZxn&fj=YHqP`9oy}&W*Zi;M=F|wcew-||2h9HY=y@^& z=w$bIBjBmoxirSuL+$gI%Fsh4IhRV{ae5h^Bwg?0XBuY!+@exjalW`1R1!Zanf&fTAG7kCPQDUWs}_>jeOwT#9fC0)Rsinur14fR(}L$_mbpla*9V=w$bI zhdUzjJo<4ml^QIM!a0_ud))$Lz=+C!^Ao%m?hlmZ`x}-XQ1=q(VqSHQDV9#9cVWFH zN(R9UctN$Fq#5hJo^<0zN`MU2WeI?}(3l!$#)FIi+IYP_djeyYxHKN@gW#6&#a=Dl zTNo5yowV$1f?yrS1N?R{W{If)yThn? z9M$^AV7dgRD3=GyC1BcHoX}ub%4Qc>_;E7QKS<=|O<8XxozMro0FS`4 z)PS~$&^{5wCbx&wkCUk%Cqsn9mdFIRM8K@pKbF4!M#|$P%i(8~@d0l4cG1{VcRxT1 zF%g;;AjAA%cDd6anPVVAljj1vRirIb3P7SsDxsy8Kpn<|dUaRy^<4=8)>MoySYZ|bd#H1T+8QJh0;D^} zW0T$GQ8)v>ThHo9Bx1lC=vPH3f|SVtNgw!OIiF7<;Q?1bnnz)E8T2`kmoKHZ!5fqa zJt&W}#zJE|MKTXKNfD$Ip?xB>8W*Xs7GdIGY;jywgEu%n)Re-b!DFcwka?)0;!;UH z;IFG>7sOKE8G7Ss+K-cKy$zm3#1>`(MIKPxsC0d>*(MhH7HKsRnxN|XbLW+c t$Cm;Wg-pPCd%}X9-o^jR)0cjI{tw7ZdHQDjL|Om<002ovPDHLkV1m_PyM6!w literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/switches/switch_pool.svg b/netaxe/media/topology/img/switches/switch_pool.svg new file mode 100644 index 0000000..cabf110 --- /dev/null +++ b/netaxe/media/topology/img/switches/switch_pool.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/netaxe/media/topology/img/switches/switch_pool_large.png b/netaxe/media/topology/img/switches/switch_pool_large.png new file mode 100644 index 0000000000000000000000000000000000000000..69ef94060114437b38b45e0f77eb92520b85792e GIT binary patch literal 3705 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 Pn!wiD-m2sz;r{;tGoSCI literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/switches/switch_pool_small.png b/netaxe/media/topology/img/switches/switch_pool_small.png new file mode 100644 index 0000000000000000000000000000000000000000..20a9f22ffc6a4cc8b1f6802e0e9bf52e56b49eed GIT binary patch literal 964 zcmV;#13UbQP)1&ThA}YyMYrb83Y9RK-i{0kgk8dYQ}sIuEa_ z5%ApXTpD8>VfOiJWf)x0S8Z6P-9M96dZUMHyh|+)aANa`KA1KQAcRW3y?j_L0z3Lp3FP&2F!h1`U41!x= zg=s%YGq!y_>Bfze09#C#MFDf6F)hK22N?mZ@pgUo1jZ}~X*~D`!9C;iy;{1rFv!0K zY1#P%!8(iwcnvUSfvW&jTmE2#GC`3GRu2TdjX8efy1+$4QpMFBsz$VfS{?*i&~uKngJtnigP- z`@!t8(jb}RAVQPp0@W(gmnjYcG}#sIQVMDU+`4?I=_LSe1r(Tfeagj{#v!9@!_k<_ zjxm-n9>OhwH%udA@Y#b7lv`w8#zPnn*n0~r(V67fKP8O^c@L->KN23_jw@n3$Ogef z#!ELkHke*SAE6RjY6;X~JeXH^MPJ{Q5MV>e_?$Iv0kDTTSE#K)A|ZgT7>`eOm*{K; zeD|K!iAcnN4bU%(kOwK31Cl=Q!*f3WgoFp&06NiGc^ULMlb0{0w!u4$2t6o{v&KSW z2SqXuI7<R$F@ + + + + + diff --git a/netaxe/media/topology/img/switches/switch_red_large.png b/netaxe/media/topology/img/switches/switch_red_large.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c10603a82cf7dd5d585dc547b6143debd8731d GIT binary patch literal 3718 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 Gc>aI*z@gay literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/switches/switch_red_medium.png b/netaxe/media/topology/img/switches/switch_red_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..b2943701806a85e7a29315a653c6d999b44e8873 GIT binary patch literal 2700 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 literal 0 HcmV?d00001 diff --git a/netaxe/media/topology/img/tor/Ansible-Networking-Switches-03.png b/netaxe/media/topology/img/tor/Ansible-Networking-Switches-03.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfaa1caefe9ee3350f8c33cb1b1635b56a64232 GIT binary patch literal 66425 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 Date: Mon, 27 Feb 2023 16:58:45 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=BB=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=90=8E=E7=AB=AF=E4=BE=9D=E8=B5=96=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/netaxe/requirements.txt b/netaxe/requirements.txt index 396d168..940745a 100644 --- a/netaxe/requirements.txt +++ b/netaxe/requirements.txt @@ -117,6 +117,5 @@ django-restql==0.15.2 user-agents==2.2.0 drf-yasg==1.21.4 xlrd==1.2.0 -pandas==1.5.2 django-restql==0.15.2 django-simple-history==3.2.0 -- Gitee From 31e7b08af77ed5a39e3db9e518d294e7b761db8f Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 17:23:12 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E4=B8=BB=E6=9C=8D=E5=8A=A1=E9=95=9C=E5=83=8F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/server/docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/server/docker-compose.yml b/docker/server/docker-compose.yml index 0584bfe..56c982c 100644 --- a/docker/server/docker-compose.yml +++ b/docker/server/docker-compose.yml @@ -8,7 +8,7 @@ networks: services: netaxe-server: - image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.7 + image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.8 container_name: netaxe-server ports: - "8001:8001" @@ -50,7 +50,7 @@ services: - netops-axe celery-default: - image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.7 + image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.8 container_name: celery-default command: sh start.sh default depends_on: @@ -61,7 +61,7 @@ services: networks: - netops-axe celery-netaxe_ipam: - image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.7 + image: registry.cn-hangzhou.aliyuncs.com/netaxe/netaxe-backend:1.0.8 container_name: celery-netaxe_ipam command: sh start.sh netaxe_ipam depends_on: -- Gitee From 16d5c92b90d83f67d41b884e10dd24f3db500a34 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 19:19:16 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E6=8B=93=E6=89=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=B0=83=E8=AF=951?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/topology/apps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netaxe/apps/topology/apps.py b/netaxe/apps/topology/apps.py index 680cc3a..762bfcb 100644 --- a/netaxe/apps/topology/apps.py +++ b/netaxe/apps/topology/apps.py @@ -3,4 +3,4 @@ from django.apps import AppConfig class TopologyConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'topology' + name = 'apps.topology' -- Gitee From e1a3296583b62a53035524f5310a2a2f6d8af897 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 19:33:21 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/views/login/LoginComponent.vue | 710 +++++++++++++------------ 1 file changed, 356 insertions(+), 354 deletions(-) diff --git a/web/src/views/login/LoginComponent.vue b/web/src/views/login/LoginComponent.vue index 927cfbf..8c993df 100644 --- a/web/src/views/login/LoginComponent.vue +++ b/web/src/views/login/LoginComponent.vue @@ -1,397 +1,399 @@ -- Gitee From 8fd41ab3f630372f4e6213f18ce415a3178f1246 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 20:17:29 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E6=8B=93=E6=89=91=E5=9B=BE=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/api/url.ts | 19 +- web/src/components/footer/index.vue | 2 +- web/src/setting/index.ts | 2 +- web/src/views/cmdb/network_device.vue | 5782 +++++++++--------- web/src/views/login/LoginComponent.vue | 2 +- web/src/views/net_topology/show.vue | 1658 +++++ web/src/views/net_topology/topology_icon.vue | 273 + 7 files changed, 4838 insertions(+), 2900 deletions(-) create mode 100644 web/src/views/net_topology/show.vue create mode 100644 web/src/views/net_topology/topology_icon.vue diff --git a/web/src/api/url.ts b/web/src/api/url.ts index 3c99bc3..142d8fc 100644 --- a/web/src/api/url.ts +++ b/web/src/api/url.ts @@ -11,25 +11,28 @@ export const getMenuList = '/api/system/menu/' export const getDepartmentList = '/api/system/dept/' export const getMenuListByRole = '/api/system/menu/web_router/' -// export const test = '/test' -// export const BackendApi = '/api/' -// export const captcha = '/net_backend/captcha' -// export const device_import_template = '/api/asset/excel/' // 调度管理 export const getdispach = '/api/backend/dispatch_page/' // 任务列表 export const jobcenterTaskUrl = '/api/backend/jobCenter/' -// 未知 +// 网络设备 export const get_device_expand = '/api/backend/networklist/' +// 采集方案 export const deviceCollect = '/api/backend/deviceCollect/' -// 未知 -export const networkDeviceUrl = '/api/backend/networkDevice/' +// webssh export const deviceWebSshLogin = '/api/backend/deviceWebSsh/' export const automation_chart = '/api/backend/automationChart/' // 未知 export const deviceInfoChange = '/api/backend/deviceInfoChange/' export const getperiodic_taskList = '/api/backend/periodic_task/' -// 未知 +// 拓扑图 +export const get_topology = '/api/topology/index/' +export const topology_show = '/api/topology/show/' +export const topology_media_img = '/media/topology/img/' +export const topology_icon = '/api/topology/topology_icon/' +// 获取业务对应表 +export const getBgbuList = '/api/user/bgbu/' +// 获取变更路径(废弃ing) export const get_api_request_log = '/api/backend/api_request_log/' export const getinterval_schedule = '/api/backend/interval_schedule/' diff --git a/web/src/components/footer/index.vue b/web/src/components/footer/index.vue index 3bdf776..62ffeb2 100644 --- a/web/src/components/footer/index.vue +++ b/web/src/components/footer/index.vue @@ -1,5 +1,5 @@ diff --git a/web/src/views/login/LoginComponent.vue b/web/src/views/login/LoginComponent.vue index 8c993df..cd7ba96 100644 --- a/web/src/views/login/LoginComponent.vue +++ b/web/src/views/login/LoginComponent.vue @@ -7,7 +7,7 @@

-
NetAxe
+
Vue3 + Vite2 + Typescript + Naive UI
生活,应该还有诗和远方
NetAxe {{ version }}
diff --git a/web/src/views/net_topology/show.vue b/web/src/views/net_topology/show.vue new file mode 100644 index 0000000..88babe4 --- /dev/null +++ b/web/src/views/net_topology/show.vue @@ -0,0 +1,1658 @@ + + + diff --git a/web/src/views/net_topology/topology_icon.vue b/web/src/views/net_topology/topology_icon.vue new file mode 100644 index 0000000..5928768 --- /dev/null +++ b/web/src/views/net_topology/topology_icon.vue @@ -0,0 +1,273 @@ + + + + -- Gitee From 01a30ef610c6a08189ed9b8d0aca5f1a107fa3d8 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 20:33:03 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E6=8B=93=E6=89=91=E5=9B=BE=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/topology/serializers.py | 68 +++++++++++++++++++++++++++++ netaxe/apps/topology/urls.py | 11 +++-- netaxe/apps/topology/views.py | 25 ++++++++++- netaxe/apps/users/serializers.py | 12 +++++ netaxe/netboost/urls.py | 1 + 5 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 netaxe/apps/topology/serializers.py create mode 100644 netaxe/apps/users/serializers.py diff --git a/netaxe/apps/topology/serializers.py b/netaxe/apps/topology/serializers.py new file mode 100644 index 0000000..6b4d0da --- /dev/null +++ b/netaxe/apps/topology/serializers.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +""" +------------------------------------------------- + File Name: serializers + Description: + Author: Lijiamin + date: 2023/2/27 20:24 +------------------------------------------------- + Change Activity: + 2023/2/27 20:24 +------------------------------------------------- +""" +import json +from rest_framework import serializers +from .models import Topology, TopologyHost + + +# bgbu field +class BgBuField(serializers.StringRelatedField): + + def to_internal_value(self, value): + # print(value, type(value)) + # value = value[1:-1] + value = json.loads(value) + # print('解码后', value, type(value)) + # print(value, type(value)) + if isinstance(value, list): + return value + else: + raise serializers.ValidationError("BGBU with name: %s not found" % value) + + +# 拓扑表 +class TopologySerializer(serializers.ModelSerializer): + add_datetime = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') + bgbu = BgBuField(many=True) + + class Meta: + model = Topology + fields = '__all__' + + def create(self, validated_data): + """ + 重写 create + """ + bgbu = validated_data.get('bgbu') + validated_data.pop('bgbu') + instance = Topology.objects.create(**validated_data) + if bgbu: + if isinstance(bgbu[0], list) and instance: + dev_obj = Topology.objects.get(id=instance.id) + dev_obj.bgbu.set(bgbu[0]) + return instance + + def update(self, instance, validated_data): + """ + 重写 update + """ + instance.name = validated_data.get('name', instance.name) + instance.memo = validated_data.get('memo', instance.memo) + instance.save() + bgbu = validated_data.get('bgbu', instance.bgbu) + if bgbu: + if isinstance(bgbu[0], list): + dev_obj = Topology.objects.get(id=instance.id) + # dev_obj.bgbu.clear() + dev_obj.bgbu.set(bgbu[0]) + return instance \ No newline at end of file diff --git a/netaxe/apps/topology/urls.py b/netaxe/apps/topology/urls.py index 6fba5a8..f389259 100644 --- a/netaxe/apps/topology/urls.py +++ b/netaxe/apps/topology/urls.py @@ -1,11 +1,16 @@ from django.contrib.auth.decorators import login_required from django.urls import path - -from apps.topology.views import Topology, IconView +from rest_framework.routers import DefaultRouter +from .views import * app_name = 'topology' +router = DefaultRouter() + + +router.register(r'index', TopologyViewSet) + urlpatterns = [ - path('show/', Topology.as_view(), name='show'), + path('show/', TopologyShow.as_view(), name='show'), path('topology_icon/', IconView.as_view(), name='topology_icon'), ] diff --git a/netaxe/apps/topology/views.py b/netaxe/apps/topology/views.py index f8e160d..96abdc1 100644 --- a/netaxe/apps/topology/views.py +++ b/netaxe/apps/topology/views.py @@ -5,13 +5,19 @@ from datetime import datetime, date from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.http import JsonResponse +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.views import APIView +from rest_framework import viewsets, permissions, filters from django.shortcuts import render from django.views import View from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView from apps.topology.icon_manage import IconTree from apps.topology.tasks import TopologyTask +from apps.topology.models import Topology +from .serializers import TopologySerializer from utils.db.mongo_ops import MongoOps, MongoNetOps +from utils.tools.custom_pagination import LargeResultsSetPagination # Create your views here. # 设备二层接口表 @@ -30,8 +36,23 @@ class DateEncoder(json.JSONEncoder): return json.JSONEncoder.default(self, obj) -# 拓扑显示NEW -class Topology(APIView): +# 拓扑清单 +class TopologyViewSet(viewsets.ModelViewSet): + """ + 处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE + """ + queryset = Topology.objects.all().order_by('-id') + # queryset = TopologySerializer.setup_eager_loading(queryset) + serializer_class = TopologySerializer + permission_classes = (permissions.IsAuthenticated,) + # 配置搜索功能 + filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) + filter_fields = '__all__' + pagination_class = LargeResultsSetPagination + + +# 拓扑显示 +class TopologyShow(APIView): permission_classes = (IsAuthenticated,) def get(self, request): diff --git a/netaxe/apps/users/serializers.py b/netaxe/apps/users/serializers.py new file mode 100644 index 0000000..fb7e3d3 --- /dev/null +++ b/netaxe/apps/users/serializers.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +""" +------------------------------------------------- + File Name: serializers + Description: + Author: Lijiamin + date: 2023/2/27 20:25 +------------------------------------------------- + Change Activity: + 2023/2/27 20:25 +------------------------------------------------- +""" diff --git a/netaxe/netboost/urls.py b/netaxe/netboost/urls.py index 4750889..9a372dd 100644 --- a/netaxe/netboost/urls.py +++ b/netaxe/netboost/urls.py @@ -63,4 +63,5 @@ urlpatterns = [ path(r'api/config_center/', include('apps.config_center.urls')), path(r'api/int_utilization/', include('apps.int_utilization.urls')), path(r'api/open_ipam/', include('apps.open_ipam.urls')), + path(r'api/topology/', include('apps.topology.urls')), ] -- Gitee From 485db9578ef206ba2a97eeb529bfc983388a9f0a Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 20:45:22 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E6=8B=93=E6=89=91=E5=9B=BE=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/topology/admin.py | 13 ++--- .../apps/topology/migrations/0001_initial.py | 32 +++++++++++++ netaxe/apps/topology/models.py | 47 ------------------- netaxe/apps/topology/serializers.py | 2 +- 4 files changed, 36 insertions(+), 58 deletions(-) create mode 100644 netaxe/apps/topology/migrations/0001_initial.py diff --git a/netaxe/apps/topology/admin.py b/netaxe/apps/topology/admin.py index ddec41d..7a814b4 100644 --- a/netaxe/apps/topology/admin.py +++ b/netaxe/apps/topology/admin.py @@ -1,19 +1,12 @@ from django.contrib import admin -from .models import Topology, TopologyHost +from .models import Topology # Register your models here. -class AdminTopologyHost(admin.ModelAdmin): - """拓扑图子表""" - list_display = ['name', 'host'] - search_fields = ['name', 'host'] - - class AdminTopology(admin.ModelAdmin): """拓扑图总表""" - list_display = ['name', 'bgbu_list', 'add_datetime'] - search_fields = ['name', 'bgbu_list', 'add_datetime'] + list_display = ['name', 'bgbu_list'] + search_fields = ['name', 'bgbu_list'] -admin.site.register(TopologyHost, AdminTopologyHost) admin.site.register(Topology, AdminTopology) \ No newline at end of file diff --git a/netaxe/apps/topology/migrations/0001_initial.py b/netaxe/apps/topology/migrations/0001_initial.py new file mode 100644 index 0000000..25b09dc --- /dev/null +++ b/netaxe/apps/topology/migrations/0001_initial.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.17 on 2023-02-27 20:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0002_userprofile_jwt_secret'), + ] + + operations = [ + migrations.CreateModel( + name='Topology', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='名称')), + ('memo', models.TextField(blank=True, null=True, verbose_name='描述')), + ('bgbu', models.ManyToManyField(blank=True, related_name='bgbu_topology_group', to='users.BgBu', verbose_name='关联业务')), + ], + options={ + 'verbose_name_plural': '拓扑表', + 'db_table': 'topology', + }, + ), + migrations.AddIndex( + model_name='topology', + index=models.Index(fields=['name'], name='topology_name_89fd82_idx'), + ), + ] diff --git a/netaxe/apps/topology/models.py b/netaxe/apps/topology/models.py index 0eee30b..4fc93d6 100644 --- a/netaxe/apps/topology/models.py +++ b/netaxe/apps/topology/models.py @@ -17,52 +17,6 @@ from django.db import models ------------------------------------------------- """ -# Create your models here. - - -# 设备层级选择 -class DeviceLevelChoise(object): - - ONE = '1' - TWO = '2' - THREE = '3' - FOUR = '4' - FIVE = '5' - - CHOICES = ( - (ONE, ONE), - (TWO, TWO), - (THREE, THREE), - (FOUR, FOUR), - (FIVE, FIVE), - ) - - -# 拓扑主机子表 -class TopologyHost(models.Model): - name = models.CharField(verbose_name='主机名', null=True, blank=True, max_length=32) - host = models.GenericIPAddressField(verbose_name='主机IP', null=True, blank=True, max_length=32) - - def __str__(self): - return '%s(%s)' % (self.name, self.host) - - class Meta: - # unique_together = (("name", "host", "group"),) - db_table = 'topology_host' - verbose_name = '拓扑主机表' - verbose_name_plural = '拓扑主机表' - - -class TopologyStatus(object): - - FINISHED = 'Finished' - PENDING = 'Pending' - - CHOICES = ( - (FINISHED, FINISHED), - (PENDING, PENDING), - ) - class Topology(models.Model): """ @@ -75,7 +29,6 @@ class Topology(models.Model): null=False, unique=True) bgbu = models.ManyToManyField("users.BgBu", verbose_name='关联业务', blank=True, related_name='bgbu_topology_group') - # group_hosts = models.ManyToManyField("TopologyHost", related_name='to_topology_group', verbose_name='组内主机') memo = models.TextField(verbose_name='描述', null=True, blank=True) def bgbu_list(self): diff --git a/netaxe/apps/topology/serializers.py b/netaxe/apps/topology/serializers.py index 6b4d0da..293141b 100644 --- a/netaxe/apps/topology/serializers.py +++ b/netaxe/apps/topology/serializers.py @@ -12,7 +12,7 @@ """ import json from rest_framework import serializers -from .models import Topology, TopologyHost +from .models import Topology # bgbu field -- Gitee From dff2c6c480f511fea02de8ed3d32bc5cd0965060 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 20:47:52 +0800 Subject: [PATCH 11/19] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/init.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netaxe/init.sh b/netaxe/init.sh index 4e0fe1d..d338afd 100644 --- a/netaxe/init.sh +++ b/netaxe/init.sh @@ -44,6 +44,10 @@ python3 manage.py makemigrations rest_framework_tracking python3 manage.py migrate rest_framework_tracking +python3 manage.py makemigrations topology + +python3 manage.py migrate topology + python3 manage.py init_asset # 资产初始化 python3 manage.py init_collect # 采集方案初始化 python3 manage.py init_system_menu # 系统菜单初始化 -- Gitee From 89c50130bc08390b562e03c440d42528aeadc03e Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:00:47 +0800 Subject: [PATCH 12/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/utils/init_system_menu.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/netaxe/utils/init_system_menu.json b/netaxe/utils/init_system_menu.json index 867ba76..54c3630 100644 --- a/netaxe/utils/init_system_menu.json +++ b/netaxe/utils/init_system_menu.json @@ -143,6 +143,24 @@ "web_path": "/task_center/task_list", "sort": 2, "id": 10021 + }, + { + "name": "拓扑管理", + "status": "True", + "parent_id": null, + "visible": "True", + "web_path": "/net_topology", + "sort": 6, + "id": 20006 + }, + { + "name": "拓扑展示", + "status": "True", + "parent_id": 20006, + "visible": "True", + "web_path": "/net_topology/show", + "sort": 1, + "id": 20011 } ] } \ No newline at end of file -- Gitee From bdd49c7bb50a295db8c3d39970737c92f1e78986 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:06:20 +0800 Subject: [PATCH 13/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/users/serializers.py | 11 +++++++++++ netaxe/apps/users/urls.py | 2 ++ netaxe/apps/users/views.py | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/netaxe/apps/users/serializers.py b/netaxe/apps/users/serializers.py index fb7e3d3..b6dc548 100644 --- a/netaxe/apps/users/serializers.py +++ b/netaxe/apps/users/serializers.py @@ -10,3 +10,14 @@ 2023/2/27 20:25 ------------------------------------------------- """ +import json +from rest_framework import serializers +from .models import BgBu + +class BgBuSerializer(serializers.ModelSerializer): + """bgbu表,用于运营平台数据对应关系""" + + class Meta: + model = BgBu + fields = ('id', 'name',) + diff --git a/netaxe/apps/users/urls.py b/netaxe/apps/users/urls.py index 79380ee..6cc16df 100644 --- a/netaxe/apps/users/urls.py +++ b/netaxe/apps/users/urls.py @@ -2,10 +2,12 @@ from django.urls import path, include from rest_framework import routers from apps.users.views.user import UserViewSet +from .views import BgBuViewSet router = routers.SimpleRouter() router.register(r'user', UserViewSet) +router.register(r'bgbu', BgBuViewSet) urlpatterns = [ path(r'', include(router.urls)), diff --git a/netaxe/apps/users/views.py b/netaxe/apps/users/views.py index 60f00ef..51f1524 100644 --- a/netaxe/apps/users/views.py +++ b/netaxe/apps/users/views.py @@ -1 +1,22 @@ # Create your views here. +from rest_framework import viewsets, permissions, filters +from django_filters.rest_framework import DjangoFilterBackend +from utils.tools.custom_pagination import LargeResultsSetPagination +from .models import BgBu +from .serializers import BgBuSerializer + + +class BgBuViewSet(viewsets.ModelViewSet): + """ + BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE + """ + queryset = BgBu.objects.all().order_by('name') + serializer_class = BgBuSerializer + permission_classes = (permissions.IsAuthenticated,) + # pagination_class = LimitSet + pagination_class = LargeResultsSetPagination + # 配置搜索功能 + filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) + # 如果要允许对某些字段进行过滤,可以使用filter_fields属性。 + # filterset_class = DeviceBackupConfigFilter + filter_fields = '__all__' \ No newline at end of file -- Gitee From 30fa396b208c6595ffee6fbaa7ff13a5509773b6 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:23:10 +0800 Subject: [PATCH 14/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A1=A8=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/topology/urls.py | 3 ++- netaxe/apps/users/serializers.py | 1 + netaxe/apps/users/urls.py | 6 +++--- netaxe/apps/users/views.py | 22 ---------------------- netaxe/apps/users/views/user.py | 24 +++++++++++++++++++++--- 5 files changed, 27 insertions(+), 29 deletions(-) delete mode 100644 netaxe/apps/users/views.py diff --git a/netaxe/apps/topology/urls.py b/netaxe/apps/topology/urls.py index f389259..f094927 100644 --- a/netaxe/apps/topology/urls.py +++ b/netaxe/apps/topology/urls.py @@ -1,5 +1,5 @@ from django.contrib.auth.decorators import login_required -from django.urls import path +from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import * @@ -11,6 +11,7 @@ router.register(r'index', TopologyViewSet) urlpatterns = [ + path(r'', include(router.urls)), path('show/', TopologyShow.as_view(), name='show'), path('topology_icon/', IconView.as_view(), name='topology_icon'), ] diff --git a/netaxe/apps/users/serializers.py b/netaxe/apps/users/serializers.py index b6dc548..369fd95 100644 --- a/netaxe/apps/users/serializers.py +++ b/netaxe/apps/users/serializers.py @@ -14,6 +14,7 @@ import json from rest_framework import serializers from .models import BgBu + class BgBuSerializer(serializers.ModelSerializer): """bgbu表,用于运营平台数据对应关系""" diff --git a/netaxe/apps/users/urls.py b/netaxe/apps/users/urls.py index 6cc16df..4cd8049 100644 --- a/netaxe/apps/users/urls.py +++ b/netaxe/apps/users/urls.py @@ -1,11 +1,11 @@ from django.urls import path, include -from rest_framework import routers +from rest_framework.routers import DefaultRouter from apps.users.views.user import UserViewSet -from .views import BgBuViewSet +from apps.users.views.user import BgBuViewSet -router = routers.SimpleRouter() +router = DefaultRouter() router.register(r'user', UserViewSet) router.register(r'bgbu', BgBuViewSet) diff --git a/netaxe/apps/users/views.py b/netaxe/apps/users/views.py deleted file mode 100644 index 51f1524..0000000 --- a/netaxe/apps/users/views.py +++ /dev/null @@ -1,22 +0,0 @@ -# Create your views here. -from rest_framework import viewsets, permissions, filters -from django_filters.rest_framework import DjangoFilterBackend -from utils.tools.custom_pagination import LargeResultsSetPagination -from .models import BgBu -from .serializers import BgBuSerializer - - -class BgBuViewSet(viewsets.ModelViewSet): - """ - BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE - """ - queryset = BgBu.objects.all().order_by('name') - serializer_class = BgBuSerializer - permission_classes = (permissions.IsAuthenticated,) - # pagination_class = LimitSet - pagination_class = LargeResultsSetPagination - # 配置搜索功能 - filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) - # 如果要允许对某些字段进行过滤,可以使用filter_fields属性。 - # filterset_class = DeviceBackupConfigFilter - filter_fields = '__all__' \ No newline at end of file diff --git a/netaxe/apps/users/views/user.py b/netaxe/apps/users/views/user.py index 40363f2..c5cdf11 100644 --- a/netaxe/apps/users/views/user.py +++ b/netaxe/apps/users/views/user.py @@ -1,10 +1,12 @@ from django.contrib.auth.hashers import make_password from django_restql.fields import DynamicSerializerMethodField -from rest_framework import serializers +from rest_framework import serializers, permissions, filters from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated - -from apps.users.models import UserProfile +from django_filters.rest_framework import DjangoFilterBackend +from utils.tools.custom_pagination import LargeResultsSetPagination +from apps.users.models import UserProfile, BgBu +from apps.users.serializers import BgBuSerializer from apps.system.views.role import RoleSerializer from utils.custom.json_response import ErrorResponse, DetailResponse from utils.custom.serializers import CustomModelSerializer @@ -213,3 +215,19 @@ class UserViewSet(CustomModelViewSet): return DetailResponse(data=None, msg="修改成功") else: return ErrorResponse(msg="未获取到用户") + + +class BgBuViewSet(CustomModelViewSet): + """ + BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE + """ + queryset = BgBu.objects.all().order_by('name') + serializer_class = BgBuSerializer + permission_classes = (permissions.IsAuthenticated,) + # pagination_class = LimitSet + pagination_class = LargeResultsSetPagination + # 配置搜索功能 + filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) + # 如果要允许对某些字段进行过滤,可以使用filter_fields属性。 + # filterset_class = DeviceBackupConfigFilter + filter_fields = '__all__' \ No newline at end of file -- Gitee From c48777f2391983593852acf003efbc72b153e531 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:30:00 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=B1=9E=E6=80=A7api=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/users/views/user.py | 2 +- web/src/api/url.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netaxe/apps/users/views/user.py b/netaxe/apps/users/views/user.py index c5cdf11..6e5ab1e 100644 --- a/netaxe/apps/users/views/user.py +++ b/netaxe/apps/users/views/user.py @@ -217,7 +217,7 @@ class UserViewSet(CustomModelViewSet): return ErrorResponse(msg="未获取到用户") -class BgBuViewSet(CustomModelViewSet): +class BgBuViewSet(serializers.ModelSerializer): """ BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE """ diff --git a/web/src/api/url.ts b/web/src/api/url.ts index 142d8fc..36db3d8 100644 --- a/web/src/api/url.ts +++ b/web/src/api/url.ts @@ -31,7 +31,7 @@ export const topology_show = '/api/topology/show/' export const topology_media_img = '/media/topology/img/' export const topology_icon = '/api/topology/topology_icon/' // 获取业务对应表 -export const getBgbuList = '/api/user/bgbu/' +export const getBgbuList = '/api/users/bgbu/' // 获取变更路径(废弃ing) export const get_api_request_log = '/api/backend/api_request_log/' export const getinterval_schedule = '/api/backend/interval_schedule/' -- Gitee From 38f684a672b993c723e0eac16bc5496dddf82198 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:40:57 +0800 Subject: [PATCH 16/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E8=A1=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/users/urls.py | 4 ++-- netaxe/apps/users/views/user.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netaxe/apps/users/urls.py b/netaxe/apps/users/urls.py index 4cd8049..546e8c6 100644 --- a/netaxe/apps/users/urls.py +++ b/netaxe/apps/users/urls.py @@ -1,11 +1,11 @@ from django.urls import path, include -from rest_framework.routers import DefaultRouter +from rest_framework.routers import SimpleRouter from apps.users.views.user import UserViewSet from apps.users.views.user import BgBuViewSet -router = DefaultRouter() +router = SimpleRouter() router.register(r'user', UserViewSet) router.register(r'bgbu', BgBuViewSet) diff --git a/netaxe/apps/users/views/user.py b/netaxe/apps/users/views/user.py index 6e5ab1e..c5cdf11 100644 --- a/netaxe/apps/users/views/user.py +++ b/netaxe/apps/users/views/user.py @@ -217,7 +217,7 @@ class UserViewSet(CustomModelViewSet): return ErrorResponse(msg="未获取到用户") -class BgBuViewSet(serializers.ModelSerializer): +class BgBuViewSet(CustomModelViewSet): """ BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE """ -- Gitee From 1a4fb15400f8f42f95ac78f0532cc0dbee207338 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 21:44:42 +0800 Subject: [PATCH 17/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E8=A1=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netaxe/apps/users/views/user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netaxe/apps/users/views/user.py b/netaxe/apps/users/views/user.py index c5cdf11..5f79600 100644 --- a/netaxe/apps/users/views/user.py +++ b/netaxe/apps/users/views/user.py @@ -1,6 +1,6 @@ from django.contrib.auth.hashers import make_password from django_restql.fields import DynamicSerializerMethodField -from rest_framework import serializers, permissions, filters +from rest_framework import serializers, permissions, filters, viewsets from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated from django_filters.rest_framework import DjangoFilterBackend @@ -217,7 +217,7 @@ class UserViewSet(CustomModelViewSet): return ErrorResponse(msg="未获取到用户") -class BgBuViewSet(CustomModelViewSet): +class BgBuViewSet(viewsets.ModelViewSet): """ BgBu表---处理 GET POST , 处理 /api/post// GET PUT PATCH DELETE """ -- Gitee From ef68f0bde2cc324df7d5efba6e878b9a911b25a6 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 23:00:51 +0800 Subject: [PATCH 18/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 0 docker/server/nginx.conf | 6 ++++++ index.rst | 0 netaxe/utils/init_system_menu.json | 9 +++++++++ web/nginx.conf | 4 +++- web/src/views/net_topology/show.vue | 2 +- 6 files changed, 19 insertions(+), 2 deletions(-) delete mode 100644 README.rst delete mode 100644 index.rst diff --git a/README.rst b/README.rst deleted file mode 100644 index e69de29..0000000 diff --git a/docker/server/nginx.conf b/docker/server/nginx.conf index dd38dc3..eb45cca 100644 --- a/docker/server/nginx.conf +++ b/docker/server/nginx.conf @@ -39,4 +39,10 @@ server { add_header Cache-Control private; alias /home/netaxe/static/; } + location /media/ { + expires 2d; + autoindex off; + add_header Cache-Control private; + alias /home/netaxe/media/; + } } \ No newline at end of file diff --git a/index.rst b/index.rst deleted file mode 100644 index e69de29..0000000 diff --git a/netaxe/utils/init_system_menu.json b/netaxe/utils/init_system_menu.json index 54c3630..78015b9 100644 --- a/netaxe/utils/init_system_menu.json +++ b/netaxe/utils/init_system_menu.json @@ -161,6 +161,15 @@ "web_path": "/net_topology/show", "sort": 1, "id": 20011 + }, + { + "name": "图标库", + "status": "True", + "parent_id": 20006, + "visible": "True", + "web_path": "/net_topology/topology_icon", + "sort": 2, + "id": 20012 } ] } \ No newline at end of file diff --git a/web/nginx.conf b/web/nginx.conf index 2cdb5b8..12f45c1 100644 --- a/web/nginx.conf +++ b/web/nginx.conf @@ -24,7 +24,9 @@ server { location /ipam { proxy_pass http://apisix:9080/ipam; } - + # location /media { + # proxy_pass http://apisix:9080/media; + # } # location /api { # proxy_pass http://netaxe-nginx:9999/api; # } diff --git a/web/src/views/net_topology/show.vue b/web/src/views/net_topology/show.vue index 88babe4..f96ea8a 100644 --- a/web/src/views/net_topology/show.vue +++ b/web/src/views/net_topology/show.vue @@ -1392,7 +1392,7 @@ } } }) - console.log(drawerImgOptions.value) + // console.log(drawerImgOptions.value) }) }) } -- Gitee From 8399b2c30adfae3606f4cdae7917c359d3ed0f41 Mon Sep 17 00:00:00 2001 From: jmli12 Date: Mon, 27 Feb 2023 23:10:29 +0800 Subject: [PATCH 19/19] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=BA=93=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/vite.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/web/vite.config.ts b/web/vite.config.ts index b1b3fd7..66fce2a 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -48,6 +48,12 @@ export default ({ mode }) => { changeOrigin: true, // 虚拟的站点需要更管origin rewrite: (path: string) => path.replace(/^\/ipam/, '/ipam'), }, + '/media': { + target: env.VITE_BASIC_URL, + ws: true, //代理websockets + changeOrigin: true, // 虚拟的站点需要更管origin + rewrite: (path: string) => path.replace(/^\/media/, '/media'), + }, '/ws': { target: env.VITE_BASIC_URL, timeout: 60000, -- Gitee