From b485eb78572f53d517b7557bae39f039db256242 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Fri, 12 May 2017 19:35:15 +0800 Subject: [PATCH] temp: add dashboard. --- server/tp_core/core/tp_core.vs2015.vcxproj | 1 + .../core/tp_core.vs2015.vcxproj.filters | 383 ++-- server/tp_core/core/ts_http_rpc.cpp | 7 + .../www/teleport/app/eom_app/app/configs.py | 41 +- server/www/teleport/app/eom_app/app/core.py | 2 +- .../app/eom_app/controller/__init__.py | 3 + .../app/eom_app/controller/dashboard.py | 9 + .../teleport/app/eom_app/controller/host.py | 17 +- .../teleport/app/eom_app/controller/rpc.py | 2 - .../teleport/app/eom_app/controller/set.py | 53 +- server/www/teleport/static/css/dashboard.css | 1 + server/www/teleport/static/css/main.css | 2 +- .../www/teleport/static/js/ui/config/info.js | 35 +- .../www/teleport/static/less/dashboard.less | 367 ++++ server/www/teleport/static/less/main.less | 1676 +++++++++-------- .../view/common/_sidebar_nav_menu.mako | 28 +- server/www/teleport/view/dashboard/index.mako | 108 ++ server/www/teleport/view/set/info.mako | 128 +- 18 files changed, 1636 insertions(+), 1227 deletions(-) create mode 100644 server/www/teleport/app/eom_app/controller/dashboard.py create mode 100644 server/www/teleport/static/css/dashboard.css create mode 100644 server/www/teleport/static/less/dashboard.less create mode 100644 server/www/teleport/view/dashboard/index.mako diff --git a/server/tp_core/core/tp_core.vs2015.vcxproj b/server/tp_core/core/tp_core.vs2015.vcxproj index 08568d1..08c65c3 100644 --- a/server/tp_core/core/tp_core.vs2015.vcxproj +++ b/server/tp_core/core/tp_core.vs2015.vcxproj @@ -210,6 +210,7 @@ + diff --git a/server/tp_core/core/tp_core.vs2015.vcxproj.filters b/server/tp_core/core/tp_core.vs2015.vcxproj.filters index 62f0a9e..c5f2a8b 100644 --- a/server/tp_core/core/tp_core.vs2015.vcxproj.filters +++ b/server/tp_core/core/tp_core.vs2015.vcxproj.filters @@ -1,191 +1,194 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {0155895f-d6be-4e0f-970d-9b6b5c759502} - - - {9c2d60b3-2932-485b-bccd-b66886b0286b} - - - {541f6e28-2218-4de7-9f3a-d45c56647c82} - - - {95f40be8-2d36-40ee-92ea-184bb5c44411} - - - {a3d6f884-46a8-4450-9b4c-184c6189fea2} - - - {2450e4a6-cc0b-40fe-ac51-0b4367adef26} - - - {ffc7dbb8-e1f6-4655-bc79-1038b5cdfb15} - - - {d38dfe81-e91d-4248-a0bc-1f2e014d15ee} - - - {0f03131b-cf95-4be3-bc23-8bdf582d9198} - - - {dd7c7b9e-b873-42ba-939f-ae6e7b7bde12} - - - {b94c32df-7b3a-4712-a951-ec92d2e875cc} - - - - - main app - - - main app - - - main app - - - main app - - - main app - - - main app - - - main app - - - libex\src - - - libex\src - - - libex\src - - - libex\src - - - libex\src - - - libex\src - - - libex\src - - - mongoose - - - jsoncpp\src - - - jsoncpp\src - - - jsoncpp\src - - - mbedtls\library - - - mbedtls\library - - - mbedtls\library - - - main app - - - - - main app - - - main app - - - main app - - - main app - - - main app - - - main app - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - libex\header - - - Resource Files - - - jsoncpp\header - - - mongoose - - - common - - - common - - - main app - - - - - Resource Files - - - - - Resource Files - - + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {0155895f-d6be-4e0f-970d-9b6b5c759502} + + + {9c2d60b3-2932-485b-bccd-b66886b0286b} + + + {541f6e28-2218-4de7-9f3a-d45c56647c82} + + + {95f40be8-2d36-40ee-92ea-184bb5c44411} + + + {a3d6f884-46a8-4450-9b4c-184c6189fea2} + + + {2450e4a6-cc0b-40fe-ac51-0b4367adef26} + + + {ffc7dbb8-e1f6-4655-bc79-1038b5cdfb15} + + + {d38dfe81-e91d-4248-a0bc-1f2e014d15ee} + + + {0f03131b-cf95-4be3-bc23-8bdf582d9198} + + + {dd7c7b9e-b873-42ba-939f-ae6e7b7bde12} + + + {b94c32df-7b3a-4712-a951-ec92d2e875cc} + + + + + main app + + + main app + + + main app + + + main app + + + main app + + + main app + + + main app + + + libex\src + + + libex\src + + + libex\src + + + libex\src + + + libex\src + + + libex\src + + + libex\src + + + mongoose + + + jsoncpp\src + + + jsoncpp\src + + + jsoncpp\src + + + mbedtls\library + + + mbedtls\library + + + mbedtls\library + + + main app + + + + + main app + + + main app + + + main app + + + main app + + + main app + + + main app + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + libex\header + + + Resource Files + + + jsoncpp\header + + + mongoose + + + common + + + common + + + main app + + + main app + + + + + Resource Files + + + + + Resource Files + + \ No newline at end of file diff --git a/server/tp_core/core/ts_http_rpc.cpp b/server/tp_core/core/ts_http_rpc.cpp index 448dc4c..5fa3d37 100644 --- a/server/tp_core/core/ts_http_rpc.cpp +++ b/server/tp_core/core/ts_http_rpc.cpp @@ -1,4 +1,5 @@ #include "ts_http_rpc.h" +#include "ts_ver.h" #include "ts_env.h" #include "ts_session.h" #include "ts_crypto.h" @@ -287,6 +288,12 @@ void TsHttpRpc::_rpc_func_get_config(const Json::Value& json_param, ex_astr& buf ex_wstr2astr(g_env.m_replay_path, _replay_name); jr_data["replay-path"] = _replay_name; + jr_data["web-server-rpc"] = g_env.web_server_rpc; + + ex_astr _version; + ex_wstr2astr(TP_SERVER_VER, _version); + jr_data["version"] = _version; + ExIniFile& ini = g_env.get_ini(); ex_ini_sections& secs = ini.GetAllSections(); ex_ini_sections::iterator it = secs.begin(); diff --git a/server/www/teleport/app/eom_app/app/configs.py b/server/www/teleport/app/eom_app/app/configs.py index bf4605b..1a0eda9 100644 --- a/server/www/teleport/app/eom_app/app/configs.py +++ b/server/www/teleport/app/eom_app/app/configs.py @@ -28,15 +28,16 @@ class ConfigFile(AttrDict): super().__init__(**kwargs) self['core'] = AttrDict() - self['core']['ssh'] = AttrDict() - self['core']['ssh']['enable'] = False - self['core']['ssh']['port'] = 0 # 52189 - self['core']['rdp'] = AttrDict() - self['core']['rdp']['enable'] = False - self['core']['rdp']['port'] = 0 # 52089 - self['core']['telnet'] = AttrDict() - self['core']['telnet']['enable'] = False - self['core']['telnet']['port'] = 0 # 52389 + self['core']['detected'] = False + # self['core']['ssh'] = AttrDict() + # self['core']['ssh']['enable'] = False + # self['core']['ssh']['port'] = 0 # 52189 + # self['core']['rdp'] = AttrDict() + # self['core']['rdp']['enable'] = False + # self['core']['rdp']['port'] = 0 # 52089 + # self['core']['telnet'] = AttrDict() + # self['core']['telnet']['enable'] = False + # self['core']['telnet']['port'] = 0 # 52389 def load(self, cfg_file): if not os.path.exists(cfg_file): @@ -87,9 +88,15 @@ class ConfigFile(AttrDict): return True def update_core(self, conf_data): - try: - self['core'] = AttrDict() + log.d('update core server config info.\n') + self['core'] = AttrDict() + if conf_data is None: + log.w('core server config info is empty.\n') + self['core']['detected'] = False + return True + + try: self['core']['ssh'] = AttrDict() self['core']['ssh']['enable'] = False self['core']['ssh']['port'] = 52189 @@ -111,11 +118,15 @@ class ConfigFile(AttrDict): self['core']['telnet']['enable'] = conf_data['telnet']['enable'] self['core']['telnet']['port'] = conf_data['telnet']['port'] - self['core']['replay_path'] = conf_data['replay-path'] + if 'replay-path' in conf_data: + self['core']['replay_path'] = conf_data['replay-path'] - # TODO: ... - if 'web_server_rpc' in conf_data: - self['core']['web_server_rpc'] = conf_data['web_server_rpc'] + if 'web-server-rpc' in conf_data: + self['core']['web_server_rpc'] = conf_data['web-server-rpc'] + if 'version' in conf_data: + self['core']['version'] = conf_data['version'] + + self['core']['detected'] = True except IndexError: log.e('invalid core config.\n') diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py index 70dc0b8..0e324ed 100644 --- a/server/www/teleport/app/eom_app/app/core.py +++ b/server/www/teleport/app/eom_app/app/core.py @@ -80,7 +80,7 @@ class WebServerCore: x = json.loads(body) cfg.update_core(x['data']) except: - log.w('can not connect to core server for get config, maybe it not start yet, ignore.\n') + log.w('can not connect to core server to get config, maybe it not start yet, ignore.\n') def run(self): diff --git a/server/www/teleport/app/eom_app/controller/__init__.py b/server/www/teleport/app/eom_app/controller/__init__.py index 3889f4e..5e0a752 100644 --- a/server/www/teleport/app/eom_app/controller/__init__.py +++ b/server/www/teleport/app/eom_app/controller/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os +from . import dashboard from . import rpc from . import auth from . import host @@ -21,6 +22,8 @@ cfg = app_cfg() __all__ = ['controllers'] controllers = [ + (r'/dashboard', dashboard.IndexHandler), + (r'/', index.IndexHandler), (r'/maintenance/install', maintenance.InstallHandler), diff --git a/server/www/teleport/app/eom_app/controller/dashboard.py b/server/www/teleport/app/eom_app/controller/dashboard.py new file mode 100644 index 0000000..5f6030d --- /dev/null +++ b/server/www/teleport/app/eom_app/controller/dashboard.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +import tornado.ioloop +from .base import TPBaseAdminAuthHandler + + +class IndexHandler(TPBaseAdminAuthHandler): + def get(self): + self.render('dashboard/index.mako') diff --git a/server/www/teleport/app/eom_app/controller/host.py b/server/www/teleport/app/eom_app/controller/host.py index 681713a..9637be7 100644 --- a/server/www/teleport/app/eom_app/controller/host.py +++ b/server/www/teleport/app/eom_app/controller/host.py @@ -30,11 +30,18 @@ class IndexHandler(TPBaseUserAuthHandler): param = dict() - param['core'] = { - 'ssh_port': cfg.core.ssh.port, - 'rdp_port': cfg.core.rdp.port, - 'telnet_port': cfg.core.telnet.port - } + if cfg.core.detected: + param['core'] = { + 'ssh_port': cfg.core.ssh.port, + 'rdp_port': cfg.core.rdp.port, + 'telnet_port': cfg.core.telnet.port + } + else: + param['core'] = { + 'ssh_port': 0, + 'rdp_port': 0, + 'telnet_port': 0 + } param['group_list'] = host.get_group_list() diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index ee7a006..3b25186 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -68,8 +68,6 @@ class RpcHandler(TPBaseJsonHandler): return self.write_json(0, data=x) elif authid < 0: x = web_session().taken('tmp-auth-info-{}'.format(authid), None) - log.d("[rpc] get_auth_info(): ", x) - log.d("\n") return self.write_json(0, data=x) else: return self.write_json(-1, message='invalid auth id.') diff --git a/server/www/teleport/app/eom_app/controller/set.py b/server/www/teleport/app/eom_app/controller/set.py index efe0542..bc21471 100644 --- a/server/www/teleport/app/eom_app/controller/set.py +++ b/server/www/teleport/app/eom_app/controller/set.py @@ -1,51 +1,39 @@ # -*- coding: utf-8 -*- import json -import os -import platform -# import re -# import socket -# import subprocess -import threading -import time +import tornado.gen +import tornado.httpclient +from eom_ver import * from eom_app.app.configs import app_cfg -# from eom_app.module import host -from eom_app.module import set +from eom_app.app.util import * from .base import TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler cfg = app_cfg() -# def get_local_ip(): -# iplist = [] -# PLATFORM = platform.system().lower() -# try: -# if PLATFORM == "windows": -# ip_info = socket.gethostbyname_ex(socket.gethostname()) -# return ip_info[2] -# else: -# ipstr = '([0-9]{1,3}\.){3}[0-9]{1,3}' -# ipconfig_process = subprocess.Popen("ifconfig", stdout=subprocess.PIPE) -# output = ipconfig_process.stdout.read() -# ip_pattern = re.compile('(inet addr:%s)' % ipstr) -# pattern = re.compile(ipstr) -# -# for ipaddr in re.finditer(ip_pattern, str(output)): -# ip = pattern.search(ipaddr.group()) -# if ip.group() != "127.0.0.1": -# iplist.append(ip.group()) -# return iplist -# except Exception: -# return iplist - - class InfoHandler(TPBaseAdminAuthHandler): + @tornado.gen.coroutine def get(self): + core_detected = False + req = {'method': 'get_config', 'param': []} + _yr = async_post_http(req) + return_data = yield _yr + if return_data is not None: + if 'code' in return_data: + _code = return_data['code'] + if _code == 0: + # core['detected'] = True + cfg.update_core(return_data['data']) + core_detected = True + + if not core_detected: + cfg.update_core(None) param = { 'core': cfg.core, 'web': { + 'version': TS_VER, 'core_server_rpc': cfg['core_server_rpc'] } } @@ -57,7 +45,6 @@ class DatabaseHandler(TPBaseAdminAuthHandler): param = {'core_server': cfg.core} self.render('set/database.mako', page_param=json.dumps(param)) - # def _restart_func(): # time.sleep(1) # diff --git a/server/www/teleport/static/css/dashboard.css b/server/www/teleport/static/css/dashboard.css new file mode 100644 index 0000000..bb7a4d8 --- /dev/null +++ b/server/www/teleport/static/css/dashboard.css @@ -0,0 +1 @@ +@charset "utf-8";.page-content{padding:15px 30px 15px 30px}.stats{overflow:hidden;padding:15px;color:#686868;background-color:#fff;border-radius:3px;margin-bottom:10px}.stats span.sub-name{font-size:11px;font-weight:300}.stats.stats-warning{position:relative;background-color:#c86124}.stats.stats-warning .stats-content{text-align:center;font-size:24px}.stats .loading{color:#fff;font-size:14px}.stats.stats-id-host{border-top:5px solid #407deb}.stats.stats-id-user{border-top:5px solid #eba61e}.stats.stats-id-connect{border-top:5px solid #14c13c}.stats.stats-box{position:relative;height:116px}.stats.stats-box .stats-content{padding-left:100px}.stats.stats-box .stats-icon{font-size:130px;line-height:130px;left:20px;text-align:center;position:absolute;color:rgba(0,0,0,0.05)}.stats.stats-box .stats-name{font-size:18px;font-weight:500;color:rgba(0,0,0,0.6)}.stats.stats-box .stats-value{margin-top:5px;color:rgba(0,0,0,0.6);font-size:48px;line-height:52px;font-weight:300;white-space:nowrap;padding-left:20px}.stats.stats-bar{position:relative;height:320px}.stats.stats-bar .stats-name{font-size:16px;font-weight:500;color:rgba(0,0,0,0.6)}.stats.stats-bar .stats-value{margin-top:5px;color:rgba(0,0,0,0.6);font-size:48px;line-height:52px;font-weight:300;white-space:nowrap;padding-left:20px}.stats.stats-first{border-left:none}.stats a{color:#eee;color:rgba(255,255,255,0.7)}.stats a:hover{color:#fff} \ No newline at end of file diff --git a/server/www/teleport/static/css/main.css b/server/www/teleport/static/css/main.css index 0aed86f..0a232d3 100644 --- a/server/www/teleport/static/css/main.css +++ b/server/www/teleport/static/css/main.css @@ -1 +1 @@ -@charset "utf-8";body{font-family:"Open Sans","Helvetica Neue","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}#page-container{min-width:1260px}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}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}hr.hr-sm{margin-top:5px;margin-bottom:5px}.btn-group-sm>.btn,.btn-sm{padding:2px 5px}.btn.btn-sm{padding:3px 8px}.btn.btn-icon{padding:3px 6px}.btn.btn-icon.btn-sm{padding:0;font-size:14px;height:24px;width:24px;line-height:24px;border-radius:0}.form-group-sm .input-group .input-group-btn>.btn{height:30px;padding:0 8px}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{display:inline-block;min-width:8px;padding:5px 10px;border-radius:10px;text-align:center;white-space:nowrap;vertical-align:middle;font-size:13px;font-weight:400;line-height:1em;background-color:#888;color:#fff;text-shadow:1px 1px 0 #525252}.badge.badge-plain{text-shadow:none}.badge.badge-sm{font-size:11px;padding:3px 6px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-6px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999;text-shadow:none}.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}.label{display:inline-block;min-width:8px;padding:5px 10px;border-radius:5px;text-align:center;white-space:nowrap;vertical-align:middle;font-size:13px;font-weight:400;line-height:1em;background-color:#888;color:#fff;text-shadow:1px 1px 0 #525252}.label.label-plain{text-shadow:none}.label.label-sm{font-size:11px;padding:3px 8px;margin-top:0;border-radius:5px;text-shadow:none}.label.label-ignore{background-color:#e5e5e5;color:#999;text-shadow:none}.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}.alert-sm{padding:5px;margin-bottom:10px}.modal-dialog-sm .modal-header{padding:10px}.modal-dialog-sm .modal-body{padding:10px}.modal-dialog-sm .modal-footer{padding:10px}.modal-dialog-sm .form-horizontal .form-group{margin-right:-5px;margin-left:-5px}.modal-dialog-sm .col-sm-1,.modal-dialog-sm .col-sm-2,.modal-dialog-sm .col-sm-3,.modal-dialog-sm .col-sm-4,.modal-dialog-sm .col-sm-5,.modal-dialog-sm .col-sm-6,.modal-dialog-sm .col-sm-7,.modal-dialog-sm .col-sm-8,.modal-dialog-sm .col-sm-9,.modal-dialog-sm .col-sm-10,.modal-dialog-sm .col-sm-11{padding-right:5px;padding-left:5px}.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}.remote-action-group{margin-bottom:3px;height:28px;min-width:390px}.remote-action-group ul{display:block;height:28px;margin:0;padding:0}.remote-action-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}.remote-action-group ul li.remote-action-btn{background:none;padding:0;border:none}.remote-action-group ul li.remote-action-input{background:none;padding:4px 0}.remote-action-group ul li.remote-action-input select{border:none}.remote-action-group ul li.remote-action-chk-protocol{width:86px}.remote-action-group ul li.remote-action-username,.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-protocol{width:96px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.remote-action-group ul li.remote-action-username{font-size:90%;color:#999}.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-protocol,.remote-action-group ul li.remote-action-chk-protocol{color:#000}.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-chk-protocol{font-weight:bold}.remote-action-group ul li.remote-action-password,.remote-action-group ul li.remote-action-sshkey,.remote-action-group ul li.remote-action-noauth{text-align:center;padding:4px 8px;width:45px}.remote-action-group ul li.remote-action-password{background-color:#e3ffe3;color:#999}.remote-action-group ul li.remote-action-sshkey{background-color:#fbe9c8;color:#666}.remote-action-group ul li.remote-action-noauth{background-color:#e0e0e0;color:#666}.remote-action-group ul li .btn{line-height:1.5;margin:0;padding:4px 8px;font-size:12px;border-radius:0}.remote-action-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.remote-action-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.remote-action-group ul li select{margin-top:-3px}.remote-action-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group ul li:first-child .btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.remote-action-group ul li:last-child .btn{border-top-right-radius:4px;border-bottom-right-radius:4px}hr.small{margin:5px 0}.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}.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}.form-group-sm .form-control-static{padding:6px 0}.table{margin-bottom:10px}.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.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer;position:relative}.table.table-data thead .sorting>span:after,.table.table-data thead .sorting_asc>span:after,.table.table-data thead .sorting_desc>span:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'FontAwesome';opacity:.8}.table.table-data thead .sorting>span:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc>span:after{content:"\f0de"}.table.table-data thead .sorting_desc>span:after{content:"\f0dd"}.host-id{display:block;font-size:16px;font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace;color:#333}.host-id.not-active{font-size:14px;font-weight:400;color:#999}.host-desc{font-size:12px;color:#999;display:inline-block;white-space:nowrap;width:160px;overflow:hidden;text-overflow:ellipsis}a.host-desc:hover:before{display:inline-block;padding-right:3px;line-height:12px;content:"\f040";font-family:'FontAwesome'}.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:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.admin{background-color:#930;color:#fff;padding:5px 15px;border-radius:5px}.page-header-fixed{padding-top:48px}.header{border:none;box-shadow:0 0 3px rgba(0,0,0,0.5)}.header .container-fluid{padding-left:0}.header .breadcrumb-container{display:inline-block;padding-top:6px}.header .breadcrumb{padding-left:20px;font-size:16px}.header.navbar{min-height:48px;height:48px;margin:0}.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}.header.navbar .brand .navbar-logo{display:inline-block;width:93px;height:30px;background:url(../img/site-logo-small.png) no-repeat}.header.navbar .breadcrumb>li+li:before{font-size:18px;padding:0 5px;color:#ccc;content:"\f105";font-family:'FontAwesome'}.page-sidebar-fixed .sidebar{position:fixed}.sidebar{top:0;bottom:0;left:0;width:180px;padding-top:48px;z-index:1010;background-color:#3a3a3a}.sidebar .nav-menu>li>a{padding:8px 0 8px 20px;line-height:24px;font-size:13px;color:#c2c2c2;border-left:5px solid #3a3a3a}.sidebar .nav-menu>li>a:focus{background-color:#3a3a3a;border-left:5px solid #3a3a3a}.sidebar .nav-menu>li>a:hover{background-color:#2d2d2d;border-left:5px solid #005c74}.sidebar .nav-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.sidebar .nav-menu>li>a.active:hover{border-left:5px solid #00acda}.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}.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:'FontAwesome';font-style:normal}.sidebar .nav-menu li .menu-caret:after{content:'\f0da'}.sidebar .nav-menu li.expand .menu-caret:after{content:'\f0d7'}.sidebar .nav-menu>li.super-admin>a:hover{background-color:#620;border-left:5px solid #4d1a00}.sidebar .nav-menu>li.super-admin>a.active{background-color:#930;border-left:5px solid #930}.sidebar .nav-menu>li.super-admin>a.active:hover{border-left:5px solid #c40}.sidebar .nav-menu>li>a>i.icon{float:left;margin-top:1px;margin-right:15px;text-align:center;line-height:24px;font-size:14px}.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}.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}.sidebar .sub-menu>li>a:before{display:inline-block;padding-right:8px;line-height:20px;content:"\f105";font-family:'FontAwesome'}.sidebar .sub-menu>li>a:hover{color:#fff;border-left:5px solid #005c74}.sidebar .sub-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.sidebar .sub-menu>li>a.active:hover{border-left:5px solid #00acda}.sidebar .sub-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:-2px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:20px;line-height:24px;margin-right:-6px}.sidebar .nav-profile{padding:15px 10px;color:#ccc;background-color:#333;border-bottom:1px solid #464646}.sidebar .nav-profile a.title{color:#ccc}.sidebar .nav-profile a.title:hover{color:#fff;background-color:transparent}.sidebar .nav-profile a.title:focus{background-color:transparent}.sidebar .nav-profile .image{float:left;margin-top:3px;font-size:24px;color:#69f;width:36px;height:36px;border-radius:5px;background-color:#eee;text-align:center;margin-right:10px;overflow:hidden}.sidebar .nav-profile .image img{margin-top:-3px}.sidebar .nav-profile .name{display:block;font-size:16px}.sidebar .nav-profile .role{display:block;font-size:12px;color:#999}.sidebar .nav-profile .dropdown-menu{font-size:13px}.sidebar .nav-profile .dropdown-menu>li>a{padding:5px 20px}.sidebar .nav-profile .dropdown-menu>li>a:hover{background-color:#ccc}.sidebar .nav-profile .dropdown-menu .divider{margin:5px 0}.sidebar .badge{margin-top:-10px;margin-left:5px}.content{margin-left:180px}.page-content{padding:15px}.page-content-dashboard{padding:20px 25px}.widget{overflow:hidden;border-radius:3px;padding:15px;margin-bottom:20px;color:#fff}.widget.widget-stats{position:relative}.widget .stats-icon{font-size:52px;top:12px;right:21px;width:56px;height:56px;text-align:center;line-height:56px;margin-left:15px;color:#fff;position:absolute;opacity:.2}.widget .stats-title{color:#fff;color:rgba(255,255,255,0.6)}.widget .stats-split{height:2px;margin:0 -15px 10px;background:rgba(0,0,0,0.2)}.widget .stats-content{font-size:24px;font-weight:300;margin-bottom:10px}.widget .stats-desc{display:inline-block;color:#fff;color:rgba(255,255,255,0.6)}.widget .stats-action{display:inline-block;float:right}.widget a{color:#eee;color:rgba(255,255,255,0.7)}.widget a:hover{color:#fff}.widget.widget-info{background-color:#33b7d0}.widget.widget-primary{background-color:#348fe2}.widget.widget-success{background-color:#368142}.widget.widget-warning{background-color:#f57523}.widget.widget-danger{background-color:#d34242}.panel{border:none;box-shadow:none;border-radius:3px}.panel .panel-heading{padding:6px 15px;color:#fff}.panel .panel-heading .panel-title{font-size:14px}.panel .panel-heading .panel-heading-btn{float:right}.panel .panel-heading .panel-heading-btn .btn{display:inline-block;padding:0;border:none;text-align:center}.panel .panel-heading .panel-heading-btn .btn.btn-xs{width:18px;height:18px;line-height:18px;font-size:12px}.panel .panel-heading .panel-heading-btn .btn.btn-circle{border-radius:50%}.place-holder-h200{width:100%;height:300px;background-color:#eee;border:1px solid #ccc;line-height:200px;text-align:center}.dashboard-panel2-holder{width:100%;height:1150px;background-color:#eee;border:1px solid #ccc;line-height:200px;text-align:center}.dashboard-panel-time{color:#cecece}.box{border:none;box-shadow:none;border-radius:3px;background-color:#fff;padding:15px;margin-bottom:15px}.box-fluid{border:none;box-shadow:none;border-radius:3px;margin-bottom:15px}.box.box-sm,.box-fluid.box-sm{padding:5px 15px}.box .box-title,.box-fluid .box-title{margin-bottom:10px}.box .box-title .title,.box-fluid .box-title .title{display:inline-block;font-size:18px;color:#333;height:30px;line-height:30px}.box .box-title .btn-sm,.box-fluid .box-title .btn-sm{padding:3px 8px;margin-top:-5px}.box .nav-tabs,.box-fluid .nav-tabs{font-size:14px;font-weight:bold}.box .nav-tabs>li:first-child,.box-fluid .nav-tabs>li:first-child{margin-left:50px}.box .tab-content>.tab-pane,.box-fluid .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-license{line-height:30px}.box-license .breadcrumb{padding:0;margin:0;border-radius:0;background-color:transparent}.box-btn-bar{line-height:30px}.box-btn-bar a.btn{margin-right:20px}.page-nav{height:30px;line-height:30px}.page-nav .breadcrumb{padding:0;margin:0;border-radius:0;background-color:transparent}.page-nav .pagination{margin:0 0}.page-nav .btn{margin-top:-3px}.page-filter{height:36px;line-height:36px;margin-bottom:10px}.page-filter .form-control{margin-top:5px;margin-right:4px}.btn.btn-sm .dropdown-menu li a{font-size:11px}.invite{text-align:center;padding-bottom:20px}.invite .code{color:#2f3991;font-size:36px;font-weight:700;font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}.invite .link{padding:5px;color:#2f3991;font-size:13px;font-weight:700;background-color:#eee;border-radius:5px}.invite-send-box{width:300px;margin:0 auto}.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}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.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}.popover-inline-edit .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#ddd}.user-info-table{font-size:14px}.user-info-table tbody>tr>td{padding:8px}.user-info-table .user-field{min-width:100px;width:100px;color:#999;text-align:right}.user-info-table .user-value{color:#333;font-weight:bold}.user-info-table .user-value a{font-weight:normal}.breadcrumb.breadcrumb-trans{background-color:transparent}.biz-box{display:inline-block;width:20%;max-width:20%}.biz-box .bb-inner{background-color:#368142;margin:3px;border-radius:4px}.biz-box .bb-name{color:#fff;padding:9px;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center;padding-top:1px;padding-bottom:1px}.biz-box .bb-ver{font-size:11px;height:16px;text-align:center;padding:0 5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:rgba(255,255,255,0.85);background-color:rgba(0,0,0,0.3)}.biz-box.mp-disabled .mp-inner{background-color:#e5e5e5}.biz-box.mp-disabled .mp-name{color:#999}.biz-box.mp-success .mp-inner{background-color:#368142}.biz-box.mp-success .mp-name{color:#fff}.biz-box.mp-danger .mp-inner{background-color:#d34242}.biz-box.mp-danger .mp-name{color:#fff}.biz-box.mp-warning .mp-inner{background-color:#f57523}.biz-box.mp-warning .mp-name{color:#fff}textarea.textarea-resize-y{resize:vertical}textarea.textarea-resize-none{resize:none}textarea.textarea-code{font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}textarea.cert_pub{width:100%;height:64px;border:1px solid #e2e2e2;background-color:#e4ffe5}.icon{display:inline-block}.icon16{width:16px;height:16px;line-height:16px;margin-right:3px;margin-top:0 !important;margin-bottom:-2px !important;vertical-align:top;background-image:url("img/desktop/mimetype-16.png") !important}.icon16.icon-disk{background-position:0 0 !important}.icon16.icon-folder{background-position:-16px 0 !important}.icon16.icon-file{background-position:0 -16px !important}.icon16.icon-txt{background-position:-16px -16px !important}.icon16.icon-help{background-position:-32px -16px !important}.icon16.icon-sys{background-position:-48px -16px !important}.icon16.icon-exe{background-position:-64px -16px !important}.icon16.icon-office{background-position:0 -32px !important}.icon16.icon-word{background-position:-16px -32px !important}.icon16.icon-excel{background-position:-32px -32px !important}.icon16.icon-ppt{background-position:-48px -32px !important}.icon16.icon-access{background-position:-64px -32px !important}.icon16.icon-visio{background-position:-80px -32px !important}.icon16.icon-audio{background-position:0 -48px !important}.icon16.icon-video{background-position:-16px -48px !important}.icon16.icon-pic{background-position:-32px -48px !important}.icon16.icon-pdf{background-position:-48px -48px !important}.icon16.icon-font{background-position:-64px -48px !important}.icon16.icon-script{background-position:0 -64px !important}.icon16.icon-html{background-position:-16px -64px !important}.icon16.icon-py{background-position:-32px -64px !important}.icon16.icon-h{background-position:-48px -64px !important}.icon16.icon-c{background-position:-64px -64px !important}.icon16.icon-cpp{background-position:-80px -64px !important}.icon16.icon-cs{background-position:-96px -64px !important}.icon16.icon-php{background-position:-112px -64px !important}.icon16.icon-ruby{background-position:-128px -64px !important}.icon16.icon-java{background-position:-144px -64px !important}.icon16.icon-vs{background-position:-160px -64px !important}.icon16.icon-js{background-position:-176px -64px !important}.icon16.icon-archive{background-position:0 -80px !important}.icon16.icon-rar{background-position:-16px -80px !important}.icon16.icon-zip{background-position:-32px -80px !important}.icon16.icon-7z{background-position:-48px -80px !important}.icon16.icon-tar{background-position:-64px -80px !important}.icon16.icon-gz{background-position:-80px -80px !important}.icon16.icon-jar{background-position:-96px -80px !important}.icon16.icon-bz2{background-position:-112px -80px !important}.icon24{width:24px;height:24px;line-height:24px;margin-right:3px;margin-top:0 !important;margin-bottom:-2px !important;vertical-align:top;background-image:url("img/desktop/icons-tree-24x24.png") !important}.icon24.icon-disk{background-position:0 0 !important}.icon24.icon-folder{background-position:-24px 0 !important}.icon24.icon-folder-open{background-position:-48px 0 !important}.os-icon-windows:after{color:#00bcf6;content:"\f17a";font-size:18px;width:24px;height:24px;line-height:24px;display:inline-block;font-family:'FontAwesome'}.os-icon-linux:after{color:#fff;content:"\f17c";font-size:18px;width:24px;height:24px;line-height:24px;background-color:#333;border-radius:50%;display:inline-block;font-family:'FontAwesome'}.os-icon-macos:after{color:#a7a7a7;content:"\f179";font-size:20px;width:24px;height:24px;line-height:24px;display:inline-block;font-family:'FontAwesome'}.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}#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:FontAwesome !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} \ No newline at end of file +@charset "utf-8";body{font-family:"Open Sans","Helvetica Neue","Microsoft YaHei","微软雅黑",Helvetica,Arial,sans-serif;font-size:13px;background-color:#e9e9e9;color:#333}html,body{height:100%}#page-container{min-width:1260px}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}.clear-float{clear:both}.bigger{font-size:120%}.normal-text{font-size:13px;color:#333}.mono{font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}hr.hr-sm{margin-top:5px;margin-bottom:5px}.btn-group-sm>.btn,.btn-sm{padding:2px 5px}.btn.btn-sm{padding:3px 8px}.btn.btn-icon{padding:3px 6px}.btn.btn-icon.btn-sm{padding:0;font-size:14px;height:24px;width:24px;line-height:24px;border-radius:0}.form-group-sm .input-group .input-group-btn>.btn{height:30px;padding:0 8px}.pop-menu-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040}.form-group{margin-bottom:5px}.badge{display:inline-block;min-width:8px;padding:5px 10px;border-radius:10px;text-align:center;white-space:nowrap;vertical-align:middle;font-size:13px;font-weight:400;line-height:1em;background-color:#888;color:#fff;text-shadow:1px 1px 0 #525252}.badge.badge-plain{text-shadow:none}.badge.badge-sm{font-size:11px;padding:3px 6px;margin-top:0;border-radius:8px;text-shadow:none}.badge.badge-sup{margin-left:-6px;margin-top:-16px}.badge.badge-ignore{background-color:#e5e5e5;color:#999;text-shadow:none}.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}.label{display:inline-block;min-width:8px;padding:5px 10px;border-radius:5px;text-align:center;white-space:nowrap;vertical-align:middle;font-size:13px;font-weight:400;line-height:1em;background-color:#888;color:#fff;text-shadow:1px 1px 0 #525252}.label.label-plain{text-shadow:none}.label.label-sm{font-size:11px;padding:3px 8px;margin-top:0;border-radius:5px;text-shadow:none}.label.label-ignore{background-color:#e5e5e5;color:#999;text-shadow:none}.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}.alert-sm{padding:5px;margin-bottom:10px}.modal-dialog-sm .modal-header{padding:10px}.modal-dialog-sm .modal-body{padding:10px}.modal-dialog-sm .modal-footer{padding:10px}.modal-dialog-sm .form-horizontal .form-group{margin-right:-5px;margin-left:-5px}.modal-dialog-sm .col-sm-1,.modal-dialog-sm .col-sm-2,.modal-dialog-sm .col-sm-3,.modal-dialog-sm .col-sm-4,.modal-dialog-sm .col-sm-5,.modal-dialog-sm .col-sm-6,.modal-dialog-sm .col-sm-7,.modal-dialog-sm .col-sm-8,.modal-dialog-sm .col-sm-9,.modal-dialog-sm .col-sm-10,.modal-dialog-sm .col-sm-11{padding-right:5px;padding-left:5px}.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}.remote-action-group{margin-bottom:3px;height:28px;min-width:390px}.remote-action-group ul{display:block;height:28px;margin:0;padding:0}.remote-action-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}.remote-action-group ul li.remote-action-btn{background:none;padding:0;border:none}.remote-action-group ul li.remote-action-input{background:none;padding:4px 0}.remote-action-group ul li.remote-action-input select{border:none}.remote-action-group ul li.remote-action-chk-protocol{width:86px}.remote-action-group ul li.remote-action-username,.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-protocol{width:96px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.remote-action-group ul li.remote-action-username{font-size:90%;color:#999}.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-protocol,.remote-action-group ul li.remote-action-chk-protocol{color:#000}.remote-action-group ul li.remote-action-name,.remote-action-group ul li.remote-action-chk-protocol{font-weight:bold}.remote-action-group ul li.remote-action-password,.remote-action-group ul li.remote-action-sshkey,.remote-action-group ul li.remote-action-noauth{text-align:center;padding:4px 8px;width:45px}.remote-action-group ul li.remote-action-password{background-color:#e3ffe3;color:#999}.remote-action-group ul li.remote-action-sshkey{background-color:#fbe9c8;color:#666}.remote-action-group ul li.remote-action-noauth{background-color:#e0e0e0;color:#666}.remote-action-group ul li .btn{line-height:1.5;margin:0;padding:4px 8px;font-size:12px;border-radius:0}.remote-action-group ul li label{padding:0;display:block;float:left;margin-top:1px;cursor:pointer}.remote-action-group ul li input[type=checkbox]{display:block;float:left;margin:3px 5px 0 0}.remote-action-group ul li select{margin-top:-3px}.remote-action-group ul li:first-child{border-left:1px solid #ccc;border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group ul li:first-child .btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.remote-action-group ul li:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.remote-action-group ul li:last-child .btn{border-top-right-radius:4px;border-bottom-right-radius:4px}hr.small{margin:5px 0}.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}.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}.form-group-sm .form-control-static{padding:6px 0}.table{margin-bottom:10px}.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.table-data thead .sorting,.table.table-data thead .sorting_asc,.table.table-data thead .sorting_desc{cursor:pointer;position:relative}.table.table-data thead .sorting>span:after,.table.table-data thead .sorting_asc>span:after,.table.table-data thead .sorting_desc>span:after{bottom:4px;padding-left:5px;display:inline-block;font-family:'FontAwesome';opacity:.8}.table.table-data thead .sorting>span:after{opacity:.2;content:"\f0dc"}.table.table-data thead .sorting_asc>span:after{content:"\f0de"}.table.table-data thead .sorting_desc>span:after{content:"\f0dd"}.host-id{display:block;font-size:16px;font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace;color:#333}.host-id.not-active{font-size:14px;font-weight:400;color:#999}.host-desc{font-size:12px;color:#999;display:inline-block;white-space:nowrap;width:160px;overflow:hidden;text-overflow:ellipsis}a.host-desc:hover:before{display:inline-block;padding-right:3px;line-height:12px;content:"\f040";font-family:'FontAwesome'}.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:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace;font-size:11px;font-weight:400}.td-ip-item a{display:inline-block;width:14px;float:right;font-size:14px}.admin{background-color:#930;color:#fff;padding:5px 15px;border-radius:5px}.page-header-fixed{padding-top:48px}.header{border:none;box-shadow:0 0 3px rgba(0,0,0,0.5)}.header .container-fluid{padding-left:0}.header .breadcrumb-container{display:inline-block;padding-top:6px}.header .breadcrumb{background-color:transparent;padding-left:20px;font-size:16px}.header.navbar{min-height:48px;height:48px;margin:0}.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}.header.navbar .brand .navbar-logo{display:inline-block;width:93px;height:30px;background:url(../img/site-logo-small.png) no-repeat}.header.navbar .breadcrumb>li+li:before{font-size:18px;padding:0 5px;color:#ccc;content:"\f105";font-family:'FontAwesome'}.page-sidebar-fixed .sidebar{position:fixed}.sidebar{top:0;bottom:0;left:0;width:180px;padding-top:48px;z-index:1010;background-color:#3a3a3a}.sidebar .nav-menu>li>a{padding:8px 0 8px 20px;line-height:24px;font-size:13px;color:#c2c2c2;border-left:5px solid #3a3a3a}.sidebar .nav-menu>li>a:focus{background-color:#3a3a3a;border-left:5px solid #3a3a3a}.sidebar .nav-menu>li>a:hover{background-color:#2d2d2d;border-left:5px solid #005c74}.sidebar .nav-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.sidebar .nav-menu>li>a.active:hover{border-left:5px solid #00acda}.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}.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:'FontAwesome';font-style:normal}.sidebar .nav-menu li .menu-caret:after{content:'\f0da'}.sidebar .nav-menu li.expand .menu-caret:after{content:'\f0d7'}.sidebar .nav-menu>li.super-admin>a:hover{background-color:#620;border-left:5px solid #4d1a00}.sidebar .nav-menu>li.super-admin>a.active{background-color:#930;border-left:5px solid #930}.sidebar .nav-menu>li.super-admin>a.active:hover{border-left:5px solid #c40}.sidebar .nav-menu>li>a>i.icon{float:left;margin-top:1px;margin-right:15px;text-align:center;line-height:24px;font-size:14px}.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}.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}.sidebar .sub-menu>li>a:before{display:inline-block;padding-right:8px;line-height:20px;content:"\f105";font-family:'FontAwesome'}.sidebar .sub-menu>li>a:hover{color:#fff;border-left:5px solid #005c74}.sidebar .sub-menu>li>a.active{color:#fff;background-color:#0084a7;border-left:5px solid #0084a7}.sidebar .sub-menu>li>a.active:hover{border-left:5px solid #00acda}.sidebar .sub-menu>li>a.active:after{content:"\e251";font-family:'Glyphicons Halflings';position:relative;top:-2px;display:inline-block;font-style:normal;font-weight:400;float:right;color:#e9e9e9;font-size:20px;line-height:24px;margin-right:-6px}.sidebar .nav-profile{padding:15px 10px;color:#ccc;background-color:#333;border-bottom:1px solid #464646}.sidebar .nav-profile a.title{color:#ccc}.sidebar .nav-profile a.title:hover{color:#fff;background-color:transparent}.sidebar .nav-profile a.title:focus{background-color:transparent}.sidebar .nav-profile .image{float:left;margin-top:3px;font-size:24px;color:#69f;width:36px;height:36px;border-radius:5px;background-color:#eee;text-align:center;margin-right:10px;overflow:hidden}.sidebar .nav-profile .image img{margin-top:-3px}.sidebar .nav-profile .name{display:block;font-size:16px}.sidebar .nav-profile .role{display:block;font-size:12px;color:#999}.sidebar .nav-profile .dropdown-menu{font-size:13px}.sidebar .nav-profile .dropdown-menu>li>a{padding:5px 20px}.sidebar .nav-profile .dropdown-menu>li>a:hover{background-color:#ccc}.sidebar .nav-profile .dropdown-menu .divider{margin:5px 0}.sidebar .badge{margin-top:-10px;margin-left:5px}.content{margin-left:180px}.page-content{padding:15px}.page-content-dashboard{padding:20px 25px}.widget{overflow:hidden;border-radius:3px;padding:15px;margin-bottom:20px;color:#fff}.widget.widget-stats{position:relative}.widget .stats-icon{font-size:52px;top:12px;right:21px;width:56px;height:56px;text-align:center;line-height:56px;margin-left:15px;color:#fff;position:absolute;opacity:.2}.widget .stats-title{color:#fff;color:rgba(255,255,255,0.6)}.widget .stats-split{height:2px;margin:0 -15px 10px;background:rgba(0,0,0,0.2)}.widget .stats-content{font-size:24px;font-weight:300;margin-bottom:10px}.widget .stats-desc{display:inline-block;color:#fff;color:rgba(255,255,255,0.6)}.widget .stats-action{display:inline-block;float:right}.widget a{color:#eee;color:rgba(255,255,255,0.7)}.widget a:hover{color:#fff}.widget.widget-info{background-color:#33b7d0}.widget.widget-primary{background-color:#348fe2}.widget.widget-success{background-color:#368142}.widget.widget-warning{background-color:#f57523}.widget.widget-danger{background-color:#d34242}.panel{border:none;box-shadow:none;border-radius:3px}.panel .panel-heading{padding:6px 15px;color:#fff}.panel .panel-heading .panel-title{font-size:14px}.panel .panel-heading .panel-heading-btn{float:right}.panel .panel-heading .panel-heading-btn .btn{display:inline-block;padding:0;border:none;text-align:center}.panel .panel-heading .panel-heading-btn .btn.btn-xs{width:18px;height:18px;line-height:18px;font-size:12px}.panel .panel-heading .panel-heading-btn .btn.btn-circle{border-radius:50%}.place-holder-h200{width:100%;height:300px;background-color:#eee;border:1px solid #ccc;line-height:200px;text-align:center}.dashboard-panel2-holder{width:100%;height:1150px;background-color:#eee;border:1px solid #ccc;line-height:200px;text-align:center}.dashboard-panel-time{color:#cecece}.box{border:none;box-shadow:none;border-radius:3px;background-color:#fff;padding:15px;margin-bottom:15px}.box-fluid{border:none;box-shadow:none;border-radius:3px;margin-bottom:15px}.box.box-sm,.box-fluid.box-sm{padding:5px 15px}.box .box-title,.box-fluid .box-title{margin-bottom:10px}.box .box-title .title,.box-fluid .box-title .title{display:inline-block;font-size:18px;color:#333;height:30px;line-height:30px}.box .box-title .btn-sm,.box-fluid .box-title .btn-sm{padding:3px 8px;margin-top:-5px}.box .nav-tabs,.box-fluid .nav-tabs{font-size:14px;font-weight:bold}.box .nav-tabs>li:first-child,.box-fluid .nav-tabs>li:first-child{margin-left:50px}.box .tab-content>.tab-pane,.box-fluid .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-license{line-height:30px}.box-license .breadcrumb{padding:0;margin:0;border-radius:0;background-color:transparent}.box-btn-bar{line-height:30px}.box-btn-bar a.btn{margin-right:20px}.page-nav{height:30px;line-height:30px}.page-nav .breadcrumb{padding:0;margin:0;border-radius:0;background-color:transparent}.page-nav .pagination{margin:0 0}.page-nav .btn{margin-top:-3px}.page-filter{height:36px;line-height:36px;margin-bottom:10px}.page-filter .form-control{margin-top:5px;margin-right:4px}.btn.btn-sm .dropdown-menu li a{font-size:11px}.invite{text-align:center;padding-bottom:20px}.invite .code{color:#2f3991;font-size:36px;font-weight:700;font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}.invite .link{padding:5px;color:#2f3991;font-size:13px;font-weight:700;background-color:#eee;border-radius:5px}.invite-send-box{width:300px;margin:0 auto}.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}.table-data td.loading{text-align:left;padding:20px}.table-data .btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.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}.popover-inline-edit .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#ddd}.user-info-table{font-size:14px}.user-info-table tbody>tr>td{padding:8px}.user-info-table .user-field{min-width:100px;width:100px;color:#999;text-align:right}.user-info-table .user-value{color:#333;font-weight:bold}.user-info-table .user-value a{font-weight:normal}.breadcrumb.breadcrumb-trans{background-color:transparent}.biz-box{display:inline-block;width:20%;max-width:20%}.biz-box .bb-inner{background-color:#368142;margin:3px;border-radius:4px}.biz-box .bb-name{color:#fff;padding:9px;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center;padding-top:1px;padding-bottom:1px}.biz-box .bb-ver{font-size:11px;height:16px;text-align:center;padding:0 5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:rgba(255,255,255,0.85);background-color:rgba(0,0,0,0.3)}.biz-box.mp-disabled .mp-inner{background-color:#e5e5e5}.biz-box.mp-disabled .mp-name{color:#999}.biz-box.mp-success .mp-inner{background-color:#368142}.biz-box.mp-success .mp-name{color:#fff}.biz-box.mp-danger .mp-inner{background-color:#d34242}.biz-box.mp-danger .mp-name{color:#fff}.biz-box.mp-warning .mp-inner{background-color:#f57523}.biz-box.mp-warning .mp-name{color:#fff}textarea.textarea-resize-y{resize:vertical}textarea.textarea-resize-none{resize:none}textarea.textarea-code{font-family:Consolas,Lucida Console,Monaco,Courier,'Courier New',monospace}textarea.cert_pub{width:100%;height:64px;border:1px solid #e2e2e2;background-color:#e4ffe5}.icon{display:inline-block}.icon16{width:16px;height:16px;line-height:16px;margin-right:3px;margin-top:0 !important;margin-bottom:-2px !important;vertical-align:top;background-image:url("img/desktop/mimetype-16.png") !important}.icon16.icon-disk{background-position:0 0 !important}.icon16.icon-folder{background-position:-16px 0 !important}.icon16.icon-file{background-position:0 -16px !important}.icon16.icon-txt{background-position:-16px -16px !important}.icon16.icon-help{background-position:-32px -16px !important}.icon16.icon-sys{background-position:-48px -16px !important}.icon16.icon-exe{background-position:-64px -16px !important}.icon16.icon-office{background-position:0 -32px !important}.icon16.icon-word{background-position:-16px -32px !important}.icon16.icon-excel{background-position:-32px -32px !important}.icon16.icon-ppt{background-position:-48px -32px !important}.icon16.icon-access{background-position:-64px -32px !important}.icon16.icon-visio{background-position:-80px -32px !important}.icon16.icon-audio{background-position:0 -48px !important}.icon16.icon-video{background-position:-16px -48px !important}.icon16.icon-pic{background-position:-32px -48px !important}.icon16.icon-pdf{background-position:-48px -48px !important}.icon16.icon-font{background-position:-64px -48px !important}.icon16.icon-script{background-position:0 -64px !important}.icon16.icon-html{background-position:-16px -64px !important}.icon16.icon-py{background-position:-32px -64px !important}.icon16.icon-h{background-position:-48px -64px !important}.icon16.icon-c{background-position:-64px -64px !important}.icon16.icon-cpp{background-position:-80px -64px !important}.icon16.icon-cs{background-position:-96px -64px !important}.icon16.icon-php{background-position:-112px -64px !important}.icon16.icon-ruby{background-position:-128px -64px !important}.icon16.icon-java{background-position:-144px -64px !important}.icon16.icon-vs{background-position:-160px -64px !important}.icon16.icon-js{background-position:-176px -64px !important}.icon16.icon-archive{background-position:0 -80px !important}.icon16.icon-rar{background-position:-16px -80px !important}.icon16.icon-zip{background-position:-32px -80px !important}.icon16.icon-7z{background-position:-48px -80px !important}.icon16.icon-tar{background-position:-64px -80px !important}.icon16.icon-gz{background-position:-80px -80px !important}.icon16.icon-jar{background-position:-96px -80px !important}.icon16.icon-bz2{background-position:-112px -80px !important}.icon24{width:24px;height:24px;line-height:24px;margin-right:3px;margin-top:0 !important;margin-bottom:-2px !important;vertical-align:top;background-image:url("img/desktop/icons-tree-24x24.png") !important}.icon24.icon-disk{background-position:0 0 !important}.icon24.icon-folder{background-position:-24px 0 !important}.icon24.icon-folder-open{background-position:-48px 0 !important}.os-icon-windows:after{color:#00bcf6;content:"\f17a";font-size:18px;width:24px;height:24px;line-height:24px;display:inline-block;font-family:'FontAwesome'}.os-icon-linux:after{color:#fff;content:"\f17c";font-size:18px;width:24px;height:24px;line-height:24px;background-color:#333;border-radius:50%;display:inline-block;font-family:'FontAwesome'}.os-icon-macos:after{color:#a7a7a7;content:"\f179";font-size:20px;width:24px;height:24px;line-height:24px;display:inline-block;font-family:'FontAwesome'}.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}#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:FontAwesome !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} \ No newline at end of file diff --git a/server/www/teleport/static/js/ui/config/info.js b/server/www/teleport/static/js/ui/config/info.js index 0ba15f5..4e9b0de 100644 --- a/server/www/teleport/static/js/ui/config/info.js +++ b/server/www/teleport/static/js/ui/config/info.js @@ -8,12 +8,23 @@ ywl.on_init = function (cb_stack, cb_args) { }; var html = []; - html.push(ywl._make_info('核心服务通讯', ywl.page_options.web.core_server_rpc)); - html.push(ywl._make_info('WEB服务通讯', ywl.page_options.core.web_server_rpc)); - html.push(ywl._make_protocol_info('RDP 端口', ywl.page_options.core.rdp)); - html.push(ywl._make_protocol_info('SSH 端口', ywl.page_options.core.ssh)); - html.push(ywl._make_protocol_info('TELNET 端口', ywl.page_options.core.telnet)); - html.push(ywl._make_info('录像文件路径', ywl.page_options.core.replay_path)); + + // 版本号 + html.push(ywl._make_info('WEB服务版本', ywl.page_options.web.version)); + if (!ywl.page_options.core.detected) { + html.push(ywl._make_info('核心服务版本', '未能连接到核心服务')); + } else { + html.push(ywl._make_info('核心服务版本', ywl.page_options.core.version)); + } + + html.push(ywl._make_info('核心服务通讯地址', ywl.page_options.web.core_server_rpc)); + if (ywl.page_options.core.detected) { + html.push(ywl._make_info('WEB服务通讯地址', ywl.page_options.core.web_server_rpc)); + html.push(ywl._make_protocol_info('RDP 端口', ywl.page_options.core.rdp)); + html.push(ywl._make_protocol_info('SSH 端口', ywl.page_options.core.ssh)); + html.push(ywl._make_protocol_info('TELNET 端口', ywl.page_options.core.telnet)); + html.push(ywl._make_info('录像文件路径', ywl.page_options.core.replay_path)); + } dom.info.append(html.join('')); @@ -25,19 +36,19 @@ ywl.on_init = function (cb_stack, cb_args) { }; ywl._make_protocol_info = function (name, p) { - if(_.isUndefined(p)) + if (_.isUndefined(p)) return ywl._make_info(name, '未能检测到'); // RDP 端口:52089 - var key = name; + var val = p.port; if (!p.enable) { - key += '(未启用)'; + val = '' + val + '(未启用)'; } - return ywl._make_info(key, p.port); + return ywl._make_info(name, val); }; ywl._make_info = function (key, value) { - if(_.isUndefined(value)) - value = '未能检测到'; + if (_.isUndefined(value)) + value = '未能检测到'; return '' + key + ':' + value + ''; }; diff --git a/server/www/teleport/static/less/dashboard.less b/server/www/teleport/static/less/dashboard.less new file mode 100644 index 0000000..dbff935 --- /dev/null +++ b/server/www/teleport/static/less/dashboard.less @@ -0,0 +1,367 @@ +@charset "utf-8"; +@import "_color"; + +//@bg-color: #2c2c2c; +// +//body { +// background-color: @bg-color; +// color: #dfdfdf; +//} +// +//.sidebar .nav-menu>li>a.active:after { +// color: @bg-color; +//} +// +//.navbar-default { +// background: @bg-color; +// +// .breadcrumb { +// color:#fff; +// } +//} + +.page-content { + padding: 15px 30px 15px 30px; + + //.col-sm-3, .col-sm-4, .col-sm-6 { + // //padding: 0; + //} +} + +.stats { + overflow: hidden; + padding: 15px; + color: #686868; + background-color: #fff; + border-radius: 3px; + margin-bottom: 10px; + + //border-left: 1px solid lighten(@toolbar-bg, 20%); + //border-bottom: 1px solid lighten(@toolbar-bg, 20%); + + span.sub-name { + font-size: 11px; + font-weight: 300; + //color: #fff; + //color: rgba(255, 255, 255, .4); + } + + &.stats-warning { + position: relative; + background-color: #c86124; + + .stats-content { + //padding-left: 86px; + text-align: center; + font-size: 24px; + //color: #eee; + } + } + + .loading { + color: lighten(@page-bg, 60%); + font-size: 14px; + } + + &.stats-id-host { + border-top: 5px solid #407deb; + } + &.stats-id-user { + border-top: 5px solid #eba61e; + } + &.stats-id-connect { + border-top: 5px solid #14c13c; + } + + &.stats-box { + position: relative; + height: 116px; + + .stats-content { + padding-left: 100px; + } + + .stats-icon { + font-size: 130px; + line-height: 130px; + left: 20px; + text-align: center; + //color: #000000; + position: absolute; + //opacity: .05; + color: rgba(0, 0, 0, 0.05); + } + .stats-name { + font-size: 18px; + font-weight: 500; + //color: #1f1f1f; + color: rgba(0, 0, 0, 0.6); + } + .stats-value { + margin-top: 5px; + //color: #000000; + color: rgba(0, 0, 0, 0.6); + font-size: 48px; + line-height: 52px; + font-weight: 300; + white-space: nowrap; + padding-left: 20px; + } + + //.loading { + // color: lighten(@page-bg, 60%); + // font-size: 18px; + //} + + //@media all and (min-width: 768px) and (max-width: 1024px) { + // .stats-icon { + // left: 10px; + // } + // + // .stats-content { + // padding-left: 36px; + // } + // + // .stats-value { + // font-size: 36px; + // } + //} + //@media all and (min-width: 1025px) and (max-width: 1366px) { + // .stats-icon { + // left: 15px; + // } + // + // .stats-content { + // padding-left: 48px; + // } + // + // .stats-value { + // font-size: 46px; + // } + //} + } + + &.stats-bar { + position: relative; + height: 320px; + + .stats-content { + //padding-left: 100px; + } + + .stats-name { + font-size: 16px; + font-weight: 500; + //color: #1f1f1f; + color: rgba(0, 0, 0, 0.6); + } + .stats-value { + margin-top: 5px; + //color: #000000; + color: rgba(0, 0, 0, 0.6); + font-size: 48px; + line-height: 52px; + font-weight: 300; + white-space: nowrap; + padding-left: 20px; + } + } + + //&.widget-info { + // position: relative; + // padding-top: 8px; + // padding-bottom: 8px; + // + // .stats-icon, .stats-name { + // float: left; + // line-height: 24px; + // color: #fff; + // color: rgba(255, 255, 255, .6); + // } + // + // .stats-icon { + // font-size: 24px; + // margin-right: 5px; + // } + // + // .stats-name { + // font-size: 14px; + // font-weight: bold; + // } + // .stats-value { + // float: right; + // font-size: 16px; + // font-weight: 300; + // margin-right: 10px; + // } + //} + // + //&.widget-bar { + // position: relative; + // padding-top: 8px; + // padding-bottom: 8px; + // + // .stats-name { + // font-size: 14px; + // font-weight: bold; + // color: #fff; + // color: rgba(255, 255, 255, .6); + // } + // .stats-value { + // //width: 390px; + // width: 100%; + // height: 128px; + // } + //} + // + //&.widget-box, &.widget-block-list { + // position: relative; + // padding-top: 8px; + // padding-bottom: 8px; + // + // .stats-name { + // font-size: 14px; + // font-weight: bold; + // color: #fff; + // color: rgba(255, 255, 255, .6); + // + // span { + // font-size: 11px; + // font-weight: 300; + // color: #fff; + // color: rgba(255, 255, 255, .4); + // } + // } + // + // .stats-value { + // width: 100%; + // height: 100%; + // + // #box-tpm, #box-dfs { + // width: 100%; + // height: 100%; + // } + // } + // + // //.dfs-icon-upload, #val-tpm-upload, .dfs-icon-download, #val-tpm-download { + // // font-size: 36px; + // //} + // + // .io-rate-box { + // height: 50%; + // width:100%; + // display: table; + // padding-left: 20px; + // font-size: 24px; + // + // .io-rate-box-inner { + // display: table-cell; + // text-align: center; + // width:100%; + // + // &.dfs-upload { + // vertical-align: bottom; + // padding-bottom: 20px; + // color: #1e8a13; + // } + // + // &.dfs-download { + // vertical-align: top; + // //padding-top: 20px; + // color: #ff914d; + // } + // } + // } + // + // @media all and (min-width: 768px) and (max-width: 1367px) { + // .io-rate-box { + // font-size: 24px; + // } + // } + // @media all and (min-width: 1367px) { + // .io-rate-box { + // font-size: 28px; + // } + // } + // + //} + // + //&.widget-block-list { + // .stats-value { + // padding-top: 5px; + // width: 100%; + // height: 800px; + // overflow: hidden; + // } + // + // .block-info { + // font-size: 11px; + // border-top: 1px dotted rgba(255, 255, 255, .1);; + // clear: both; + // + // & > ul { + // margin: 0; + // padding: 0; + // list-style: none; + // + // & > li { + // float: left; + // position: relative; + // display: inline-block; + // line-height: 24px; + // margin-left: 10px; + // &:first-child { + // margin-left: 0; + // } + // } + // } + // + // .rollback { + // color: #ee5752; + // } + // + // .time, .hash { + // //font-family: @font-family-mono; + // } + // .time { + // //color: lighten(@page-bg, 50%); + // color: #7793b7; + // white-space: nowrap; + // //width: 142px; + // width: 106px; + // } + // .hash { + // color: #70b051; + // //width: 256px; + // //width: 236px; + // white-space: nowrap; + // } + // .trans { + // color: #449dbe; + // white-space: nowrap; + // width: 52px; + // } + // .data { + // color: #919191; + // white-space: nowrap; + // //display: block; + // width: 10px; + // //text-overflow: ellipsis; + // //overflow:hidden; + // } + // } + //} + + &.stats-first { + border-left: none; + } + + a { + color: #eee; + color: rgba(255, 255, 255, .7); + &:hover { + color: #fff; + } + } +} + diff --git a/server/www/teleport/static/less/main.less b/server/www/teleport/static/less/main.less index 8c7a15a..395514f 100644 --- a/server/www/teleport/static/less/main.less +++ b/server/www/teleport/static/less/main.less @@ -1,837 +1,839 @@ -@charset "utf-8"; - -@import "_color"; -@import "_base"; -@import "_table"; - -@header-height: 48px; -@sidebar-width: 180px; -@sidebar-bg: #3a3a3a; -@page-bg: #e9e9e9; - -@menu-normal-bg-color: #0084a7; -@menu-admin-bg-color: #930; - -.admin { - background-color: @menu-admin-bg-color; - color: #fff; - padding: 5px 15px; - border-radius: 5px; -} - -// 顶部状态栏 -.page-header-fixed { - padding-top: @header-height; -} - -.header { - border: none; - box-shadow: 0 0 3px rgba(0, 0, 0, .5); - - .container-fluid { - padding-left: 0; - } - - // 顶部面包屑 - .breadcrumb-container { - display: inline-block; - padding-top: 6px; - } - .breadcrumb { - padding-left: 20px; - font-size: 16px; - } -} - -.header.navbar { - min-height: @header-height; - height: @header-height; - margin: 0; - - .brand { - display: inline-block; - float: left; - width: @sidebar-width; - height: @header-height; - padding: 12px 0 0 ; - text-align: center; - margin: 0 auto; - background-color: @sidebar-bg; - - .navbar-logo { - display: inline-block; - width: 93px; - height: 30px; - background: url(../img/site-logo-small.png) no-repeat; - } - } - - .breadcrumb > li + li:before { - font-size: 18px; - padding: 0 5px; - color: #ccc; - content: "\f105"; - font-family: 'FontAwesome'; - } -} - -// 左侧功能导航栏 -.page-sidebar-fixed .sidebar { - position: fixed; -} - -.sidebar { - top: 0; - bottom: 0; - left: 0; - width: @sidebar-width; - padding-top: @header-height; - z-index: 1010; - background-color: @sidebar-bg; - - .nav-menu > li > a { - padding: 8px 0 8px 20px; - line-height: 24px; - font-size: 13px; - color: #c2c2c2; - border-left: 5px solid @sidebar-bg; - - &:focus { - background-color: @sidebar-bg; - border-left: 5px solid @sidebar-bg; - } - - &:hover { - background-color: darken(@sidebar-bg, 5%); - border-left: 5px solid darken(@menu-normal-bg-color, 10%); - } - &.active { - color: #fff; - background-color: @menu-normal-bg-color; - border-left: 5px solid @menu-normal-bg-color; - - &:hover { - border-left: 5px solid lighten(@menu-normal-bg-color, 10%); - } - - &:after { - content: "\e251"; - font-family: 'Glyphicons Halflings'; - position: relative; - top: 1px; - display: inline-block; - font-style: normal; - font-weight: 400; - float: right; - color: @page-bg; - font-size: 20px; - line-height: 24px; - margin-right: -6px; - } - } - } - - .nav-menu li .menu-caret:after { - display: inline-block; - width: 12px; - height: 12px; - margin-left: 5px; - top: 1px; - position: relative; - border: none; - font-family: 'FontAwesome'; - font-style: normal; - } - - .nav-menu li .menu-caret:after { - content: '\f0da'; - } - .nav-menu li.expand .menu-caret:after { - content: '\f0d7'; - } - - .nav-menu > li.super-admin > a { - &:hover { - background-color: darken(@menu-admin-bg-color, 10%); - border-left: 5px solid darken(@menu-admin-bg-color, 15%); - } - &.active { - background-color: @menu-admin-bg-color; - border-left: 5px solid @menu-admin-bg-color; - - &:hover { - border-left: 5px solid lighten(@menu-admin-bg-color, 10%); - } - } - } - - .nav-menu > li > a > i.icon { - float: left; - margin-top: 1px; - margin-right: 15px; - text-align: center; - line-height: 24px; - font-size: 14px; - } - - .sub-menu { - // padding:5px 0 5px 24px; - padding: 0; - margin: 0; - background-color: #292929; - position: relative; - list-style-type: none; - border-top: 1px solid #202020; - border-bottom: 1px solid #464646; - - & > li > a { - padding: 8px 0 8px 40px; - line-height: 20px; - font-size: 13px; - display: block; - position: relative; - color: #889097; - border-left: 5px solid #292929; - - &:before { - display: inline-block; - padding-right: 8px; - line-height: 20px; - content: "\f105"; - font-family: 'FontAwesome'; - } - - &:hover { - color: #fff; - border-left: 5px solid darken(@menu-normal-bg-color, 10%); - } - - &.active { - color: #fff; - background-color: @menu-normal-bg-color; - border-left: 5px solid @menu-normal-bg-color; - - &:hover { - border-left: 5px solid lighten(@menu-normal-bg-color, 10%); - } - - &:after { - content: "\e251"; - font-family: 'Glyphicons Halflings'; - position: relative; - top: -2px; - display: inline-block; - font-style: normal; - font-weight: 400; - float: right; - color: @page-bg; - font-size: 20px; - line-height: 24px; - margin-right: -6px; - } - } - - } - - } - - .nav-profile { - padding: 15px 10px; - color: #ccc; - background-color: #333; - border-bottom: 1px solid #464646; - - a.title { - color: #ccc; - - &:hover { - color: #fff; - background-color: transparent; - } - &:focus { - background-color: transparent; - } - } - - .image { - float: left; - margin-top: 3px; - font-size: 24px; - color: #69f; - width: 36px; - height: 36px; - //border-radius: 50%; - border-radius: 5px; - background-color: #eee; - text-align: center; - margin-right: 10px; - overflow: hidden; - - img { - margin-top:-3px; - } - } - - .name { - display: block; - font-size: 16px; - } - .role { - display: block; - font-size: 12px; - color: #999; - } - - // .btn-group.open .dropdown-toggle { - // -webkit-box-shadow: none; - // box-shadow: none; - // } - - .dropdown-menu { - // background-color: rgba(60, 60, 60, 0.9); - // color: #fff; - font-size: 13px; - - // &.dropdown-menu-left { - // margin-left: -120px; - // } - - & > li > a { - padding: 5px 20px; - // color: #fff; - - &:hover { - background-color: #ccc; - } - } - - .divider { - margin: 5px 0; - // background-color: #666; - } - - } - } - - .badge { - margin-top: -10px; - margin-left: 5px; - } -} - -// 主体内容 -.content { - margin-left: @sidebar-width; - // padding:20px 25px; -} - -.page-content { - padding: 15px; -} - -.page-content-dashboard { - padding: 20px 25px; -} - -// dashboard -.widget { - overflow: hidden; - border-radius: 3px; - padding: 15px; - margin-bottom: 20px; - color: #fff; - - &.widget-stats { - position: relative; - } - - .stats-icon { - font-size: 52px; - top: 12px; - right: 21px; - width: 56px; - height: 56px; - text-align: center; - line-height: 56px; - margin-left: 15px; - color: #fff; - position: absolute; - opacity: .2; - } - .stats-title { - color: #fff; - color: rgba(255, 255, 255, .6); - } - .stats-split { - height: 2px; - margin: 0 -15px 10px; - background: rgba(0, 0, 0, .2); - } - .stats-content { - font-size: 24px; - font-weight: 300; - margin-bottom: 10px; - } - .stats-desc { - display: inline-block; - color: #fff; - color: rgba(255, 255, 255, .6); - } - .stats-action { - display: inline-block; - float: right; - } - - a { - color: #eee; - color: rgba(255, 255, 255, .7); - &:hover { - color: #fff; - } - } - - &.widget-info { - background-color: @color-bg-info; - } - &.widget-primary { - background-color: @color-bg-primary; - } - - &.widget-success { - background-color: @color-bg-success; - } - &.widget-warning { - background-color: @color-bg-warning; - } - &.widget-danger { - background-color: @color-bg-danger; - } -} - -.panel { - border: none; - box-shadow: none; - border-radius: 3px; - - .panel-heading { - padding: 6px 15px; - color: #fff; - // border-bottom-width: 2px; - // border-bottom-color: rgba(0, 0, 0, .2); - - .panel-title { - font-size: 14px; - } - .panel-heading-btn { - float: right; - - .btn { - display: inline-block; - padding: 0; - border: none; - text-align: center; - - &.btn-xs { - width: 18px; - height: 18px; - line-height: 18px; - font-size: 12px; - } - &.btn-circle { - border-radius: 50%; - } - } - } - } -} - -.place-holder-h200 { - width: 100%; - height: 300px; - background-color: #eee; - border: 1px solid #ccc; - line-height: 200px; - text-align: center; -} - -.dashboard-panel2-holder { - width: 100%; - height: 1150px; - background-color: #eee; - border: 1px solid #ccc; - line-height: 200px; - text-align: center; -} - -.dashboard-panel-time { - color: #cecece; -} - -.box { - border: none; - box-shadow: none; - border-radius: 3px; - background-color: #fff; - padding: 15px; - margin-bottom: 15px; -} - -.box-fluid { - border: none; - box-shadow: none; - border-radius: 3px; - //background-color: #fff; - //padding: 15px; - margin-bottom: 15px; -} - -.box, .box-fluid { - - &.box-sm { - padding: 5px 15px; - } - - .box-title { - margin-bottom: 10px; - .title { - display: inline-block; - font-size: 18px; - color: #333; - height: 30px; - line-height: 30px; - } - .btn-sm { - padding: 3px 8px; - margin-top: -5px; - } - } - - .nav-tabs { - font-size: 14px; - font-weight: bold; - - & > li:first-child { - margin-left: 50px; - } - } - - .nav li a { - //padding: 5px 20px 3px 20px; - } - - .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-license { - //height: 30px; - line-height: 30px; - - .breadcrumb { - padding: 0; - margin: 0; - border-radius: 0; - background-color: transparent; - } -} - -.box-btn-bar { - //height: 30px; - line-height: 30px; - a.btn { - margin-right:20px; - } -} - -.page-nav { - height: 30px; - line-height: 30px; - - .breadcrumb { - padding: 0; - margin: 0; - border-radius: 0; - background-color: transparent; - } - - .pagination { - margin: 0 0; - } - - .btn { - margin-top: -3px; - } -} - -.page-filter { - height: 36px; - line-height: 36px; - margin-bottom: 10px; - - .form-control { - margin-top: 5px; - margin-right: 4px; - // border-radius: 0; - } -} - -.btn.btn-sm .dropdown-menu li a { - font-size: 11px; -} - -.invite { - text-align: center; - padding-bottom: 20px; - - .code { - color: #2f3991; - font-size: 36px; - font-weight: 700; - font-family: @font-family-mono; - } - .link { - padding: 5px; - color: #2f3991; - font-size: 13px; - font-weight: 700; - background-color: #eee; - border-radius: 5px; - } -} - -.invite-send-box { - width: 300px; - margin: 0 auto; -} - -.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; -} - -.table-data { - td.loading { - text-align: left; - padding: 20px; - } - - .btn-group.open .dropdown-toggle { - -webkit-box-shadow: none; - box-shadow: none; - } -} - -.more-action { - position: absolute !important; - - .dropdown-menu { - background-color: rgba(60, 60, 60, 0.9); - color: #fff; - font-size: 13px; - - &.dropdown-menu-left { - margin-left: -120px; - } - - & > li > a { - padding: 5px 20px; - color: #fff; - - &:hover, &:active, &:visited { - background-color: @menu-normal-bg-color; - } - } - - .divider { - margin: 5px 0; - background-color: #666; - } - - } -} - -.popover-inline-edit { - input, .btn { - height: 30px; - // line-height: 30px; - } - - .popover-title { - background-color: #ddd; - } - - .popover-content { - padding: 20px 10px; - } - - .popover { - padding: 0; - - &.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #ddd; - } - } -} - -//.table-no-border { -// tbody > tr > td { -// padding: 5px; -// } -//} - -.user-info-table { - font-size: 14px; - - tbody > tr > td { - padding: 8px; - } - - .user-field { - min-width: 100px; - width: 100px; - color: #999; - text-align: right; - } - .user-value { - color: #333; - font-weight: bold; - - a { - font-weight: normal; - } - } -} - -.breadcrumb.breadcrumb-trans { - background-color: transparent; -} - -//======================================== -// 业务页面 -//======================================== -.biz-box { - display: inline-block; - width: 20%; - max-width: 20%; - - .bb-inner { - background-color: @color-bg-success; - //border: 1px solid #555; - margin: 3px; - border-radius: 4px; - //min-height:32px; - } - - .bb-name { - color: @color-text-on-dark-bg; - padding: 9px; - margin-bottom: 3px; - - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: center; - //height:32px; - //line-height: 32px; - - //padding-top:10px; - padding-top: 1px; - padding-bottom: 1px; - } - .bb-ver { - font-size: 11px; - height:16px; - text-align: center; - - padding: 0 5px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - - color: rgba(255, 255, 255, 0.85); - background-color: rgba(0, 0, 0, 0.3); - } - - &.mp-disabled { - .mp-inner { - background-color: @color-bg-ignore; - } - .mp-name { - color: @color-text-ignore; - } - } - &.mp-success { - .mp-inner { - background-color: @color-bg-success; - } - .mp-name { - color: @color-text-on-dark-bg; - } - } - &.mp-danger { - .mp-inner { - background-color: @color-bg-danger; - } - .mp-name { - color: @color-text-on-dark-bg; - } - } - &.mp-warning { - .mp-inner { - background-color: @color-bg-warning; - } - .mp-name { - color: @color-text-on-dark-bg; - } - } -} - -textarea.textarea-resize-y { - resize:vertical; -} -textarea.textarea-resize-none { - resize:none; -} -textarea.textarea-code { - font-family: @font-family-mono; -} - -textarea.cert_pub { - width:100%; - height:64px; - border:1px solid #e2e2e2; - background-color: #e4ffe5; -} - - -@import "_mimetype"; -@import "_gritter"; - +@charset "utf-8"; + +@import "_color"; +@import "_base"; +@import "_table"; + +@header-height: 48px; +@sidebar-width: 180px; +@sidebar-bg: #3a3a3a; +@page-bg: #e9e9e9; + +@menu-normal-bg-color: #0084a7; +@menu-admin-bg-color: #930; + +.admin { + background-color: @menu-admin-bg-color; + color: #fff; + padding: 5px 15px; + border-radius: 5px; +} + +// 顶部状态栏 +.page-header-fixed { + padding-top: @header-height; +} + +.header { + border: none; + box-shadow: 0 0 3px rgba(0, 0, 0, .5); + + .container-fluid { + padding-left: 0; + } + + // 顶部面包屑 + .breadcrumb-container { + display: inline-block; + padding-top: 6px; + } + .breadcrumb { + background-color: transparent; + padding-left: 20px; + font-size: 16px; + } +} + +.header.navbar { + min-height: @header-height; + height: @header-height; + margin: 0; + + .brand { + display: inline-block; + float: left; + width: @sidebar-width; + height: @header-height; + padding: 12px 0 0; + text-align: center; + margin: 0 auto; + background-color: @sidebar-bg; + + .navbar-logo { + display: inline-block; + width: 93px; + height: 30px; + background: url(../img/site-logo-small.png) no-repeat; + } + } + + .breadcrumb > li + li:before { + font-size: 18px; + padding: 0 5px; + color: #ccc; + content: "\f105"; + font-family: 'FontAwesome'; + } +} + +// 左侧功能导航栏 +.page-sidebar-fixed .sidebar { + position: fixed; +} + +.sidebar { + top: 0; + bottom: 0; + left: 0; + width: @sidebar-width; + padding-top: @header-height; + z-index: 1010; + background-color: @sidebar-bg; + + .nav-menu > li > a { + padding: 8px 0 8px 20px; + line-height: 24px; + font-size: 13px; + color: #c2c2c2; + border-left: 5px solid @sidebar-bg; + + &:focus { + background-color: @sidebar-bg; + border-left: 5px solid @sidebar-bg; + } + + &:hover { + background-color: darken(@sidebar-bg, 5%); + border-left: 5px solid darken(@menu-normal-bg-color, 10%); + } + &.active { + color: #fff; + background-color: @menu-normal-bg-color; + border-left: 5px solid @menu-normal-bg-color; + + &:hover { + border-left: 5px solid lighten(@menu-normal-bg-color, 10%); + } + + &:after { + content: "\e251"; + font-family: 'Glyphicons Halflings'; + position: relative; + top: 1px; + display: inline-block; + font-style: normal; + font-weight: 400; + float: right; + color: @page-bg; + font-size: 20px; + line-height: 24px; + margin-right: -6px; + } + } + } + + .nav-menu li .menu-caret:after { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 5px; + top: 1px; + position: relative; + border: none; + font-family: 'FontAwesome'; + font-style: normal; + } + + .nav-menu li .menu-caret:after { + content: '\f0da'; + } + .nav-menu li.expand .menu-caret:after { + content: '\f0d7'; + } + + .nav-menu > li.super-admin > a { + &:hover { + background-color: darken(@menu-admin-bg-color, 10%); + border-left: 5px solid darken(@menu-admin-bg-color, 15%); + } + &.active { + background-color: @menu-admin-bg-color; + border-left: 5px solid @menu-admin-bg-color; + + &:hover { + border-left: 5px solid lighten(@menu-admin-bg-color, 10%); + } + } + } + + .nav-menu > li > a > i.icon { + float: left; + margin-top: 1px; + margin-right: 15px; + text-align: center; + line-height: 24px; + font-size: 14px; + } + + .sub-menu { + // padding:5px 0 5px 24px; + padding: 0; + margin: 0; + background-color: #292929; + position: relative; + list-style-type: none; + border-top: 1px solid #202020; + border-bottom: 1px solid #464646; + + & > li > a { + padding: 8px 0 8px 40px; + line-height: 20px; + font-size: 13px; + display: block; + position: relative; + color: #889097; + border-left: 5px solid #292929; + + &:before { + display: inline-block; + padding-right: 8px; + line-height: 20px; + content: "\f105"; + font-family: 'FontAwesome'; + } + + &:hover { + color: #fff; + border-left: 5px solid darken(@menu-normal-bg-color, 10%); + } + + &.active { + color: #fff; + background-color: @menu-normal-bg-color; + border-left: 5px solid @menu-normal-bg-color; + + &:hover { + border-left: 5px solid lighten(@menu-normal-bg-color, 10%); + } + + &:after { + content: "\e251"; + font-family: 'Glyphicons Halflings'; + position: relative; + top: -2px; + display: inline-block; + font-style: normal; + font-weight: 400; + float: right; + color: @page-bg; + font-size: 20px; + line-height: 24px; + margin-right: -6px; + } + } + + } + + } + + .nav-profile { + padding: 15px 10px; + color: #ccc; + background-color: #333; + border-bottom: 1px solid #464646; + + a.title { + color: #ccc; + + &:hover { + color: #fff; + background-color: transparent; + } + &:focus { + background-color: transparent; + } + } + + .image { + float: left; + margin-top: 3px; + font-size: 24px; + color: #69f; + width: 36px; + height: 36px; + //border-radius: 50%; + border-radius: 5px; + background-color: #eee; + text-align: center; + margin-right: 10px; + overflow: hidden; + + img { + margin-top: -3px; + } + } + + .name { + display: block; + font-size: 16px; + } + .role { + display: block; + font-size: 12px; + color: #999; + } + + // .btn-group.open .dropdown-toggle { + // -webkit-box-shadow: none; + // box-shadow: none; + // } + + .dropdown-menu { + // background-color: rgba(60, 60, 60, 0.9); + // color: #fff; + font-size: 13px; + + // &.dropdown-menu-left { + // margin-left: -120px; + // } + + & > li > a { + padding: 5px 20px; + // color: #fff; + + &:hover { + background-color: #ccc; + } + } + + .divider { + margin: 5px 0; + // background-color: #666; + } + + } + } + + .badge { + margin-top: -10px; + margin-left: 5px; + } +} + +// 主体内容 +.content { + margin-left: @sidebar-width; + // padding:20px 25px; +} + +.page-content { + padding: 15px; +} + +.page-content-dashboard { + padding: 20px 25px; +} + +// dashboard +.widget { + overflow: hidden; + border-radius: 3px; + padding: 15px; + margin-bottom: 20px; + color: #fff; + + &.widget-stats { + position: relative; + } + + .stats-icon { + font-size: 52px; + top: 12px; + right: 21px; + width: 56px; + height: 56px; + text-align: center; + line-height: 56px; + margin-left: 15px; + color: #fff; + position: absolute; + opacity: .2; + } + .stats-title { + color: #fff; + color: rgba(255, 255, 255, .6); + } + .stats-split { + height: 2px; + margin: 0 -15px 10px; + background: rgba(0, 0, 0, .2); + } + .stats-content { + font-size: 24px; + font-weight: 300; + margin-bottom: 10px; + } + .stats-desc { + display: inline-block; + color: #fff; + color: rgba(255, 255, 255, .6); + } + .stats-action { + display: inline-block; + float: right; + } + + a { + color: #eee; + color: rgba(255, 255, 255, .7); + &:hover { + color: #fff; + } + } + + &.widget-info { + background-color: @color-bg-info; + } + &.widget-primary { + background-color: @color-bg-primary; + } + + &.widget-success { + background-color: @color-bg-success; + } + &.widget-warning { + background-color: @color-bg-warning; + } + &.widget-danger { + background-color: @color-bg-danger; + } +} + +.panel { + border: none; + box-shadow: none; + border-radius: 3px; + + .panel-heading { + padding: 6px 15px; + color: #fff; + // border-bottom-width: 2px; + // border-bottom-color: rgba(0, 0, 0, .2); + + .panel-title { + font-size: 14px; + } + .panel-heading-btn { + float: right; + + .btn { + display: inline-block; + padding: 0; + border: none; + text-align: center; + + &.btn-xs { + width: 18px; + height: 18px; + line-height: 18px; + font-size: 12px; + } + &.btn-circle { + border-radius: 50%; + } + } + } + } +} + +.place-holder-h200 { + width: 100%; + height: 300px; + background-color: #eee; + border: 1px solid #ccc; + line-height: 200px; + text-align: center; +} + +.dashboard-panel2-holder { + width: 100%; + height: 1150px; + background-color: #eee; + border: 1px solid #ccc; + line-height: 200px; + text-align: center; +} + +.dashboard-panel-time { + color: #cecece; +} + +.box { + border: none; + box-shadow: none; + border-radius: 3px; + background-color: #fff; + padding: 15px; + margin-bottom: 15px; +} + +.box-fluid { + border: none; + box-shadow: none; + border-radius: 3px; + //background-color: #fff; + //padding: 15px; + margin-bottom: 15px; +} + +.box, .box-fluid { + + &.box-sm { + padding: 5px 15px; + } + + .box-title { + margin-bottom: 10px; + .title { + display: inline-block; + font-size: 18px; + color: #333; + height: 30px; + line-height: 30px; + } + .btn-sm { + padding: 3px 8px; + margin-top: -5px; + } + } + + .nav-tabs { + font-size: 14px; + font-weight: bold; + + & > li:first-child { + margin-left: 50px; + } + } + + .nav li a { + //padding: 5px 20px 3px 20px; + } + + .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-license { + //height: 30px; + line-height: 30px; + + .breadcrumb { + padding: 0; + margin: 0; + border-radius: 0; + background-color: transparent; + } +} + +.box-btn-bar { + //height: 30px; + line-height: 30px; + a.btn { + margin-right: 20px; + } +} + +.page-nav { + height: 30px; + line-height: 30px; + + .breadcrumb { + padding: 0; + margin: 0; + border-radius: 0; + background-color: transparent; + } + + .pagination { + margin: 0 0; + } + + .btn { + margin-top: -3px; + } +} + +.page-filter { + height: 36px; + line-height: 36px; + margin-bottom: 10px; + + .form-control { + margin-top: 5px; + margin-right: 4px; + // border-radius: 0; + } +} + +.btn.btn-sm .dropdown-menu li a { + font-size: 11px; +} + +.invite { + text-align: center; + padding-bottom: 20px; + + .code { + color: #2f3991; + font-size: 36px; + font-weight: 700; + font-family: @font-family-mono; + } + .link { + padding: 5px; + color: #2f3991; + font-size: 13px; + font-weight: 700; + background-color: #eee; + border-radius: 5px; + } +} + +.invite-send-box { + width: 300px; + margin: 0 auto; +} + +.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; +} + +.table-data { + td.loading { + text-align: left; + padding: 20px; + } + + .btn-group.open .dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.more-action { + position: absolute !important; + + .dropdown-menu { + background-color: rgba(60, 60, 60, 0.9); + color: #fff; + font-size: 13px; + + &.dropdown-menu-left { + margin-left: -120px; + } + + & > li > a { + padding: 5px 20px; + color: #fff; + + &:hover, &:active, &:visited { + background-color: @menu-normal-bg-color; + } + } + + .divider { + margin: 5px 0; + background-color: #666; + } + + } +} + +.popover-inline-edit { + input, .btn { + height: 30px; + // line-height: 30px; + } + + .popover-title { + background-color: #ddd; + } + + .popover-content { + padding: 20px 10px; + } + + .popover { + padding: 0; + + &.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #ddd; + } + } +} + +//.table-no-border { +// tbody > tr > td { +// padding: 5px; +// } +//} + +.user-info-table { + font-size: 14px; + + tbody > tr > td { + padding: 8px; + } + + .user-field { + min-width: 100px; + width: 100px; + color: #999; + text-align: right; + } + .user-value { + color: #333; + font-weight: bold; + + a { + font-weight: normal; + } + } +} + +.breadcrumb.breadcrumb-trans { + background-color: transparent; +} + +//======================================== +// 业务页面 +//======================================== +.biz-box { + display: inline-block; + width: 20%; + max-width: 20%; + + .bb-inner { + background-color: @color-bg-success; + //border: 1px solid #555; + margin: 3px; + border-radius: 4px; + //min-height:32px; + } + + .bb-name { + color: @color-text-on-dark-bg; + padding: 9px; + margin-bottom: 3px; + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: center; + //height:32px; + //line-height: 32px; + + //padding-top:10px; + padding-top: 1px; + padding-bottom: 1px; + } + .bb-ver { + font-size: 11px; + height: 16px; + text-align: center; + + padding: 0 5px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + + color: rgba(255, 255, 255, 0.85); + background-color: rgba(0, 0, 0, 0.3); + } + + &.mp-disabled { + .mp-inner { + background-color: @color-bg-ignore; + } + .mp-name { + color: @color-text-ignore; + } + } + &.mp-success { + .mp-inner { + background-color: @color-bg-success; + } + .mp-name { + color: @color-text-on-dark-bg; + } + } + &.mp-danger { + .mp-inner { + background-color: @color-bg-danger; + } + .mp-name { + color: @color-text-on-dark-bg; + } + } + &.mp-warning { + .mp-inner { + background-color: @color-bg-warning; + } + .mp-name { + color: @color-text-on-dark-bg; + } + } +} + +textarea.textarea-resize-y { + resize: vertical; +} + +textarea.textarea-resize-none { + resize: none; +} + +textarea.textarea-code { + font-family: @font-family-mono; +} + +textarea.cert_pub { + width: 100%; + height: 64px; + border: 1px solid #e2e2e2; + background-color: #e4ffe5; +} + +@import "_mimetype"; +@import "_gritter"; + diff --git a/server/www/teleport/view/common/_sidebar_nav_menu.mako b/server/www/teleport/view/common/_sidebar_nav_menu.mako index 9253438..59854e0 100644 --- a/server/www/teleport/view/common/_sidebar_nav_menu.mako +++ b/server/www/teleport/view/common/_sidebar_nav_menu.mako @@ -3,6 +3,13 @@ %> <% _sidebar = [ + { + 'require_type': 100, + 'id': 'dashboard', + 'link': '/dashboard', + 'name': '信息总览', + 'icon': 'fa-dashboard', + }, { 'require_type': 1, 'id': 'host', @@ -17,13 +24,6 @@ 'name': '用户管理', 'icon': 'fa-user', }, -## { -## 'require_type': 1, -## 'id': 'auth', -## 'link': '/auth', -## 'name': '授权管理', -## 'icon': 'fa-user-secret', -## }, { 'require_type': 100, 'id': 'cert', @@ -66,20 +66,6 @@ 'name': '日志查询', 'icon': 'fa-database', }, -## { -## 'require_type': 1, -## 'id': 'pwd', -## 'link': '/pwd', -## 'name': '密码修改', -## 'icon': 'fa-pencil-square-o', -## }, -## { -## 'require_type': 1, -## 'id': 'exit', -## 'link': '/exit', -## 'name': '安全退出', -## 'icon': 'fa-sign-out', -## }, { 'separator': true, 'require_type': 1, diff --git a/server/www/teleport/view/dashboard/index.mako b/server/www/teleport/view/dashboard/index.mako new file mode 100644 index 0000000..6f3234c --- /dev/null +++ b/server/www/teleport/view/dashboard/index.mako @@ -0,0 +1,108 @@ +<%! + page_title_ = '系统总览' + page_menu_ = ['dashboard'] + page_id_ = 'dashboard' +%> +<%inherit file="../page_base.mako"/> + +<%block name="extend_js"> + ## + +## + + +<%block name="breadcrumb"> + + + +<%block name="extend_css"> + + + +## Begin Main Body. + +
+ +
+
+
+
+ +
+
+
主机
+
128
+
+
+
+
+
+
+ +
+
+
用户
+
21
+
+
+
+
+
+
+ +
+
+
当前连接
+
18
+
+
+
+
+ +
+
+
+
CPU负载
+
+
+
+
+
+
+
内存使用
+
+
+
+
+
+ +
+
+
+
网络流量
+
+
+
+
+
+
+
网络连接
+
+
+
+
+
+ +
+ + +<%block name="extend_content"> + + +<%block name="embed_js"> + + diff --git a/server/www/teleport/view/set/info.mako b/server/www/teleport/view/set/info.mako index 066b8c5..117b923 100644 --- a/server/www/teleport/view/set/info.mako +++ b/server/www/teleport/view/set/info.mako @@ -6,7 +6,8 @@ <%inherit file="../page_base.mako"/> <%block name="extend_js"> -## + ## + @@ -22,9 +23,18 @@ .table .key { text-align: right; } + .table .value { text-align: left; - font-weight:bold; + font-weight: bold; + } + + .table .value .error { + color: #ff4c4c; + } + + .table .value .disabled { + color: #ffa861; } @@ -36,123 +46,21 @@
-
- -
- -

