Skip to content

Commit e4867b5

Browse files
committed
整合系统操作日志
1 parent 7d92d12 commit e4867b5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+708
-443
lines changed
136 Bytes
Binary file not shown.
104 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

Ops/celery.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
Queue('ansible', Exchange('ansible', type='direct'), routing_key='ansible'),
2525
Queue('fort', Exchange('fort', type='direct'), routing_key='fort'),
2626
Queue('plan', Exchange('plan', type='direct'), routing_key='plan'),
27+
Queue('commons', Exchange('commons', type='direct'), routing_key='commons'),
2728
)
2829

2930
app.conf.task_default_queue = 'default'

Ops/settings.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
'assets.tasks.*': {'queue': 'default', 'routing_key': 'default'},
5454
'task.tasks.*': {'queue': 'ansible', 'routing_key': 'ansible'},
5555
'fort.tasks.*': {'queue': 'fort', 'routing_key': 'fort'},
56+
'commons.tasks.*': {'queue': 'commons', 'routing_key': 'commons'},
5657
}
5758

5859
# 执行ansible命令使用的redis信息
@@ -62,9 +63,12 @@
6263
REDIS_PASSWORD = None
6364

6465
# mongodb配置信息
65-
MONGODB_HOST = '127.0.0.1'
66+
MONGODB_HOST = '10.1.7.198'
6667
MONGODB_PORT = 27017
67-
COMMANDS_DB = 'commands'
68+
MONGODB_USER = 'admin'
69+
MONGODB_PASS = '123456'
70+
RECORD_DB = 'records'
71+
RECORD_COLL = 'ops'
6872

6973
# Application definition
7074
INSTALLED_APPS = [
@@ -88,6 +92,7 @@
8892
'wiki.apps.WikiConfig',
8993
'haystack.apps.HaystackConfig',
9094
'dbmanager.apps.DbmanagerConfig',
95+
'commons.apps.CommonsConfig',
9196
]
9297

9398
# 全局搜索配置

Ops/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
from django.urls import path, include, re_path
1717
from django.views.static import serve
1818
from django.conf import settings
19-
from Ops import views
19+
from commons import views
2020

