22 |
23 |
24 |
28 |
29 |

30 |
31 |
32 |
33 |
34 |
35 | {% endblock %}
36 |
37 | {% block js %}
38 |
44 | {% endblock %}
--------------------------------------------------------------------------------
/transfer/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liuhuipy/lh-falcon/181ec242c625f336711e4c99db97d45157fa1ecf/transfer/__init__.py
--------------------------------------------------------------------------------
/transfer/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/transfer/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class TransferConfig(AppConfig):
5 | name = 'transfer'
6 |
--------------------------------------------------------------------------------
/transfer/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liuhuipy/lh-falcon/181ec242c625f336711e4c99db97d45157fa1ecf/transfer/migrations/__init__.py
--------------------------------------------------------------------------------
/transfer/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 | # Create your models here.
4 |
--------------------------------------------------------------------------------
/transfer/rrd_graph.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import os
4 | import rrdtool
5 | import time
6 |
7 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
8 |
9 | base_dir = os.path.join(BASE_DIR, "rrddatas")
10 | filename = base_dir + '/ansible.node2.com/load_1min.rrd'
11 | print(filename)
12 |
13 | # 定义图表上方大标题
14 | title = "Server network traffic flow (" + time.strftime('%Y-%m-%d', time.localtime(time.time())) + ")"
15 | # 重点解释"--x-grid","MINUTE:12:HOUR:1:HOUR:1:0:%H"参数的作用(从左往右进行分解)
16 | "MINUTE:12" # 表示控制每隔12分钟放置一根次要格线
17 | "HOUR:1" # 表示控制每隔1小时放置一根主要格线
18 | "HOUR:1" # 表示控制1个小时输出一个label标签
19 | "0:%H" # 0表示数字对齐格线,%H表示标签以小时显示
20 | rrdtool.graph("/root/Flow.png", "--start", "-1d", "--vertical-label=Bytes/s",
21 | "--x-grid", "MINUTE:12:HOUR:1:HOUR:1:0:%H",
22 | "--width", "650", "--height", "230",
23 | "DEF:wan_rx=%s:wan_rx:AVERAGE" % (filename), # 指定网卡入流量数据源DS及CF
24 | ) # 绘制出流量最小值
--------------------------------------------------------------------------------
/transfer/rrdtool_action.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import os
4 | import time
5 |
6 | import rrdtool
7 |
8 |
9 | def rrd_init_or_update(rrdname, value, step, counter_type, rrd_dir):
10 | rrdpath = os.path.join(rrd_dir, rrdname)
11 | if os.path.isfile(rrdpath):
12 | rrd_update(rrdpath, value)
13 | else:
14 | rrd_init(rrdpath, step, counter_type)
15 | rrd_update(rrdpath, value)
16 |
17 |
18 | def rrd_init(rrdname, step, counter_type):
19 | """
20 | 聚合时间根据自己需要
21 | """
22 | cur_time = str(int(time.time()))
23 | # print(rrdname)
24 |
25 | rrd = rrdtool.create(rrdname, '--step', '%s' % (step), '--start', cur_time,
26 | 'DS:metric:%s:600:0:U' % (counter_type),
27 | 'RRA:AVERAGE:0.5:1:600',
28 | 'RRA:AVERAGE:0.5:6:700',
29 | 'RRA:AVERAGE:0.5:24:775',
30 | 'RRA:AVERAGE:0.5:288:797',
31 | 'RRA:MAX:0.5:1:600',
32 | 'RRA:MAX:0.5:6:700',
33 | 'RRA:MAX:0.5:24:775',
34 | 'RRA:MAX:0.5:444:797',
35 | 'RRA:MIN:0.5:1:600',
36 | 'RRA:MIN:0.5:6:700',
37 | 'RRA:MIN:0.5:24:775',
38 | 'RRA:MIN:0.5:444:797',
39 | )
40 |
41 | if rrd:
42 | print(rrd)
43 |
44 |
45 | def rrd_update(rrdname, rx):
46 | start_time = int(time.time())
47 | print(rrdname, start_time, type(start_time), rx, type(rx))
48 | x = rrdtool.updatev(rrdname, "%s:%s" % (str(start_time), str(rx)))
49 | if x:
50 | print(x)
--------------------------------------------------------------------------------
/transfer/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/transfer/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | from django.conf.urls import url
4 |
5 | from transfer.views import HostInfoView, ItemDataReportView
6 |
7 |
8 | urlpatterns = [
9 | url(r'api/host/report/$', HostInfoView.as_view(), name='host_report'),
10 | url(r'api/items/report/$', ItemDataReportView.as_view(), name='item_report'),
11 | ]
--------------------------------------------------------------------------------
/transfer/views.py:
--------------------------------------------------------------------------------
1 | import os
2 | import time
3 |
4 | from django.shortcuts import render
5 | from django.http import HttpResponse
6 | from django.conf import settings
7 | from rest_framework.response import Response
8 | from rest_framework.views import APIView
9 | from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_200_OK
10 |
11 | from common.models import Host
12 | from transfer.rrdtool_action import rrd_init_or_update
13 |
14 |
15 | class HostInfoView(APIView):
16 | permission_classes = []
17 |
18 | def post(self, request):
19 | data = request.data
20 | if Host.objects.get(hostname=data['hostname']):
21 | return HttpResponse('host exist!!', HTTP_200_OK)
22 | try:
23 | Host.objects.create(hostname=data['hostname'],
24 | ipaddress=data['ipaddress'],
25 | macaddress=data['macaddress'],
26 | os_type=data['os_type'],
27 | os_version=data['os_version'],
28 | )
29 | except:
30 | return HttpResponse('host create failed!!', HTTP_400_BAD_REQUEST)
31 | return HttpResponse('host create success!!', HTTP_200_OK)
32 |
33 |
34 | class ItemDataReportView(APIView):
35 | permission_classes = []
36 |
37 | def post(self, request):
38 | data = request.data
39 | print(data)
40 | endpoint = data['host']['hostname']
41 | # print(endpoint)
42 | # if not Host.objects.get(hostname=data['host']['hostname']):
43 | # Host.objects.update_or_create(hostname=data['host']['hostname'],
44 | # ipaddress=data['host']['ipaddress'],
45 | # macaddress=data['host']['macaddress'],
46 | # os_type=data['host']['os_type'],
47 | # os_version=data['host']['os_version'],
48 | # )
49 |
50 | base_dir = os.path.join(settings.BASE_DIR, "rrddatas")
51 | rrd_dir = os.path.join(base_dir, endpoint)
52 | print(rrd_dir)
53 | if not os.path.isdir(rrd_dir):
54 | os.makedirs(rrd_dir)
55 | for k, v in data['items'].items():
56 | rrdname = k + '.rrd'
57 | rrd_init_or_update(rrdname, v['value'], v['step'], v['counterType'], rrd_dir)
58 | return HttpResponse('insert success!!', HTTP_200_OK)
59 |
--------------------------------------------------------------------------------
/users/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liuhuipy/lh-falcon/181ec242c625f336711e4c99db97d45157fa1ecf/users/__init__.py
--------------------------------------------------------------------------------
/users/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/users/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class UsersConfig(AppConfig):
5 | name = 'users'
6 |
--------------------------------------------------------------------------------
/users/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liuhuipy/lh-falcon/181ec242c625f336711e4c99db97d45157fa1ecf/users/migrations/__init__.py
--------------------------------------------------------------------------------
/users/models.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | from django.db import models
4 | from django.contrib.auth.models import AbstractUser
5 |
6 |
7 | class UserGroup(models.Model):
8 | name = models.CharField(max_length=64, unique=True, verbose_name='用户组名')
9 | description = models.TextField(max_length=200, null=True, blank=True, verbose_name='描述')
10 |
11 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
12 | update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
13 |
14 | class Meta:
15 | verbose_name = '用户组'
16 | verbose_name_plural = verbose_name
17 |
18 | def __str__(self):
19 | return self.name
20 |
21 |
22 | class User(AbstractUser):
23 | email = models.EmailField(max_length=255,unique=True, blank=True, null=True, verbose_name='邮箱')
24 | username = models.CharField(max_length=32,unique=True, verbose_name='用户名')
25 | password = models.CharField(max_length=128,verbose_name='密码')
26 | phone = models.CharField(max_length=11, blank=True, null=True, verbose_name='电话')
27 | image = models.ImageField(max_length=128, upload_to='user_images/%Y/%m/%d', blank=True, null=True,
28 | default='default.png', verbose_name='头像')
29 | user_group = models.ManyToManyField(UserGroup, related_name='user_group', verbose_name='用户组')
30 | is_superuser = models.BooleanField(default=False, verbose_name='是否为超级管理员')
31 | is_staff = models.BooleanField(default=False, verbose_name='是否为管理员')
32 | is_active = models.BooleanField(default=True, verbose_name='是否激活')
33 | is_online = models.BooleanField(default=False, verbose_name='是否在线')
34 |
35 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
36 | update_time = models.DateTimeField(blank=True, null=True, verbose_name='修改时间')
37 |
38 | USERNAME_FIELD = 'username'
39 | REQUIRED_FIELDS = ['email']
40 |
41 | class Meta:
42 | verbose_name = '用户'
43 | verbose_name_plural = verbose_name
44 |
45 | def __str__(self):
46 | return self.username
--------------------------------------------------------------------------------
/users/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/users/urls/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 |
--------------------------------------------------------------------------------
/users/urls/api_urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | from django.conf.urls import url, include
4 | from rest_framework import routers
5 |
6 | # from ..api import UserViewSet, UserGroupViewSet
7 | #
8 | # router = routers.DefaultRouter()
9 | # router.register(r'users', UserViewSet, base_name='users')
10 | # router.register(r'usergroups', UserGroupViewSet, base_name='usergroups')
11 | #
12 | # urlpatterns = [
13 | # url(r'api/accounts/', include(router.urls))
14 | # ]
--------------------------------------------------------------------------------
/users/urls/view_urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | from django.conf.urls import url
4 |
5 | from users.views import user, usergroup
6 |
7 | urlpatterns = [
8 | url(r'login/$', user.LoginView.as_view(), name='login'),
9 | url(r'logout/$', user.LogoutView.as_view(), name='logout'),
10 |
11 | # user action url
12 | url(r'user/list/$', user.UserListView.as_view(), name='user_list'),
13 | url(r'user/add/$', user.UserAddView.as_view(), name='user_add'),
14 | url(r'user/detail/(?P
\d+)/$', user.UserDetailView.as_view(), name='user_detail'),
15 | url(r'user/edit/(?P\d+)/$', user.UserUpdateView.as_view(), name='user_edit'),
16 | url(r'user/del/(?P\d+)/$', user.UserDelView.as_view(), name='user_del'),
17 | url(r'user/search/$', user.SearchUserView.as_view(), name='user_search'),
18 |
19 | # usergroup action url
20 | url(r'usergroup/list/$', usergroup.UserGroupListView.as_view(), name='usergroup_list'),
21 | url(r'usergroup/add/$', usergroup.UserGroupAddView.as_view(), name='usergroup_add'),
22 | url(r'usergroup/detail/(?P\d+)/$', usergroup.UserGroupDetailView.as_view(), name='usergroup_detail'),
23 | url(r'usergroup/edit/(?P\d+)/$', usergroup.UserGroupUpdateView.as_view(), name='usergroup_edit'),
24 | url(r'usergroup/del/(?P\d+)/$', usergroup.UserGroupDelView.as_view(), name='usergroup_del'),
25 | url(r'usergroup/search/$', usergroup.SearchUserGroupView.as_view(), name='usergroup_search')
26 | ]
--------------------------------------------------------------------------------
/users/views/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding:utf-8 -*-
3 |
4 | __author__ = 'liuhui'
5 |
--------------------------------------------------------------------------------
/users/views/usergroup.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | from django.views.generic import ListView, DetailView, UpdateView, CreateView, DeleteView, View
4 | from django.db.models import Q
5 | from django.urls import reverse_lazy
6 |
7 | from common.mixins import BaseMixin, ActionPermissionRequiredMixin
8 | from users.models import UserGroup
9 | from users.forms import UserGroupForm
10 |
11 |
12 | class UserGroupListView(BaseMixin, ActionPermissionRequiredMixin, ListView):
13 | model = UserGroup
14 | template_name = 'users/usergroup_list.html'
15 | context_object_name = 'usergroup_list'
16 | paginate_by = 2
17 |
18 | def get_queryset(self):
19 | usergroup_list = UserGroup.objects.order_by('-create_time')
20 | return usergroup_list
21 |
22 | def get_context_data(self, **kwargs):
23 | kwargs['paginate_by'] = self.paginate_by
24 | return super(UserGroupListView, self).get_context_data(**kwargs)
25 |
26 |
27 | class UserGroupAddView(BaseMixin, ActionPermissionRequiredMixin, CreateView):
28 | template_name = 'users/usergroup_add.html'
29 | form_class = UserGroupForm
30 | success_url = reverse_lazy('users:usergroup_list')
31 | success_message = '用户组添加成功!'
32 |
33 |
34 | class UserGroupDetailView(BaseMixin, ActionPermissionRequiredMixin, DetailView):
35 | model = UserGroup
36 | template_name = 'users/usergroup_detail.html'
37 | context_object_name = 'usergroup'
38 | pk_url_kwarg = 'usergroup_id'
39 |
40 |
41 | class UserGroupUpdateView(BaseMixin, ActionPermissionRequiredMixin, UpdateView):
42 | model = UserGroup
43 | template_name = 'users/usergroup_edit.html'
44 | form_class = UserGroupForm
45 | pk_url_kwarg = 'usergroup_id'
46 | success_url = reverse_lazy('users:usergroup_list')
47 | success_message = '修改用户组信息成功!'
48 |
49 |
50 | class UserGroupDelView(BaseMixin, ActionPermissionRequiredMixin, DeleteView):
51 | model = UserGroup
52 | pk_url_kwarg = 'usergroup_id'
53 | success_url = reverse_lazy('users:usergroup_list')
54 |
55 |
56 | class SearchUserGroupView(UserGroupListView):
57 |
58 | def get_queryset(self):
59 | q = self.request.GET.get('q', '')
60 | if q:
61 | usergroup_list = UserGroup.objects.filter(Q(name__contains=q)).order_by('-create_time')
62 | else:
63 | usergroup_list = UserGroup.objects.order_by('-create_time')
64 | return usergroup_list
65 |
--------------------------------------------------------------------------------