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
2983f06a
Unverified
Commit
2983f06a
authored
Dec 19, 2018
by
老广
Committed by
GitHub
Dec 19, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #145 from jumpserver/dev
Dev
parents
1233b998
f510d762
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
147 additions
and
117 deletions
+147
-117
app.py
coco/app.py
+10
-0
config.py
coco/config.py
+18
-1
interactive.py
coco/interactive.py
+0
-0
logger.py
coco/logger.py
+1
-1
models.py
coco/models.py
+5
-0
sshd.py
coco/sshd.py
+2
-1
utils.py
coco/utils.py
+5
-1
coco.mo
locale/en/LC_MESSAGES/coco.mo
+0
-0
coco.po
locale/en/LC_MESSAGES/coco.po
+41
-50
coco.mo
locale/zh_CN/LC_MESSAGES/coco.mo
+0
-0
coco.po
locale/zh_CN/LC_MESSAGES/coco.po
+65
-63
No files found.
coco/app.py
View file @
2983f06a
...
@@ -56,6 +56,7 @@ class Coco:
...
@@ -56,6 +56,7 @@ class Coco:
return
self
.
_task_handler
return
self
.
_task_handler
@staticmethod
@staticmethod
@ignore_error
def
load_extra_conf_from_server
():
def
load_extra_conf_from_server
():
configs
=
app_service
.
load_config_from_server
()
configs
=
app_service
.
load_config_from_server
()
logger
.
debug
(
"Loading config from server: {}"
.
format
(
logger
.
debug
(
"Loading config from server: {}"
.
format
(
...
@@ -63,8 +64,17 @@ class Coco:
...
@@ -63,8 +64,17 @@ class Coco:
))
))
config
.
update
(
configs
)
config
.
update
(
configs
)
def
keep_load_extra_conf
(
self
):
def
func
():
while
True
:
self
.
load_extra_conf_from_server
()
time
.
sleep
(
60
*
10
)
thread
=
threading
.
Thread
(
target
=
func
)
thread
.
start
()
def
bootstrap
(
self
):
def
bootstrap
(
self
):
self
.
load_extra_conf_from_server
()
self
.
load_extra_conf_from_server
()
self
.
keep_load_extra_conf
()
self
.
keep_heartbeat
()
self
.
keep_heartbeat
()
self
.
monitor_sessions
()
self
.
monitor_sessions
()
self
.
monitor_sessions_replay
()
self
.
monitor_sessions_replay
()
...
...
coco/config.py
View file @
2983f06a
...
@@ -92,8 +92,9 @@ class Config(dict):
...
@@ -92,8 +92,9 @@ class Config(dict):
"""
"""
def
__init__
(
self
,
root_path
,
defaults
=
None
):
def
__init__
(
self
,
root_path
,
defaults
=
None
):
dict
.
__init__
(
self
,
defaults
or
{})
self
.
defaults
=
defaults
or
{}
self
.
root_path
=
root_path
self
.
root_path
=
root_path
super
()
.
__init__
({})
def
from_envvar
(
self
,
variable_name
,
silent
=
False
):
def
from_envvar
(
self
,
variable_name
,
silent
=
False
):
"""Loads a configuration from an environment variable pointing to
"""Loads a configuration from an environment variable pointing to
...
@@ -269,6 +270,21 @@ class Config(dict):
...
@@ -269,6 +270,21 @@ class Config(dict):
rv
[
key
]
=
v
rv
[
key
]
=
v
return
rv
return
rv
def
__getitem__
(
self
,
item
):
try
:
value
=
super
()
.
__getitem__
(
item
)
except
KeyError
:
value
=
None
if
value
is
not
None
:
return
value
value
=
os
.
environ
.
get
(
item
,
None
)
if
value
is
not
None
:
return
value
return
self
.
defaults
.
get
(
item
)
def
__getattr__
(
self
,
item
):
return
self
.
__getitem__
(
item
)
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'<
%
s
%
s>'
%
(
self
.
__class__
.
__name__
,
dict
.
__repr__
(
self
))
return
'<
%
s
%
s>'
%
(
self
.
__class__
.
__name__
,
dict
.
__repr__
(
self
))
...
@@ -302,6 +318,7 @@ default_config = {
...
@@ -302,6 +318,7 @@ default_config = {
'REPLAY_STORAGE'
:
{
'TYPE'
:
'server'
},
'REPLAY_STORAGE'
:
{
'TYPE'
:
'server'
},
'LANGUAGE_CODE'
:
'zh'
,
'LANGUAGE_CODE'
:
'zh'
,
'SECURITY_MAX_IDLE_TIME'
:
60
,
'SECURITY_MAX_IDLE_TIME'
:
60
,
'ASSET_LIST_PAGE_SIZE'
:
'auto'
,
}
}
config
=
Config
(
root_path
,
default_config
)
config
=
Config
(
root_path
,
default_config
)
...
...
coco/interactive.py
View file @
2983f06a
This diff is collapsed.
Click to expand it.
coco/logger.py
View file @
2983f06a
...
@@ -10,7 +10,7 @@ from .config import config as app_config
...
@@ -10,7 +10,7 @@ from .config import config as app_config
def
create_logger
():
def
create_logger
():
level
=
app_config
[
'LOG_LEVEL'
]
level
=
app_config
[
'LOG_LEVEL'
]
log_dir
=
app_config
.
get
(
'LOG_DIR'
)
log_dir
=
app_config
[
'LOG_DIR'
]
log_path
=
os
.
path
.
join
(
log_dir
,
'coco.log'
)
log_path
=
os
.
path
.
join
(
log_dir
,
'coco.log'
)
main_setting
=
{
main_setting
=
{
'handlers'
:
[
'console'
,
'file'
],
'handlers'
:
[
'console'
,
'file'
],
...
...
coco/models.py
View file @
2983f06a
...
@@ -360,6 +360,11 @@ class TelnetServer(BaseServer):
...
@@ -360,6 +360,11 @@ class TelnetServer(BaseServer):
self
.
system_user
=
system_user
self
.
system_user
=
system_user
super
(
TelnetServer
,
self
)
.
__init__
(
chan
=
sock
)
super
(
TelnetServer
,
self
)
.
__init__
(
chan
=
sock
)
@property
def
closed
(
self
):
""" self.chan: socket object """
return
getattr
(
self
.
chan
,
'_closed'
,
False
)
class
Server
(
BaseServer
):
class
Server
(
BaseServer
):
"""
"""
...
...
coco/sshd.py
View file @
2983f06a
...
@@ -63,6 +63,7 @@ class SSHServer:
...
@@ -63,6 +63,7 @@ class SSHServer:
return
connection
return
connection
def
handle_connection
(
self
,
sock
,
addr
):
def
handle_connection
(
self
,
sock
,
addr
):
logger
.
debug
(
"Handle new connection from: {}"
.
format
(
addr
))
transport
=
paramiko
.
Transport
(
sock
,
gss_kex
=
False
)
transport
=
paramiko
.
Transport
(
sock
,
gss_kex
=
False
)
try
:
try
:
transport
.
load_server_moduli
()
transport
.
load_server_moduli
()
...
@@ -77,7 +78,7 @@ class SSHServer:
...
@@ -77,7 +78,7 @@ class SSHServer:
server
=
SSHInterface
(
connection
)
server
=
SSHInterface
(
connection
)
try
:
try
:
transport
.
start_server
(
server
=
server
)
transport
.
start_server
(
server
=
server
)
except
paramiko
.
SSHException
:
except
(
paramiko
.
SSHException
,
socket
.
timeout
)
:
logger
.
warning
(
"SSH negotiation failed"
)
logger
.
warning
(
"SSH negotiation failed"
)
return
return
except
EOFError
as
e
:
except
EOFError
as
e
:
...
...
coco/utils.py
View file @
2983f06a
...
@@ -294,7 +294,7 @@ def get_logger(file_name):
...
@@ -294,7 +294,7 @@ def get_logger(file_name):
return
logging
.
getLogger
(
'coco.'
+
file_name
)
return
logging
.
getLogger
(
'coco.'
+
file_name
)
def
net_input
(
client
,
prompt
=
'Opt> '
,
sensitive
=
False
,
before
=
0
,
after
=
0
):
def
net_input
(
client
,
prompt
=
'Opt> '
,
sensitive
=
False
,
before
=
0
,
after
=
0
,
only_one_char
=
False
):
"""实现了一个ssh input, 提示用户输入, 获取并返回
"""实现了一个ssh input, 提示用户输入, 获取并返回
:return user input string
:return user input string
...
@@ -303,6 +303,10 @@ def net_input(client, prompt='Opt> ', sensitive=False, before=0, after=0):
...
@@ -303,6 +303,10 @@ def net_input(client, prompt='Opt> ', sensitive=False, before=0, after=0):
parser
=
TtyIOParser
()
parser
=
TtyIOParser
()
client
.
send
(
wrap_with_line_feed
(
prompt
,
before
=
before
,
after
=
after
))
client
.
send
(
wrap_with_line_feed
(
prompt
,
before
=
before
,
after
=
after
))
if
only_one_char
:
data
=
client
.
recv
(
1
)
return
data
.
decode
()
while
True
:
while
True
:
data
=
client
.
recv
(
10
)
data
=
client
.
recv
(
10
)
if
len
(
data
)
==
0
:
if
len
(
data
)
==
0
:
...
...
locale/en/LC_MESSAGES/coco.mo
View file @
2983f06a
No preview for this file type
locale/en/LC_MESSAGES/coco.po
View file @
2983f06a
...
@@ -7,7 +7,7 @@ msgid ""
...
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-1
0-31 11:49
+0800\n"
"POT-Creation-Date: 2018-1
2-18 20:03
+0800\n"
"PO-Revision-Date: 2018-08-10 10:42+0800\n"
"PO-Revision-Date: 2018-08-10 10:42+0800\n"
"Last-Translator: BaiJiangjie <bugatti_it@163.com>\n"
"Last-Translator: BaiJiangjie <bugatti_it@163.com>\n"
"Language-Team: Language locale/en/LC\n"
"Language-Team: Language locale/en/LC\n"
...
@@ -16,11 +16,11 @@ msgstr ""
...
@@ -16,11 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n"
#: coco/app.py:1
3
5
#: coco/app.py:1
4
5
msgid "Connect idle more than {} minutes, disconnect"
msgid "Connect idle more than {} minutes, disconnect"
msgstr ""
msgstr ""
#: coco/interactive.py:8
0
#: coco/interactive.py:8
4
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"\n"
"\n"
...
@@ -28,136 +28,127 @@ msgid ""
...
@@ -28,136 +28,127 @@ msgid ""
"{end}{R}{R}"
"{end}{R}{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:8
2
#: coco/interactive.py:8
6
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}1) Enter {green}ID{end} directly login or enter {green}part IP, Hostname, "
"{T}1) Enter {green}ID{end} directly login or enter {green}part IP, Hostname, "
"Comment{end} to search login(if unique).{R}"
"Comment{end} to search login(if unique).{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:8
3
#: coco/interactive.py:8
7
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}2) Enter {green}/{end} + {green}IP, Hostname{end} or {green}Comment {end} "
"{T}2) Enter {green}/{end} + {green}IP, Hostname{end} or {green}Comment {end} "
"search, such as: /ip.{R}"
"search, such as: /ip.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:8
4
#: coco/interactive.py:8
8
#, python-brace-format
#, python-brace-format
msgid "{T}3) Enter {green}p{end} to display the host you have permission.{R}"
msgid "{T}3) Enter {green}p{end} to display the host you have permission.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:8
5
#: coco/interactive.py:8
9
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}4) Enter {green}g{end} to display the node that you have permission.{R}"
"{T}4) Enter {green}g{end} to display the node that you have permission.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:
86
#: coco/interactive.py:
90
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}5) Enter {green}g{end} + {green}NodeID{end} to display the host under the "
"{T}5) Enter {green}g{end} + {green}NodeID{end} to display the host under the "
"node, such as g1.{R}"
"node, such as g1.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:
87
#: coco/interactive.py:
91
#, python-brace-format
#, python-brace-format
msgid "{T}6) Enter {green}s{end} Chinese-english switch.{R}"
msgid "{T}6) Enter {green}s{end} Chinese-english switch.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:
88
#: coco/interactive.py:
92
#, python-brace-format
#, python-brace-format
msgid "{T}7) Enter {green}h{end} help.{R}"
msgid "{T}7) Enter {green}h{end} help.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:
89
#: coco/interactive.py:
93
#, python-brace-format
#, python-brace-format
msgid "{T}8) Enter {green}r{end} to refresh your assets and nodes.{R}"
msgid "{T}8) Enter {green}r{end} to refresh your assets and nodes.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:9
0
#: coco/interactive.py:9
4
#, python-brace-format
#, python-brace-format
msgid "{T}0) Enter {green}q{end} exit.{R}"
msgid "{T}0) Enter {green}q{end} exit.{R}"
msgstr ""
msgstr ""
#: coco/interactive.py:159
#: coco/interactive.py:155
msgid "No"
msgid "Terminal does not support login rdp, please use web terminal to access"
msgstr ""
#: coco/interactive.py:166
msgid "Name"
msgstr ""
msgstr ""
#: coco/interactive.py:
166
#: coco/interactive.py:
212
msgid "Assets"
msgid "
No
Assets"
msgstr ""
msgstr ""
#: coco/interactive.py:
172
#: coco/interactive.py:
275
msgid "T
otal: {}
"
msgid "T
ips: Enter the asset ID and log directly into the asset.
"
msgstr ""
msgstr ""
#: coco/interactive.py:
177
#: coco/interactive.py:
276
msgid "
Node [ ID.Name(Asset) ]
"
msgid "
Page up: P/p
"
msgstr ""
msgstr ""
#: coco/interactive.py:
179
#: coco/interactive.py:
277
msgid "
Enter g+NodeID to display the host under the node, such as g1.
"
msgid "
Page down: Enter|N/n
"
msgstr ""
msgstr ""
#: coco/interactive.py:
186
#: coco/interactive.py:
278
msgid "
There is no matched node, please re-enter
"
msgid "
BACK: b/q
"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "ID"
msgid "ID"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "Hostname"
msgid "Hostname"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "IP"
msgid "IP"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "LoginAs"
msgid "LoginAs"
msgstr ""
msgstr ""
#: coco/interactive.py:
211
#: coco/interactive.py:
313
msgid "Comment"
msgid "Comment"
msgstr ""
msgstr ""
#: coco/interactive.py:
221
#: coco/interactive.py:
322
msgid "Page: {}, Count: {}, Total Page: {}, Total Count: {}"
msgid "Page: {}, Count: {}, Total Page: {}, Total Count: {}"
msgstr ""
msgstr ""
#: coco/interactive.py:
296
#: coco/interactive.py:
394
msgid "
Select a login::
"
msgid "
No Nodes
"
msgstr ""
msgstr ""
#: coco/interactive.py:319
#: coco/interactive.py:398
msgid ""
msgid "Node: [ ID.Name(Asset amount) ]"
"Terminal does not support login Windows, please use web terminal to access"
msgstr ""
msgstr ""
#: coco/interactive.py:40
1
#: coco/interactive.py:40
0
msgid "Tips: Enter
the asset ID and log directly into the asset.
"
msgid "Tips: Enter
g+NodeID to display the host under the node, such as g1
"
msgstr ""
msgstr ""
#: coco/interactive.py:402
#: coco/interactive.py:408
msgid "Page up: P/p"
msgid "There is no matched node, please re-enter"
msgstr ""
#: coco/interactive.py:403
msgid "Page down: Enter|N/n"
msgstr ""
msgstr ""
#: coco/interactive.py:4
04
#: coco/interactive.py:4
38
msgid "
BACK: B/b
"
msgid "
Select a login::
"
msgstr ""
msgstr ""
#: coco/interactive.py:4
25
#: coco/interactive.py:4
61
msgid "No system user"
msgid "No system user"
msgstr ""
msgstr ""
...
...
locale/zh_CN/LC_MESSAGES/coco.mo
View file @
2983f06a
No preview for this file type
locale/zh_CN/LC_MESSAGES/coco.po
View file @
2983f06a
...
@@ -7,7 +7,7 @@ msgid ""
...
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-1
0-31 11:49
+0800\n"
"POT-Creation-Date: 2018-1
2-18 20:04
+0800\n"
"PO-Revision-Date: 2018-08-10 10:42+0800\n"
"PO-Revision-Date: 2018-08-10 10:42+0800\n"
"Last-Translator: BaiJiangjie <bugatti_it@163.com>\n"
"Last-Translator: BaiJiangjie <bugatti_it@163.com>\n"
"Language-Team: Language locale/zh\n"
"Language-Team: Language locale/zh\n"
...
@@ -16,11 +16,11 @@ msgstr ""
...
@@ -16,11 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n"
#: coco/app.py:1
3
5
#: coco/app.py:1
4
5
msgid "Connect idle more than {} minutes, disconnect"
msgid "Connect idle more than {} minutes, disconnect"
msgstr "空闲时间超过 {} 分钟,断开连接"
msgstr "空闲时间超过 {} 分钟,断开连接"
#: coco/interactive.py:8
0
#: coco/interactive.py:8
4
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"\n"
"\n"
...
@@ -30,7 +30,7 @@ msgstr ""
...
@@ -30,7 +30,7 @@ msgstr ""
"\n"
"\n"
"{T}{T}{title} {user}, 欢迎使用Jumpserver开源跳板机系统 {end}{R}{R}"
"{T}{T}{title} {user}, 欢迎使用Jumpserver开源跳板机系统 {end}{R}{R}"
#: coco/interactive.py:8
2
#: coco/interactive.py:8
6
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}1) Enter {green}ID{end} directly login or enter {green}part IP, Hostname, "
"{T}1) Enter {green}ID{end} directly login or enter {green}part IP, Hostname, "
...
@@ -39,7 +39,7 @@ msgstr ""
...
@@ -39,7 +39,7 @@ msgstr ""
"{T}1) 输入 {green}ID{end} 直接登录 或 输入{green}部分 IP,主机名,备注{end} 进"
"{T}1) 输入 {green}ID{end} 直接登录 或 输入{green}部分 IP,主机名,备注{end} 进"
"行搜索登录(如果唯一).{R}"
"行搜索登录(如果唯一).{R}"
#: coco/interactive.py:8
3
#: coco/interactive.py:8
7
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}2) Enter {green}/{end} + {green}IP, Hostname{end} or {green}Comment {end} "
"{T}2) Enter {green}/{end} + {green}IP, Hostname{end} or {green}Comment {end} "
...
@@ -48,127 +48,120 @@ msgstr ""
...
@@ -48,127 +48,120 @@ msgstr ""
"{T}2) 输入 {green}/{end} + {green}IP, 主机名{end} or {green}备注 {end}搜索. "
"{T}2) 输入 {green}/{end} + {green}IP, 主机名{end} or {green}备注 {end}搜索. "
"如: /ip{R}"
"如: /ip{R}"
#: coco/interactive.py:8
4
#: coco/interactive.py:8
8
#, python-brace-format
#, python-brace-format
msgid "{T}3) Enter {green}p{end} to display the host you have permission.{R}"
msgid "{T}3) Enter {green}p{end} to display the host you have permission.{R}"
msgstr "{T}3) 输入 {green}p{end} 显示您有权限的主机.{R}"
msgstr "{T}3) 输入 {green}p{end} 显示您有权限的主机.{R}"
#: coco/interactive.py:8
5
#: coco/interactive.py:8
9
#, python-brace-format
#, python-brace-format
msgid ""
msgid ""
"{T}4) Enter {green}g{end} to display the node that you have permission.{R}"
"{T}4) Enter {green}g{end} to display the node that you have permission.{R}"
msgstr "{T}4) 输入 {green}g{end} 显示您有权限的节点.{R}"
msgstr "{T}4) 输入 {green}g{end} 显示您有权限的节点.{R}"
#: coco/interactive.py:86
#: coco/interactive.py:90
#, python-brace-format
msgid ""
msgid ""
"{T}5) Enter {green}g{end} + {green}NodeID{end} to display the host under the "
"{T}5) Enter {green}g{end} + {green}NodeID{end} to display the host under the "
"node, such as g1.{R}"
"node, such as g1.{R}"
msgstr "{T}5) 输入 {green}g{end} + {green}节点ID{end} 显示节点下主机. 如: g1{R}"
msgstr ""
"{T}5) 输入 {green}g{end} + {green}节点ID{end} 显示节点下主机. 如: g1{R}"
#: coco/interactive.py:
87
#: coco/interactive.py:
91
#, python-brace-format
#, python-brace-format
msgid "{T}6) Enter {green}s{end} Chinese-english switch.{R}"
msgid "{T}6) Enter {green}s{end} Chinese-english switch.{R}"
msgstr "{T}6) 输入 {green}s{end} 中/英文切换.{R}"
msgstr "{T}6) 输入 {green}s{end} 中/英文切换.{R}"
#: coco/interactive.py:
88
#: coco/interactive.py:
92
#, python-brace-format
#, python-brace-format
msgid "{T}7) Enter {green}h{end} help.{R}"
msgid "{T}7) Enter {green}h{end} help.{R}"
msgstr "{T}7) 输入 {green}h{end} 帮助.{R}"
msgstr "{T}7) 输入 {green}h{end} 帮助.{R}"
#: coco/interactive.py:
89
#: coco/interactive.py:
93
#, python-brace-format
#, python-brace-format
msgid "{T}8) Enter {green}r{end} to refresh your assets and nodes.{R}"
msgid "{T}8) Enter {green}r{end} to refresh your assets and nodes.{R}"
msgstr "{T}0) 输入 {green}r{end} 刷新最新的机器和节点信息.{R}"
msgstr "{T}0) 输入 {green}r{end} 刷新最新的机器和节点信息.{R}"
#: coco/interactive.py:9
0
#: coco/interactive.py:9
4
#, python-brace-format
#, python-brace-format
msgid "{T}0) Enter {green}q{end} exit.{R}"
msgid "{T}0) Enter {green}q{end} exit.{R}"
msgstr "{T}0) 输入 {green}q{end} 退出.{R}"
msgstr "{T}0) 输入 {green}q{end} 退出.{R}"
#: coco/interactive.py:159
#: coco/interactive.py:155
msgid "No"
msgid "Terminal does not support login rdp, please use web terminal to access"
msgstr "无"
msgstr "终端不支持登录windows, 请使用web terminal访问"
#: coco/interactive.py:166
msgid "Name"
msgstr "名称"
#: coco/interactive.py:
166
#: coco/interactive.py:
212
msgid "Assets"
msgid "
No
Assets"
msgstr "资产"
msgstr "
没有
资产"
#: coco/interactive.py:
172
#: coco/interactive.py:
275
msgid "T
otal: {}
"
msgid "T
ips: Enter the asset ID and log directly into the asset.
"
msgstr "
总共: {}
"
msgstr "
提示: 输入资产ID,直接登录资产.
"
#: coco/interactive.py:
177
#: coco/interactive.py:
276
msgid "
Node: [ ID.Name(Asset amount) ]
"
msgid "
Page up: P/p
"
msgstr "
节点: [ ID.名称(资产数量) ]
"
msgstr "
上一页: P/p
"
#: coco/interactive.py:
179
#: coco/interactive.py:
277
msgid "
Tips: Enter g+NodeID to display the host under the node, such as g1
"
msgid "
Page down: Enter|N/n
"
msgstr "
提示: 输入 g+节点ID 显示节点下主机. 如: g1
"
msgstr "
下一页: Enter|N/n
"
#: coco/interactive.py:
186
#: coco/interactive.py:
278
msgid "
There is no matched node, please re-enter
"
msgid "
BACK: b/q
"
msgstr "
没有匹配分组,请重新输入
"
msgstr "
返回: B/b
"
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "ID"
msgid "ID"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "Hostname"
msgid "Hostname"
msgstr "主机名"
msgstr "主机名"
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "IP"
msgid "IP"
msgstr ""
msgstr ""
#: coco/interactive.py:
197
#: coco/interactive.py:
299
msgid "LoginAs"
msgid "LoginAs"
msgstr "登录用户"
msgstr "登录用户"
#: coco/interactive.py:
211
#: coco/interactive.py:
313
msgid "Comment"
msgid "Comment"
msgstr "备注"
msgstr "备注"
#: coco/interactive.py:
221
#: coco/interactive.py:
322
msgid "Page: {}, Count: {}, Total Page: {}, Total Count: {}"
msgid "Page: {}, Count: {}, Total Page: {}, Total Count: {}"
msgstr "页码: {}, 数量: {}, 总页数: {}, 总数量: {}"
msgstr "页码: {}, 数量: {}, 总页数: {}, 总数量: {}"
#: coco/interactive.py:296
#: coco/interactive.py:394
msgid "Select a login:: "
msgid "No Nodes"
msgstr "选择一个登录:"
msgstr "没有节点"
#: coco/interactive.py:319
msgid ""
"Terminal does not support login Windows, please use web terminal to access"
msgstr "终端不支持登录windows, 请使用web terminal访问"
#: coco/interactive.py:
401
#: coco/interactive.py:
398
msgid "
Tips: Enter the asset ID and log directly into the asset.
"
msgid "
Node: [ ID.Name(Asset amount) ]
"
msgstr "
提示: 输入资产ID,直接登录资产.
"
msgstr "
节点: [ ID.名称(资产数量) ]
"
#: coco/interactive.py:40
2
#: coco/interactive.py:40
0
msgid "
Page up: P/p
"
msgid "
Tips: Enter g+NodeID to display the host under the node, such as g1
"
msgstr "
上一页: P/p
"
msgstr "
提示: 输入 g+节点ID 显示节点下主机. 如: g1
"
#: coco/interactive.py:40
3
#: coco/interactive.py:40
8
msgid "
Page down: Enter|N/n
"
msgid "
There is no matched node, please re-enter
"
msgstr "
下一页: Enter|N/n
"
msgstr "
没有匹配分组,请重新输入
"
#: coco/interactive.py:4
04
#: coco/interactive.py:4
38
msgid "
BACK: B/b
"
msgid "
Select a login::
"
msgstr "
返回: B/b
"
msgstr "
选择一个登录:
"
#: coco/interactive.py:4
25
#: coco/interactive.py:4
61
msgid "No system user"
msgid "No system user"
msgstr "没有系统用户"
msgstr "没有系统用户"
#: coco/models.py:247
#: coco/models.py:247
msgid "Command `{}` is forbidden ........"
msgid "Command `{}` is forbidden ........"
msgstr ""
msgstr "
命令 `{}` 是被禁止的 ...
"
#: coco/proxy.py:89
#: coco/proxy.py:89
msgid "No permission"
msgid "No permission"
...
@@ -182,5 +175,14 @@ msgstr "开始连接到 {}@{} {:.1f}"
...
@@ -182,5 +175,14 @@ msgstr "开始连接到 {}@{} {:.1f}"
msgid "Terminated by administrator"
msgid "Terminated by administrator"
msgstr "被管理员中断"
msgstr "被管理员中断"
#~ msgid "No"
#~ msgstr "无"
#~ msgid "Name"
#~ msgstr "名称"
#~ msgid "Total: {}"
#~ msgstr "总共: {}"
#~ msgid "Total: {} Match: {}"
#~ msgid "Total: {} Match: {}"
#~ msgstr "总共: {} 匹配: {}"
#~ msgstr "总共: {} 匹配: {}"
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