diff --git a/lib/ProxySQL_HTTP_Server.cpp b/lib/ProxySQL_HTTP_Server.cpp index c67bebce2..277e6eb17 100644 --- a/lib/ProxySQL_HTTP_Server.cpp +++ b/lib/ProxySQL_HTTP_Server.cpp @@ -87,7 +87,7 @@ static char * check_latest_version() { string s = "proxysql-agent/"; s += PROXYSQL_VERSION; curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, s.c_str()); - curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 5); + curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 10); curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 10); res = curl_easy_perform(curl_handle); diff --git a/src/main.cpp b/src/main.cpp index b6ea5ea0b..d8b399fc0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,8 @@ #include #include "ev.h" +#include "curl/curl.h" + #include /* @@ -135,6 +137,77 @@ DH *get_dh2048() return(dh); } +struct MemoryStruct { + char *memory; + size_t size; +}; + + +static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)userp; + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + assert(mem->memory); + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + return realsize; +} + + +static char * main_check_latest_version() { + CURL *curl_handle; + CURLcode res; + struct MemoryStruct chunk; + chunk.memory = (char *)malloc(1); + chunk.size = 0; + curl_global_init(CURL_GLOBAL_ALL); + curl_handle = curl_easy_init(); + curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.proxysql.com/latest"); + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + + string s = "proxysql-agent/"; + s += PROXYSQL_VERSION; + if (binary_sha1) { + s += " (" ; + s+= binary_sha1; + s += ")" ; + } + curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, s.c_str()); + curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 10); + curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 10); + + res = curl_easy_perform(curl_handle); + + if (res != CURLE_OK) { + switch (res) { + case CURLE_COULDNT_RESOLVE_HOST: + case CURLE_COULDNT_CONNECT: + case CURLE_OPERATION_TIMEDOUT: + break; + default: + proxy_error("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + break; + } + free(chunk.memory); + chunk.memory = NULL; + } + curl_easy_cleanup(curl_handle); + curl_global_cleanup(); + return chunk.memory; +} + +void * main_check_latest_version_thread(void *arg) { + char * latest_version = main_check_latest_version(); + if (latest_version) { + proxy_info("Latest ProxySQL version available: %s\n", latest_version); + } + return NULL; +} + + @@ -1607,6 +1680,17 @@ __start_label: #endif } + //if (GloVars.check_for_new_version) { + if (0) { + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_t thr; + if (pthread_create(&thr, &attr, main_check_latest_version_thread, NULL) !=0 ) { + perror("Thread creation"); + exit(EXIT_FAILURE); + } + } { unsigned int missed_heartbeats = 0; unsigned long long previous_time = monotonic_time();