Commit e2e13114 authored by ibuler's avatar ibuler

Merge branches 'master' and 'wangyong' of gitcafe.com:ibuler/jumpserver

parents 60cb5561 55c5230e
...@@ -19,7 +19,6 @@ class BisGroup(models.Model): ...@@ -19,7 +19,6 @@ class BisGroup(models.Model):
name = models.CharField(max_length=80, unique=True) name = models.CharField(max_length=80, unique=True)
dept = models.ForeignKey(DEPT) dept = models.ForeignKey(DEPT)
comment = models.CharField(max_length=160, blank=True, null=True) comment = models.CharField(max_length=160, blank=True, null=True)
type = models.CharField(max_length=1, choices=GROUP_TYPE, default='P')
def __unicode__(self): def __unicode__(self):
return self.name return self.name
......
...@@ -8,6 +8,7 @@ urlpatterns = patterns('', ...@@ -8,6 +8,7 @@ urlpatterns = patterns('',
url(r'^host_list/$', host_list), url(r'^host_list/$', host_list),
url(r'^search/$', host_search), url(r'^search/$', host_search),
url(r"^host_detail/$", host_detail), url(r"^host_detail/$", host_detail),
url(r"^dept_host_ajax/$", dept_host_ajax),
url(r'^idc_add/$', idc_add), url(r'^idc_add/$', idc_add),
url(r'^idc_list/$', idc_list), url(r'^idc_list/$', idc_list),
url(r'^idc_edit/$', idc_edit), url(r'^idc_edit/$', idc_edit),
...@@ -17,10 +18,10 @@ urlpatterns = patterns('', ...@@ -17,10 +18,10 @@ urlpatterns = patterns('',
url(r'^group_edit/$', group_edit), url(r'^group_edit/$', group_edit),
url(r'^group_list/$', group_list), url(r'^group_list/$', group_list),
url(r'^group_detail/$', group_detail), url(r'^group_detail/$', group_detail),
url(r'^group_del_host/(\w+)/$', group_del_host), url(r'^group_del_host/$', group_del_host),
url(r'^group_del/(\w+)/$', group_del), url(r'^group_del/$', group_del),
url(r'^host_del/(\w+)/$', host_del), url(r'^host_del/(\w+)/$', host_del),
url(r'^host_edit/$', host_edit), url(r'^host_edit/$', view_splitter, {'su': host_edit, 'adm': host_edit_adm}),
url(r'^host_edit/batch/$', host_edit_batch), url(r'^host_edit/batch/$', host_edit_batch),
url(r'^host_edit_common/batch/$', host_edit_common_batch), url(r'^host_edit_common/batch/$', host_edit_common_batch),
) )
\ No newline at end of file
This diff is collapsed.
...@@ -5,7 +5,7 @@ from jlog.views import * ...@@ -5,7 +5,7 @@ from jlog.views import *
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^$', log_list), url(r'^$', log_list),
url(r'^log_list/(\w+)/$', log_list), url(r'^log_list/(\w+)/$', log_list),
url(r'^log_kill/(\d+)', log_kill), url(r'^log_kill/', log_kill),
url(r'^history/$', log_history), url(r'^history/$', log_history),
url(r'^search/$', log_search), url(r'^search/$', log_search),
) )
\ No newline at end of file
...@@ -13,13 +13,27 @@ from connect import BASE_DIR ...@@ -13,13 +13,27 @@ from connect import BASE_DIR
from jlog.models import Log from jlog.models import Log
from jumpserver.views import pages from jumpserver.views import pages
from juser.models import User, DEPT from juser.models import User, DEPT
from jumpserver.api import get_user_dept, is_super_user, is_group_admin, is_common_user, require_admin, require_login from jumpserver.api import *
from jasset.views import httperror
CONF = ConfigParser.ConfigParser() CONF = ConfigParser()
CONF.read('%s/jumpserver.conf' % BASE_DIR) CONF.read('%s/jumpserver.conf' % BASE_DIR)
def get_user_log(request, keyword, env, username, dept_name): def get_user_info(request, offset):
env_dic = {'online': 0, 'offline': 1}
env = env_dic[offset]
keyword = request.GET.get('keyword', '')
user_info = get_session_user_info(request)
user_id, username = user_info[0:2]
dept_id, dept_name = user_info[3:5]
ret = [request, keyword, env, username, dept_name]
return ret
def get_user_log(ret_list):
request, keyword, env, username, dept_name = ret_list
if is_super_user(request): if is_super_user(request):
if keyword: if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \ posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
...@@ -46,53 +60,56 @@ def get_user_log(request, keyword, env, username, dept_name): ...@@ -46,53 +60,56 @@ def get_user_log(request, keyword, env, username, dept_name):
@require_login @require_login
def log_list(request, offset): def log_list(request, offset):
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户' header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
keyword = request.GET.get('keyword', '')
web_socket_host = CONF.get('websocket', 'web_socket_host') web_socket_host = CONF.get('websocket', 'web_socket_host')
env_dic = {'online': 0, 'offline': 1} posts = get_user_log(get_user_info(request, offset))
env = env_dic[offset]
keyword = request.GET.get('keyword')
dept_id = get_user_dept(request)
dept_name = DEPT.objects.get(id=dept_id).name
user_id = request.session.get('user_id')
username = User.objects.get(id=user_id).username
posts = get_user_log(request, keyword, env, username, dept_name)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request)) return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request))
@require_admin @require_admin
def log_kill(request, offset): def log_kill(request):
pid = offset pid = request.GET.get('id', '')
if pid: log = Log.objects.filter(pid=pid)
if log:
log = log.first()
dept_name = log.dept_name
deptname = get_session_user_info(request)[4]
if is_group_admin(request) and dept_name != deptname:
return httperror(request, 'Kill失败, 您无权操作!')
os.kill(int(pid), 9) os.kill(int(pid), 9)
Log.objects.filter(pid=pid).update(is_finished=1, end_time=datetime.now()) Log.objects.filter(pid=pid).update(is_finished=1, end_time=datetime.datetime.now())
return HttpResponseRedirect('jlog/log_offline.html', locals(), context_instance=RequestContext(request)) return render_to_response('jlog/log_offline.html', locals(), context_instance=RequestContext(request))
@require_login @require_login
def log_history(request): def log_history(request):
if request.method == 'GET': log_id = request.GET.get('id', 0)
id = request.GET.get('id', 0) log = Log.objects.filter(id=int(log_id))
log = Log.objects.get(id=int(id)) if log:
if log: log = log.first()
log_his = "%s.his" % log.log_path dept_name = log.dept_name
if os.path.isfile(log_his): deptname = get_session_user_info(request)[4]
f = open(log_his) if is_group_admin(request) and dept_name != deptname:
content = f.read() return httperror(request, '查看失败, 您无权查看!')
return HttpResponse(content)
elif is_common_user(request):
return httperror(request, '查看失败, 您无权查看!')
log_his = "%s.his" % log.log_path
if os.path.isfile(log_his):
f = open(log_his)
content = f.read()
return HttpResponse(content)
else:
return httperror(request, '无日志记录, 请查看日志处理脚本是否开启!')
@require_login @require_login
def log_search(request): def log_search(request):
keyword = request.GET.get('keyword') offset = request.GET.get('env', '')
offset = request.GET.get('env') keyword = request.GET.get('keyword', '')
dept_id = get_user_dept(request) posts = get_user_log(get_user_info(request, offset))
dept_name = DEPT.objects.get(id=dept_id).name
user_id = request.session.get('user_id')
username = User.objects.get(id=user_id).username
env_dic = {'online': 0, 'offline': 1}
env = env_dic[offset]
posts = get_user_log(request, keyword, env, username, dept_name)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request)) return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request))
...@@ -670,13 +670,14 @@ def cmd_detail(request): ...@@ -670,13 +670,14 @@ def cmd_detail(request):
@require_login @require_login
def perm_apply(request): def perm_apply(request):
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机' header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机'
user_id = request.session.get('user_id') user_id, username = get_session_user_info(request)[0:2]
username = User.objects.get(id=user_id).username dept_id, deptname, dept = get_session_user_info(request)[3:6]
dept_id = get_user_dept(request) perm_host = user_perm_asset_api(username)
deptname = DEPT.objects.get(id=dept_id).name all_host = Asset.objects.filter(dept=dept)
dept = DEPT.objects.get(id=dept_id) perm_group = user_perm_group_api(username)
posts = Asset.objects.filter(dept=dept) all_group = dept.bisgroup_set.all()
egroup = dept.bisgroup_set.all() posts = [g for g in all_host if g not in perm_host]
egroup = [d for d in all_group if d not in perm_group]
dept_da = User.objects.filter(dept_id=dept_id, role='DA') dept_da = User.objects.filter(dept_id=dept_id, role='DA')
if request.method == 'POST': if request.method == 'POST':
...@@ -757,7 +758,7 @@ def get_apply_posts(request, status, username, dept_name, keyword=None): ...@@ -757,7 +758,7 @@ def get_apply_posts(request, status, username, dept_name, keyword=None):
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \ posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=status).filter(dept=dept_name).order_by('-date_add') .filter(status=status).filter(dept=dept_name).order_by('-date_add')
else: else:
posts = Log.objects.filter(status=status).filter(dept=dept_name).order_by('-date_add') posts = Apply.objects.filter(status=status).filter(dept=dept_name).order_by('-date_add')
elif is_common_user(request): elif is_common_user(request):
if keyword: if keyword:
......
...@@ -17,14 +17,14 @@ database = jumpserver ...@@ -17,14 +17,14 @@ database = jumpserver
[ldap] [ldap]
ldap_enable = 1 ldap_enable = 1
host_url = ldap://127.0.0.1:389 host_url = ldap://192.168.8.220:389
base_dn = dc=jumpserver, dc=org base_dn = dc=fun, dc=tv
root_dn = cn=admin,dc=jumpserver,dc=org root_dn = cn=admin,dc=fun,dc=tv
root_pw = secret234 root_pw = secret234
[websocket] [websocket]
web_socket_host = 192.168.20.209:3000 web_socket_host = 192.168.173.129:3000
[mail] [mail]
......
...@@ -224,7 +224,6 @@ def is_super_user(request): ...@@ -224,7 +224,6 @@ def is_super_user(request):
def is_group_admin(request): def is_group_admin(request):
print request.session.get('role_id'), type(request.session.get('role_id'))
if request.session.get('role_id') == 1: if request.session.get('role_id') == 1:
return True return True
else: else:
...@@ -248,6 +247,16 @@ def get_session_user_dept(request): ...@@ -248,6 +247,16 @@ def get_session_user_dept(request):
return user, dept return user, dept
@require_login
def get_session_user_info(request):
user_id = request.session.get('user_id', 0)
user = User.objects.filter(id=user_id)
if user:
user = user.first()
dept = user.dept
return [user.id, user.username, user, dept.id, dept.name, dept]
def get_user_dept(request): def get_user_dept(request):
user_id = request.session.get('user_id') user_id = request.session.get('user_id')
if user_id: if user_id:
...@@ -414,6 +423,53 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None, ...@@ -414,6 +423,53 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None,
return True return True
def verify(request, user_group=None, user=None, asset_group=None, asset=None, edept=None):
dept = get_session_user_dept(request)[1]
if edept:
print dept.id, edept[0]
if dept.id != int(edept[0]):
return False
if user_group:
dept_user_groups = dept.usergroup_set.all()
user_groups = []
for user_group_id in user_group:
user_groups.extend(UserGroup.objects.filter(id=user_group_id))
if not set(user_groups).issubset(set(dept_user_groups)):
return False
if user:
dept_users = dept.user_set.all()
users = []
for user_id in user:
users.extend(User.objects.filter(id=user_id))
if not set(users).issubset(set(dept_users)):
return False
if asset_group:
dept_asset_groups = dept.bisgroup_set.all()
asset_groups = []
for group_id in asset_group:
asset_groups.extend(BisGroup.objects.filter(id=int(group_id)))
if not set(asset_groups).issubset(set(dept_asset_groups)):
return False
if asset:
dept_assets = dept.asset_set.all()
assets_id, dept_assets_id = [], []
for a in dept_assets:
dept_assets_id.append(int(a.id))
for i in asset:
assets_id.append(int(i))
print assets_id, dept_assets_id
if not set(assets_id).issubset(dept_assets_id):
return False
return True
def get_dept_asset(request): def get_dept_asset(request):
dept_id = get_user_dept(request) dept_id = get_user_dept(request)
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all() dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()
......
...@@ -83,6 +83,12 @@ def get_item(dictionary, key): ...@@ -83,6 +83,12 @@ def get_item(dictionary, key):
return dictionary.get(key) return dictionary.get(key)
@register.filter(name='get_login_type')
def get_login_type(login):
login_types = {'L': 'LDAP', 'M': 'MAP'}
return login_types[login]
@register.filter(name='bool2str') @register.filter(name='bool2str')
def bool2str(value): def bool2str(value):
if value: if value:
......
...@@ -12,10 +12,10 @@ urlpatterns = patterns('', ...@@ -12,10 +12,10 @@ urlpatterns = patterns('',
(r'^logout/$', 'jumpserver.views.logout'), (r'^logout/$', 'jumpserver.views.logout'),
(r'^file/upload/$', 'jumpserver.views.upload'), (r'^file/upload/$', 'jumpserver.views.upload'),
(r'^file/download/$', 'jumpserver.views.download'), (r'^file/download/$', 'jumpserver.views.download'),
(r'^error/$', 'jumpserver.views.httperror'),
(r'^juser/', include('juser.urls')), (r'^juser/', include('juser.urls')),
(r'^jasset/', include('jasset.urls')), (r'^jasset/', include('jasset.urls')),
(r'^jlog/', include('jlog.urls')), (r'^jlog/', include('jlog.urls')),
(r'^jperm/', include('jperm.urls')), (r'^jperm/', include('jperm.urls')),
) )
...@@ -81,10 +81,16 @@ def admin_index(request): ...@@ -81,10 +81,16 @@ def admin_index(request):
active_hosts = hosts.filter(is_active=1) active_hosts = hosts.filter(is_active=1)
# percent of dashboard # percent of dashboard
percent_user = format(active_users.count() / users.count(), '.0%') if users.count() == 0:
percent_host = format(active_hosts.count() / hosts.count(), '.0%') percent_user, percent_online_user = '0%', '0%'
percent_online_user = format(online_user.count() / users.count(), '.0%') else:
percent_online_host = format(online_host.count() / hosts.count(), '.0%') percent_user = format(active_users.count() / users.count(), '.0%')
percent_online_user = format(online_user.count() / users.count(), '.0%')
if hosts.count() == 0:
percent_host, percent_online_host = '0%', '0%'
else:
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
li_date, li_str = getDaysByNum(7) li_date, li_str = getDaysByNum(7)
today = datetime.datetime.now().day today = datetime.datetime.now().day
......
This diff is collapsed.
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
<div class="middle-box text-center animated fadeInDown"> <div class="middle-box text-center animated fadeInDown">
<h1>404</h1> <h1>404</h1>
<h3 class="font-bold">Page Not Found</h3> <h3 class="font-bold">Page Not Found</h3>
<div class="error-desc"> <div class="error-desc">
Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh button on your browser or try found something else in our app. Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh button on your browser or try found something else in our app.
<form class="form-inline m-t" role="form"> <form class="form-inline m-t" role="form">
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jumpserver | 500 Error</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
<link href="/static/font-awesome/css/font-awesome.css" rel="stylesheet">
<link href="/static/css/animate.css" rel="stylesheet">
<link href="/static/css/style.css" rel="stylesheet">
</head>
<body class="gray-bg">
<div class="middle-box text-center animated fadeInDown">
<h1>Error</h1>
<h3 class="font-bold text-danger">{{ message }}</h3>
<h3 id="jumpTo" class="font-bold text-info"></h3>
<div class="error-desc">
The server encountered something unexpected that didn't allow it to complete the request. We apologize.<br/>
You can go back to main page: <br/><a href="/" class="btn btn-primary m-t">Dashboard</a>
</div>
</div>
<!-- Mainly scripts -->
<script src="/static/js/jquery-2.1.1.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
<script>
function countDown(secs,surl){
var jumpTo = document.getElementById('jumpTo');
jumpTo.innerHTML= secs + '秒' + '后返回上一页';
if(--secs>0){
setTimeout("countDown("+secs+",'"+surl+"')",1000);
}
else{
location.href=surl;
}
}
countDown(5,document.referrer);
</script>
</html>
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-lg-3 border-bottom white-bg dashboard-header" style="margin-left:15px;"> <div class="col-lg-3 border-bottom white-bg dashboard-header" style="margin-left:15px;height: 346px">
<h2>活跃用户TOP5</h2> <h2>活跃用户TOP5</h2>
<small>过去一周共有<span class="text-info">{{ week_users }}</span>位用户登录<span class="text-success">{{ week_hosts }}</span>次服务器.</small> <small>过去一周共有<span class="text-info">{{ week_users }}</span>位用户登录<span class="text-success">{{ week_hosts }}</span>次服务器.</small>
<ul class="list-group clear-list m-t"> <ul class="list-group clear-list m-t">
...@@ -104,21 +104,25 @@ ...@@ -104,21 +104,25 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<div class="feed-activity-list"> <div class="feed-activity-list">
{% for perm in perm_apply_10 %} {% if perm_apply_10 %}
<div class="feed-element"> {% for perm in perm_apply_10 %}
<div> <div class="feed-element">
{% ifequal perm.status 0 %} <div>
<small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small> {% ifequal perm.status 0 %}
{% else %} <small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small>
<small class="pull-right">{{ perm.date_add|naturaltime }}</small> {% else %}
{% endifequal %} <small class="pull-right">{{ perm.date_add|naturaltime }}</small>
<strong>{{ perm.applyer }}</strong> {% endifequal %}
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div> <strong>{{ perm.applyer }}</strong>
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div> <div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>
<small class="text-muted">{{ perm.date_add }}</small> <div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>
<small class="text-muted">{{ perm.date_add }}</small>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} {% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
...@@ -138,30 +142,8 @@ ...@@ -138,30 +142,8 @@
<div class="ibox-content"> <div class="ibox-content">
<div> <div>
<div class="feed-activity-list"> <div class="feed-activity-list">
{% for login in login_10 %} {% if login_10 %}
<div class="feed-element"> {% for login in login_10 %}
<a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png">
</a>
<div class="media-body ">
{% ifequal login.is_finished 0 %}
<small class="pull-right text-navy">{{ login.start_time|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ login.start_time|naturaltime }}</small>
{% endifequal %}
<strong>{{ login.user }}</strong> 登录了{{ login.host }} <br>
<small class="text-muted">{{ login.start_time }}</small>
</div>
</div>
{% endfor %}
</div>
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 更多 </button>
<div id='more' style="display: none">
<br/>
<div class="feed-activity-list">
{% for login in login_more_10 %}
<div class="feed-element"> <div class="feed-element">
<a href="profile.html" class="pull-left"> <a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png"> <img alt="image" class="img-circle" src="/static/img/root.png">
...@@ -178,11 +160,35 @@ ...@@ -178,11 +160,35 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div>
</div>
</div> <button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 更多 </button>
<div id='more' style="display: none">
<br/>
<div class="feed-activity-list">
{% for login in login_more_10 %}
<div class="feed-element">
<a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png">
</a>
<div class="media-body ">
{% ifequal login.is_finished 0 %}
<small class="pull-right text-navy">{{ login.start_time|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ login.start_time|naturaltime }}</small>
{% endifequal %}
<strong>{{ login.user }}</strong> 登录了{{ login.host }} <br>
<small class="text-muted">{{ login.start_time }}</small>
</div>
</div>
{% endfor %}
</div>
</div>
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -209,23 +215,27 @@ ...@@ -209,23 +215,27 @@
<small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small> <small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small>
</div> </div>
<div class="ibox-content inspinia-timeline"> <div class="ibox-content inspinia-timeline">
{% for data in user_top_ten %} {% if user_top_ten %}
<div class="timeline-item"> {% for data in user_top_ten %}
<div class="row"> <div class="timeline-item">
<div class="col-xs-5 date"> <div class="row">
<i class="fa fa-info-circle"></i> <div class="col-xs-5 date">
<strong>{{ data.user }}</strong> <i class="fa fa-info-circle"></i>
<br/> <strong>{{ data.user }}</strong>
<small class="text-navy">{{ data.times }}次</small> <br/>
</div> <small class="text-navy">{{ data.times }}次</small>
<div class="col-xs-7 content no-top-border"> </div>
<p class="m-b-xs">最近一次登录</p> <div class="col-xs-7 content no-top-border">
<p>{{ data.last.host }}</p> <p class="m-b-xs">最近一次登录</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p> <p>{{ data.last.host }}</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} {% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
......
{% for host in hosts %}
<option value="{{ host.id }}">{{ host.ip }}</option>
{% endfor %}
\ No newline at end of file
...@@ -8,6 +8,23 @@ ...@@ -8,6 +8,23 @@
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title"> <div id="ibox-content" class="ibox-title">
<h5> 填写主机组基本信息 </h5> <h5> 填写主机组基本信息 </h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
{% if emg %} {% if emg %}
...@@ -26,9 +43,9 @@ ...@@ -26,9 +43,9 @@
<div class="form-group"> <div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label> <label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<div class="col-sm-8"> <div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b"> <select id="j_dept" name="j_dept" class="form-control m-b" onchange="change_dept(this.value)">
{% for d in edept %} {% for d in edept %}
<option type="checkbox" value="{{ d.name }}">{{ d.name }}</option> <option type="checkbox" value="{{ d.id }}">{{ d.name }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
...@@ -39,21 +56,22 @@ ...@@ -39,21 +56,22 @@
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label> <label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label>
<div class="col-sm-8"><input type="text" name="j_dept" value="{{ edept.name }}" class="form-control" readonly="readonly"></div> <input type="text" name="j_dept" value="{{ edept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ edept.name }}" class="form-control" readonly="readonly"></div>
</div> </div>
{% endifequal %} {% endifequal %}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<div> <div>
<label for="groups" class="col-lg-2 control-label">主机<span class="red-fonts">*</span></label> <label for="hosts" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3"> <div class="col-sm-3">
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;"> <select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
</select> </select>
<div class="input-group" style="padding-bottom: 5px"> <div class="input-group" style="padding-bottom: 5px">
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤"> <input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
</div> </div>
<select id="groups" size="12" class="form-control m-b" multiple> <select id="hosts" size="12" class="form-control m-b" multiple>
{% for post in posts %} {% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option> <option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %} {% endfor %}
...@@ -61,14 +79,14 @@ ...@@ -61,14 +79,14 @@
</div> </div>
<div class="col-sm-1"> <div class="col-sm-1">
<div class="btn-group" style="margin-top: 50px;"> <div class="btn-group" style="margin-top: 50px;">
<button type="button" class="btn btn-xm btn-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button> <button type="button" class="btn btn-xm btn-white" onclick="move('hosts', 'hosts_selected')"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-xm btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i></button> <button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
</div> </div>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<h4 style="padding-bottom: 5px">已选中主机</h4> <h4 style="padding-bottom: 5px">已选中主机</h4>
<div> <div>
<select id="groups_selected" name="j_hosts" class="form-control m-b" size="12" multiple> <select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %} {% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option> <option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %} {% endfor %}
...@@ -112,8 +130,8 @@ ...@@ -112,8 +130,8 @@
}, },
valid: function(form) { valid: function(form) {
form.submit(); form.submit();
} }
}); });
function on_submit(id){ function on_submit(id){
$('#'+id+' option').each( $('#'+id+' option').each(
...@@ -122,10 +140,8 @@ ...@@ -122,10 +140,8 @@
}) })
} }
$('#search').keyup(function() { $('#search').keyup(function() {
var $rows = $('#groups option'); var $rows = $('#hosts option');
console.log($rows);
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase(); var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
$rows.show().filter(function() { $rows.show().filter(function() {
...@@ -133,6 +149,14 @@ ...@@ -133,6 +149,14 @@
return !~text.indexOf(val); return !~text.indexOf(val);
}).hide(); }).hide();
}); });
function change_dept(dept_id){
$.get('/jasset/dept_host_ajax/',
{'id': dept_id},
function(data){
$('#hosts').html(data)
})
}
</script> </script>
{% endblock %} {% endblock %}
\ No newline at end of file
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<div class="ibox float-e-margins" id="all"> <div class="ibox float-e-margins" id="all">
<div class="ibox-title"> <div class="ibox-title">
<h5> 主机组<span class="text-info">{{ group_name }}</span>详细信息列表 </h5> <h5> 主机组<span class="text-info">{{ group.name }}</span>详细信息列表</h5>
<div class="ibox-tools"> <div class="ibox-tools">
<a class="collapse-link"> <a class="collapse-link">
<i class="fa fa-chevron-up"></i> <i class="fa fa-chevron-up"></i>
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
<div class="ibox-content"> <div class="ibox-content">
<div class=""> <div class="">
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加 </a> <a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary"> 添加主机 </a>
</div> </div>
<form id="contents_form" name="contents_form"> <form id="contents_form" name="contents_form">
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
<th class="text-center"> 端口号 </th> <th class="text-center"> 端口号 </th>
<th class="text-center" name="j_type"> 登录方式 </th> <th class="text-center" name="j_type"> 登录方式 </th>
<th class="text-center" name="j_idc"> 所属IDC </th> <th class="text-center" name="j_idc"> 所属IDC </th>
<th class="text-center" id="j_group_name" value="{{ group_name }}"> 所属业务组 </th> <th class="text-center" id="group_id" value="{{ group.id }}"> 所属业务组 </th>
<th class="text-center"> 是否激活 </th> <th class="text-center"> 是否激活 </th>
<th class="text-center" name="j_time"> 添加时间 </th> <th class="text-center" name="j_time"> 添加时间 </th>
<th class="text-center" name="j_comment"> 备注 </th> <th class="text-center" name="j_comment"> 备注 </th>
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td> <td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td> <td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td> <td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
<td class="text-center" data-editable='false'> <td class="text-center" data-editable='false'>
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a> <a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a>
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a> <a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/host_del/{{ post.id }}/" class="btn btn-xs btn-danger">删除</a> <a href="/jasset/group_del_host/?id={{ post.id }}&gid={{ group.id }}" class="btn btn-xs btn-danger">删除</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
...@@ -75,44 +75,7 @@ ...@@ -75,44 +75,7 @@
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" /> <input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" /> <input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
</div> </div>
<div class="col-sm-6"> {% include 'paginator.html' %}
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
<ul class="pagination" style="margin-top: 0; float: right">
{% if contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="?id={{ group_id }}&page={{ contacts.previous_page_number }}">Previous</a>
</li>
{% else %}
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="#">Previous</a>
</li>
{% endif %}
{% ifequal show_first 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page=1" title="第1页">1...</a></li>
{% endifequal %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% ifequal show_end 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page={{ p.num_pages }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
{% endifequal %}
{% if contacts.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
<a href="?id={{ group_id }}&page={{ contacts.next_page_number }}">Next</a>
</li>
{% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
<a href="#">Next</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div> </div>
</form> </form>
</div> </div>
...@@ -126,21 +89,6 @@ ...@@ -126,21 +89,6 @@
$('#editable').editableTableWidget(); $('#editable').editableTableWidget();
}); });
$(".iframe").on('click', function(){
var url= $(this).attr("value");
$.layer({
type: 2,
title: 'JumpServer主机详情',
maxmin: true,
shift: 'top',
border: [2, 0.3, '#1AB394'],
shade: [0.5, '#000000'],
shadeClose: true,
area : ['800px' , '600px'],
iframe: {src: url}
});
});
function alter(form) { function alter(form) {
selectData = GetTableDataBox(); selectData = GetTableDataBox();
if (selectData[1] != 0) { if (selectData[1] != 0) {
...@@ -159,8 +107,7 @@ ...@@ -159,8 +107,7 @@
function del(form) { function del(form) {
var checkboxes = document.getElementById(form); var checkboxes = document.getElementById(form);
var id_list = {}; var id_list = {};
var group_name = $('#j_group_name').attr("value"); var group_id = $('#group_id').attr("value");
console.log(group_name);
var j = 0; var j = 0;
for (var i = 0; i < checkboxes.elements.length; i++) { for (var i = 0; i < checkboxes.elements.length; i++) {
if (checkboxes.elements[i].type == "checkbox" && checkboxes.elements[i].checked == true && checkboxes.elements[i].value != "checkall") { if (checkboxes.elements[i].type == "checkbox" && checkboxes.elements[i].checked == true && checkboxes.elements[i].value != "checkall") {
...@@ -171,8 +118,8 @@ ...@@ -171,8 +118,8 @@
if (confirm("确定从主机组中删除")) { if (confirm("确定从主机组中删除")) {
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "/jasset/group_del_host/group/", url: "/jasset/group_del_host/?id=group",
data: {"id_list": id_list, "len_list": j, "group_name": group_name}, data: {"id_list": id_list, "len_list": j, "group_id": group_id},
success: function (data) { success: function (data) {
window.open(window.location.href, "_self"); window.open(window.location.href, "_self");
} }
......
{% extends 'base.html' %}
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-lg-10">
<div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title">
<h5> 填写主机组基本信息 </h5>
</div>
<div class="ibox-content">
{% if emg %}
<div class="alert alert-warning text-center">{{ emg }}</div>
{% endif %}
{% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div>
{% endif %}
<form id="assetForm" method="post" class="form-horizontal">
<div class="form-group"><label class="col-sm-2 control-label"> 主机组名<span class="red-fonts">*</span></label>
<div class="col-sm-8" name="group_id" value="{{ post.id }}"><input type="text" value="{{ group.name }}" placeholder="网站" name="j_group" class="form-control"></div>
</div>
{% ifequal session_role_id 2 %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" onchange="change_dept(this.value)">
{% for d in edept %}
{% ifequal group.dept d %}
<option type="checkbox" value="{{ d.id }}" selected>{{ d.name }}</option>
{% else %}
<option type="checkbox" value="{{ d.id }}">{{ d.name }}</option>
{% endifequal %}
{% endfor %}
</select>
</div>
</div>
{% endifequal %}
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label>
<input type="text" name="j_dept" value="{{ group.dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ group.dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<div>
<label for="hosts" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3">
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
</select>
<div class="input-group" style="padding-bottom: 5px">
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
</div>
<select id="hosts" size="12" class="form-control m-b" multiple>
{% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-1">
<div class="btn-group" style="margin-top: 50px;">
<button type="button" class="btn btn-xm btn-white" onclick="move('hosts', 'hosts_selected')"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
</div>
</div>
<div class="col-sm-3">
<h4 style="padding-bottom: 5px">已选中主机</h4>
<div>
<select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
<div class="col-sm-8"><input type="text" value="{{ group.comment }}" placeholder=包括web组所有主机 name="j_comment" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-5">
<button class="btn btn-white" type="submit"> 重置 </button>
<button class="btn btn-primary" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
$('#assetForm').validator({
timely: 2,
theme: "yellow_right_effect",
fields: {
"j_group": {
rule: "required",
tip: "输入业务组名",
ok: "",
msg: {required: "业务组名必须填写!"},
data: {'data-ok':"业务组名可以使用"}
}
},
valid: function(form) {
form.submit();
}
});
function on_submit(id){
$('#'+id+' option').each(
function(){
$(this).prop('selected', true)
})
}
$('#search').keyup(function() {
var $rows = $('#hosts option');
console.log($rows);
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
$rows.show().filter(function() {
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
return !~text.indexOf(val);
}).hide();
});
function change_dept(dept_id){
$.get('/jasset/dept_host_ajax/',
{'id': dept_id},
function(data){
$('#hosts').html(data)
})
}
</script>
{% endblock %}
\ No newline at end of file
...@@ -7,9 +7,29 @@ ...@@ -7,9 +7,29 @@
<div class="row"> <div class="row">
<div class="col-lg-10"> <div class="col-lg-10">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title">
<h5> 主机组详细信息列表</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content"> <div class="ibox-content">
<div class=""> <div class="">
<a target="_blank" href="/jasset/jgroup_add" class="btn btn-sm btn-primary "> 添加主机组 </a> <a target="_blank" href="/jasset/group_add" class="btn btn-sm btn-primary "> 添加主机组 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search"> <form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search"> <input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
...@@ -50,7 +70,7 @@ ...@@ -50,7 +70,7 @@
<td class="text-center"> <td class="text-center">
<a href="/jasset/group_detail/?id={{ post.id }}" class="btn btn-xs btn-info">详情</a> <a href="/jasset/group_detail/?id={{ post.id }}" class="btn btn-xs btn-info">详情</a>
<a href="/jasset/group_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a> <a href="/jasset/group_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/group_del/{{ post.id }}/" class="btn btn-xs btn-danger">删除</a> <a href="/jasset/group_del/?id={{ post.id }}" class="btn btn-xs btn-danger">删除</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
...@@ -59,7 +79,7 @@ ...@@ -59,7 +79,7 @@
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" /> <input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" /> <!--<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />-->
</div> </div>
{% include 'paginator.html' %} {% include 'paginator.html' %}
</div> </div>
...@@ -84,7 +104,7 @@ ...@@ -84,7 +104,7 @@
if (confirm("确定删除")) { if (confirm("确定删除")) {
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "/jasset/group_del/multi/", url: "/jasset/group_del/?id=multi",
data: {"id_list": id_list, "len_list": j}, data: {"id_list": id_list, "len_list": j},
success: function (data) { success: function (data) {
window.open("/jasset/group_list/", "_self"); window.open("/jasset/group_list/", "_self");
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<div class="col-sm-8"> <div class="col-sm-8">
<select id="j_idc" name="j_idc" class="form-control m-b"> <select id="j_idc" name="j_idc" class="form-control m-b">
{% for i in eidc %} {% for i in eidc %}
<option> {{ i }} </option> <option value="{{i.id}}"> {{ i }} </option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
<div class="col-sm-8"> <div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10"> <select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% for d in edept %} {% for d in edept %}
<option type="checkbox" value="{{ d.name }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option> <option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
...@@ -101,18 +101,19 @@ ...@@ -101,18 +101,19 @@
{% ifequal session_role_id 1 %} {% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 </label> <div class="form-group"><label class="col-sm-2 control-label"> 所属部门 <span class="red-fonts">*</span></label>
<div class="col-sm-8"><input type="text" name="j_dept" value="{{ edept.name }}" class="form-control" readonly="readonly"></div> <input type="text" name="j_dept" value="{{ dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
</div> </div>
{% endifequal %} {% endifequal %}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label for="j_group" class="col-lg-2 control-label">所属主机组<span class="red-fonts">*</span></label> <label for="j_group" class="col-lg-2 control-label">所属主机组</label>
<div class="col-sm-8"> <div class="col-sm-8">
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10"> <select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
{% for g in egroup %} {% for g in egroup %}
<option type="checkbox" value="{{ g.name }}">{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option> <option type="checkbox" value="{{ g.id }}">{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
...@@ -183,12 +184,6 @@ $('#assetForm').validator({ ...@@ -183,12 +184,6 @@ $('#assetForm').validator({
ok: "", ok: "",
msg: {required: "必须填写!"} msg: {required: "必须填写!"}
}, },
"j_group": {
rule: "required",
tip: "选择主机组",
ok: "",
msg: {checked: "至少选择一个组"}
},
"j_idc": { "j_idc": {
rule: "required", rule: "required",
tip: "选择IDC", tip: "选择IDC",
......
...@@ -42,9 +42,10 @@ ...@@ -42,9 +42,10 @@
{% if smg %} {% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div> <div class="alert alert-success text-center">{{ smg }}</div>
{% endif %} {% endif %}
<h4>按照文本框内主机信息格式填写, 多台主机回车换行</h4> <p>请严格按照文本框内主机信息格式填写, 多台主机回车换行, 具体格式如下: </p>
<p class="text-info">IP地址 端口号 登录方式 IDC名 所属主机组 所属部门 激活/禁用 备注 </p>
<form id="assetMulti" method="post" class="form-horizontal"> <form id="assetMulti" method="post" class="form-horizontal">
<div><textarea id="j_multi" name="j_multi" type="text" placeholder="192.168.1.1 22 LDAP 北京联通 [网站,数据库] 运维部 1 网站服务器" class="form-control" style="width:700px;height:500px">192.168.1.1 22 LDAP 北京联通 ['网站','数据库'] ['运维部'] 1 网站服务器</textarea></div> <div><textarea id="j_multi" name="j_multi" type="text" placeholder="192.168.1.1 22 LDAP 北京联通 [网站,数据库] 运维部 激活 网站服务器" class="form-control" style="width:700px;height:500px">192.168.1.1 22 LDAP 北京联通 ['网站','数据库'] ['运维部','测试部'] 激活 网站服务器</textarea></div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-4 col-sm-offset-4"> <div class="col-sm-4 col-sm-offset-4">
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
</tr> </tr>
<tr> <tr>
<td class="text-navy">登录方式</td> <td class="text-navy">登录方式</td>
<td>{{ login_types|get_item:post.login_type }}</td> <td>{{ post.login_type|get_login_type }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">IDC</td> <td class="text-navy">IDC</td>
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</tr> </tr>
<tr> <tr>
<td class="text-navy">激活</td> <td class="text-navy">激活</td>
<td>{{ user.is_active|bool2str }}</td> <td>{{ post.is_active|bool2str }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">添加日期</td> <td class="text-navy">添加日期</td>
...@@ -116,13 +116,17 @@ ...@@ -116,13 +116,17 @@
<div> <div>
<div class="text-left"> <div class="text-left">
<table class="table"> <table class="table">
{% for user in user_permed_list %} {% if user_permed_list %}
<tr> {% for user in user_permed_list %}
<td class="text-navy">{{ user.name }}</td> <tr>
<td>{{ user.dept.name }}</td> <td class="text-navy">{{ user.name }}</td>
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td> <td>{{ user.dept.name }}</td>
</tr> <td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
{% endfor %} </tr>
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</table> </table>
</div> </div>
</div> </div>
...@@ -153,45 +157,50 @@ ...@@ -153,45 +157,50 @@
<small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small> <small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small>
</div> </div>
<div class="ibox-content inspinia-timeline"> <div class="ibox-content inspinia-timeline">
{% for l in log %} {% if log %}
<div class="timeline-item"> {% for l in log %}
<div class="row"> <div class="timeline-item">
<div class="col-xs-5 date"> <div class="row">
<i class="fa fa-info-circle"></i> <div class="col-xs-5 date">
<small class="text-navy">{{ l.user }}</small> <i class="fa fa-info-circle"></i>
<br/> <small class="text-navy">{{ l.user }}</small>
<strong>{{l.dept_name}}</strong> <br/>
</div> <strong>{{l.dept_name}}</strong>
<div class="col-xs-7 content no-top-border"> </div>
<p class="m-b-xs"><strong>详细信息</strong></p> <div class="col-xs-7 content no-top-border">
<p>来源IP: {{ l.remote_ip }}</p> <p class="m-b-xs"><strong>详细信息</strong></p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p> <p>来源IP: {{ l.remote_ip }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p> <p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} <button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 所有 </button>
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 所有 </button> <div id='more' style="display: none">
<div id='more' style="display: none"> <br/>
<br/> {% for l in log_more %}
{% for l in log_more %} <div class="timeline-item">
<div class="timeline-item"> <div class="row">
<div class="row"> <div class="col-xs-5 date">
<div class="col-xs-5 date"> <i class="fa fa-info-circle"></i>
<i class="fa fa-info-circle"></i> <small class="text-navy">{{ l.user }}</small>
<small class="text-navy">{{ l.user }}</small> <br/>
<br/> <strong>{{l.dept_name}}</strong>
<strong>{{l.dept_name}}</strong> </div>
</div> <div class="col-xs-7 content no-top-border">
<div class="col-xs-7 content no-top-border"> <p class="m-b-xs"><strong>详细信息</strong></p>
<p class="m-b-xs"><strong>详细信息</strong></p> <p>来源IP: {{ l.remote_ip }}</p>
<p>来源IP: {{ l.remote_ip }}</p> <p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p> <p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p> </div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} {% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
......
...@@ -49,29 +49,21 @@ ...@@ -49,29 +49,21 @@
<div class="col-sm-8"> <div class="col-sm-8">
{% for t, type in login_types.items %} {% for t, type in login_types.items %}
{% ifequal t post.login_type %} {% ifequal t post.login_type %}
<div class="radio i-checks"><label> <input type="radio" id="{{ t }}" checked="" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div> <div class="radio i-checks"><label> <input type="radio" checked="" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% else %} {% else %}
<div class="radio i-checks"><label> <input type="radio" id="{{ t }}" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div> <div class="radio i-checks"><label> <input type="radio" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% endifequal %} {% endifequal %}
{% endfor %} {% endfor %}
</div> </div>
{% ifequal post.login_type M %} {% ifequal post.login_type 'M' %}
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label> <div name="type" id="type">
<div class="col-sm-6"><input type="text" name="j_user" value="{{ post.username }}" class="form-control"></div>
</div>
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
<div class="col-sm-6"><input type="password" name="j_password" value="{{ post.password }}" class="form-control"></div>
</div>
{% else %}
<div name="a1" id=a1 style="display:none;">
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label> <div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
<div class="col-sm-6"><input type="text" name="j_user" placeholder="lilei" class="form-control"></div> <div class="col-sm-6"><input type="text" name="j_user" value="{{ post.username }}" class="form-control"></div>
</div> </div>
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label> <div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
<div class="col-sm-6"><input type="password" name="j_password" placeholder="Password" class="form-control"></div> <div class="col-sm-6"><input type="password" name="j_password" value="{{ post.password }}" class="form-control"></div>
</div> </div>
</div> </div>
{% endifequal %} {% endifequal %}
...@@ -84,41 +76,51 @@ ...@@ -84,41 +76,51 @@
<select id="j_idc" name="j_idc" class="form-control m-b"> <select id="j_idc" name="j_idc" class="form-control m-b">
{% for i in eidc %} {% for i in eidc %}
{% ifequal i.id post.idc_id %} {% ifequal i.id post.idc_id %}
<option selected> {{ i }} </option> <option value="{{i.id}}" selected> {{ i }} </option>
{% else %} {% else %}
<option> {{ i }} </option> <option value="{{i.id}}"> {{ i }} </option>
{% endifequal %} {% endifequal %}
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
</div> </div>
<div class="hr-line-dashed"></div> {% ifequal session_role_id 2 %}
<div class="form-group"> <div class="hr-line-dashed"></div>
<label for="j_dept" class="col-lg-2 control-label"> 所属部门<span class="red-fonts">*</span> </label> <div class="form-group">
<div class="col-sm-8"> <label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10"> <div class="col-sm-8">
{% for g in edept %} <select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% if g in e_dept %} {% for d in edept %}
<option type="checkbox" value="{{ g.name }}" selected>{{ g.name }} --- {{ g.comment }}</option> {% if d in e_dept %}
{% else %} <option type="checkbox" selected value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
<option type="checkbox" value="{{ g.name }}" >{{ g.name }} --- {{ g.comment }}</option> {% else %}
{% endif %} <option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endfor %} {% endif %}
</select> {% endfor %}
</select>
</div>
</div> </div>
</div> {% endifequal %}
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门<span class="red-fonts">*</span> </label>
<input type="text" name="j_dept" value="{{ dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label for="j_group" class="col-lg-2 control-label"> 所属主机组<span class="red-fonts">*</span> </label> <label for="j_group" class="col-lg-2 control-label"> 所属主机组</label>
<div class="col-sm-8"> <div class="col-sm-8">
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10"> <select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
{% for g in egroup %} {% for g in egroup %}
{% if g in e_group %} {% if g in e_group %}
<option type="checkbox" value="{{ g.name }}" selected>{{ g.name }} --- {{ g.comment }}</option> <option type="checkbox" value="{{ g.id }}" selected>{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% else %} {% else %}
<option type="checkbox" value="{{ g.name }}" >{{ g.name }} --- {{ g.comment }}</option> <option type="checkbox" value="{{ g.id }}" >{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</select> </select>
...@@ -147,7 +149,7 @@ ...@@ -147,7 +149,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-4 col-sm-offset-5"> <div class="col-sm-4 col-sm-offset-5">
<button class="btn btn-white" type="submit"> 重置 </button> <button class="btn btn-white" type="submit"> 重置 </button>
<button class="btn btn-primary" type="submit"> 提交 </button> <button class="btn btn-primary" type="submit" style="display: i"> 提交 </button>
</div> </div>
</div> </div>
</form> </form>
...@@ -162,10 +164,10 @@ ...@@ -162,10 +164,10 @@
function show(o){ function show(o){
showFlag[o.name]=o.value; showFlag[o.name]=o.value;
if(showFlag.j_type=="M"){ if(showFlag.j_type=="M"){
document.getElementById("a1").style.display=""; document.getElementById("type").style.display="";
} }
else{ else{
document.getElementById("a1").style.display="none"; document.getElementById("type").style.display="none";
}}; }};
$('#assetForm').validator({ $('#assetForm').validator({
timely: 2, timely: 2,
...@@ -190,11 +192,17 @@ $('#assetForm').validator({ ...@@ -190,11 +192,17 @@ $('#assetForm').validator({
ok: "", ok: "",
msg: {required: "必须填写!"} msg: {required: "必须填写!"}
}, },
"j_group": { "j_idc": {
rule: "checked", rule: "required",
tip: "选择业务组", tip: "选择IDC",
ok: "",
msg: {checked: "必须填写!"}
},
"j_dept": {
rule: "required",
tip: "选择部门",
ok: "", ok: "",
msg: {checked: "至少选择一个"} msg: {checked: "至少选择一个部门"}
}, },
"j_user": { "j_user": {
rule: "required(type_m)", rule: "required(type_m)",
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td> <td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td> <td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td> <td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
......
...@@ -66,14 +66,14 @@ ...@@ -66,14 +66,14 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" data-editable='false' name="j_ip"> {{ post.ip }} </td> <td class="text-center" data-editable='false' name="j_ip"> {{ post.ip }} </td>
<td class="text-center" data-editable='false' name="j_port"> {{ post.port }} </td> <td class="text-center" data-editable='false' name="j_port"> {{ post.port }} </td>
<td class="text-center" data-editable='false' name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" data-editable='false' name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" data-editable='false' name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" data-editable='false' name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" data-editable='false' name="j_dept">{{ post.dept.all | group_str2 }}</td> <td class="text-center" data-editable='false' name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" data-editable='false' name="j_group">{{ post.bis_group.all | group_str2_all }}</td> <td class="text-center" data-editable='false' name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
<td class="text-center" name="j_alias"> {{ post|get_user_alias:user_id }} </td> <td class="text-center" name="j_alias"> {{ post|get_user_alias:user_id }} </td>
<td class="text-center" data-editable='false' name="j_comment"> {{ post.comment }} </td> <td class="text-center" data-editable='false' name="j_comment"> {{ post.comment }} </td>
<td class="text-center" data-editable='false'> <td class="text-center" data-editable='false'>
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a> <a href="/jasset/host_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td> <td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td> <td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td> <td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td> <td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td> <td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td>
{% ifnotequal session_role_id 0 %} {% ifnotequal session_role_id 0 %}
......
...@@ -35,43 +35,14 @@ ...@@ -35,43 +35,14 @@
{% endif %} {% endif %}
<form id="assetForm" method="post" class="form-horizontal"> <form id="assetForm" method="post" class="form-horizontal">
<div class="form-group"><label class="col-sm-2 control-label"> IDC名 <span class="red-fonts">*</span></label> <div class="form-group"><label class="col-sm-2 control-label"> IDC名 <span class="red-fonts">*</span></label>
<div class="col-sm-8"><input type="text" value="{{ j_idc.name }}" placeholder="北京联通" name="j_idc" class="form-control"></div> <div class="col-sm-8"><input type="text" value="{{ idc.name }}" placeholder="北京联通" name="j_idc" class="form-control"></div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label> <div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
<div class="col-sm-8"><input type="text" value="{{ j_idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div> <div class="col-sm-8"><input type="text" value="{{ idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div>
</div> </div>
{% if edit %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="groups" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3">
<select id="groups" name="idc_default" size="12" class="form-control m-b" multiple>
{% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-1">
<div class="btn-group" style="margin-top: 50px;">
<button type="button" class="btn btn-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i> </button>
</div>
</div>
<div class="col-sm-3">
<div>
<select id="groups_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
{% endif %}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-4 col-sm-offset-5"> <div class="col-sm-4 col-sm-offset-5">
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<div class="ibox float-e-margins" id="all"> <div class="ibox float-e-margins" id="all">
<div class="ibox-title"> <div class="ibox-title">
<h5> IDC<span class="text-info"> {{ idc_name }} </span>详细信息列表 </h5> <h5> IDC<span class="text-info"> {{ idc.name }} </span>详细信息列表 </h5>
<div class="ibox-tools"> <div class="ibox-tools">
<a class="collapse-link"> <a class="collapse-link">
<i class="fa fa-chevron-up"></i> <i class="fa fa-chevron-up"></i>
...@@ -29,8 +29,14 @@ ...@@ -29,8 +29,14 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
{% if emg %}
<div class="alert alert-warning text-center">{{ emg }}</div>
{% endif %}
{% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div>
{% endif %}
<div class=""> <div class="">
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加 </a> <a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加主机 </a>
</div> </div>
<form id="contents_form" name="contents_form"> <form id="contents_form" name="contents_form">
...@@ -55,15 +61,18 @@ ...@@ -55,15 +61,18 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td> <td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td> <td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td> <td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td> <td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td> <td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
<td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td>
<td class="text-center" name="j_comment"> {{ post.comment }} </td> <td class="text-center" name="j_comment"> {{ post.comment }} </td>
<td class="text-center" data-editable='false'> <td class="text-center" data-editable='false'>
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a> <a href="/jasset/host_detail/?id={{ post.id }}" class="btn btn-xs btn-primary">详情</a>
<a href="/jasset/host_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a> {% ifnotequal session_role_id 0 %}
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/host_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a>
{% endifnotequal %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
...@@ -74,38 +83,7 @@ ...@@ -74,38 +83,7 @@
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" /> <input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" /> <input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
</div> </div>
<div class="col-sm-6"> {% include 'paginator.html' %}
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
<ul class="pagination" style="margin-top: 0; float: right">
{% if contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="?id={{ idc_id }}&page={{ contacts.previous_page_number }}">Previous</a>
</li>
{% else %}
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="#">Previous</a>
</li>
{% endif %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?id={{ idc_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ idc_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% if contacts.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
<a href="?id={{ idc_id }}&page={{ contacts.next_page_number }}">Next</a>
</li>
{% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
<a href="#">Next</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div> </div>
</form> </form>
</div> </div>
...@@ -119,21 +97,6 @@ ...@@ -119,21 +97,6 @@
$('#editable').editableTableWidget(); $('#editable').editableTableWidget();
}); });
$(".iframe").on('click', function(){
var url= $(this).attr("value");
$.layer({
type: 2,
title: 'JumpServer主机详情',
maxmin: true,
shift: 'top',
border: [2, 0.3, '#1AB394'],
shade: [0.5, '#000000'],
shadeClose: true,
area : ['800px' , '600px'],
iframe: {src: url}
});
});
function alter(form) { function alter(form) {
selectData = GetTableDataBox(); selectData = GetTableDataBox();
if (selectData[1] != 0) { if (selectData[1] != 0) {
...@@ -164,7 +127,7 @@ ...@@ -164,7 +127,7 @@
if (confirm("确定从该IDC中删除")) { if (confirm("确定从该IDC中删除")) {
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "/jasset/group_del_host/idc/", url: "/jasset/host_del/multi/",
data: {"id_list": id_list, "len_list": j, "group_name": group_name}, data: {"id_list": id_list, "len_list": j, "group_name": group_name},
success: function (data) { success: function (data) {
window.open(window.location.href, "_self"); window.open(window.location.href, "_self");
......
{% extends 'base.html' %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-lg-10">
<div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title">
<h5> 填写IDC基本信息 </h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
{% if emg %}
<div class="alert alert-warning text-center">{{ emg }}</div>
{% endif %}
{% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div>
{% endif %}
<form id="assetForm" method="post" class="form-horizontal">
<div class="form-group"><label class="col-sm-2 control-label"> IDC名 <span class="red-fonts">*</span></label>
<div class="col-sm-8">
<input name="id" type="text" value="{{ idc.id }}" style="display: none;">
<input type="text" value="{{ idc.name }}" placeholder="北京联通" name="j_idc" class="form-control">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
<div class="col-sm-8"><input type="text" value="{{ idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="groups" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3">
<select id="groups" name="idc_default" size="12" class="form-control m-b" multiple>
{% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-1">
<div class="btn-group" style="margin-top: 50px;">
<button type="button" class="btn btn-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i> </button>
</div>
</div>
<div class="col-sm-3">
<div>
<select id="groups_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-5">
<button class="btn btn-white" type="submit"> 重置 </button>
<button class="btn btn-primary" type="sumbit"> 提交 </button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
$('#assetForm').validator({
timely: 2,
theme: "yellow_right_effect",
fields: {
"j_idc": {
rule: "required",
tip: "输入IDC名",
ok: "",
msg: {required: "IDC名必须填写!"},
data: {'data-ok':"主机名可以使用", 'data-msg-required': '主机名已正确'}
}
},
valid: function(form) {
form.submit();
}
});
</script>
{% endblock %}
\ No newline at end of file
...@@ -7,6 +7,26 @@ ...@@ -7,6 +7,26 @@
<div class="row"> <div class="row">
<div class="col-lg-10"> <div class="col-lg-10">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title">
<h5> IDC详细信息列表</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content"> <div class="ibox-content">
<div class=""> <div class="">
{% ifequal session_role_id 2 %} {% ifequal session_role_id 2 %}
...@@ -55,7 +75,7 @@ ...@@ -55,7 +75,7 @@
<a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a> <a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
{% ifequal session_role_id 2 %} {% ifequal session_role_id 2 %}
<a href="/jasset/idc_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a> <a href="/jasset/idc_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/idc_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a> <a href="/jasset/idc_del/?id={{ post.id }}" class="btn btn-xs btn-danger">删除</a>
{% endifequal %} {% endifequal %}
</td> </td>
</tr> </tr>
...@@ -66,7 +86,7 @@ ...@@ -66,7 +86,7 @@
<div class="col-sm-6"> <div class="col-sm-6">
{% ifequal session_role_id 2 %} {% ifequal session_role_id 2 %}
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" /> <input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" /> <!--<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />-->
{% endifequal %} {% endifequal %}
</div> </div>
{% include 'paginator.html' %} {% include 'paginator.html' %}
...@@ -92,7 +112,7 @@ ...@@ -92,7 +112,7 @@
if (confirm("确定删除")) { if (confirm("确定删除")) {
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "/jasset/idc_del/multi/", url: "/jasset/idc_del/?id=multi",
data: {"id_list": id_list, "len_list": j}, data: {"id_list": id_list, "len_list": j},
success: function (data) { success: function (data) {
window.open("/jasset/idc_list/", "_self"); window.open("/jasset/idc_list/", "_self");
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<tr class="gradeX"> <tr class="gradeX">
<td> <a id="ip" class="iframe" href="/jasset/{{ post.ip }}/">{{ post.ip }}</a></td> <td> <a id="ip" class="iframe" href="/jasset/{{ post.ip }}/">{{ post.ip }}</a></td>
<td> {{ post.port }} </td> <td> {{ post.port }} </td>
<td> {{ login_types|get_item:post.login_type }} </td> <td> {{ post.login_type|get_login_type }} </td>
<td class="text-center"> {{ post.idc.name }} </td> <td class="text-center"> {{ post.idc.name }} </td>
<td class="text-center">{% for group in post.bis_group.all %} {{ group }} {% endfor %}</td> <td class="text-center">{% for group in post.bis_group.all %} {{ group }} {% endfor %}</td>
<td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td> <td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td>
......
...@@ -155,7 +155,7 @@ ...@@ -155,7 +155,7 @@
if (option == 'new') { if (option == 'new') {
tag.append('<p style="margin: 2px">' + escapeString(obj.content) + '</p>'); tag.append('<p style="margin: 2px">' + escapeString(obj.content) + '</p>');
} else if (option == 'exist') { } else if (option == 'exist') {
tag.append('<p style="margin: 0">' + exsit_message + '</p>'); tag.append('<pre>' + exsit_message + '</pre>');
} }
tag.animate({ scrollTop: tag[0].scrollHeight}, 1); tag.animate({ scrollTop: tag[0].scrollHeight}, 1);
}); });
...@@ -204,12 +204,12 @@ ...@@ -204,12 +204,12 @@
}) })
function cut(num){ function cut(num){
var g_url = "/jlog/log_kill/"+num; var g_url = "/jlog/log_kill/?id="+num;
console.log(g_url);
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: g_url, url: g_url,
success: window.open("/jlog/log_list/online/","_self") success: window.open("/jlog/log_list/online/", "_self")
// error: window.open(g_url, "_self")
}); });
} }
......
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
{% for post in contacts.object_list %} {% for post in contacts.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center" id="username"> {{ post.user }} </td> <td class="text-center" id="username"> {{ post.user }} </td>
<td class="text-center" id="ip"> {{ post.dept_name }} </td> <td class="text-center" id="dept_name"> {{ post.dept_name }} </td>
<td class="text-center" id="ip"> {{ post.host }} </td> <td class="text-center" id="host"> {{ post.host }} </td>
<td class="text-center" id="ip"> {{ post.remote_ip }} </td> <td class="text-center" id="remote_ip"> {{ post.remote_ip }} </td>
<td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </td> <td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </td>
<td class="text-center" id="start_time"> {{ post.start_time|date:"Y-m-d H:i:s"}} </td> <td class="text-center" id="start_time"> {{ post.start_time|date:"Y-m-d H:i:s"}} </td>
<td class="text-center" id="end_time"> {{ post.end_time|date:"Y-m-d H:i:s" }} </td> <td class="text-center" id="end_time"> {{ post.end_time|date:"Y-m-d H:i:s" }} </td>
......
...@@ -36,17 +36,17 @@ ...@@ -36,17 +36,17 @@
{% endif %} {% endif %}
<form id="assetForm" method="post" class="form-horizontal"> <form id="assetForm" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<div class="form-group"><label class="col-sm-2 control-label"> 申请人 </label> <div class="form-group"><label class="col-sm-2 control-label"> 申请人 <span class="red-fonts">*</span></label>
<div class="col-sm-8"><input type="text" name="applyer" value="{{ username }}" class="form-control" readonly="readonly"></div> <div class="col-sm-8"><input type="text" name="applyer" value="{{ username }}" class="form-control" readonly="readonly"></div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所在部门 </label> <div class="form-group"><label class="col-sm-2 control-label"> 所在部门 <span class="red-fonts">*</span></label>
<div class="col-sm-8"><input type="text" name="dept" value="{{ deptname }}" class="form-control" readonly="readonly"></div> <div class="col-sm-8"><input type="text" name="dept" value="{{ deptname }}" class="form-control" readonly="readonly"></div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 部门管理员 </label> <div class="form-group"><label class="col-sm-2 control-label"> 部门管理员 <span class="red-fonts">*</span></label>
<div class="radio"> <div class="radio">
{% for da in dept_da %} {% for da in dept_da %}
<label><input type="radio" value="{{ da.id }}" id="da" name="da"> {{ da }}</label> <label><input type="radio" value="{{ da.id }}" id="da" name="da"> {{ da }}</label>
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label for="group" class="col-lg-2 control-label">主机组<span class="red-fonts">*</span></label> <label for="group" class="col-lg-2 control-label">主机组</label>
<div class="col-sm-8"> <div class="col-sm-8">
<select id="group" name="group" class="form-control m-b" multiple size="10"> <select id="group" name="group" class="form-control m-b" multiple size="10">
{% for g in egroup %} {% for g in egroup %}
......
...@@ -27,11 +27,11 @@ ...@@ -27,11 +27,11 @@
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a> <a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li> <li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>
<li class="host_list host_detail"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li> <li class="host_list host_detail host_edit"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="idc_add"><a href="/jasset/idc_add/">添加IDC</a></li> <li class="idc_add"><a href="/jasset/idc_add/">添加IDC</a></li>
<li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li> <li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li>
<li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li> <li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li>
<li class="group_list group_detail"><a href="/jasset/group_list/">查看主机组</a></li> <li class="group_list group_detail group_edit"><a href="/jasset/group_list/">查看主机组</a></li>
</ul> </ul>
</li> </li>
<li id="jperm"> <li id="jperm">
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
<li class="host_list host_detail host_edit"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li> <li class="host_list host_detail host_edit"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li> <li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li>
<li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li> <li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li>
<li class="group_list group_detail"><a href="/jasset/group_list/">查看主机组</a></li> <li class="group_list group_detail group_edit"><a href="/jasset/group_list/">查看主机组</a></li>
</ul> </ul>
</li> </li>
<li id="jperm"> <li id="jperm">
......
listening on *:3000
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment