调整配置管理页面,目前暂时使用直接编辑配置文件的方式进行设置。

pull/32/merge
Apex Liu 2017-02-08 00:04:16 +08:00
parent c5d1baea86
commit 9d23ba299b
12 changed files with 284 additions and 179 deletions

Binary file not shown.

View File

@ -269,7 +269,7 @@ int ts_main(void)
// }
// //TS_DB_AUTH_INFO info;
// //g_db.get_auth_info(17, info);
// g_db.update_reset_log();
g_db.update_reset_log();
//mbedtls_debug_set_threshold(9999);

View File

@ -32,7 +32,7 @@ class ConfigFile(AttrDict):
# self.__save_indent = 0
# self.__loaded = False
def load(self, cfg_file):
def load_web(self, cfg_file):
if not os.path.exists(cfg_file):
log.e('configuration file does not exists: [{}]\n'.format(cfg_file))
return False
@ -71,6 +71,75 @@ class ConfigFile(AttrDict):
return True
def load_core(self, cfg_file):
if not os.path.exists(cfg_file):
log.e('configuration file does not exists: [{}]\n'.format(cfg_file))
return False
try:
_cfg = configparser.ConfigParser()
_cfg.read(cfg_file)
except:
log.e('can not load configuration file: [{}]\n'.format(cfg_file))
return False
self['core'] = AttrDict()
self['core']['rpc'] = AttrDict()
self['core']['rpc']['ip'] = '127.0.0.1'
self['core']['rpc']['port'] = 52080
if 'rpc' in _cfg:
self['core']['rpc']['ip'] = _cfg['rpc'].get('bind-ip', '127.0.0.1')
self['core']['rpc']['port'] = _cfg['rpc'].getint('bind-port', 52080)
self['core']['ssh'] = AttrDict()
self['core']['ssh']['enabled'] = False
self['core']['ssh']['port'] = 52189
if 'protocol-ssh' in _cfg:
self['core']['ssh']['enabled'] = _cfg['protocol-ssh'].getboolean('enabled', False)
self['core']['ssh']['port'] = _cfg['protocol-ssh'].getint('bind-port', 52189)
self['core']['rdp'] = AttrDict()
self['core']['rdp']['enabled'] = False
self['core']['rdp']['port'] = 52089
if 'protocol-rdp' in _cfg:
self['core']['rdp']['enabled'] = _cfg['protocol-rdp'].getboolean('enabled', False)
self['core']['rdp']['port'] = _cfg['protocol-rdp'].getint('bind-port', 52089)
self['core']['telnet'] = AttrDict()
self['core']['telnet']['enabled'] = False
self['core']['telnet']['port'] = 52389
if 'protocol-telnet' in _cfg:
self['core']['telnet']['enabled'] = _cfg['protocol-telnet'].getboolean('enabled', False)
self['core']['telnet']['port'] = _cfg['protocol-telnet'].getint('bind-port', 52389)
# if 'common' not in _cfg:
# log.e('invalid configuration file: [{}]\n'.format(cfg_file))
# return False
#
# _comm = _cfg['common']
# self['server_port'] = _comm.getint('port', 7190)
# self['log_file'] = _comm.get('log-file', None)
# if self['log_file'] is not None:
# self['log_path'] = os.path.dirname(self['log_file'])
#
# _level = _comm.getint('log-level', 2)
# if _level == 0:
# self['log_level'] = LOG_DEBUG
# elif _level == 1:
# self['log_level'] = LOG_VERBOSE
# elif _level == 2:
# self['log_level'] = LOG_INFO
# elif _level == 3:
# self['log_level'] = LOG_WARN
# elif _level == 4:
# self['log_level'] = LOG_ERROR
# else:
# self['log_level'] = LOG_VERBOSE
return True
_g_cfg = ConfigFile()
del ConfigFile

View File

@ -79,15 +79,15 @@ class SwxCore:
# db_path = os.path.join(cfg.data_path, 'ts_db.db')
get_sqlite_pool().init(cfg.data_path)
var_js = os.path.join(cfg.static_path, 'js', 'var.js')
try:
# if not os.path.exists(var_js):
f = open(var_js, 'w')
f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(get_sqlite_pool().get_config_server_ip()))
f.close()
except Exception:
log.e('can not load config: server_ip.\n')
return False
# var_js = os.path.join(cfg.static_path, 'js', 'var.js')
# try:
# # if not os.path.exists(var_js):
# f = open(var_js, 'w')
# f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(get_sqlite_pool().get_config_server_ip()))
# f.close()
# except Exception:
# log.e('can not load config: server_ip.\n')
# return False
return True
@ -98,7 +98,11 @@ class SwxCore:
_cfg_path = os.path.join(options['app_path'], 'conf')
_cfg_file = os.path.join(_cfg_path, 'web.ini')
if not cfg.load(_cfg_file):
if not cfg.load_web(_cfg_file):
return False
_cfg_file = os.path.join(_cfg_path, 'core.ini')
if not cfg.load_core(_cfg_file):
return False
cfg.cfg_path = _cfg_path

View File

@ -7,6 +7,8 @@ import urllib
import urllib.parse
import urllib.request
from eom_app.app.configs import app_cfg
from eom_app.module import set
from eom_app.module import host
from eom_app.module.common import *
from eom_common.eomcore.logger import *
@ -21,22 +23,30 @@ class IndexHandler(SwxAuthHandler):
if _user is None:
return self.write(-1)
static_path = cfg.static_path
var_js = os.path.join(static_path, 'js', 'var.js')
# static_path = cfg.static_path
# var_js = os.path.join(static_path, 'js', 'var.js')
try:
f = open(var_js, 'w')
# f = open(var_js, 'w')
_type = _user['type']
config_list = host.get_config_list()
config_list = set.get_config_list()
ts_server = dict()
ts_server['ip'] = config_list['ts_server_ip']
ts_server['ssh_port'] = config_list['ts_server_ssh_port']
ts_server['rdp_port'] = config_list['ts_server_rdp_port']
ts_server['telnet_port'] = config_list['ts_server_telnet_port']
f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(ts_server['ip']))
# ts_server['ip'] = config_list['ts_server_ip']
# ts_server['ip'] = cfg['ts_server_ip']
# ts_server['ip'] = '0.0.0.0'
# ts_server['ssh_port'] = config_list['ts_server_ssh_port']
# ts_server['rdp_port'] = config_list['ts_server_rdp_port']
# ts_server['telnet_port'] = config_list['ts_server_telnet_port']
ts_server['ssh_port'] = cfg.core.ssh.port
ts_server['rdp_port'] = cfg.core.rdp.port
ts_server['telnet_port'] = cfg.core.telnet.port
# f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(ts_server['ip']))
except Exception as e:
return self.write(-1)
finally:
f.close()
# finally:
# f.close()
if _type >= 100:
group_list = host.get_group_list()
@ -805,14 +815,16 @@ class GetSessionId(SwxAuthJsonHandler):
return
auth_id = args['auth_id']
config_list = host.get_config_list()
ts_server_rpc_ip = '127.0.0.1'
if 'ts_server_rpc_ip' in config_list:
ts_server_rpc_ip = config_list['ts_server_rpc_ip']
ts_server_rpc_port = 52080
if 'ts_server_rpc_port' in config_list:
ts_server_rpc_port = config_list['ts_server_rpc_port']
# config_list = host.get_config_list()
# ts_server_rpc_ip = '127.0.0.1'
#
# if 'ts_server_rpc_ip' in config_list:
# ts_server_rpc_ip = config_list['ts_server_rpc_ip']
# ts_server_rpc_port = 52080
# if 'ts_server_rpc_port' in config_list:
# ts_server_rpc_port = config_list['ts_server_rpc_port']
ts_server_rpc_ip = cfg.core.rpc.ip
ts_server_rpc_port = cfg.core.rpc.port
url = 'http://{}:{}/request_session'.format(ts_server_rpc_ip, ts_server_rpc_port)
values['auth_id'] = auth_id
@ -856,14 +868,16 @@ class AdminGetSessionId(SwxAuthJsonHandler):
return
values['account'] = 'admin'
config_list = host.get_config_list()
ts_server_rpc_ip = '127.0.0.1'
if 'ts_server_rpc_ip' in config_list:
ts_server_rpc_ip = config_list['ts_server_rpc_ip']
ts_server_rpc_port = 52080
if 'ts_server_rpc_port' in config_list:
ts_server_rpc_port = config_list['ts_server_rpc_port']
# config_list = host.get_config_list()
# ts_server_rpc_ip = '127.0.0.1'
#
# if 'ts_server_rpc_ip' in config_list:
# ts_server_rpc_ip = config_list['ts_server_rpc_ip']
# ts_server_rpc_port = 52080
# if 'ts_server_rpc_port' in config_list:
# ts_server_rpc_port = config_list['ts_server_rpc_port']
ts_server_rpc_ip = cfg.core.rpc.ip
ts_server_rpc_port = cfg.core.rpc.port
url = 'http://{}:{}/request_session'.format(ts_server_rpc_ip, ts_server_rpc_port)
# values['auth_id'] = auth_id
@ -947,14 +961,16 @@ class AdminFastGetSessionId(SwxAuthJsonHandler):
values['account'] = 'admin'
config_list = host.get_config_list()
ts_server_rpc_ip = '127.0.0.1'
if 'ts_server_rpc_ip' in config_list:
ts_server_rpc_ip = config_list['ts_server_rpc_ip']
ts_server_rpc_port = 52080
if 'ts_server_rpc_port' in config_list:
ts_server_rpc_port = config_list['ts_server_rpc_port']
# config_list = host.get_config_list()
# ts_server_rpc_ip = '127.0.0.1'
#
# if 'ts_server_rpc_ip' in config_list:
# ts_server_rpc_ip = config_list['ts_server_rpc_ip']
# ts_server_rpc_port = 52080
# if 'ts_server_rpc_port' in config_list:
# ts_server_rpc_port = config_list['ts_server_rpc_port']
ts_server_rpc_ip = cfg.core.rpc.ip
ts_server_rpc_port = cfg.core.rpc.port
url = 'http://{}:{}/request_session'.format(ts_server_rpc_ip, ts_server_rpc_port)
# values['auth_id'] = auth_id

View File

@ -32,10 +32,10 @@ class LogHandler(SwxAdminHandler):
user_list = user.get_user_list()
total_size, free_size = get_free_space_mb(cfg.data_path)
config_list = host.get_config_list()
# config_list = host.get_config_list()
ts_server = dict()
ts_server['ip'] = config_list['ts_server_ip']
ts_server['port'] = cfg.server_port
ts_server['ip'] = cfg.core.rpc.ip #config_list['ts_server_ip']
ts_server['port'] = cfg.core.rpc.port #cfg.server_port
self.render('log/index.mako', user_list=user_list, total_size=int(total_size), free_size=int(free_size), ts_server=ts_server)

View File

@ -47,38 +47,46 @@ class IndexHandler(SwxAdminHandler):
# f = None
try:
config_list = host.get_config_list()
ts_server = dict()
ts_server['ip'] = config_list['ts_server_ip']
ts_server['ssh_port'] = config_list['ts_server_ssh_port']
ts_server['rdp_port'] = config_list['ts_server_rdp_port']
ts_server['telnet_port'] = config_list['ts_server_telnet_port']
# f = open(var_js, 'w')
# f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(ts_server['ip']))
except Exception:
return self.write(-1)
finally:
# if f is not None:
# f.close()
pass
# try:
# config_list = host.get_config_list()
# ts_server = dict()
# ts_server['ip'] = config_list['ts_server_ip']
# ts_server['ssh_port'] = config_list['ts_server_ssh_port']
# ts_server['rdp_port'] = config_list['ts_server_rdp_port']
# ts_server['telnet_port'] = config_list['ts_server_telnet_port']
# # f = open(var_js, 'w')
# # f.write("\"use strict\";\nvar teleport_ip = \"{}\";\n".format(ts_server['ip']))
# except Exception:
# return self.write(-1)
# finally:
# # if f is not None:
# # f.close()
# pass
config_list = set.get_config_list()
if 'ts_server_ip' in config_list:
ip_list = get_local_ip()
if not isinstance(ip_list, list):
ip_list = [ip_list, ]
# config_list = set.get_config_list()
# if 'ts_server_ip' in config_list:
# ip_list = get_local_ip()
# if not isinstance(ip_list, list):
# ip_list = [ip_list, ]
#
# # ip_list.append(config_list['ts_server_ip'])
# if config_list['ts_server_ip'] not in ip_list:
# ip_list.append(config_list['ts_server_ip'])
#
# # if isinstance(temp, list):
# # ip_list.extend(temp)
#
# config_list['_ip_list'] = ip_list
# ip_list.append(config_list['ts_server_ip'])
if config_list['ts_server_ip'] not in ip_list:
ip_list.append(config_list['ts_server_ip'])
cfg_list = dict()
cfg_list['ts_server_ssh_port'] = cfg.core.ssh.port
cfg_list['ts_server_ssh_enabled'] = 1 if cfg.core.ssh.enabled else 0
cfg_list['ts_server_rdp_port'] = cfg.core.rdp.port
cfg_list['ts_server_rdp_enabled'] = 1 if cfg.core.rdp.enabled else 0
cfg_list['ts_server_telnet_port'] = cfg.core.telnet.port
cfg_list['ts_server_telnet_enabled'] = 1 if cfg.core.telnet.enabled else 0
# if isinstance(temp, list):
# ip_list.extend(temp)
config_list['_ip_list'] = ip_list
self.render('set/index.mako', config_list=config_list)
self.render('set/index.mako', config_list=cfg_list)
def _restart_func():