服务器配置信息

- - -## -## -## -## -
RDP 端口:52089
SSH 端口:52189
TELNET 端口:52389
录像文件路径:C:\teleport-server\data\replay
- -## -##
-## -##
-## -##
-## ##
可以用默认值
-##
-## -##
-## -##
-## -##
-## ##
可以用默认值
-##
-## -## -##
-## -##
-## -##
-## ##
可以用默认值
-##
-## -## -##
-##
-##
-## 注意:要修改端口号,请直接修改配置文件。修改后需要重启服务方能生效! -##
-##
- - - ##
- ## - ##

Teleport核心服务设置

- ##

用于与teleport核心服务进行通讯,需要将WEB后台与核心服务部署在同一台主机上。

- ##

如果您需要将核心服务部署在单独的主机上,建议您为RPC访问端口设置防火墙规则,仅允许WEB后台主机访问此RPC端口,以增强安全性。

- ## - ##
- ## - ##
- ## - ##
- ##
- ## - ##
- ## - ##
- ## - ##
- ##
- -##
-##
-##
-##
-## 一键测试 -##
-##
-## 保存配置 -##
-##
- -
- +
+

服务器配置信息

+
-
+
-<%block name="extend_content"> - -## - - - +<%block name="extend_content"> <%block name="embed_js">