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

pull/6/head
guanghongwei 2015-04-11 12:53:22 +08:00
commit 3c1af0e266
25 changed files with 1403 additions and 297 deletions

View File

@ -3,24 +3,24 @@ from django.conf.urls import patterns, include, url
from jasset.views import *
urlpatterns = patterns('',
url(r'^host_add/$', add_host),
url(r"^host_add_multi/$", add_host_multi),
url(r'^host_list/$', list_host),
url(r'^host_add/$', host_add),
url(r"^host_add_multi/$", host_add_batch),
url(r'^host_list/$', host_list),
url(r'^search/$', host_search),
url(r"^(\d+.\d+.\d+.\d+)/$", jlist_ip),
url(r'^idc_add/$', add_idc),
url(r'^idc_list/$', list_idc),
url(r'^idc_edit/$', edit_idc),
url(r'^idc_detail/$', detail_idc),
url(r'^idc_del/(\w+)/$', del_idc),
url(r'^group_add/$', add_group),
url(r'^group_edit/$', edit_group),
url(r'^group_list/$', list_group),
url(r'^group_detail/$', detail_group),
url(r"^host_detail/$", host_detail),
url(r'^idc_add/$', idc_add),
url(r'^idc_list/$', idc_list),
url(r'^idc_edit/$', idc_edit),
url(r'^idc_detail/$', idc_detail),
url(r'^idc_del/$', idc_del),
url(r'^group_add/$', group_add),
url(r'^group_edit/$', group_edit),
url(r'^group_list/$', group_list),
url(r'^group_detail/$', group_detail),
url(r'^group_del_host/(\w+)/$', group_del_host),
url(r'^group_del/(\w+)/$', group_del),
url(r'^host_del/(\w+)/$', host_del),
url(r'^host_edit/$', host_edit),
url(r'^host_edit/batch/$', batch_host_edit),
url(r'^host_edit_common/batch/$', batch_host_edit_common),
url(r'^host_edit/batch/$', host_edit_batch),
url(r'^host_edit_common/batch/$', host_edit_common_batch),
)

View File

@ -17,11 +17,10 @@ class RaiseError(Exception):
pass
def f_add_host(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
def f_host_add(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
groups, depts = [], []
idc = IDC.objects.get(name=idc)
if jtype == 'M':
print username, password
a = Asset(ip=ip, port=port,
login_type=jtype, idc=idc,
is_active=int(active),
@ -50,14 +49,13 @@ def f_add_host(ip, port, idc, jtype, group, dept, active, comment, username='',
a.save()
def jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user='', j_password=''):
def f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user='', j_password=''):
groups, depts = [], []
is_active = {u'': '1', u'': '2'}
login_types = {'LDAP': 'L', 'MAP': 'M'}
for group in j_group[0].split():
c = BisGroup.objects.get(name=group.strip())
groups.append(c)
print j_dept
for d in j_dept[0].split():
p = DEPT.objects.get(name=d.strip())
depts.append(p)
@ -88,7 +86,7 @@ def jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_activ
@require_admin
def add_host(request):
def host_add(request):
login_types = {'L': 'LDAP', 'M': 'MAP'}
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
eidc = IDC.objects.exclude(name='ALL')
@ -123,16 +121,16 @@ def add_host(request):
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = cryptor.encrypt(request.POST.get('j_password'))
f_add_host(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
else:
f_add_host(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
smg = u'主机 %s 添加成功' % j_ip
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
@require_admin
def add_host_multi(request):
def host_add_batch(request):
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
login_types = {'LDAP': 'L', 'MAP': 'M'}
dept_id = get_user_dept(request)
@ -154,9 +152,9 @@ def add_host_multi(request):
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = cryptor.encrypt(request.POST.get('j_password'))
f_add_host(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
else:
f_add_host(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
smg = u'批量添加添加成功'
return HttpResponseRedirect('/jasset/host_list/')
@ -165,7 +163,7 @@ def add_host_multi(request):
@require_admin
def batch_host_edit(request):
def host_edit_batch(request):
if request.method == 'POST':
len_table = request.POST.get('len_table')
for i in range(int(len_table)):
@ -182,7 +180,7 @@ def batch_host_edit(request):
j_id = request.POST.get(j_id).strip()
j_ip = request.POST.get(j_ip).strip()
j_port = request.POST.get(j_port).strip()
j_dept = request.POST.getlist(j_dept).strip()
j_dept = request.POST.getlist(j_dept)
j_idc = request.POST.get(j_idc).strip()
j_type = request.POST.get(j_type).strip()
j_group = request.POST.getlist(j_group)
@ -195,16 +193,15 @@ def batch_host_edit(request):
j_user = request.POST.get(j_user).strip()
password = request.POST.get(j_password).strip()
j_password = cryptor.encrypt(password)
jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user,
j_password)
f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
else:
jasset_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
return render_to_response('jasset/host_list.html')
@require_login
def batch_host_edit_common(request):
def host_edit_common_batch(request):
user_id = request.session.get('user_id', '')
u = User.objects.get(id=user_id)
if request.method == 'POST':
@ -226,7 +223,7 @@ def batch_host_edit_common(request):
@require_login
def list_host(request):
def host_list(request):
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
login_types = {'L': 'LDAP', 'M': 'MAP'}
keyword = request.GET.get('keyword', '')
@ -298,9 +295,7 @@ def host_del(request, offset):
for i in range(int(len_list)):
key = "id_list[" + str(i) + "]"
jid = request.POST.get(key)
print jid
if is_group_admin(request) and not validate(request, asset=[jid]):
emg = u'删除失败,您无权操作!'
return HttpResponseRedirect('/jasset/host_list/')
a = Asset.objects.get(id=jid).ip
Asset.objects.filter(id=jid).delete()
@ -308,7 +303,6 @@ def host_del(request, offset):
else:
jid = int(offset)
if is_group_admin(request) and not validate(request, asset=[jid]):
emg = u'删除失败,您无权操作!'
return HttpResponseRedirect('/jasset/host_list/')
a = Asset.objects.get(id=jid).ip
BisGroup.objects.filter(name=a).delete()
@ -323,7 +317,7 @@ def host_edit(request):
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
groups, e_group, e_dept, depts = [], [], [], []
eidc = IDC.objects.all()
egroup = BisGroup.objects.all()
egroup = BisGroup.objects.exclude(name='ALL')
edept = DEPT.objects.all()
offset = request.GET.get('id')
for g in Asset.objects.get(id=int(offset)).bis_group.all():
@ -382,23 +376,26 @@ def host_edit(request):
a.dept = depts
a.save()
smg = u'主机 %s 修改成功' % j_ip
return HttpResponseRedirect('/jasset/host_list')
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % offset)
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
@require_login
def jlist_ip(request, offset):
def host_detail(request):
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
host_id = int(request.GET.get('id'))
post = Asset.objects.get(id=host_id)
host_ip = post.ip
login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'}
post = contact_list = Asset.objects.get(ip=str(offset))
log = Log.objects.filter(host=str(offset))
user_permed_list = asset_perm_api(Asset.objects.get(ip=str(offset)))
return render_to_response('jasset/jlist_ip.html', locals(), context_instance=RequestContext(request))
log_all = Log.objects.filter(host=host_ip)
log, log_more = log_all[:10], log_all[10:]
user_permed_list = asset_perm_api(post)
return render_to_response('jasset/host_detail.html', locals(), context_instance=RequestContext(request))
@require_super_user
def add_idc(request):
def idc_add(request):
header_title, path1, path2 = u'添加IDC', u'资产管理', u'添加IDC'
if request.method == 'POST':
j_idc = request.POST.get('j_idc')
@ -414,8 +411,10 @@ def add_idc(request):
@require_admin
def list_idc(request):
def idc_list(request):
header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC'
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
keyword = request.GET.get('keyword', '')
if keyword:
posts = IDC.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword))
@ -426,7 +425,7 @@ def list_idc(request):
@require_super_user
def edit_idc(request):
def idc_edit(request):
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
edit = 1
idc_id = request.GET.get('id')
@ -455,7 +454,7 @@ def edit_idc(request):
@require_super_user
def del_idc(request, offset):
def idc_del(request, offset):
if offset == 'multi':
len_list = request.POST.get("len_list")
for i in range(int(len_list)):
@ -469,7 +468,7 @@ def del_idc(request, offset):
@require_admin
def add_group(request):
def group_add(request):
header_title, path1, path2 = u'添加主机组', u'资产管理', u'添加主机组'
if is_super_user(request):
posts = Asset.objects.all()
@ -505,7 +504,7 @@ def add_group(request):
@require_admin
def list_group(request):
def group_list(request):
header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组'
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
@ -544,7 +543,7 @@ def list_group(request):
@require_admin
def edit_group(request):
def group_edit(request):
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
group_id = request.GET.get('id')
group = BisGroup.objects.get(id=group_id)
@ -578,7 +577,7 @@ def edit_group(request):
@require_admin
def detail_group(request):
def group_detail(request):
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'}
dept_id = get_user_dept(request)
@ -597,7 +596,7 @@ def detail_group(request):
@require_admin
def detail_idc(request):
def idc_detail(request):
header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情'
login_types = {'L': 'LDAP', 'M': 'MAP'}
idc_id = request.GET.get('id')
@ -647,7 +646,7 @@ def group_del(request, offset):
else:
gid = int(offset)
BisGroup.objects.filter(id=gid).delete()
return HttpResponseRedirect('/jasset/jgroup_list/')
return HttpResponseRedirect('/jasset/group_list/')
@require_login
@ -672,7 +671,6 @@ def host_search(request):
Q(bis_group__name__contains=keyword) | Q(comment__contains=keyword)) \
.distinct().order_by('ip')
posts = list(set(post_all) & set(post_perm))
print posts
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jasset/host_search.html', locals(), context_instance=RequestContext(request))

View File

@ -3,9 +3,8 @@ from django.conf.urls import patterns, include, url
from jlog.views import *
urlpatterns = patterns('',
url(r'^$', log_list_online),
url(r'^log_list/online/$', log_list_online),
url(r'^log_list/offline/$', log_list_offline),
url(r'^$', log_list),
url(r'^log_list/(\w+)/$', log_list),
url(r'^log_kill/(\d+)', log_kill),
url(r'^history/$', log_history),
url(r'^search/$', log_search),

View File

@ -13,82 +13,54 @@ from connect import BASE_DIR
from jlog.models import Log
from jumpserver.views import pages
from juser.models import User, DEPT
from jumpserver.api import get_user_dept, is_super_user, is_group_admin, is_common_user
from jumpserver.api import get_user_dept, is_super_user, is_group_admin, is_common_user, require_admin, require_login
CONF = ConfigParser.ConfigParser()
CONF.read('%s/jumpserver.conf' % BASE_DIR)
def log_list_online(request):
def get_user_log(request, keyword, env, username, dept_name):
if is_super_user(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=env).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=env).order_by('-start_time')
elif is_group_admin(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=env).filter(dept_name=dept_name).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=env).filter(dept_name=dept_name).order_by('-start_time')
elif is_common_user(request):
if keyword:
posts = Log.objects.filter(user=username).filter(Q(user__contains=keyword) | Q(host__contains=keyword))\
.filter(is_finished=env).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=env).filter(user=username).order_by('-start_time')
return posts
@require_login
def log_list(request, offset):
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
keyword = request.GET.get('keyword')
web_socket_host = CONF.get('websocket', 'web_socket_host')
env_dic = {'online': 0, 'offline': 1}
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)
if is_super_user(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=0).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=0).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_group_admin(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=0).filter(dept_name=dept_name).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=0).filter(dept_name=dept_name).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_common_user(request):
if keyword:
posts = Log.objects.filter(user=username).filter(Q(user__contains=keyword) | Q(host__contains=keyword))\
.filter(is_finished=0).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=0).filter(user=username).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jlog/log_online.html', locals(), context_instance=RequestContext(request))
def log_list_offline(request):
header_title, path1, path2 = u'查看日志', u'查看日志', u'历史记录'
keyword = request.GET.get('keyword')
web_socket_host = CONF.get('websocket', 'web_socket_host')
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
if is_super_user(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=1).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=1).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_group_admin(request):
if keyword:
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=1).filter(dept_name=dept_name).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=1).filter(dept_name=dept_name).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_common_user(request):
if keyword:
posts = Log.objects.filter(user=username).filter(Q(user__contains=keyword) | Q(host__contains=keyword))\
.filter(is_finished=1).order_by('-start_time')
else:
posts = Log.objects.filter(is_finished=1).filter(user=username).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jlog/log_offline.html', locals(), context_instance=RequestContext(request))
return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request))
@require_admin
def log_kill(request, offset):
pid = offset
if pid:
@ -97,6 +69,7 @@ def log_kill(request, offset):
return HttpResponseRedirect('jlog/log_offline.html', locals(), context_instance=RequestContext(request))
@require_login
def log_history(request):
if request.method == 'GET':
id = request.GET.get('id', 0)
@ -109,37 +82,17 @@ def log_history(request):
return HttpResponse(content)
@require_login
def log_search(request):
keyword = request.GET.get('keyword')
env = request.GET.get('env')
offset = request.GET.get('env')
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
if is_super_user(request):
if env == 'online':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=0).order_by('-start_time')
elif env == 'offline':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=1).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_group_admin(request):
if env == 'online':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=0).filter(dept_name=dept_name).order_by('-start_time')
elif env == 'offline':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=1).filter(dept_name=dept_name).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_common_user(request):
if env == 'online':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=0).filter(user=username).order_by('-start_time')
elif env == 'offline':
posts = contact_list = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
.filter(is_finished=1).filter(user=username).order_by('-start_time')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
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)
return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request))

