From 5c286811c958296e682d083bcd55613271bc4682 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Sun, 29 May 2022 03:46:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=BF=9C=E7=A8=8B=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=97=B6=E5=8F=AF=E4=BB=A5=E4=B8=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=AF=86=E7=A0=81=EF=BC=8C=E8=AE=A9=E7=94=A8=E6=88=B7=E5=9C=A8?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E8=BF=9C=E7=A8=8B=E8=BF=9E=E6=8E=A5=E6=97=B6?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E8=BE=93=E5=85=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/cfg/tp-assist.macos.json | 6 +- client/cfg/tp-assist.windows.json | 12 +- .../apple-scripts/scripts/iterm2.applescript | 24 +- .../scripts/terminal.applescript | 57 +-- .../src/AppDelegate-C-Interface.h | 2 +- client/tp_assist_macos/src/AppDelegate.mm | 9 +- .../src/apple-scpt/iterm2.scpt | Bin 2098 -> 2396 bytes .../src/apple-scpt/terminal.scpt | Bin 2650 -> 2842 bytes .../tp_assist_macos/src/csrc/ts_ws_client.cpp | 423 ++++++++++-------- server/tp_core/core/ts_http_rpc.cpp | 2 +- server/tp_core/core/ts_session.cpp | 12 +- server/tp_core/core/ts_web_rpc.cpp | 18 +- server/tp_core/protocol/ssh/ssh_session.cpp | 17 +- server/tp_core/protocol/ssh/ssh_session.h | 2 +- server/www/teleport/static/css/dashboard.css | 2 +- server/www/teleport/static/css/login.css | 2 +- server/www/teleport/static/css/single.css | 2 +- server/www/teleport/static/css/style.css | 2 +- .../www/teleport/static/js/asset/host-list.js | 194 ++++---- .../www/teleport/static/js/ops/remote-list.js | 272 +++++++---- .../www/teleport/static/js/system/config.js | 6 +- .../teleport/static/js/teleport/controls.js | 2 +- server/www/teleport/static/js/tp-assist.js | 3 +- server/www/teleport/static/less/_base.less | 2 +- .../static/less/_overwrite_bootstrap.less | 9 +- .../teleport/static/less/_remote_action.less | 114 +++-- server/www/teleport/static/less/style.less | 6 +- server/www/teleport/view/asset/host-list.html | 26 +- server/www/teleport/view/user/user-list.html | 14 +- .../webroot/app/base/assist_bridge.py | 2 +- .../webroot/app/controller/__init__.py | 4 + .../webroot/app/controller/account.py | 62 ++- .../teleport/webroot/app/controller/ops.py | 6 +- .../www/teleport/webroot/app/controller/ws.py | 4 +- .../www/teleport/webroot/app/model/account.py | 26 ++ 35 files changed, 827 insertions(+), 517 deletions(-) diff --git a/client/cfg/tp-assist.macos.json b/client/cfg/tp-assist.macos.json index 049abc2..46993ec 100644 --- a/client/cfg/tp-assist.macos.json +++ b/client/cfg/tp-assist.macos.json @@ -21,7 +21,7 @@ "name": "securecrt", "display": "SecureCRT", "app": "/Applications/SecureCRT.app/Contents/MacOS/SecureCRT", - "cmdline": "/T /N \"TP#ssh://{real_ip}\" /SSH2 /L {user_name} /PASSWORD **** {host_ip}:{host_port}", + "cmdline": "/T /N \"TP#ssh://{real_ip}\" /SSH2 /L {user_name} {password:/PASSWORD ****} {host_ip}:{host_port}", "desc": [] }, { @@ -41,14 +41,14 @@ "name": "securefx", "display": "SecureFX", "app": "/Applications/SecureFX.app/Contents/MacOS/SecureFX", - "cmdline": "sftp://{user_name}:****@{host_ip}:{host_port}", + "cmdline": "sftp://{user_name}{password::****}@{host_ip}:{host_port}", "desc": [] }, { "name": "filezilla", "display": "FileZilla", "app": "/Applications/FileZilla.app/Contents/MacOS/filezilla", - "cmdline": "sftp://{user_name}:****@{host_ip}:{host_port}", + "cmdline": "{interactive:-l ask} sftp://{user_name}{password::****}@{host_ip}:{host_port}", "desc": [] }, { diff --git a/client/cfg/tp-assist.windows.json b/client/cfg/tp-assist.windows.json index 0a00f90..b5372f9 100755 --- a/client/cfg/tp-assist.windows.json +++ b/client/cfg/tp-assist.windows.json @@ -6,28 +6,28 @@ "name": "putty", "display": "PuTTY(内置)", "app": "{assist_tools_path}\\putty\\putty.exe", - "cmdline": "-ssh -pw **** -P {host_port} -l {user_name} {host_ip}", + "cmdline": "-ssh {password:-pw ****} -P {host_port} -l {user_name} {host_ip}", "desc": [] }, { "name": "crt", "display": "SecureCRT", "app": "", - "cmdline": "/T /N \"TP#ssh://{real_ip}\" /SSH2 /P {host_port} /PASSWORD **** {user_name}@{host_ip}", + "cmdline": "/T /N \"TP#ssh://{real_ip}\" /SSH2 /P {host_port} {password:/PASSWORD ****} {user_name}@{host_ip}", "desc": [] }, { "name": "xshell", "display": "Xshell", "app": "", - "cmdline": "-newtab \"TP#ssh://{real_ip}\" -url ssh://{user_name}:****@{host_ip}:{host_port}", + "cmdline": "-newtab \"TP#ssh://{real_ip}\" -url ssh://{user_name}{password::****}@{host_ip}:{host_port}", "desc": [] }, { "name": "mobaxterm", "display": "MobaXterm", "app": "", - "cmdline": "-newtab \"sshpass -p**** ssh {user_name}@{host_ip} -p {host_port}\"", + "cmdline": "-newtab \"sshpass {password:-p****} ssh {user_name}@{host_ip} -p {host_port}\"", "desc": [] }, { @@ -45,7 +45,7 @@ "name": "winscp", "display": "WinSCP(内置)", "app": "{assist_tools_path}\\winscp\\winscp.exe", - "cmdline": "/sessionname=\"TP#{real_ip}\" {user_name}:****@{host_ip}:{host_port}", + "cmdline": "/sessionname=\"TP#{real_ip}\" {user_name}{password::****}@{host_ip}:{host_port}", "desc": [] }, { @@ -100,4 +100,4 @@ ], "selected": "mstsc" } -} \ No newline at end of file +} diff --git a/client/tp_assist_macos/apple-scripts/scripts/iterm2.applescript b/client/tp_assist_macos/apple-scripts/scripts/iterm2.applescript index a840cae..ad4bc16 100644 --- a/client/tp_assist_macos/apple-scripts/scripts/iterm2.applescript +++ b/client/tp_assist_macos/apple-scripts/scripts/iterm2.applescript @@ -1,11 +1,11 @@ -on scriptRun(argsCmd, argsProfile, argsTitle) +on scriptRun(argsCmd, argsProfile, argsTitle, argsInteractiveMode) set theCmd to (argsCmd) set theProfile to (argsProfile) set theTitle to (argsTitle) - CommandRun(theCmd, theProfile, theTitle) + CommandRun(theCmd, theProfile, theTitle, argsInteractiveMode) end scriptRun -on CommandRun(theCmd, theProfile, theTitle) +on CommandRun(theCmd, theProfile, theTitle, theInteractiveMode) try tell application "iTerm" if it is not running then @@ -29,8 +29,10 @@ on CommandRun(theCmd, theProfile, theTitle) set name to theTitle set profile to theProfile write text theCmd - delay 0.5 - write text "" + if theInteractiveMode = "no" then + delay 0.5 + write text "" + end if end tell end tell end tell @@ -50,8 +52,10 @@ on CommandRun(theCmd, theProfile, theTitle) delay 0.5 set name to theTitle write text theCmd - delay 0.5 - write text "" + if theInteractiveMode = "no" then + delay 0.5 + write text "" + end if end tell end tell end tell @@ -70,8 +74,10 @@ on CommandRun(theCmd, theProfile, theTitle) delay 0.5 set name to theTitle write text theCmd - delay 0.5 - write text "" + if theInteractiveMode = "no" then + delay 0.5 + write text "" + end if end tell end tell end tell diff --git a/client/tp_assist_macos/apple-scripts/scripts/terminal.applescript b/client/tp_assist_macos/apple-scripts/scripts/terminal.applescript index 33506c7..2062445 100644 --- a/client/tp_assist_macos/apple-scripts/scripts/terminal.applescript +++ b/client/tp_assist_macos/apple-scripts/scripts/terminal.applescript @@ -1,26 +1,29 @@ -on scriptRun(argsCmd, argsProfile, argsTitle) +on scriptRun(argsCmd, argsProfile, argsTitle, argsInteractiveMode) set theCmd to (argsCmd) set theProfile to (argsProfile) set theTitle to (argsTitle) - CommandRun(theCmd, theProfile, theTitle) + CommandRun(theCmd, theProfile, theTitle, argsInteractiveMode) end scriptRun -on CommandRun(theCmd, theProfile, theTitle) +on CommandRun(theCmd, theProfile, theTitle, theInteractiveMode) try tell application "Terminal" if it is not running then --if this is the first time Terminal is running you have specify window 1 --if you dont do this you will get two windows and the title wont be set - activate + activate delay 3.0 set newTerm to do script theCmd in window 1 - set newTerm's current settings to settings set theProfile + + set newTerm's current settings to settings set theProfile set custom title of front window to theTitle - delay 1.0 - reopen - activate - tell application "System Events" to key code 36 + if theInteractiveMode = "no" + delay 1.0 + reopen + activate + tell application "System Events" to key code 36 + end if else --Terminal is running get the window count set windowCount to (count every window) @@ -31,26 +34,26 @@ on CommandRun(theCmd, theProfile, theTitle) activate do script theCmd in window 1 - + set current settings of selected tab of front window to settings set theProfile set title displays custom title of front window to true set custom title of selected tab of front window to theTitle - delay 1.0 - reopen - activate - tell application "System Events" to key code 36 - + if theInteractiveMode = "no" + delay 1.0 + reopen + activate + tell application "System Events" to key code 36 + end if else --Terminal is running and we have a window run in a new tab + delay 1.0 reopen activate tell application "System Events" - tell process "Terminal" - delay 0.5 - keystroke "t" using {command down} - end tell + -- Command+T = new tab. + key code 17 using {command down} end tell reopen @@ -61,16 +64,14 @@ on CommandRun(theCmd, theProfile, theTitle) set title displays custom title of front window to true set custom title of selected tab of front window to theTitle - delay 1.0 - reopen - activate - tell application "System Events" to key code 36 - + if theInteractiveMode = "no" + delay 1.0 + reopen + activate + tell application "System Events" to key code 36 + end if end if - - --set current settings of selected tab of front window to settings set theProfile - --set title displays custom title of front window to true - --set custom title of selected tab of front window to theTitle + end if end tell diff --git a/client/tp_assist_macos/src/AppDelegate-C-Interface.h b/client/tp_assist_macos/src/AppDelegate-C-Interface.h index b35c055..e1a9028 100644 --- a/client/tp_assist_macos/src/AppDelegate-C-Interface.h +++ b/client/tp_assist_macos/src/AppDelegate-C-Interface.h @@ -12,7 +12,7 @@ extern void* g_app; -int AppDelegate_start_ssh_client (void *_self, const char* cmd_line, const char* term_type, const char* term_theme, const char* term_title); +int AppDelegate_start_ssh_client (void *_self, const char* cmd_line, const char* term_type, const char* term_theme, const char* term_title, const char* interactive_mode); int AppDelegate_select_app (void *_self); // for cpp global object initialize. diff --git a/client/tp_assist_macos/src/AppDelegate.mm b/client/tp_assist_macos/src/AppDelegate.mm index 6ae9fdd..06d88a1 100644 --- a/client/tp_assist_macos/src/AppDelegate.mm +++ b/client/tp_assist_macos/src/AppDelegate.mm @@ -29,13 +29,14 @@ @implementation AppDelegate -int AppDelegate_start_ssh_client (void *_self, const char* cmd_line, const char* term_type, const char* term_theme, const char* term_title) { +int AppDelegate_start_ssh_client (void *_self, const char* cmd_line, const char* term_type, const char* term_theme, const char* term_title, const char* interactive_mode) { NSString* cmdLine = [NSString stringWithUTF8String:cmd_line]; NSString* termType = [NSString stringWithUTF8String:term_type]; NSString* termTheme = [NSString stringWithUTF8String:term_theme]; NSString* termTitle = [NSString stringWithUTF8String:term_title]; + NSString* interactiveMode = [NSString stringWithUTF8String:interactive_mode]; - return [(__bridge id)_self start_ssh_client:cmdLine termType:termType termTheme:termTheme termTitle:termTitle]; + return [(__bridge id)_self start_ssh_client:cmdLine termType:termType termTheme:termTheme termTitle:termTitle interactiveMode:interactiveMode]; } int AppDelegate_select_app (void *_self) { @@ -118,14 +119,14 @@ int AppDelegate_select_app (void *_self) { } } -- (int) start_ssh_client:(NSString*)cmd_line termType:(NSString*)term_type termTheme:(NSString*)term_theme termTitle:(NSString*)term_title { +- (int) start_ssh_client:(NSString*)cmd_line termType:(NSString*)term_type termTheme:(NSString*)term_theme termTitle:(NSString*)term_title interactiveMode:(NSString*)interactive_mode { NSString *term = [[NSBundle mainBundle] pathForResource:term_type ofType:@"scpt"]; if(!term) return 1; NSString *handlerName = @"scriptRun"; - NSArray *passParameters = @[cmd_line, term_theme, term_title]; + NSArray *passParameters = @[cmd_line, term_theme, term_title, interactive_mode]; [self runScript:term handler:handlerName parameters:passParameters]; return 0; diff --git a/client/tp_assist_macos/src/apple-scpt/iterm2.scpt b/client/tp_assist_macos/src/apple-scpt/iterm2.scpt index dac4f8e2448df60bc920df0ed7e1702940d5ba8b..3fea914f574629bef2ef79f0dd64896a4d296c4c 100644 GIT binary patch literal 2396 zcmb_eTTdHT5dIbnm|ZYl<8UV-l`2&(0`pL*LX|4&5Qzu65f}lFi*dk-cWvz&NS~Uw zzV;`CB<))tBDMVqNpo$k&7GJKa^sd;(}bj*&hcU}A$Aq1Yk8S7XZHKPnKL_hw{DLP zboIA%v~>i<*8{*+MMVEVLXkuSNNmHyOH_GL1Q-2{Vz^Kuu>mjJMf8^5DD)OJL6qAO zE0#=I6K2-zn=lo6gSsH(NWw65b5v}~A;;!j4}+C?X_a2nEBXtiD5IAOt>#6O=r!x1 zS15APpKurR&EU8I2Epr$mR*H z&@wI2A}!Ekg`VWmw(=j^mJ4WG`XFrzEy5c_X=*$w$|L?}sPt z#{h+{LE(2Kd(cQMPSS5s=>&YJ zh9BEdgIYRXg$l`Z^ZfXqubyyUFOMSV@t7^3B{7AhlHRV6)}Np1t6e;}_$rTuqn6R8 zCzJVO3+)Ju+uE4G-*!6<3tBJ z=6eX+jY_z`OgoZgy27FMH#U!{xV{m35T-F=$#j_^BU3Skyu@*lgcXg%6LvOEU?fKN zwMcXk{N7&>BF=MMPs%dPsi|acT!1fy`)9rDJmMe8G1RH3V`~=|U@s>>fjCk!onzjR zHO0JV*&2-4Y@HG5nYtm$?z29;U z6bN?@g;ko9zV%B++9yQ=v#n978Q-OS_$aWi0!7*!-(8v?m4W&F?QEA0!ac;3+dV#@ zan!IM@-(~42T?J^lfbE^kW8W*7j6E=ifj4Q>k)w IX6C1V0p*Oug#Z8m delta 952 zcmZuvOHb5b6g}+>GtfermJYAU1T|qnofz1(4*;Lfc9lNfmRH6DB2LKjntii(ny_5$6dz-!ja_>e8Qo%CVGVf zOA-CTz7-ICE`j!B+Ora(uSBJv@OGE=nTfIwW=~naY4pB+6S)p#DoBCbL%Xy?+w>J_ zkZ4P$UGDN<-2oKZhUla(kRANsd1ZUvP1>M!nKqM=8+K%19eOcR<4?o!#&~l$iK=WQ zvMFzrh7?+(Ra&8CTC$eK%AmU#j!3KlkZB1rZ`T%Wt#9O3R!i_9ofc^U88lCGG)pry zO;a?<^GwhjQ1BPmcIyn|PTm(gv6QI8PX(Tuo66YNtO?O>mA zM%A@3Mq_qjODH1ID5I+IbJmSm{jO_S*($Q_jA7>Q$2;028nS-7{GA>c<$yt! zmPX?>3h%|DTot)|5WFH6c`EY$?NE4kewD8x-`44N;Zyk&DkwuGUnbu-aYdp5gy~v4gwmAHk#7mG<%H0KzZ`# zF^;;M)8R4Cc;hGp)vklV;A4E!(X^_e#^4^&H1@eas6#PA&=M@ls)qK6&o zWb9>KAemNpk=9vmUXIE>j|x^Jm~`T_3LR2{1JkOZB)JfB?D8!ClJEa)b1!T?=N5V1 W-a>ZCHy>n%Vzp5SNdL9G{PquooG|ME diff --git a/client/tp_assist_macos/src/apple-scpt/terminal.scpt b/client/tp_assist_macos/src/apple-scpt/terminal.scpt index 98d335e3848e901e1366dac43c6b5d147fec5612..fa0e0fcabd2e3b69f8b765bc18bd66f81ce174bf 100644 GIT binary patch literal 2842 zcmcIm*>4kP5dW=hu(Rv<%0WttluA^pT!_tURH>w?k*YS`h$JmMF6#xB*lTNd<1}wP z^_k~BaX+;WNNxWB$_?c%Hz8>tge#n-5NN0Kd2?88oFW@mmg-*4yh8qLY} zv~@MFYFU*Q-w1#}l!*R<1fN6%NGv15Dxxv?5THNdM*xc?77%0EN3ZFXLa))7MvbG} zX3@3#tSNDApQX?%G^HWyg?wJKvSLwg_hep;aIj#ECg>%-pg*t}L3*yxMAc{#y<|M} z0=@wKj*y>kfe1nzg`Uw%5fnj$VH%FewHw6J|m;l%58eOF;beS&EMTM@!;h{wzuxK{flXgSjnp`{Ob zSV@aI+S=8w>Zv~dgy$PyVbKQD(sC_Yu~^-`>WYX_x#;O~v))%}MNN-u=1kW#7@`j= zQ>|SCj%(yw+ls}UscWuTu$L8^cYLMvy0&dWPbwzAJQ2swmW zgjP>(q)g}8)fsSj^5wJ{*R8Pf8*G`*amZetw=$h&NoQ)wbcUbM3$~FhIC|w1y8E>& z(`oi|i}psDP6?mT=cW;1xj!|;>z?`Aq7Ym_Z+}o+KE}1$r(1-Li0Y5i4 z*qS}iTIn!J&I(W|Zv1k@nOp;K;4%^OXhsGlmMqqtImozjl8lp?Qk9ufvy?wgNI#vx za+!|vrWS48>D3F_sZA9dp5#lWW0Pdk`4kowj|#EL)uUw!SxliLLdxoHgsWf*HN?^2 zQOHk+5tr!@uW!^eCh9?i6r&^Se8xv)gkL81Zj7VR^H%7<%s}+c$bA;_jnk;d%x@|9;;QohsP5LK4d-CvmXA< z>!omVbS0~CK6m$Q;YV_n&NDg68ANOii4`J|;VE@fIfcEPSL2s&KAEwtGLr|C!NoN+ zXlT^1q_@Py#d^xPr_ldDKuz-jq;{&EJ!gg|Iw|T I7##fmZ;LxcbpQYW delta 1113 zcmbu7$xjne9LK+Jy3dquv~|G|jmx1{idSRe!C>M-rXdiQcp2M*NK2Zwq6ZW7;>iQ% z84n(exSZ63QU3)L7u>)F5kUl51aXNbUVi?jX!Pd6nat$--u&M8`}w_jXQPARuAT~; z4{q2%U+D{dJ~hy|L80$J08TjR6V1~{nxk3zpwTCUYT+^qEyYwWy&$&a(i+X5ny(fg zWk6JkIXS9C#H{owy7(aDN|jU4j7BrETdCR*q;H6vue)J%*WENO)ZH>-7cX7Ttpof% zIN%DVYy@v-XO=vXDtMrvqfR84j*l8S^jbF^GS-kIPjNWSWt{gdLMb^AUxEAix zflR5jl+Bb?qoou!<&Heu(I}138ycq9G$e#=NnLO&$>j!vT$`_hd>bF#?SW+2~75D50|JKd(C|@cwFRn2& z9i@Vq&$l1SW{Hk*XcsK)hhJR%4ePkE&9zTBA7iyjkK`4%E*{EWx8B)TPH5+Z2bM~w zSlwrpFQke--U4wQ;UL1S8j(Q(Ikci3CKx2hAR`MPK7_2wNDvVyV2gWf(QKOB++Db} zOnthzgAbQVz07M_x8(~(i*b_$Y+b3+k&;Gt{`@P2cbt3WZM=?X5K-23XyDu6XCqdq z)FWFwdgp}b2#fScNbHS`#xp|4&e%aO6l09vcH{hbY@#iZ^}@yHGd9_sxHuKxYFw}; zr&-LDi>w7+V`15B2(CFE`8Nz|6wqa iMzYCB?m}QUmZHkUvde2YRyUG const jreader(jcrb.newCharReader()); const char* str_json_begin = param.c_str(); - + Json::Value js_root; ex_astr err; if (!jreader->parse(str_json_begin, str_json_begin + param.length(), &js_root, &err)) @@ -104,7 +104,7 @@ void TsWsClient::url_scheme_handler(const std::string& url) EXLOGE("[ws] invalid param, need json object: %s\n", param.c_str()); return; } - + if (method == "register") { _process_register(param, js_root); @@ -127,18 +127,18 @@ void TsWsClient::url_scheme_handler(const std::string& url) void TsWsClient::_process_register(const std::string& param, Json::Value& js_root) { // {"ws_url":"ws://127.0.0.1:7190/ws/assist/","assist_id":1234,"session_id":"tp_5678"} - + // check param if (!js_root["ws_url"].isString() || !js_root["assist_id"].isNumeric() || !js_root["session_id"].isString()) { EXLOGE("[ws] invalid param: %s\n", param.c_str()); return; } - + std::string ws_url = js_root["ws_url"].asCString(); uint32_t assist_id = js_root["assist_id"].asUInt(); std::string session_id = js_root["session_id"].asCString(); - + std::string protocol; protocol.assign(ws_url, 0, 5); if (protocol == "ws://" || protocol == "wss:/") @@ -155,7 +155,7 @@ void TsWsClient::_process_register(const std::string& param, Json::Value& js_roo void TsWsClient::_process_run(const std::string& param, Json::Value& js_root) { // wrapper for _rpc_func_run_client(). - + Json::Value js_param; js_param["method"] = "run"; js_param["param"] = js_root; @@ -168,7 +168,7 @@ void TsWsClient::_process_run(const std::string& param, Json::Value& js_root) void TsWsClient::_process_replay_rdp(const std::string& param, Json::Value& js_root) { // wrapper for _rpc_func_replay_rdp(). - + Json::Value js_param; js_param["method"] = "replay_rdp"; js_param["param"] = js_root; @@ -181,9 +181,9 @@ void TsWsClient::_process_replay_rdp(const std::string& param, Json::Value& js_r // ============================================================================ TsWsClient::TsWsClient() : - ExThreadBase("ws-client-thread"), - m_nc(NULL), - m_assist_id(0) +ExThreadBase("ws-client-thread"), +m_nc(NULL), +m_assist_id(0) { mg_mgr_init(&m_mg_mgr, NULL); } @@ -199,7 +199,7 @@ void TsWsClient::_thread_loop(void) { mg_mgr_poll(&m_mg_mgr, 500); } - + EXLOGV("[ws] main loop end.\n"); } @@ -207,23 +207,23 @@ void TsWsClient::_register(const std::string& ws_url, uint32_t assist_id, const { if (m_assist_id == 0) m_assist_id = assist_id; - + ex_wstr w_ver(TP_ASSIST_VER); ex_astr a_ver; ex_wstr2astr(w_ver, a_ver); - + // char msg[256] = {0}; ex_strformat( - msg, 256, "{\"type\":0,\"method\":\"register\",\"param\":{\"client\":\"assist\",\"sid\":\"%s\",\"request_assist_id\":%u,\"assist_id\":%u,\"assist_ver\":\"%s\"}}", - session_id.c_str(), assist_id, m_assist_id, a_ver.c_str()); - + msg, 256, "{\"type\":0,\"method\":\"register\",\"param\":{\"client\":\"assist\",\"sid\":\"%s\",\"request_assist_id\":%u,\"assist_id\":%u,\"assist_ver\":\"%s\"}}", + session_id.c_str(), assist_id, m_assist_id, a_ver.c_str()); + if (!m_is_running) { // not start yet. std::string url = ws_url; url += msg; - + m_nc = mg_connect_ws(&m_mg_mgr, _mg_event_handler, url.c_str(), NULL, NULL); if (!m_nc) { @@ -231,12 +231,12 @@ void TsWsClient::_register(const std::string& ws_url, uint32_t assist_id, const return; } m_nc->user_data = this; - + start(); return; } - - + + EXLOGV("[ws] send: %s\n", msg); mg_send_websocket_frame(m_nc, WEBSOCKET_OP_TEXT, msg, strlen(msg)); } @@ -250,60 +250,60 @@ void TsWsClient::_mg_event_handler(struct mg_connection* nc, int ev, void* ev_da EXLOGE("[ERROR] invalid request.\n"); return; } - + switch (ev) { - case MG_EV_CONNECT: - { - int status = *((int*)ev_data); - if (status != 0) + case MG_EV_CONNECT: { - EXLOGE("[ERROR] -- connect to ws server failed: %d\n", status); + int status = *((int*)ev_data); + if (status != 0) + { + EXLOGE("[ERROR] -- connect to ws server failed: %d\n", status); + } + + break; } - - break; - } - - case MG_EV_WEBSOCKET_HANDSHAKE_DONE: - { - auto* hm = (struct http_message*)ev_data; - if (hm->resp_code == 101) + + case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { - EXLOGV("-- ws server connected\n"); + auto* hm = (struct http_message*)ev_data; + if (hm->resp_code == 101) + { + EXLOGV("-- ws server connected\n"); + } + else + { + EXLOGE("[ERROR] -- connect to ws server failed, HTTP code: %d\n", hm->resp_code); + } + break; } - else + + + case MG_EV_WEBSOCKET_FRAME: { - EXLOGE("[ERROR] -- connect to ws server failed, HTTP code: %d\n", hm->resp_code); + // on_message(). + auto* wm = (struct websocket_message*)ev_data; + // EXLOGV("%d: %s\n", wm->size, wm->data); + std::string message; + message.assign((const char*)wm->data, wm->size); + std::string buf; + _this->_on_message(message, buf); + + if (!buf.empty()) + { + mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, buf.c_str(), buf.length()); + } + + break; } - break; - } - - - case MG_EV_WEBSOCKET_FRAME: - { - // on_message(). - auto* wm = (struct websocket_message*)ev_data; - // EXLOGV("%d: %s\n", wm->size, wm->data); - std::string message; - message.assign((const char*)wm->data, wm->size); - std::string buf; - _this->_on_message(message, buf); - - if (!buf.empty()) + + + case MG_EV_CLOSE: { - mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, buf.c_str(), buf.length()); + EXLOGV("-- ws server disconnected\n"); + _this->m_need_stop = true; + break; } - - break; - } - - - case MG_EV_CLOSE: - { - EXLOGV("-- ws server disconnected\n"); - _this->m_need_stop = true; - break; - } } } @@ -328,7 +328,7 @@ void TsWsClient::_create_response(ex_astr& buf, const AssistMessage& msg_ret, in js_ret["code"] = err_code; js_ret["message"] = message; js_ret["data"] = data; - + Json::StreamWriterBuilder jwb; jwb["indentation"] = ""; // 压缩格式,没有换行和不必要的空白字符 std::unique_ptr js_writer(jwb.newStreamWriter()); @@ -349,15 +349,15 @@ void TsWsClient::_on_message(const std::string& message, std::string& buf) // "protocol_sub_type":200,"protocol_flag":4294967295 // } // } - + EXLOGV("on_message: %s\n", message.c_str()); AssistMessage msg_req; - + Json::CharReaderBuilder jrb; std::unique_ptr const js_reader(jrb.newCharReader()); const char* str_json_begin = message.c_str(); - + Json::Value js_root; ex_astr err; if (!js_reader->parse(str_json_begin, str_json_begin + message.length(), &js_root, &err)) @@ -370,40 +370,40 @@ void TsWsClient::_on_message(const std::string& message, std::string& buf) _create_response(buf, msg_req, TPE_PARAM); return; } - + if (js_root["type"].isNull() || !js_root["type"].isInt()) { _create_response(buf, msg_req, TPE_PARAM); return; } - + int cmd_type = js_root["type"].asInt(); if (!(cmd_type == MESSAGE_TYPE_REQUEST || cmd_type == MESSAGE_TYPE_RESPONSE)) { _create_response(buf, msg_req, TPE_PARAM); return; } - + // 收到的信息已经是“返回值”了,说明已经是一条命令的结束了,不用继续处理 // todo: 可能需要记录日志,或者展示结果。 if (cmd_type == MESSAGE_TYPE_RESPONSE) return; - + if (js_root["method"].isNull() || !js_root["method"].isString() || js_root["command_id"].isNull() || !js_root["command_id"].isInt()) { _create_response(buf, msg_req, TPE_PARAM); return; } - + msg_req.command_id = js_root["command_id"].asInt(); msg_req.method = js_root["method"].asString(); - + if (msg_req.command_id == 0 || msg_req.method.empty()) { _create_response(buf, msg_req, TPE_PARAM); return; } - + if (msg_req.method == "run") { _rpc_func_run_client(buf, msg_req, js_root); @@ -436,7 +436,7 @@ void TsWsClient::_rpc_func_get_config(ex_astr& buf, AssistMessage& msg_req, Json Json::Value& ret = g_cfg.get_root(); if(ret["os_type"].isNull()) ret["os_type"] = "macos"; - + _create_response(buf, msg_req, TPE_OK, "", ret); } @@ -448,12 +448,12 @@ void TsWsClient::_rpc_func_set_config(ex_astr& buf, AssistMessage& msg_req, Json return; } Json::Value& js_param = js_root["param"]; - + Json::StreamWriterBuilder jwb; std::unique_ptr js_writer(jwb.newStreamWriter()); ex_aoss os; js_writer->write(js_param, &os); - + if (!g_cfg.save(os.str())) _create_response(buf, msg_req, TPE_FAILED); else @@ -476,26 +476,26 @@ void TsWsClient::_rpc_func_replay_rdp(ex_astr& buf, AssistMessage& msg_req, Json // "sid":"tp_1622707094_1c8e4fd4006c6ad5" // } // } - + if (js_root["param"].isNull() || !js_root["param"].isObject()) { _create_response(buf, msg_req, TPE_PARAM); return; } Json::Value& js_param = js_root["param"]; - + // check param if (!js_param["rid"].isNumeric() || !js_param["web"].isString() || !js_param["sid"].isString() - ) + ) { _create_response(buf, msg_req, TPE_PARAM); return; } - + ex_astrs s_argv; - + ex_wstr w_exec_file = g_env.m_bundle_path; ex_path_join(w_exec_file, false, L"Contents", L"Resources", L"tp-player.app", L"Contents", L"MacOS", L"tp-player", nullptr); // ex_path_join(w_exec_file, false, L"tp-player.app", L"Contents", L"MacOS", L"tp-player", nullptr); @@ -503,16 +503,16 @@ void TsWsClient::_rpc_func_replay_rdp(ex_astr& buf, AssistMessage& msg_req, Json ex_wstr2astr(w_exec_file, exec_file); s_argv.push_back(exec_file); - - + + int rid = js_param["rid"].asInt(); ex_astr a_url_base = js_param["web"].asCString(); ex_astr a_sid = js_param["sid"].asCString(); - + char cmd_args[1024] = { 0 }; ex_strformat(cmd_args, 1023, "%s/%s/%d", a_url_base.c_str(), a_sid.c_str(), rid); s_argv.push_back(cmd_args); - + ex_wstr w_cmd_args; ex_astr2wstr(cmd_args, w_cmd_args); @@ -520,47 +520,47 @@ void TsWsClient::_rpc_func_replay_rdp(ex_astr& buf, AssistMessage& msg_req, Json ex_strformat(total_cmd, 1023, "%s %s", exec_file.c_str(), cmd_args); Json::Value js_ret; - + ex_astr utf8_path; //ex_wstr2astr(total_cmd, utf8_path, EX_CODEPAGE_UTF8); js_ret["cmdline"] = total_cmd; - + // EXLOGD(utf8_path.c_str()); - + // for macOS, Create Process should be fork()/exec()... int ret_code = TPE_OK; pid_t processId; if ((processId = fork()) == 0) { - + int i = 0; char** _argv = (char**)calloc(s_argv.size()+1, sizeof(char*)); if (!_argv) return; - + for (i = 0; i < s_argv.size(); ++i) { _argv[i] = ex_strdup(s_argv[i].c_str()); } _argv[i] = NULL; - + execv(exec_file.c_str(), _argv); - + for(i = 0; i < s_argv.size(); ++i) { if(_argv[i] != NULL) { free(_argv[i]); } } free(_argv); - + } else if (processId < 0) { ret_code = TPE_FAILED; } else { ret_code = TPE_OK; } - + // _create_json_ret(buf, root_ret); _create_response(buf, msg_req, ret_code, "", js_ret); - + } void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json::Value& js_root) @@ -573,71 +573,84 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json // "protocol_sub_type":200,"protocol_flag":4294967295 // } // } - + if (js_root["param"].isNull() || !js_root["param"].isObject()) { _create_response(buf, msg_req, TPE_PARAM); return; } Json::Value& js_param = js_root["param"]; - + // check param if (!js_param["teleport_ip"].isString() || !js_param["teleport_port"].isNumeric() || !js_param["remote_host_ip"].isString() || !js_param["session_id"].isString() || !js_param["protocol_type"].isNumeric() || !js_param["protocol_sub_type"].isNumeric() || !js_param["protocol_flag"].isNumeric() - ) + ) { _create_response(buf, msg_req, TPE_PARAM); return; } - + + const char* interactive_mode = "no"; + bool is_interactive_mode = false; + if(!js_param["is_interactive"].isNull()) { + if(!js_param["is_interactive"].isBool()) { + _create_response(buf, msg_req, TPE_PARAM); + return; + } + if(js_param["is_interactive"].asBool()) { + interactive_mode = "yes"; + is_interactive_mode = true; + } + } + int pro_type = js_param["protocol_type"].asUInt(); int pro_sub = js_param["protocol_sub_type"].asInt(); ex_u32 protocol_flag = js_param["protocol_flag"].asUInt(); - + ex_astr teleport_ip = js_param["teleport_ip"].asCString(); int teleport_port = js_param["teleport_port"].asUInt(); char _port[64] = {0}; ex_strformat(_port, 64, "%d", teleport_port); ex_astr str_teleport_port = _port; - + ex_astr real_host_ip = js_param["remote_host_ip"].asCString(); ex_astr real_host_name = js_param["remote_host_name"].asCString(); ex_astr sid = js_param["session_id"].asCString(); - - + + ex_astr s_exec; ex_astr s_arg; ex_astrs s_argv; - - + + if (pro_type == TP_PROTOCOL_TYPE_RDP) { //============================================== // RDP //============================================== - + if (g_cfg.rdp.application.length() == 0) { _create_response(buf, msg_req, TPE_NOT_EXISTS, "助手未配置本地RDP客户端,请检查您的助手设置。"); return; } - + if (!ex_is_file_exists(g_cfg.rdp.application.c_str())) { _create_response(buf, msg_req, TPE_NOT_EXISTS, "无法定位助手配置的RDP客户端,请检查您的助手设置。"); return; } - + bool flag_clipboard = ((protocol_flag & TP_FLAG_RDP_CLIPBOARD) == TP_FLAG_RDP_CLIPBOARD); bool flag_disk = ((protocol_flag & TP_FLAG_RDP_DISK) == TP_FLAG_RDP_DISK); bool flag_console = ((protocol_flag & TP_FLAG_RDP_CONSOLE) == TP_FLAG_RDP_CONSOLE); - + int rdp_w = 800; int rdp_h = 640; bool rdp_console = false; - + if (!js_param["rdp_width"].isNull()) { if (js_param["rdp_width"].isNumeric()) @@ -650,7 +663,7 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json return; } } - + if (!js_param["rdp_height"].isNull()) { if (js_param["rdp_height"].isNumeric()) @@ -663,7 +676,7 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json return; } } - + if (!js_param["rdp_console"].isNull()) { if (js_param["rdp_console"].isBool()) @@ -676,11 +689,11 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json return; } } - + if (!flag_console) rdp_console = false; - - + + size_t split_pos = sid.length() - 2; ex_astr real_sid = sid.substr(0, split_pos); ex_astr str_pwd_len = sid.substr(split_pos, sid.length()); @@ -692,9 +705,9 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json { szPwd[i] = '*'; } - + //ex_astr2wstr(real_sid, w_sid); - + //w_exe_path = _T("\""); //w_exe_path += g_cfg.rdp_app + _T("\" "); //w_exe_path += g_cfg.rdp_cmdline; @@ -704,10 +717,10 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json //s_exec = "/usr/local/Cellar/freerdp/1.0.2_1/bin/xfreerdp"; s_exec = g_cfg.rdp.application; s_arg = g_cfg.rdp.cmdline; - + sid = "02" + real_sid; // s_argv.push_back("/f"); - + s_argv.push_back("/sec:tls"); s_argv.push_back("-wallpaper"); s_argv.push_back("-themes"); @@ -715,20 +728,20 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json s_argv.push_back("/cert-ignore"); // Automatically accept certificate on first connect s_argv.push_back("/cert-tofu"); - + ex_astr _tmp_pass = "/p:PLACEHOLDER"; //_tmp_pass += szPwd; s_argv.push_back(_tmp_pass); - + //#if 0 //s_argv.push_back(s_exec.c_str()); - + { // ex_astr username = "02" + real_sid; // s_argv.push_back("/u:"); // s_argv.push_back(username.c_str()); - - + + if (rdp_w == 0 || rdp_h == 0) { s_argv.push_back("/f"); @@ -742,20 +755,20 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json char sz_width[64] = {0}; ex_strformat(sz_width, 63, "/w:%d", rdp_w); s_argv.push_back(sz_width); - + char sz_height[64] = {0}; ex_strformat(sz_height, 63, "/h:%d", rdp_h); s_argv.push_back(sz_height); } - + if (flag_console && rdp_console) s_argv.push_back("/admin"); - + // if(flag_clipboard) // s_argv.push_back("+clipboard"); // else // s_argv.push_back("-clipboard"); - + // if(flag_disk) // s_argv.push_back("+drives"); // else @@ -774,52 +787,52 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json //============================================== // SSH //============================================== - + if (pro_sub == TP_PROTOCOL_TYPE_SSH_SHELL) { if (g_cfg.ssh.name == "terminal" || g_cfg.ssh.name == "iterm2") { char szCmd[1024] = {0}; ex_strformat(szCmd, 1023, "ssh %s@%s -p %d -o \"StrictHostKeyChecking no\"", sid.c_str(), teleport_ip.c_str(), teleport_port); - + char szTitle[128] = {0}; ex_strformat(szTitle, 127, "TP#%s", real_host_ip.c_str()); - - int ret = AppDelegate_start_ssh_client(g_app, szCmd, g_cfg.ssh.name.c_str(), g_cfg.ssh.cmdline.c_str(), szTitle); + + int ret = AppDelegate_start_ssh_client(g_app, szCmd, g_cfg.ssh.name.c_str(), g_cfg.ssh.cmdline.c_str(), szTitle, interactive_mode); if (ret == 0) _create_response(buf, msg_req, TPE_OK); else _create_response(buf, msg_req, TPE_FAILED); return; } - + if (g_cfg.ssh.application.length() == 0) { _create_response(buf, msg_req, TPE_NOT_EXISTS); return; } - + s_exec = g_cfg.ssh.application; s_argv.push_back(s_exec.c_str()); - + s_arg = g_cfg.ssh.cmdline; } else { - + // sorry, SFTP not supported yet for macOS. // _create_json_ret(buf, TPE_NOT_IMPLEMENT); // return; - + if (g_cfg.sftp.application.length() == 0) { _create_response(buf, msg_req, TPE_NOT_EXISTS); return; } - + s_exec = g_cfg.sftp.application; s_argv.push_back(s_exec.c_str()); - + s_arg = g_cfg.sftp.cmdline; } } @@ -828,46 +841,96 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json //============================================== // TELNET //============================================== - + // sorry, TELNET not supported yet for macOS. // _create_json_ret(buf, TPE_NOT_IMPLEMENT); // return; - + g_cfg.telnet.name = "iterm2"; - + if (g_cfg.telnet.name == "terminal" || g_cfg.telnet.name == "iterm2") { char szCmd[1024] = {0}; ex_strformat(szCmd, 1023, "telnet -l %s %s %d", sid.c_str(), teleport_ip.c_str(), teleport_port); - + char szTitle[128] = {0}; ex_strformat(szTitle, 127, "TP#%s", real_host_ip.c_str()); - - int ret = AppDelegate_start_ssh_client(g_app, szCmd, g_cfg.telnet.name.c_str(), g_cfg.telnet.cmdline.c_str(), szTitle); + + int ret = AppDelegate_start_ssh_client(g_app, szCmd, g_cfg.telnet.name.c_str(), g_cfg.telnet.cmdline.c_str(), szTitle, interactive_mode); if (ret == 0) _create_response(buf, msg_req, TPE_OK); else _create_response(buf, msg_req, TPE_FAILED); return; } - + if (g_cfg.telnet.application.length() == 0) { _create_response(buf, msg_req, TPE_NOT_EXISTS); return; } - + s_exec = g_cfg.telnet.application; s_argv.push_back(s_exec.c_str()); - + s_arg = g_cfg.telnet.cmdline; } - - + //---- split s_arg and push to s_argv --- ex_astr::size_type p1 = 0; ex_astr::size_type p2 = 0; - ex_astr tmp = s_arg; + ex_astr tmp; + + for(;;){ + p1 = s_arg.find("{password:"); + if(p1 != ex_astr::npos) { + p2 = s_arg.find('}', p1+10); + if(p2 == ex_astr::npos) { + _create_response(buf, msg_req, TPE_PARAM); + return; + } + + if(is_interactive_mode) { + // 如果需要用户自己输入密码,则客户端命令行就不能带密码字段,需要抹去这个参数 + s_arg.erase(p1, p2-p1+1); + } + else{ + s_arg.erase(p2, 1); + s_arg.erase(p1, 10); + } + } + else + { + break; + } + } + + for(;;){ + p1 = s_arg.find("{interactive:"); + if(p1 != ex_astr::npos) { + p2 = s_arg.find('}', p1+13); + if(p2 == ex_astr::npos) { + _create_response(buf, msg_req, TPE_PARAM); + return; + } + + if(!is_interactive_mode) { + // 如果无需用户自己输入密码,则需要抹去这个参数 + s_arg.erase(p1, p2-p1+1); + } + else{ + s_arg.erase(p2, 1); + s_arg.erase(p1, 13); + } + } + else + { + break; + } + } + + + tmp = s_arg; for (;;) { ex_remove_white_space(tmp, EX_RSC_BEGIN); @@ -875,48 +938,48 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json { break; } - + if (tmp[0] == '"') { p1 = 1; p2 = tmp.find('"', p1); - + if (p2 == ex_astr::npos) { _create_response(buf, msg_req, TPE_PARAM); return; } - + ex_astr _t; _t.assign(tmp, p1, p2 - p1); tmp.erase(0, p2 + 2); - + s_argv.push_back(_t); } else { p1 = 0; p2 = tmp.find(' ', p1); - + if (p2 == ex_astr::npos) { s_argv.push_back(tmp); tmp.clear(); break; } - + ex_astr _t; _t.assign(tmp, p1, p2 - p1); tmp.erase(0, p2 + 1); - + s_argv.push_back(_t); } } - - + + Json::Value js_data; ex_astr utf8_path = s_exec; - + ex_astrs::iterator it = s_argv.begin(); for (; it != s_argv.end(); ++it) { @@ -926,31 +989,31 @@ void TsWsClient::_rpc_func_run_client(ex_astr& buf, AssistMessage& msg_req, Json ex_replace_all((*it), "{real_ip}", real_host_ip); ex_replace_all((*it), "{host_name}", real_host_name); //ex_replace_all(utf8_path, _T("{assist_tools_path}"), g_env.m_tools_path.c_str()); - + utf8_path += " "; utf8_path += (*it); } - + js_data["path"] = utf8_path; - + // for macOS, Create Process should be fork()/exec()... pid_t processId; if ((processId = fork()) == 0) { - + int i = 0; char** _argv = (char**)calloc(s_argv.size() + 1, sizeof(char*)); if (!_argv) return; - + for (i = 0; i < s_argv.size(); ++i) { _argv[i] = ex_strdup(s_argv[i].c_str()); } _argv[i] = NULL; - + execv(s_exec.c_str(), _argv); - + for (i = 0; i < s_argv.size(); ++i) { if (_argv[i] != NULL) diff --git a/server/tp_core/core/ts_http_rpc.cpp b/server/tp_core/core/ts_http_rpc.cpp index 8a89e58..67c9e07 100644 --- a/server/tp_core/core/ts_http_rpc.cpp +++ b/server/tp_core/core/ts_http_rpc.cpp @@ -440,7 +440,7 @@ void TsHttpRpc::_rpc_func_enc(const Json::Value& json_param, ex_astr& buf) is_enc = false; plain_text = json_param["p"].asCString(); - if (plain_text.length() == 0) + if (plain_text.empty()) { _create_json_ret(buf, TPE_PARAM); return; diff --git a/server/tp_core/core/ts_session.cpp b/server/tp_core/core/ts_session.cpp index f23d1df..2447cc0 100644 --- a/server/tp_core/core/ts_session.cpp +++ b/server/tp_core/core/ts_session.cpp @@ -4,6 +4,9 @@ #include #include +// 临时会话ID有效期,毫秒 +#define TEMP_SESSION_ID_VALID_TIME 60000 + TsSessionManager g_session_mgr; TsSessionManager::TsSessionManager() : @@ -44,7 +47,7 @@ void TsSessionManager::_remove_expired_connect_info() for (; it != m_connections.end();) { //EXLOGD("[core] check expired connect info: [%s] %d, %d %d %d\n", it->first.c_str(), it->second->ref_count, int(_now), int(it->second->ticket_start), int(_now - it->second->ticket_start)); - if (it->second->ref_count == 0 && _now - 15000 > it->second->ticket_start) + if (it->second->ref_count == 0 && _now - TEMP_SESSION_ID_VALID_TIME > it->second->ticket_start) { EXLOGD("[core] remove connection info, because timeout: %s\n", it->first.c_str()); delete it->second; @@ -100,7 +103,8 @@ bool TsSessionManager::free_connect_info(const ex_astr& sid) it->second->ref_count--; - // 对于RDP来说,此时不要移除连接信息,系统自带RDP客户端在第一次连接时进行协议协商,然后马上会断开,之后立即重新连接一次(第二次连接之前可能会提示证书信息,如果用户长时间不操作,可能会导致超时)。 + // 对于RDP来说,此时不要移除连接信息,系统自带RDP客户端在第一次连接时进行协议协商,然后马上会断开,之后立即重新连接 + // 一次(第二次连接之前可能会提示证书信息,如果用户长时间不操作,可能会导致超时)。 // 因此,我们将其引用计数减低,并更新一下最后访问时间,让定时器来移除它。 if (it->second->protocol_type != TP_PROTOCOL_TYPE_RDP) { @@ -116,10 +120,10 @@ bool TsSessionManager::free_connect_info(const ex_astr& sid) { if (it->second->ref_count == 1) it->second->ref_count = 0; - it->second->ticket_start = ex_get_tick_count() + 45000; // 我们将时间向后移动45秒,这样如果没有发生RDP的第二次连接,这个连接信息就会在一分钟后被清除。 + // 我们将启动时间向后一段,这样如果没有发生RDP的第二次连接,这个连接信息过一会儿就会被清除。 + it->second->ticket_start = ex_get_tick_count() + TEMP_SESSION_ID_VALID_TIME; } - return true; } diff --git a/server/tp_core/core/ts_web_rpc.cpp b/server/tp_core/core/ts_web_rpc.cpp index 55197f8..1c6d3a2 100644 --- a/server/tp_core/core/ts_web_rpc.cpp +++ b/server/tp_core/core/ts_web_rpc.cpp @@ -60,7 +60,7 @@ int ts_web_rpc_get_conn_info(int conn_id, TS_CONNECT_INFO& info) EXLOGE("[core] get conn info from web-server failed: can not connect to web-server.\n"); return TPE_NETWORK; } - if (body.length() == 0) + if (body.empty()) { EXLOGE("[core] get conn info from web-server failed: got nothing.\n"); return TPE_NETWORK; @@ -191,10 +191,10 @@ int ts_web_rpc_get_conn_info(int conn_id, TS_CONNECT_INFO& info) // 注意,account_id可以为-1,表示这是一次测试连接。 // if (user_id <= 0 || host_id <= 0 // || - if (user_username.length() == 0 - || host_ip.length() == 0 || conn_ip.length() == 0 || client_ip.length() == 0 + if (user_username.empty() + || host_ip.empty() || conn_ip.empty() || client_ip.empty() || conn_port <= 0 || conn_port >= 65535 - || acc_username.length() == 0 + || acc_username.empty() || !(protocol_type == TP_PROTOCOL_TYPE_RDP || protocol_type == TP_PROTOCOL_TYPE_SSH || protocol_type == TP_PROTOCOL_TYPE_TELNET) || !(auth_type == TP_AUTH_TYPE_NONE || auth_type == TP_AUTH_TYPE_PASSWORD || auth_type == TP_AUTH_TYPE_PRIVATE_KEY) ) @@ -202,10 +202,14 @@ int ts_web_rpc_get_conn_info(int conn_id, TS_CONNECT_INFO& info) return TPE_PARAM; } - if (auth_type != TP_AUTH_TYPE_NONE && acc_secret.length() == 0) - { + // 认证方式为密码时,允许不设置密码,而是连接时由用户手动输入 + if(acc_secret.empty() && !(auth_type == TP_AUTH_TYPE_NONE || auth_type == TP_AUTH_TYPE_PASSWORD)) return TPE_PARAM; - } + + // if (auth_type != TP_AUTH_TYPE_NONE && acc_secret.length() == 0) + // { + // return TPE_PARAM; + // } if (_enc && !acc_secret.empty()) { diff --git a/server/tp_core/protocol/ssh/ssh_session.cpp b/server/tp_core/protocol/ssh/ssh_session.cpp index 778baf9..96ae104 100644 --- a/server/tp_core/protocol/ssh/ssh_session.cpp +++ b/server/tp_core/protocol/ssh/ssh_session.cpp @@ -15,8 +15,8 @@ SshSession::SshSession(SshProxy* proxy, ssh_session rs_tp2cli, uint32_t dbg_id, m_conn_info(nullptr), m_conn_port(0), m_flags(0), - m_auth_type(TP_AUTH_TYPE_NONE), - m_allow_user_input_password(false) + m_auth_type(TP_AUTH_TYPE_NONE) + // , m_allow_user_input_password(false) { ex_strformat(m_dbg_name, 128, "ssh-%d", dbg_id); ex_strformat(m_dbg_client, 128, "%s:%d", client_ip, client_port); @@ -455,6 +455,7 @@ int SshSession::_on_auth_password_request(ssh_session /*session*/, const char* u int SshSession::_do_auth(const char* user, const char* secret) { EXLOGD("[%s] authenticating, user: %s\n", m_dbg_name.c_str(), user); + // EXLOGD("[%s] authenticating, user: %s, secret: %s\n", m_dbg_name.c_str(), user, secret); // v3.6.0 // 场景 @@ -591,12 +592,12 @@ int SshSession::_do_auth(const char* user, const char* secret) if (m_acc_secret.empty()) { // 如果TP中未设置远程账号密码,表示允许用户自行输入密码 - m_allow_user_input_password = true; + // m_allow_user_input_password = true; - // 如果传入的password为特定值,应该是由助手调用客户端,填写的密码 - // 直接返回认证失败,这样客户端会让用户输入密码 - if (0 == strcmp(secret, "INTERACTIVE_USER")) - return SSH_AUTH_DENIED; + // // 如果传入的password为特定值,应该是由助手调用客户端,填写的密码 + // // 直接返回认证失败,这样客户端会让用户输入密码 + // if (0 == strcmp(secret, "INTERACTIVE_USER")) + // return SSH_AUTH_DENIED; // 用户脱离TP-WEB,直接使用客户端输入的密码 m_acc_secret = secret; @@ -761,7 +762,7 @@ int SshSession::_do_auth(const char* user, const char* secret) // about 'echo': // This is an optional variable. You can obtain a boolean if the user input should be echoed or - // hidden. For passwords it is usually hidden. + // hidden. For password it is usually hidden. EXLOGV("[%s] interactive login prompt(%s): %s\n", m_dbg_name.c_str(), echo ? "hidden" : "not hidden", prompt); if (echo) diff --git a/server/tp_core/protocol/ssh/ssh_session.h b/server/tp_core/protocol/ssh/ssh_session.h index 358409c..887de45 100644 --- a/server/tp_core/protocol/ssh/ssh_session.h +++ b/server/tp_core/protocol/ssh/ssh_session.h @@ -151,7 +151,7 @@ private: std::string m_acc_secret; uint32_t m_flags; int m_auth_type; - bool m_allow_user_input_password; + // bool m_allow_user_input_password; bool m_first_auth; // 远程主机认证是否通过 diff --git a/server/www/teleport/static/css/dashboard.css b/server/www/teleport/static/css/dashboard.css index 3bf4f15..abad700 100644 --- a/server/www/teleport/static/css/dashboard.css +++ b/server/www/teleport/static/css/dashboard.css @@ -1 +1 @@ -@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f069";font-size:8px;font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}.page-content-dashboard{padding:20px 25px}.sys-msg{border:1px solid #ff8987;border-radius:5px;background-color:#ffbdb7;padding:10px;margin-bottom:10px;text-align:center;display:none}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:10px;padding-left:10px}.stats{overflow:hidden;color:#686868;background-color:#fff;margin-bottom:10px}.stats.stats-id-host{border-top:5px solid #348fe2;background-color:#e7f1fb}.stats.stats-id-user{border-top:5px solid #f57523;background-color:#feefe6}.stats.stats-id-account{border-top:5px solid #d34242;background-color:#fae7e7}.stats.stats-id-connect{border-top:5px solid #368142;background-color:#def1e1}.stats.stats-box{position:relative;height:98px;box-shadow:1px 1px 2px rgba(0,0,0,0.3)}.stats.stats-box .stats-content{padding-left:20px}.stats.stats-box .stats-icon{font-size:130px;line-height:130px;top:5px;right:-40px;position:absolute;color:rgba(0,0,0,0.07)}.stats.stats-box .stats-name{font-size:16px;font-weight:500;padding-top:10px;color:rgba(0,0,0,0.6)}.stats.stats-box .stats-value{display:inline;color:rgba(0,0,0,0.6);cursor:pointer;font-size:42px;font-weight:300;white-space:nowrap;padding-left:20px}.stats.stats-bar{position:relative;height:200px;padding:8px;box-shadow:1px 1px 2px rgba(0,0,0,0.3)}.stats.stats-bar .stats-value{margin-top:5px;height:180px}.stats.stats-first{border-left:none}.stats a{color:#eee;color:rgba(255,255,255,0.7)}.stats a:hover{color:#fff}/*# sourceMappingURL=dashboard.css.map */ \ No newline at end of file +@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;content:"\f069";font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:7px;font-size:12px}.form-group .control-desc-sm-input{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}.page-content-dashboard{padding:20px 25px}.sys-msg{border:1px solid #ff8987;border-radius:5px;background-color:#ffbdb7;padding:10px;margin-bottom:10px;text-align:center;display:none}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:10px;padding-left:10px}.stats{overflow:hidden;color:#686868;background-color:#fff;margin-bottom:10px}.stats.stats-id-host{border-top:5px solid #348fe2;background-color:#e7f1fb}.stats.stats-id-user{border-top:5px solid #f57523;background-color:#feefe6}.stats.stats-id-account{border-top:5px solid #d34242;background-color:#fae7e7}.stats.stats-id-connect{border-top:5px solid #368142;background-color:#def1e1}.stats.stats-box{position:relative;height:98px;box-shadow:1px 1px 2px rgba(0,0,0,0.3)}.stats.stats-box .stats-content{padding-left:20px}.stats.stats-box .stats-icon{font-size:130px;line-height:130px;top:5px;right:-40px;position:absolute;color:rgba(0,0,0,0.07)}.stats.stats-box .stats-name{font-size:16px;font-weight:500;padding-top:10px;color:rgba(0,0,0,0.6)}.stats.stats-box .stats-value{display:inline;color:rgba(0,0,0,0.6);cursor:pointer;font-size:42px;font-weight:300;white-space:nowrap;padding-left:20px}.stats.stats-bar{position:relative;height:200px;padding:8px;box-shadow:1px 1px 2px rgba(0,0,0,0.3)}.stats.stats-bar .stats-value{margin-top:5px;height:180px}.stats.stats-first{border-left:none}.stats a{color:#eee;color:rgba(255,255,255,0.7)}.stats a:hover{color:#fff}/*# sourceMappingURL=dashboard.css.map */ \ No newline at end of file diff --git a/server/www/teleport/static/css/login.css b/server/www/teleport/static/css/login.css index 276b40d..ddb55c5 100644 --- a/server/www/teleport/static/css/login.css +++ b/server/www/teleport/static/css/login.css @@ -1 +1 @@ -@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}body{padding:0;margin:0;overflow:hidden}.bg-blur{position:fixed;top:-20px;left:-20px}.bg-blur-overlay{position:absolute;width:100%;height:100%;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0NiUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wOCIvPjxzdG9wIG9mZnNldD0iNTklIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMDgiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC45Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0, 50% 100%, color-stop(46%, rgba(0,0,0,0.08)), color-stop(59%, rgba(0,0,0,0.08)), color-stop(100%, rgba(0,0,0,0.9)));background-image:-moz-linear-gradient(top, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%);background-image:-webkit-linear-gradient(top, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%);background-image:linear-gradient(to bottom, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%)}.container{min-width:460px}#page-header nav.navbar{height:70px;margin-bottom:0;border:none;background-color:rgba(0,0,0,0.6);color:#fff}#page-header nav li{display:inline-block;float:left}#page-header .logo{position:relative;margin-top:10px;display:inline-block}#page-header .desc{position:relative;display:inline-block;color:#ccc;top:32px;font-size:24px;vertical-align:baseline;font-family:"Kai","华文楷体","楷体","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif}#page-footer nav.navbar{min-height:36px;height:36px;line-height:36px;background-color:rgba(0,0,0,0.6);font-size:12px;color:#6d6d6d}#page-footer nav.navbar .container{height:24px}#page-footer nav.navbar p{margin:0 auto;text-align:center}.auth-box-container{position:fixed;left:0;top:70px;width:100%}.auth-box-container .auth-box{margin:80px auto 0 auto;width:450px;border:1px solid #fff;border-radius:8px;background-color:rgba(255,255,255,0.6);box-shadow:0 5px 50px rgba(0,0,0,0.9)}.auth-box-container .auth-box .header{min-height:50px;height:50px;border:none;box-shadow:none;border-bottom:1px solid rgba(255,255,255,0.3)}.auth-box-container .auth-box .header .title{display:inline-block;float:left;margin-left:60px;height:24px;margin-top:25px;line-height:16px;font-size:20px;color:#484848}.auth-box-container .auth-box .header .title:hover{border-bottom:2px solid #5396eb}.auth-box-container .auth-box .header .selected{border-bottom:2px solid #4882cc;color:#262b40}.auth-box-container .auth-box .inputarea{margin:30px}.auth-box-container .auth-box .inputarea .input-group-addon{padding:0 10px}.auth-box-container .auth-box .inputarea p.input-addon-desc{text-align:right;padding:0 5px 0 5px;color:#636363}.auth-box-container .auth-box .inputbox{margin-bottom:20px}.auth-box-container .auth-box .op_box{display:block;padding:5px;border-radius:3px;text-align:center;margin:5px 20px 10px 20px}.auth-box-container .auth-box .op_error{background:rgba(255,5,0,0.5);color:#fff}.auth-box-container .auth-box .op_wait{background:rgba(255,255,255,0.3)}#slogan-box{padding-top:80px}#msg-slogan{text-align:right;font-size:24px;line-height:48px;font-family:"Kai","华文楷体","楷体","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif;color:rgba(255,255,255,0.5)}@media screen and (max-width:990px){#slogan-box{display:none}.auth-box{margin:30px auto 0 auto}}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f069";font-size:8px;font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}/*# sourceMappingURL=login.css.map */ \ No newline at end of file +@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}body{padding:0;margin:0;overflow:hidden}.bg-blur{position:fixed;top:-20px;left:-20px}.bg-blur-overlay{position:absolute;width:100%;height:100%;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0NiUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wOCIvPjxzdG9wIG9mZnNldD0iNTklIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMDgiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC45Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0, 50% 100%, color-stop(46%, rgba(0,0,0,0.08)), color-stop(59%, rgba(0,0,0,0.08)), color-stop(100%, rgba(0,0,0,0.9)));background-image:-moz-linear-gradient(top, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%);background-image:-webkit-linear-gradient(top, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%);background-image:linear-gradient(to bottom, rgba(0,0,0,0.08) 46%, rgba(0,0,0,0.08) 59%, rgba(0,0,0,0.9) 100%)}.container{min-width:460px}#page-header nav.navbar{height:70px;margin-bottom:0;border:none;background-color:rgba(0,0,0,0.6);color:#fff}#page-header nav li{display:inline-block;float:left}#page-header .logo{position:relative;margin-top:10px;display:inline-block}#page-header .desc{position:relative;display:inline-block;color:#ccc;top:32px;font-size:24px;vertical-align:baseline;font-family:"Kai","华文楷体","楷体","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif}#page-footer nav.navbar{min-height:36px;height:36px;line-height:36px;background-color:rgba(0,0,0,0.6);font-size:12px;color:#6d6d6d}#page-footer nav.navbar .container{height:24px}#page-footer nav.navbar p{margin:0 auto;text-align:center}.auth-box-container{position:fixed;left:0;top:70px;width:100%}.auth-box-container .auth-box{margin:80px auto 0 auto;width:450px;border:1px solid #fff;border-radius:8px;background-color:rgba(255,255,255,0.6);box-shadow:0 5px 50px rgba(0,0,0,0.9)}.auth-box-container .auth-box .header{min-height:50px;height:50px;border:none;box-shadow:none;border-bottom:1px solid rgba(255,255,255,0.3)}.auth-box-container .auth-box .header .title{display:inline-block;float:left;margin-left:60px;height:24px;margin-top:25px;line-height:16px;font-size:20px;color:#484848}.auth-box-container .auth-box .header .title:hover{border-bottom:2px solid #5396eb}.auth-box-container .auth-box .header .selected{border-bottom:2px solid #4882cc;color:#262b40}.auth-box-container .auth-box .inputarea{margin:30px}.auth-box-container .auth-box .inputarea .input-group-addon{padding:0 10px}.auth-box-container .auth-box .inputarea p.input-addon-desc{text-align:right;padding:0 5px 0 5px;color:#636363}.auth-box-container .auth-box .inputbox{margin-bottom:20px}.auth-box-container .auth-box .op_box{display:block;padding:5px;border-radius:3px;text-align:center;margin:5px 20px 10px 20px}.auth-box-container .auth-box .op_error{background:rgba(255,5,0,0.5);color:#fff}.auth-box-container .auth-box .op_wait{background:rgba(255,255,255,0.3)}#slogan-box{padding-top:80px}#msg-slogan{text-align:right;font-size:24px;line-height:48px;font-family:"Kai","华文楷体","楷体","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif;color:rgba(255,255,255,0.5)}@media screen and (max-width:990px){#slogan-box{display:none}.auth-box{margin:30px auto 0 auto}}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;content:"\f069";font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:7px;font-size:12px}.form-group .control-desc-sm-input{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}/*# sourceMappingURL=login.css.map */ \ No newline at end of file diff --git a/server/www/teleport/static/css/single.css b/server/www/teleport/static/css/single.css index 2707b7a..a359936 100644 --- a/server/www/teleport/static/css/single.css +++ b/server/www/teleport/static/css/single.css @@ -1 +1 @@ -@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.table{margin-bottom:10px}.table>thead>tr>th{vertical-align:middle;border-bottom:2px solid #ddd}.table.table-info-list{width:auto}.table.table-info-list td{border-top:1px dotted #ddd;padding:5px 5px;vertical-align:top}.table.table-info-list td.key{text-align:right;width:1px;white-space:nowrap}.table.table-info-list td.value{text-align:left;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;color:#3e3e3e}.table.table-info-list td .error{color:#cc3632;font-weight:bold}.table.table-info-list td .disabled{color:#848484}.table.table-info-list.table-info-list-lite{width:100%}.table.table-info-list.table-info-list-lite td{padding:5px 5px}.table.table-info-list.table-info-list-lite td.value{font-weight:normal}.table.table-info-list tr:first-child td{border-top:none}.table.table-config-list{width:100%}.table.table-config-list td{border:none;padding:5px}.table.table-config-list td.title{text-align:left;font-size:110%;font-weight:bolder}.table.table-config-list td.key{width:1px;white-space:nowrap;text-align:right;padding-right:15px}.table.table-config-list td.value{text-align:left}.table.table-config-list td.value input{width:4em;padding:0 5px;text-align:right}.table.table-config-list td.value .unit{margin-left:5px}.table.table-config-list td.value .desc{color:#999;margin-left:15px;display:inline-block}.table>thead>tr>th{padding:5px 5px;outline:none;white-space:nowrap;font-weight:normal;text-align:center;background-color:#ededed}.table>tbody>tr>td{padding:5px;text-align:center;vertical-align:middle}.table>tbody>tr>td .nowrap{white-space:nowrap}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.table.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer}.table.table-data thead .sorting:after,.table.table-data thead .sorting_asc:after,.table.table-data thead .sorting_desc:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'Font Awesome 5 Free';font-weight:900;opacity:.8}.table.table-data thead .sorting:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc:after{content:"\f0de"}.table.table-data thead .sorting_desc:after{content:"\f0dd"}.host-name{font-size:16px}.host-name-desc{cursor:pointer}.host-ip{font-size:12px;color:#999;display:inline-block;white-space:nowrap;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;overflow:hidden;text-overflow:ellipsis}.td-ip-list{padding-right:20px;padding-left:5px}.td-ip-show-more{font-size:14px;width:12px;float:right;display:block}.td-ip-item{min-width:12em;width:12em;height:18px;padding:2px 4px;margin:1px 0;color:#333;text-align:center;white-space:nowrap;border-radius:9px;line-height:11px;font-size:11px;background:#dfdfdf !important}.td-ip-item span{display:inline-block;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f069";font-size:8px;font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}body{padding:0;margin:0}#page-content{margin-bottom:44px}#page-footer nav.navbar{min-height:24px;height:24px;line-height:24px;background-color:#cdcdcd;font-size:12px;color:#6d6d6d}#page-footer nav.navbar .container{height:24px}#page-footer nav.navbar p{margin:0 auto;text-align:center}.page-header{box-shadow:0 0 3px rgba(0,0,0,0.5);min-height:48px;top:0;width:100%;height:48px;margin:0 0 10px;border:none;background-color:#2a2a2a}.page-header .top-navbar{min-height:48px;height:48px;line-height:47px;background-color:#3a3a3a;color:#ccc}.page-header .top-navbar a{color:#d5d5d5}.page-header .top-navbar a:hover{color:#5a8fee}.page-header .top-navbar .brand{float:left;display:inline-block;padding:12px 0;margin:0}.page-header .top-navbar .brand .site-logo{display:block;width:86px;height:24px;background:url(../img/site-logo-small.png) no-repeat}.page-header .top-navbar .breadcrumb-container{float:left;display:inline-block;margin:0;padding:0}.page-header .top-navbar .breadcrumb-container .breadcrumb{background-color:#3a3a3a;margin:0;border-radius:0;border:none;padding:0 0 0 20px;font-size:16px;color:#ccc}.page-header .top-navbar .breadcrumb-container .breadcrumb>li+li:before{font-size:18px;padding:0 5px;color:#555;content:'|'}.page-header .top-navbar .breadcrumb-container .breadcrumb>li.title{font-size:18px}.page-header .top-navbar .breadcrumb-container .breadcrumb>li.sub-title{font-size:14px;color:#b3b3b3;line-height:44px}.page-header .top-navbar .status-container{float:right}.op_box{display:block;padding:5px;margin:0}.op_box.op_error{background-color:#ffb8b5;border:1px solid #d47e7b;color:#333}.op_box.op_wait{background:#e5e5e5;border:1px solid #a8a8a8;color:#333}.op_box.op_success{background:#acf1b2;border:1px solid #82df82;color:#333}.info-box{width:100%;margin:30px auto}.info-box .info-icon-box{z-index:-1;position:absolute;min-height:194px;overflow:hidden}.info-box .info-icon-box>.fas,.info-box .info-icon-box .fa{margin-top:30px;font-size:164px}.info-box .info-message-box{min-height:328px;border:1px solid #fff;background-color:rgba(255,255,255,0.76);box-shadow:2px 2px 3px rgba(0,0,0,0.3);padding:15px 20px 35px 30px;margin-left:98.4px}.info-box .info-message-box .title{font-size:180%;margin:15px 0}.info-box .info-message-box hr{border-top:none;border-bottom:1px dashed #d3d3d3}.info-box .op_box{margin:5px 0;text-align:center}.content-box{background-color:#fff;padding:20px;box-shadow:1px 1px 1px rgba(0,0,0,0.3)}.content-box .welcome-message .fa{display:block;color:#ff272a;font-size:18px;float:left}.content-box .welcome-message span{display:block;line-height:18px;padding-left:23px}.content-box .table{width:auto;margin-left:20px}.content-box .table td{border-top:1px dotted #ddd;padding:5px}.content-box .table td.key{text-align:right}.content-box .table td.value{text-align:left;font-weight:bold}.content-box .table tr:first-child td{border-top:none}.content-box table.form{width:auto;margin-left:20px}.content-box table.form td{padding:5px;line-height:1.42857143;vertical-align:middle}.content-box table.form td.key{text-align:right}.content-box table.form td label{margin-bottom:0}.content-box table.form td .form-control{height:30px;padding:5px 10px;font-size:inherit;line-height:inherit}.content-box h1 .fa-spin{color:#aaa}.content-box h1{font-size:180%}.content-box h2{font-size:140%}.content-box .op_box{margin:5px 0}.content-box .steps-detail{display:none;margin:10px;padding:10px;border:1px solid #b4b4b4;background-color:#dcdcdc}.content-box .steps-detail p{padding-left:5px;margin:2px 0 2px 1px}.content-box .steps-detail p.error{color:#fff;margin:2px 0 2px 0;background-color:#cc3632;border:1px solid #9c2a26}.content-box .alert.alert-warning{color:#6a542d;border:1px solid #e2cab4;background-color:#ffe4cb}.content-box .error{color:#cc3632}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}/*# sourceMappingURL=single.css.map */ \ No newline at end of file +@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.table{margin-bottom:10px}.table>thead>tr>th{vertical-align:middle;border-bottom:2px solid #ddd}.table.table-info-list{width:auto}.table.table-info-list td{border-top:1px dotted #ddd;padding:5px 5px;vertical-align:top}.table.table-info-list td.key{text-align:right;width:1px;white-space:nowrap}.table.table-info-list td.value{text-align:left;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;color:#3e3e3e}.table.table-info-list td .error{color:#cc3632;font-weight:bold}.table.table-info-list td .disabled{color:#848484}.table.table-info-list.table-info-list-lite{width:100%}.table.table-info-list.table-info-list-lite td{padding:5px 5px}.table.table-info-list.table-info-list-lite td.value{font-weight:normal}.table.table-info-list tr:first-child td{border-top:none}.table.table-config-list{width:100%}.table.table-config-list td{border:none;padding:5px}.table.table-config-list td.title{text-align:left;font-size:110%;font-weight:bolder}.table.table-config-list td.key{width:1px;white-space:nowrap;text-align:right;padding-right:15px}.table.table-config-list td.value{text-align:left}.table.table-config-list td.value input{width:4em;padding:0 5px;text-align:right}.table.table-config-list td.value .unit{margin-left:5px}.table.table-config-list td.value .desc{color:#999;margin-left:15px;display:inline-block}.table>thead>tr>th{padding:5px 5px;outline:none;white-space:nowrap;font-weight:normal;text-align:center;background-color:#ededed}.table>tbody>tr>td{padding:5px;text-align:center;vertical-align:middle}.table>tbody>tr>td .nowrap{white-space:nowrap}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.table.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer}.table.table-data thead .sorting:after,.table.table-data thead .sorting_asc:after,.table.table-data thead .sorting_desc:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'Font Awesome 5 Free';font-weight:900;opacity:.8}.table.table-data thead .sorting:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc:after{content:"\f0de"}.table.table-data thead .sorting_desc:after{content:"\f0dd"}.host-name{font-size:16px}.host-name-desc{cursor:pointer}.host-ip{font-size:12px;color:#999;display:inline-block;white-space:nowrap;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;overflow:hidden;text-overflow:ellipsis}.td-ip-list{padding-right:20px;padding-left:5px}.td-ip-show-more{font-size:14px;width:12px;float:right;display:block}.td-ip-item{min-width:12em;width:12em;height:18px;padding:2px 4px;margin:1px 0;color:#333;text-align:center;white-space:nowrap;border-radius:9px;line-height:11px;font-size:11px;background:#dfdfdf !important}.td-ip-item span{display:inline-block;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;content:"\f069";font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:7px;font-size:12px}.form-group .control-desc-sm-input{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}body{padding:0;margin:0}#page-content{margin-bottom:44px}#page-footer nav.navbar{min-height:24px;height:24px;line-height:24px;background-color:#cdcdcd;font-size:12px;color:#6d6d6d}#page-footer nav.navbar .container{height:24px}#page-footer nav.navbar p{margin:0 auto;text-align:center}.page-header{box-shadow:0 0 3px rgba(0,0,0,0.5);min-height:48px;top:0;width:100%;height:48px;margin:0 0 10px;border:none;background-color:#2a2a2a}.page-header .top-navbar{min-height:48px;height:48px;line-height:47px;background-color:#3a3a3a;color:#ccc}.page-header .top-navbar a{color:#d5d5d5}.page-header .top-navbar a:hover{color:#5a8fee}.page-header .top-navbar .brand{float:left;display:inline-block;padding:12px 0;margin:0}.page-header .top-navbar .brand .site-logo{display:block;width:86px;height:24px;background:url(../img/site-logo-small.png) no-repeat}.page-header .top-navbar .breadcrumb-container{float:left;display:inline-block;margin:0;padding:0}.page-header .top-navbar .breadcrumb-container .breadcrumb{background-color:#3a3a3a;margin:0;border-radius:0;border:none;padding:0 0 0 20px;font-size:16px;color:#ccc}.page-header .top-navbar .breadcrumb-container .breadcrumb>li+li:before{font-size:18px;padding:0 5px;color:#555;content:'|'}.page-header .top-navbar .breadcrumb-container .breadcrumb>li.title{font-size:18px}.page-header .top-navbar .breadcrumb-container .breadcrumb>li.sub-title{font-size:14px;color:#b3b3b3;line-height:44px}.page-header .top-navbar .status-container{float:right}.op_box{display:block;padding:5px;margin:0}.op_box.op_error{background-color:#ffb8b5;border:1px solid #d47e7b;color:#333}.op_box.op_wait{background:#e5e5e5;border:1px solid #a8a8a8;color:#333}.op_box.op_success{background:#acf1b2;border:1px solid #82df82;color:#333}.info-box{width:100%;margin:30px auto}.info-box .info-icon-box{z-index:-1;position:absolute;min-height:194px;overflow:hidden}.info-box .info-icon-box>.fas,.info-box .info-icon-box .fa{margin-top:30px;font-size:164px}.info-box .info-message-box{min-height:328px;border:1px solid #fff;background-color:rgba(255,255,255,0.76);box-shadow:2px 2px 3px rgba(0,0,0,0.3);padding:15px 20px 35px 30px;margin-left:98.4px}.info-box .info-message-box .title{font-size:180%;margin:15px 0}.info-box .info-message-box hr{border-top:none;border-bottom:1px dashed #d3d3d3}.info-box .op_box{margin:5px 0;text-align:center}.content-box{background-color:#fff;padding:20px;box-shadow:1px 1px 1px rgba(0,0,0,0.3)}.content-box .welcome-message .fa{display:block;color:#ff272a;font-size:18px;float:left}.content-box .welcome-message span{display:block;line-height:18px;padding-left:23px}.content-box .table{width:auto;margin-left:20px}.content-box .table td{border-top:1px dotted #ddd;padding:5px}.content-box .table td.key{text-align:right}.content-box .table td.value{text-align:left;font-weight:bold}.content-box .table tr:first-child td{border-top:none}.content-box table.form{width:auto;margin-left:20px}.content-box table.form td{padding:5px;line-height:1.42857143;vertical-align:middle}.content-box table.form td.key{text-align:right}.content-box table.form td label{margin-bottom:0}.content-box table.form td .form-control{height:30px;padding:5px 10px;font-size:inherit;line-height:inherit}.content-box h1 .fa-spin{color:#aaa}.content-box h1{font-size:180%}.content-box h2{font-size:140%}.content-box .op_box{margin:5px 0}.content-box .steps-detail{display:none;margin:10px;padding:10px;border:1px solid #b4b4b4;background-color:#dcdcdc}.content-box .steps-detail p{padding-left:5px;margin:2px 0 2px 1px}.content-box .steps-detail p.error{color:#fff;margin:2px 0 2px 0;background-color:#cc3632;border:1px solid #9c2a26}.content-box .alert.alert-warning{color:#6a542d;border:1px solid #e2cab4;background-color:#ffe4cb}.content-box .error{color:#cc3632}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}/*# sourceMappingURL=single.css.map */ \ No newline at end of file diff --git a/server/www/teleport/static/css/style.css b/server/www/teleport/static/css/style.css index d682e3b..c69cfe8 100644 --- a/server/www/teleport/static/css/style.css +++ b/server/www/teleport/static/css/style.css @@ -1 +1 @@ -@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f069";font-size:8px;font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}.table.table-role .header{font-size:120%;margin-top:8px}.table.table-role td{text-align:left;vertical-align:top;padding:0}.table.table-role td.role-name{min-width:160px}.table.table-role td.role-name ul{list-style:none;margin:0;padding:0}.table.table-role td.role-name ul li{padding:8px 30px 8px 6px;white-space:nowrap}.table.table-role td.role-name ul li:first-child{margin-top:10px}.table.table-role td.role-name ul li.active{color:#fff;background-color:#4091dd}.table.table-role td.role-name ul li.active:hover{background-color:#4091dd;cursor:auto}.table.table-role td.role-name ul li:hover{background-color:#81b6e9;cursor:pointer}.table.table-role td.role-privilege{padding:0 0 10px 10px;border-left:3px solid #4091dd}.table.table-role td.role-privilege hr{margin:8px 0;border-bottom:1px solid rgba(255,255,255,0.3)}.table.table-role td.role-privilege .title{font-size:110%;margin:5px 0}.table.table-role td.role-privilege ul{list-style:none;margin:0;padding:0}.table.table-role td.role-privilege ul li{display:inline-block;width:180px;margin-bottom:5px;margin-left:10px}.table.table-role td.role-privilege ul li span{color:#8e8e8e}.table.table-role td.role-privilege ul li span:before{display:inline-block;width:16px;content:"\f0c8";font-family:'Font Awesome 5 Free';font-weight:400}.table.table-role td.role-privilege ul li span.enabled{color:#3374b0}.table.table-role td.role-privilege ul li span.enabled:before{content:"\f14a";font-family:'Font Awesome 5 Free';font-weight:400}.table.table-role td.role-privilege.editable li span{cursor:pointer}.table.table-role tr:first-child td{border-top:none}#btn-create-role{margin-top:15px}.table{margin-bottom:10px}.table>thead>tr>th{vertical-align:middle;border-bottom:2px solid #ddd}.table.table-info-list{width:auto}.table.table-info-list td{border-top:1px dotted #ddd;padding:5px 5px;vertical-align:top}.table.table-info-list td.key{text-align:right;width:1px;white-space:nowrap}.table.table-info-list td.value{text-align:left;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;color:#3e3e3e}.table.table-info-list td .error{color:#cc3632;font-weight:bold}.table.table-info-list td .disabled{color:#848484}.table.table-info-list.table-info-list-lite{width:100%}.table.table-info-list.table-info-list-lite td{padding:5px 5px}.table.table-info-list.table-info-list-lite td.value{font-weight:normal}.table.table-info-list tr:first-child td{border-top:none}.table.table-config-list{width:100%}.table.table-config-list td{border:none;padding:5px}.table.table-config-list td.title{text-align:left;font-size:110%;font-weight:bolder}.table.table-config-list td.key{width:1px;white-space:nowrap;text-align:right;padding-right:15px}.table.table-config-list td.value{text-align:left}.table.table-config-list td.value input{width:4em;padding:0 5px;text-align:right}.table.table-config-list td.value .unit{margin-left:5px}.table.table-config-list td.value .desc{color:#999;margin-left:15px;display:inline-block}.table>thead>tr>th{padding:5px 5px;outline:none;white-space:nowrap;font-weight:normal;text-align:center;background-color:#ededed}.table>tbody>tr>td{padding:5px;text-align:center;vertical-align:middle}.table>tbody>tr>td .nowrap{white-space:nowrap}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.table.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer}.table.table-data thead .sorting:after,.table.table-data thead .sorting_asc:after,.table.table-data thead .sorting_desc:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'Font Awesome 5 Free';font-weight:900;opacity:.8}.table.table-data thead .sorting:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc:after{content:"\f0de"}.table.table-data thead .sorting_desc:after{content:"\f0dd"}.host-name{font-size:16px}.host-name-desc{cursor:pointer}.host-ip{font-size:12px;color:#999;display:inline-block;white-space:nowrap;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;overflow:hidden;text-overflow:ellipsis}.td-ip-list{padding-right:20px;padding-left:5px}.td-ip-show-more{font-size:14px;width:12px;float:right;display:block}.td-ip-item{min-width:12em;width:12em;height:18px;padding:2px 4px;margin:1px 0;color:#333;text-align:center;white-space:nowrap;border-radius:9px;line-height:11px;font-size:11px;background:#dfdfdf !important}.td-ip-item span{display:inline-block;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.remote-action-group{margin-bottom:3px;height:28px}.remote-action-group .btn-group-sm>.btn{margin:0;padding:6px 6px;font-size:12px;height:28px;min-width:80px}.remote-action-group .btn-group-sm>.btn.dropdown-toggle{min-width:0}.remote-action-group>li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;font-size:12px}.remote-action-group>li.remote-action-state{text-align:center;white-space:nowrap}.remote-action-group>li.remote-action-state.state-disabled{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.remote-action-group>li.remote-action-state.state-disabled>i.fa{color:#b53a2f}.remote-action-group>li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group>li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.remote-info-group{margin-bottom:3px;height:28px}.remote-info-group ul{display:inline-block;height:28px;margin:0;padding:0}.remote-info-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.remote-info-group ul li.remote-action-btn{background:none;padding:0;border:none}.remote-info-group ul li.remote-action-input{background:none;padding:4px 0}.remote-info-group ul li.remote-action-input select{border:none}.remote-info-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.remote-info-group ul li select{margin-top:-3px}.remote-info-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-info-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.rdp-options{position:absolute;display:none;left:10px;top:30px;border:1px solid rgba(0,0,0,0.25);z-index:9999;background-color:#fff;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,0.2);font-size:13px}.rdp-options hr{margin:3px 0}.rdp-options .title{background-color:#eee;padding:3px 5px}.rdp-options .item{width:100%;padding:3px 20px}.rdp-options .item .radio,.rdp-options .item .checkbox{margin:0;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.rdp-options .item .center{text-align:center}body.page-header-fixed{padding-top:48px}body.page-sidebar-fixed .page-sidebar{position:fixed}body.page-sidebar-fixed .page-content{margin-left:180px}.page-header{border:none;box-shadow:0 0 3px rgba(0,0,0,0.5)}.page-header.navbar{overflow:hidden;min-height:48px;height:48px;margin:0}.page-header.navbar .brand{display:inline-block;float:left;width:180px;height:48px;padding:12px 0 0;text-align:center;margin:0 auto;background-color:#3a3a3a}.page-header.navbar .brand .logo{display:inline-block;width:93px;height:30px;background:url(../img/site-logo-small.png) no-repeat}.page-header.navbar .breadcrumb-container{display:inline-block;padding-top:6px}.page-header.navbar .breadcrumb-container .breadcrumb{background-color:transparent;padding-left:20px;font-size:16px}.page-header.navbar .breadcrumb-container .breadcrumb>li+li:before{content:"\f105";font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-header.navbar .breadcrumb-container .breadcrumb.breadcrumb-list>li{font-size:13px}.page-header.navbar .breadcrumb-container .breadcrumb.breadcrumb-list>li+li:before{content:" ";margin:0 5px}.page-header .container-fluid{padding-left:0}.page-sidebar{top:48px;bottom:0;left:0;width:180px;padding-top:0;z-index:1010;background-color:#3a3a3a}.page-sidebar .nav-menu>li>a{padding:8px 0 8px 20px;line-height:24px;font-size:13px;color:#c2c2c2;border-left:5px solid #3a3a3a}.page-sidebar .nav-menu>li>a:focus{background-color:#3a3a3a;border-left:5px solid #3a3a3a}.page-sidebar .nav-menu>li>a:hover{background-color:#2d2d2d;border-left:5px solid #005c74}.page-sidebar .nav-menu>li>a.selected{border-left:5px solid #00485b}.page-sidebar .nav-menu>li>a.selected:focus{border-left:5px solid #00485b}.page-sidebar .nav-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.page-sidebar .nav-menu>li>a.active:hover{border-left:5px solid #00acda}.page-sidebar .nav-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:1px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:20px;line-height:24px;margin-right:-6px}.page-sidebar .nav-menu li .menu-caret:after{display:inline-block;width:12px;height:12px;margin-left:5px;top:1px;position:relative;border:none;font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-sidebar .nav-menu li .menu-caret:after{content:'\f105'}.page-sidebar .nav-menu li.expand .menu-caret:after{content:'\f107'}.page-sidebar .nav-menu>li>a>i.icon{float:left;margin-top:1px;margin-right:15px;text-align:center;line-height:24px;font-size:14px}.page-sidebar .sub-menu{padding:0;margin:0;background-color:#292929;position:relative;list-style-type:none;border-top:1px solid #202020;border-bottom:1px solid #464646}.page-sidebar .sub-menu>li>a{padding:8px 0 8px 40px;line-height:20px;font-size:13px;display:block;position:relative;color:#889097;border-left:5px solid #292929}.page-sidebar .sub-menu>li>a:before{display:inline-block;padding-right:8px;line-height:20px;content:"\f0da";font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-sidebar .sub-menu>li>a:hover{color:#fff;border-left:5px solid #005c74}.page-sidebar .sub-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.page-sidebar .sub-menu>li>a.active:hover{border-left:5px solid #00acda}.page-sidebar .sub-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:-1px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:18px;line-height:24px;margin-right:-6px}.page-sidebar .nav-menu>li.profile{padding:10px 10px;color:#ccc;background-color:#333;border-bottom:1px solid #464646}.page-sidebar .nav-menu>li.profile a.title{color:#ccc}.page-sidebar .nav-menu>li.profile a.title:hover{color:#fff;background-color:transparent}.page-sidebar .nav-menu>li.profile a.title:focus{background-color:transparent}.page-sidebar .nav-menu>li.profile .image{float:left;margin-top:3px;font-size:24px;color:#69f;width:36px;height:36px;border-radius:6px;background-color:#eee;text-align:center;margin-right:10px;overflow:hidden}.page-sidebar .nav-menu>li.profile .image img{margin-top:-3px}.page-sidebar .nav-menu>li.profile .name{display:block;padding-top:3px;font-size:14px}.page-sidebar .nav-menu>li.profile .role{display:block;font-size:12px;color:#999}.page-sidebar .nav-menu>li.profile.active{background-color:#0084a7;color:#fff}.page-sidebar .nav-menu>li.profile.active .name,.page-sidebar .nav-menu>li.profile.active .role{color:#fff}.page-sidebar .nav-menu>li.profile.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:absolute;top:0;right:-1px;display:inline-block;font-style:normal;font-weight:400;color:#e9e9e9;font-size:24px;line-height:61px;margin-right:-6px}.page-sidebar .nav-menu>li.profile .dropdown-menu{min-width:0;font-size:13px}.page-sidebar .nav-menu>li.profile .dropdown-menu>li>a{padding-right:30px}.page-sidebar .nav-menu>li.profile .dropdown-menu>li>a:hover{background-color:#ccc}.page-sidebar .nav-menu>li.profile .dropdown-menu .divider{margin:5px 0}.page-sidebar .badge{margin-top:-10px;margin-left:5px}.page-content-inner{padding:15px}.box{border:none;box-shadow:1px 1px 2px rgba(0,0,0,0.2);background-color:#fff;padding:15px;margin-bottom:15px}.box .nav-tabs{font-size:14px;font-weight:bold}.box .nav-tabs>li:first-child{margin-left:30px}.box .tab-content>.tab-pane{background-color:#fff;padding:20px;border:1px solid #ddd;border-top:none;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.box.box-nav-tabs{padding:0;background-color:#f5f5f5}.box.box-nav-tabs .nav-tabs{font-size:inherit;font-weight:inherit}.box.box-nav-tabs .nav-tabs>li{padding-top:8px}.box.box-nav-tabs .nav-tabs>li>a{margin-right:5px;border-top-left-radius:3px;border-top-right-radius:3px;padding:3px 15px;background-color:#e6e6e6;border:1px solid #ddd;border-bottom-color:transparent}.box.box-nav-tabs .nav-tabs>li.active>a{font-weight:bold;border:1px solid #ddd;border-bottom-color:transparent;background-color:#fff}.box.box-nav-tabs .tab-content>.tab-pane{padding:20px;border:none}.box-btn-bar{line-height:30px}.box-btn-bar a.btn{margin-right:20px}.page-filter{height:36px;line-height:36px;margin-bottom:10px}.page-filter .form-control{margin-top:5px;margin-right:4px}.form-group .input-group{margin-bottom:5px}.op_box{display:block;padding:5px;border-radius:3px;text-align:center;margin-top:5px}.op_error{background:#fbb}.op_wait{background:#ccc}.more-action{position:absolute !important}.more-action .dropdown-menu{background-color:rgba(60,60,60,0.9);color:#fff;font-size:13px}.more-action .dropdown-menu.dropdown-menu-left{margin-left:-120px}.more-action .dropdown-menu>li>a{padding:5px 20px;color:#fff}.more-action .dropdown-menu>li>a:hover,.more-action .dropdown-menu>li>a:active,.more-action .dropdown-menu>li>a:visited{background-color:#0084a7}.more-action .dropdown-menu .divider{margin:5px 0;background-color:#666}.popover-inline-edit input,.popover-inline-edit .btn{height:30px}.popover-inline-edit .popover-title{background-color:#ddd}.popover-inline-edit .popover-content{padding:20px 10px}.popover-inline-edit .popover{padding:0;max-width:500px}.popover-inline-edit .popover .popover-content{padding:10px 10px 20px 10px}.popover-inline-edit .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#ddd}.tp-table-filter{width:100%;height:25px;margin:0;padding:0}.tp-table-filter .tp-table-filter-inner{display:table;margin:0;padding:0}.tp-table-filter.tp-table-filter-input .tp-table-filter-inner{width:100%}.tp-table-filter.tp-table-filter-left .tp-table-filter-inner,.tp-table-filter.tp-table-filter-right .tp-table-filter-inner{width:auto}.tp-table-filter.tp-table-filter-center .tp-table-filter-inner{margin:0 auto}.tp-table-filter .search-title{display:table-cell;vertical-align:middle;height:25px;line-height:25px;color:#555;white-space:nowrap;width:1px;text-align:left}.tp-table-filter .search-input,.tp-table-filter .search-select{display:table-cell;text-align:left;height:25px}.tp-table-filter .search-input>.btn,.tp-table-filter .search-select>.btn{font-size:13px;background-color:transparent;border:none;padding:0 0 0 8px;border-radius:0}.tp-table-filter .search-input>.btn:active,.tp-table-filter .search-select>.btn:active{box-shadow:none}.tp-table-filter .search-input .dropdown-menu,.tp-table-filter .search-select .dropdown-menu{min-width:0;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;box-shadow:0 3px 6px rgba(0,0,0,0.3);border:none}.tp-table-filter .search-input .dropdown-menu>li>a,.tp-table-filter .search-select .dropdown-menu>li>a{padding-right:30px;min-width:100px;color:#fff}.tp-table-filter .search-input .dropdown-menu>li>a:hover,.tp-table-filter .search-select .dropdown-menu>li>a:hover,.tp-table-filter .search-input .dropdown-menu>li>a:active,.tp-table-filter .search-select .dropdown-menu>li>a:active,.tp-table-filter .search-input .dropdown-menu>li>a:visited,.tp-table-filter .search-select .dropdown-menu>li>a:visited{background-color:rgba(255,255,255,0.2)}.tp-table-filter .search-input .dropdown-menu .divider,.tp-table-filter .search-select .dropdown-menu .divider{margin:5px 0;background-color:#666}.tp-table-filter .search-input{width:100%;padding-left:10px}.tp-table-filter .search-input>.input-group .input-group-addon{font-size:13px;padding:0 5px}.tp-table-filter .search-input>.input-group input.form-control{font-size:13px;height:25px;width:100%;padding:0 5px}.btn.btn-no-border{font-size:13px;background-color:transparent;border:none;padding:0 0 0 8px;border-radius:0}.btn.btn-no-border:active{box-shadow:none}.table>tbody>tr.table-footer-action{background-color:transparent}.table>tbody>tr.table-footer-action>td{border-color:transparent;padding-top:15px;vertical-align:middle}.table-extend-area,.table-prefix-area{display:table;width:100%}.table-extend-area .table-extend-cell,.table-prefix-area .table-extend-cell{display:table-cell;height:24px;line-height:24px;padding:3px}.table-extend-area .table-extend-cell.table-extend-cell-right,.table-prefix-area .table-extend-cell.table-extend-cell-right{text-align:right}.table-extend-area .table-extend-cell .table-name,.table-prefix-area .table-extend-cell .table-name{font-size:120%;position:relative;top:3px;padding-right:10px}.table-extend-area .table-extend-cell .pagination,.table-prefix-area .table-extend-cell .pagination{margin:0 0}.table-extend-area .table-extend-cell .pagination>li>span,.table-prefix-area .table-extend-cell .pagination>li>span,.table-extend-area .table-extend-cell .pagination a,.table-prefix-area .table-extend-cell .pagination a{padding:3px 8px;font-size:12px;line-height:1.5}.table-extend-area .table-extend-cell.checkbox-select-all,.table-prefix-area .table-extend-cell.checkbox-select-all{width:36px;text-align:center}.table-extend-area .table-extend-cell.checkbox-select-all input,.table-prefix-area .table-extend-cell.checkbox-select-all input{position:relative;top:3px}.table-extend-area .table-extend-cell.group-actions>.btn-group .btn,.table-prefix-area .table-extend-cell.group-actions>.btn-group .btn{padding:5px 5px;font-size:12px}.table-extend-area .table-extend-cell.table-item-counter,.table-prefix-area .table-extend-cell.table-item-counter{text-align:right}.table-extend-area .table-extend-cell.table-item-counter ol,.table-prefix-area .table-extend-cell.table-item-counter ol{list-style:none;padding:0;margin:0;border:none;background-color:transparent;color:#666}.table-extend-area .table-extend-cell.table-item-counter ol>li,.table-prefix-area .table-extend-cell.table-item-counter ol>li{display:inline-block;padding-left:10px}.table-extend-area .table-extend-cell.table-item-counter .btn,.table-prefix-area .table-extend-cell.table-item-counter .btn{margin-top:-3px}.table-extend-area .table-extend-cell.table-item-counter .btn .caret,.table-prefix-area .table-extend-cell.table-item-counter .btn .caret{margin-top:-3px}.table-prefix-area{margin-bottom:10px}.table-prefix-area .table-extend-cell{padding:0}.btn-group.pagination .btn.dropdown-toggle{background-color:transparent;border:1px solid #999}textarea.textarea-resize-y{resize:vertical}textarea.textarea-resize-none{resize:none}textarea.textarea-code{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}textarea.cert_pub{width:100%;height:64px;border:1px solid #e2e2e2;background-color:#e4ffe5}.box ul.help-list{list-style:none;margin:0 0 10px 0;padding:0}.box ul.help-list li{padding:3px 3px 3px 20px;margin-left:10px}.box ul.help-list li:before{color:#999;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f05a";font-family:'Font Awesome 5 Free';font-weight:900}.box ul.help-list li em{color:#3374b0;font-style:normal}.tp-checkbox{display:inline-block;color:#747474}.tp-checkbox.tp-disabled{cursor:not-allowed;color:#c2c2c2}.tp-checkbox:before{display:inline-block;position:relative;top:1px;width:16px;content:"\f0c8";font-family:'Font Awesome 5 Free';font-weight:400}.tp-checkbox.tp-selected:before,.tp-checkbox.tp-checked:before{content:"\f14a";font-family:'Font Awesome 5 Free';font-weight:400}.tp-checkbox.tp-editable{cursor:pointer;color:#459dee}.tp-checkbox.tp-editable:hover{color:#53af43}.tp-checkbox.tp-editable.tp-selected,.tp-checkbox.tp-editable.tp-checked{color:#3374b0}i.upload-button{font-size:128px;color:#b1b1b1}i.upload-button:hover{cursor:pointer;color:#709cff}.assist-config .cfg-title{font-size:16px;font-weight:bold}.assist-config .form-group{margin-bottom:5px}.assist-config .col-sm-1,.assist-config .col-sm-2,.assist-config .col-sm-3,.assist-config .col-sm-4,.assist-config .col-sm-5,.assist-config .col-sm-6,.assist-config .col-sm-7,.assist-config .col-sm-8,.assist-config .col-sm-9,.assist-config .col-sm-10,.assist-config .col-sm-11{padding-left:3px;padding-right:3px}.assist-config .arg-detail ol,.assist-config .arg-detail ul{margin-bottom:0}.assist-config .arg-detail-common{background-color:#edfedf;border-radius:5px;padding:15px}.assist-config select,.assist-config .input-args{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.assist-config .desc{margin-top:5px;color:#6b6b6b}.assist-config .arg-varb{color:#393939;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;display:inline-block;width:180px}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}/*# sourceMappingURL=style.css.map */ \ No newline at end of file +@charset "utf-8";html{font-size:13px}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}a{text-decoration:none}a:link{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}a:visited{text-decoration:none}select{outline:none}label{font-weight:normal}hr.hr-sm{padding:1px 0;margin:5px 0;border-top:1px dashed #c4c4c4}hr.small{margin:5px 0}ul{list-style:none}ul.list{margin:0;padding:3px 0 5px 0}ul.list li{margin:3px 3px 5px 10px}button:focus{outline:none}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.important{color:#d45f1c}.error{color:#d34242}.bold{font-weight:bold}.btn-single-line{white-space:nowrap}.btn-single-line .btn:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.btn-single-line .btn:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dlg-protocol-group{margin-bottom:3px}.dlg-protocol-group ul{display:block;height:28px;margin:0;padding:0}.dlg-protocol-group ul li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc}.dlg-protocol-group ul li.item-name{width:120px}.dlg-protocol-group ul li.item-btn{background:none;padding:0;border:none}.dlg-protocol-group ul li.item-input{background:none;border:none;padding:0}.dlg-protocol-group ul li .form-control{line-height:1.5;margin:0;padding:4px 5px;font-size:12px;height:28px;border-radius:0;border-left:none;width:100px}.dlg-protocol-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.dlg-protocol-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.dlg-protocol-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:first-child .btn,.dlg-protocol-group ul li:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.dlg-protocol-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.dlg-protocol-group ul li:last-child .btn,.dlg-protocol-group ul li:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.os-icon-windows:after{content:"\f17a";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-linux:after{content:"\f17c";color:#fff;background-color:#333;font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-macos:after{content:"\f179";font-style:normal;text-align:center;width:1.25em;height:1.25em;line-height:1.25em;border-radius:50%;display:inline-block;font-family:"Font Awesome 5 Brands";font-weight:400}.os-icon-ubuntu:after,.os-icon-debian:after,.os-icon-centos:after,.os-icon-redhat:after{content:" ";width:24px;height:24px;line-height:24px;display:inline-block}.os-icon-ubuntu:after{background:url(../img/os-icon/ubuntu-24x24.png) no-repeat}.os-icon-debian:after{background:url(../img/os-icon/debian-24x24.png) no-repeat}.os-icon-centos:after{background:url(../img/os-icon/centos-24x24.png) no-repeat}.os-icon-redhat:after{background:url(../img/os-icon/redhat-24x24.png) no-repeat}.disable-bg{position:absolute;background:url(../img/css/disable-bg.png) repeat;opacity:.45;z-index:990}.disable-message{display:inline-block;font-size:160%;position:absolute;padding:20px 40px;border:1px solid #2b0002;background-color:#65181a;color:#fff;opacity:.85;z-index:991}.center{text-align:center}#page-container{min-width:1260px}.btn-group-sm>.btn{padding:3px 5px;font-size:12px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:none}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{padding:3px 6px;border-radius:10px;font-size:13px;font-weight:400;background-color:#999}.badge.badge-sm{font-size:12px;padding:3px 5px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-8px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999}.badge.badge-info{background-color:#33b7d0}.badge.badge-primary{background-color:#348fe2}.badge.badge-success{background-color:#368142}.badge.badge-warning{background-color:#f57523}.badge.badge-danger{background-color:#d34242}.btn-success .badge{color:#fff}.label{display:inline-block;padding:5px 10px;margin:2px;font-size:13px;font-weight:400;background-color:#999}.label.label-sm{font-size:12px;padding:3px 8px 4px 8px;margin-top:0;border-radius:3px}.label.label-ignore{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.label.label-info{background-color:#33b7d0}.label.label-primary{background-color:#348fe2}.label.label-success{background-color:#368142}.label.label-warning{background-color:#f57523}.label.label-danger{background-color:#d34242}.progress.progress-sm{height:18px;margin-bottom:2px;background-color:#aaa}.progress.progress-sm.button{cursor:pointer}.progress.progress-sm .progress-bar{display:block;font-size:11px;float:none}.modal-dialog .modal-content .modal-header{background-color:#f7f7f7}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{padding-right:5px;padding-left:5px}.input-group :-moz-placeholder{color:#d2d2d2}.input-group ::-moz-placeholder{color:#d2d2d2}.input-group input:-ms-input-placeholder,.input-group textarea:-ms-input-placeholder{color:#d2d2d2}.input-group input::-webkit-input-placeholder,.input-group textarea::-webkit-input-placeholder{color:#d2d2d2}.modal .modal-content{border-radius:0}.modal .modal-header .close{margin-top:-4px;margin-right:-6px}.modal .modal-header .close:hover{color:#9c3023;opacity:1}.modal .modal-header .close:active,.modal .modal-header .close:focus,.modal .modal-header .close:visited{-webkit-appearance:none}.modal .form-horizontal .form-group,.modal .row{margin-left:0;margin-right:0;padding-bottom:8px}.alert{border-radius:0;padding:5px;margin-bottom:10px}.dropdown-menu{min-width:0;font-size:13px}.form-control-sm{padding:3px 5px;font-size:13px;height:inherit}.form-group .control-label.require{color:#505050;font-weight:bold}.form-group .control-label.require:before{color:#ac4e43;position:absolute;margin-left:-1.2em;content:"\f069";font-family:'Font Awesome 5 Free';font-weight:900}.form-group .control-desc{padding-top:6px;color:#999}.form-group .control-desc-sm{color:#999;padding-top:7px;font-size:12px}.form-group .control-desc-sm-input{color:#999;padding-top:3px;font-size:12px}label.form-control-static input{display:inline-block;position:relative;margin-top:4px}.control-desc .popover{max-width:none;font-size:13px}.table-extend-cell .btn-group-sm .btn,.table-prefix-area .btn-group-sm .btn{padding:5px 5px}.table.table-role .header{font-size:120%;margin-top:8px}.table.table-role td{text-align:left;vertical-align:top;padding:0}.table.table-role td.role-name{min-width:160px}.table.table-role td.role-name ul{list-style:none;margin:0;padding:0}.table.table-role td.role-name ul li{padding:8px 30px 8px 6px;white-space:nowrap}.table.table-role td.role-name ul li:first-child{margin-top:10px}.table.table-role td.role-name ul li.active{color:#fff;background-color:#4091dd}.table.table-role td.role-name ul li.active:hover{background-color:#4091dd;cursor:auto}.table.table-role td.role-name ul li:hover{background-color:#81b6e9;cursor:pointer}.table.table-role td.role-privilege{padding:0 0 10px 10px;border-left:3px solid #4091dd}.table.table-role td.role-privilege hr{margin:8px 0;border-bottom:1px solid rgba(255,255,255,0.3)}.table.table-role td.role-privilege .title{font-size:110%;margin:5px 0}.table.table-role td.role-privilege ul{list-style:none;margin:0;padding:0}.table.table-role td.role-privilege ul li{display:inline-block;width:180px;margin-bottom:5px;margin-left:10px}.table.table-role td.role-privilege ul li span{color:#8e8e8e}.table.table-role td.role-privilege ul li span:before{display:inline-block;width:16px;content:"\f0c8";font-family:'Font Awesome 5 Free';font-weight:400}.table.table-role td.role-privilege ul li span.enabled{color:#3374b0}.table.table-role td.role-privilege ul li span.enabled:before{content:"\f14a";font-family:'Font Awesome 5 Free';font-weight:400}.table.table-role td.role-privilege.editable li span{cursor:pointer}.table.table-role tr:first-child td{border-top:none}#btn-create-role{margin-top:15px}.table{margin-bottom:10px}.table>thead>tr>th{vertical-align:middle;border-bottom:2px solid #ddd}.table.table-info-list{width:auto}.table.table-info-list td{border-top:1px dotted #ddd;padding:5px 5px;vertical-align:top}.table.table-info-list td.key{text-align:right;width:1px;white-space:nowrap}.table.table-info-list td.value{text-align:left;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;color:#3e3e3e}.table.table-info-list td .error{color:#cc3632;font-weight:bold}.table.table-info-list td .disabled{color:#848484}.table.table-info-list.table-info-list-lite{width:100%}.table.table-info-list.table-info-list-lite td{padding:5px 5px}.table.table-info-list.table-info-list-lite td.value{font-weight:normal}.table.table-info-list tr:first-child td{border-top:none}.table.table-config-list{width:100%}.table.table-config-list td{border:none;padding:5px}.table.table-config-list td.title{text-align:left;font-size:110%;font-weight:bolder}.table.table-config-list td.key{width:1px;white-space:nowrap;text-align:right;padding-right:15px}.table.table-config-list td.value{text-align:left}.table.table-config-list td.value input{width:4em;padding:0 5px;text-align:right}.table.table-config-list td.value .unit{margin-left:5px}.table.table-config-list td.value .desc{color:#999;margin-left:15px;display:inline-block}.table>thead>tr>th{padding:5px 5px;outline:none;white-space:nowrap;font-weight:normal;text-align:center;background-color:#ededed}.table>tbody>tr>td{padding:5px;text-align:center;vertical-align:middle}.table>tbody>tr>td .nowrap{white-space:nowrap}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.table.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer}.table.table-data thead .sorting:after,.table.table-data thead .sorting_asc:after,.table.table-data thead .sorting_desc:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'Font Awesome 5 Free';font-weight:900;opacity:.8}.table.table-data thead .sorting:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc:after{content:"\f0de"}.table.table-data thead .sorting_desc:after{content:"\f0dd"}.host-name{font-size:16px}.host-name-desc{cursor:pointer}.host-ip{font-size:12px;color:#999;display:inline-block;white-space:nowrap;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;overflow:hidden;text-overflow:ellipsis}.td-ip-list{padding-right:20px;padding-left:5px}.td-ip-show-more{font-size:14px;width:12px;float:right;display:block}.td-ip-item{min-width:12em;width:12em;height:18px;padding:2px 4px;margin:1px 0;color:#333;text-align:center;white-space:nowrap;border-radius:9px;line-height:11px;font-size:11px;background:#dfdfdf !important}.td-ip-item span{display:inline-block;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.remote-action-group{display:inline-block;margin-bottom:3px;height:28px}.remote-action-group .btn-group-sm>.btn{margin:0;font-size:12px;height:28px;min-width:80px}.remote-action-group .btn-group-sm>.btn.dropdown-toggle{min-width:0}.remote-action-group .btn-group-sm>.btn.btn-disabled{background-color:#e5e5e5;color:#aaa}.remote-action-group>li{float:left;position:relative;display:block;height:28px;padding:4px 5px;background-color:#eee;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;font-size:12px}.remote-action-group>li.remote-action-state{text-align:center;white-space:nowrap;height:28px}.remote-action-group>li.remote-action-state.state-disabled{background-color:#e5e5e5;color:#aaa;text-shadow:-1px -1px 1px #fff}.remote-action-group>li.remote-action-state.state-disabled>i.fa{color:#b53a2f}.remote-action-group>li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group>li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.remote-config{display:inline-block;margin-left:20px}.remote-config button{margin:0;font-size:12px;height:28px;min-width:80px}.remote-info-group{margin-bottom:3px;height:28px}.remote-info-group ul{display:inline-block;height:28px;margin:0;padding:0}.remote-info-group ul li{float:left;position:relative;display:block;height:28px;line-height:28px;border:none}.rdp-options{position:absolute;display:none;left:10px;top:30px;border:1px solid rgba(0,0,0,0.25);z-index:9999;background-color:#fff;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,0.2);font-size:13px}.rdp-options hr{margin:3px 0}.rdp-options .title{background-color:#eee;padding:5px 5px;font-weight:bold}.rdp-options .item{width:100%;padding:3px 20px}.rdp-options .item .radio,.rdp-options .item .checkbox{margin:0;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.rdp-options .item .center{text-align:center}body.page-header-fixed{padding-top:48px}body.page-sidebar-fixed .page-sidebar{position:fixed}body.page-sidebar-fixed .page-content{margin-left:180px}.page-header{border:none;box-shadow:0 0 3px rgba(0,0,0,0.5)}.page-header.navbar{overflow:hidden;min-height:48px;height:48px;margin:0}.page-header.navbar .brand{display:inline-block;float:left;width:180px;height:48px;padding:12px 0 0;text-align:center;margin:0 auto;background-color:#3a3a3a}.page-header.navbar .brand .logo{display:inline-block;width:93px;height:30px;background:url(../img/site-logo-small.png) no-repeat}.page-header.navbar .breadcrumb-container{display:inline-block;padding-top:6px}.page-header.navbar .breadcrumb-container .breadcrumb{background-color:transparent;padding-left:20px;font-size:16px}.page-header.navbar .breadcrumb-container .breadcrumb>li+li:before{content:"\f105";font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-header.navbar .breadcrumb-container .breadcrumb.breadcrumb-list>li{font-size:13px}.page-header.navbar .breadcrumb-container .breadcrumb.breadcrumb-list>li+li:before{content:" ";margin:0 5px}.page-header .container-fluid{padding-left:0}.page-sidebar{top:48px;bottom:0;left:0;width:180px;padding-top:0;z-index:1010;background-color:#3a3a3a}.page-sidebar .nav-menu>li>a{padding:8px 0 8px 20px;line-height:24px;font-size:13px;color:#c2c2c2;border-left:5px solid #3a3a3a}.page-sidebar .nav-menu>li>a:focus{background-color:#3a3a3a;border-left:5px solid #3a3a3a}.page-sidebar .nav-menu>li>a:hover{background-color:#2d2d2d;border-left:5px solid #005c74}.page-sidebar .nav-menu>li>a.selected{border-left:5px solid #00485b}.page-sidebar .nav-menu>li>a.selected:focus{border-left:5px solid #00485b}.page-sidebar .nav-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.page-sidebar .nav-menu>li>a.active:hover{border-left:5px solid #00acda}.page-sidebar .nav-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:1px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:20px;line-height:24px;margin-right:-6px}.page-sidebar .nav-menu li .menu-caret:after{display:inline-block;width:12px;height:12px;margin-left:5px;top:1px;position:relative;border:none;font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-sidebar .nav-menu li .menu-caret:after{content:'\f105'}.page-sidebar .nav-menu li.expand .menu-caret:after{content:'\f107'}.page-sidebar .nav-menu>li>a>i.icon{float:left;margin-top:1px;margin-right:15px;text-align:center;line-height:24px;font-size:14px}.page-sidebar .sub-menu{padding:0;margin:0;background-color:#292929;position:relative;list-style-type:none;border-top:1px solid #202020;border-bottom:1px solid #464646}.page-sidebar .sub-menu>li>a{padding:8px 0 8px 40px;line-height:20px;font-size:13px;display:block;position:relative;color:#889097;border-left:5px solid #292929}.page-sidebar .sub-menu>li>a:before{display:inline-block;padding-right:8px;line-height:20px;content:"\f0da";font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900}.page-sidebar .sub-menu>li>a:hover{color:#fff;border-left:5px solid #005c74}.page-sidebar .sub-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.page-sidebar .sub-menu>li>a.active:hover{border-left:5px solid #00acda}.page-sidebar .sub-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:-1px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:18px;line-height:24px;margin-right:-6px}.page-sidebar .nav-menu>li.profile{padding:10px 10px;color:#ccc;background-color:#333;border-bottom:1px solid #464646}.page-sidebar .nav-menu>li.profile a.title{color:#ccc}.page-sidebar .nav-menu>li.profile a.title:hover{color:#fff;background-color:transparent}.page-sidebar .nav-menu>li.profile a.title:focus{background-color:transparent}.page-sidebar .nav-menu>li.profile .image{float:left;margin-top:3px;font-size:24px;color:#69f;width:36px;height:36px;border-radius:6px;background-color:#eee;text-align:center;margin-right:10px;overflow:hidden}.page-sidebar .nav-menu>li.profile .image img{margin-top:-3px}.page-sidebar .nav-menu>li.profile .name{display:block;padding-top:3px;font-size:14px}.page-sidebar .nav-menu>li.profile .role{display:block;font-size:12px;color:#999}.page-sidebar .nav-menu>li.profile.active{background-color:#0084a7;color:#fff}.page-sidebar .nav-menu>li.profile.active .name,.page-sidebar .nav-menu>li.profile.active .role{color:#fff}.page-sidebar .nav-menu>li.profile.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:absolute;top:0;right:-1px;display:inline-block;font-style:normal;font-weight:400;color:#e9e9e9;font-size:24px;line-height:61px;margin-right:-6px}.page-sidebar .nav-menu>li.profile .dropdown-menu{min-width:0;font-size:13px}.page-sidebar .nav-menu>li.profile .dropdown-menu>li>a{padding-right:30px}.page-sidebar .nav-menu>li.profile .dropdown-menu>li>a:hover{background-color:#ccc}.page-sidebar .nav-menu>li.profile .dropdown-menu .divider{margin:5px 0}.page-sidebar .badge{margin-top:-10px;margin-left:5px}.page-content-inner{padding:15px}.box{border:none;box-shadow:1px 1px 2px rgba(0,0,0,0.2);background-color:#fff;padding:15px;margin-bottom:15px}.box .nav-tabs{font-size:14px;font-weight:bold}.box .nav-tabs>li:first-child{margin-left:30px}.box .tab-content>.tab-pane{background-color:#fff;padding:20px;border:1px solid #ddd;border-top:none;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.box.box-nav-tabs{padding:0;background-color:#f5f5f5}.box.box-nav-tabs .nav-tabs{font-size:inherit;font-weight:inherit}.box.box-nav-tabs .nav-tabs>li{padding-top:8px}.box.box-nav-tabs .nav-tabs>li>a{margin-right:5px;border-top-left-radius:3px;border-top-right-radius:3px;padding:3px 15px;background-color:#e6e6e6;border:1px solid #ddd;border-bottom-color:transparent}.box.box-nav-tabs .nav-tabs>li.active>a{font-weight:bold;border:1px solid #ddd;border-bottom-color:transparent;background-color:#fff}.box.box-nav-tabs .tab-content>.tab-pane{padding:20px;border:none}.box-btn-bar{line-height:30px}.box-btn-bar a.btn{margin-right:20px}.page-filter{height:36px;line-height:36px;margin-bottom:10px}.page-filter .form-control{margin-top:5px;margin-right:4px}.op_box{display:block;padding:5px;border-radius:3px;text-align:center;margin-top:5px}.op_error{background:#fbb}.op_wait{background:#ccc}.more-action{position:absolute !important}.more-action .dropdown-menu{background-color:rgba(60,60,60,0.9);color:#fff;font-size:13px}.more-action .dropdown-menu.dropdown-menu-left{margin-left:-120px}.more-action .dropdown-menu>li>a{padding:5px 20px;color:#fff}.more-action .dropdown-menu>li>a:hover,.more-action .dropdown-menu>li>a:active,.more-action .dropdown-menu>li>a:visited{background-color:#0084a7}.more-action .dropdown-menu .divider{margin:5px 0;background-color:#666}.popover-inline-edit input,.popover-inline-edit .btn{height:30px}.popover-inline-edit .popover-title{background-color:#ddd}.popover-inline-edit .popover-content{padding:20px 10px}.popover-inline-edit .popover{padding:0;max-width:500px}.popover-inline-edit .popover .popover-content{padding:10px 10px 20px 10px}.popover-inline-edit .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#ddd}.tp-table-filter{width:100%;height:25px;margin:0;padding:0}.tp-table-filter .tp-table-filter-inner{display:table;margin:0;padding:0}.tp-table-filter.tp-table-filter-input .tp-table-filter-inner{width:100%}.tp-table-filter.tp-table-filter-left .tp-table-filter-inner,.tp-table-filter.tp-table-filter-right .tp-table-filter-inner{width:auto}.tp-table-filter.tp-table-filter-center .tp-table-filter-inner{margin:0 auto}.tp-table-filter .search-title{display:table-cell;vertical-align:middle;height:25px;line-height:25px;color:#555;white-space:nowrap;width:1px;text-align:left}.tp-table-filter .search-input,.tp-table-filter .search-select{display:table-cell;text-align:left;height:25px}.tp-table-filter .search-input>.btn,.tp-table-filter .search-select>.btn{font-size:13px;background-color:transparent;border:none;padding:0 0 0 8px;border-radius:0}.tp-table-filter .search-input>.btn:active,.tp-table-filter .search-select>.btn:active{box-shadow:none}.tp-table-filter .search-input .dropdown-menu,.tp-table-filter .search-select .dropdown-menu{min-width:0;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;box-shadow:0 3px 6px rgba(0,0,0,0.3);border:none}.tp-table-filter .search-input .dropdown-menu>li>a,.tp-table-filter .search-select .dropdown-menu>li>a{padding-right:30px;min-width:100px;color:#fff}.tp-table-filter .search-input .dropdown-menu>li>a:hover,.tp-table-filter .search-select .dropdown-menu>li>a:hover,.tp-table-filter .search-input .dropdown-menu>li>a:active,.tp-table-filter .search-select .dropdown-menu>li>a:active,.tp-table-filter .search-input .dropdown-menu>li>a:visited,.tp-table-filter .search-select .dropdown-menu>li>a:visited{background-color:rgba(255,255,255,0.2)}.tp-table-filter .search-input .dropdown-menu .divider,.tp-table-filter .search-select .dropdown-menu .divider{margin:5px 0;background-color:#666}.tp-table-filter .search-input{width:100%;padding-left:10px}.tp-table-filter .search-input>.input-group .input-group-addon{font-size:13px;padding:0 5px}.tp-table-filter .search-input>.input-group input.form-control{font-size:13px;height:25px;width:100%;padding:0 5px}.btn.btn-no-border{font-size:13px;background-color:transparent;border:none;padding:0 0 0 8px;border-radius:0}.btn.btn-no-border:active{box-shadow:none}.table>tbody>tr.table-footer-action{background-color:transparent}.table>tbody>tr.table-footer-action>td{border-color:transparent;padding-top:15px;vertical-align:middle}.table-extend-area,.table-prefix-area{display:table;width:100%}.table-extend-area .table-extend-cell,.table-prefix-area .table-extend-cell{display:table-cell;height:24px;line-height:24px;padding:3px}.table-extend-area .table-extend-cell.table-extend-cell-right,.table-prefix-area .table-extend-cell.table-extend-cell-right{text-align:right}.table-extend-area .table-extend-cell .table-name,.table-prefix-area .table-extend-cell .table-name{font-size:120%;position:relative;top:3px;padding-right:10px}.table-extend-area .table-extend-cell .pagination,.table-prefix-area .table-extend-cell .pagination{margin:0 0}.table-extend-area .table-extend-cell .pagination>li>span,.table-prefix-area .table-extend-cell .pagination>li>span,.table-extend-area .table-extend-cell .pagination a,.table-prefix-area .table-extend-cell .pagination a{padding:3px 8px;font-size:12px;line-height:1.5}.table-extend-area .table-extend-cell.checkbox-select-all,.table-prefix-area .table-extend-cell.checkbox-select-all{width:36px;text-align:center}.table-extend-area .table-extend-cell.checkbox-select-all input,.table-prefix-area .table-extend-cell.checkbox-select-all input{position:relative;top:3px}.table-extend-area .table-extend-cell.group-actions>.btn-group .btn,.table-prefix-area .table-extend-cell.group-actions>.btn-group .btn{padding:5px 5px;font-size:12px}.table-extend-area .table-extend-cell.table-item-counter,.table-prefix-area .table-extend-cell.table-item-counter{text-align:right}.table-extend-area .table-extend-cell.table-item-counter ol,.table-prefix-area .table-extend-cell.table-item-counter ol{list-style:none;padding:0;margin:0;border:none;background-color:transparent;color:#666}.table-extend-area .table-extend-cell.table-item-counter ol>li,.table-prefix-area .table-extend-cell.table-item-counter ol>li{display:inline-block;padding-left:10px}.table-extend-area .table-extend-cell.table-item-counter .btn,.table-prefix-area .table-extend-cell.table-item-counter .btn{margin-top:-3px}.table-extend-area .table-extend-cell.table-item-counter .btn .caret,.table-prefix-area .table-extend-cell.table-item-counter .btn .caret{margin-top:-3px}.table-prefix-area{margin-bottom:10px}.table-prefix-area .table-extend-cell{padding:0}.btn-group.pagination .btn.dropdown-toggle{background-color:transparent;border:1px solid #999}textarea.textarea-resize-y{resize:vertical}textarea.textarea-resize-none{resize:none}textarea.textarea-code{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}textarea.cert_pub{width:100%;height:64px;border:1px solid #e2e2e2;background-color:#e4ffe5}.box ul.help-list{list-style:none;margin:0 0 10px 0;padding:0}.box ul.help-list li{padding:3px 3px 3px 20px;margin-left:10px}.box ul.help-list li:before{color:#999;position:absolute;margin-left:-1.2em;margin-top:1px;content:"\f05a";font-family:'Font Awesome 5 Free';font-weight:900}.box ul.help-list li em{color:#3374b0;font-style:normal}.tp-checkbox{display:inline-block;color:#747474}.tp-checkbox.tp-disabled{cursor:not-allowed;color:#c2c2c2}.tp-checkbox:before{display:inline-block;position:relative;top:1px;width:16px;content:"\f0c8";font-family:'Font Awesome 5 Free';font-weight:400}.tp-checkbox.tp-selected:before,.tp-checkbox.tp-checked:before{content:"\f14a";font-family:'Font Awesome 5 Free';font-weight:400}.tp-checkbox.tp-editable{cursor:pointer;color:#459dee}.tp-checkbox.tp-editable:hover{color:#53af43}.tp-checkbox.tp-editable.tp-selected,.tp-checkbox.tp-editable.tp-checked{color:#3374b0}i.upload-button{font-size:128px;color:#b1b1b1}i.upload-button:hover{cursor:pointer;color:#709cff}.assist-config .cfg-title{font-size:16px;font-weight:bold}.assist-config .form-group{margin-bottom:5px}.assist-config .col-sm-1,.assist-config .col-sm-2,.assist-config .col-sm-3,.assist-config .col-sm-4,.assist-config .col-sm-5,.assist-config .col-sm-6,.assist-config .col-sm-7,.assist-config .col-sm-8,.assist-config .col-sm-9,.assist-config .col-sm-10,.assist-config .col-sm-11{padding-left:3px;padding-right:3px}.assist-config .arg-detail ol,.assist-config .arg-detail ul{margin-bottom:0}.assist-config .arg-detail-common{background-color:#edfedf;border-radius:5px;padding:15px}.assist-config select,.assist-config .input-args{font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace}.assist-config .desc{margin-top:5px;color:#6b6b6b}.assist-config .arg-varb{color:#393939;font-weight:bold;font-family:Monaco,Lucida Console,Consolas,Courier,'Courier New',monospace;display:inline-block;width:180px}#gritter-notice-wrapper{z-index:9999}.gritter-bottom,.gritter-item,.gritter-top{background:rgba(0,0,0,0.8) !important}.gritter-top{border-top-left-radius:3px;border-top-right-radius:3px}.gritter-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.gritter-close,.gritter-light .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%}.gritter-close:before,.gritter-light .gritter-close:before{content:'\f00d' !important;font-family:'Font Awesome 5 Free' !important;font-weight:900 !important;font-size:9px !important;width:16px !important;height:16px !important;line-height:16px !important;color:#fff !important;text-indent:0 !important;position:absolute !important;text-align:center !important;right:0 !important;top:0 !important}.gritter-title{font-size:13px !important;line-height:16px !important;padding-bottom:5px !important;font-weight:400 !important;color:#fff !important;text-shadow:none !important}.gritter-item{color:#aaa !important;font-size:13px !important;padding:2px 15px 5px !important}.gritter-error .gritter-bottom,.gritter-error .gritter-item,.gritter-error .gritter-top{background:rgba(123,32,32,0.9) !important}.gritter-error .gritter-title{color:#fff !important}.gritter-error .gritter-item{color:#ddd !important}.gritter-error .gritter-close{left:auto !important;right:5px !important;top:5px !important;width:16px !important;height:16px !important;line-height:16px !important;display:block !important;border-radius:50%;background:#e33b3b !important}.gritter-success .gritter-bottom,.gritter-success .gritter-item,.gritter-success .gritter-top{background:rgba(1,65,16,0.9) !important}.gritter-success .gritter-title{color:#ddd !important}.gritter-success .gritter-item{color:#ccc !important}.gritter-success .gritter-close{background:#0eb320 !important}#gritter-notice-wrapper{width:320px;max-width:480px}/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/server/www/teleport/static/js/asset/host-list.js b/server/www/teleport/static/js/asset/host-list.js index 373c9b9..67e5d56 100644 --- a/server/www/teleport/static/js/asset/host-list.js +++ b/server/www/teleport/static/js/asset/host-list.js @@ -33,7 +33,7 @@ $app.create_controls = function (cb_stack) { //------------------------------- // 主机列表表格 //------------------------------- - var table_host_options = { + let table_host_options = { dom_id: 'table-host', data_source: { type: 'ajax-post', @@ -190,7 +190,7 @@ $app.create_controls = function (cb_stack) { $app.dom.dlg_import_asset.modal({backdrop: 'static'}); }); $app.dom.chkbox_host_select_all.click(function () { - var _objects = $('#' + $app.table_host.dom_id + ' tbody').find('[data-check-box]'); + let _objects = $('#' + $app.table_host.dom_id + ' tbody').find('[data-check-box]'); if ($(this).is(':checked')) { $.each(_objects, function (i, _obj) { $(_obj).prop('checked', true); @@ -227,8 +227,8 @@ $app.on_table_host_cell_created = function (tbl, row_id, col_key, cell_obj) { } else if (col_key === 'action') { // 绑定系统选择框事件 cell_obj.find('[data-action]').click(function () { - var host = $app.table_host.get_row(row_id); - var action = $(this).attr('data-action'); + let host = $app.table_host.get_row(row_id); + let action = $(this).attr('data-action'); if (action === 'edit') { $app.dlg_edit_host.show_edit(row_id); } else if (action === 'account') { @@ -265,12 +265,12 @@ $app.on_table_host_cell_created = function (tbl, row_id, col_key, cell_obj) { $app.on_table_host_render_created = function (render) { render.filter_state = function (header, title, col) { - var _ret = ['
']; + let _ret = ['
']; _ret.push('
'); _ret.push('
' + title + '
'); // 表格内嵌过滤器的DOM实体在这时生成 - var filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); + let filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); _ret.push(filter_ctrl.render()); _ret.push('
'); @@ -279,12 +279,12 @@ $app.on_table_host_render_created = function (render) { }; render.filter_search = function (header, title, col) { - var _ret = ['
']; + let _ret = ['
']; _ret.push('
'); _ret.push('
' + title + '
'); // 表格内嵌过滤器的DOM实体在这时生成 - var filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); + let filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); _ret.push(filter_ctrl.render()); _ret.push('
'); @@ -297,7 +297,7 @@ $app.on_table_host_render_created = function (render) { }; render.host_info = function (row_id, fields) { - var title, sub_title; + let title, sub_title; title = fields.name; sub_title = fields.ip; @@ -306,7 +306,7 @@ $app.on_table_host_render_created = function (render) { title = fields.ip; } - var desc = []; + let desc = []; if (fields.desc.length > 0) { desc.push(fields.desc.replace(/\r/ig, "").replace(/\n/ig, "
")); } @@ -314,7 +314,7 @@ $app.on_table_host_render_created = function (render) { sub_title += ',由 ' + fields.router_ip + ':' + fields.router_port + ' 路由'; } - var ret = []; + let ret = []; // ret.push('
' + title + ''); // if (desc.length > 0) { // ret.push(''); h.push(''); @@ -433,7 +433,7 @@ $app.on_table_host_header_created = function (header) { }); // TODO: 当过滤器不是默认值时,让“重置过滤器按钮”有呼吸效果,避免用户混淆 - 实验性质 - // var t1 = function(){ + // let t1 = function(){ // $app.dom.btn_table_host_reset_filter.fadeTo(1000, 1.0, function(){ // $app.dom.btn_table_host_reset_filter.fadeTo(1000, 0.2, t1); // }); @@ -447,8 +447,8 @@ $app.on_table_host_header_created = function (header) { }; $app.check_host_all_selected = function (cb_stack) { - var _all_checked = true; - var _objs = $('#' + $app.table_host.dom_id + ' tbody').find('[data-check-box]'); + let _all_checked = true; + let _objs = $('#' + $app.table_host.dom_id + ' tbody').find('[data-check-box]'); if (_objs.length === 0) { _all_checked = false; } else { @@ -472,15 +472,15 @@ $app.check_host_all_selected = function (cb_stack) { $app.on_btn_select_file_click = function () { - var html = ''; + let html = ''; $('body').after($(html)); - var btn_file_selector = $("#file-selector"); + let btn_file_selector = $("#file-selector"); btn_file_selector.change(function () { $app.dom.upload_file_message.hide(); - // var dom_file_name = $('#upload-file-name'); + // let dom_file_name = $('#upload-file-name'); - var file = null; + let file = null; if (btn_file_selector[0].files && btn_file_selector[0].files[0]) { file = btn_file_selector[0].files[0]; } else if (btn_file_selector[0].files && btn_file_selector[0].files.item(0)) { @@ -492,7 +492,7 @@ $app.on_btn_select_file_click = function () { return; } - var _ext = file.name.substring(file.name.lastIndexOf('.')).toLocaleLowerCase(); + let _ext = file.name.substring(file.name.lastIndexOf('.')).toLocaleLowerCase(); if (_ext !== '.csv') { $app.dom.upload_file_info.html('抱歉,仅支持导入 csv 格式的文件!'); return; @@ -503,7 +503,7 @@ $app.on_btn_select_file_click = function () { return; } - var fileInfo = ''; + let fileInfo = ''; fileInfo += file.name; fileInfo += '
'; fileInfo += tp_size2str(file.size, 2); @@ -526,7 +526,7 @@ $app.on_btn_do_upload_click = function () { .show(); - var param = {}; + let param = {}; $.ajaxFileUpload({ url: "/asset/upload-import",// 需要链接到服务器地址 fileElementId: "file-selector", // 文件选择框的id属性 @@ -538,7 +538,7 @@ $app.on_btn_do_upload_click = function () { console.log(data); $('#file-selector').remove(); - var ret = JSON.parse(data); + let ret = JSON.parse(data); console.log(ret); if (ret.code === TPE_OK) { @@ -549,10 +549,10 @@ $app.on_btn_do_upload_click = function () { $app.table_host.load_data(); } else { - var err_msg = [' 资产导入失败:' + ret.message]; + let err_msg = [' 资产导入失败:' + ret.message]; if (!_.isUndefined(ret.data)) { err_msg.push('
'); - var err_lines = []; + let err_lines = []; $.each(ret.data, function (i, item) { err_lines.push('第' + item.line + '行:' + item.error); }); @@ -580,11 +580,11 @@ $app.show_user_info = function (row_id) { }; $app.get_selected_host = function (tbl) { - var items = []; - var _objs = $('#' + $app.table_host.dom_id + ' tbody tr td input[data-check-box]'); + let items = []; + let _objs = $('#' + $app.table_host.dom_id + ' tbody tr td input[data-check-box]'); $.each(_objs, function (i, _obj) { if ($(_obj).is(':checked')) { - var _row_data = tbl.get_row(_obj); + let _row_data = tbl.get_row(_obj); // _all_checked = false; items.push(_row_data.id); } @@ -609,7 +609,7 @@ $app._lock_hosts = function (host_ids) { }; $app.on_btn_lock_host_click = function () { - var items = $app.get_selected_host($app.table_host); + let items = $app.get_selected_host($app.table_host); if (items.length === 0) { $tp.notify_error('请选择要禁用的主机!'); return; @@ -635,7 +635,7 @@ $app._unlock_hosts = function (host_ids) { }; $app.on_btn_unlock_host_click = function () { - var items = $app.get_selected_host($app.table_host); + let items = $app.get_selected_host($app.table_host); if (items.length === 0) { $tp.notify_error('请选择要解禁的主机!'); return; @@ -645,7 +645,7 @@ $app.on_btn_unlock_host_click = function () { }; $app._remove_hosts = function (host_ids) { - var _fn_sure = function (cb_stack) { + let _fn_sure = function (cb_stack) { $tp.ajax_post_json('/asset/update-hosts', {action: 'remove', hosts: host_ids}, function (ret) { if (ret.code === TPE_OK) { @@ -665,7 +665,7 @@ $app._remove_hosts = function (host_ids) { ); }; - var cb_stack = CALLBACK_STACK.create(); + let cb_stack = CALLBACK_STACK.create(); $tp.dlg_confirm(cb_stack, { msg: '

注意:删除操作不可恢复!!

删除主机将同时删除与之相关的账号,并将主机和账号从所在分组中移除,同时删除所有相关授权!

如果您希望临时禁止登录指定主机,可将其“禁用”!

您确定要移除选定的' + host_ids.length + '个主机吗?

', fn_yes: _fn_sure @@ -673,7 +673,7 @@ $app._remove_hosts = function (host_ids) { }; $app.on_btn_remove_host_click = function () { - var items = $app.get_selected_host($app.table_host); + let items = $app.get_selected_host($app.table_host); if (items.length === 0) { $tp.notify_error('请选择要删除的主机!'); return; @@ -683,7 +683,7 @@ $app.on_btn_remove_host_click = function () { }; $app.create_dlg_edit_host = function () { - var dlg = {}; + let dlg = {}; dlg.dom_id = 'dlg-edit-host'; dlg.field_id = -1; // 主机id(仅编辑模式) // dlg.field_type = -1; @@ -716,7 +716,7 @@ $app.create_dlg_edit_host = function () { }; dlg.init = function (cb_stack) { - var html = []; + let html = []; // // 创建类型选择框 // html.push(''); @@ -730,10 +730,10 @@ $app.create_dlg_edit_host = function () { // // // 绑定类型选择框事件 // $('#' + dlg.dom_id + ' li a[data-type-selector]').click(function () { - // var select = parseInt($(this).attr('data-type-selector')); + // let select = parseInt($(this).attr('data-type-selector')); // if (dlg.field_type === select) // return; - // var name = $app.id2name($app.host_types, select); + // let name = $app.id2name($app.host_types, select); // if (_.isUndefined(name)) { // name = '选择主机类型角色'; // dlg.field_type = -1; @@ -772,9 +772,9 @@ $app.create_dlg_edit_host = function () { }; dlg.init_fields = function (host) { - // var type_name = '选择主机类型'; + // let type_name = '选择主机类型'; // dlg.field_type = -1; - // var os_name = '选择操作系统'; + // let os_name = '选择操作系统'; dlg.field_id = -1; dlg.field_os_type = -1; @@ -792,7 +792,7 @@ $app.create_dlg_edit_host = function () { dlg.field_id = host.id; dlg.dom.dlg_title.html('编辑主机:'); - var _name = $app.id2name($app.host_os_type, host.os_type); + let _name = $app.id2name($app.host_os_type, host.os_type); if (!_.isUndefined(_name)) { // os_name = _name; } @@ -831,7 +831,7 @@ $app.create_dlg_edit_host = function () { }; dlg.show_edit = function (row_id) { - var host = $app.table_host.get_row(row_id); + let host = $app.table_host.get_row(row_id); dlg.init_fields(host); dlg.dom.dialog.modal({backdrop: 'static'}); }; @@ -909,14 +909,14 @@ $app.create_dlg_edit_host = function () { if (!dlg.check_input()) return; - var action = (dlg.field_id === -1) ? '添加' : '更新'; + let action = (dlg.field_id === -1) ? '添加' : '更新'; - // var router_addr = ''; + // let router_addr = ''; // if (dlg.field_conn_mode === 1) { // router_addr = dlg.field_router_ip + ':' + dlg.field_router_port; // } - var args = { + let args = { id: dlg.field_id, os_type: dlg.field_os_type, ip: dlg.field_ip, @@ -948,7 +948,7 @@ $app.create_dlg_edit_host = function () { }; $app.create_dlg_accounts = function () { - var dlg = {}; + let dlg = {}; dlg.dom_id = 'dlg-accounts'; dlg.host_row_id = -1; dlg.host = null; @@ -977,7 +977,7 @@ $app.create_dlg_accounts = function () { // 账号列表表格 //------------------------------- - var table_acc_options = { + let table_acc_options = { dom_id: 'table-acc', data_source: { type: 'none' @@ -1069,7 +1069,7 @@ $app.create_dlg_accounts = function () { }); dlg.dom.chkbox_acc_select_all.click(function () { - var _objects = $('#' + $app.table_acc.dom_id + ' tbody').find('[data-check-box]'); + let _objects = $('#' + $app.table_acc.dom_id + ' tbody').find('[data-check-box]'); if ($(this).is(':checked')) { $.each(_objects, function (i, _obj) { $(_obj).prop('checked', true); @@ -1085,11 +1085,11 @@ $app.create_dlg_accounts = function () { }; dlg.get_selected_acc = function (tbl) { - var items = []; - var _objs = $('#' + tbl.dom_id + ' tbody tr td input[data-check-box]'); + let items = []; + let _objs = $('#' + tbl.dom_id + ' tbody tr td input[data-check-box]'); $.each(_objs, function (i, _obj) { if ($(_obj).is(':checked')) { - var _row_data = tbl.get_row(_obj); + let _row_data = tbl.get_row(_obj); items.push(_row_data.id); } }); @@ -1116,7 +1116,7 @@ $app.create_dlg_accounts = function () { }; dlg.on_btn_lock_acc_click = function () { - var items = dlg.get_selected_acc($app.table_acc); + let items = dlg.get_selected_acc($app.table_acc); if (items.length === 0) { $tp.notify_error('请选择要禁用的账号!'); return; @@ -1146,7 +1146,7 @@ $app.create_dlg_accounts = function () { }; dlg.on_btn_unlock_acc_click = function () { - var items = dlg.get_selected_acc($app.table_acc); + let items = dlg.get_selected_acc($app.table_acc); if (items.length === 0) { $tp.notify_error('请选择要解禁的账号!'); return; @@ -1156,7 +1156,7 @@ $app.create_dlg_accounts = function () { }; dlg._remove_acc = function (acc_ids) { - var _fn_sure = function (cb_stack) { + let _fn_sure = function (cb_stack) { $tp.ajax_post_json('/asset/update-accounts', {action: 'remove', host_id: dlg.host.id, accounts: acc_ids}, function (ret) { if (ret.code === TPE_OK) { @@ -1166,7 +1166,7 @@ $app.create_dlg_accounts = function () { .exec(); $tp.notify_success('删除主机操作成功!'); - var update_args = { + let update_args = { acc_count: dlg.host.acc_count - acc_ids.length }; $app.table_host.update_row(dlg.host_row_id, update_args); @@ -1184,7 +1184,7 @@ $app.create_dlg_accounts = function () { ); }; - var cb_stack = CALLBACK_STACK.create(); + let cb_stack = CALLBACK_STACK.create(); $tp.dlg_confirm(cb_stack, { msg: '

注意:删除操作不可恢复!!

如果您希望临时禁止以指定账号登录远程主机,可将其“禁用”!

您确定要移除选定的' + acc_ids.length + '个账号吗?

', fn_yes: _fn_sure @@ -1192,7 +1192,7 @@ $app.create_dlg_accounts = function () { }; dlg.on_btn_remove_acc_click = function () { - var items = dlg.get_selected_acc($app.table_acc); + let items = dlg.get_selected_acc($app.table_acc); if (items.length === 0) { $tp.notify_error('请选择要删除的账号!'); return; @@ -1241,9 +1241,9 @@ $app.create_dlg_accounts = function () { // 绑定系统选择框事件 cell_obj.find('[data-action]').click(function () { - var action = $(this).attr('data-action'); - var acc_id = $(this).attr('data-id'); - var acc = tbl.get_row(row_id); + let action = $(this).attr('data-action'); + let acc_id = $(this).attr('data-id'); + let acc = tbl.get_row(row_id); if (action === 'edit') { $app.dlg_edit_account.show_edit(dlg.host_row_id, acc); @@ -1261,12 +1261,12 @@ $app.create_dlg_accounts = function () { dlg.on_table_acc_render_created = function (render) { // render.filter_state = function (header, title, col) { - // var _ret = ['
']; + // let _ret = ['
']; // _ret.push('
'); // _ret.push('
' + title + '
'); // // // 表格内嵌过滤器的DOM实体在这时生成 - // var filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); + // let filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); // _ret.push(filter_ctrl.render()); // // _ret.push('
'); @@ -1275,12 +1275,12 @@ $app.create_dlg_accounts = function () { // }; // // render.filter_search = function (header, title, col) { - // var _ret = ['
']; + // let _ret = ['
']; // _ret.push('
'); // _ret.push('
' + title + '
'); // // // 表格内嵌过滤器的DOM实体在这时生成 - // var filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); + // let filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); // _ret.push(filter_ctrl.render()); // // _ret.push('
'); @@ -1294,7 +1294,7 @@ $app.create_dlg_accounts = function () { render.acc_info = function (row_id, fields) { return fields.username; - // var ret = []; + // let ret = []; // // ret.push('' + fields.username + '@' + fields.host_ip + ''); // if (fields.router_ip.length > 0) @@ -1330,9 +1330,9 @@ $app.create_dlg_accounts = function () { }; render.acc_state = function (row_id, fields) { - var _style, _state; + let i, _style, _state; - for (var i = 0; i < $app.obj_states.length; ++i) { + for (i = 0; i < $app.obj_states.length; ++i) { if ($app.obj_states[i].id === fields.state) { _style = $app.obj_states[i].style; _state = $app.obj_states[i].name; @@ -1348,7 +1348,7 @@ $app.create_dlg_accounts = function () { }; render.make_host_action_btn = function (row_id, fields) { - // var h = []; + // let h = []; // h.push('
'); // h.push(''); @@ -1367,7 +1367,7 @@ $app.create_dlg_accounts = function () { // return h.join(''); - var ret = []; + let ret = []; ret.push('
'); ret.push(' 编辑'); @@ -1398,8 +1398,8 @@ $app.create_dlg_accounts = function () { }; dlg.check_acc_all_selected = function (cb_stack) { - var _all_checked = true; - var _objs = $('#' + $app.table_acc.dom_id + ' tbody').find('[data-check-box]'); + let _all_checked = true; + let _objs = $('#' + $app.table_acc.dom_id + ' tbody').find('[data-check-box]'); if (_objs.length === 0) { _all_checked = false; } else { @@ -1426,7 +1426,7 @@ $app.create_dlg_accounts = function () { }; $app.create_dlg_edit_account = function () { - var dlg = {}; + let dlg = {}; dlg.dom_id = 'dlg-edit-account'; dlg.host_row_id = -1; dlg.host = null; @@ -1460,6 +1460,8 @@ $app.create_dlg_edit_account = function () { prompt_password: $('#account-password-prompt'), btn_show_password: $('#btn-show-account-password'), btn_show_password_icon: $('#btn-show-account-password i'), + btn_clear_password: $('#btn-clear-password'), + block_clear_password: $('#block-clear-password'), btn_test: $('#btn-edit-account-test'), btn_save: $('#btn-edit-account-save') }; @@ -1481,6 +1483,24 @@ $app.create_dlg_edit_account = function () { } }); + dlg.dom.btn_clear_password.click(function () { + $tp.ajax_post_json('/asset/clear-account-password', { + host_id: dlg.host.id, + acc_id: dlg.field_id + }, + function (ret) { + if (ret.code === TPE_OK) { + $tp.notify_success('远程账号预设密码清除成功!'); + } else { + $tp.notify_error('远程账号预设密码清除失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,远程账号预设密码清除失败!'); + } + ); + }); + cb_stack.exec(); }; @@ -1492,6 +1512,7 @@ $app.create_dlg_edit_account = function () { dlg.account = null; dlg.field_id = -1; dlg.dom.dlg_title.html('添加远程账号'); + dlg.dom.block_clear_password.hide(); if (dlg.host.os_type === TP_OS_TYPE_LINUX) { dlg.dom.protocol_type.val(TP_PROTOCOL_TYPE_SSH); @@ -1506,6 +1527,7 @@ $app.create_dlg_edit_account = function () { dlg.account = account; dlg.field_id = account.id; dlg.dom.dlg_title.html('编辑:' + account.username); + dlg.dom.block_clear_password.show(); dlg.dom.username.val(account.username); @@ -1525,7 +1547,7 @@ $app.create_dlg_edit_account = function () { dlg.on_protocol_change = function () { dlg.field_protocol = parseInt(dlg.dom.protocol_type.val()); - var html = []; + let html = []; if (dlg.field_protocol === TP_PROTOCOL_TYPE_RDP) { dlg.dom.block_rdp_param.show(); dlg.dom.block_ssh_param.hide(); @@ -1673,11 +1695,12 @@ $app.create_dlg_edit_account = function () { } if (dlg.field_auth_type === TP_AUTH_TYPE_PASSWORD) { - if (dlg.field_id === -1 && dlg.field_password.length === 0) { - dlg.dom.password.focus(); - $tp.notify_error('请填写登录远程主机的密码!'); - return false; - } + // 可以不用设置密码,在远程登录时用户再手动填写。 + // if (dlg.field_id === -1 && dlg.field_password.length === 0) { + // dlg.dom.password.focus(); + // $tp.notify_error('请填写登录远程主机的密码!'); + // return false; + // } dlg.field_pri_key = ''; } else if (dlg.field_auth_type === TP_AUTH_TYPE_PRIVATE_KEY) { if (dlg.field_id === -1 && dlg.field_pri_key.length === 0) { @@ -1700,7 +1723,7 @@ $app.create_dlg_edit_account = function () { if (!dlg.check_input()) return; - var action = (dlg.field_id === -1) ? '添加' : '更新'; + let action = (dlg.field_id === -1) ? '添加' : '更新'; // 如果id为-1表示创建,否则表示更新 $tp.ajax_post_json('/asset/update-account', { @@ -1726,7 +1749,7 @@ $app.create_dlg_edit_account = function () { if (dlg.field_id === -1) { // 新建账号成功了,更新界面上对应主机的账号数 - var update_args = { + let update_args = { acc_count: dlg.host.acc_count + 1 }; $app.table_host.update_row(dlg.host_row_id, update_args); @@ -1750,6 +1773,8 @@ $app.create_dlg_edit_account = function () { if (!dlg.check_input()) return; + let is_interactive = (dlg.field_password.length === 0); + $assist.do_teleport( { mode: 0, @@ -1764,7 +1789,8 @@ $app.create_dlg_edit_account = function () { password: dlg.field_password, pri_key: dlg.field_pri_key, username_prompt: dlg.field_prompt_username, - password_prompt: dlg.field_prompt_password + password_prompt: dlg.field_prompt_password, + is_interactive: is_interactive }, function () { // func_success diff --git a/server/www/teleport/static/js/ops/remote-list.js b/server/www/teleport/static/js/ops/remote-list.js index 49fe86e..b2933a5 100644 --- a/server/www/teleport/static/js/ops/remote-list.js +++ b/server/www/teleport/static/js/ops/remote-list.js @@ -4,12 +4,10 @@ $app.on_init = function (cb_stack) { $app.dom = { btn_sel_group: $('#btn-sel-group button') , btn_refresh_host: $('#btn-refresh-host') - // , group_list_for_sel: $('#btn-sel-group ul') - // , group_selected: $('#group-selected') }; // console.log($app.options); - if(!$app.options.core_cfg.detected) { + if (!$app.options.core_cfg.detected) { $tp.notify_error('核心服务未启动,无法进行远程连接!'); cb_stack.exec(); return; @@ -27,17 +25,10 @@ $app.on_init = function (cb_stack) { //=================================== $app.create_controls = function (cb_stack) { - // var html = []; - // $.each($app.options.host_groups, function (i, item) { - // html.push('
  • ' + item.name + '
  • '); - // }); - // $app.dom.group_list_for_sel.append($(html.join(''))); - // - //------------------------------- // 资产列表表格 //------------------------------- - var table_host_options = { + let table_host_options = { dom_id: 'table-host', data_source: { type: 'ajax-post', @@ -130,13 +121,14 @@ $app.create_controls = function (cb_stack) { $app.on_table_host_cell_created = function (tbl, row_id, col_key, cell_obj) { if (col_key === 'action') { + // 绑定系统选择框事件 cell_obj.find('[data-action]').click(function (e) { - var action = $(this).attr('data-action'); - var protocol_sub_type = $(this).attr('data-sub-protocol'); - var uni_id = $(this).attr('data-id'); - var acc_id = parseInt($(this).attr('data-acc-id')); - var host_id = parseInt($(this).attr('data-host-id')); + let action = $(this).attr('data-action'); + let protocol_sub_type = $(this).attr('data-sub-protocol'); + let uni_id = $(this).attr('data-id'); + let acc_id = parseInt($(this).attr('data-acc-id')); + let host_id = parseInt($(this).attr('data-host-id')); if (action === 'rdp') { $app.connect_remote(uni_id, acc_id, host_id, TP_PROTOCOL_TYPE_RDP, TP_PROTOCOL_TYPE_RDP_DESKTOP); @@ -146,6 +138,8 @@ $app.on_table_host_cell_created = function (tbl, row_id, col_key, cell_obj) { $app.connect_remote(uni_id, acc_id, host_id, TP_PROTOCOL_TYPE_SSH, protocol_sub_type); } else if (action === 'telnet') { $app.connect_remote(uni_id, acc_id, host_id, TP_PROTOCOL_TYPE_TELNET, TP_PROTOCOL_TYPE_TELNET_SHELL); + } else if (action === 'get_config') { + $app.get_remote_connection_config(acc_id, host_id); } }); } @@ -154,12 +148,12 @@ $app.on_table_host_cell_created = function (tbl, row_id, col_key, cell_obj) { $app.on_table_host_render_created = function (render) { render.filter_state = function (header, title, col) { - var _ret = ['
    ']; + let _ret = ['
    ']; _ret.push('
    '); _ret.push('
    ' + title + '
    '); // 表格内嵌过滤器的DOM实体在这时生成 - var filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); + let filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); _ret.push(filter_ctrl.render()); _ret.push('
    '); @@ -168,12 +162,12 @@ $app.on_table_host_render_created = function (render) { }; render.filter_search = function (header, title, col) { - var _ret = ['
    ']; + let _ret = ['
    ']; _ret.push('
    '); _ret.push('
    ' + title + '
    '); // 表格内嵌过滤器的DOM实体在这时生成 - var filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); + let filter_ctrl = header._table_ctrl.get_filter_ctrl('search'); _ret.push(filter_ctrl.render()); _ret.push('
    '); @@ -182,7 +176,7 @@ $app.on_table_host_render_created = function (render) { }; render.host_info = function (row_id, fields) { - var title, sub_title; + let title, sub_title; title = fields.h_name; sub_title = fields.ip; @@ -193,77 +187,112 @@ $app.on_table_host_render_created = function (render) { // title = fields.a_name + '@' + title; - var desc = []; + // let desc = []; if (fields.router_ip.length > 0) { sub_title += ',由 ' + fields.router_ip + ':' + fields.router_port + ' 路由'; } - var ret = []; - if (desc.length > 0) { - ret.push('
    ' + title + ''); - } else { - ret.push('
    ' + title + ''); - } + let ret = []; + // if (desc.length > 0) { + // ret.push('
    ' + title + ''); + // } else { + // ret.push('
    ' + title + ''); + // } + ret.push('
    ' + title + ''); ret.push('
    ' + sub_title + '
    '); return ret.join(''); }; render.account = function (row_id, fields) { - var h = []; - for (var i = 0; i < fields.accs.length; ++i) { - var acc = fields.accs[i]; - h.push('
      '); + let h = []; + + // console.log('acc', fields); + if (fields.h_state !== TP_STATE_NORMAL || (fields.gh_state !== TP_STATE_NORMAL && fields.gh_state !== 0)) { + // 1. 主机已经被禁用,不显示相关账号。 + // 2. 主机所在分组已经被禁用,不显示相关账号。 + return; + } + + for (let i = 0; i < fields.accs.length; ++i) { + let acc = fields.accs[i]; + h.push('
        '); h.push('
      • ' + acc.a_name + '
      • '); h.push('
      '); } + return h.join(''); }; render.action = function (row_id, fields) { - // console.log(fields); - var h = []; - for (var i = 0; i < fields.accs.length; ++i) { - var acc = fields.accs[i]; - var act_btn = []; + // console.log('action', fields); + + let is_disabled = false; + let disable_msg = ''; + + if (fields.h_state !== TP_STATE_NORMAL) { + is_disabled = true; + disable_msg = '无可用远程连接,主机已被禁用'; + } + if (fields.gh_state !== TP_STATE_NORMAL && fields.gh_state !== 0) { + is_disabled = true; + disable_msg = '无可用远程连接,主机所在分组已被禁用'; + } + if (is_disabled) { + let h = []; + h.push('
      '); + h.push('
      '); + return h.join(''); + } + + + let h = []; + for (let i = 0; i < fields.accs.length; ++i) { + let acc = fields.accs[i]; + let act_btn = []; + + is_disabled = false; + disable_msg = ''; - var disabled = ''; if (acc.a_state !== TP_STATE_NORMAL) - disabled = '账号已禁用'; - if (disabled.length === 0 && (acc.policy_auth_type === TP_POLICY_AUTH_USER_gACC || acc.policy_auth_type === TP_POLICY_AUTH_gUSER_gACC) && acc.ga_state !== TP_STATE_NORMAL) - disabled = '账号所在组已禁用'; - if (disabled.length === 0 && fields.h_state !== TP_STATE_NORMAL) - disabled = '主机已禁用'; - if (disabled.length === 0 && (acc.policy_auth_type === TP_POLICY_AUTH_USER_gHOST || acc.policy_auth_type === TP_POLICY_AUTH_gUSER_gHOST) && fields.gh_state !== TP_STATE_NORMAL) - disabled = '主机所在组已禁用'; + disable_msg = '账号已被禁用'; + if (disable_msg.length === 0 && (acc.policy_auth_type === TP_POLICY_AUTH_USER_gACC || acc.policy_auth_type === TP_POLICY_AUTH_gUSER_gACC) && acc.ga_state !== TP_STATE_NORMAL) + disable_msg = '账号所在分组已被禁用'; + // if (disable_msg.length === 0 && fields.h_state !== TP_STATE_NORMAL) + // disable_msg = '主机已被禁用'; + // if (disable_msg.length === 0 && (acc.policy_auth_type === TP_POLICY_AUTH_USER_gHOST || acc.policy_auth_type === TP_POLICY_AUTH_gUSER_gHOST) && fields.gh_state !== TP_STATE_NORMAL) + // disable_msg = '主机所在组已被禁用'; - if (disabled.length > 0) { - act_btn.push('
    • '); - act_btn.push(' ' + disabled); - act_btn.push('
    • '); - } else { - if (acc.protocol_type === TP_PROTOCOL_TYPE_RDP) { + if (disable_msg.length > 0) + is_disabled = true; + + if (acc.protocol_type === TP_PROTOCOL_TYPE_RDP) { + if (!is_disabled) { if (!$app.options.core_cfg.rdp.enable) { - act_btn.push('
    • '); - act_btn.push(' RDP协议未启用'); - act_btn.push('
    • '); + is_disabled = true; + disable_msg = 'RDP协议未启用'; } else { if ((acc.policy_.flag_rdp & TP_FLAG_RDP_DESKTOP) !== 0) { act_btn.push('
      '); act_btn.push(''); - act_btn.push(''); + act_btn.push(''); act_btn.push('
      '); } } - } else if (acc.protocol_type === TP_PROTOCOL_TYPE_SSH) { + } else { + disable_msg = 'RPD' + disable_msg; + } + } else if (acc.protocol_type === TP_PROTOCOL_TYPE_SSH) { + if (!is_disabled) { if (!$app.options.core_cfg.ssh.enable) { - act_btn.push('
    • '); - act_btn.push(' SSH协议未启用'); - act_btn.push('
    • '); + is_disabled = true; + disable_msg = 'SSH协议未启用'; } else { act_btn.push('
      '); if ((acc.policy_.flag_ssh & TP_FLAG_SSH_SHELL) !== 0) { @@ -275,23 +304,49 @@ $app.on_table_host_render_created = function (render) { } act_btn.push('
      '); } - } else if (acc.protocol_type === TP_PROTOCOL_TYPE_TELNET) { + } else { + disable_msg = 'SSH' + disable_msg; + } + } else if (acc.protocol_type === TP_PROTOCOL_TYPE_TELNET) { + if (!is_disabled) { if (!$app.options.core_cfg.telnet.enable) { - act_btn.push('
    • '); - act_btn.push(' TELNET协议未启用'); - act_btn.push('
    • '); + is_disabled = true; + disable_msg = 'TELNET协议未启用'; } else { act_btn.push('
      '); act_btn.push(''); act_btn.push('
      '); } + } else { + disable_msg = 'TELNET' + disable_msg; } } - h.push('
      '); + if (disable_msg.length > 0) { + is_disabled = true; + act_btn.push('
      '); + act_btn.push(''); + act_btn.push('
      '); + } + + + h.push('
      '); + h.push('
      '); h.push(act_btn.join('')); h.push('
      '); + + if (!is_disabled) { + h.push('
      '); + h.push(''); + h.push('
      '); + } + + h.push('
      '); } + + return h.join(''); }; }; @@ -310,7 +365,7 @@ $app.on_table_host_header_created = function (header) { }; $app.create_dlg_rdp_options = function () { - var dlg = {}; + let dlg = {}; dlg.dom_id = 'dlg-rdp-options'; dlg.uni_id = ''; dlg.acc_id = 0; @@ -345,10 +400,10 @@ $app.create_dlg_rdp_options = function () { dlg.dom.btn_connect.click(function () { dlg.hide(); - var _size_obj = $('#' + dlg.dom_id + ' input[name="screen-size"]:checked'); - var _console = dlg.dom.console_mode.is(':checked'); - var _w = parseInt(_size_obj.attr('data-w')); - var _h = parseInt(_size_obj.attr('data-h')); + let _size_obj = $('#' + dlg.dom_id + ' input[name="screen-size"]:checked'); + let _console = dlg.dom.console_mode.is(':checked'); + let _w = parseInt(_size_obj.attr('data-w')); + let _h = parseInt(_size_obj.attr('data-h')); dlg.rdp_w = _w; dlg.rdp_h = _h; @@ -358,7 +413,7 @@ $app.create_dlg_rdp_options = function () { $app.connect_remote(dlg.uni_id, dlg.acc_id, dlg.host_id, dlg.protocol_type, dlg.protocol_sub_type); }); - var ops = Cookies.getJSON('rdp_options'); + let ops = Cookies.getJSON('rdp_options'); dlg.rdp_w = 0; dlg.rdp_h = 0; dlg.rdp_console = false; @@ -374,7 +429,7 @@ $app.create_dlg_rdp_options = function () { if (_.isUndefined(dlg.rdp_console)) dlg.rdp_console = false; - var ss = [ + let ss = [ {w: 800, h: 600}, {w: 1024, h: 768}, {w: 1280, h: 1024}, @@ -382,16 +437,16 @@ $app.create_dlg_rdp_options = function () { {w: 1440, h: 900} ]; - var h = []; + let h = []; h.push('
      '); h.push('
      '); - for (var i = 0; i < ss.length; ++i) { - var _w = ss[i].w; - var _h = ss[i].h; + for (let i = 0; i < ss.length; ++i) { + let _w = ss[i].w; + let _h = ss[i].h; h.push('
      '); return ret.join(''); }; diff --git a/server/www/teleport/static/js/teleport/controls.js b/server/www/teleport/static/js/teleport/controls.js index 9bc935b..2ab8d5f 100644 --- a/server/www/teleport/static/js/teleport/controls.js +++ b/server/www/teleport/static/js/teleport/controls.js @@ -532,7 +532,7 @@ $tp.create_table = function (options) { if (!_tbl.options.columns.hasOwnProperty(i)) continue; let col = _tbl.options.columns[i]; - for (k in kv) { + for (let k in kv) { if (!kv.hasOwnProperty(k)) continue; diff --git a/server/www/teleport/static/js/tp-assist.js b/server/www/teleport/static/js/tp-assist.js index e47499c..8c4226e 100644 --- a/server/www/teleport/static/js/tp-assist.js +++ b/server/www/teleport/static/js/tp-assist.js @@ -412,7 +412,8 @@ $assist.do_teleport = function (args, func_success, func_error) { session_id: session_id, protocol_type: parseInt(args.protocol_type), protocol_sub_type: parseInt(args.protocol_sub_type), - protocol_flag: parseInt(ret.data.protocol_flag) + protocol_flag: parseInt(ret.data.protocol_flag), + is_interactive: args.is_interactive }; if (args.protocol_type === TP_PROTOCOL_TYPE_RDP) { diff --git a/server/www/teleport/static/less/_base.less b/server/www/teleport/static/less/_base.less index a5d745a..274e125 100644 --- a/server/www/teleport/static/less/_base.less +++ b/server/www/teleport/static/less/_base.less @@ -19,7 +19,7 @@ html { body { font-family: @font-family-normal; - //font-size: @text-size-normal; + font-size: @text-size-normal; background-color: @page-bg; color: @page-color; } diff --git a/server/www/teleport/static/less/_overwrite_bootstrap.less b/server/www/teleport/static/less/_overwrite_bootstrap.less index 12252b3..569f7fd 100644 --- a/server/www/teleport/static/less/_overwrite_bootstrap.less +++ b/server/www/teleport/static/less/_overwrite_bootstrap.less @@ -270,9 +270,9 @@ color: #ac4e43; position: absolute; margin-left: -1.2em; - margin-top: 1px; + //margin-top: 1px; content: "\f069"; - font-size: 8px; + //font-size: 8px; font-family: 'Font Awesome 5 Free'; font-weight: 900; } @@ -282,6 +282,11 @@ color: #999; } .control-desc-sm { + color: #999; + padding-top: 7px; + font-size: @text-size-small; + } + .control-desc-sm-input { color: #999; padding-top: 3px; font-size: @text-size-small; diff --git a/server/www/teleport/static/less/_remote_action.less b/server/www/teleport/static/less/_remote_action.less index 288a009..e9da7c7 100644 --- a/server/www/teleport/static/less/_remote_action.less +++ b/server/www/teleport/static/less/_remote_action.less @@ -1,12 +1,13 @@ @charset "utf-8"; .remote-action-group { + display: inline-block; margin-bottom: 3px; height: 28px; .btn-group-sm > .btn { margin: 0; - padding: 6px 6px; + //padding: 6px 6px; font-size: 12px; height: 28px; min-width: 80px; @@ -14,6 +15,17 @@ &.dropdown-toggle { min-width: 0; } + + &.btn-disabled { + background-color: @color-bg-ignore; + color: #aaa; + //text-shadow: -1px -1px 1px #fff; + + //& > i.fa { + // color: #b53a2f; + // text-shadow: none; + //} + } } //& > ul { @@ -59,6 +71,7 @@ //width: 64px; text-align: center; white-space: nowrap; + height: 28px; &.state-disabled { background-color: @color-bg-ignore; @@ -136,6 +149,7 @@ border-top-left-radius: 4px; border-bottom-left-radius: 4px; } + // //&.remote-action-btn:first-child { // border: none; @@ -149,6 +163,7 @@ border-top-right-radius: 4px; border-bottom-right-radius: 4px; } + // //&.remote-action-btn:last-child { // border: none; @@ -159,9 +174,24 @@ //} } + //} } +.remote-config { + display: inline-block; + margin-left: 20px; + + button { + margin: 0; + //padding: 6px 6px; + font-size: 12px; + height: 28px; + min-width: 80px; + } + +} + .remote-info-group { margin-bottom: 3px; height: 28px; @@ -177,49 +207,52 @@ position: relative; display: block; height: 28px; - padding: 4px 5px; + line-height: 28px; + //padding: 4px 5px; //background-color: #efefef; - border-top: 1px solid #ccc; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; + //border-top: 1px solid #ccc; + //border-right: 1px solid #ccc; + //border-bottom: 1px solid #ccc; + border:none; - &.remote-action-btn { - background: none; - padding: 0; - border: none; - } + //&.remote-action-btn { + // background: none; + // padding: 0; + // border: none; + //} + // + //&.remote-action-input { + // background: none; + // padding: 4px 0; + // + // select { + // border: none; + // } + //} - &.remote-action-input { - background: none; - padding: 4px 0; + //label { + // padding: 0; + // display: block; + // float: left; + // margin-top: 1px; + // cursor: pointer; + //} + // + //select { + // margin-top: -3px; + //} - select { - border: none; - } - } - - label { - padding: 0; - display: block; - float: left; - margin-top: 1px; - cursor: pointer; - } - select { - margin-top: -3px; - } - - &:first-child { - border-left: 1px solid #ccc; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - } - - &:last-child { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - } + //&:first-child { + // border-left: 1px solid #ccc; + // border-top-left-radius: 4px; + // border-bottom-left-radius: 4px; + //} + // + //&:last-child { + // border-top-right-radius: 4px; + // border-bottom-right-radius: 4px; + //} } } } @@ -242,7 +275,8 @@ .title { background-color: #eee; - padding: 3px 5px; + padding: 5px 5px; + font-weight: bold; } .item { diff --git a/server/www/teleport/static/less/style.less b/server/www/teleport/static/less/style.less index 34559cd..6a8a652 100644 --- a/server/www/teleport/static/less/style.less +++ b/server/www/teleport/static/less/style.less @@ -585,9 +585,9 @@ body { // margin: 0 auto; //} // -.form-group .input-group { - margin-bottom: 5px; -} +//.form-group .input-group { +// margin-bottom: 5px; +//} .op_box { display: block; diff --git a/server/www/teleport/view/asset/host-list.html b/server/www/teleport/view/asset/host-list.html index f730d85..900bcc0 100644 --- a/server/www/teleport/view/asset/host-list.html +++ b/server/www/teleport/view/asset/host-list.html @@ -46,7 +46,7 @@ {% block block_body %}
      -{# ## 防止页面搜索框被自动填充#} + {# ## 防止页面搜索框被自动填充#} @@ -136,12 +136,12 @@
      -{# ##
      #} -{# ## #} -{# ##
      #} -{# ##
      #} -{# ##
      #} -{# ##
      #} + {# ##
      #} + {# ## #} + {# ##
      #} + {# ##
      #} + {# ##
      #} + {# ##
      #}
      @@ -303,18 +303,13 @@
      -{# ## #}
      - +
      @@ -358,8 +353,13 @@
      +
      + 如不填写密码,则会在远程连接时要求用户手动输入。 + 如果已设置了密码,可点击此处清除 +
      +
      -
      英文字符和数字,最大32字符
      +
      英文字符和数字,最大32字符
      @@ -189,7 +189,7 @@
    -
    用于激活账号、重置密码。
    +
    用于激活账号、重置密码。
    @@ -224,7 +224,7 @@
    -
    开始
    +
    开始时间
    @@ -237,7 +237,7 @@
    -
    结束
    +
    结束时间
    @@ -444,7 +444,7 @@ placeholder="LDAP服务器IP或域名"/>
    - +
    @@ -503,7 +503,7 @@
    -
    限制用户DN的范围,例如 ou=dev,ou=company,ou=com。 +
    限制用户DN的范围,例如 ou=dev,ou=company,ou=com
    @@ -513,7 +513,7 @@
    -
    列举用户时的过滤器,例如 (&(objectClass=person))。 +
    列举用户时的过滤器,例如 (&(objectClass=person))
    diff --git a/server/www/teleport/webroot/app/base/assist_bridge.py b/server/www/teleport/webroot/app/base/assist_bridge.py index 85424b7..e11617e 100644 --- a/server/www/teleport/webroot/app/base/assist_bridge.py +++ b/server/www/teleport/webroot/app/base/assist_bridge.py @@ -109,7 +109,7 @@ class TPAssistBridge(object): return assist_info def handle_assist_message(self, msg_req: AssistMessage): - log.v('add message, cmd_id={}\n'.format(msg_req.cmd_id)) + # log.v('add message, cmd_id={}\n'.format(msg_req.cmd_id)) self._commands[msg_req.cmd_id] = msg_req def on_web_client_connect(self, msg_req: AssistMessage, s_id: str, param: dict) -> None: diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py index aea7320..77c2e22 100755 --- a/server/www/teleport/webroot/app/controller/__init__.py +++ b/server/www/teleport/webroot/app/controller/__init__.py @@ -126,6 +126,10 @@ controllers = [ (r'/asset/account-group/(.*)', account.AccGroupInfoHandler), # - [json] 添加/更新 远程账号 (r'/asset/update-account', account.DoUpdateAccountHandler), + # - [json] 清除 远程账号的预设密码 + (r'/asset/clear-account-password', account.DoClearAccountPasswordHandler), + # - [json] 查询 远程账号是否有预设密码 + (r'/asset/get-account-interactive-mode', account.DoGetAccountInteractiveModeHandler), # - [json] 禁用/解禁/删除 远程账号 (r'/asset/update-accounts', account.DoUpdateAccountsHandler), # - [json] 获取账号列表 diff --git a/server/www/teleport/webroot/app/controller/account.py b/server/www/teleport/webroot/app/controller/account.py index 930afde..73da5bd 100644 --- a/server/www/teleport/webroot/app/controller/account.py +++ b/server/www/teleport/webroot/app/controller/account.py @@ -233,15 +233,15 @@ class DoUpdateAccountHandler(TPBaseJsonHandler): if acc_id == -1: # 新增账号 - if param['auth_type'] == TP_AUTH_TYPE_PASSWORD and len(param['password']) == 0: - return self.write_json(TPE_PARAM) - elif param['auth_type'] == TP_AUTH_TYPE_PRIVATE_KEY and len(param['pri_key']) == 0: + # if param['auth_type'] == TP_AUTH_TYPE_PASSWORD and len(param['password']) == 0: + # return self.write_json(TPE_PARAM) + if param['auth_type'] == TP_AUTH_TYPE_PRIVATE_KEY and len(param['pri_key']) == 0: return self.write_json(TPE_PARAM) if param['auth_type'] == TP_AUTH_TYPE_PASSWORD and len(param['password']) > 0: code, ret_data = yield core_service_async_enc(param['password']) if code != TPE_OK: - return self.write_json(code) + return self.write_json(code, '无法加密存储密码!') else: param['password'] = ret_data elif param['auth_type'] == TP_AUTH_TYPE_PRIVATE_KEY and len(param['pri_key']) > 0: @@ -260,6 +260,60 @@ class DoUpdateAccountHandler(TPBaseJsonHandler): self.write_json(err, data=info) +class DoClearAccountPasswordHandler(TPBaseJsonHandler): + @tornado.gen.coroutine + def post(self): + ret = self.check_privilege(TP_PRIVILEGE_ACCOUNT) + if ret != TPE_OK: + return + + args = self.get_argument('args', None) + if args is None: + return self.write_json(TPE_PARAM) + try: + args = json.loads(args) + except: + return self.write_json(TPE_JSON_FORMAT) + + try: + host_id = int(args['host_id']) + acc_id = int(args['acc_id']) + except: + log.e('\n') + return self.write_json(TPE_PARAM) + + err = account.clear_account_password(self, host_id, acc_id) + self.write_json(err) + + +class DoGetAccountInteractiveModeHandler(TPBaseJsonHandler): + @tornado.gen.coroutine + def post(self): + ret = self.check_privilege(TP_PRIVILEGE_OPS) + if ret != TPE_OK: + return + + args = self.get_argument('args', None) + if args is None: + return self.write_json(TPE_PARAM) + try: + args = json.loads(args) + except: + return self.write_json(TPE_JSON_FORMAT) + + try: + acc_id = int(args['acc_id']) + except: + log.e('\n') + return self.write_json(TPE_PARAM) + + err, password = account.get_account_password(acc_id) + if err != TPE_OK: + return self.write_json(err) + + self.write_json(TPE_OK, data={'is_interactive': True if len(password) == 0 else False}) + + class DoUpdateAccountsHandler(TPBaseJsonHandler): @tornado.gen.coroutine def post(self): diff --git a/server/www/teleport/webroot/app/controller/ops.py b/server/www/teleport/webroot/app/controller/ops.py index ac0dfeb..033a4bb 100644 --- a/server/www/teleport/webroot/app/controller/ops.py +++ b/server/www/teleport/webroot/app/controller/ops.py @@ -421,9 +421,9 @@ class DoGetSessionIDHandler(TPBaseJsonHandler): conn_info['_enc'] = 0 if acc_id == -1: - if auth_type == TP_AUTH_TYPE_PASSWORD and len(password) == 0: - return self.write_json(TPE_PARAM) - elif auth_type == TP_AUTH_TYPE_PRIVATE_KEY and len(pri_key) == 0: + # if auth_type == TP_AUTH_TYPE_PASSWORD and len(password) == 0: + # return self.write_json(TPE_PARAM) + if auth_type == TP_AUTH_TYPE_PRIVATE_KEY and len(pri_key) == 0: return self.write_json(TPE_PARAM) else: if (auth_type == TP_AUTH_TYPE_PASSWORD and len(password) == 0) or (auth_type == TP_AUTH_TYPE_PRIVATE_KEY and len(pri_key) == 0): diff --git a/server/www/teleport/webroot/app/controller/ws.py b/server/www/teleport/webroot/app/controller/ws.py index f90a7d3..e06ba97 100644 --- a/server/www/teleport/webroot/app/controller/ws.py +++ b/server/www/teleport/webroot/app/controller/ws.py @@ -61,7 +61,7 @@ class AssistHandler(tornado.websocket.WebSocketHandler): 'method': msg.method, 'param': param } - log.w('send ws request: {}\n'.format(json_encode(data))) + log.d('send ws request: {}\n'.format(json_encode(data))) self.write_message(json_encode(data)) def send_response(self, msg: AssistMessage, code, message='', data=None): @@ -75,7 +75,7 @@ class AssistHandler(tornado.websocket.WebSocketHandler): 'message': message, 'data': data } - log.w('send ws response: {}\n'.format(json_encode(ret))) + log.d('send ws response: {}\n'.format(json_encode(ret))) self.write_message(json_encode(ret)) def set_assist_id(self, assist_id: int) -> None: diff --git a/server/www/teleport/webroot/app/model/account.py b/server/www/teleport/webroot/app/model/account.py index 591411a..385cbbf 100644 --- a/server/www/teleport/webroot/app/model/account.py +++ b/server/www/teleport/webroot/app/model/account.py @@ -296,6 +296,32 @@ def add_account(handler, host_id, args): return TPE_OK, _id +def clear_account_password(handler, host_id, acc_id): + db = get_db() + sql = 'UPDATE `{tp}acc` SET `password`="" WHERE `id`={ph} AND `host_id`={ph}'.format(tp=db.table_prefix, ph=db.place_holder) + db_ret = db.exec(sql, (acc_id, host_id)) + if not db_ret: + return TPE_DATABASE + + return TPE_OK + + +def get_account_password(acc_id): + db = get_db() + s = SQL(db) + s.select_from('acc', ['password'], alt_name='a') + s.where('a.id={ph}'.format(ph=db.place_holder)) + err = s.query((acc_id, )) + if err != TPE_OK: + return err, None + if len(s.recorder) != 1: + return TPE_DATABASE, None + + # s.recorder[0]['_host'] = sh.recorder[0] + + return TPE_OK, s.recorder[0]['password'] + + def update_account(handler, host_id, acc_id, args): """ 更新一个远程账号