mirror of https://github.com/jumpserver/jumpserver
				
				
				
			hehe
							parent
							
								
									30fd160079
								
							
						
					
					
						commit
						9cfe6c569d
					
				| 
						 | 
				
			
			@ -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),
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			@ -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),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										129
									
								
								jlog/views.py
								
								
								
								
							
							
						
						
									
										129
									
								
								jlog/views.py
								
								
								
								
							| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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'),
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -288,9 +288,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):
 | 
			
		||||
| 
						 | 
				
			
			@ -307,6 +308,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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,6 +109,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:
 | 
			
		||||
| 
						 | 
				
			
			@ -148,10 +149,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
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +177,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]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 %}
 | 
			
		||||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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")
 | 
			
		||||
       });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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/">查看资产  </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/">查看资产  </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/">查看资产  </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/">查看资产  </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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ]
 | 
			
		||||
		Loading…
	
		Reference in New Issue