diff --git a/connect.py b/connect.py index 95b801804..0c6e8134d 100755 --- a/connect.py +++ b/connect.py @@ -117,6 +117,7 @@ def log_record(username, host): raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir) log = Log(user=username, host=host, log_path=log_file_path, start_time=datetime.now(), pid=pid) + log_file.write('Starttime is %s\n' % datetime.now()) log.save() return log_file, log @@ -159,6 +160,7 @@ def posix_shell(chan, username, host): finally: timestamp_end = time.time() termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty) + log_file.write('Endtime is %s' % datetime.now()) log_file.close() log.is_finished = True log.log_finished = False diff --git a/docs/AddUserAsset.py b/docs/AddUserAsset.py index 72cbed46c..e53772d83 100644 --- a/docs/AddUserAsset.py +++ b/docs/AddUserAsset.py @@ -114,7 +114,7 @@ if __name__ == '__main__': test_add_idc() test_add_asset_group() test_add_asset() - # test_add_log() + test_add_log() diff --git a/jasset/urls.py b/jasset/urls.py index 602ed6a69..ae8b89612 100644 --- a/jasset/urls.py +++ b/jasset/urls.py @@ -11,6 +11,7 @@ urlpatterns = patterns('', url(r"^(\d+.\d+.\d+.\d+)/$", jlist_ip), url(r'^idc_add/$', add_idc), url(r'^idc_list/$', list_idc), + url(r'^idc_edit/$', edit_idc), url(r'^idc_detail/$', detail_idc), url(r'^idc_del/(\w+)/$', del_idc), url(r'^jgroup_add/$', add_group), diff --git a/jasset/views.py b/jasset/views.py index 2b8b4bbda..3d16b588c 100644 --- a/jasset/views.py +++ b/jasset/views.py @@ -22,7 +22,8 @@ def index(request): def f_add_host(ip, port, idc, jtype, group, active, comment, username='', password=''): groups = [] idc = IDC.objects.get(name=idc) - if type == 'M': + if jtype == 'M': + print username, password a = Asset(ip=ip, port=port, login_type=jtype, idc=idc, is_active=int(active), @@ -135,7 +136,15 @@ def batch_host_edit(request): j_active = request.POST.get(j_active).strip() j_comment = request.POST.get(j_comment).strip() - jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_active, j_comment) + if j_type == 'M': + j_user = "editable[" + str(i) + "][j_user]" + j_password = "editable[" + str(i) + "][j_password]" + j_user = request.POST.get(j_user).strip() + password = request.POST.get(j_password).strip() + j_password = cryptor.encrypt(password) + jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_active, j_comment, j_user, j_password) + else: + jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_active, j_comment) return render_to_response('jasset/host_list.html') @@ -143,8 +152,15 @@ def batch_host_edit(request): def list_host(request): header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机' login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'} - posts = Asset.objects.all().order_by('ip') - contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + keyword = request.GET.get('keyword', '') + if keyword: + posts = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) | + Q(bis_group__name__contains=keyword) | Q(comment__contains=keyword)).distinct().order_by('ip') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + + else: + posts = Asset.objects.all().order_by('ip') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request)) @@ -192,8 +208,11 @@ def host_edit(request): a = Asset.objects.get(id=int(offset)) if j_type == 'M': + if post.password == request.POST.get('j_password'): + j_password = post.password + else: + j_password = cryptor.encrypt(request.POST.get('j_password')) j_user = request.POST.get('j_user') - j_password = cryptor.encrypt(request.POST.get('j_password')) a.ip = j_ip a.port = j_port a.login_type = j_type @@ -245,11 +264,43 @@ def add_idc(request): def list_idc(request): header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC' - posts = IDC.objects.all().order_by('id') + keyword = request.GET.get('keyword', '') + if keyword: + posts = IDC.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword)) + else: + posts = IDC.objects.all().order_by('id') contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) return render_to_response('jasset/idc_list.html', locals(), context_instance=RequestContext(request)) +def edit_idc(request): + header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC' + edit = 1 + idc_id = request.GET.get('id') + j_idc = IDC.objects.get(id=idc_id) + default = IDC.objects.get(name='默认').asset_set.all() + eposts = contact_list = Asset.objects.filter(idc=j_idc).order_by('ip') + posts = [g for g in default if g not in eposts] + if request.method == 'POST': + j_group = request.POST.get('j_idc') + j_hosts = request.POST.getlist('j_hosts') + j_comment = request.POST.get('j_comment') + idc_default = request.POST.getlist('idc_default') + + for host in j_hosts: + g = Asset.objects.get(id=host) + Asset.objects.filter(id=host).update(idc=j_idc) + + for host in idc_default: + g = Asset.objects.get(id=host) + i = IDC.objects.get(name='默认') + Asset.objects.filter(id=host).update(idc=i) + + return HttpResponseRedirect('/jasset/idc_detail/?id=%s' % idc_id) + + return render_to_response('jasset/idc_add.html', locals(), context_instance=RequestContext(request)) + + def del_idc(request, offset): if offset == 'multi': len_list = request.POST.get("len_list") @@ -287,7 +338,11 @@ def add_group(request): def list_group(request): header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组' - posts = BisGroup.objects.filter(type='A').order_by('id') + keyword = request.GET.get('keyword', '') + if keyword: + posts = BisGroup.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword)) + else: + posts = BisGroup.objects.filter(type='A').order_by('id') contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) return render_to_response('jasset/group_list.html', locals(), context_instance=RequestContext(request)) @@ -374,8 +429,6 @@ def group_del(request, offset): return HttpResponseRedirect('/jasset/jgroup_list/') - - def host_search(request): keyword = request.GET.get('keyword') login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'} diff --git a/jlog/views.py b/jlog/views.py index 62a7071a0..f6b3744aa 100644 --- a/jlog/views.py +++ b/jlog/views.py @@ -18,18 +18,30 @@ CONF.read('%s/jumpserver.conf' % BASE_DIR) def log_list_online(request): header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户' + keyword = request.GET.get('keyword') web_socket_host = CONF.get('websocket', 'web_socket_host') - posts = Log.objects.filter(is_finished=0).order_by('-start_time') - contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + if keyword: + posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \ + .filter(is_finished=0).order_by('-start_time') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + else: + posts = Log.objects.filter(is_finished=0).order_by('-start_time') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) return render_to_response('jlog/log_online.html', locals()) def log_list_offline(request): header_title, path1, path2 = u'查看日志', u'查看日志', u'历史记录' + keyword = request.GET.get('keyword') web_socket_host = CONF.get('websocket', 'web_socket_host') - posts = Log.objects.filter(is_finished=1).order_by('-start_time') - contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + if keyword: + posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \ + .filter(is_finished=1).order_by('-start_time') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) + else: + posts = Log.objects.filter(is_finished=1).order_by('-start_time') + contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) return render_to_response('jlog/log_offline.html', locals()) diff --git a/jumpserver/api.py b/jumpserver/api.py index 074667eb8..4e64c6a81 100644 --- a/jumpserver/api.py +++ b/jumpserver/api.py @@ -1,8 +1,13 @@ #coding: utf-8 from django.http import HttpResponseRedirect +import json + +from django.http import HttpResponse + from juser.models import User, UserGroup from jasset.models import Asset, BisGroup +from jlog.models import Log def user_perm_group_api(user): @@ -85,3 +90,10 @@ def is_group_admin(request): return True else: return False + +def api_user(request): + hosts = Log.objects.filter(is_finished=0).count() + users = Log.objects.filter(is_finished=0).values('user').distinct().count() + ret = {'users': users, 'hosts': hosts} + json_data = json.dumps(ret) + return HttpResponse(json_data) diff --git a/jumpserver/urls.py b/jumpserver/urls.py index 80fc8cf5b..86773da4f 100644 --- a/jumpserver/urls.py +++ b/jumpserver/urls.py @@ -6,7 +6,7 @@ urlpatterns = patterns('', # url(r'^$', 'jumpserver.views.home', name='home'), # url(r'^blog/', include('blog.urls')), (r'^$', 'jumpserver.views.index'), - (r'^api/user/$', 'jumpserver.views.api_user'), + (r'^api/user/$', 'jumpserver.api.api_user'), (r'^skin_config/$', 'jumpserver.views.skin_config'), (r'^install/$', 'jumpserver.views.install'), (r'^base/$', 'jumpserver.views.base'), diff --git a/jumpserver/views.py b/jumpserver/views.py index 6058e1708..d67445df5 100644 --- a/jumpserver/views.py +++ b/jumpserver/views.py @@ -46,7 +46,7 @@ def getDaysByNum(num): for i in range(0, num): today = today-oneday li_date.append(today) - li_str.append(str(today)[0:10]) + li_str.append(str(today)[5:10]) li_date.reverse() li_str.reverse() t = (li_date, li_str) @@ -102,12 +102,6 @@ def index(request): return render_to_response('index.html', locals(), context_instance=RequestContext(request)) -def api_user(request): - users = Log.objects.filter(is_finished=0).count() - ret = {'users': users} - return HttpResponse(json.dumps(ret)) - - def skin_config(request): return render_to_response('skin_config.html') @@ -131,7 +125,7 @@ def page_list_return(total, current=1): return range(min_page, max_page+1) -def jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_active, j_comment): +def jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_active, j_comment, j_user='', j_password=''): groups = [] is_active = {u'是': '1', u'否': '2'} login_types = {'LDAP': 'L', 'SSH_KEY': 'S', 'PASSWORD': 'P', 'MAP': 'M'} diff --git a/log_handler.py b/log_handler.py index 16fbf49ed..f64445cd4 100755 --- a/log_handler.py +++ b/log_handler.py @@ -2,6 +2,7 @@ #coding: utf-8 import os +import re import time import psutil from datetime import datetime @@ -15,14 +16,21 @@ from jlog.models import Log def log_hanler(id): log = Log.objects.get(id=id) + pattern = re.compile(r'\[.*@.*\][\$#].*') if log: filename = log.log_path if os.path.isfile(filename): - ret1 = os.system('cat %s | grep "DateTime" > %s.his' % (filename, filename)) - ret2 = os.system('cat %s | grep "\[.*@.*\][\$\#]" >> %s.his' % (filename, filename)) - ret3 = os.system('cat %s | grep "EndTime" >> %s.his' % (filename, filename)) - if (ret1 + ret2 + ret3) == 0: - print 'Handler %s ok.' % filename + f_his = filename + '.his' + f1 = open(filename) + f2 = open(f_his, 'a') + lines = f1.readlines() + for line in lines[7:]: + match = pattern.match(line) + if match: + newline = re.sub('\[[A-Z]', '', line) + f2.write(newline) + f1.close() + f2.close() log.log_finished = True log.save() diff --git a/templates/index.html b/templates/index.html index d676a84e7..14e55a745 100644 --- a/templates/index.html +++ b/templates/index.html @@ -35,10 +35,10 @@
- - -