mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-09 22:38:01 +00:00
Remote config files
Config parser can now read config files stored remotely via https/http/ftp. Requires libcurl.
This commit is contained in:
parent
1c2de13498
commit
6f8d38ee11
@ -52,6 +52,10 @@
|
|||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCURL
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
char *cnfbuf = NULL; //config file loaded
|
char *cnfbuf = NULL; //config file loaded
|
||||||
int fileconf_load; //config file load status
|
int fileconf_load; //config file load status
|
||||||
const char def_conf[] = "sgminer.conf";
|
const char def_conf[] = "sgminer.conf";
|
||||||
@ -490,6 +494,82 @@ static struct opt_table *opt_find(struct opt_table *tbl, char *optname)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Remote Config Functions (Curl Only)
|
||||||
|
**************************************/
|
||||||
|
#ifdef HAVE_LIBCURL
|
||||||
|
struct remote_config {
|
||||||
|
const char *filename;
|
||||||
|
FILE *stream;
|
||||||
|
};
|
||||||
|
|
||||||
|
//curl file data write callback
|
||||||
|
static size_t fetch_remote_config_cb(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
struct remote_config *out = (struct remote_config *)stream;
|
||||||
|
|
||||||
|
//create file if not created
|
||||||
|
if(out && !out->stream)
|
||||||
|
{
|
||||||
|
if(!(out->stream = fopen(out->filename, "w+")))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fwrite(buffer, size, nmemb, out->stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
//download remote config file - return filename on success or NULL on failure
|
||||||
|
static char *fetch_remote_config(const char *url)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
char *p;
|
||||||
|
struct remote_config file = { "", NULL };
|
||||||
|
|
||||||
|
//get filename out of url
|
||||||
|
if((p = strrchr(url, '/')) == NULL)
|
||||||
|
{
|
||||||
|
applog(LOG_ERR, "Fetch remote file failed: Invalid URL");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.filename = p+1;
|
||||||
|
|
||||||
|
//check for empty filename
|
||||||
|
if(file.filename[0] == '\0')
|
||||||
|
{
|
||||||
|
applog(LOG_ERR, "Fetch remote file failed: Invalid Filename");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//init curl
|
||||||
|
if((curl = curl_easy_init()) == NULL)
|
||||||
|
{
|
||||||
|
applog(LOG_ERR, "Fetch remote file failed: curl init failed.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//https stuff - skip verification we just want the data
|
||||||
|
if(strstr(url, "https") != NULL)
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||||
|
|
||||||
|
//set url
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
|
//set write callback and fileinfo
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fetch_remote_config_cb);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &file);
|
||||||
|
|
||||||
|
if((res = curl_easy_perform(curl)) != CURLE_OK)
|
||||||
|
applog(LOG_ERR, "Fetch remote file failed: %s", curl_easy_strerror(res));
|
||||||
|
|
||||||
|
if(file.stream)
|
||||||
|
fclose(file.stream);
|
||||||
|
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
|
return (char *)((res == CURLE_OK)?file.filename:NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/***************************************
|
/***************************************
|
||||||
* Config Parsing Functions
|
* Config Parsing Functions
|
||||||
@ -633,6 +713,16 @@ char *load_config(const char *arg, const char *parentkey, void __maybe_unused *u
|
|||||||
json_error_t err;
|
json_error_t err;
|
||||||
json_t *config;
|
json_t *config;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCURL
|
||||||
|
//if detected as url
|
||||||
|
if((strstr(arg, "http://") != NULL) || (strstr(arg, "https://") != NULL) || (strstr(arg, "ftp://") != NULL))
|
||||||
|
{
|
||||||
|
//download config file locally and reset arg to it so we can parse it
|
||||||
|
if((arg = fetch_remote_config(arg)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//most likely useless but leaving it here for now...
|
//most likely useless but leaving it here for now...
|
||||||
if(!cnfbuf)
|
if(!cnfbuf)
|
||||||
cnfbuf = strdup(arg);
|
cnfbuf = strdup(arg);
|
||||||
|
Loading…
Reference in New Issue
Block a user