View File

@ -290,21 +290,21 @@ def get_group_list():
return ret
def get_config_list():
try:
sql_exec = get_db_con()
field_a = ['name', 'value']
string_sql = 'SELECT {} FROM ts_config as a ;'.format(','.join(['a.{}'.format(i) for i in field_a]))
db_ret = sql_exec.ExecProcQuery(string_sql)
h = dict()
for item in db_ret:
x = DbItem()
x.load(item, ['a_{}'.format(i) for i in field_a])
h[x.a_name] = x.a_value
return h
except:
return None
# def get_config_list():
# try:
# sql_exec = get_db_con()
# field_a = ['name', 'value']
# string_sql = 'SELECT {} FROM ts_config as a ;'.format(','.join(['a.{}'.format(i) for i in field_a]))
# db_ret = sql_exec.ExecProcQuery(string_sql)
# h = dict()
# for item in db_ret:
# x = DbItem()
# x.load(item, ['a_{}'.format(i) for i in field_a])
# h[x.a_name] = x.a_value
#
# return h
# except:
# return None
def update(host_id, kv):

View File

@ -1,32 +1,39 @@
# -*- coding: utf-8 -*-
from eom_app.app.configs import app_cfg
cfg = app_cfg()
# def get_config_list():
# try:
# from eom_app.module.common import get_db_con
# from eom_app.module.common import DbItem
# sql_exec = get_db_con()
# field_a = ['name', 'value']
# string_sql = 'SELECT {} FROM ts_config as a ;'.format(','.join(['a.{}'.format(i) for i in field_a]))
# db_ret = sql_exec.ExecProcQuery(string_sql)
# h = dict()
# for item in db_ret:
# x = DbItem()
# x.load(item, ['a_{}'.format(i) for i in field_a])
# h[x.a_name] = x.a_value
#
# return h
# except Exception as e:
# return None
#
#
# def set_config(change_list):
# from eom_app.module.common import get_db_con
# sql_exec = get_db_con()
# #
# for item in change_list:
# name = item['name']
# value = item['value']
# str_sql = 'UPDATE ts_config SET value = \'{}\' ' \
# ' WHERE name = \'{}\''.format(value, name)
# ret = sql_exec.ExecProcNonQuery(str_sql)
#
# return ret
def get_config_list():
try:
from eom_app.module.common import get_db_con
from eom_app.module.common import DbItem
sql_exec = get_db_con()
field_a = ['name', 'value']
string_sql = 'SELECT {} FROM ts_config as a ;'.format(','.join(['a.{}'.format(i) for i in field_a]))
db_ret = sql_exec.ExecProcQuery(string_sql)
h = dict()
for item in db_ret:
x = DbItem()
x.load(item, ['a_{}'.format(i) for i in field_a])
h[x.a_name] = x.a_value
return h
except Exception as e:
return None
def set_config(change_list):
from eom_app.module.common import get_db_con
sql_exec = get_db_con()
#
for item in change_list:
name = item['name']
value = item['value']
str_sql = 'UPDATE ts_config SET value = \'{}\' ' \
' WHERE name = \'{}\''.format(value, name)
ret = sql_exec.ExecProcNonQuery(str_sql)
return ret
print(cfg.core)
return cfg.core

