diff --git a/server/tp_core/core/tp_core.vs2015.vcxproj b/server/tp_core/core/tp_core.vs2015.vcxproj index 19427d9..47469d7 100644 --- a/server/tp_core/core/tp_core.vs2015.vcxproj +++ b/server/tp_core/core/tp_core.vs2015.vcxproj @@ -184,7 +184,7 @@ - + @@ -209,7 +209,7 @@ - + diff --git a/server/tp_core/core/tp_core.vs2015.vcxproj.filters b/server/tp_core/core/tp_core.vs2015.vcxproj.filters index 6ba5552..62f0a9e 100644 --- a/server/tp_core/core/tp_core.vs2015.vcxproj.filters +++ b/server/tp_core/core/tp_core.vs2015.vcxproj.filters @@ -52,9 +52,6 @@ main app - - main app - main app @@ -106,6 +103,9 @@ mbedtls\library + + main app + @@ -120,9 +120,6 @@ main app - - main app - main app @@ -177,6 +174,9 @@ common + + main app + diff --git a/server/tp_core/core/ts_db.cpp b/server/tp_core/core/ts_db.cpp deleted file mode 100644 index 166a5b5..0000000 --- a/server/tp_core/core/ts_db.cpp +++ /dev/null @@ -1,540 +0,0 @@ -#include "ts_db.h" -#include "ts_env.h" -#include "ts_http_client.h" - -#include "../common/ts_const.h" - -#include - -#include -#include - -typedef std::map mapStringKey; - -TsDB g_db; - -TsDB::TsDB() -{ -} - -TsDB::~TsDB() -{ -// ExThreadSmartLock locker(m_lock); -// sqlite3Map::iterator it; -// for (it = m_sqlite3Map.begin(); it != m_sqlite3Map.end(); it++) -// { -// if (it->second != NULL) -// { -// sqlite3_close(it->second); -// it->second = NULL; -// } -// } -// m_sqlite3Map.clear(); -} - -// sqlite3* TsDB::get_db() -// { -// ex_astr db_path; -// ex_wstr2astr(g_env.m_db_file, db_path); -// -// ex_u64 _tid = ex_get_thread_id(); -// -// { -// ExThreadSmartLock locker(m_lock); -// long tid = (long)_tid; -// sqlite3Map::iterator it = m_sqlite3Map.find(tid); -// if (it != m_sqlite3Map.end()) -// return it->second; -// -// sqlite3* sql_db = NULL; -// int ret = sqlite3_open(db_path.c_str(), &sql_db); -// if (SQLITE_OK != ret) -// { -// EXLOGE("[core-db] can not open database: %s\n", sqlite3_errmsg(sql_db)); -// sqlite3_close(sql_db); -// sql_db = NULL; -// return NULL; -// } -// -// m_sqlite3Map[tid] = sql_db; -// return sql_db; -// } -// -// return NULL; -// } - -bool TsDB::get_auth_info(int auth_id, Json::Value& jret) -{ - Json::FastWriter json_writer; - Json::Value jreq; - jreq["method"] = "get_auth_info"; - jreq["param"]["authid"] = auth_id; - - ex_astr json_param; - json_param = json_writer.write(jreq); - - ex_astr param; - ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; - url += param; - - ex_astr body; - if (!ts_http_get(url, body)) - { -// EXLOGV("request `get_auth_info` from web return: "); -// EXLOGV(body.c_str()); -// EXLOGV("\n"); - return false; - } - - Json::Reader jreader; - - if (!jreader.parse(body.c_str(), jret)) - return false; - if (!jret.isObject()) - return false; - if (!jret["data"].isObject()) - return false; - - Json::Value& _jret = jret["data"]; - - if ( - !_jret["host_ip"].isString() - || !_jret["host_port"].isInt() - || !_jret["sys_type"].isInt() - || !_jret["protocol"].isInt() - || !_jret["auth_mode"].isInt() - || !_jret["account_lock"].isInt() - || !_jret["user_name"].isString() - || !_jret["user_auth"].isString() - || !_jret["user_param"].isString() - || !_jret["account_name"].isString() - ) - { - return false; - } - - return true; -} - -// bool TsDB::get_auth_info(int auth_id, TS_DB_AUTH_INFO& info) -// { -// int result = 0; -// char * errmsg = NULL; -// char **dbResult; -// int nRow, nColumn; -// int i, j; -// int index; -// -// sqlite3* sql_exec = get_db(); -// if (sql_exec == NULL) -// return false; -// -// char szSQL[1024] = { 0 }; -// ex_strformat(szSQL, 1024, -// "SELECT a.auth_id as auth_id, a.account_name as account_name, \ -// a.host_auth_id as host_auth_id, a.host_id as host_id,host_lock, \ -// b.host_sys_type as host_sys_type, host_ip, host_port, protocol, \ -// c.user_pswd as user_pswd, c.cert_id as cert_id, c.user_name as user_name, \ -// c.encrypt as encrypt, c.auth_mode as auth_mode,c.user_param as user_param, \ -// d.account_lock as account_lock FROM ts_auth as a \ -// LEFT JOIN ts_host_info as b ON a.host_id = b.host_id \ -// LEFT JOIN ts_auth_info as c ON a.host_auth_id = c.id \ -// LEFT JOIN ts_account as d ON a.account_name = d.account_name \ -// WHERE a.auth_id=%d", auth_id); -// -// result = sqlite3_get_table(sql_exec, szSQL, &dbResult, &nRow, &nColumn, &errmsg); -// if (result != 0) -// return false; -// -// //查询是否存在表 -// index = nColumn; -// bool bFind = false; -// for (i = 0; i < nRow; i++) -// { -// mapStringKey mapstringKey; -// for (j = 0; j < nColumn; j++) -// { -// ex_astr temp = dbResult[j]; -// if (dbResult[index] == NULL) -// { -// mapstringKey[dbResult[j]] = ""; -// } -// else -// { -// mapstringKey[dbResult[j]] = dbResult[index]; -// } -// -// ++index; -// } -// -// mapStringKey::iterator it = mapstringKey.find("host_ip"); -// if (it != mapstringKey.end()) -// info.host_ip = it->second; -// -// it = mapstringKey.find("host_sys_type"); -// if (it != mapstringKey.end()) -// info.sys_type = atoi(it->second.c_str()); -// else -// return false; -// -// it = mapstringKey.find("account_name"); -// if (it != mapstringKey.end()) -// info.account_name = it->second; -// else -// return false; -// -// it = mapstringKey.find("account_lock"); -// if (it != mapstringKey.end()) -// info.account_lock = atoi(it->second.c_str()); -// else -// return false; -// -// it = mapstringKey.find("host_lock"); -// if (it != mapstringKey.end()) -// info.host_lock = atoi(it->second.c_str()); -// else -// return false; -// -// it = mapstringKey.find("host_port"); -// if (it != mapstringKey.end()) -// info.host_port = atoi(it->second.c_str()); -// -// it = mapstringKey.find("protocol"); -// if (it != mapstringKey.end()) -// { -// info.protocol = atoi(it->second.c_str()); -// it = mapstringKey.find("host_port"); -// } -// else -// { -// return false; -// } -// -// it = mapstringKey.find("encrypt"); -// if (it != mapstringKey.end()) -// info.is_encrypt = atoi(it->second.c_str()); -// else -// return false; -// -// it = mapstringKey.find("auth_mode"); -// if (it != mapstringKey.end()) -// info.auth_mode = atoi(it->second.c_str()); -// else -// return false; -// -// it = mapstringKey.find("user_name"); -// if (it != mapstringKey.end()) -// info.user_name = it->second; -// else -// return false; -// -// it = mapstringKey.find("user_param"); -// if (it != mapstringKey.end()) -// info.user_param = it->second; -// else -// return false; -// -// if (info.auth_mode == TS_AUTH_MODE_PASSWORD) -// { -// it = mapstringKey.find("user_pswd"); -// if (it != mapstringKey.end()) -// info.user_auth = it->second; -// else -// return false; -// } -// else if (info.auth_mode == TS_AUTH_MODE_PRIVATE_KEY) -// { -// it = mapstringKey.find("cert_id"); -// if (it != mapstringKey.end()) -// { -// int cert_id = atoi(it->second.c_str()); -// ex_astr cert_pri; -// get_cert_pri(cert_id, cert_pri); -// info.user_auth = cert_pri; -// } -// else -// { -// return false; -// } -// } -// else if (info.auth_mode == TS_AUTH_MODE_NONE) -// { -// } -// else -// { -// } -// -// bFind = true; -// break; -// } -// -// sqlite3_free_table(dbResult); -// return bFind; -// } - -// bool TsDB::get_cert_pri(int cert_id, ex_astr& cert_pri) -// { -// int result = 0; -// char * errmsg = NULL; -// char **dbResult; -// int nRow, nColumn; -// int i, j; -// int index; -// -// sqlite3* sql_exec = get_db(); -// if (sql_exec == NULL) -// return false; -// -// char szSQL[256] = { 0 }; -// ex_strformat(szSQL, 256, "SELECT a.cert_pri as cert_pri FROM ts_cert as a WHERE a.cert_id=%d", cert_id); -// -// result = sqlite3_get_table(sql_exec, szSQL, &dbResult, &nRow, &nColumn, &errmsg); -// if (result != 0) -// return false; -// -// //查询是否存在表 -// index = nColumn; -// for (i = 0; i < nRow; i++) -// { -// mapStringKey mapstringKey; -// for (j = 0; j < nColumn; j++) -// { -// ex_astr temp = dbResult[j]; -// if (dbResult[index] == NULL) -// mapstringKey[dbResult[j]] = ""; -// else -// mapstringKey[dbResult[j]] = dbResult[index]; -// -// ++index; -// } -// -// mapStringKey::iterator it = mapstringKey.find("cert_pri"); -// if (it != mapstringKey.end()) -// cert_pri = it->second.c_str(); -// } -// -// sqlite3_free_table(dbResult); -// return true; -// } - -// bool TsDB::get_host_count(int& count) -// { -// int result; -// char * errmsg = NULL; -// char **dbResult; //是 char ** 类型,两个*号 -// int nRow, nColumn; -// int index; -// -// sqlite3* sql_exec = get_db(); -// if (sql_exec == NULL) -// return false; -// -// const char* szSQL = "select count(*) from ts_host_info;"; -// -// result = sqlite3_get_table(sql_exec, szSQL, &dbResult, &nRow, &nColumn, &errmsg); -// if (result != 0) -// { -// if (dbResult) -// sqlite3_free_table(dbResult); -// return false; -// } -// -// index = nColumn; -// if (nColumn != 1) -// { -// if (dbResult) -// sqlite3_free_table(dbResult); -// return false; -// } -// -// count = atoi(dbResult[index]); -// -// sqlite3_free_table(dbResult); -// -// return true; -// } - -bool TsDB::update_reset_log() -{ - ex_astr param; - ts_url_encode("{\"method\":\"session_fix\",\"param\":[]}", param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; - url += param; - - ex_astr body; - return ts_http_get(url, body); -} - -// bool TsDB::session_begin(TS_SESSION_INFO& info, int& sid) -// { -// int result; -// char * errmsg = NULL; -// char **dbResult; -// int nRow, nColumn; -// int index; -// -// sqlite3* sql_exec = get_db(); -// if (sql_exec == NULL) -// return false; -// -// int ret_code = 0; -// int begin_time = 0; -// int end_time = 0; -// -// struct tm _now; -// if (!ex_localtime_now(&begin_time, &_now)) -// return false; -// -// char szTime[64] = { 0 }; -// ex_strformat(szTime, 64, "%04d-%02d-%02d %02d:%02d:%02d", (1900 + _now.tm_year), (1 + _now.tm_mon), _now.tm_mday, _now.tm_hour, _now.tm_min, _now.tm_sec); -// -// char szSQL[1024] = { 0 }; -// ex_strformat(szSQL, 1024, -// "INSERT INTO ts_log (session_id, account_name,host_ip,sys_type, host_port,auth_type,\ -// user_name,ret_code,begin_time,end_time,log_time, protocol) \ -// VALUES (\'%s\', \'%s\',\'%s\', %d,%d,%d,\'%s\', %d, %d,%d, \'%s\', %d);", -// info.sid.c_str(), info.account_name.c_str(), info.host_ip.c_str(), info.sys_type, -// info.host_port, info.auth_mode, info.user_name.c_str(), ret_code, begin_time, end_time, -// szTime, info.protocol); -// -// result = sqlite3_exec(sql_exec, szSQL, NULL, NULL, &errmsg); -// if (result != 0) -// { -// EXLOGE("[db] insert new session failed: %s.\n", errmsg); -// return false; -// } -// -// ex_strformat(szSQL, 1024, "SELECT last_insert_rowid() as id;"); -// result = sqlite3_get_table(sql_exec, szSQL, &dbResult, &nRow, &nColumn, &errmsg); -// if (result != 0) -// { -// if (dbResult) -// sqlite3_free_table(dbResult); -// return false; -// } -// -// index = nColumn; -// if (nColumn != 1) -// { -// if (dbResult) -// sqlite3_free_table(dbResult); -// return false; -// } -// -// sid = atoi(dbResult[index]); -// -// sqlite3_free_table(dbResult); -// -// return true; -// } - -bool TsDB::session_begin(TS_SESSION_INFO& info, int& record_id) -{ - Json::FastWriter json_writer; - Json::Value jreq; - -// ex_strformat(szSQL, 1024, -// "INSERT INTO ts_log (session_id, account_name,host_ip,sys_type, host_port,auth_type,\ -// user_name,ret_code,begin_time,end_time,log_time, protocol) \ -// VALUES (\'%s\', \'%s\',\'%s\', %d,%d,%d,\'%s\', %d, %d,%d, \'%s\', %d);", -// info.sid.c_str(), info.account_name.c_str(), info.host_ip.c_str(), info.sys_type, -// info.host_port, info.auth_mode, info.user_name.c_str(), ret_code, begin_time, end_time, -// szTime, info.protocol); - - jreq["method"] = "session_begin"; - jreq["param"]["sid"] = info.sid.c_str(); - jreq["param"]["account_name"] = info.account_name.c_str(); - jreq["param"]["host_ip"] = info.host_ip.c_str(); - jreq["param"]["sys_type"] = info.sys_type; - jreq["param"]["host_port"] = info.host_port; - jreq["param"]["auth_mode"] = info.auth_mode, - jreq["param"]["user_name"] = info.user_name.c_str(); - jreq["param"]["protocol"] = info.protocol; - - ex_astr json_param; - json_param = json_writer.write(jreq); - - ex_astr param; - ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; - url += param; - - ex_astr body; - if (!ts_http_get(url, body)) - { - // EXLOGV("request `get_auth_info` from web return: "); - // EXLOGV(body.c_str()); - // EXLOGV("\n"); - return false; - } - - Json::Reader jreader; - Json::Value jret; - - if (!jreader.parse(body.c_str(), jret)) - return false; - if (!jret.isObject()) - return false; - if (!jret["data"].isObject()) - return false; - if (!jret["data"]["rid"].isUInt()) - return false; - - record_id = jret["data"]["rid"].asUInt(); - - return true; -} - -//session 结束 -bool TsDB::session_end(int record_id, int ret_code) -{ -// int result = 0; -// char * errmsg = NULL; -// -// sqlite3* sql_exec = get_db(); -// if (sql_exec == NULL) -// return false; -// -// int end_time = 0; -// if (!ex_localtime_now(&end_time, NULL)) -// { -// EXLOGE("[db] can not local time.\n"); -// return false; -// } -// -// char szSQL[256] = { 0 }; -// ex_strformat(szSQL, 256, "UPDATE ts_log SET ret_code=%d, end_time=%d WHERE id=%d;", ret_code, end_time, id); -// -// result = sqlite3_exec(sql_exec, szSQL, 0, 0, &errmsg); -// if (result != 0) -// { -// EXLOGE("[db] update log failed: %s.\n", errmsg); -// return false; -// } -// -// return true; - - Json::FastWriter json_writer; - Json::Value jreq; - jreq["method"] = "session_end"; - jreq["param"]["rid"] = record_id; - jreq["param"]["code"] = ret_code; - - ex_astr json_param; - json_param = json_writer.write(jreq); - - ex_astr param; - ts_url_encode(json_param.c_str(), param); - ex_astr url = "http://127.0.0.1:7190/rpc?"; - url += param; - -// ex_astr param; -// ts_url_encode("{\"method\":\"session_end\",\"param\":[]}", param); -// ex_astr url = "http://127.0.0.1:7190/rpc?"; -// url += param; - - ex_astr body; - return ts_http_get(url, body); -} - diff --git a/server/tp_core/core/ts_db.h b/server/tp_core/core/ts_db.h deleted file mode 100644 index 051fcdb..0000000 --- a/server/tp_core/core/ts_db.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef __TS_DB_H__ -#define __TS_DB_H__ - -#include "ts_session.h" - -#include -//#include -#include - -// #include -// typedef std::map sqlite3Map; -// -// typedef struct TS_DB_AUTH_INFO -// { -// ex_astr host_ip; -// int host_port; -// int host_lock; -// int sys_type; -// int protocol; -// int is_encrypt; -// int auth_mode; -// int account_lock; -// ex_astr user_name; -// ex_astr user_auth; -// ex_astr user_param; -// ex_astr account_name; -// }TS_DB_AUTH_INFO; -// -// typedef struct TS_DB_AUTH_INFO_2 -// { -// int auth_id; -// int host_id; -// ex_astr host_ip; -// int pro_type; -// int auth_mode; -// int host_lock; -// }TS_DB_AUTH_INFO_2; - -// typedef struct TS_DB_AUTH_INFO_3 -// { -// int host_id; -// ex_astr host_ip; -// ex_astr host_user_name; -// ex_astr host_user_pwd; -// int auth_mode; -// int cert_id; -// ex_astr cert_name; -// ex_astr cert_pri; -// ex_astr cert_pub; -// -// }TS_DB_AUTH_INFO_3; - -// typedef struct TS_DB_SERVER_CONFIG -// { -// ex_astr ts_server_rpc_ip; -// int ts_server_rpc_port; -// int ts_server_rdp_port; -// int ts_server_ssh_port; -// int ts_server_telnet_port; -// }TS_DB_SERVER_CONFIG; - -// typedef std::vector AuthInfo2Vec; -// typedef std::vector AuthInfo3Vec; -class TsDB -{ -public: - TsDB(); - ~TsDB(); - - // 根据认证ID获取认证信息(包括服务器IP、端口,用户名、密码或私钥、协议如RDP或SSH等等) - bool get_auth_info(int auth_id, Json::Value& jret); - - // 重置log日志状态 - bool update_reset_log(); - // 记录会话的开始 - bool session_begin(TS_SESSION_INFO& info, int& record_id); - //session 结束 - bool session_end(int id,int ret_code); - -// protected: -// sqlite3* get_db(); -// private: -// ExThreadLock m_lock; -// sqlite3Map m_sqlite3Map; -}; - -extern TsDB g_db; - -#endif // __TS_DB_H__ diff --git a/server/tp_core/core/ts_http_rpc.cpp b/server/tp_core/core/ts_http_rpc.cpp index eb10fa2..6fedd47 100644 --- a/server/tp_core/core/ts_http_rpc.cpp +++ b/server/tp_core/core/ts_http_rpc.cpp @@ -2,7 +2,7 @@ #include "ts_env.h" #include "ts_session.h" #include "ts_crypto.h" -#include "ts_db.h" +#include "ts_web_rpc.h" //#include @@ -279,6 +279,43 @@ void TsHttpRpc::_rpc_func_exit(const Json::Value& json_param, ex_astr& buf) _create_json_ret(buf, TSR_OK); } +void TsHttpRpc::_rpc_func_get_config(const Json::Value& json_param, ex_astr& buf) +{ + Json::Value jr_data; + + ExIniFile& ini = g_env.get_ini(); + ex_ini_sections& secs = ini.GetAllSections(); + ex_ini_sections::iterator it = secs.begin(); + for (; it != secs.end(); ++it) + { + if (it->first.length() > 9 && 0 == wcsncmp(it->first.c_str(), L"protocol-", 9)) + { + ex_wstr libname; + if (!it->second->GetStr(L"lib", libname)) + continue; + + bool enabled = false; + it->second->GetBool(L"enabled", enabled, false); + if (!enabled) + { + EXLOGV(L"[core] `%ls` not enabled.\n", libname.c_str()); + continue; + } + +// if (!g_tpp_mgr.load_tpp(libname)) +// { +// all_ok = false; +// break; +// } + } + } + + jr_data["sid"] = sid; + + _create_json_ret(buf, TSR_OK, jr_data); +} + + void TsHttpRpc::_rpc_func_request_session(const Json::Value& json_param, ex_astr& buf) { // https://github.com/eomsoft/teleport/wiki/TELEPORT-CORE-JSON-RPC#request_session @@ -311,7 +348,7 @@ void TsHttpRpc::_rpc_func_request_session(const Json::Value& json_param, ex_astr authid = json_param["authid"].asInt(); Json::Value jret; - if (!g_db.get_auth_info(authid, jret)) + if (!ts_web_rpc_get_auth_info(authid, jret)) { _create_json_ret(buf, TSR_GETAUTH_INFO_ERROR); return; diff --git a/server/tp_core/core/ts_http_rpc.h b/server/tp_core/core/ts_http_rpc.h index 55ec37f..3fe16de 100644 --- a/server/tp_core/core/ts_http_rpc.h +++ b/server/tp_core/core/ts_http_rpc.h @@ -55,6 +55,8 @@ private: void _create_json_ret(ex_astr& buf, int errcode); void _create_json_ret(ex_astr& buf, int errcode, const char* message); + // 获取core服务的配置信息(主要是支持的各个协议是否启用,以及其端口号等) + void _rpc_func_get_config(const Json::Value& json_param, ex_astr& buf); // 请求一个会话ID void _rpc_func_request_session(const Json::Value& json_param, ex_astr& buf); // 加密一个字符串(返回的是密文的BASE64编码) diff --git a/server/tp_core/core/ts_main.cpp b/server/tp_core/core/ts_main.cpp index a5fe3f4..ab3f2c7 100644 --- a/server/tp_core/core/ts_main.cpp +++ b/server/tp_core/core/ts_main.cpp @@ -1,7 +1,7 @@ #include "ts_main.h" #include "ts_session.h" #include "ts_http_rpc.h" -#include "ts_db.h" +#include "ts_web_rpc.h" #include "ts_env.h" //#include "ts_http_client.h" //#include "ts_ver.h" @@ -57,12 +57,12 @@ bool tpp_take_session(const ex_astr& sid, TS_SESSION_INFO& info) bool tpp_session_begin(TS_SESSION_INFO& info, int& db_id) { - return g_db.session_begin(info, db_id); + return ts_web_rpc_session_begin(info, db_id); } bool tpp_session_end(int db_id, int ret) { - return g_db.session_end(db_id, ret); + return ts_web_rpc_session_end(db_id, ret); } typedef struct TPP_LIB @@ -257,24 +257,9 @@ int ts_main(void) } - - - - - - // if (!g_cfg.init()) - // { - // // EXLOGE("[ERROR] can not load configuration.\n"); - // return 1; - // } - // //TS_DB_AUTH_INFO info; - // //g_db.get_auth_info(17, info); - g_db.update_reset_log(); - - //mbedtls_debug_set_threshold(9999); + ts_web_rpc_register_core(); EXLOGV("[core] ---- initialized, ready for service ----\n"); - while (!g_exit_flag) { ex_sleep_ms(1000); diff --git a/server/tp_core/core/ts_web_rpc.cpp b/server/tp_core/core/ts_web_rpc.cpp new file mode 100644 index 0000000..bc642ff --- /dev/null +++ b/server/tp_core/core/ts_web_rpc.cpp @@ -0,0 +1,157 @@ +#include "ts_web_rpc.h" +#include "ts_env.h" +#include "ts_http_client.h" + +#include "../common/ts_const.h" + +#include + +bool ts_web_rpc_register_core() +{ + Json::FastWriter json_writer; + Json::Value jreq; + jreq["method"] = "register"; + jreq["param"]["ip"] = g_env.rpc_bind_ip.c_str(); + jreq["param"]["port"] = g_env.rpc_bind_port; + + ex_astr json_param; + json_param = json_writer.write(jreq); + + ex_astr param; + ts_url_encode(json_param.c_str(), param); + + ex_astr url = "http://127.0.0.1:7190/rpc?"; + url += param; + + ex_astr body; + return ts_http_get(url, body); +} + +bool ts_web_rpc_get_auth_info(int auth_id, Json::Value& jret) +{ + Json::FastWriter json_writer; + Json::Value jreq; + jreq["method"] = "get_auth_info"; + jreq["param"]["authid"] = auth_id; + + ex_astr json_param; + json_param = json_writer.write(jreq); + + ex_astr param; + ts_url_encode(json_param.c_str(), param); + ex_astr url = "http://127.0.0.1:7190/rpc?"; + url += param; + + ex_astr body; + if (!ts_http_get(url, body)) + { +// EXLOGV("request `get_auth_info` from web return: "); +// EXLOGV(body.c_str()); +// EXLOGV("\n"); + return false; + } + + Json::Reader jreader; + + if (!jreader.parse(body.c_str(), jret)) + return false; + if (!jret.isObject()) + return false; + if (!jret["data"].isObject()) + return false; + + Json::Value& _jret = jret["data"]; + + if ( + !_jret["host_ip"].isString() + || !_jret["host_port"].isInt() + || !_jret["sys_type"].isInt() + || !_jret["protocol"].isInt() + || !_jret["auth_mode"].isInt() + || !_jret["account_lock"].isInt() + || !_jret["user_name"].isString() + || !_jret["user_auth"].isString() + || !_jret["user_param"].isString() + || !_jret["account_name"].isString() + ) + { + return false; + } + + return true; +} + +bool ts_web_rpc_session_begin(TS_SESSION_INFO& info, int& record_id) +{ + Json::FastWriter json_writer; + Json::Value jreq; + + jreq["method"] = "session_begin"; + jreq["param"]["sid"] = info.sid.c_str(); + jreq["param"]["account_name"] = info.account_name.c_str(); + jreq["param"]["host_ip"] = info.host_ip.c_str(); + jreq["param"]["sys_type"] = info.sys_type; + jreq["param"]["host_port"] = info.host_port; + jreq["param"]["auth_mode"] = info.auth_mode, + jreq["param"]["user_name"] = info.user_name.c_str(); + jreq["param"]["protocol"] = info.protocol; + + ex_astr json_param; + json_param = json_writer.write(jreq); + + ex_astr param; + ts_url_encode(json_param.c_str(), param); + ex_astr url = "http://127.0.0.1:7190/rpc?"; + url += param; + + ex_astr body; + if (!ts_http_get(url, body)) + { + // EXLOGV("request `get_auth_info` from web return: "); + // EXLOGV(body.c_str()); + // EXLOGV("\n"); + return false; + } + + Json::Reader jreader; + Json::Value jret; + + if (!jreader.parse(body.c_str(), jret)) + return false; + if (!jret.isObject()) + return false; + if (!jret["data"].isObject()) + return false; + if (!jret["data"]["rid"].isUInt()) + return false; + + record_id = jret["data"]["rid"].asUInt(); + + return true; +} + +//session 结束 +bool ts_web_rpc_session_end(int record_id, int ret_code) +{ + Json::FastWriter json_writer; + Json::Value jreq; + jreq["method"] = "session_end"; + jreq["param"]["rid"] = record_id; + jreq["param"]["code"] = ret_code; + + ex_astr json_param; + json_param = json_writer.write(jreq); + + ex_astr param; + ts_url_encode(json_param.c_str(), param); + ex_astr url = "http://127.0.0.1:7190/rpc?"; + url += param; + +// ex_astr param; +// ts_url_encode("{\"method\":\"session_end\",\"param\":[]}", param); +// ex_astr url = "http://127.0.0.1:7190/rpc?"; +// url += param; + + ex_astr body; + return ts_http_get(url, body); +} diff --git a/server/tp_core/core/ts_web_rpc.h b/server/tp_core/core/ts_web_rpc.h new file mode 100644 index 0000000..51bd45f --- /dev/null +++ b/server/tp_core/core/ts_web_rpc.h @@ -0,0 +1,20 @@ +#ifndef __TS_WEB_RPC_H__ +#define __TS_WEB_RPC_H__ + +#include "ts_session.h" + +#include + +// 重置log日志状态 +bool ts_web_rpc_register_core(); + +// 根据认证ID获取认证信息(包括服务器IP、端口,用户名、密码或私钥、协议如RDP或SSH等等) +bool ts_web_rpc_get_auth_info(int auth_id, Json::Value& jret); + +// 记录会话的开始 +bool ts_web_rpc_session_begin(TS_SESSION_INFO& info, int& record_id); +//session 结束 +bool ts_web_rpc_session_end(int id, int ret_code); + + +#endif // __TS_WEB_RPC_H__ diff --git a/server/www/teleport/app/eom_app/app/configs.py b/server/www/teleport/app/eom_app/app/configs.py index e4d0667..38219f1 100644 --- a/server/www/teleport/app/eom_app/app/configs.py +++ b/server/www/teleport/app/eom_app/app/configs.py @@ -65,51 +65,53 @@ class ConfigFile(AttrDict): # log.set_attribute(min_level=self['log_level']) - 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) + self['core_server_rpc'] = _comm.get('core-server-rpc', 'http://127.0.0.1:52080/rpc') 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) + # + # return True + _g_cfg = ConfigFile() del ConfigFile diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py index 082095c..006eb82 100644 --- a/server/www/teleport/app/eom_app/app/core.py +++ b/server/www/teleport/app/eom_app/app/core.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- import os -import sys +# import sys +import json +import urllib.parse +import urllib.request import tornado.httpserver import tornado.ioloop @@ -46,9 +49,11 @@ class WebServerCore: return False # TODO: 涓嶈鐩存帴璇诲彇core.ini锛岃屾槸閫氳繃core鐨刯son-rpc鑾峰彇鍏堕厤缃暟鎹 - _cfg_file = os.path.join(cfg.cfg_path, 'core.ini') - if not cfg.load_core(_cfg_file): - return False + # _cfg_file = os.path.join(cfg.cfg_path, 'core.ini') + # if not cfg.load_core(_cfg_file): + # return False + # if not self._get_core_server_config(): + # return False cfg.log_path = os.path.abspath(options['log_path']) cfg.log_file = os.path.join(cfg.log_path, 'tpweb.log') @@ -72,6 +77,31 @@ class WebServerCore: return True + def _get_core_server_config(self): + try: + req = {'method': 'get_config', 'param': []} + req_data = json.dumps(req) + data = urllib.parse.quote(req_data).encode('utf-8') + req = urllib.request.Request(url=cfg.core_server_rpc, data=data) + rep = urllib.request.urlopen(req, timeout=3) + body = rep.read().decode() + print('core-config:', body) + # info = response.info() + # _zip = info.get('Content-Encoding') + # if _zip == 'gzip': + # the_page = gzip.decompress(the_page) + # else: + # pass + # the_page = the_page.decode() + # print(the_page) + # return the_page + x = json.loads(body) + cfg.core = x['data'] + except: + log.w('can not connect to core server for get config, maybe it not start yet.\n') + + # return True + def run(self): settings = { @@ -106,6 +136,8 @@ class WebServerCore: # settings['compiled_template_cache'] = False # settings['static_hash_cache'] = False + # 灏濊瘯閫氳繃CORE-JSON-RPC鑾峰彇core鏈嶅姟鐨勯厤缃紙涓昏鏄痵sh/rdp/telnet鐨勭鍙o級 + self._get_core_server_config() from eom_app.controller import controllers web_app = tornado.web.Application(controllers, **settings) @@ -118,9 +150,12 @@ class WebServerCore: log.e('Can not listen on port {}, maybe it been used by another application.\n'.format(cfg.server_port)) return 0 + # 鍚姩session瓒呮椂绠$悊 web_session().start() + tornado.ioloop.IOLoop.instance().start() + web_session().stop() return 0 diff --git a/server/www/teleport/app/eom_app/controller/record.py b/server/www/teleport/app/eom_app/controller/record.py index 385e70e..5b5803b 100644 --- a/server/www/teleport/app/eom_app/controller/record.py +++ b/server/www/teleport/app/eom_app/controller/record.py @@ -13,19 +13,17 @@ from .base import SwxAdminHandler, SwxAdminJsonHandler cfg = app_cfg() -def get_free_space_mb(folder): +def get_free_space_bytes(folder): """ Return folder/drive free space (in bytes) """ if platform.system() == 'Windows': _free_bytes = ctypes.c_ulonglong(0) _total_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(folder, None, ctypes.pointer(_total_bytes), ctypes.pointer(_free_bytes)) - # return _total_bytes.value / 1024 / 1024 / 1024, _free_bytes.value / 1024 / 1024 / 1024 total_bytes = _total_bytes.value free_bytes = _free_bytes.value else: st = os.statvfs(folder) - # return st.f_blocks * st.f_frsize / 1024 / 1024 / 1024, st.f_bavail * st.f_frsize / 1024 / 1024 / 1024 total_bytes = st.f_blocks * st.f_frsize free_bytes = st.f_bavail * st.f_frsize @@ -35,12 +33,11 @@ def get_free_space_mb(folder): class LogHandler(SwxAdminHandler): def get(self): user_list = user.get_user_list() - total_size, free_size = get_free_space_mb(cfg.data_path) + total_size, free_size = get_free_space_bytes(cfg.data_path) - # config_list = host.get_config_list() ts_server = dict() - ts_server['ip'] = cfg.core.rpc.ip # config_list['ts_server_ip'] - ts_server['port'] = cfg.core.rpc.port # cfg.server_port + ts_server['ip'] = cfg.core.rpc.ip + ts_server['port'] = cfg.core.rpc.port self.render('log/index.mako', user_list=user_list, total_size=total_size, free_size=free_size, ts_server=ts_server) diff --git a/server/www/teleport/app/eom_app/controller/rpc.py b/server/www/teleport/app/eom_app/controller/rpc.py index f1f5777..265645d 100644 --- a/server/www/teleport/app/eom_app/controller/rpc.py +++ b/server/www/teleport/app/eom_app/controller/rpc.py @@ -6,10 +6,13 @@ import tornado.gen import json import urllib.parse from eom_app.app.session import web_session +from eom_app.app.configs import app_cfg from eom_app.module import host, record from .base import SwxJsonHandler +cfg = app_cfg() + class RpcHandler(SwxJsonHandler): @tornado.gen.coroutine @@ -52,8 +55,8 @@ class RpcHandler(SwxJsonHandler): return self._session_begin(_req['param']) elif 'session_end' == _req['method']: return self._session_end(_req['param']) - elif 'session_fix' == _req['method']: - return self._session_fix() + elif 'register_core' == _req['method']: + return self._register_core(_req['param']) elif 'exit' == _req['method']: return self._exit() @@ -121,8 +124,10 @@ class RpcHandler(SwxJsonHandler): else: self.write_json(0) - def _session_fix(self): + def _register_core(self, param): + # 鍥犱负core鏈嶅姟鍚姩浜嗭紙涔嬪墠鍙兘闈炴甯哥粓姝簡锛夛紝鍋氫竴涓嬫暟鎹簱涓細璇濈姸鎬佺殑淇鎿嶄綔 record.session_fix() + self.write_json(0) def _exit(self):