Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
a7a030fe
Commit
a7a030fe
authored
Nov 23, 2015
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bug
parent
4c505512
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
83 additions
and
83 deletions
+83
-83
context_processors.py
jumpserver/context_processors.py
+2
-6
run_websocket.py
run_websocket.py
+73
-61
asset_list.html
templates/jasset/asset_list.html
+2
-2
log_online.html
templates/jlog/log_online.html
+6
-14
No files found.
jumpserver/context_processors.py
View file @
a7a030fe
...
@@ -5,16 +5,12 @@ from jumpserver.api import *
...
@@ -5,16 +5,12 @@ from jumpserver.api import *
def
name_proc
(
request
):
def
name_proc
(
request
):
user_id
=
request
.
user
.
id
user_id
=
request
.
user
.
id
# role_id = request.session.get('role_id')
role_id
=
{
'SU'
:
2
,
'GA'
:
1
,
'CU'
:
0
}
.
get
(
request
.
user
.
role
,
0
)
role_id
=
{
'SU'
:
2
,
'GA'
:
1
,
'CU'
:
0
}
.
get
(
request
.
user
.
role
,
0
)
# role_id = 'SU'
# if role_id == 2:
user_total_num
=
User
.
objects
.
all
()
.
count
()
user_total_num
=
User
.
objects
.
all
()
.
count
()
user_active_num
=
User
.
objects
.
filter
()
.
count
()
user_active_num
=
User
.
objects
.
filter
()
.
count
()
host_total_num
=
Asset
.
objects
.
all
()
.
count
()
host_total_num
=
Asset
.
objects
.
all
()
.
count
()
host_active_num
=
Asset
.
objects
.
filter
(
is_active
=
True
)
.
count
()
host_active_num
=
Asset
.
objects
.
filter
(
is_active
=
True
)
.
count
()
# else:
# pass
request
.
session
.
set_expiry
(
3600
)
request
.
session
.
set_expiry
(
3600
)
info_dic
=
{
'session_user_id'
:
user_id
,
info_dic
=
{
'session_user_id'
:
user_id
,
...
...
run_websocket.py
View file @
a7a030fe
...
@@ -7,6 +7,7 @@ import os
...
@@ -7,6 +7,7 @@ import os
import
sys
import
sys
import
os.path
import
os.path
import
threading
import
threading
import
datetime
import
urllib
import
urllib
import
tornado.ioloop
import
tornado.ioloop
...
@@ -22,7 +23,7 @@ from tornado.options import define, options
...
@@ -22,7 +23,7 @@ from tornado.options import define, options
from
pyinotify
import
WatchManager
,
Notifier
,
ProcessEvent
,
IN_DELETE
,
IN_CREATE
,
IN_MODIFY
,
AsyncNotifier
from
pyinotify
import
WatchManager
,
Notifier
,
ProcessEvent
,
IN_DELETE
,
IN_CREATE
,
IN_MODIFY
,
AsyncNotifier
import
select
import
select
from
connect
import
Tty
,
User
,
Asset
,
PermRole
from
connect
import
Tty
,
User
,
Asset
,
PermRole
,
logger
,
get_object
from
connect
import
TtyLog
,
Log
,
Session
,
user_have_perm
from
connect
import
TtyLog
,
Log
,
Session
,
user_have_perm
try
:
try
:
...
@@ -35,45 +36,49 @@ define("port", default=3000, help="run on the given port", type=int)
...
@@ -35,45 +36,49 @@ define("port", default=3000, help="run on the given port", type=int)
define
(
"host"
,
default
=
'0.0.0.0'
,
help
=
"run port on"
,
type
=
str
)
define
(
"host"
,
default
=
'0.0.0.0'
,
help
=
"run port on"
,
type
=
str
)
def
require_auth
(
func
):
def
require_auth
(
role
=
'user'
):
def
_deco
(
request
,
*
args
,
**
kwargs
):
def
_deco
(
func
):
if
request
.
get_cookie
(
'sessionid'
):
def
_deco
(
request
,
*
args
,
**
kwargs
):
session_key
=
request
.
get_cookie
(
'sessionid'
)
if
request
.
get_cookie
(
'sessionid'
):
else
:
session_key
=
request
.
get_cookie
(
'sessionid'
)
session_key
=
request
.
get_secure_cookie
(
'sessionid'
)
else
:
session_key
=
request
.
get_secure_cookie
(
'sessionid'
)
print
"session: "
+
session_key
logger
.
debug
(
'Websocket: session_key: '
+
session_key
)
if
not
session_key
:
print
(
'Auth Failed'
)
if
session_key
:
request
.
close
()
session
=
get_object
(
Session
,
session_key
=
session_key
)
if
session
and
datetime
.
datetime
.
now
()
>
session
.
expire_date
:
session
=
Session
.
objects
.
filter
(
session_key
=
session_key
)
user_id
=
session
.
get_decoded
()
.
get
(
'_auth_user_id'
)
if
not
session
:
user
=
get_object
(
User
,
id
=
user_id
)
print
(
'Auth Failed'
)
if
user
:
request
.
close
()
logger
.
debug
(
'Websocket: user [
%
s ] request websocket'
%
user
.
username
)
else
:
request
.
user
=
user
session
=
session
[
0
]
if
role
==
'admin'
:
uid
=
session
.
get_decoded
()
.
get
(
'_auth_user_id'
)
if
user
.
role
in
[
'SU'
,
'GA'
]:
user
=
User
.
objects
.
filter
(
id
=
uid
)
return
func
(
request
,
*
args
,
**
kwargs
)
asset_id
=
int
(
request
.
get_argument
(
'id'
,
9999
))
logger
.
debug
(
'Websocket: user [
%
s ] is not admin.'
%
user
.
username
)
print
asset_id
else
:
asset
=
Asset
.
objects
.
filter
(
id
=
asset_id
)
return
func
(
request
,
*
args
,
**
kwargs
)
if
asset
:
asset
=
asset
[
0
]
request
.
asset
=
asset
else
:
request
.
close
()
if
user
:
user
=
user
[
0
]
request
.
user
=
user
else
:
print
(
"No session user."
)
request
.
close
()
request
.
close
()
logger
.
warning
(
'Websocket: Request auth failed.'
)
return
func
(
request
,
*
args
,
**
kwargs
)
# asset_id = int(request.get_argument('id', 9999))
# print asset_id
# asset = Asset.objects.filter(id=asset_id)
# if asset:
# asset = asset[0]
# request.asset = asset
# else:
# request.close()
#
# if user:
# user = user[0]
# request.user = user
#
# else:
# print("No session user.")
# request.close()
return
_deco
return
_deco
return
_deco
...
@@ -109,10 +114,10 @@ def file_monitor(path='.', client=None):
...
@@ -109,10 +114,10 @@ def file_monitor(path='.', client=None):
notifier
=
AsyncNotifier
(
wm
,
EventHandler
(
client
))
notifier
=
AsyncNotifier
(
wm
,
EventHandler
(
client
))
wm
.
add_watch
(
path
,
mask
,
auto_add
=
True
,
rec
=
True
)
wm
.
add_watch
(
path
,
mask
,
auto_add
=
True
,
rec
=
True
)
if
not
os
.
path
.
isfile
(
path
):
if
not
os
.
path
.
isfile
(
path
):
print
"You should monitor a file"
logger
.
debug
(
"File
%
s does not exist."
%
path
)
sys
.
exit
(
3
)
sys
.
exit
(
3
)
else
:
else
:
print
"now starting monitor
%
s."
%
path
logger
.
debug
(
"Now starting monitor file
%
s."
%
path
)
global
f
global
f
f
=
open
(
path
,
'r'
)
f
=
open
(
path
,
'r'
)
st_size
=
os
.
stat
(
path
)[
6
]
st_size
=
os
.
stat
(
path
)[
6
]
...
@@ -158,7 +163,7 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
...
@@ -158,7 +163,7 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
def
check_origin
(
self
,
origin
):
def
check_origin
(
self
,
origin
):
return
True
return
True
@require_auth
@require_auth
(
'admin'
)
def
open
(
self
):
def
open
(
self
):
# 获取监控的path
# 获取监控的path
self
.
file_path
=
self
.
get_argument
(
'file_path'
,
''
)
self
.
file_path
=
self
.
get_argument
(
'file_path'
,
''
)
...
@@ -180,7 +185,8 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
...
@@ -180,7 +185,8 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
MonitorHandler
.
clients
.
remove
(
self
)
MonitorHandler
.
clients
.
remove
(
self
)
MonitorHandler
.
threads
.
remove
(
MonitorHandler
.
threads
[
client_index
])
MonitorHandler
.
threads
.
remove
(
MonitorHandler
.
threads
[
client_index
])
print
len
(
MonitorHandler
.
threads
),
len
(
MonitorHandler
.
clients
)
logger
.
debug
(
"Websocket: Monitor client num:
%
s, thread num:
%
s"
%
(
len
(
MonitorHandler
.
clients
),
len
(
MonitorHandler
.
threads
)))
def
on_message
(
self
,
message
):
def
on_message
(
self
,
message
):
# 监控日志,发生变动发向客户端
# 监控日志,发生变动发向客户端
...
@@ -190,10 +196,13 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
...
@@ -190,10 +196,13 @@ class MonitorHandler(tornado.websocket.WebSocketHandler):
# 客户端主动关闭
# 客户端主动关闭
# self.close()
# self.close()
print
"Close websocket."
logger
.
debug
(
"Websocket: Monitor client close request"
)
client_index
=
MonitorHandler
.
clients
.
index
(
self
)
try
:
MonitorHandler
.
clients
.
remove
(
self
)
client_index
=
MonitorHandler
.
clients
.
index
(
self
)
MonitorHandler
.
threads
.
remove
(
MonitorHandler
.
threads
[
client_index
])
MonitorHandler
.
clients
.
remove
(
self
)
MonitorHandler
.
threads
.
remove
(
MonitorHandler
.
threads
[
client_index
])
except
ValueError
:
pass
class
WebTty
(
Tty
):
class
WebTty
(
Tty
):
...
@@ -206,6 +215,7 @@ class WebTty(Tty):
...
@@ -206,6 +215,7 @@ class WebTty(Tty):
class
WebTerminalKillHandler
(
tornado
.
web
.
RequestHandler
):
class
WebTerminalKillHandler
(
tornado
.
web
.
RequestHandler
):
@require_auth
(
'admin'
)
def
get
(
self
):
def
get
(
self
):
ws_id
=
self
.
get_argument
(
'id'
)
ws_id
=
self
.
get_argument
(
'id'
)
Log
.
objects
.
filter
(
id
=
ws_id
)
.
update
(
is_finished
=
True
)
Log
.
objects
.
filter
(
id
=
ws_id
)
.
update
(
is_finished
=
True
)
...
@@ -228,7 +238,6 @@ class WebTerminalHandler(tornado.websocket.WebSocketHandler):
...
@@ -228,7 +238,6 @@ class WebTerminalHandler(tornado.websocket.WebSocketHandler):
self
.
log_time_f
=
None
self
.
log_time_f
=
None
self
.
log
=
None
self
.
log
=
None
self
.
id
=
0
self
.
id
=
0
self
.
asset
=
None
self
.
user
=
None
self
.
user
=
None
super
(
WebTerminalHandler
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
super
(
WebTerminalHandler
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
...
@@ -237,19 +246,22 @@ class WebTerminalHandler(tornado.websocket.WebSocketHandler):
...
@@ -237,19 +246,22 @@ class WebTerminalHandler(tornado.websocket.WebSocketHandler):
@require_auth
@require_auth
def
open
(
self
):
def
open
(
self
):
print
self
.
user
,
self
.
asset
role_name
=
self
.
get_argument
(
'role'
,
'sb'
)
role_name
=
self
.
get_argument
(
'role'
,
'root'
)
asset_id
=
self
.
get_argument
(
'id'
,
9999
)
roles
=
user_have_perm
(
self
.
user
,
self
.
asset
)
asset
=
get_object
(
Asset
,
id
=
asset_id
)
login_role
=
''
if
asset
:
for
role
in
roles
:
roles
=
user_have_perm
(
self
.
user
,
asset
)
if
role
.
name
==
role_name
:
login_role
=
''
login_role
=
role
for
role
in
roles
:
break
if
role
.
name
==
role_name
:
print
login_role
login_role
=
role
if
not
login_role
:
break
print
"no role"
if
not
login_role
:
self
.
close
()
logger
.
warning
(
'Websocket: Not that Role
%
s for Host:
%
s User:
%
s '
%
(
role_name
,
asset
.
name
,
return
self
.
user
.
username
))
self
.
close
()
return
logger
.
debug
(
'Websocket: request web terminal Host:
%
s User:
%
s Role:
%
s'
%
())
# Todo: 判断
# Todo: 判断
self
.
term
=
WebTty
(
self
.
user
,
self
.
asset
,
login_role
)
self
.
term
=
WebTty
(
self
.
user
,
self
.
asset
,
login_role
)
self
.
term
.
get_connection
()
self
.
term
.
get_connection
()
...
...
templates/jasset/asset_list.html
View file @
a7a030fe
...
@@ -179,10 +179,10 @@
...
@@ -179,10 +179,10 @@
url
:
url
,
url
:
url
,
data
:
{},
data
:
{},
success
:
function
(
data
){
success
:
function
(
data
){
console
.
log
(
data
);
var
dataArray
=
data
.
split
(
','
);
var
dataArray
=
data
.
split
(
','
);
if
(
dataArray
.
length
==
1
&&
data
!=
'error'
){
if
(
dataArray
.
length
==
1
&&
data
!=
'error'
){
window
.
open
(
new_url
+
data
,
'播放'
,
'height=400, width=600, top=89px, left=99px,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no'
);
console
.
log
(
'one'
);
window
.
open
(
new_url
+
data
,
''
,
'height=400, width=600, top=89px, left=99px,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no'
);
}
else
if
(
dataArray
.
length
==
'1'
&&
data
==
'error'
){
}
else
if
(
dataArray
.
length
==
'1'
&&
data
==
'error'
){
layer
.
alert
(
'没有授权角色'
)
layer
.
alert
(
'没有授权角色'
)
}
else
{
}
else
{
...
...
templates/jlog/log_online.html
View file @
a7a030fe
...
@@ -79,11 +79,9 @@
...
@@ -79,11 +79,9 @@
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
登录主机
</th>
<th
class=
"text-center"
>
登录主机
</th>
<th
class=
"text-center"
>
来源IP
</th>
<th
class=
"text-center"
>
来源IP
</th>
{% ifnotequal session_role_id 0 %}
<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>
{% endifnotequal %}
<th
class=
"text-center"
>
登录时间
</th>
<th
class=
"text-center"
>
登录时间
</th>
</tr>
</tr>
...
@@ -94,11 +92,9 @@
...
@@ -94,11 +92,9 @@
<td
id=
"username"
class=
"text-center"
>
{{ post.user }}
</td>
<td
id=
"username"
class=
"text-center"
>
{{ post.user }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.host }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.host }}
</td>
<td
id=
"remote_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
href=
"/jlog/history/?id={{ post.id }}"
class=
"log_command"
>
命令统计
</a></td>
<td
class=
"text-center"
><a
href=
"/jlog/history/?id={{ post.id }}"
class=
"log_command"
>
命令统计
</a></td>
<td
class=
"text-center"
><a
class=
"monitor"
file_path=
"{{ post.log_path }}"
>
监控
</a></td>
<td
class=
"text-center"
><a
class=
"monitor"
file_path=
"{{ 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 }}", "{{ post.remote_ip }}")'
/></td>
<td
class=
"text-center"
><input
type=
"button"
id=
"cut"
class=
"btn btn-danger btn-xs"
name=
"cut"
value=
"阻断"
onclick=
'cut("{{ post.pid }}", "{{ post.remote_ip }}")'
/></td>
{% endifnotequal %}
<td
class=
"text-center"
id=
"start_time"
>
{{ post.start_time|date:"Y-m-d H:i:s" }}
</td>
<td
class=
"text-center"
id=
"start_time"
>
{{ post.start_time|date:"Y-m-d H:i:s" }}
</td>
</tr>
</tr>
{% endfor %}
{% endfor %}
...
@@ -188,10 +184,6 @@
...
@@ -188,10 +184,6 @@
}});
}});
return
false
;
return
false
;
});
});
$
(
'#test_connect'
).
click
(
function
(){
window
.
open
(
'/jlog/web_terminal/?asset_name="hello'
,
'播放'
,
'height=400, width=600, top=89px, left=99px,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no'
);
});
});
});
{
#
function
log_search
(){
#
}
{
#
function
log_search
(){
#
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment