Commit 036873e1 authored by liuzheng712's avatar liuzheng712

merge_dev

parents de9ce6dd 2d27e3fe
...@@ -37,11 +37,8 @@ nosetests.xml ...@@ -37,11 +37,8 @@ nosetests.xml
.mr.developer.cfg .mr.developer.cfg
.project .project
.pydevproject .pydevproject
*.xlsx logs/*
node_modules keys/*
logs
keys
jumpserver.conf jumpserver.conf
nohup.out nohup.out
tmp/* tmp/*
db.sqlite3
#coding: utf8
[base]
url = http://127.0.0.1
key = 88aaaf7ffe3c6c04
log = debug
[db]
host = 127.0.0.1
port = 3306
user = jumpserver
password = mysql1234
database = jumpserver
[websocket]
web_socket_host = 127.0.0.1:3000
[mail]
mail_enable = 1
email_host = smtp.exmail.qq.com
email_port = 25
email_host_user = noreply@jumpserver.org
email_host_password = jumpserver1234
email_use_tls = True
...@@ -121,8 +121,7 @@ def db_del_user(username): ...@@ -121,8 +121,7 @@ def db_del_user(username):
def gen_ssh_key(username, password='', def gen_ssh_key(username, password='',
key_dir=os.path.join(KEY_DIR, 'user'),
key_dir=os.path.join(BASE_DIR, 'role_keys/user/'),
authorized_keys=True, home="/home", length=2048): authorized_keys=True, home="/home", length=2048):
""" """
......
...@@ -8,14 +8,11 @@ import uuid as uuid_r ...@@ -8,14 +8,11 @@ import uuid as uuid_r
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db.models import Q from django.db.models import Q
from django.template import RequestContext
from django.db.models import ObjectDoesNotExist
from jumpserver.settings import EMAIL_HOST_USER
from juser.user_api import * from juser.user_api import *
from jperm.perm_api import _public_perm_api, perm_user_api, user_permed
MAIL_FROM = EMAIL_HOST_USER MAIL_FROM = EMAIL_HOST_USER
def chg_role(request): def chg_role(request):
role = {'SU': 2, 'GA': 1, 'CU': 0} role = {'SU': 2, 'GA': 1, 'CU': 0}
if request.session['role_id'] > 0: if request.session['role_id'] > 0:
...@@ -142,54 +139,6 @@ def group_edit(request): ...@@ -142,54 +139,6 @@ def group_edit(request):
return my_render('juser/group_edit.html', locals(), request) return my_render('juser/group_edit.html', locals(), request)
# @require_role(role='admin')
# def group_edit_adm(request):
# error = ''
# msg = ''
# header_title, path1, path2 = '修改小组信息', '用户管理', '编辑小组'
# user, dept = get_session_user_dept(request)
# if request.method == 'GET':
# group_id = request.GET.get('id', '')
# if not validate(request, user_group=[group_id]):
# return HttpResponseRedirect('/juser/group_list/')
# group = UserGroup.objects.filter(id=group_id)
# if group:
# group = group[0]
# users_all = dept.user_set.all()
# users_selected = group.user_set.all()
# users = [user for user in users_all if user not in users_selected]
#
# return render_to_response('juser/group_edit.html', locals(), context_instance=RequestContext(request))
# else:
# group_id = request.POST.get('group_id', '')
# group_name = request.POST.get('group_name', '')
# comment = request.POST.get('comment', '')
# users_selected = request.POST.getlist('users_selected')
#
# users = []
# try:
# if not validate(request, user=users_selected):
# raise ServerError(u'右侧非部门用户')
#
# if not validate(request, user_group=[group_id]):
# raise ServerError(u'没有权限修改本组')
#
# for user_id in users_selected:
# users.extend(User.objects.filter(id=user_id))
#
# user_group = UserGroup.objects.filter(id=group_id)
# if user_group:
# user_group.update(name=group_name, comment=comment, dept=dept)
# user_group = user_group[0]
# user_group.user_set.clear()
# user_group.user_set = users
#
# except ServerError, e:
# error = e
#
# return HttpResponseRedirect('/juser/group_list/')
@login_required(login_url='/login') @login_required(login_url='/login')
@require_role(role='super') @require_role(role='super')
def user_add(request): def user_add(request):
...@@ -210,7 +159,7 @@ def user_add(request): ...@@ -210,7 +159,7 @@ def user_add(request):
uuid = uuid_r.uuid1() uuid = uuid_r.uuid1()
ssh_key_pwd = PyCrypt.gen_rand_pass(16) ssh_key_pwd = PyCrypt.gen_rand_pass(16)
extra = request.POST.getlist('extra', []) extra = request.POST.getlist('extra', [])
is_active = True if '0' in extra else False is_active = False if '0' in extra else True
ssh_key_login_need = True if '1' in extra else False ssh_key_login_need = True if '1' in extra else False
send_mail_need = True if '2' in extra else False send_mail_need = True if '2' in extra else False
...@@ -437,7 +386,6 @@ def user_edit(request): ...@@ -437,7 +386,6 @@ def user_edit(request):
admin_groups=admin_groups, admin_groups=admin_groups,
role=role_post, role=role_post,
is_active=is_active) is_active=is_active)
_public_perm_api({'type': 'del_user', 'user': user, 'asset': user_permed(user)})
if email_need: if email_need:
msg = u""" msg = u"""
...@@ -528,7 +476,7 @@ def down_key(request): ...@@ -528,7 +476,7 @@ def down_key(request):
user = get_object(User, id=user_id) user = get_object(User, id=user_id)
if user: if user:
username = user.username username = user.username
private_key_file = os.path.join(BASE_DIR, 'role_keys/jumpserver', username + ".pem") private_key_file = os.path.join(KEY_DIR, 'user', username)
if os.path.isfile(private_key_file): if os.path.isfile(private_key_file):
f = open(private_key_file) f = open(private_key_file)
data = f.read() data = f.read()
......
#!/usr/bin/python
# coding: utf-8
import os
import re
import time
import psutil
from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
import django
#django.setup()
from jlog.models import Log
def log_hanler(id):
log = Log.objects.get(id=id)
pattern = re.compile(r'([\[.*@.*\][\$#].*)|(.*mysql>.*)')
if log:
filename = log.log_path
if os.path.isfile(filename):
f_his = filename + '.his'
f1 = open(filename)
f2 = open(f_his, 'a')
lines = f1.readlines()
for line in lines[7:]:
match = pattern.match(line)
if match:
newline = re.sub('\[[A-Z]', '', line)
f2.write(newline)
f1.close()
f2.close()
log.log_finished = True
log.save()
def set_finish(id):
log = Log.objects.filter(id=id)
if log:
log.update(is_finished=1, end_time=datetime.now())
def kill_pid(pid):
try:
os.kill(pid, 9)
except OSError:
pass
def get_pids():
pids1, pids2 = [], []
pids1_obj = Log.objects.filter(is_finished=0)
pids2_obj = Log.objects.filter(is_finished=1, log_finished=0)
for pid_obj in pids1_obj:
pids1.append((pid_obj.id, pid_obj.pid, pid_obj.log_path, pid_obj.is_finished, pid_obj.log_finished, pid_obj.start_time))
for pid_obj in pids2_obj:
pids2.append(pid_obj.id)
return pids1, pids2
def run():
pids1, pids2 = get_pids()
for pid_id in pids2:
log_hanler(pid_id)
for pid_id, pid, log_path, is_finished, log_finished, start_time in pids1:
try:
file_time = int(os.stat(log_path).st_ctime)
now_time = int(time.time())
if now_time - file_time > 18000:
if psutil.pid_exists(pid):
kill_pid(pid)
set_finish(pid_id)
log_hanler(pid_id)
except OSError:
pass
if __name__ == '__main__':
while True:
run()
time.sleep(5)
...@@ -17,10 +17,19 @@ function check_all(form) { ...@@ -17,10 +17,19 @@ function check_all(form) {
} }
function checkAll(){ function checkAll(){
// 选择该页面所有checkbox var checklist = document.getElementsByName ("checked");
$('input[type=checkbox]').each(function(){ if(document.getElementById("check_all").checked)
$(this).attr('checked', true) {
}) for(var i=0;i<checklist.length;i++)
{
checklist[i].checked = 1;
}
}else{
for(var j=0;j<checklist.length;j++)
{
checklist[j].checked = 0;
}
}
} }
//提取指定行的数据,JSON格式 //提取指定行的数据,JSON格式
......
...@@ -129,4 +129,4 @@ type="checkbox" name="selected" value="{{ group.id }}"> ...@@ -129,4 +129,4 @@ type="checkbox" name="selected" value="{{ group.id }}">
$('.shiftCheckbox').shiftcheckbox(); $('.shiftCheckbox').shiftcheckbox();
}); });
</script> </script>
{% endblock %} {% endblock %}
\ No newline at end of file
...@@ -93,10 +93,10 @@ ...@@ -93,10 +93,10 @@
</div> </div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label">额外</label> <div class="form-group"><label class="col-sm-2 control-label">其它</label>
<div class="col-sm-2"> <div class="col-sm-2">
<div class="checkbox i-checks"> <div class="checkbox i-checks">
<label><input type="checkbox" value="0" name="extra" ></label> <label><input type="checkbox" value="0" name="extra" ></label>
</div> </div>
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
<thead> <thead>
<tr> <tr>
<th class="text-center"> <th class="text-center">
<input type="checkbox" id="select_all" onclick="selectAll()" name="select_all"> <input type="checkbox" id="check_all" onclick="checkAll()">
</th> </th>
<th class="text-center">用户名</th> <th class="text-center">用户名</th>
<th class="text-center">姓名</th> <th class="text-center">姓名</th>
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
{% for user in users.object_list %} {% for user in users.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> <td class="text-center">
<input type="checkbox" name="selected" value="{{ user.id }}"> <input type="checkbox" name="checked" value="{{ user.id }}">
</td> </td>
<td class="text-center"> {{ user.username }} </td> <td class="text-center"> {{ user.username }} </td>
<td class="text-center"> {{ user.name }} </td> <td class="text-center"> {{ user.name }} </td>
......
...@@ -47,13 +47,19 @@ ...@@ -47,13 +47,19 @@
var old_href = $(this).attr('href').replace('?', ''); var old_href = $(this).attr('href').replace('?', '');
var searchArray = searchStr.split('&'); var searchArray = searchStr.split('&');
if (searchStr == ''){
searchStr = '?page=1'
}
if (searchStr.indexOf('page')>=0){ if (searchStr.indexOf('page')>=0){
searchArray.pop(); searchArray.pop();
} }
searchArray.push(old_href); searchArray.push(old_href);
if (searchArray.length > 1){ if (searchArray.length > 1) {
$(this).attr('href', searchArray.join('&')); $(this).attr('href', searchArray.join('&'));
} }
{# sleep(1000)#}
}) })
}); });
......
#!/usr/bin/env node
var program = require('commander');
nodetail = require('../src/node-tail.js');
var options = {};
program
.usage('[options] file...')
.option('-p, --port <port>', 'custom port');
program.parse(process.argv);
nodetail.run({
port: program.port,
file: program.args[0]
});
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var spawn = require('child_process').spawn;
var request = require("request");
var fs = require("fs");
var Tail = require('tail').Tail;
app.get('/', function(req, res){
res.send('<h1>Welcome Realtime Server</h1>');
});
//在线用户
var onlineUsers = {};
//当前在线人数
var onlineCount = 0;
io.on('connection', function(socket){
//console.log('a user connected');
//监听新用户加入
socket.on('login', function(obj){
request({
uri:"http://127.0.0.1/node_auth/",
method:"POST",
form:{
username:obj.username,
seed:obj.seed,
filename:obj.filename
}
},function(error,response,body){
try{
var result = JSON.parse(body)
console.log(body);
if(result['auth']['result'] != 'failed'){
fs.exists(obj.filename, function(result) {
//将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
socket.name = obj.userid;
socket.fileName = obj.filename;
var tail = new Tail(obj.filename);
//2015-03-06 当用户打开监控窗口时,会把已存在的文件内容打印出来
fs.readFile(obj.filename, 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
var existData = {userid:obj.userid,username:obj.username,content:data,option:'exist'};
socket.emit('message',existData);
});
tail.on('line',function(data) {
//console.log(data);
var newData = {userid:obj.userid,username:obj.username,content:data,option:'new'};
socket.emit('message',newData);
});
socket.tail = tail;
//检查在线列表,如果不在里面就加入
if(!onlineUsers.hasOwnProperty(obj.userid)) {
onlineUsers[obj.userid] = obj.username;
//在线人数+1
onlineCount++;
}
});
}
}catch(err){
console.log(err)
}
});
//var tail = spawn("tail", ['-f', obj.filename]);
//tail.stdout.on('data',function(data){
// var content = data.toString();
// //console.log(content);
// var newData = {userid:obj.userid,username:obj.username,content:content};
// socket.emit('message',newData);
//});
//向所有客户端广播用户加入
//io.emit('login', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
//console.log(obj.username+'加入了聊天室');
});
//监听用户退出
socket.on('disconnect', function(){
//将退出的用户从在线列表中删除
if(onlineUsers.hasOwnProperty(socket.name)) {
//退出用户的信息
var obj = {userid:socket.name, username:onlineUsers[socket.name]};
if( socket.tail){
socket.tail.unwatch();
}
//删除
delete onlineUsers[socket.name];
//在线人数-1
onlineCount--;
//向所有客户端广播用户退出
//io.emit('logout', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
////console.log(obj.username+'退出了聊天室');
}
});
//监听用户发布聊天内容
socket.on('message', function(obj){
//向所有客户端广播发布的消息
//io.emit('message', obj);
socket.emit('message',obj);
////console.log(obj.username+'说:'+obj.content);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
This diff is collapsed.
{
"name": "web-socket",
"version": "0.0.1",
"description": "my first realtime server",
"dependencies": {
"express": "~4.10.1",
"socket.io": "~1.2.0",
"node-tail": "0.0.4",
"tail": "~0.4.0",
"request": "~2.55.0"
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment