Commit d036ef7f authored by guanghongwei's avatar guanghongwei

Merge branch 'dev' of ssh://172.10.10.9:2001/opt/jumpserver into dev

parents 2ca299a3 b2118563
jumpserver
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
</project>
<component name="InspectionProjectProfileManager">
<profile version="1.0" is_locked="false">
<option name="myName" value="Project Default" />
<option name="myLocal" value="false" />
<inspection_tool class="SqlDialectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 2.7.6 (C:/Python27/python.exe)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.6 (C:/Python27/python.exe)" project-jdk-type="Python SDK" />
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/jumpserver.iml" filepath="$PROJECT_DIR$/.idea/jumpserver.iml" />
</modules>
</component>
</project>
<component name="DependencyValidationManager">
<state>
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
This diff is collapsed.
......@@ -18,9 +18,7 @@ import paramiko
import pxssh
import pexpect
cur_dir = os.path.dirname(__file__)
if not cur_dir:
cur_dir = "./"
cur_dir = os.path.abspath(os.path.dirname(__file__))
sys.path.append('%s/webroot/AutoSa/' % cur_dir)
os.environ['DJANGO_SETTINGS_MODULE'] = 'AutoSa.settings'
......
pexpect==3.3
django-socketio==0.3.9
gevent-socketio==0.2.1
sphinx-me==0.3
django==1.7.1
gevent-websocket==0.9.3
gevent==1.0.1
greenlet==0.4.5
python-ldap==2.4.18
paramiko==1.15.1
pycrypto==2.6.1
ecdsa>=0.11
MySQL-python==1.2.5
python-ldap==2.4.18
......@@ -2,11 +2,18 @@ from django.db import models
from UserManage.models import User
class IDC(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Assets(models.Model):
id = models.AutoField(primary_key=True)
ip = models.CharField(max_length=20)
port = models.IntegerField(max_length=5)
idc = models.CharField(max_length=50)
idc = models.ForeignKey(IDC)
comment = models.CharField(max_length=100, blank=True, null=True)
def __unicode__(self):
......@@ -16,3 +23,5 @@ class Assets(models.Model):
class AssetsUser(models.Model):
uid = models.ForeignKey(User)
aid = models.ForeignKey(Assets)
......@@ -20,6 +20,9 @@ urlpatterns = patterns('',
(r'^showGroup/$', views.showGroup),
(r'^addGroup/$', views.addGroup),
(r'^chgGroup/$', views.chgGroup),
(r'^showIDC/$', views.showIDC),
(r'^addIDC/$', views.addIDC),
(r'^chgIDC/$', views.chgIDC),
(r'^showSudo/$', views.showSudo),
(r'^chgSudo/$', views.chgSudo),
(r'^showAssets/$', views.showAssets),
......
This diff is collapsed.
......@@ -39,8 +39,10 @@ class UserAddForm(forms.Form):
return password_again
def clean_key_pass_again(self):
key_pass = self.cleaned_data['key_pass']
key_pass_again = self.cleaned_data['key_pass_again']
key_pass = self.data['key_pass']
key_pass_again = self.data['key_pass_again']
if key_pass != key_pass_again:
raise forms.ValidationError('Key Password input twice not match. ')
if len(key_pass) < 6:
raise forms.ValidationError('Key Password input twice not match. ')
return key_pass_again
\ No newline at end of file
......@@ -24,7 +24,7 @@ def log_hanler(logid):
ret2 = os.system('cat %s | grep "\[.*@.*\][\$\#]" >> %s.his' % (filename, filename))
ret3 = os.system('cat %s | grep "EndTime" >> %s.his' % (filename, filename))
if (ret1 + ret2 + ret3) == 0:
print 'Handler % ok.' % filename
print 'Handler %s ok.' % filename
def set_finish(id):
......
#!/bin/bash
./manage.py runserver 0.0.0.0:80
./manage.py runserver 0.0.0.0:80 &> access.log &
./log_handler.py &> handler.log &
......@@ -27,19 +27,39 @@ $.fn.webSocket = function(opt){
return new Date().getTime()+""+Math.floor(Math.random()*899+100);
};
var init = function(){
message.id = genUid();
message.filename = $this.attr('filename');
var init = function(e){
var socket = io.connect('ws://172.10.10.9:3000');
var node = $(e.target);
message.id = genUid();
message.filename = node.attr('filename');
BootstrapDialog.show({message:function(){
var escapeString = function (html){
var elem = document.createElement('div')
var txt = document.createTextNode(html)
elem.appendChild(txt)
return elem.innerHTML;
}
var tag = $('<div id="log" style="height:300px;overflow: auto;"></div>');
//告诉服务器端有用户登录
socket.emit('login', {userid:message.id, filename:message.filename});
socket.on('message',function(obj){
window.console.log(obj.content);
//去除log中的颜色控制字符
var regx = /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/g;
tag.append('<p>'+escapeString(obj.content.replace(regx,''))+'</p>');
});
return tag[0];
} ,
title:'日志',
onhide:function(){
socket.emit('disconnect');
}});
}
$this.on("click",function(){
init();
$this.on("click",function(e){
init(e);
return false;
});
}
......@@ -28,8 +28,17 @@
<div class="form-group">
<label for="idc" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" class="form-control" id="idc" name="idc" placeholder="IDC">
<select name="idc" id="idc" class="form-control">
{% for idc in idcs %}
<option value="{{ idc.id }}">{{ idc.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-4">
<a href="/addIDC/">添加IDC</a>
<a href="/showIDC/">删除IDC</a>
</div>
</div>
<div class="form-group">
<label for="comment" class="col-sm-2 control-label">备注<span style="color: red"></span></label>
......
{% extends 'base.html' %}
{% block content %}
<form class="form-horizontal" role="form" method="post" action="" >
<fieldset >
<legend>添加IDC</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success">
{{ msg }}
</div>
{% endif %}
<div class="form-group">
<label for="name" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" class="form-control" id="name" name="name" placeholder="IDC">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button class="btn btn-primary">添加</button>
</div>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
......@@ -26,7 +26,7 @@
{% endfor %}
</tbody>
</table>
<button class="btn btn-primary">删除</button></td>
<button class="btn btn-success">删除</button></td>
</form>
{% endblock %} %}
\ No newline at end of file
......@@ -2,8 +2,8 @@
<html>
<head>
<meta charset="utf-8">
<title>运维管理系统</title>
<link rel="shortcut icon" type="image/x-icon" href="http://img.youlu.com/web/favicon.gif" />
<title>Jumpserver</title>
<link rel="shortcut icon" type="image/x-icon" href="" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5js"></script>
......@@ -12,19 +12,20 @@
<link href="/static/css/bootstrap-dialog.css" rel="stylesheet">
<link href="/static/css/main.css" rel="stylesheet">
<script src="/static/js/main.js"></script>
<script src="/static/js/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/bootstrap-dialog.js"></script>
<script src="http://172.10.10.9:3000/socket.io/socket.io.js"></script>
<script src="/static/js/main.js"></script>
</head>
<body>
{% if not admin %}
<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="navbar-header"> <a class="navbar-brand" href="#">运维管理系统</a> </div>
<div class="navbar-header"> <a class="navbar-brand" href="#">Jumpserver</a> </div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="{{ index }}"><a href="/">主页</a></li>
......@@ -73,7 +74,7 @@
</div>
{% else %}
<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="navbar-header"> <a class="navbar-brand" href="#">运维管理系统</a> </div>
<div class="navbar-header"> <a class="navbar-brand" href="#">Jumpserver</a> </div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="{{ index }}"><a href="/">主页</a></li>
......
......@@ -2,7 +2,7 @@
{% block content %}
<form class="form-horizontal" role="form" method="post" action="/chgGroup/" >
<fieldset >
<legend>修改用户信息</legend>
<legend>修改属组信息</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
......
{% extends 'base.html' %}
{% block content %}
<form class="form-horizontal" role="form" method="post" action="/chgGroup/" >
<fieldset >
<legend>修改IDC信息</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success">
{{ msg }}
</div>
{% endif %}
<div class="form-group">
<div class="col-sm-4">
<input type="text" id="id" name="id" value="{{ idc.id }}" hidden="hidden">
</div>
</div>
<div class="form-group">
<label for="oldname" class="col-sm-2 control-label">原来IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" id="oldname" name="oldname" class="form-control" value="{{ idc.name }}" readOnly="readOnly">
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" id="name" name="name" class="form-control" placeholder="IDC">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button class="btn btn-primary">修改</button>
</div>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
......@@ -28,7 +28,7 @@
<td><a href="/logHistory/?id={{ log.id }}" class="log_command">统计</a></td>
<td>阻断</td>
{% else %}
<td><span class='monitor' filename="{{ log.logfile }}">监控</span></td>
<td><a class='monitor' filename="{{ log.logfile }}">监控</a></td>
<td>命令统计</td>
<td><a href="/killSession/?id={{ log.id }}">阻断</a> </td>
{% endif %}
......@@ -46,6 +46,7 @@
}});
return false;
})
$(".monitor").webSocket()
</script>
<!--<button class="btn btn-primary">删除</button>-->
</form>
......
......@@ -33,4 +33,19 @@
</table>
<button class="btn btn-primary">删除</button></td>
</form>
<nav>
<ul class="pager">
{% if assets.has_previous %}
<li><a href="?page={{ assets.previous_page_number }}">上一页</a></li>
{% endif %}
<span class="current">
Page {{ assets.number }} of {{ assets.paginator.num_pages }}.
</span>
{% if assets.has_next %}
<li><a href="?page={{ assets.next_page_number }}">下一页</a></li>
{% endif %}
</ul>
</nav>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<form method="post" action="">
{% if info %}
<p class="alert alert-success">
{{ info }}
</p>
{% endif %}
<table class="table table-striped table-hover table-condensed">
<thead>
<tr>
<th><input onclick="selectAll()" type="checkbox" name="select_all" style="select_all" id="select_all"/></th>
<th>ID</th>
<th>IDC</th>
<th>修改</th>
</tr>
</thead>
<tbody>
{% for idc in idcs %}
<tr>
<td><input type="checkbox" name="selected" value="{{ idc.id }}"></td>
<td>{{ idc.id }}</td>
<td>{{ idc.name }}</td>
<td><a href="/chgIDC/?id={{ idc.id }}">修改</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<button class="btn btn-primary">删除</button>
</form>
{% endblock %}
\ No newline at end of file
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var spawn = require('child_process').spawn;
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){
//将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
socket.name = obj.userid;
socket.fileName = obj.filename;
var tail = new Tail(obj.filename);
console.log(obj.filename);
tail.on('line',function(data) {
console.log(data);
var newData = {userid:obj.userid,username:obj.username,content:data};
socket.emit('message',newData);
});
// 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);
// });
socket.tail = tail;
//检查在线列表,如果不在里面就加入
if(!onlineUsers.hasOwnProperty(obj.userid)) {
onlineUsers[obj.userid] = obj.username;
//在线人数+1
onlineCount++;
}
//向所有客户端广播用户加入
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');
});
{
"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"
}
}
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