1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-26 14:36:38 +02:00

Make remote includes caching work again. Both on-boot and on-rehash.

This commit is contained in:
Bram Matthys
2021-08-19 09:31:13 +02:00
parent 7b3c1165f8
commit 4e53bf874a
2 changed files with 48 additions and 47 deletions
+5 -4
View File
@@ -1903,10 +1903,11 @@ struct ConfigEntryWrapper {
struct ConfigResource {
ConfigResource *prev, *next;
ConfigFlag_ban flag;
ConfigEntryWrapper *wce;
char *file;
char *url;
char *errorbuf;
ConfigEntryWrapper *wce; /**< The place(s) where this resource is begin used */
char *file; /**< File to read: can be a conf/something file or a downloaded file */
char *url; /**< URL, if it is an URL */
char *cache_file; /**< Set to filename of local cached copy, if it is available */
char *errorbuf; /**< Error from the remote include downloading - is this even used? */
};
struct ConfigItem_blacklist_module {
+43 -43
View File
@@ -10681,43 +10681,43 @@ void resource_download_complete(const char *url, const char *file, const char *e
if (!file && !cached)
{
/* DOWNLOAD FAILED */
safe_strdup(rs->file, file);
safe_strdup(rs->errorbuf, errorbuf);
unreal_log(ULOG_ERROR, "config", "DOWNLOAD_FAILED", NULL,
"$file:$line_number: Failed to download '$url': $error_message",
log_data_string("file", rs->wce->ce->file->filename),
log_data_integer("line_number", rs->wce->ce->line_number),
log_data_string("url", displayurl(url)),
log_data_string("error_message", errorbuf));
/* Set error condition, this so config_read_file() later will stop. */
loop.config_load_failed = 1;
/* We keep the other transfers running since they may raise (more) errors.
* Which can be helpful so you can differentiate between an error of an
* include on one server, or complete lack of internet connectvitity.
*/
if (rs->cache_file)
{
unreal_log(ULOG_ERROR, "config", "DOWNLOAD_FAILED_SOFT", NULL,
"$file:$line_number: Failed to download '$url': $error_message\n"
"Using a cached copy instead.",
log_data_string("file", rs->wce->ce->file->filename),
log_data_integer("line_number", rs->wce->ce->line_number),
log_data_string("url", displayurl(url)),
log_data_string("error_message", errorbuf));
safe_strdup(rs->file, rs->cache_file);
} else {
safe_strdup(rs->errorbuf, errorbuf);
unreal_log(ULOG_ERROR, "config", "DOWNLOAD_FAILED_HARD", NULL,
"$file:$line_number: Failed to download '$url': $error_message",
log_data_string("file", rs->wce->ce->file->filename),
log_data_integer("line_number", rs->wce->ce->line_number),
log_data_string("url", displayurl(url)),
log_data_string("error_message", errorbuf));
/* Set error condition, this so config_read_file() later will stop. */
loop.config_load_failed = 1;
/* We keep the other transfers running since they may raise (more) errors.
* Which can be helpful so you can differentiate between an error of an
* include on one server, or complete lack of internet connectvitity.
*/
}
}
else
{
char *urlfile = url_getfilename(url);
char *file_basename = unreal_getfilename(urlfile);
char *tmp = unreal_mktemp(TMPDIR, file_basename ? file_basename : "download.conf");
safe_free(urlfile);
if (cached)
{
unreal_copyfileex(rs->file, tmp, 1);
unreal_copyfileex(rs->file, unreal_mkcache(url), 0);
safe_strdup(rs->file, tmp);
}
else
{
/*
copy/hardlink file to another file because our caller will
remove(file).
*/
unreal_copyfileex(file, tmp, 1);
safe_strdup(rs->file, tmp);
unreal_copyfileex(file, unreal_mkcache(url), 0);
/* Copy from cache */
safe_strdup(rs->file, rs->cache_file);
} else {
/* Copy to cache */
char *cache_file = unreal_mkcache(url);
unreal_copyfileex(file, cache_file, 1);
safe_strdup(rs->file, cache_file);
}
if (rs->flag.type & RESOURCE_INCLUDE)
@@ -10922,27 +10922,26 @@ int add_config_resource(const char *resource, int type, ConfigEntry *ce)
/* New entry */
rs = safe_alloc(sizeof(ConfigResource));
rs->wce = wce;
AddListItem(rs, config_resources);
#ifdef USE_LIBCURL
if (!url_is_valid(resource))
{
#endif
safe_strdup(rs->file, resource);
AddListItem(rs, config_resources);
#ifdef USE_LIBCURL
} else {
// FIXME: duplicate entries are fine, and we need to add them to the
// list due to 'ce' expansion and so on.
// However, we should not download the file multiple times, that is
// just a waste ;)
// FIXME: we pass a NULL file pointer here, even though it may be cached
// FIXME: similarly, we pass 0 modification time to download_file_async()
// while it should be the mtime of the cached entry
char *cache_file;
time_t modtime;
safe_strdup(rs->url, resource);
rs->flag.type = type|RESOURCE_REMOTE|RESOURCE_DLQUEUED;
AddListItem(rs, config_resources);
download_file_async(rs->url, 0, resource_download_complete, (void *)rs);
cache_file = unreal_mkcache(rs->url);
modtime = unreal_getfilemodtime(cache_file);
if (modtime > 0)
safe_strdup(rs->cache_file, cache_file); /* Cached copy is available */
download_file_async(rs->url, modtime, resource_download_complete, (void *)rs);
}
#endif
return 1;
@@ -10975,6 +10974,7 @@ void free_all_config_resources(void)
}
#endif
safe_free(rs->file);
safe_free(rs->cache_file);
DelListItem(rs, config_resources);
safe_free(rs);
}