Skip to content

Commit d6da789

Browse files
committed
Add SSL support for backend connections in PGSQL monitor
1 parent 5d2d26d commit d6da789

File tree

1 file changed

+50
-11
lines changed

1 file changed

+50
-11
lines changed

lib/PgSQL_Monitor.cpp

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,13 @@ struct mon_srv_t {
266266
string addr;
267267
uint16_t port;
268268
bool ssl;
269+
struct ssl_opts_t {
270+
string ssl_p2s_key;
271+
string ssl_p2s_cert;
272+
string ssl_p2s_ca;
273+
string ssl_p2s_crl;
274+
string ssl_p2s_crlpath;
275+
} ssl_opt;
269276
};
270277

271278
struct mon_user_t {
@@ -353,15 +360,21 @@ unique_ptr<SQLite3_result> fetch_hgm_srvs_conf(PgSQL_HostGroups_Manager* hgm, co
353360

354361
vector<mon_srv_t> ext_srvs(const unique_ptr<SQLite3_result>& srvs_info) {
355362
vector<mon_srv_t> srvs {};
356-
363+
srvs.reserve(srvs_info->rows.size());
357364
for (const auto& row : srvs_info->rows) {
358365
srvs.push_back({
359366
string { row->fields[0] },
360367
static_cast<uint16_t>(std::atoi(row->fields[1])),
361-
static_cast<bool>(std::atoi(row->fields[2]))
368+
static_cast<bool>(std::atoi(row->fields[2])),
369+
{
370+
string { pgsql_thread___ssl_p2s_key ? pgsql_thread___ssl_p2s_key : ""},
371+
string { pgsql_thread___ssl_p2s_cert ? pgsql_thread___ssl_p2s_cert : "" },
372+
string { pgsql_thread___ssl_p2s_ca ? pgsql_thread___ssl_p2s_ca : "" },
373+
string { pgsql_thread___ssl_p2s_crl ? pgsql_thread___ssl_p2s_crl : "" },
374+
string { pgsql_thread___ssl_p2s_crlpath ? pgsql_thread___ssl_p2s_crlpath : ""}
375+
}
362376
});
363377
}
364-
365378
return srvs;
366379
}
367380

@@ -870,18 +883,44 @@ pair<bool,pgsql_conn_t> get_task_conn(conn_pool_t& conn_pool, task_st_t& task_st
870883
}
871884
}
872885

886+
static void append_conninfo_param(std::ostringstream& conninfo, const std::string& key, const std::string& val) {
887+
if (val.empty()) return;
888+
889+
std::string escaped_val;
890+
escaped_val.reserve(val.length() * 2); // Reserve maximum possible size
891+
892+
for (char c : val) {
893+
if (c == '\'' || c == '\\') {
894+
escaped_val.push_back('\\');
895+
}
896+
escaped_val.push_back(c);
897+
}
898+
899+
conninfo << key << "='" << escaped_val << "' ";
900+
}
901+
873902
string build_conn_str(const task_st_t& task_st) {
874903
const mon_srv_t& srv_info { task_st.op_st.srv_info };
875904
const mon_user_t& user_info { task_st.op_st.user_info };
876905

877-
return string {
878-
"host='" + srv_info.addr + "' "
879-
+ "port='" + std::to_string(srv_info.port) + "' "
880-
+ "user='" + user_info.user + "' "
881-
+ "password='" + user_info.pass + "' "
882-
+ "dbname='" + user_info.dbname + "' "
883-
+ "application_name=ProxySQL-Monitor"
884-
};
906+
std::ostringstream conninfo;
907+
append_conninfo_param(conninfo, "user", user_info.user); // username
908+
append_conninfo_param(conninfo, "password", user_info.pass); // password
909+
append_conninfo_param(conninfo, "dbname", user_info.dbname); // dbname
910+
append_conninfo_param(conninfo, "host", srv_info.addr); // backend address
911+
conninfo << "port=" << srv_info.port << " "; // backend port
912+
conninfo << "application_name=ProxySQL-Monitor "; // application name
913+
if (srv_info.ssl) {
914+
conninfo << "sslmode='require' "; // SSL required
915+
append_conninfo_param(conninfo, "sslkey", srv_info.ssl_opt.ssl_p2s_key);
916+
append_conninfo_param(conninfo, "sslcert", srv_info.ssl_opt.ssl_p2s_cert);
917+
append_conninfo_param(conninfo, "sslrootcert", srv_info.ssl_opt.ssl_p2s_ca);
918+
append_conninfo_param(conninfo, "sslcrl", srv_info.ssl_opt.ssl_p2s_crl);
919+
append_conninfo_param(conninfo, "sslcrldir", srv_info.ssl_opt.ssl_p2s_crlpath);
920+
} else {
921+
conninfo << "sslmode='disable' "; // not supporting SSL
922+
}
923+
return conninfo.str();
885924
}
886925

887926
pgsql_conn_t create_new_conn(task_st_t& task_st) {

0 commit comments

Comments
 (0)