View File

@ -13,8 +13,8 @@ ywl.on_init = function (cb_stack, cb_args) {
var config_list = ywl.page_options.config_list;
var ts_server_ip = config_list['ts_server_ip'];
$("#current-ts-server-ip").val(ts_server_ip);
// var ts_server_ip = config_list['ts_server_ip'];
// $("#current-ts-server-ip").val(ts_server_ip);
// var ts_server_rpc_ip = config_list['ts_server_rpc_ip'];
// $("#current-rpc-ip").val(ts_server_rpc_ip);
@ -31,11 +31,11 @@ ywl.on_init = function (cb_stack, cb_args) {
var ts_server_telnet_port = config_list['ts_server_telnet_port'];
$("#current-telnet-port").val(ts_server_telnet_port);
var ip_html = [];
for (var i = 0; i < config_list['_ip_list'].length; i++) {
ip_html.push('<li><a href="javascript:;">' + config_list['_ip_list'][i] + '</a></li>');
}
$('#select-ip').html(ip_html.join(''));
// var ip_html = [];
// for (var i = 0; i < config_list['_ip_list'].length; i++) {
// ip_html.push('<li><a href="javascript:;">' + config_list['_ip_list'][i] + '</a></li>');
// }
// $('#select-ip').html(ip_html.join(''));
$('#select-ip li a').click(function () {
$("#current-ts-server-ip").val($(this).text());

View File

@ -81,7 +81,7 @@
</div>
<%block name="extend_content" />
<script type="text/javascript" src="${ static_url('js/var.js') }"></script>
## <script type="text/javascript" src="${ static_url('js/var.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/underscore/underscore.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/jquery/jquery.min.js') }"></script>
<script type="text/javascript" src="${ static_url('plugins/jquery/ajaxfileupload.js') }"></script>

View File

@ -32,31 +32,31 @@
<div class="form-horizontal">
<h4><strong>Teleport服务器设置</strong></h4>
<h4><strong>Teleport服务器配置信息</strong></h4>
## <p>设置teleport服务器的访问地址和服务的端口。</p>
## <p style="font-weight:bold;color:#ff3333;">请正确设置服务器地址IP或域名否则将无法进行跳板连接</p>
<p>设置teleport服务器的服务端口。</p>
## <p>设置teleport服务器的服务端口。</p>
<div class="form-group form-group-sm" style="display:none;">
<label for="current-ts-server-ip" class="col-sm-2 control-label"><strong>堡垒机地址:</strong></label>
<div class="col-sm-6">
<div class="input-group">
<input type="text" class="form-control" id="current-ts-server-ip">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 选择IP <span class="caret"></span></button>
<ul id='select-ip' class="dropdown-menu dropdown-menu-right">
</ul>
</div>
</div>
</div>
<label for="current-ts-server-ip" class="col-sm-4 control-label" style="text-align:left;color:red;"><strong>首次安装必须修改</strong></label>
</div>
## <div class="form-group form-group-sm" style="display:none;">
## <label for="current-ts-server-ip" class="col-sm-2 control-label"><strong>堡垒机地址:</strong></label>
##
## <div class="col-sm-6">
## <div class="input-group">
## <input type="text" class="form-control" id="current-ts-server-ip">
## <div class="input-group-btn">
## <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 选择IP <span class="caret"></span></button>
## <ul id='select-ip' class="dropdown-menu dropdown-menu-right">
## </ul>
## </div>
## </div>
## </div>
## <label for="current-ts-server-ip" class="col-sm-4 control-label" style="text-align:left;color:red;"><strong>首次安装必须修改</strong></label>
## </div>
<div class="form-group form-group-sm">
<label for="current-rdp-port" class="col-sm-2 control-label"><strong>RDP 端口:</strong></label>
<div class="col-sm-6">
<input id="current-rdp-port" type="text" class="form-control" placeholder="默认值 52089"/>
<input id="current-rdp-port" type="text" class="form-control" placeholder="默认值 52089" disabled/>
</div>
## <div class="col-sm-4 control-label" style="text-align: left;">可以用默认值</div>
</div>
@ -64,7 +64,7 @@
<div class="form-group form-group-sm">
<label for="current-ssh-port" class="col-sm-2 control-label"><strong>SSH 端口:</strong></label>
<div class="col-sm-6">
<input id="current-ssh-port" type="text" class="form-control" placeholder="默认值 52189"/>
<input id="current-ssh-port" type="text" class="form-control" placeholder="默认值 52189" disabled/>
</div>
## <div class="col-sm-4 control-label" style="text-align: left;">可以用默认值</div>
</div>
@ -73,7 +73,7 @@
<div class="form-group form-group-sm">
<label for="current-telnet-port" class="col-sm-2 control-label"><strong>TELENT 端口:</strong></label>
<div class="col-sm-6">
<input id="current-telnet-port" type="text" class="form-control" placeholder="默认值 52389"/>
<input id="current-telnet-port" type="text" class="form-control" placeholder="默认值 52389" disabled/>
</div>
## <div class="col-sm-4 control-label" style="text-align: left;">可以用默认值</div>
</div>
@ -82,10 +82,11 @@
<div class="form-group form-group-sm">
<div class="col-sm-2"></div>
<div class="col-sm-6">
注意:修改端口号,需要重启服务方能生效!
注意:修改端口号,请直接修改配置文件。修改后需要重启服务方能生效!
</div>
</div>
## <hr/>
##
## <p><strong>Teleport核心服务设置</strong></p>
@ -107,15 +108,15 @@
## </div>
<hr/>
<div class="form-group form-group-sm">
<div class="col-sm-2"></div>
<div class="col-sm-2">
<a href="javascript:" id="btn-check" class="btn btn-success"><i class="fa fa-cog fa-fw"></i> 一键测试</a>
</div>
<div class="col-sm-4" style="text-align: right;">
<a href="javascript:" id="btn-save-config" class="btn btn-primary"><i class="fa fa-check fa-fw"></i> 保存配置</a>
</div>
</div>
## <div class="form-group form-group-sm">
## <div class="col-sm-2"></div>
## <div class="col-sm-2">
## <a href="javascript:" id="btn-check" class="btn btn-success"><i class="fa fa-cog fa-fw"></i> 一键测试</a>
## </div>
## <div class="col-sm-4" style="text-align: right;">
## <a href="javascript:" id="btn-save-config" class="btn btn-primary"><i class="fa fa-check fa-fw"></i> 保存配置</a>
## </div>
## </div>
</div>
@ -128,23 +129,23 @@
<%block name="extend_content">
<div class="modal fade" id="dlg_restart_service" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" style="text-align: center;">服务重启中...</h3>
</div>
<div class="modal-body">
<p style="text-align: center; font-size:36px;"><i class="fa fa-cog fa-spin"></i></p>
<p style="text-align: center;">配置已保存正在重启teleport服务请稍候...</p>
<p style="text-align: center;"><span id="reboot_time"></span></p>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
## <div class="modal fade" id="dlg_restart_service" tabindex="-1" role="dialog">
## <div class="modal-dialog" role="document">
## <div class="modal-content">
## <div class="modal-header">
## <h3 class="modal-title" style="text-align: center;">服务重启中...</h3>
## </div>
## <div class="modal-body">
## <p style="text-align: center; font-size:36px;"><i class="fa fa-cog fa-spin"></i></p>
## <p style="text-align: center;">配置已保存正在重启teleport服务请稍候...</p>
## <p style="text-align: center;"><span id="reboot_time"></span></p>
## </div>
##
## <div class="modal-footer">
## </div>
## </div>
## </div>
## </div>
</%block>