diff --git a/server/www/teleport/static/js/system/config.js b/server/www/teleport/static/js/system/config.js
index 5ce2671..5f37f38 100644
--- a/server/www/teleport/static/js/system/config.js
+++ b/server/www/teleport/static/js/system/config.js
@@ -706,6 +706,7 @@ $app.create_config_storage = function () {
storage_size: $('#storage-size'),
btn_save: $('#btn-save-storage-config'),
btn_cleanup: $('#btn-clear-storage'),
+ btn_export_db: $('#btn-export-db'),
input_keep_log: $('#storage-keep-log'),
input_keep_record: $('#storage-keep-record'),
@@ -735,6 +736,10 @@ $app.create_config_storage = function () {
_sto.on_btn_cleanup();
});
+ _sto.dom.btn_export_db.click(function() {
+ _sto.on_export_db();
+ });
+
cb_stack.exec();
};
@@ -835,5 +840,9 @@ $app.create_config_storage = function () {
);
};
+ _sto.on_export_db = function() {
+ window.location.href = '/system/export-db';
+ };
+
return _sto;
};
diff --git a/server/www/teleport/view/system/config.mako b/server/www/teleport/view/system/config.mako
index 9f8b0b5..bcb9763 100644
--- a/server/www/teleport/view/system/config.mako
+++ b/server/www/teleport/view/system/config.mako
@@ -378,6 +378,21 @@
+
+
+
+
+ 数据库导出
+ |
+
+
+ |
+
+
+ |
+
+
+
diff --git a/server/www/teleport/webroot/app/base/database/export.py b/server/www/teleport/webroot/app/base/database/export.py
index f0e62e5..3257cf4 100644
--- a/server/www/teleport/webroot/app/base/database/export.py
+++ b/server/www/teleport/webroot/app/base/database/export.py
@@ -14,22 +14,49 @@ def _db_exec(db, step_begin, step_end, msg, sql):
step_end(_step, 0)
-def _export_table(db, table_name, fields):
+def _export_table(db, table_name):
+ table_name = '{}{}'.format(db.table_prefix, table_name)
+ f = db.get_fields(table_name)
+ fields = [i[0] for i in f]
+ types = [i[1] for i in f]
+ if fields is None:
+ return '错误:表 {} 不存在'.format(table_name)
+ s = list()
+ for t in types:
+ if (t.lower().find('char') != -1) or (t.lower().find('text') != -1):
+ s.append(True)
+ else:
+ s.append(False)
+
ret = ['', '-- table: {}'.format(table_name), '-- fields: {}'.format(', '.join(fields)), 'TRUNCATE TABLE `{}`;'.format(table_name)]
fields_str = '`,`'.join(fields)
- sql = 'SELECT `{}` FROM `{}{}`'.format(fields_str, db.table_prefix, table_name)
+ sql = 'SELECT `{}` FROM `{}`'.format(fields_str, table_name)
d = db.query(sql)
if not d or len(d) == 0:
ret.append('-- table is empty.')
else:
fields_count = len(fields)
for i in range(len(d)):
- x = []
+ # x = []
+ # for j in range(fields_count):
+ # x.append(d[i][j].__str__())
+ # val = "','".join(x).replace('\n', '\\n')
+ x = list()
for j in range(fields_count):
- x.append(d[i][j].__str__())
- val = "','".join(x).replace('\n', '\\n')
- sql = "INSERT INTO `{}` VALUES ('{}');".format(table_name, val)
+ # if j > 0:
+ # x.append(',')
+ if s[j]:
+ if d[i][j] is None:
+ x.append('NULL')
+ else:
+ x.append('"{}"'.format(d[i][j].replace(r'"', r'\"')))
+ else:
+ x.append('{}'.format(d[i][j]))
+ val = ','.join(x)
+ print('VAL:', val, '\n')
+
+ sql = "INSERT INTO `{}` VALUES ({});".format(table_name, val)
ret.append(sql)
return '\r\n'.join(ret)
@@ -52,21 +79,41 @@ def export_database(db):
else:
ret.append('-- DATABASE VERSION {}'.format(db_ret[0][0]))
- _fields = ['account_id', 'account_type', 'account_name', 'account_pwd', 'account_status', 'account_lock', 'account_desc', 'oath_secret']
- ret.append(_export_table(db, 'account', _fields))
- _fields = ['auth_id', 'account_name', 'host_id', 'host_auth_id']
- ret.append(_export_table(db, 'auth', _fields))
- _fields = ['cert_id', 'cert_name', 'cert_pub', 'cert_pri', 'cert_desc']
- ret.append(_export_table(db, 'key', _fields))
- _fields = ['name', 'value']
- ret.append(_export_table(db, 'config', _fields))
- _fields = ['group_id', 'group_name']
- ret.append(_export_table(db, 'group', _fields))
- _fields = ['host_id', 'group_id', 'host_sys_type', 'host_ip', 'host_port', 'protocol', 'host_lock', 'host_desc']
- ret.append(_export_table(db, 'host_info', _fields))
- _fields = ['id', 'host_id', 'auth_mode', 'user_name', 'user_pswd', 'user_param', 'cert_id', 'encrypt', 'log_time']
- ret.append(_export_table(db, 'auth_info', _fields))
- _fields = ['id', 'session_id', 'account_name', 'host_ip', 'host_port', 'sys_type', 'auth_type', 'protocol', 'user_name', 'ret_code', 'begin_time', 'end_time', 'log_time']
- ret.append(_export_table(db, 'log', _fields))
+ # _fields = ['account_id', 'account_type', 'account_name', 'account_pwd', 'account_status', 'account_lock', 'account_desc', 'oath_secret']
+ # ret.append(_export_table(db, 'account', _fields))
+ # _fields = ['auth_id', 'account_name', 'host_id', 'host_auth_id']
+ # ret.append(_export_table(db, 'auth', _fields))
+ # _fields = ['cert_id', 'cert_name', 'cert_pub', 'cert_pri', 'cert_desc']
+ # ret.append(_export_table(db, 'key', _fields))
+ # _fields = ['name', 'value']
+ # ret.append(_export_table(db, 'config', _fields))
+ # _fields = ['group_id', 'group_name']
+ # ret.append(_export_table(db, 'group', _fields))
+ # _fields = ['host_id', 'group_id', 'host_sys_type', 'host_ip', 'host_port', 'protocol', 'host_lock', 'host_desc']
+ # ret.append(_export_table(db, 'host_info', _fields))
+ # _fields = ['id', 'host_id', 'auth_mode', 'user_name', 'user_pswd', 'user_param', 'cert_id', 'encrypt', 'log_time']
+ # ret.append(_export_table(db, 'auth_info', _fields))
+ # _fields = ['id', 'session_id', 'account_name', 'host_ip', 'host_port', 'sys_type', 'auth_type', 'protocol', 'user_name', 'ret_code', 'begin_time', 'end_time', 'log_time']
+ # ret.append(_export_table(db, 'log', _fields))
+
+ ret.append(_export_table(db, 'config'))
+ ret.append(_export_table(db, 'core_server'))
+ ret.append(_export_table(db, 'role'))
+ ret.append(_export_table(db, 'user'))
+ ret.append(_export_table(db, 'user_rpt'))
+ ret.append(_export_table(db, 'host'))
+ ret.append(_export_table(db, 'acc'))
+ ret.append(_export_table(db, 'acc_auth'))
+ ret.append(_export_table(db, 'group'))
+ ret.append(_export_table(db, 'group_map'))
+ ret.append(_export_table(db, 'ops_policy'))
+ ret.append(_export_table(db, 'ops_auz'))
+ ret.append(_export_table(db, 'ops_map'))
+ ret.append(_export_table(db, 'audit_policy'))
+ ret.append(_export_table(db, 'audit_auz'))
+ ret.append(_export_table(db, 'audit_map'))
+ ret.append(_export_table(db, 'syslog'))
+ ret.append(_export_table(db, 'record'))
+ ret.append(_export_table(db, 'record_audit'))
return '\r\n'.join(ret), True
diff --git a/server/www/teleport/webroot/app/base/db.py b/server/www/teleport/webroot/app/base/db.py
index 8608b21..789a125 100644
--- a/server/www/teleport/webroot/app/base/db.py
+++ b/server/www/teleport/webroot/app/base/db.py
@@ -177,6 +177,25 @@ class TPDatabase:
log.e('Unknown database type.\n')
return None
+ def get_fields(self, table_name):
+ fields = list()
+ if self.db_type == self.DB_TYPE_SQLITE:
+ ret = self.query('PRAGMA table_info(`{}`);'.format(table_name))
+ log.d('[sqlite] fields of {}'.format(table_name), ret, '\n')
+ if ret is None:
+ return None
+ for f in ret:
+ fields.append((f[1], f[2])) # field_name, field_type, e.g.: ('id', 'integer'), ('desc', 'varchar(255)')
+ elif self.db_type == self.DB_TYPE_MYSQL:
+ ret = self.query('SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`="db" AND `table_name`="{}";'.format(table_name))
+ log.d('[mysql] fields of {}'.format(table_name), ret, '\n')
+ if ret is None:
+ return None
+ for f in ret:
+ fields.append(f)
+
+ return fields
+
def is_field_exists(self, table_name, field_name):
if self.db_type == self.DB_TYPE_SQLITE:
ret = self.query('PRAGMA table_info(`{}`);'.format(table_name))
diff --git a/server/www/teleport/webroot/app/base/utils.py b/server/www/teleport/webroot/app/base/utils.py
index c21621a..eb7a052 100644
--- a/server/www/teleport/webroot/app/base/utils.py
+++ b/server/www/teleport/webroot/app/base/utils.py
@@ -160,6 +160,10 @@ def tp_second2human(n):
return ret
+def tp_timestamp_from_str(t):
+ return 0
+
+
def tp_timestamp_sec():
return int(datetime.datetime.now().timestamp())
diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py
index d121189..24688cb 100755
--- a/server/www/teleport/webroot/app/controller/__init__.py
+++ b/server/www/teleport/webroot/app/controller/__init__.py
@@ -262,6 +262,8 @@ controllers = [
(r'/system/do-ldap-get-users', system.DoLdapGetUsersHandler),
# - [json] 导入LDAP用户
(r'/system/do-ldap-import', system.DoLdapImportHandler),
+ # - [text] 导出数据库
+ (r'/system/export-db', system.DoExportDBHandler),
#
# - [json] 获取服务器时间
diff --git a/server/www/teleport/webroot/app/controller/system.py b/server/www/teleport/webroot/app/controller/system.py
index 655f454..da1e9ed 100644
--- a/server/www/teleport/webroot/app/controller/system.py
+++ b/server/www/teleport/webroot/app/controller/system.py
@@ -4,6 +4,7 @@ import datetime
import hashlib
import json
import shutil
+import time
import app.model.system as system_model
import tornado.gen
@@ -87,6 +88,18 @@ class RoleHandler(TPBaseHandler):
self.render('system/role.mako')
+class DoExportDBHandler(TPBaseHandler):
+ def get(self):
+ ret = self.check_privilege(TP_PRIVILEGE_SYS_CONFIG)
+ if ret != TPE_OK:
+ return
+ sql, err = get_db().export_to_sql()
+ self.set_header('Content-Type', 'application/sql')
+ self.set_header('Content-Disposition', 'attachment; filename="teleport-db-export-{}.sql"'.format(time.strftime('%Y%m%d-%H%M%S')))
+ self.write(sql)
+ self.finish()
+
+
class DoRoleUpdateHandler(TPBaseJsonHandler):
@tornado.gen.coroutine
def post(self):