mirror of https://github.com/jumpserver/jumpserver
pull/6/head
parent
ef63fce7c4
commit
bb94cfc7a1
67
connect.py
67
connect.py
|
@ -3,6 +3,7 @@
|
||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import ast
|
import ast
|
||||||
import select
|
import select
|
||||||
import time
|
import time
|
||||||
|
@ -23,7 +24,7 @@ from django.core.exceptions import ObjectDoesNotExist
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
|
||||||
django.setup()
|
django.setup()
|
||||||
from juser.models import User
|
from juser.models import User
|
||||||
from jasset.models import Asset
|
from jasset.models import AssetAlias
|
||||||
from jlog.models import Log
|
from jlog.models import Log
|
||||||
from jumpserver.api import *
|
from jumpserver.api import *
|
||||||
try:
|
try:
|
||||||
|
@ -98,7 +99,7 @@ def log_record(username, host):
|
||||||
today_connect_log_dir = os.path.join(connect_log_dir, today)
|
today_connect_log_dir = os.path.join(connect_log_dir, today)
|
||||||
log_filename = '%s_%s_%s.log' % (username, host, time_now)
|
log_filename = '%s_%s_%s.log' % (username, host, time_now)
|
||||||
log_file_path = os.path.join(today_connect_log_dir, log_filename)
|
log_file_path = os.path.join(today_connect_log_dir, log_filename)
|
||||||
dept_name = User.objects.get(username=username).dept
|
dept_name = User.objects.get(username=username).dept.name
|
||||||
pid = os.getpid()
|
pid = os.getpid()
|
||||||
ip_list = []
|
ip_list = []
|
||||||
remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines()
|
remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines()
|
||||||
|
@ -160,7 +161,6 @@ def posix_shell(chan, username, host):
|
||||||
chan.send(x)
|
chan.send(x)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
timestamp_end = time.time()
|
|
||||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
|
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
|
||||||
log_file.write('Endtime is %s' % datetime.now())
|
log_file.write('Endtime is %s' % datetime.now())
|
||||||
log_file.close()
|
log_file.close()
|
||||||
|
@ -168,14 +168,20 @@ def posix_shell(chan, username, host):
|
||||||
log.log_finished = False
|
log.log_finished = False
|
||||||
log.end_time = datetime.now()
|
log.end_time = datetime.now()
|
||||||
log.save()
|
log.save()
|
||||||
|
print_prompt()
|
||||||
|
|
||||||
|
|
||||||
def get_user_host(username):
|
def get_user_host(username):
|
||||||
"""Get the hosts of under the user control."""
|
"""Get the hosts of under the user control."""
|
||||||
hosts_attr = {}
|
hosts_attr = {}
|
||||||
asset_all = user_perm_asset_api(username)
|
asset_all = user_perm_asset_api(username)
|
||||||
|
user = User.objects.get(username=username)
|
||||||
for asset in asset_all:
|
for asset in asset_all:
|
||||||
hosts_attr[asset.ip] = [asset.id, asset.comment]
|
alias = AssetAlias.objects.filter(user=user, host=asset)
|
||||||
|
if alias and alias[0].alias != '':
|
||||||
|
hosts_attr[asset.ip] = [asset.id, asset.ip, alias[0].alias]
|
||||||
|
else:
|
||||||
|
hosts_attr[asset.ip] = [asset.id, asset.ip, asset.comment]
|
||||||
return hosts_attr
|
return hosts_attr
|
||||||
|
|
||||||
|
|
||||||
|
@ -188,6 +194,20 @@ def get_user_hostgroup(username):
|
||||||
return groups_attr
|
return groups_attr
|
||||||
|
|
||||||
|
|
||||||
|
def get_user_hostgroup_host(username, gid):
|
||||||
|
"""Get the hostgroup hosts of under the user control."""
|
||||||
|
hosts_attr = {}
|
||||||
|
user = User.objects.get(username=username)
|
||||||
|
hosts = user_perm_group_hosts_api(gid)
|
||||||
|
for host in hosts:
|
||||||
|
alias = AssetAlias.objects.filter(user=user, host=host)
|
||||||
|
if alias and alias[0].alias != '':
|
||||||
|
hosts_attr[host.ip] = [host.id, host.ip, alias[0].alias]
|
||||||
|
else:
|
||||||
|
hosts_attr[host.ip] = [host.id, host.ip, host.comment]
|
||||||
|
return hosts_attr
|
||||||
|
|
||||||
|
|
||||||
def get_connect_item(username, ip):
|
def get_connect_item(username, ip):
|
||||||
|
|
||||||
asset = get_object(Asset, ip=ip)
|
asset = get_object(Asset, ip=ip)
|
||||||
|
@ -219,13 +239,16 @@ def get_connect_item(username, ip):
|
||||||
|
|
||||||
|
|
||||||
def verify_connect(username, part_ip):
|
def verify_connect(username, part_ip):
|
||||||
|
ip_matched = []
|
||||||
hosts_attr = get_user_host(username)
|
hosts_attr = get_user_host(username)
|
||||||
hosts = hosts_attr.keys()
|
hosts = hosts_attr.values()
|
||||||
ip_matched = [ip for ip in hosts if part_ip in ip]
|
for ip_info in hosts:
|
||||||
|
for info in ip_info[1:]:
|
||||||
|
if part_ip in info:
|
||||||
|
ip_matched.append(ip_info[1])
|
||||||
if len(ip_matched) > 1:
|
if len(ip_matched) > 1:
|
||||||
for ip in ip_matched:
|
for ip in ip_matched:
|
||||||
print '%s -- %s' % (ip, hosts_attr[ip][1])
|
print '%s -- %s' % (ip, hosts_attr[ip][2])
|
||||||
elif len(ip_matched) < 1:
|
elif len(ip_matched) < 1:
|
||||||
color_print('No Permission or No host.', 'red')
|
color_print('No Permission or No host.', 'red')
|
||||||
else:
|
else:
|
||||||
|
@ -238,8 +261,9 @@ def print_prompt():
|
||||||
1) Type \033[32mIP ADDRESS\033[0m To Login.
|
1) Type \033[32mIP ADDRESS\033[0m To Login.
|
||||||
2) Type \033[32mP/p\033[0m To Print The Servers You Available.
|
2) Type \033[32mP/p\033[0m To Print The Servers You Available.
|
||||||
3) Type \033[32mG/g\033[0m To Print The Server Groups You Available.
|
3) Type \033[32mG/g\033[0m To Print The Server Groups You Available.
|
||||||
4) Type \033[32mE/e\033[0m To Execute Command On Several Servers.
|
4) Type \033[32mG/g+gid\033[0m To Print The Server Group Hosts You Available.
|
||||||
5) Type \033[32mQ/q\033[0m To Quit.
|
5) Type \033[32mE/e\033[0m To Execute Command On Several Servers.
|
||||||
|
6) Type \033[32mQ/q\033[0m To Quit.
|
||||||
"""
|
"""
|
||||||
print textwrap.dedent(msg)
|
print textwrap.dedent(msg)
|
||||||
|
|
||||||
|
@ -249,14 +273,27 @@ def print_user_host(username):
|
||||||
hosts = hosts_attr.keys()
|
hosts = hosts_attr.keys()
|
||||||
hosts.sort()
|
hosts.sort()
|
||||||
for ip in hosts:
|
for ip in hosts:
|
||||||
print '%s -- %s' % (ip, hosts_attr[ip][1])
|
print '%-15s -- %s' % (ip, hosts_attr[ip][2])
|
||||||
|
|
||||||
|
|
||||||
def print_user_hostgroup(username):
|
def print_user_hostgroup(username):
|
||||||
group_attr = get_user_hostgroup(username)
|
group_attr = get_user_hostgroup(username)
|
||||||
groups = group_attr.keys()
|
groups = group_attr.keys()
|
||||||
for g in groups:
|
for g in groups:
|
||||||
print '%s -- %s' % (g, group_attr[g][1])
|
print "[%3s]%s -- %s" % (group_attr[g][0], g, group_attr[g][1])
|
||||||
|
|
||||||
|
|
||||||
|
def print_user_hostgroup_host(username, gid):
|
||||||
|
pattern = re.compile(r'\d+')
|
||||||
|
match = pattern.match(gid)
|
||||||
|
if match:
|
||||||
|
hosts_attr = get_user_hostgroup_host(username, gid)
|
||||||
|
hosts = hosts_attr.keys()
|
||||||
|
hosts.sort()
|
||||||
|
for ip in hosts:
|
||||||
|
print '%-15s -- %s' % (ip, hosts_attr[ip][2])
|
||||||
|
else:
|
||||||
|
color_print('No such group id, Please check it.', 'red')
|
||||||
|
|
||||||
|
|
||||||
def connect(username, password, host, port, login_name):
|
def connect(username, password, host, port, login_name):
|
||||||
|
@ -377,9 +414,13 @@ if __name__ == '__main__':
|
||||||
elif option in ['G', 'g']:
|
elif option in ['G', 'g']:
|
||||||
print_user_hostgroup(LOGIN_NAME)
|
print_user_hostgroup(LOGIN_NAME)
|
||||||
continue
|
continue
|
||||||
|
elif option.startswith('g') or option.startswith('G'):
|
||||||
|
gid = option[1:].strip()
|
||||||
|
print_user_hostgroup_host(LOGIN_NAME, gid)
|
||||||
|
continue
|
||||||
elif option in ['E', 'e']:
|
elif option in ['E', 'e']:
|
||||||
exec_cmd_servers(LOGIN_NAME)
|
exec_cmd_servers(LOGIN_NAME)
|
||||||
elif option in ['Q', 'q']:
|
elif option in ['Q', 'q', 'exit']:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -257,8 +257,9 @@ def view_splitter(request, su=None, adm=None):
|
||||||
raise Http404
|
raise Http404
|
||||||
|
|
||||||
|
|
||||||
def user_perm_group_api(user):
|
def user_perm_group_api(username):
|
||||||
if user:
|
if username:
|
||||||
|
user = User.objects.get(username=username)
|
||||||
perm_list = []
|
perm_list = []
|
||||||
user_group_all = user.group.all()
|
user_group_all = user.group.all()
|
||||||
for user_group in user_group_all:
|
for user_group in user_group_all:
|
||||||
|
@ -270,6 +271,14 @@ def user_perm_group_api(user):
|
||||||
return asset_group_list
|
return asset_group_list
|
||||||
|
|
||||||
|
|
||||||
|
def user_perm_group_hosts_api(gid):
|
||||||
|
hostgroup = BisGroup.objects.filter(id=gid)
|
||||||
|
if hostgroup:
|
||||||
|
return hostgroup[0].asset_set.all()
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def user_perm_asset_api(username):
|
def user_perm_asset_api(username):
|
||||||
user = User.objects.filter(username=username)
|
user = User.objects.filter(username=username)
|
||||||
if user:
|
if user:
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
from django.conf.urls import patterns, include, url
|
from django.conf.urls import patterns, include, url
|
||||||
|
from api import view_splitter
|
||||||
|
from views import index, admin_index
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
# Examples:
|
# Examples:
|
||||||
# url(r'^$', 'jumpserver.views.home', name='home'),
|
# url(r'^$', 'jumpserver.views.home', name='home'),
|
||||||
# url(r'^blog/', include('blog.urls')),
|
# url(r'^blog/', include('blog.urls')),
|
||||||
(r'^$', 'jumpserver.views.index'),
|
(r'^$', view_splitter, {'su': index, 'adm': admin_index}),
|
||||||
(r'^api/user/$', 'jumpserver.api.api_user'),
|
(r'^api/user/$', 'jumpserver.api.api_user'),
|
||||||
(r'^skin_config/$', 'jumpserver.views.skin_config'),
|
(r'^skin_config/$', 'jumpserver.views.skin_config'),
|
||||||
(r'^install/$', 'jumpserver.views.install'),
|
(r'^install/$', 'jumpserver.views.install'),
|
||||||
|
|
|
@ -45,7 +45,7 @@ def get_data(data, items, option):
|
||||||
return dic
|
return dic
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_super_user
|
||||||
def index(request):
|
def index(request):
|
||||||
users = User.objects.all()
|
users = User.objects.all()
|
||||||
hosts = Asset.objects.all()
|
hosts = Asset.objects.all()
|
||||||
|
@ -104,6 +104,69 @@ def index(request):
|
||||||
return render_to_response('index.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('index.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
@require_admin
|
||||||
|
def admin_index(request):
|
||||||
|
user_id = request.session.get('user_id', '')
|
||||||
|
user = User.objects.get(id=user_id)
|
||||||
|
dept = user.dept
|
||||||
|
dept_name = user.dept.name
|
||||||
|
users = User.objects.filter(dept=dept)
|
||||||
|
hosts = Asset.objects.filter(dept=dept)
|
||||||
|
online = Log.objects.filter(dept_name=dept_name, is_finished=0)
|
||||||
|
online_host = online.values('host').distinct()
|
||||||
|
online_user = online.values('user').distinct()
|
||||||
|
active_users = users.filter(is_active=1)
|
||||||
|
active_hosts = hosts.filter(is_active=1)
|
||||||
|
|
||||||
|
# percent of dashboard
|
||||||
|
percent_user = format(active_users.count() / users.count(), '.0%')
|
||||||
|
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
||||||
|
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
||||||
|
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
||||||
|
|
||||||
|
li_date, li_str = getDaysByNum(7)
|
||||||
|
today = datetime.datetime.now().day
|
||||||
|
from_week = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||||
|
week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()])
|
||||||
|
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
|
||||||
|
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
|
||||||
|
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
|
||||||
|
|
||||||
|
# a week data
|
||||||
|
week_users = week_data.values('user').distinct().count()
|
||||||
|
week_hosts = week_data.count()
|
||||||
|
|
||||||
|
user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5]
|
||||||
|
color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning']
|
||||||
|
|
||||||
|
# perm apply latest 10
|
||||||
|
perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
|
||||||
|
|
||||||
|
# latest 10 login
|
||||||
|
login_10 = Log.objects.order_by('-start_time')[:10]
|
||||||
|
|
||||||
|
# a week top 10
|
||||||
|
for user_info in user_top_ten:
|
||||||
|
username = user_info.get('user')
|
||||||
|
last = Log.objects.filter(user=username).latest('start_time')
|
||||||
|
user_info['last'] = last
|
||||||
|
print user_top_ten
|
||||||
|
|
||||||
|
top = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
|
||||||
|
top_dic = {}
|
||||||
|
for key, value in top.items():
|
||||||
|
li = []
|
||||||
|
for t in li_date:
|
||||||
|
year, month, day = t.year, t.month, t.day
|
||||||
|
if key != 'times':
|
||||||
|
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).values(key).distinct().count()
|
||||||
|
else:
|
||||||
|
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count()
|
||||||
|
li.append(times)
|
||||||
|
top_dic[value] = li
|
||||||
|
return render_to_response('index.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def skin_config(request):
|
def skin_config(request):
|
||||||
return render_to_response('skin_config.html')
|
return render_to_response('skin_config.html')
|
||||||
|
|
||||||
|
@ -184,28 +247,6 @@ def filter_ajax_api(request):
|
||||||
return render_to_response('filter_ajax_api.html', locals())
|
return render_to_response('filter_ajax_api.html', locals())
|
||||||
|
|
||||||
|
|
||||||
# def perm_user_asset(user_id=None, username=None):
|
|
||||||
# if user_id:
|
|
||||||
# user = User.objects.get(id=user_id)
|
|
||||||
# else:
|
|
||||||
# user = User.objects.get(username=username)
|
|
||||||
# user_groups = user.user_group.all()
|
|
||||||
# perms = []
|
|
||||||
# assets = []
|
|
||||||
# asset_groups = []
|
|
||||||
# for user_group in user_groups:
|
|
||||||
# perm = user_group.perm_set.all()
|
|
||||||
# perms.extend(perm)
|
|
||||||
#
|
|
||||||
# for perm in perms:
|
|
||||||
# asset_groups.extend(perm.asset_group.all())
|
|
||||||
#
|
|
||||||
# for asset_group in asset_groups:
|
|
||||||
# assets.extend(list(asset_group.asset_set.all()))
|
|
||||||
#
|
|
||||||
# return assets
|
|
||||||
|
|
||||||
|
|
||||||
def install(request):
|
def install(request):
|
||||||
from juser.models import DEPT, User
|
from juser.models import DEPT, User
|
||||||
dept = DEPT(id=1, name="超管部", comment="超级管理员部门")
|
dept = DEPT(id=1, name="超管部", comment="超级管理员部门")
|
||||||
|
|
Loading…
Reference in New Issue