View File

@ -45,7 +45,7 @@ class Apply(models.Model):
asset = models.CharField(max_length=500)
comment = models.TextField(blank=True, null=True)
status = models.IntegerField(max_length=2)
date_add = models.DateTimeField(default=datetime.datetime.now(), null=True)
date_add = models.DateTimeField(null=True)
date_end = models.DateTimeField(null=True)
def __unicode__(self):

View File

@ -28,5 +28,6 @@ urlpatterns = patterns('jperm.views',
(r'^apply_show/(\w+)/$', 'perm_apply_log'),
(r'^apply_exec/$', 'perm_apply_exec'),
(r'^apply_info/$', 'perm_apply_info'),
(r'^apply_del/$', 'perm_apply_del'),
(r'^apply_search/$', 'perm_apply_search'),
)

View File

@ -1,10 +1,8 @@
# coding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from django.core.mail import send_mail
from django.shortcuts import render_to_response
from django.template import RequestContext
@ -13,6 +11,12 @@ from django.db.models import Q
from jumpserver.api import *
CONF = ConfigParser()
CONF.read('%s/jumpserver.conf' % BASE_DIR)
send_ip = CONF.get('base', 'ip')
send_port = CONF.get('base', 'port')
def asset_cmd_groups_get(asset_groups_select='', cmd_groups_select=''):
asset_groups_select_list = []
cmd_groups_select_list = []
@ -653,9 +657,9 @@ def perm_apply(request):
group_lis = ', '.join(group)
hosts_lis = ', '.join(hosts)
time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
Apply.objects.create(applyer=applyer, dept=dept, bisgroup=group, asset=hosts, status=0, comment=comment)
uuid = Apply.objects.get(applyer=applyer, asset=hosts, comment=comment).uuid
url = "http://127.0.0.1:8000/jperm/apply_exec/?uuid=%s" % uuid
a = Apply.objects.create(applyer=applyer, dept=dept, bisgroup=group, date_add=datetime.datetime.now(), asset=hosts, status=0, comment=comment)
uuid = a.uuid
url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (send_ip, send_port, uuid)
mail_msg = """
Hi,%s:
有新的权限申请, 详情如下:
@ -664,12 +668,12 @@ def perm_apply(request):
申请的主机: %s
申请时间: %s
申请说明: %s
请及时审批, 审批完成后点击以下链接,告知申请人
请及时审批, 审批完成后, 点击以下链接或登录授权管理-权限审批页面点击确认键,告知申请人
%s
""" % (da.username, applyer, group_lis, hosts_lis, time_now, comment, url)
send_mail(mail_title, mail_msg, 'jumpserver@163.com', [mail_address], fail_silently=False)
send_mail(mail_title, mail_msg, 'jkfunshion@fun.tv', [mail_address], fail_silently=False)
smg = "提交成功,已发邮件通知部门管理员。"
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
@ -679,6 +683,8 @@ def perm_apply(request):
def perm_apply_exec(request):
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'审批完成'
uuid = request.GET.get('uuid')
user_id = request.session.get('user_id')
approver = User.objects.get(id=user_id).name
if uuid:
p_apply = Apply.objects.filter(uuid=str(uuid))
q_apply = Apply.objects.get(uuid=str(uuid))
@ -689,7 +695,7 @@ def perm_apply_exec(request):
user = User.objects.get(username=q_apply.applyer)
mail_address = user.email
time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
p_apply.update(status=1, date_end=time_now)
p_apply.update(status=1, approver=approver, date_end=time_now)
mail_title = '%s - 权限审批完成' % q_apply.applyer
mail_msg = """
Hi,%s:
@ -699,7 +705,7 @@ def perm_apply_exec(request):
smg = '授权完成, 已邮件通知申请人, 十秒钟后返回首页'
return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request))
else:
smg = '没有此授权, 十秒钟后返回首页'
smg = '没有此授权记录, 十秒钟后返回首页'
return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request))
@ -735,56 +741,41 @@ def perm_apply_log(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
if offset == 'online':
posts = get_apply_posts(request, 0, username, dept_name, keyword)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jperm/perm_log_online.html', locals(), context_instance=RequestContext(request))
elif offset == 'offline':
posts = get_apply_posts(request, 1, username, dept_name, keyword)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jperm/perm_log_offline.html', locals(), context_instance=RequestContext(request))
status_dic = {'online': 0, 'offline': 1}
status = status_dic[offset]
posts = get_apply_posts(request, status, username, dept_name, keyword)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jperm/perm_log_%s.html' % offset, locals(), context_instance=RequestContext(request))
@require_login
def perm_apply_info(request):
uuid = request.GET.get('uuid')
post = Apply.objects.get(uuid=uuid)
return render_to_response('jperm/perm_apply_info.html', locals(), context_instance=RequestContext(request))
@require_admin
def perm_apply_del(request):
uuid = request.GET.get('uuid')
u_apply = Apply.objects.filter(uuid=uuid)
if u_apply:
u_apply.delete()
return HttpResponseRedirect('/jperm/apply_show/online/')
@require_login
def perm_apply_search(request):
keyword = request.GET.get('keyword')
env = request.GET.get('env')
offset = request.GET.get('env')
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
if is_super_user(request):
if env == 'online':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=0).order_by('-date_add')
elif env == 'offline':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=1).order_by('-date_add')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_group_admin(request):
if env == 'online':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=0).filter(dept_name=dept_name).order_by('-date_add')
elif env == 'offline':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=1).filter(dept_name=dept_name).order_by('-date_add')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
elif is_common_user(request):
if env == 'online':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=0).filter(user=username).order_by('-date_add')
elif env == 'offline':
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
.filter(status=1).filter(applyer=username).order_by('-date_add')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
status_dic = {'online': 0, 'offline': 1}
status = status_dic[offset]
posts = get_apply_posts(request, status, username, dept_name, keyword)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return render_to_response('jperm/perm_apply_search.html', locals(), context_instance=RequestContext(request))

View File

@ -1,5 +1,10 @@
#coding: utf8
[base]
ip = 192.168.173.129
port = 80
[db]
host = 127.0.0.1
port = 3306
@ -7,6 +12,7 @@ user = jumpserver
password = mysql234
database = jumpserver
[ldap]
ldap_enable = 1
host_url = ldap://127.0.0.1:389
@ -14,15 +20,18 @@ base_dn = dc=jumpserver, dc=org
root_dn = cn=admin,dc=jumpserver,dc=org
root_pw = secret234
[websocket]
web_socket_host = 127.0.0.1:3000
web_socket_host = 192.168.173.129:3000
[web]
key = 88aaaf7ffe3c6c04
[mail]
email_host = 'mail.funshion.com'
email_port = '25'
email_host_user = 'jkfunshion'
email_host_password = 'jkmail%'
email_host = mail.funshion.com
email_port = 25
email_host_user = jkfunshion
email_host_password = jkmail%
email_use_tls = False

View File

@ -300,9 +300,10 @@ def user_perm_asset_api(username):
asset_group_list = user_perm_group_api(user)
for asset_group in asset_group_list:
asset_list.extend(asset_group.asset_set.all())
asset_list = list(set(asset_list))
return asset_list
return []
else:
return []
def asset_perm_api(asset):
@ -319,6 +320,7 @@ def asset_perm_api(asset):
user_permed_list = []
for user_group in user_group_list:
user_permed_list.extend(user_group.user_set.all())
user_permed_list = list(set(user_permed_list))
return user_permed_list

View File

@ -9,16 +9,22 @@ def name_proc(request):
if role_id == 2:
user_total_num = User.objects.all().count()
user_active_num = User.objects.filter().count()
host_total_num = Asset.objects.all().count()
host_active_num = Asset.objects.filter(is_active=True).count()
else:
user, dept = get_session_user_dept(request)
user_total_num = dept.user_set.all().count()
user_active_num = dept.user_set.filter(is_active=True).count()
host_total_num = Asset.objects.all().count()
host_active_num = Asset.objects.filter(is_active=True).count()
host_total_num = dept.asset_set.all().count()
host_active_num = dept.asset_set.all().filter(is_active=True).count()
request.session.set_expiry(3600)
return {'session_user_id': user_id, 'session_role_id': role_id,
'user_total_num': user_total_num, 'user_active_num': user_active_num,
'host_total_num': host_total_num, 'host_active_num': host_active_num}
info_dic = {'session_user_id': user_id,
'session_role_id': role_id,
'user_total_num': user_total_num,
'user_active_num': user_active_num,
'host_total_num': host_total_num,
'host_active_num': host_active_num}
return info_dic

View File

@ -24,11 +24,11 @@ DB_PASSWORD = config.get('db', 'password')
DB_DATABASE = config.get('db', 'database')
# mail config
EMAIL_HOST = 'mail.funshion.com'
EMAIL_PORT = '25'
EMAIL_HOST_USER = 'jkfunshion'
EMAIL_HOST_PASSWORD = 'jkmail%'
EMAIL_USE_TLS = False
EMAIL_HOST = config.get('mail', 'email_host')
EMAIL_PORT = config.get('mail', 'email_port')
EMAIL_HOST_USER = config.get('mail', 'email_host_user')
EMAIL_HOST_PASSWORD = config.get('mail', 'email_host_password')
EMAIL_USE_TLS = config.getboolean('mail', 'email_use_tls')
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/

View File

@ -200,6 +200,18 @@ def ast_to_list(lis):
return restr
@register.filter(name='get_group_count')
def get_group_count(post, dept):
count = post.asset_set.filter(dept=dept).count()
return count
@register.filter(name='get_idc_count')
def get_idc_count(post, dept):
count = post.asset_set.filter(dept=dept).count()
return count
@register.filter(name='ast_to_list_1')
def ast_to_list_1(lis):
return ast.literal_eval(lis)

View File

@ -107,6 +107,7 @@ def admin_index(request):
# latest 10 login
login_10 = Log.objects.order_by('-start_time')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:21]
# a week top 10
for user_info in user_top_ten:
@ -146,10 +147,16 @@ def index(request):
active_hosts = Asset.objects.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%')
if users.count() == 0:
percent_user, percent_online_user = '0%', '0%'
else:
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)
today = datetime.datetime.now().day
@ -168,6 +175,7 @@ def index(request):
# perm apply latest 10
perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:20]
# latest 10 login
login_10 = Log.objects.order_by('-start_time')[:10]

View File

@ -89,6 +89,10 @@
<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"></ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
@ -153,7 +157,29 @@
{% endfor %}
</div>
<button 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">
<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>
</div>
@ -172,12 +198,7 @@
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">Config option 1</a>
</li>
<li><a href="#">Config option 2</a>
</li>
</ul>
<ul class="dropdown-menu dropdown-user"></ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
@ -218,6 +239,12 @@
</div>
<script>
$(document).ready(function(){
$('#show').click(function(){
$('#show').css('display', 'none');
$('#more').css('display', 'block');
})
})
var cate = {{ li_str|safe }};
$(function () {
$('#top10').highcharts({

View File

@ -1,4 +1,5 @@
{% extends 'base.html' %}
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
@ -40,12 +41,16 @@
<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"> {{ post.name }} </td>
<td class="text-center"> {{ post.dept.name }} </td>
<td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td>
{% ifequal session_role_id 2 %}
<td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td>
{% else %}
<td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ post|get_group_count:dept }}</a> </td>
{% endifequal %}
<td class="text-center"> {{ post.comment }} </td>
<td class="text-center">
<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_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a>
<a href="/jasset/group_del/{{ post.id }}/" class="btn btn-xs btn-danger">删除</a>
</td>
</tr>
{% endfor %}

View File

@ -0,0 +1,212 @@
{% 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-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="text text-primary"><b>{{ post.ip }}</b></span>
<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">
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content ibox-heading">
<h3>主机详细信息</h3>
<small><i class="fa fa-map-marker"></i> 此主机详细信息.</small>
</div>
<div class="ibox-content">
<div>
<div class="text-left">
<table class="table">
<tr>
<td class="text-navy">IP</td>
<td>{{ post.ip }}</td>
</tr>
<tr>
<td class="text-navy">端口</td>
<td>{{ post.port }}</td>
</tr>
<tr>
<td class="text-navy">登录方式</td>
<td>{{ login_types|get_item:post.login_type }}</td>
</tr>
<tr>
<td class="text-navy">IDC</td>
<td>{{ post.idc.name }} </td>
</tr>
<tr>
<td class="text-navy">部门</td>
<td>
<table class="table">
{% for dept in post.dept.all %}
<tr>
<td>{{ dept.name }}</td>
</tr>
{% endfor %}
</table>
</td>
</tr>
<tr>
<td class="text-navy">主机组</td>
<td>
<table class="table">
{% for group in post.bis_group.all %}
<tr>
<td>{{ group.name }}</td>
</tr>
{% endfor %}
</table>
</td>
</tr>
<tr>
<td class="text-navy">激活</td>
<td>{{ user.is_active|bool2str }}</td>
</tr>
<tr>
<td class="text-navy">添加日期</td>
<td>{{ post.date_added|date:"Y-m-d H:i:s" }}</td>
</tr>
<tr>
<td class="text-navy">备注</td>
<td>{{ post.comment }}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4">
<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">
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content ibox-heading">
<h3>主机所有授权的用户</h3>
<small><i class="fa fa-map-marker"></i> 包含了此主机所有授权的用户.</small>
</div>
<div class="ibox-content">
<div>
<div class="text-left">
<table class="table">
{% for user in user_permed_list %}
<tr>
<td class="text-navy">{{ user.name }}</td>
<td>{{ user.dept.name }}</td>
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4">
<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">
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content ibox-heading">
<h3>最近一周登录记录</h3>
<small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small>
</div>
<div class="ibox-content inspinia-timeline">
{% for l in log %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</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>
{% endfor %}
<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/>
{% for l in log_more %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</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>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
$('#show').click(function(){
$('#show').css('display', 'none');
$('#more').css('display', 'block');
})
})
</script>
{% endblock %}

View File

@ -73,7 +73,7 @@
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
<td class="text-center" name="j_comment"> {{ post.comment }} </td>
<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>
{% 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>

View File

@ -1,4 +1,5 @@
{% extends 'base.html' %}
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
@ -8,7 +9,9 @@
<div class="ibox float-e-margins">
<div class="ibox-content">
<div class="">
<a target="_blank" href="/jasset/idc_add" class="btn btn-sm btn-primary "> 添加IDC </a>
{% ifequal session_role_id 2 %}
<a target="_blank" href="/jasset/idc_add" class="btn btn-sm btn-primary "> 添加IDC </a>
{% endifequal %}
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
@ -26,7 +29,9 @@
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th>
{% ifequal session_role_id 2 %}
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th>
{% endifequal %}
<th class="text-center"> 机房名 </th>
<th class="text-center"> 主机数量 </th>
<th class="text-center"> 备注 </th>
@ -36,14 +41,22 @@
<tbody>
{% for post in contacts.object_list %}
<tr class="gradeX">
<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>
{% ifequal session_role_id 2 %}
<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>
{% endifequal %}
<td class="text-center"> {{ post.name }} </td>
<td class="text-center"> <a href="/jasset/idc_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td>
{% ifequal session_role_id 2 %}
<td class="text-center"> <a href="/jasset/idc_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td>
{% else %}
<td class="text-center"> <a href="/jasset/idc_detail/?id={{ post.id }}">{{ post|get_idc_count:dept }}</a> </td>
{% endifequal %}
<td class="text-center"> {{ post.comment }} </td>
<td class="text-center">
<a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</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>
{% ifequal session_role_id 2 %}
<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>
{% endifequal %}
</td>
</tr>
{% endfor %}
@ -51,8 +64,10 @@
</table>
<div class="row">
<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="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
{% 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="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
{% endifequal %}
</div>
{% include 'paginator.html' %}
</div>

View File

@ -125,8 +125,8 @@
var ip = $('#ip')[0].innerText;
var start_time = $('#start_time')[0].innerText;
var end_time = $('#end_time')[0].innerText;
var div_username = ' 登录用户名: '+'<span class="text-info">'+username+'' + '</span>';
var div_ip = ' 登录主机: '+'<span class="text-info">' + ip + '</span>';
var div_username = ' 用户名: '+'<span class="text-info">'+username+'' + '</span>';
var div_ip = ' 主机: '+'<span class="text-info">' + ip + '</span>';
var div_time = ' 开始时间: ' + '<span class="text-info">'+start_time +'</span>' + ' 结束时间: ' +'<span class="text-info">' + end_time + '</span'
var title = 'JumpServer命令统计 '+ div_username + div_ip + div_time
$.ajax({url:url,success:function(data){
@ -138,16 +138,6 @@
SOCKET_HOST: "{{ web_socket_host }}"
}
function cut(num){
var g_url = "/jlog/log_kill/"+num;
console.log(g_url);
$.ajax({
type: "GET",
url: g_url,
success: window.open("/jlog/","_self")
});
}
function log_search(){
$.ajax({
type: "GET",

View File

@ -92,9 +92,9 @@
{% for post in contacts.object_list %}
<tr class="gradeX">
<td id="username" class="text-center"> {{ post.user }} </td>
<td id="ip" class="text-center"> {{ post.dept_name }} </td>
<td id="deptname" class="text-center"> {{ post.dept_name }} </td>
<td id="ip" class="text-center"> {{ post.host }} </td>
<td id="ip" class="text-center"> {{ post.remote_ip }} </td>
<td id="remote_ip" class="text-center"> {{ post.remote_ip }} </td>
{% ifnotequal session_role_id 0 %}
<td class="text-center"><a class="monitor" filename="{{ post.log_path }}"> 监控 </a></td>
<td class="text-center"><input type="button" id="cut" class="btn btn-danger btn-xs" name="cut" value="阻断" onclick='cut("{{ post.pid }}")' /></td>
@ -187,7 +187,6 @@
function log_search(){
console.log('hell0')
$.ajax({
type: "GET",
url: "/jlog/search/?env=online",
@ -210,7 +209,7 @@
$.ajax({
type: "GET",
url: g_url,
success: window.open("/jlog/","_self")
success: window.open("/jlog/log_list/online/","_self")
});
}

View File

@ -9,7 +9,6 @@
<th class="text-center"> 申请主机 </th>
<th class="text-center"> 批准人 </th>
<th class="text-center"> 申请时间 </th>
<!--<th class="text-center"> 批准时间 </th>-->
<th class="text-center"> 备注 </th>
<th class="text-center"> 详情 </th>
@ -20,11 +19,10 @@
<tr class="gradeX">
<td class="text-center" id="username"> {{ post.applyer }} </td>
<td class="text-center" id="dept"> {{ post.dept }} </td>
<td class="text-center" id="ip"> {% for i in post.bisgroup|ast_to_list %} {{ i }} {% endfor %}... </td>
<td class="text-center" id="remote_ip">{% for i in post.asset|ast_to_list %} {{ i }} {% endfor %}... </td>
<td class="text-center" id="ip"> {{ post.bisgroup|ast_to_list }} </td>
<td class="text-center" id="remote_ip"> {{ post.asset|ast_to_list }} </td>
<td class="text-center" id="approver"> {{ post.approver }} </td>
<td class="text-center" id="start_time"> {{ post.date_add|date:"Y-m-d H:i:s"}} </td>
<!--<td class="text-center" id="end_time"> {{ post.date_end|date:"Y-m-d H:i:s" }} </td>-->
<td class="text-center" id=""> {{ post.comment }} </td>
<td class="text-center" data-editable='false'>
<a value="/jperm/apply_info/?uuid={{ post.uuid }}" class="iframe btn btn-xs btn-primary">详情</a>

View File

@ -72,7 +72,11 @@
<td class="text-center" id="start_time"> {{ post.date_add|date:"Y-m-d H:i:s"}} </td>
<td class="text-center" id=""> {{ post.comment }} </td>
<td class="text-center" data-editable='false'>
<a value="/jperm/apply_info/?uuid={{ post.uuid }}" class="iframe btn btn-xs btn-primary">详情</a>
<a value="/jperm/apply_info/?uuid={{ post.uuid }}" class="iframe btn btn-xs btn-primary">详情</a>
{% ifnotequal session_role_id 0 %}
<a href="/jperm/apply_exec/?uuid={{ post.uuid }}" class="btn btn-xs btn-info">确认</a>
<a href="/jperm/apply_del/?uuid={{ post.uuid }}" class="btn btn-xs btn-danger">删除</a>
{% endifnotequal %}
</td>
</tr>
{% endfor %}

View File

@ -27,7 +27,7 @@
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>
<li class="host_list"><a href="/jasset/host_list/">查看资产&nbsp&nbsp</span><span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="host_list host_detail"><a href="/jasset/host_list/">查看资产&nbsp&nbsp</span><span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></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="idc_add"><a href="/jasset/idc_add/">添加IDC</a></li>
@ -97,7 +97,7 @@
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>
<li class="host_list"><a href="/jasset/host_list/">查看资产&nbsp&nbsp</span><span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="host_list host_detail"><a href="/jasset/host_list/">查看资产&nbsp&nbsp</span><span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></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="idc_list idc_detail"><a href="/jasset/idc_list/">查看IDC</a></li>

View File

@ -13,7 +13,7 @@
</li>
<li class="dropdown">
<a class="dropdown-toggle count-info" data-toggle="dropdown" href="#">
<i class="fa fa-envelope"></i> <span class="label label-warning">16</span>
<i class="fa fa-envelope"></i> <span class="label label-warning">{{ message }}</span>
</a>
<ul class="dropdown-menu dropdown-messages">
<li>
@ -64,49 +64,6 @@
</li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle count-info" data-toggle="dropdown" href="#">
<i class="fa fa-bell"></i> <span class="label label-primary">8</span>
</a>
<ul class="dropdown-menu dropdown-alerts">
<li>
<a href="mailbox.html">
<div>
<i class="fa fa-envelope fa-fw"></i> You have 16 messages
<span class="pull-right text-muted small">4 minutes ago</span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="profile.html">
<div>
<i class="fa fa-twitter fa-fw"></i> 3 New Followers
<span class="pull-right text-muted small">12 minutes ago</span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="grid_options.html">
<div>
<i class="fa fa-upload fa-fw"></i> Server Rebooted
<span class="pull-right text-muted small">4 minutes ago</span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<div class="text-center link-block">
<a href="notifications.html">
<strong>See All Alerts</strong>
<i class="fa fa-angle-right"></i>
</a>
</div>
</li>
</ul>
</li>
<li>
<a href="/logout/">
<i class="fa fa-sign-out"></i> Log out

920
websocket/npm-debug.log Normal file
View File

@ -0,0 +1,920 @@
0 info it worked if it ends with ok
1 verbose cli [ '/opt/node/bin/node', '/opt/node/bin/npm', 'install' ]
2 info using npm@1.4.28
3 info using node@v0.10.33
4 warn package.json web-socket@0.0.1 No repository field.
5 warn package.json web-socket@0.0.1 No README data
6 verbose readDependencies using package.json deps
7 verbose install where, deps [ '/mnt/hgfs/jumpserver/websocket',
7 verbose install [ 'express', 'socket.io', 'node-tail', 'tail' ] ]
8 info preinstall web-socket@0.0.1
9 verbose readDependencies using package.json deps
10 verbose cache add [ 'express@~4.10.1', null ]
11 verbose cache add name=undefined spec="express@~4.10.1" args=["express@~4.10.1",null]
12 verbose parsed url { protocol: null,
12 verbose parsed url slashes: null,
12 verbose parsed url auth: null,
12 verbose parsed url host: null,
12 verbose parsed url port: null,
12 verbose parsed url hostname: null,
12 verbose parsed url hash: null,
12 verbose parsed url search: null,
12 verbose parsed url query: null,
12 verbose parsed url pathname: 'express@~4.10.1',
12 verbose parsed url path: 'express@~4.10.1',
12 verbose parsed url href: 'express@~4.10.1' }
13 verbose cache add [ 'socket.io@~1.2.0', null ]
14 verbose cache add name=undefined spec="socket.io@~1.2.0" args=["socket.io@~1.2.0",null]
15 verbose parsed url { protocol: null,
15 verbose parsed url slashes: null,
15 verbose parsed url auth: null,
15 verbose parsed url host: null,
15 verbose parsed url port: null,
15 verbose parsed url hostname: null,
15 verbose parsed url hash: null,
15 verbose parsed url search: null,
15 verbose parsed url query: null,
15 verbose parsed url pathname: 'socket.io@~1.2.0',
15 verbose parsed url path: 'socket.io@~1.2.0',
15 verbose parsed url href: 'socket.io@~1.2.0' }
16 verbose cache add name="express" spec="~4.10.1" args=["express","~4.10.1"]
17 verbose parsed url { protocol: null,
17 verbose parsed url slashes: null,
17 verbose parsed url auth: null,
17 verbose parsed url host: null,
17 verbose parsed url port: null,
17 verbose parsed url hostname: null,
17 verbose parsed url hash: null,
17 verbose parsed url search: null,
17 verbose parsed url query: null,
17 verbose parsed url pathname: '~4.10.1',
17 verbose parsed url path: '~4.10.1',
17 verbose parsed url href: '~4.10.1' }
18 verbose addNamed [ 'express', '~4.10.1' ]
19 verbose addNamed [ null, '>=4.10.1-0 <4.11.0-0' ]
20 verbose cache add name="socket.io" spec="~1.2.0" args=["socket.io","~1.2.0"]
21 verbose parsed url { protocol: null,
21 verbose parsed url slashes: null,
21 verbose parsed url auth: null,
21 verbose parsed url host: null,
21 verbose parsed url port: null,
21 verbose parsed url hostname: null,
21 verbose parsed url hash: null,
21 verbose parsed url search: null,
21 verbose parsed url query: null,
21 verbose parsed url pathname: '~1.2.0',
21 verbose parsed url path: '~1.2.0',
21 verbose parsed url href: '~1.2.0' }
22 verbose addNamed [ 'socket.io', '~1.2.0' ]
23 verbose addNamed [ null, '>=1.2.0-0 <1.3.0-0' ]
24 verbose cache add [ 'node-tail@0.0.4', null ]
25 verbose cache add name=undefined spec="node-tail@0.0.4" args=["node-tail@0.0.4",null]
26 verbose parsed url { protocol: null,
26 verbose parsed url slashes: null,
26 verbose parsed url auth: null,
26 verbose parsed url host: null,
26 verbose parsed url port: null,
26 verbose parsed url hostname: null,
26 verbose parsed url hash: null,
26 verbose parsed url search: null,
26 verbose parsed url query: null,
26 verbose parsed url pathname: 'node-tail@0.0.4',
26 verbose parsed url path: 'node-tail@0.0.4',
26 verbose parsed url href: 'node-tail@0.0.4' }
27 verbose cache add [ 'tail@~0.4.0', null ]
28 verbose cache add name=undefined spec="tail@~0.4.0" args=["tail@~0.4.0",null]
29 verbose parsed url { protocol: null,
29 verbose parsed url slashes: null,
29 verbose parsed url auth: null,
29 verbose parsed url host: null,
29 verbose parsed url port: null,
29 verbose parsed url hostname: null,
29 verbose parsed url hash: null,
29 verbose parsed url search: null,
29 verbose parsed url query: null,
29 verbose parsed url pathname: 'tail@~0.4.0',
29 verbose parsed url path: 'tail@~0.4.0',
29 verbose parsed url href: 'tail@~0.4.0' }
30 verbose cache add name="node-tail" spec="0.0.4" args=["node-tail","0.0.4"]
31 verbose parsed url { protocol: null,
31 verbose parsed url slashes: null,
31 verbose parsed url auth: null,
31 verbose parsed url host: null,
31 verbose parsed url port: null,
31 verbose parsed url hostname: null,
31 verbose parsed url hash: null,
31 verbose parsed url search: null,
31 verbose parsed url query: null,
31 verbose parsed url pathname: '0.0.4',
31 verbose parsed url path: '0.0.4',
31 verbose parsed url href: '0.0.4' }
32 verbose addNamed [ 'node-tail', '0.0.4' ]
33 verbose addNamed [ '0.0.4', '0.0.4' ]
34 verbose cache add name="tail" spec="~0.4.0" args=["tail","~0.4.0"]
35 verbose parsed url { protocol: null,
35 verbose parsed url slashes: null,
35 verbose parsed url auth: null,
35 verbose parsed url host: null,
35 verbose parsed url port: null,
35 verbose parsed url hostname: null,
35 verbose parsed url hash: null,
35 verbose parsed url search: null,
35 verbose parsed url query: null,
35 verbose parsed url pathname: '~0.4.0',
35 verbose parsed url path: '~0.4.0',
35 verbose parsed url href: '~0.4.0' }
36 verbose addNamed [ 'tail', '~0.4.0' ]
37 verbose addNamed [ null, '>=0.4.0-0 <0.5.0-0' ]
38 silly makeCacheDir cache dir uid, gid [ 0, 0 ]
39 silly lockFile c572b5f8-express-4-10-1 express@~4.10.1
40 verbose lock express@~4.10.1 /root/.npm/c572b5f8-express-4-10-1.lock
41 silly lockFile c0bd7c21-socket-io-1-2-0 socket.io@~1.2.0
42 verbose lock socket.io@~1.2.0 /root/.npm/c0bd7c21-socket-io-1-2-0.lock
43 silly lockFile 7bc2e09d-node-tail-0-0-4 node-tail@0.0.4
44 verbose lock node-tail@0.0.4 /root/.npm/7bc2e09d-node-tail-0-0-4.lock
45 silly lockFile 81e86088-tail-0-4-0 tail@~0.4.0
46 verbose lock tail@~0.4.0 /root/.npm/81e86088-tail-0-4-0.lock
47 silly addNameRange { name: 'express',
47 silly addNameRange range: '>=4.10.1-0 <4.11.0-0',
47 silly addNameRange hasData: false }
48 silly addNameRange { name: 'socket.io',
48 silly addNameRange range: '>=1.2.0-0 <1.3.0-0',
48 silly addNameRange hasData: false }
49 silly addNameRange { name: 'tail', range: '>=0.4.0-0 <0.5.0-0', hasData: false }
50 verbose request where is /express
51 verbose request registry https://registry.npmjs.org/
52 verbose request id b01793793819fcd9
53 verbose url raw /express
54 verbose url resolving [ 'https://registry.npmjs.org/', './express' ]
55 verbose url resolved https://registry.npmjs.org/express
56 verbose request where is https://registry.npmjs.org/express
57 info trying registry request attempt 1 at 14:25:44
58 http GET https://registry.npmjs.org/express
59 verbose request where is /socket.io
60 verbose request registry https://registry.npmjs.org/
61 verbose url raw /socket.io
62 verbose url resolving [ 'https://registry.npmjs.org/', './socket.io' ]
63 verbose url resolved https://registry.npmjs.org/socket.io
64 verbose request where is https://registry.npmjs.org/socket.io
65 info trying registry request attempt 1 at 14:25:44
66 http GET https://registry.npmjs.org/socket.io
67 verbose request where is /node-tail
68 verbose request registry https://registry.npmjs.org/
69 verbose url raw /node-tail
70 verbose url resolving [ 'https://registry.npmjs.org/', './node-tail' ]
71 verbose url resolved https://registry.npmjs.org/node-tail
72 verbose request where is https://registry.npmjs.org/node-tail
73 info trying registry request attempt 1 at 14:25:44
74 http GET https://registry.npmjs.org/node-tail
75 verbose request where is /tail
76 verbose request registry https://registry.npmjs.org/
77 verbose url raw /tail
78 verbose url resolving [ 'https://registry.npmjs.org/', './tail' ]
79 verbose url resolved https://registry.npmjs.org/tail
80 verbose request where is https://registry.npmjs.org/tail
81 info trying registry request attempt 1 at 14:25:44
82 http GET https://registry.npmjs.org/tail
83 http 200 https://registry.npmjs.org/tail
84 silly registry.get cb [ 200,
84 silly registry.get { date: 'Thu, 09 Apr 2015 06:25:45 GMT',
84 silly registry.get server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
84 silly registry.get etag: '"C9AIR53EVM8NBBGXJRBQ2E57K"',
84 silly registry.get 'content-type': 'application/json',
84 silly registry.get 'cache-control': 'max-age=60',
84 silly registry.get 'content-length': '17175',
84 silly registry.get 'accept-ranges': 'bytes',
84 silly registry.get via: '1.1 varnish',
84 silly registry.get age: '0',
84 silly registry.get 'x-served-by': 'cache-nrt6131-NRT',
84 silly registry.get 'x-cache': 'MISS',
84 silly registry.get 'x-cache-hits': '0',
84 silly registry.get 'x-timer': 'S1428560745.664080,VS0,VE330',
84 silly registry.get vary: 'Accept',
84 silly registry.get 'keep-alive': 'timeout=10, max=50',
84 silly registry.get connection: 'Keep-Alive' } ]
85 silly addNameRange number 2 { name: 'tail', range: '>=0.4.0-0 <0.5.0-0', hasData: true }
86 silly addNameRange versions [ 'tail',
86 silly addNameRange [ '0.0.3',
86 silly addNameRange '0.0.4',
86 silly addNameRange '0.1.0',
86 silly addNameRange '0.1.1',
86 silly addNameRange '0.1.2',
86 silly addNameRange '0.2.0',
86 silly addNameRange '0.2.1',
86 silly addNameRange '0.2.2',
86 silly addNameRange '0.2.3',
86 silly addNameRange '0.2.4',
86 silly addNameRange '0.3.0',
86 silly addNameRange '0.3.1',
86 silly addNameRange '0.3.2',
86 silly addNameRange '0.3.5',
86 silly addNameRange '0.3.6',
86 silly addNameRange '0.3.7',
86 silly addNameRange '0.3.8',
86 silly addNameRange '0.3.9',
86 silly addNameRange '0.4.0' ] ]
87 verbose addNamed [ 'tail', '0.4.0' ]
88 verbose addNamed [ '0.4.0', '0.4.0' ]
89 silly lockFile e7d4c0e4-tail-0-4-0 tail@0.4.0
90 verbose lock tail@0.4.0 /root/.npm/e7d4c0e4-tail-0-4-0.lock
91 silly lockFile 8067702d-ry-npmjs-org-tail-tail-0-4-0-tgz https://registry.npmjs.org/tail/-/tail-0.4.0.tgz
92 verbose lock https://registry.npmjs.org/tail/-/tail-0.4.0.tgz /root/.npm/8067702d-ry-npmjs-org-tail-tail-0-4-0-tgz.lock
93 verbose addRemoteTarball [ 'https://registry.npmjs.org/tail/-/tail-0.4.0.tgz',
93 verbose addRemoteTarball 'd29de72750cc99db1e053aff13c359ecfb713002' ]
94 info retry fetch attempt 1 at 14:25:46
95 verbose fetch to= /tmp/npm-25723-hzRsuUDH/registry.npmjs.org/tail/-/tail-0.4.0.tgz
96 http GET https://registry.npmjs.org/tail/-/tail-0.4.0.tgz
97 http 200 https://registry.npmjs.org/node-tail
98 silly registry.get cb [ 200,
98 silly registry.get { date: 'Thu, 09 Apr 2015 06:25:46 GMT',
98 silly registry.get server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
98 silly registry.get etag: '"3O3MG0O1PBD2NBRQMCK50UX0W"',
98 silly registry.get 'content-type': 'application/json',
98 silly registry.get 'cache-control': 'max-age=60',
98 silly registry.get 'content-length': '4600',
98 silly registry.get 'accept-ranges': 'bytes',
98 silly registry.get via: '1.1 varnish',
98 silly registry.get age: '0',
98 silly registry.get 'x-served-by': 'cache-nrt6131-NRT',
98 silly registry.get 'x-cache': 'MISS',
98 silly registry.get 'x-cache-hits': '0',
98 silly registry.get 'x-timer': 'S1428560745.575766,VS0,VE756',
98 silly registry.get vary: 'Accept',
98 silly registry.get 'keep-alive': 'timeout=10, max=50',
98 silly registry.get connection: 'Keep-Alive' } ]
99 silly lockFile 9e6ddce3-rg-node-tail-node-tail-0-0-4-tgz https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
100 verbose lock https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz /root/.npm/9e6ddce3-rg-node-tail-node-tail-0-0-4-tgz.lock
101 verbose addRemoteTarball [ 'https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz',
101 verbose addRemoteTarball '60d6456c71a22427ebe794565cb1954709978501' ]
102 info retry fetch attempt 1 at 14:25:46
103 verbose fetch to= /tmp/npm-25723-hzRsuUDH/registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
104 http GET https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
105 http 200 https://registry.npmjs.org/socket.io
106 silly registry.get cb [ 200,
106 silly registry.get { date: 'Thu, 09 Apr 2015 06:25:45 GMT',
106 silly registry.get server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
106 silly registry.get etag: '"2DXCIXNLVU70Z8PJHO5V9XB6E"',
106 silly registry.get 'content-type': 'application/json',
106 silly registry.get 'cache-control': 'max-age=60',
106 silly registry.get 'content-length': '111044',
106 silly registry.get 'accept-ranges': 'bytes',
106 silly registry.get via: '1.1 varnish',
106 silly registry.get age: '7',
106 silly registry.get 'x-served-by': 'cache-nrt6126-NRT',
106 silly registry.get 'x-cache': 'HIT',
106 silly registry.get 'x-cache-hits': '1',
106 silly registry.get 'x-timer': 'S1428560745.573669,VS0,VE1',
106 silly registry.get vary: 'Accept',
106 silly registry.get 'keep-alive': 'timeout=10, max=50',
106 silly registry.get connection: 'Keep-Alive' } ]
107 silly addNameRange number 2 { name: 'socket.io', range: '>=1.2.0-0 <1.3.0-0', hasData: true }
108 silly addNameRange versions [ 'socket.io',
108 silly addNameRange [ '0.3.8',
108 silly addNameRange '0.4.0',
108 silly addNameRange '0.4.1',
108 silly addNameRange '0.5.1',
108 silly addNameRange '0.5.3',
108 silly addNameRange '0.6.0',
108 silly addNameRange '0.6.1',
108 silly addNameRange '0.6.3',
108 silly addNameRange '0.6.4',
108 silly addNameRange '0.6.5',
108 silly addNameRange '0.6.6',
108 silly addNameRange '0.6.7',
108 silly addNameRange '0.6.8',
108 silly addNameRange '0.6.9',
108 silly addNameRange '0.6.10',
108 silly addNameRange '0.6.11',
108 silly addNameRange '0.6.12',
108 silly addNameRange '0.6.14',
108 silly addNameRange '0.6.15',
108 silly addNameRange '0.6.16',
108 silly addNameRange '0.6.17',
108 silly addNameRange '0.6.18',
108 silly addNameRange '0.7.0',
108 silly addNameRange '0.7.1',
108 silly addNameRange '0.7.2',
108 silly addNameRange '0.7.3',
108 silly addNameRange '0.7.4',
108 silly addNameRange '0.7.5',
108 silly addNameRange '0.7.6',
108 silly addNameRange '0.7.7',
108 silly addNameRange '0.7.8',
108 silly addNameRange '0.7.9',
108 silly addNameRange '0.7.10',
108 silly addNameRange '0.7.11',
108 silly addNameRange '0.8.0',
108 silly addNameRange '0.8.1',
108 silly addNameRange '0.8.2',
108 silly addNameRange '0.8.3',
108 silly addNameRange '0.8.4',
108 silly addNameRange '0.8.5',
108 silly addNameRange '0.8.6',
108 silly addNameRange '0.8.7',
108 silly addNameRange '0.9.0',
108 silly addNameRange '0.9.1',
108 silly addNameRange '0.9.1-1',
108 silly addNameRange '0.9.2',
108 silly addNameRange '0.9.3',
108 silly addNameRange '0.9.4',
108 silly addNameRange '0.9.5',
108 silly addNameRange '0.9.6',
108 silly addNameRange '0.9.7',
108 silly addNameRange '0.9.8',
108 silly addNameRange '0.9.9',
108 silly addNameRange '0.9.10',
108 silly addNameRange '0.9.11',
108 silly addNameRange '0.9.12',
108 silly addNameRange '0.9.13',
108 silly addNameRange '0.9.14',
108 silly addNameRange '0.9.15',
108 silly addNameRange '0.9.16',
108 silly addNameRange '1.0.0-pre',
108 silly addNameRange '1.0.0-pre2',
108 silly addNameRange '1.0.0-pre3',
108 silly addNameRange '1.0.0-pre4',
108 silly addNameRange '1.0.0-pre5',
108 silly addNameRange '0.9.17',
108 silly addNameRange '1.0.0',
108 silly addNameRange '1.0.1',
108 silly addNameRange '1.0.2',
108 silly addNameRange '1.0.3',
108 silly addNameRange '1.0.4',
108 silly addNameRange '1.0.5',
108 silly addNameRange '1.0.6',
108 silly addNameRange '1.1.0',
108 silly addNameRange '1.2.0',
108 silly addNameRange '1.2.1',
108 silly addNameRange '1.3.0',
108 silly addNameRange '1.3.1',
108 silly addNameRange '1.3.2',
108 silly addNameRange '1.3.3',
108 silly addNameRange '1.3.4',
108 silly addNameRange '1.3.5' ] ]
109 verbose addNamed [ 'socket.io', '1.2.1' ]
110 verbose addNamed [ '1.2.1', '1.2.1' ]
111 silly lockFile 77e414a6-socket-io-1-2-1 socket.io@1.2.1
112 verbose lock socket.io@1.2.1 /root/.npm/77e414a6-socket-io-1-2-1.lock
113 silly lockFile 03c4f5da-rg-socket-io-socket-io-1-2-1-tgz https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
114 verbose lock https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz /root/.npm/03c4f5da-rg-socket-io-socket-io-1-2-1-tgz.lock
115 verbose addRemoteTarball [ 'https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz',
115 verbose addRemoteTarball '84400af534c0d32baa9ac88937eedb5b8465ee92' ]
116 info retry fetch attempt 1 at 14:25:46
117 verbose fetch to= /tmp/npm-25723-hzRsuUDH/registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
118 http GET https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
119 http 200 https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
120 silly lockFile 9e6ddce3-rg-node-tail-node-tail-0-0-4-tgz https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
121 silly lockFile 9e6ddce3-rg-node-tail-node-tail-0-0-4-tgz https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz
122 silly lockFile 7bc2e09d-node-tail-0-0-4 node-tail@0.0.4
123 silly lockFile 7bc2e09d-node-tail-0-0-4 node-tail@0.0.4
124 http 200 https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
125 http 200 https://registry.npmjs.org/tail/-/tail-0.4.0.tgz
126 silly lockFile 8067702d-ry-npmjs-org-tail-tail-0-4-0-tgz https://registry.npmjs.org/tail/-/tail-0.4.0.tgz
127 silly lockFile 8067702d-ry-npmjs-org-tail-tail-0-4-0-tgz https://registry.npmjs.org/tail/-/tail-0.4.0.tgz
128 silly lockFile e7d4c0e4-tail-0-4-0 tail@0.4.0
129 silly lockFile e7d4c0e4-tail-0-4-0 tail@0.4.0
130 silly lockFile 81e86088-tail-0-4-0 tail@~0.4.0
131 silly lockFile 81e86088-tail-0-4-0 tail@~0.4.0
132 http 200 https://registry.npmjs.org/express
133 silly registry.get cb [ 200,
133 silly registry.get { date: 'Thu, 09 Apr 2015 06:25:45 GMT',
133 silly registry.get server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
133 silly registry.get etag: '"9UQXXU09GJOSW3WO2L58ANAHK"',
133 silly registry.get 'content-type': 'application/json',
133 silly registry.get 'cache-control': 'max-age=60',
133 silly registry.get 'content-length': '492110',
133 silly registry.get 'accept-ranges': 'bytes',
133 silly registry.get via: '1.1 varnish',
133 silly registry.get age: '16',
133 silly registry.get 'x-served-by': 'cache-nrt6126-NRT',
133 silly registry.get 'x-cache': 'HIT',
133 silly registry.get 'x-cache-hits': '2',
133 silly registry.get 'x-timer': 'S1428560745.583395,VS0,VE0',
133 silly registry.get vary: 'Accept',
133 silly registry.get 'keep-alive': 'timeout=10, max=50',
133 silly registry.get connection: 'Keep-Alive' } ]
134 silly addNameRange number 2 { name: 'express', range: '>=4.10.1-0 <4.11.0-0', hasData: true }
135 silly addNameRange versions [ 'express',
135 silly addNameRange [ '0.14.0',
135 silly addNameRange '0.14.1',
135 silly addNameRange '1.0.0',
135 silly addNameRange '1.0.1',
135 silly addNameRange '1.0.2',
135 silly addNameRange '1.0.3',
135 silly addNameRange '1.0.4',
135 silly addNameRange '1.0.5',
135 silly addNameRange '1.0.6',
135 silly addNameRange '1.0.7',
135 silly addNameRange '1.0.8',
135 silly addNameRange '2.0.0',
135 silly addNameRange '2.1.0',
135 silly addNameRange '2.1.1',
135 silly addNameRange '2.2.0',
135 silly addNameRange '2.2.1',
135 silly addNameRange '2.2.2',
135 silly addNameRange '2.3.0',
135 silly addNameRange '2.3.1',
135 silly addNameRange '2.3.2',
135 silly addNameRange '2.3.3',
135 silly addNameRange '2.3.4',
135 silly addNameRange '2.3.5',
135 silly addNameRange '2.3.6',
135 silly addNameRange '2.3.7',
135 silly addNameRange '2.3.8',
135 silly addNameRange '2.3.9',
135 silly addNameRange '2.3.10',
135 silly addNameRange '2.3.11',
135 silly addNameRange '2.3.12',
135 silly addNameRange '2.4.0',
135 silly addNameRange '2.4.1',
135 silly addNameRange '2.4.2',
135 silly addNameRange '2.4.3',
135 silly addNameRange '2.4.4',
135 silly addNameRange '2.4.5',
135 silly addNameRange '2.4.6',
135 silly addNameRange '2.4.7',
135 silly addNameRange '2.5.0',
135 silly addNameRange '2.5.1',
135 silly addNameRange '2.5.2',
135 silly addNameRange '2.5.3',
135 silly addNameRange '2.5.4',
135 silly addNameRange '2.5.5',
135 silly addNameRange '2.5.6',
135 silly addNameRange '2.5.7',
135 silly addNameRange '2.5.8',
135 silly addNameRange '2.5.9',
135 silly addNameRange '2.5.10',
135 silly addNameRange '2.5.11',
135 silly addNameRange '3.0.0',
135 silly addNameRange '3.0.1',
135 silly addNameRange '3.0.2',
135 silly addNameRange '3.0.3',
135 silly addNameRange '3.0.4',
135 silly addNameRange '3.0.5',
135 silly addNameRange '3.0.6',
135 silly addNameRange '3.1.0',
135 silly addNameRange '3.1.1',
135 silly addNameRange '3.1.2',
135 silly addNameRange '3.2.0',
135 silly addNameRange '3.2.1',
135 silly addNameRange '3.2.2',
135 silly addNameRange '3.2.3',
135 silly addNameRange '3.2.4',
135 silly addNameRange '3.2.5',
135 silly addNameRange '3.2.6',
135 silly addNameRange '3.3.0',
135 silly addNameRange '3.3.1',
135 silly addNameRange '3.3.2',
135 silly addNameRange '3.3.3',
135 silly addNameRange '3.3.4',
135 silly addNameRange '3.3.5',
135 silly addNameRange '3.3.6',
135 silly addNameRange '1.0.0-beta',
135 silly addNameRange '1.0.0-beta2',
135 silly addNameRange '1.0.0-rc',
135 silly addNameRange '1.0.0-rc2',
135 silly addNameRange '1.0.0-rc3',
135 silly addNameRange '1.0.0-rc4',
135 silly addNameRange '2.0.0-beta',
135 silly addNameRange '2.0.0-beta2',
135 silly addNameRange '2.0.0-beta3',
135 silly addNameRange '2.0.0-rc',
135 silly addNameRange '2.0.0-rc2',
135 silly addNameRange '2.0.0-rc3',
135 silly addNameRange '3.0.0-alpha1',
135 silly addNameRange '3.0.0-alpha2',
135 silly addNameRange '3.0.0-alpha3',
135 silly addNameRange '3.0.0-alpha4',
135 silly addNameRange '3.0.0-alpha5',
135 silly addNameRange '3.0.0-beta1',
135 silly addNameRange '3.0.0-beta2',
135 silly addNameRange '3.0.0-beta3',
135 silly addNameRange '3.0.0-beta4',
135 silly addNameRange '3.0.0-beta6',
135 silly addNameRange '3.0.0-beta7',
135 silly addNameRange '3.0.0-rc1',
135 silly addNameRange '3.0.0-rc2',
135 silly addNameRange '3.0.0-rc3',
135 silly addNameRange '3.0.0-rc4',
135 silly addNameRange '3.0.0-rc5',
135 silly addNameRange '3.3.7',
135 silly addNameRange '3.3.8',
135 silly addNameRange '3.4.0',
135 silly addNameRange '3.4.1',
135 silly addNameRange '3.4.2',
135 silly addNameRange '3.4.3',
135 silly addNameRange '3.4.4',
135 silly addNameRange '3.4.5',
135 silly addNameRange '3.4.6',
135 silly addNameRange '3.4.7',
135 silly addNameRange '3.4.8',
135 silly addNameRange '4.0.0-rc1',
135 silly addNameRange '4.0.0-rc2',
135 silly addNameRange '3.5.0',
135 silly addNameRange '4.0.0-rc3',
135 silly addNameRange '4.0.0-rc4',
135 silly addNameRange '3.5.1',
135 silly addNameRange '4.0.0',
135 silly addNameRange '3.5.2',
135 silly addNameRange '4.1.0',
135 silly addNameRange '4.1.1',
135 silly addNameRange '3.5.3',
135 silly addNameRange '4.1.2',
135 silly addNameRange '3.6.0',
135 silly addNameRange '4.2.0',
135 silly addNameRange '3.7.0',
135 silly addNameRange '3.8.0',
135 silly addNameRange '4.3.0',
135 silly addNameRange '4.3.1',
135 silly addNameRange '3.8.1',
135 silly addNameRange '4.3.2',
135 silly addNameRange '3.9.0',
135 silly addNameRange '4.4.0',
135 silly addNameRange '4.4.1',
135 silly addNameRange '3.10.0',
135 silly addNameRange '3.10.1',
135 silly addNameRange '3.10.2',
135 silly addNameRange '3.10.3',
135 silly addNameRange '3.10.4',
135 silly addNameRange '4.4.2',
135 silly addNameRange '3.10.5',
135 silly addNameRange '4.4.3',
135 silly addNameRange '3.11.0',
135 silly addNameRange '4.4.4',
135 silly addNameRange '3.12.0',
135 silly addNameRange '3.12.1',
135 silly addNameRange '4.4.5',
135 silly addNameRange '3.13.0',
135 silly addNameRange '4.5.0',
135 silly addNameRange '4.5.1',
135 silly addNameRange '3.14.0',
135 silly addNameRange '4.6.0',
135 silly addNameRange '4.6.1',
135 silly addNameRange '3.15.0',
135 silly addNameRange '4.7.0',
135 silly addNameRange '3.15.1',
135 silly addNameRange '4.7.1',
135 silly addNameRange '3.15.2',
135 silly addNameRange '4.7.2',
135 silly addNameRange '4.7.3',
135 silly addNameRange '3.15.3',
135 silly addNameRange '4.7.4',
135 silly addNameRange '3.16.0',
135 silly addNameRange '4.8.0',
135 silly addNameRange '3.16.1',
135 silly addNameRange '4.8.1',
135 silly addNameRange '3.16.2',
135 silly addNameRange '4.8.2',
135 silly addNameRange '3.16.3',
135 silly addNameRange '3.16.4',
135 silly addNameRange '4.8.3',
135 silly addNameRange '3.16.5',
135 silly addNameRange '3.16.6',
135 silly addNameRange '4.8.4',
135 silly addNameRange '3.16.7',
135 silly addNameRange '4.8.5',
135 silly addNameRange '3.16.8',
135 silly addNameRange '4.8.6',
135 silly addNameRange '3.16.9',
135 silly addNameRange '4.8.7',
135 silly addNameRange '3.16.10',
135 silly addNameRange '4.8.8',
135 silly addNameRange '3.17.0',
135 silly addNameRange '3.17.1',
135 silly addNameRange '4.9.0',
135 silly addNameRange '3.17.2',
135 silly addNameRange '4.9.1',
135 silly addNameRange '4.9.2',
135 silly addNameRange '3.17.3',
135 silly addNameRange '4.9.3',
135 silly addNameRange '3.17.4',
135 silly addNameRange '4.9.4',
135 silly addNameRange '3.17.5',
135 silly addNameRange '4.9.5',
135 silly addNameRange '3.17.6',
135 silly addNameRange '3.17.7',
135 silly addNameRange '4.9.6',
135 silly addNameRange '4.9.7',
135 silly addNameRange '3.17.8',
135 silly addNameRange '4.9.8',
135 silly addNameRange '3.18.0',
135 silly addNameRange '3.18.1',
135 silly addNameRange '4.10.0',
135 silly addNameRange '3.18.2',
135 silly addNameRange '4.10.1',
135 silly addNameRange '5.0.0-alpha.1',
135 silly addNameRange '3.18.3',
135 silly addNameRange '4.10.2',
135 silly addNameRange '3.18.4',
135 silly addNameRange '4.10.3',
135 silly addNameRange '4.10.4',
135 silly addNameRange '4.10.5',
135 silly addNameRange '3.18.5',
135 silly addNameRange '3.18.6',
135 silly addNameRange '4.10.6',
135 silly addNameRange '4.10.7',
135 silly addNameRange '3.19.0',
135 silly addNameRange '4.10.8',
135 silly addNameRange '4.11.0',
135 silly addNameRange '3.19.1',
135 silly addNameRange '4.11.1',
135 silly addNameRange '3.19.2',
135 silly addNameRange '4.11.2',
135 silly addNameRange '3.20.0',
135 silly addNameRange '4.12.0',
135 silly addNameRange '3.20.1',
135 silly addNameRange '4.12.1',
135 silly addNameRange '4.12.2',
135 silly addNameRange '3.20.2',
135 silly addNameRange '4.12.3' ] ]
136 verbose addNamed [ 'express', '4.10.8' ]
137 verbose addNamed [ '4.10.8', '4.10.8' ]
138 silly lockFile 44558bf5-express-4-10-8 express@4.10.8
139 verbose lock express@4.10.8 /root/.npm/44558bf5-express-4-10-8.lock
140 silly lockFile 03c4f5da-rg-socket-io-socket-io-1-2-1-tgz https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
141 silly lockFile 03c4f5da-rg-socket-io-socket-io-1-2-1-tgz https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz
142 silly lockFile 77e414a6-socket-io-1-2-1 socket.io@1.2.1
143 silly lockFile 77e414a6-socket-io-1-2-1 socket.io@1.2.1
144 silly lockFile 95f2bc2f-s-org-express-express-4-10-8-tgz https://registry.npmjs.org/express/-/express-4.10.8.tgz
145 verbose lock https://registry.npmjs.org/express/-/express-4.10.8.tgz /root/.npm/95f2bc2f-s-org-express-express-4-10-8-tgz.lock
146 silly lockFile c0bd7c21-socket-io-1-2-0 socket.io@~1.2.0
147 silly lockFile c0bd7c21-socket-io-1-2-0 socket.io@~1.2.0
148 verbose addRemoteTarball [ 'https://registry.npmjs.org/express/-/express-4.10.8.tgz',
148 verbose addRemoteTarball '2d83571e065c0efb2679c0a5f9ae66aeaa47024a' ]
149 info retry fetch attempt 1 at 14:25:49
150 verbose fetch to= /tmp/npm-25723-hzRsuUDH/registry.npmjs.org/express/-/express-4.10.8.tgz
151 http GET https://registry.npmjs.org/express/-/express-4.10.8.tgz
152 http 200 https://registry.npmjs.org/express/-/express-4.10.8.tgz
153 silly lockFile 95f2bc2f-s-org-express-express-4-10-8-tgz https://registry.npmjs.org/express/-/express-4.10.8.tgz
154 silly lockFile 95f2bc2f-s-org-express-express-4-10-8-tgz https://registry.npmjs.org/express/-/express-4.10.8.tgz
155 silly lockFile 44558bf5-express-4-10-8 express@4.10.8
156 silly lockFile 44558bf5-express-4-10-8 express@4.10.8
157 silly lockFile c572b5f8-express-4-10-1 express@~4.10.1
158 silly lockFile c572b5f8-express-4-10-1 express@~4.10.1
159 silly resolved [ { name: 'node-tail',
159 silly resolved version: '0.0.4',
159 silly resolved author: { name: 'rhrn', email: 'me@rhrn.ru' },
159 silly resolved preferGlobal: 'false',
159 silly resolved bin: { 'node-tail': './bin/node-tail' },
159 silly resolved dependencies: { 'socket.io': 'latest', commander: '~1.1.1' },
159 silly resolved repository: { type: 'git', url: 'https://github.com/rhrn/node-tail.git' },
159 silly resolved engines: { node: 'latest' },
159 silly resolved readme: '#node-tail\n\n Web `tail` - display last part of a file\n\n##install\n\n```\nnpm install -g node-tail\n```\n\n##usage\n\n```\nnode-tail -p 3000 ~/file.log\n```\n\nopen in browser\n```\nhttp://localhost:3000/\n```\n',
159 silly resolved readmeFilename: 'README.md',
159 silly resolved _id: 'node-tail@0.0.4',
159 silly resolved description: 'Web `tail` - display last part of a file',
159 silly resolved dist:
159 silly resolved { shasum: '60d6456c71a22427ebe794565cb1954709978501',
159 silly resolved tarball: 'http://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz' },
159 silly resolved _from: 'node-tail@0.0.4',
159 silly resolved _npmVersion: '1.2.14',
159 silly resolved _npmUser: { name: 'rhrn', email: 'nester@bk.ru' },
159 silly resolved maintainers: [ [Object] ],
159 silly resolved directories: {},
159 silly resolved _shasum: '60d6456c71a22427ebe794565cb1954709978501',
159 silly resolved _resolved: 'https://registry.npmjs.org/node-tail/-/node-tail-0.0.4.tgz' },
159 silly resolved { author: { name: 'Luca Grulla' },
159 silly resolved contributors: [ [Object], [Object], [Object] ],
159 silly resolved name: 'tail',
159 silly resolved description: 'tail a file in node',
159 silly resolved version: '0.4.0',
159 silly resolved repository:
159 silly resolved { type: 'git',
159 silly resolved url: 'git://github.com/lucagrulla/node-tail.git' },
159 silly resolved main: 'tail',
159 silly resolved engines: { node: '>= 0.4.0' },
159 silly resolved dependencies: {},
159 silly resolved devDependencies: { 'coffee-script': '1.7.1' },
159 silly resolved bugs: { url: 'https://github.com/lucagrulla/node-tail/issues' },
159 silly resolved homepage: 'https://github.com/lucagrulla/node-tail',
159 silly resolved _id: 'tail@0.4.0',
159 silly resolved scripts: {},
159 silly resolved _shasum: 'd29de72750cc99db1e053aff13c359ecfb713002',
159 silly resolved _from: 'tail@~0.4.0',
159 silly resolved _npmVersion: '1.4.15',
159 silly resolved _npmUser: { name: 'lucagrulla', email: 'luca.grulla@gmail.com' },
159 silly resolved maintainers: [ [Object] ],
159 silly resolved dist:
159 silly resolved { shasum: 'd29de72750cc99db1e053aff13c359ecfb713002',
159 silly resolved tarball: 'http://registry.npmjs.org/tail/-/tail-0.4.0.tgz' },
159 silly resolved directories: {},
159 silly resolved _resolved: 'https://registry.npmjs.org/tail/-/tail-0.4.0.tgz' },
159 silly resolved { name: 'socket.io',
159 silly resolved version: '1.2.1',
159 silly resolved description: 'node.js realtime framework server',
159 silly resolved keywords:
159 silly resolved [ 'realtime',
159 silly resolved 'framework',
159 silly resolved 'websocket',
159 silly resolved 'tcp',
159 silly resolved 'events',
159 silly resolved 'socket',
159 silly resolved 'io' ],
159 silly resolved repository: { type: 'git', url: 'git://github.com/Automattic/socket.io' },
159 silly resolved scripts: { test: 'make test' },
159 silly resolved dependencies:
159 silly resolved { 'engine.io': '1.4.3',
159 silly resolved 'socket.io-parser': '2.2.2',
159 silly resolved 'socket.io-client': '1.2.1',
159 silly resolved 'socket.io-adapter': '0.3.1',
159 silly resolved 'has-binary-data': '0.1.3',
159 silly resolved debug: '0.7.4' },
159 silly resolved devDependencies:
159 silly resolved { mocha: '1.16.2',
159 silly resolved 'expect.js': '0.3.1',
159 silly resolved supertest: '0.8.2',
159 silly resolved superagent: '0.17.0',
159 silly resolved istanbul: '0.2.3' },
159 silly resolved contributors: [ [Object], [Object], [Object], [Object] ],
159 silly resolved gitHead: '24d06d76ddf0808ac370e39fd57329d3048d73e4',
159 silly resolved bugs: { url: 'https://github.com/Automattic/socket.io/issues' },
159 silly resolved homepage: 'https://github.com/Automattic/socket.io',
159 silly resolved _id: 'socket.io@1.2.1',
159 silly resolved _shasum: '84400af534c0d32baa9ac88937eedb5b8465ee92',
159 silly resolved _from: 'socket.io@~1.2.0',
159 silly resolved _npmVersion: '1.4.21',
159 silly resolved _npmUser: { name: 'rauchg', email: 'rauchg@gmail.com' },
159 silly resolved maintainers: [ [Object] ],
159 silly resolved dist:
159 silly resolved { shasum: '84400af534c0d32baa9ac88937eedb5b8465ee92',
159 silly resolved tarball: 'http://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz' },
159 silly resolved directories: {},
159 silly resolved _resolved: 'https://registry.npmjs.org/socket.io/-/socket.io-1.2.1.tgz' },
159 silly resolved { name: 'express',
159 silly resolved description: 'Fast, unopinionated, minimalist web framework',
159 silly resolved version: '4.10.8',
159 silly resolved author: { name: 'TJ Holowaychuk', email: 'tj@vision-media.ca' },
159 silly resolved contributors:
159 silly resolved [ [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object] ],
159 silly resolved license: 'MIT',
159 silly resolved repository: { type: 'git', url: 'https://github.com/strongloop/express' },
159 silly resolved homepage: 'http://expressjs.com/',
159 silly resolved keywords:
159 silly resolved [ 'express',
159 silly resolved 'framework',
159 silly resolved 'sinatra',
159 silly resolved 'web',
159 silly resolved 'rest',
159 silly resolved 'restful',
159 silly resolved 'router',
159 silly resolved 'app',
159 silly resolved 'api' ],
159 silly resolved dependencies:
159 silly resolved { accepts: '~1.1.4',
159 silly resolved 'content-disposition': '0.5.0',
159 silly resolved 'cookie-signature': '1.0.5',
159 silly resolved debug: '~2.1.1',
159 silly resolved depd: '~1.0.0',
159 silly resolved 'escape-html': '1.0.1',
159 silly resolved etag: '~1.5.1',
159 silly resolved finalhandler: '0.3.3',
159 silly resolved fresh: '0.2.4',
159 silly resolved 'media-typer': '0.3.0',
159 silly resolved methods: '1.1.1',
159 silly resolved 'on-finished': '~2.2.0',
159 silly resolved parseurl: '~1.3.0',
159 silly resolved 'path-to-regexp': '0.1.3',
159 silly resolved 'proxy-addr': '~1.0.5',
159 silly resolved qs: '2.3.3',
159 silly resolved 'range-parser': '~1.0.2',
159 silly resolved send: '0.10.1',
159 silly resolved 'serve-static': '~1.7.2',
159 silly resolved 'type-is': '~1.5.5',
159 silly resolved vary: '~1.0.0',
159 silly resolved cookie: '0.1.2',
159 silly resolved 'merge-descriptors': '0.0.2',
159 silly resolved 'utils-merge': '1.0.0' },
159 silly resolved devDependencies:
159 silly resolved { after: '0.8.1',
159 silly resolved istanbul: '0.3.5',
159 silly resolved mocha: '~2.0.0',
159 silly resolved should: '~4.3.1',
159 silly resolved supertest: '~0.15.0',
159 silly resolved ejs: '~1.0.0',
159 silly resolved marked: '0.3.2',
159 silly resolved hjs: '~0.0.6',
159 silly resolved 'body-parser': '~1.10.1',
159 silly resolved 'connect-redis': '~2.1.0',
159 silly resolved 'cookie-parser': '~1.3.3',
159 silly resolved 'express-session': '~1.9.2',
159 silly resolved jade: '~1.8.2',
159 silly resolved 'method-override': '~2.3.1',
159 silly resolved morgan: '~1.5.1',
159 silly resolved multiparty: '~4.1.0',
159 silly resolved vhost: '~3.0.0' },
159 silly resolved engines: { node: '>= 0.10.0' },
159 silly resolved files: [ 'LICENSE', 'History.md', 'Readme.md', 'index.js', 'lib/' ],
159 silly resolved scripts:
159 silly resolved { test: 'mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/',
159 silly resolved 'test-cov': 'istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/',
159 silly resolved 'test-tap': 'mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/',
159 silly resolved 'test-travis': 'istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/' },
159 silly resolved gitHead: '08939683c7a2e5d7dc928d310ebab65878bffff3',
159 silly resolved bugs: { url: 'https://github.com/strongloop/express/issues' },
159 silly resolved _id: 'express@4.10.8',
159 silly resolved _shasum: '2d83571e065c0efb2679c0a5f9ae66aeaa47024a',
159 silly resolved _from: 'express@~4.10.1',
159 silly resolved _npmVersion: '1.4.28',
159 silly resolved _npmUser: { name: 'dougwilson', email: 'doug@somethingdoug.com' },
159 silly resolved maintainers:
159 silly resolved [ [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object],
159 silly resolved [Object] ],
159 silly resolved dist:
159 silly resolved { shasum: '2d83571e065c0efb2679c0a5f9ae66aeaa47024a',
159 silly resolved tarball: 'http://registry.npmjs.org/express/-/express-4.10.8.tgz' },
159 silly resolved directories: {},
159 silly resolved _resolved: 'https://registry.npmjs.org/express/-/express-4.10.8.tgz' } ]
160 info install node-tail@0.0.4 into /mnt/hgfs/jumpserver/websocket
161 info install tail@0.4.0 into /mnt/hgfs/jumpserver/websocket
162 info install socket.io@1.2.1 into /mnt/hgfs/jumpserver/websocket
163 info install express@4.10.8 into /mnt/hgfs/jumpserver/websocket
164 info installOne node-tail@0.0.4
165 warn engine node-tail@0.0.4: wanted: {"node":"latest"} (current: {"node":"0.10.33","npm":"1.4.28"})
166 info installOne tail@0.4.0
167 info installOne socket.io@1.2.1
168 info installOne express@4.10.8
169 verbose node_modules/node-tail unbuild
170 verbose node_modules/tail unbuild
171 verbose node_modules/socket.io unbuild
172 verbose node_modules/express unbuild
173 verbose tar unpack /root/.npm/node-tail/0.0.4/package.tgz
174 silly lockFile fe049280-websocket-node-modules-node-tail tar:///mnt/hgfs/jumpserver/websocket/node_modules/node-tail
175 verbose lock tar:///mnt/hgfs/jumpserver/websocket/node_modules/node-tail /root/.npm/fe049280-websocket-node-modules-node-tail.lock
176 silly lockFile 053f900c--npm-node-tail-0-0-4-package-tgz tar:///root/.npm/node-tail/0.0.4/package.tgz
177 verbose lock tar:///root/.npm/node-tail/0.0.4/package.tgz /root/.npm/053f900c--npm-node-tail-0-0-4-package-tgz.lock
178 verbose tar unpack /root/.npm/tail/0.4.0/package.tgz
179 silly lockFile 62713ce4-rver-websocket-node-modules-tail tar:///mnt/hgfs/jumpserver/websocket/node_modules/tail
180 verbose lock tar:///mnt/hgfs/jumpserver/websocket/node_modules/tail /root/.npm/62713ce4-rver-websocket-node-modules-tail.lock
181 silly lockFile 1ed23799--root-npm-tail-0-4-0-package-tgz tar:///root/.npm/tail/0.4.0/package.tgz
182 verbose lock tar:///root/.npm/tail/0.4.0/package.tgz /root/.npm/1ed23799--root-npm-tail-0-4-0-package-tgz.lock
183 verbose tar unpack /root/.npm/socket.io/1.2.1/package.tgz
184 silly lockFile 380be7e1-websocket-node-modules-socket-io tar:///mnt/hgfs/jumpserver/websocket/node_modules/socket.io
185 verbose lock tar:///mnt/hgfs/jumpserver/websocket/node_modules/socket.io /root/.npm/380be7e1-websocket-node-modules-socket-io.lock
186 silly lockFile d3c35dc3--npm-socket-io-1-2-1-package-tgz tar:///root/.npm/socket.io/1.2.1/package.tgz
187 verbose lock tar:///root/.npm/socket.io/1.2.1/package.tgz /root/.npm/d3c35dc3--npm-socket-io-1-2-1-package-tgz.lock
188 verbose tar unpack /root/.npm/express/4.10.8/package.tgz
189 silly lockFile de0ac3f3-r-websocket-node-modules-express tar:///mnt/hgfs/jumpserver/websocket/node_modules/express
190 verbose lock tar:///mnt/hgfs/jumpserver/websocket/node_modules/express /root/.npm/de0ac3f3-r-websocket-node-modules-express.lock
191 silly lockFile da9ae1a7-t-npm-express-4-10-8-package-tgz tar:///root/.npm/express/4.10.8/package.tgz
192 verbose lock tar:///root/.npm/express/4.10.8/package.tgz /root/.npm/da9ae1a7-t-npm-express-4-10-8-package-tgz.lock
193 silly gunzTarPerm modes [ '755', '644' ]
194 silly gunzTarPerm modes [ '755', '644' ]
195 silly gunzTarPerm modes [ '755', '644' ]
196 silly gunzTarPerm modes [ '755', '644' ]
197 silly gunzTarPerm extractEntry package.json
198 silly gunzTarPerm extractEntry package.json
199 silly gunzTarPerm extractEntry package.json
200 silly gunzTarPerm extractEntry package.json
201 silly gunzTarPerm modified mode [ 'package.json', 438, 420 ]
202 silly gunzTarPerm extractEntry .npmignore
203 silly gunzTarPerm extractEntry README.md
204 silly gunzTarPerm extractEntry README.md
205 silly gunzTarPerm extractEntry tail.js
206 silly gunzTarPerm extractEntry .npmignore
207 silly gunzTarPerm extractEntry LICENSE
208 silly gunzTarPerm extractEntry LICENSE
209 silly gunzTarPerm modified mode [ 'LICENSE', 438, 420 ]
210 silly gunzTarPerm extractEntry index.js
211 silly gunzTarPerm modified mode [ 'index.js', 438, 420 ]
212 error Error: EPERM, chown '/mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json'
212 error { [Error: EPERM, chown '/mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json']
212 error errno: 50,
212 error code: 'EPERM',
212 error path: '/mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json',
212 error fstream_finish_call: 'chown',
212 error fstream_type: 'File',
212 error fstream_path: '/mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json',
212 error fstream_class: 'FileWriter',
212 error fstream_stack:
212 error [ '/opt/node/lib/node_modules/npm/node_modules/fstream/lib/writer.js:308:19',
212 error '/opt/node/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:143:7',
212 error 'Object.oncomplete (evalmachine.<anonymous>:107:15)' ] }
213 error Please try running this command again as root/Administrator.
214 error System Linux 2.6.32-358.el6.x86_64
215 error command "/opt/node/bin/node" "/opt/node/bin/npm" "install"
216 error cwd /mnt/hgfs/jumpserver/websocket
217 error node -v v0.10.33
218 error npm -v 1.4.28
219 error path /mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json
220 error fstream_path /mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json
221 error fstream_type File
222 error fstream_class FileWriter
223 error fstream_finish_call chown
224 error code EPERM
225 error errno 50
226 error stack Error: EPERM, chown '/mnt/hgfs/jumpserver/websocket/node_modules/node-tail/package.json'
227 error fstream_stack /opt/node/lib/node_modules/npm/node_modules/fstream/lib/writer.js:308:19
227 error fstream_stack /opt/node/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:143:7
227 error fstream_stack Object.oncomplete (evalmachine.<anonymous>:107:15)
228 verbose exit [ 50, true ]