2121
urlpatterns = [
2222
path('', views.dashboard, name='dashboard'),
2323
path(r'login/', views.login, name='login'),
2424
path(r'create_code/', views.gen_code_img, name='create_code'),
2525
path(r'logout/', views.logout, name='logout'),
2626
path(r'lock_screen/', views.lock_screen, name='lock_screen'),
27+
path(r'system_log/', views.system_log, name='system_log'),
28+
path(r'get_system_log/', views.get_system_log, name='get_system_log'),
2729
path(r'api/', include('api.urls')),
2830
path(r'run/', include('task.urls')),
2931
path(r'users/', include('users.urls')),
-658 Bytes
Binary file not shown.
-88 Bytes
Binary file not shown.
-496 Bytes
Binary file not shown.

api/serializers.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from task.models import AnsibleInventory
44
from rest_framework import serializers
55
from assets.models import *
6-
from users.models import UserProfile, UserLog
6+
from users.models import UserProfile
77
from django.contrib.auth.models import Permission, Group
88
from utils.crypt_pwd import CryptPwd
99
from fort.models import *
@@ -194,18 +194,6 @@ class Meta:
194194
fields = ('id', 'name', 'user_set', 'permissions')
195195

196196

197-
class UserLogSerializer(serializers.ModelSerializer):
198-
class Meta:
199-
model = UserLog
200-
fields = '__all__'
201-
202-
203-
class AssetsLogSerializer(serializers.ModelSerializer):
204-
class Meta:
205-
model = AssetsLog
206-
fields = '__all__'
207-
208-
209197
class InventorySerializer(serializers.ModelSerializer):
210198
class Meta:
211199
model = AnsibleInventory

api/urls.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
router.register(r'users', views.UsersViewSet)
2121
router.register(r'permission', views.PermissionViewSet)
2222
router.register(r'group', views.GroupViewSet)
23-
router.register(r'user_log', views.UserLogViewSet)
24-
router.register(r'assets_log', views.AssetsLogViewSet)
2523
router.register(r'fort', views.FortViewSet)
2624
router.register(r'fort_user', views.FortUserViewSet)
2725
router.register(r'periodic_task', views.PeriodicTaskViewSet)

api/views.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,6 @@ class GroupViewSet(viewsets.ModelViewSet):
107107
permission_classes = (permissions.IsAuthenticated,)
108108

109109

110-
class UserLogViewSet(viewsets.ModelViewSet):
111-
queryset = UserLog.objects.all().order_by('id')
112-
serializer_class = UserLogSerializer
113-
permission_classes = (permissions.IsAuthenticated,)
114-
115-
116-
class AssetsLogViewSet(viewsets.ModelViewSet):
117-
queryset = AssetsLog.objects.all().order_by('id')
118-
serializer_class = AssetsLogSerializer
119-
permission_classes = (permissions.IsAuthenticated,)
120-
121-
122110
class FortViewSet(viewsets.ModelViewSet):
123111
queryset = FortServer.objects.all().order_by('id')
124112
serializer_class = FortSerializer
-636 Bytes
Binary file not shown.

assets/models.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -251,19 +251,6 @@ class Meta:
251251
verbose_name_plural = '机柜表'
252252

253253

254-
class AssetsLog(models.Model):
255-
user = models.ForeignKey('users.UserProfile', related_name='asset_log', verbose_name='操作用户',
256-
on_delete=models.PROTECT)
257-
remote_ip = models.GenericIPAddressField(verbose_name='操作用户IP')
258-
content = models.CharField(max_length=100, verbose_name='操作内容')
259-
c_time = models.DateTimeField(auto_now_add=True, verbose_name='操作时间')
260-
261-
class Meta:
262-
db_table = 'ops_assets_log'
263-
verbose_name = '资产管理操作记录表'
264-
verbose_name_plural = '资产管理操作记录表'
265-
266-
267254
class AdminRecord(models.Model):
268255
record_modes = (
269256
('ssh', 'ssh'),

assets/tasks.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,8 @@
1111
-------------------------------------------------
1212
"""
1313
import json
14-
import logging
1514
from Ops.celery import app
16-
from assets.models import AssetsLog
17-
from conf.logger import user_logger
18-
19-
20-
@app.task
21-
def assets_record(user, remote_ip, content):
22-
try:
23-
AssetsLog.objects.create(
24-
user=user,
25-
remote_ip=remote_ip,
26-
content=content,
27-
)
28-
except Exception as e:
29-
user_logger.error('添加用户操作记录失败,原因:{}'.format(e))
15+
from conf.logger import fort_logger
3016

3117

3218
@app.task
@@ -43,4 +29,4 @@ def admin_file(filename, txts, header=None):
4329
for txt in txts:
4430
f.write(txt)
4531
except Exception as e:
46-
logging.getLogger().error('添加用户操作记录文件失败,原因:{}'.format(e))
32+
fort_logger.error('添加用户操作记录文件失败,原因:{}'.format(e))

assets/urls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
path(r'add_asset/', views.add_asset, name='add_asset'),
1111
path(r'add_base_asset/', views.add_base_asset, name='add_base_asset'),
1212
re_path(r'update_asset/(?P<asset_type>(.*?))/(?P<pk>[0-9]+)/', views.update_asset, name='update_asset'),
13-
path(r'assets_log/', views.get_assets_log, name='assets_log'),
1413
path(r'server_facts/', views.server_facts, name='server_facts'),
1514
re_path(r'get_server_info/(?P<pk>[0-9]+)/', views.get_asset_info, name='get_asset_info'),
1615
path(r'import_assets/', views.import_assets, name='import_assets'),

assets/views.py

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def get_assets_charts(request):
6464
if m.get('software_type') == n[0]:
6565
data_detail.append({'asset_type': n[1], 'dcount': m.get('dcount')})
6666

67-
asset_logs = AssetsLog.objects.select_related('user').all().order_by('-c_time')[:5]
67+
admin_records = AdminRecord.objects.select_related('admin_login_user').all().order_by('-admin_start_time')[:5]
6868

6969
return render(request, 'assets/assets_charts.html', locals())
7070

@@ -117,8 +117,9 @@ def update_asset(request, asset_type, pk):
117117
asset_admins = UserProfile.objects.all()
118118
asset_providers = AssetProvider.objects.all()
119119
asset_idcs = IDC.objects.all()
120-
password = CryptPwd().decrypt_pwd(asset.serverassets.password)
121-
server_assets = ServerAssets.objects.select_related('assets')
120+
if asset_type == 'server':
121+
password = CryptPwd().decrypt_pwd(asset.serverassets.password)
122+
server_assets = ServerAssets.objects.select_related('assets')
122123
return render(request, 'assets/update_asset.html', locals())
123124
elif request.method == 'POST':
124125
if asset_type == 'server':
@@ -141,33 +142,6 @@ def update_asset(request, asset_type, pk):
141142
return JsonResponse({'code': 200, 'msg': '修改成功'})
142143

143144

144-
@permission_required('assets.add_assetslog', raise_exception=True)
145-
def get_assets_log(request):
146-
if request.method == 'GET':
147-
assets_logs = AssetsLog.objects.all()
148-
return render(request, 'assets/assets_log.html', locals())
149-
elif request.method == 'POST':
150-
start_time = request.POST.get('startTime')
151-
end_time = request.POST.get('endTime')
152-
new_end_time = datetime.datetime.strptime(end_time, '%Y-%m-%d') + datetime.timedelta(1)
153-
end_time = new_end_time.strftime('%Y-%m-%d')
154-
try:
155-
records = []
156-
assets_logs = AssetsLog.objects.filter(c_time__gt=start_time, c_time__lt=end_time)
157-
for assets_log in assets_logs:
158-
record = {
159-
'id': assets_log.id,
160-
'user': assets_log.user.username,
161-
'remote_ip': assets_log.remote_ip,
162-
'content': assets_log.content,
163-
'c_time': assets_log.c_time
164-
}
165-
records.append(record)
166-
return JsonResponse({'code': 200, 'records': records})
167-
except Exception as e:
168-
return JsonResponse({'error': '查询失败:{}'.format(e)})
169-
170-
171145
@permission_required('assets.add_assets', raise_exception=True)
172146
def server_facts(request):
173147
if request.method == 'POST':
@@ -384,6 +358,7 @@ def guacamole_terminal(request, pk):
384358
return render(request, 'assets/admin_guacamole.html', locals())
385359

386360

361+
# 已整合至系统日志
387362
@admin_auth
388363
def login_record(request):
389364
if request.method == 'GET':

commons/__init__.py

Whitespace-only changes.

commons/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.

commons/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class CommonsConfig(AppConfig):
5+
name = 'commons'

commons/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.db import models
2+
3+
# Create your models here.

commons/tasks.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
-------------------------------------------------
4+
File Name: tasks
5+
Description:
6+
Author: Administrator
7+
date: 2019-07-05
8+
-------------------------------------------------
9+
Change Activity:
10+
2019-07-05:
11+
-------------------------------------------------
12+
"""
13+
from __future__ import absolute_import, unicode_literals
14+
import json
15+
import requests
16+
import datetime
17+
from Ops.celery import app
18+
from django.conf import settings
19+
from utils.wx_alert import WxApi
20+
21+
22+
@app.task
23+
def get_login_info(login_user, login_ip, login_status):
24+
"""
25+
获取登录登录信息
26+
:param login_user:
27+
:param login_ip:
28+
:param login_status:
29+
:return:
30+
"""
31+
url = f'http://ip-api.com/json/{login_ip}?lang=zh-CN'
32+
r = requests.get(url=url)
33+
wx = WxApi('XXXXXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
34+
35+
if r.status_code == 200:
36+
info = json.loads(r.text)
37+
if info.get('status') == 'fail':
38+
content = '用户{}于{}尝试登录系统\n结果:{}\n登录IP:{}\n'.format(login_user,
39+
datetime.datetime.now().strftime(settings.TIME_FORMAT),
40+
login_status, login_ip)
41+
else:
42+
content = '用户{}于{}尝试登录系统\n结果:{}\n登录IP:{}\n登录国家:{}\n登录省市:{}\n登录城市:{}\n'.format(login_user,
43+
datetime.datetime.now().strftime(
44+
settings.TIME_FORMAT),
45+
login_status, login_ip,
46+
info.get('country'),
47+
info.get('regionName'),
48+
info.get('city'))
49+
else:
50+
content = '用户{}于{}尝试登录系统\n结果:{}\n登录IP:{}\n'.format(login_user,
51+
datetime.datetime.now().strftime(settings.TIME_FORMAT),
52+
login_status, login_ip)
53+
wx.send_msg(subject='系统ops.juren.com登录提醒【重要】', content=content)

commons/tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.

0 commit comments

Comments
 (0)