Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
C
coco
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
coco
Commits
673a8af1
Unverified
Commit
673a8af1
authored
Mar 20, 2018
by
老广
Committed by
GitHub
Mar 20, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #39 from jumpserver/dev
Dev
parents
0cc9ea35
f046a173
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
55 additions
and
33 deletions
+55
-33
app.py
coco/app.py
+0
-1
interactive.py
coco/interactive.py
+3
-5
interface.py
coco/interface.py
+8
-1
models.py
coco/models.py
+8
-5
proxy.py
coco/proxy.py
+16
-10
recorder.py
coco/recorder.py
+7
-7
session.py
coco/session.py
+6
-3
sshd.py
coco/sshd.py
+7
-1
No files found.
coco/app.py
View file @
673a8af1
...
...
@@ -222,7 +222,6 @@ class Coco:
self
.
clients
.
remove
(
client
)
logger
.
info
(
"Client {} leave, total {} now"
.
format
(
client
,
len
(
self
.
clients
)))
client
.
close
()
del
client
except
:
pass
...
...
coco/interactive.py
View file @
673a8af1
...
...
@@ -83,7 +83,6 @@ class InteractiveServer:
while
True
:
data
=
self
.
client
.
recv
(
10
)
logger
.
debug
(
data
)
if
len
(
data
)
==
0
:
self
.
app
.
remove_client
(
self
.
client
)
break
...
...
@@ -300,9 +299,6 @@ class InteractiveServer:
forwarder
=
ProxyServer
(
self
.
app
,
self
.
client
)
forwarder
.
proxy
(
asset
,
system_user
)
def
replay_session
(
self
,
session_id
):
pass
def
interact
(
self
):
self
.
display_banner
()
while
True
:
...
...
@@ -322,4 +318,6 @@ class InteractiveServer:
def
close
(
self
):
self
.
app
.
remove_client
(
self
.
client
)
logger
.
info
(
"Exit interactive server"
)
# def __del__(self):
# print("GC: Interactive class been gc")
coco/interface.py
View file @
673a8af1
...
...
@@ -21,7 +21,7 @@ class SSHInterface(paramiko.ServerInterface):
def
__init__
(
self
,
app
,
request
):
self
.
_app
=
weakref
.
ref
(
app
)
self
.
request
=
request
self
.
_request
=
weakref
.
ref
(
request
)
self
.
event
=
threading
.
Event
()
self
.
auth_valid
=
False
...
...
@@ -29,6 +29,10 @@ class SSHInterface(paramiko.ServerInterface):
def
app
(
self
):
return
self
.
_app
()
@property
def
request
(
self
):
return
self
.
_request
()
def
check_auth_interactive
(
self
,
username
,
submethods
):
logger
.
info
(
"Check auth interactive:
%
s
%
s"
%
(
username
,
submethods
))
return
paramiko
.
AUTH_FAILED
...
...
@@ -177,6 +181,9 @@ class SSHInterface(paramiko.ServerInterface):
def
get_banner
(
self
):
return
None
,
None
# def __del__(self):
# print("GC: SSH interface gc")
...
...
coco/models.py
View file @
673a8af1
...
...
@@ -21,6 +21,9 @@ class Request:
self
.
change_size_event
=
threading
.
Event
()
self
.
date_start
=
datetime
.
datetime
.
now
()
# def __del__(self):
# print("GC: Request object gc")
class
SizedList
(
list
):
def
__init__
(
self
,
maxsize
=
0
):
...
...
@@ -74,8 +77,8 @@ class Client:
def
__str__
(
self
):
return
"<
%
s from
%
s:
%
s>"
%
(
self
.
user
,
self
.
addr
[
0
],
self
.
addr
[
1
])
def
__del__
(
self
):
logger
.
info
(
"GC client object: {}"
.
format
(
self
)
)
#
def __del__(self):
# print("GC: Client object has been gc"
)
class
Server
:
...
...
@@ -157,9 +160,9 @@ class Server:
def
close
(
self
):
logger
.
info
(
"Closed server {}"
.
format
(
self
))
self
.
parse
(
b
''
)
self
.
chan
.
close
()
self
.
stop_evt
.
set
()
self
.
chan
.
close
()
self
.
chan
.
transport
.
close
()
@staticmethod
def
_have_enter_char
(
s
):
...
...
@@ -186,8 +189,8 @@ class Server:
def
__str__
(
self
):
return
"<To: {}>"
.
format
(
str
(
self
.
asset
))
def
__del__
(
self
):
logger
.
info
(
"GC server object: {}"
.
format
(
self
)
)
#
def __del__(self):
# print("GC: Server object has been gc"
)
class
WSProxy
:
...
...
coco/proxy.py
View file @
673a8af1
...
...
@@ -24,9 +24,9 @@ class ProxyServer:
def
__init__
(
self
,
app
,
client
):
self
.
_app
=
weakref
.
ref
(
app
)
self
.
client
=
client
self
.
request
=
client
.
request
self
.
server
=
None
self
.
connecting
=
True
self
.
stop_event
=
threading
.
Event
()
@property
def
app
(
self
):
...
...
@@ -47,6 +47,8 @@ class ProxyServer:
self
.
app
.
add_session
(
session
)
self
.
watch_win_size_change_async
()
session
.
bridge
()
self
.
stop_event
.
set
()
self
.
end_watch_win_size_change
()
self
.
app
.
remove_session
(
session
)
def
validate_permission
(
self
,
asset
,
system_user
):
...
...
@@ -117,17 +119,20 @@ class ProxyServer:
self
.
connecting
=
False
self
.
client
.
send
(
b
'
\r\n
'
)
term
=
self
.
request
.
meta
.
get
(
'term'
,
'xterm'
)
width
=
self
.
request
.
meta
.
get
(
'width'
,
80
)
height
=
self
.
request
.
meta
.
get
(
'height'
,
24
)
request
=
self
.
client
.
request
term
=
request
.
meta
.
get
(
'term'
,
'xterm'
)
width
=
request
.
meta
.
get
(
'width'
,
80
)
height
=
request
.
meta
.
get
(
'height'
,
24
)
chan
=
ssh
.
invoke_shell
(
term
,
width
=
width
,
height
=
height
)
return
Server
(
chan
,
asset
,
system_user
)
def
watch_win_size_change
(
self
):
while
self
.
request
.
change_size_event
.
wait
():
self
.
request
.
change_size_event
.
clear
()
width
=
self
.
request
.
meta
.
get
(
'width'
,
80
)
height
=
self
.
request
.
meta
.
get
(
'height'
,
24
)
while
self
.
client
.
request
.
change_size_event
.
wait
():
if
self
.
stop_event
.
is_set
():
break
self
.
client
.
request
.
change_size_event
.
clear
()
width
=
self
.
client
.
request
.
meta
.
get
(
'width'
,
80
)
height
=
self
.
client
.
request
.
meta
.
get
(
'height'
,
24
)
logger
.
debug
(
"Change win size:
%
s -
%
s"
%
(
width
,
height
))
try
:
self
.
server
.
chan
.
resize_pty
(
width
=
width
,
height
=
height
)
...
...
@@ -139,6 +144,9 @@ class ProxyServer:
thread
.
daemon
=
True
thread
.
start
()
def
end_watch_win_size_change
(
self
):
self
.
client
.
request
.
change_size_event
.
set
()
def
send_connecting_message
(
self
,
asset
,
system_user
):
def
func
():
delay
=
0.0
...
...
@@ -149,5 +157,3 @@ class ProxyServer:
delay
+=
0.1
thread
=
threading
.
Thread
(
target
=
func
)
thread
.
start
()
coco/recorder.py
View file @
673a8af1
...
...
@@ -178,9 +178,9 @@ class ServerReplayRecorder(ReplayRecorder):
logger
.
error
(
"failed report session {}'s replay log"
.
format
(
session_id
))
return
False
def
__del__
(
self
):
print
(
"{} has been gc"
.
format
(
self
)
)
del
self
.
file
#
def __del__(self):
# print("GC: Server replay recorder has been gc"
)
#
del self.file
class
ServerCommandRecorder
(
CommandRecorder
,
metaclass
=
Singleton
):
...
...
@@ -226,8 +226,8 @@ class ServerCommandRecorder(CommandRecorder, metaclass=Singleton):
def
session_end
(
self
,
session_id
):
pass
def
__del__
(
self
):
print
(
"{} has been gc"
.
format
(
self
)
)
#
def __del__(self):
# print("GC: Session command storage has been gc"
)
class
ESCommandRecorder
(
CommandRecorder
,
metaclass
=
Singleton
):
...
...
@@ -279,8 +279,8 @@ class ESCommandRecorder(CommandRecorder, metaclass=Singleton):
def
session_end
(
self
,
session_id
):
pass
def
__del__
(
self
):
print
(
"{}
has been gc"
.
format
(
self
))
#
def __del__(self):
# print("GC: ES command storage
has been gc".format(self))
def
get_command_recorder_class
(
config
):
...
...
coco/session.py
View file @
673a8af1
...
...
@@ -107,7 +107,10 @@ class Session:
def
terminate
(
self
):
msg
=
b
"Terminate by administrator
\r\n
"
self
.
client
.
send
(
msg
)
try
:
self
.
client
.
send
(
msg
)
except
OSError
:
pass
self
.
close
()
def
bridge
(
self
):
...
...
@@ -185,5 +188,5 @@ class Session:
def
__repr__
(
self
):
return
self
.
id
def
__del__
(
self
):
logger
.
info
(
"Session {} object has been GC"
.
format
(
self
.
id
)
)
#
def __del__(self):
# print("GC: Session object has been GC"
)
coco/sshd.py
View file @
673a8af1
...
...
@@ -72,10 +72,16 @@ class SSHServer:
return
while
True
:
if
not
transport
.
is_active
():
transport
.
close
()
sock
.
close
()
break
chan
=
transport
.
accept
()
server
.
event
.
wait
(
5
)
if
chan
is
None
:
continue
server
.
event
.
wait
(
5
)
if
not
server
.
event
.
is_set
():
logger
.
warning
(
"Client not request a valid request, exiting"
)
return
...
...
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