diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py index c6784a4ac..1f8bae05e 100644 --- a/apps/assets/migrations/0001_initial.py +++ b/apps/assets/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10 on 2016-08-14 08:12 +# Generated by Django 1.10 on 2016-08-21 09:52 from __future__ import unicode_literals from django.db import migrations, models @@ -19,26 +19,26 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('ip', models.CharField(blank=True, max_length=32, verbose_name='\u4e3b\u673aIP')), - ('other_ip', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5176\u4ed6IP')), - ('remote_card_ip', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u8fdc\u63a7\u5361IP')), - ('hostname', models.CharField(max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')), - ('port', models.IntegerField(blank=True, null=True, verbose_name='\u7aef\u53e3\u53f7')), - ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')), - ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='\u5bc6\u7801')), - ('mac_addr', models.CharField(blank=True, max_length=20, null=True, verbose_name='MAC\u5730\u5740')), - ('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')), - ('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')), - ('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5185\u5b58')), - ('disk', models.CharField(blank=True, max_length=1024, null=True, verbose_name='\u786c\u76d8')), - ('os', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7cfb\u7edf\u4fe1\u606f')), - ('cabinet_no', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u673a\u67dc\u53f7')), - ('cabinet_pos', models.IntegerField(blank=True, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')), - ('number', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')), - ('sn', models.CharField(blank=True, max_length=128, null=True, verbose_name='SN\u7f16\u53f7')), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), + ('other_ip', models.CharField(blank=True, max_length=255, verbose_name='\u5176\u4ed6IP')), + ('remote_card_ip', models.CharField(blank=True, max_length=16, verbose_name='\u8fdc\u63a7\u5361IP')), + ('hostname', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')), + ('port', models.IntegerField(blank=True, verbose_name='\u7aef\u53e3\u53f7')), + ('username', models.CharField(blank=True, max_length=16, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')), + ('password', models.CharField(blank=True, max_length=256, verbose_name='\u5bc6\u7801')), + ('mac_addr', models.CharField(blank=True, max_length=20, unique=True, verbose_name='MAC\u5730\u5740')), + ('brand', models.CharField(blank=True, max_length=64, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')), + ('cpu', models.CharField(blank=True, max_length=64, verbose_name='CPU')), + ('memory', models.CharField(blank=True, max_length=128, verbose_name='\u5185\u5b58')), + ('disk', models.CharField(blank=True, max_length=1024, verbose_name='\u786c\u76d8')), + ('os', models.CharField(blank=True, max_length=128, verbose_name='\u7cfb\u7edf\u4fe1\u606f')), + ('cabinet_no', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u67dc\u53f7')), + ('cabinet_pos', models.IntegerField(blank=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')), + ('number', models.CharField(blank=True, max_length=32, unique=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')), + ('sn', models.CharField(blank=True, max_length=128, unique=True, verbose_name='SN\u7f16\u53f7')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), ('is_active', models.BooleanField(default=True, verbose_name='\u662f\u5426\u6fc0\u6d3b')), ('date_added', models.DateTimeField(auto_now=True, null=True)), - ('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5907\u6ce8')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), ], options={ 'db_table': 'asset', @@ -55,7 +55,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=64, unique=True)), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), ('comment', models.CharField(blank=True, max_length=128, null=True)), ], options={ @@ -67,15 +67,15 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=32, verbose_name='\u673a\u623f\u540d\u79f0')), - ('bandwidth', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u673a\u623f\u5e26\u5bbd')), - ('contact', models.CharField(blank=True, default='', max_length=16, null=True, verbose_name='\u8054\u7cfb\u4eba')), - ('phone', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8054\u7cfb\u7535\u8bdd')), - ('address', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u673a\u623f\u5730\u5740')), - ('network', models.TextField(blank=True, default='', null=True, verbose_name='IP\u5730\u5740\u6bb5')), + ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u623f\u5e26\u5bbd')), + ('contact', models.CharField(blank=True, max_length=16, verbose_name='\u8054\u7cfb\u4eba')), + ('phone', models.CharField(blank=True, max_length=32, verbose_name='\u8054\u7cfb\u7535\u8bdd')), + ('address', models.CharField(blank=True, max_length=128, verbose_name='\u673a\u623f\u5730\u5740')), + ('network', models.TextField(blank=True, verbose_name='IP\u5730\u5740\u6bb5')), ('date_added', models.DateField(auto_now=True, null=True)), - ('operator', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8fd0\u8425\u5546')), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), - ('comment', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u5907\u6ce8')), + ('operator', models.CharField(blank=True, max_length=32, verbose_name='\u8fd0\u8425\u5546')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), ], options={ 'db_table': 'idc', diff --git a/apps/assets/migrations/0002_auto_20160821_1757.py b/apps/assets/migrations/0002_auto_20160821_1757.py new file mode 100644 index 000000000..e22966fd8 --- /dev/null +++ b/apps/assets/migrations/0002_auto_20160821_1757.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-21 09:57 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='cabinet_pos', + field=models.IntegerField(blank=True, max_length=4, verbose_name='\u673a\u5668\u4f4d\u7f6e'), + ), + ] diff --git a/apps/assets/migrations/0003_auto_20160821_1759.py b/apps/assets/migrations/0003_auto_20160821_1759.py new file mode 100644 index 000000000..e5c49bcd5 --- /dev/null +++ b/apps/assets/migrations/0003_auto_20160821_1759.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-21 09:59 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0002_auto_20160821_1757'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='cabinet_pos', + field=models.IntegerField(blank=True, max_length=4, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e'), + ), + ] diff --git a/apps/assets/models.py b/apps/assets/models.py index 66612e7b4..d3a09d5ae 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -6,7 +6,7 @@ from django.db import models class AssetGroup(models.Model): name = models.CharField(max_length=64, unique=True) - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") comment = models.CharField(max_length=128, blank=True, null=True) def __unicode__(self): @@ -18,15 +18,15 @@ class AssetGroup(models.Model): class IDC(models.Model): name = models.CharField(max_length=32, verbose_name=u'机房名称') - bandwidth = models.CharField(max_length=32, blank=True, null=True, default='', verbose_name=u'机房带宽') - contact = models.CharField(max_length=16, blank=True, null=True, default='', verbose_name=u'联系人') - phone = models.CharField(max_length=32, blank=True, null=True, default='', verbose_name=u'联系电话') - address = models.CharField(max_length=128, blank=True, null=True, default='', verbose_name=u"机房地址") - network = models.TextField(blank=True, null=True, default='', verbose_name=u"IP地址段") + bandwidth = models.CharField(max_length=32, blank=True, verbose_name=u'机房带宽') + contact = models.CharField(max_length=16, blank=True, verbose_name=u'联系人') + phone = models.CharField(max_length=32, blank=True, verbose_name=u'联系电话') + address = models.CharField(max_length=128, blank=True, verbose_name=u"机房地址") + network = models.TextField(blank=True, verbose_name=u"IP地址段") date_added = models.DateField(auto_now=True, null=True) - operator = models.CharField(max_length=32, blank=True, default='', null=True, verbose_name=u"运营商") - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") - comment = models.CharField(max_length=128, blank=True, default='', null=True, verbose_name=u"备注") + operator = models.CharField(max_length=32, blank=True, verbose_name=u"运营商") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") + comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注") def __unicode__(self): return self.name @@ -43,31 +43,34 @@ class AssetExtend(models.Model): class Asset(models.Model): ip = models.CharField(max_length=32, blank=True, verbose_name="主机IP") - other_ip = models.CharField(max_length=255, blank=True, null=True, verbose_name="其他IP") - remote_card_ip = models.CharField(max_length=16, blank=True, null=True, verbose_name=u'远控卡IP') - hostname = models.CharField(unique=True, max_length=128, verbose_name=u"主机名") - port = models.IntegerField(blank=True, null=True, verbose_name=u"端口号") + other_ip = models.CharField(max_length=255, blank=True, verbose_name="其他IP") + remote_card_ip = models.CharField(max_length=16, blank=True, verbose_name=u'远控卡IP') + hostname = models.CharField(max_length=128, unique=True, blank=True, verbose_name=u"主机名") + port = models.IntegerField(blank=True, verbose_name=u"端口号") group = models.ManyToManyField(AssetGroup, blank=True, verbose_name=u"所属主机组") - username = models.CharField(max_length=16, blank=True, null=True, verbose_name=u"管理用户名") - password = models.CharField(max_length=256, blank=True, null=True, verbose_name=u"密码") - idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房') - mac_addr = models.CharField(max_length=20, blank=True, null=True, verbose_name=u"MAC地址") - brand = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'硬件厂商型号') - cpu = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'CPU') - memory = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'内存') - disk = models.CharField(max_length=1024, blank=True, null=True, verbose_name=u'硬盘') - os = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'系统信息') - cabinet_no = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'机柜号') - cabinet_pos = models.IntegerField(blank=True, null=True, verbose_name=u'机器位置') - number = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'资产编号') - status = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_status_extend", verbose_name="机器状态") - type = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_type_extend", verbose_name="机器类型") - env = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_env_extend", verbose_name="所属主机组环境") - sn = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"SN编号") - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") + username = models.CharField(max_length=16, blank=True, verbose_name=u"管理用户名") + password = models.CharField(max_length=256, blank=True, verbose_name=u"密码") + idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房') + mac_addr = models.CharField(max_length=20, blank=True, unique=True, verbose_name=u"MAC地址") + brand = models.CharField(max_length=64, blank=True, verbose_name=u'硬件厂商型号') + cpu = models.CharField(max_length=64, blank=True, verbose_name=u'CPU') + memory = models.CharField(max_length=128, blank=True, verbose_name=u'内存') + disk = models.CharField(max_length=1024, blank=True, verbose_name=u'硬盘') + os = models.CharField(max_length=128, blank=True, verbose_name=u'系统信息') + cabinet_no = models.CharField(max_length=32, blank=True, verbose_name=u'机柜号') + cabinet_pos = models.IntegerField(max_length=4, null=True, blank=True, verbose_name=u'机器位置') + number = models.CharField(max_length=32, blank=True, unique=True, verbose_name=u'资产编号') + status = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_status_extend", verbose_name="机器状态") + type = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_type_extend", verbose_name="机器类型") + env = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_env_extend", verbose_name="所属主机组环境") + sn = models.CharField(max_length=128, blank=True, unique=True, verbose_name=u"SN编号") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") is_active = models.BooleanField(default=True, verbose_name=u"是否激活") date_added = models.DateTimeField(auto_now=True, null=True) - comment = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"备注") + comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注") def __unicode__(self): return self.ip diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html new file mode 100644 index 000000000..5d8a48db9 --- /dev/null +++ b/apps/assets/templates/assets/asset_detail.html @@ -0,0 +1,374 @@ +{% extends 'base.html' %} +{% block content %} +
+
+
+
+
+ {{ asset.ip }} + +
+
+

主机详细信息

+ 此主机详细信息. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +{# #} +{# #} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
主机名{{ asset.hostname|default_if_none:"" }}
IP{{ asset.ip|default_if_none:"" }}
其他IP + + {% if asset.other_ip %} + {% for ip in asset.other_ip %} + + + + {% endfor %} + {% endif %} +
{{ ip }}
+
远控IP{{ asset.remote_ip|default_if_none:"" }}
端口{{ asset.port|default_if_none:"" }}
主机组 + + {% for asset_group in asset.group.all %} + + + + {% endfor %} +
{{ asset_group.name|default_if_none:"" }}
+
使用默认管理账号{{ asset.use_default_auth|bool2str }}{{ asset.use_default_auth|bool2str }} {% if not asset.use_default_auth %} {{ asset.username }} {% endif %}
机房{{ asset.idc.name|default_if_none:"" }}
硬件厂商型号{{ asset.brand|default_if_none:"" }}
CPU{{ asset.cpu|default_if_none:"" }}
内存{{ asset.memory|default_if_none:"" }}{% if asset.memory %}G{% endif %}
硬盘 + + {% if asset.disk %} + {% for disk, value in asset.disk %} + + + + {% endfor %} + {% endif %} +
{{ disk|default_if_none:"" }}     {{ value|default_if_none:"" }}
+
资产编号{{ asset.number|default_if_none:"" }}
SN{{ asset.sn|default_if_none:"" }}
主机类型{{ asset.get_asset_type_display|default_if_none:"" }}
系统版本{{ asset.system_type|default_if_none:"" }} {{ asset.system_version|default_if_none:"" }}
系统平台{{ asset.system_arch|default_if_none:"" }}
运行环境{{ asset.get_env_display|default_if_none:"" }}
机器状态{{ asset.get_status_display|default_if_none:"" }}
机柜号{{ asset.cabinet|default_if_none:"" }}
机柜位置{{ asset.position|default_if_none:"" }}
激活{{ asset.is_active }}
添加日期{{ asset.date_added|date:"Y-m-d H:i:s" }}
备注{{ asset.comment|default_if_none:"" }}
+
+
+
+
+
+
+
+
+
拥有权限的用户
+
+ + + + + + + + + + +
+
+
+

主机所有授权的信息

+ 包含了此主机所有授权的信息. +
+
+
+
+ {% if perm_info %} + {% if user_perm %} + +

授权用户信息

+ + + {% for perm in user_perm %} + + + + + {% endfor %} +
授权用户关联用户
{{ perm.0 }} + + {% if perm.1 %} + {% for role in perm.1 %} + + + + {% endfor %} + {% endif %} +
{{ role }}
+
+ {% endif %} + {% if user_group_perm %} + +

授权用户组信息

+ + + {% for user_group in user_group_perm %} + + + + + {% endfor %} +
授权用户组组详情
{{ user_group }}详情
+ {% endif %} + + {% if user_rule_perm %} + +

授权规则信息

+ + + {% for rule in user_rule_perm %} + + + + + {% endfor %} +
授权规则详情
{{ rule }}详情
+ {% endif %} + {% else %} +

(暂无)

+ {% endif %} +
+
+
+
+
主机修改记录
+{#     点击修改#} +
+ + + + + + + + + + +
+
+
+

主机修改记录

+ 包含了此主机所有历史修改记录. +
+
+
+ {% if asset_record %} +{# {% for r in asset_record %}#} +{#
#} +{#
#} +{# {{ r.alert_time|naturaltime }}#} +{# {{ r.username }}#} +{# {% for i in r.content|str_to_list %}#} +{#
{{ i.0 }} 由 {{ i.1|str_to_code }} 改为 {{ i.2|str_to_code }}
#} +{# {% endfor %}#} +{# {{ r.alert_time }}#} +{#
#} +{#
#} +{# {% endfor %}#} + {% else %} +

(暂无)

+ {% endif %} +
+
+
+
+ +
+
+
+
最近一周登录记录
+
+ + + + + + + + + + +
+
+
+

最近一周登录记录

+ 此主机最近一周用户登录信息. +
+
+ {% if log %} + {% for l in log %} +
+
+
+ + {{ l.user }} +
+
+
+

详细信息

+

来源IP: {{ l.remote_ip }}

+

开始: {{ l.start_time |date:"Y-m-d H:i:s" }}

+

结束: {{ l.end_time |date:"Y-m-d H:i:s" }}

+
+
+
+ {% endfor %} + + +
+
+
+
+
+ + + + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 53288cb83..da5f2156f 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -119,7 +119,7 @@ - {{ asset.hostname|default_if_none:"" }} + {{ asset.hostname|default_if_none:"" }} {{ asset.ip|default_if_none:"" }} {{ asset.idc.name|default_if_none:"" }} {# {{ asset.group.all|group_str2 }}#} diff --git a/apps/users/migrations/0004_auto_20160821_1754.py b/apps/users/migrations/0004_auto_20160821_1754.py new file mode 100644 index 000000000..9c252ca0b --- /dev/null +++ b/apps/users/migrations/0004_auto_20160821_1754.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-21 09:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_auto_20160814_1758'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='email', + field=models.EmailField(max_length=30, unique=True, verbose_name='\u90ae\u4ef6'), + ), + migrations.AlterField( + model_name='user', + name='groups', + field=models.ManyToManyField(to='users.UserGroup', verbose_name='\u7528\u6237\u7ec4'), + ), + migrations.AlterField( + model_name='user', + name='name', + field=models.CharField(max_length=20, verbose_name='\u59d3\u540d'), + ), + migrations.AlterField( + model_name='user', + name='username', + field=models.CharField(max_length=20, unique=True, verbose_name='\u7528\u6237\u540d'), + ), + ]