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
014aca28
Commit
014aca28
authored
Nov 20, 2017
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Bugfix] 修复command, replay无法记录的bug
parent
b15b5efa
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
35 additions
and
80 deletions
+35
-80
forward.py
coco/forward.py
+1
-1
models.py
coco/models.py
+1
-1
record.py
coco/record.py
+28
-74
session.py
coco/session.py
+3
-2
utils.py
coco/utils.py
+2
-2
No files found.
coco/forward.py
View file @
014aca28
...
@@ -35,7 +35,7 @@ class ProxyServer:
...
@@ -35,7 +35,7 @@ class ProxyServer:
self
.
watch_win_size_change_async
()
self
.
watch_win_size_change_async
()
recorder
=
FileRecorder
(
self
.
app
,
session
)
recorder
=
FileRecorder
(
self
.
app
,
session
)
session
.
add_recorder
(
recorder
)
session
.
add_recorder
(
recorder
)
session
.
record_async
()
session
.
record_
replay_
async
()
self
.
server
.
add_recorder
(
recorder
)
self
.
server
.
add_recorder
(
recorder
)
self
.
server
.
record_command_async
()
self
.
server
.
record_command_async
()
session
.
bridge
()
session
.
bridge
()
...
...
coco/models.py
View file @
014aca28
...
@@ -98,7 +98,6 @@ class Server:
...
@@ -98,7 +98,6 @@ class Server:
def
func
():
def
func
():
while
not
self
.
stop_evt
.
is_set
():
while
not
self
.
stop_evt
.
is_set
():
_input
,
_output
=
self
.
command_queue
.
get
()
_input
,
_output
=
self
.
command_queue
.
get
()
logger
.
debug
(
"Record command: ({},{})"
.
format
(
_input
,
_output
))
for
recorder
in
self
.
recorders
:
for
recorder
in
self
.
recorders
:
recorder
.
record_command
(
datetime
.
datetime
.
now
(),
_input
,
_output
)
recorder
.
record_command
(
datetime
.
datetime
.
now
(),
_input
,
_output
)
thread
=
threading
.
Thread
(
target
=
func
)
thread
=
threading
.
Thread
(
target
=
func
)
...
@@ -122,6 +121,7 @@ class Server:
...
@@ -122,6 +121,7 @@ class Server:
self
.
_output
=
self
.
_parse_output
()
self
.
_output
=
self
.
_parse_output
()
print
(
self
.
_input
)
print
(
self
.
_input
)
print
(
self
.
_output
)
print
(
self
.
_output
)
print
(
"#"
*
30
+
" End "
+
"#"
*
30
)
self
.
command_queue
.
put
((
self
.
_input
,
self
.
_output
))
self
.
command_queue
.
put
((
self
.
_input
,
self
.
_output
))
del
self
.
input_data
[:]
del
self
.
input_data
[:]
del
self
.
output_data
[:]
del
self
.
output_data
[:]
...
...
coco/record.py
View file @
014aca28
...
@@ -36,60 +36,53 @@ class Recorder(metaclass=abc.ABCMeta):
...
@@ -36,60 +36,53 @@ class Recorder(metaclass=abc.ABCMeta):
class
FileRecorder
(
Recorder
):
class
FileRecorder
(
Recorder
):
@property
def
__init__
(
self
,
app
,
session
):
def
session_dir
(
self
):
super
()
.
__init__
(
app
,
session
)
self
.
data_f
=
None
self
.
time_f
=
None
self
.
cmd_f
=
None
self
.
prepare_file
()
def
prepare_file
(
self
):
session_dir
=
os
.
path
.
join
(
session_dir
=
os
.
path
.
join
(
self
.
app
.
config
[
"SESSION_DIR"
],
self
.
app
.
config
[
"SESSION_DIR"
],
self
.
session
.
date_created
.
strftime
(
"
%
Y-
%
m-
%
d"
)
self
.
session
.
date_created
.
strftime
(
"
%
Y-
%
m-
%
d"
)
)
)
if
not
os
.
path
.
isdir
(
session_dir
):
if
not
os
.
path
.
isdir
(
session_dir
):
os
.
mkdir
(
session_dir
)
os
.
mkdir
(
session_dir
)
return
session_dir
@property
filename
=
os
.
path
.
join
(
session_dir
,
str
(
self
.
session
.
id
))
def
data_f
(
self
):
data_filename
=
filename
+
".rec"
filename
=
os
.
path
.
join
(
self
.
session_dir
,
str
(
self
.
session
.
id
)
+
".rec"
)
time_filename
=
filename
+
".time"
try
:
cmd_filename
=
filename
+
".cmd"
f
=
open
(
filename
,
'wb'
)
except
IOError
:
logger
.
error
(
"Failed open file {} in recorder"
.
format
(
filename
))
raise
return
f
@property
def
time_f
(
self
):
filename
=
os
.
path
.
join
(
self
.
session_dir
,
str
(
self
.
session
.
id
)
+
".time"
)
try
:
f
=
open
(
filename
,
'w'
)
except
IOError
:
logger
.
error
(
"Failed open file {} in recorder"
.
format
(
filename
))
raise
return
f
@property
def
cmd_f
(
self
):
filename
=
os
.
path
.
join
(
self
.
session_dir
,
str
(
self
.
session
.
id
)
+
".cmd"
)
try
:
try
:
f
=
open
(
filename
,
"w"
)
self
.
data_f
=
open
(
data_filename
,
"wb"
)
except
IOError
:
self
.
time_f
=
open
(
time_filename
,
"w"
)
logger
.
error
(
"Failed open file {} in recorder"
.
format
(
filename
))
self
.
cmd_f
=
open
(
cmd_filename
,
"w"
)
raise
except
IOError
as
e
:
return
f
logger
.
debug
(
e
)
self
.
done
()
def
record_replay
(
self
,
now
,
timedelta
,
size
,
data
):
def
record_replay
(
self
,
now
,
timedelta
,
size
,
data
):
self
.
time_f
.
write
(
"
%.4
f
%
s
\n
"
%
(
timedelta
,
size
))
logger
.
debug
(
"File recorder replay: ({},{},{})"
.
format
(
timedelta
,
size
,
data
))
self
.
time_f
.
write
(
"{} {}
\n
"
.
format
(
timedelta
,
size
))
self
.
data_f
.
write
(
data
)
self
.
data_f
.
write
(
data
)
def
record_command
(
self
,
now
,
_input
,
_output
):
def
record_command
(
self
,
now
,
_input
,
_output
):
logger
.
debug
(
"File recorder command: ({},{})"
.
format
(
_input
,
_output
))
self
.
cmd_f
.
write
(
"{}
\n
"
.
format
(
now
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)))
self
.
cmd_f
.
write
(
"{}
\n
"
.
format
(
now
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)))
self
.
cmd_f
.
write
(
"$ {}
\n
"
.
format
(
_input
))
self
.
cmd_f
.
write
(
"$ {}
\n
"
.
format
(
_input
))
self
.
cmd_f
.
write
(
"{}
\n\n
"
.
format
(
_output
))
self
.
cmd_f
.
write
(
"{}
\n\n
"
.
format
(
_output
))
self
.
cmd_f
.
flush
()
def
start
(
self
):
def
start
(
self
):
self
.
data_f
.
write
(
"Session started on {}
\n
"
.
format
(
time
.
asctime
())
.
encode
(
"utf-8"
))
logger
.
debug
(
"Session {} start"
.
format
(
self
.
session
.
id
))
self
.
data_f
.
write
(
"Session {} started on {}
\n
"
.
format
(
self
.
session
.
id
,
time
.
asctime
())
.
encode
(
"utf-8"
))
def
done
(
self
):
def
done
(
self
):
self
.
data_f
.
write
(
"Session done on {}
\n
"
.
format
(
time
.
asctime
())
.
encode
(
"utf-8"
))
logger
.
debug
(
"Session {} record done"
.
format
(
self
.
session
.
id
))
self
.
data_f
.
write
(
"Session {} done on {}
\n
"
.
format
(
self
.
session
.
id
,
time
.
asctime
())
.
encode
(
"utf-8"
))
for
f
in
[
self
.
data_f
,
self
.
time_f
,
self
.
cmd_f
]:
for
f
in
[
self
.
data_f
,
self
.
time_f
,
self
.
cmd_f
]:
try
:
try
:
f
.
close
()
f
.
close
()
...
@@ -97,44 +90,5 @@ class FileRecorder(Recorder):
...
@@ -97,44 +90,5 @@ class FileRecorder(Recorder):
pass
pass
# class FileSessionReplay(SessionReplay):
#
# def __init__(self, dataf, metaf):
# self.dataf = dataf
# self.metaf = metaf
# self.playing = True
#
# def write_data(self, data):
# self.dataf.write(data)
#
# def write_meta(self, meta):
# self.metaf.write(meta)
#
# def replay(self, sock):
# sock.send(self.dataf.readline())
# for l in self.metaf:
# if not self.playing:
# break
# t, size = float(l.split()[0]), int(l.split()[1])
# data = self.dataf.read(size)
# time.sleep(t)
# sock.send(data)
# sock.send("Replay session end")
#
# def done(self):
# pass
#
#
# class FileSessionCommand(SessionCommand):
#
# def __init__(self, f):
# self.f = f
#
# def write(self, cmd, output):
# self.f.write("{}\n".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
# self.f.write("$ {}\n".format(cmd))
# self.f.write("{}\n\n".format(output))
#
# def done(self):
# pass
coco/session.py
View file @
014aca28
...
@@ -113,9 +113,10 @@ class Session:
...
@@ -113,9 +113,10 @@ class Session:
def
set_size
(
self
,
width
,
height
):
def
set_size
(
self
,
width
,
height
):
self
.
server
.
resize_pty
(
width
=
width
,
height
=
height
)
self
.
server
.
resize_pty
(
width
=
width
,
height
=
height
)
def
record_async
(
self
):
def
record_
replay_
async
(
self
):
def
func
():
def
func
():
parent
,
child
=
socket
.
socketpair
()
parent
,
child
=
socket
.
socketpair
()
self
.
add_watcher
(
parent
)
for
recorder
in
self
.
recorders
:
for
recorder
in
self
.
recorders
:
recorder
.
start
()
recorder
.
start
()
while
not
self
.
stop_evt
.
is_set
():
while
not
self
.
stop_evt
.
is_set
():
...
@@ -124,7 +125,7 @@ class Session:
...
@@ -124,7 +125,7 @@ class Session:
end_t
=
time
.
time
()
end_t
=
time
.
time
()
size
=
len
(
data
)
size
=
len
(
data
)
now
=
datetime
.
datetime
.
now
()
now
=
datetime
.
datetime
.
now
()
timedelta
=
'{.4f}'
.
format
(
end_t
-
start_t
)
timedelta
=
'{
:
.4f}'
.
format
(
end_t
-
start_t
)
if
size
==
0
:
if
size
==
0
:
break
break
for
recorder
in
self
.
recorders
:
for
recorder
in
self
.
recorders
:
...
...
coco/utils.py
View file @
014aca28
...
@@ -162,7 +162,7 @@ class TtyIOParser(object):
...
@@ -162,7 +162,7 @@ class TtyIOParser(object):
if
line
.
strip
():
if
line
.
strip
():
output
.
append
(
line
)
output
.
append
(
line
)
self
.
screen
.
reset
()
self
.
screen
.
reset
()
return
sep
.
join
(
output
[
0
:
-
1
])
return
sep
.
join
(
output
[
0
:
-
1
])
.
strip
()
def
parse_input
(
self
,
data
):
def
parse_input
(
self
,
data
):
"""
"""
...
@@ -184,7 +184,7 @@ class TtyIOParser(object):
...
@@ -184,7 +184,7 @@ class TtyIOParser(object):
command
=
''
command
=
''
self
.
screen
.
reset
()
self
.
screen
.
reset
()
command
=
self
.
clean_ps1_etc
(
command
)
command
=
self
.
clean_ps1_etc
(
command
)
return
command
return
command
.
strip
()
def
is_obj_attr_has
(
obj
,
val
,
attrs
=
(
"hostname"
,
"ip"
,
"comment"
)):
def
is_obj_attr_has
(
obj
,
val
,
attrs
=
(
"hostname"
,
"ip"
,
"comment"
)):
...
...
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