@@ -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
271278struct mon_user_t {
@@ -353,15 +360,21 @@ unique_ptr<SQLite3_result> fetch_hgm_srvs_conf(PgSQL_HostGroups_Manager* hgm, co
353360
354361vector<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+
873902string 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
887926pgsql_conn_t create_new_conn (task_st_t & task_st) {
0 commit comments