mirror of https://git.48k.eu/ogserver
src: fallback to use first repository/server found
use first repository/server in the list in case no specific repository/server is found in the same network, this is a fallback that works if repository/server is reachable through gateway.master v1.2.5-19
parent
7977711ee9
commit
4567bce90b
42
src/dbi.c
42
src/dbi.c
|
@ -270,7 +270,7 @@ bool og_dbi_get_image(struct og_dbi *dbi, struct og_image *image)
|
|||
int og_dbi_get_server_ip(const struct og_dbi *dbi, const char *client_ip,
|
||||
char *res_server_ip)
|
||||
{
|
||||
const char *msglog, *netmask_ip, *server_ip;
|
||||
const char *msglog, *netmask_ip, *server_ip, *first_server_ip = NULL;
|
||||
struct in_addr client, netmask, server;
|
||||
bool found = false;
|
||||
dbi_result result;
|
||||
|
@ -321,6 +321,9 @@ int og_dbi_get_server_ip(const struct og_dbi *dbi, const char *client_ip,
|
|||
while (dbi_result_next_row(result) > 0) {
|
||||
server_ip = dbi_result_get_string(result, "ipserveradm");
|
||||
|
||||
if (server_ip[0] && !first_server_ip)
|
||||
first_server_ip = server_ip;
|
||||
|
||||
if (inet_aton(server_ip, &server) < 0) {
|
||||
syslog(LOG_ERR, "failed to get repository IP (%s:%d)\n",
|
||||
__func__, __LINE__);
|
||||
|
@ -336,26 +339,32 @@ int og_dbi_get_server_ip(const struct og_dbi *dbi, const char *client_ip,
|
|||
break;
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (!first_server_ip) {
|
||||
syslog(LOG_ERR,
|
||||
"cannot find server IP for client %s (%s:%d)\n",
|
||||
"cannot find any server IP for client %s (%s:%d)\n",
|
||||
client_ip, __func__, __LINE__);
|
||||
dbi_result_free(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
syslog(LOG_INFO, "using server IP %s for client %s\n",
|
||||
server_ip, client_ip);
|
||||
} else {
|
||||
server_ip = first_server_ip;
|
||||
syslog(LOG_INFO, "falling back to server %s for client %s\n",
|
||||
server_ip, client_ip);
|
||||
}
|
||||
|
||||
snprintf(res_server_ip, OG_DB_IP_MAXLEN + 1, "%s", server_ip);
|
||||
dbi_result_free(result);
|
||||
|
||||
syslog(LOG_INFO, "using server IP %s for computer %s\n",
|
||||
res_server_ip, client_ip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint32_t repo_id,
|
||||
const char *client_ip, char *repository_ip)
|
||||
{
|
||||
const char *msglog, *netmask_ip, *repo_ip;
|
||||
const char *msglog, *netmask_ip, *repo_ip, *first_repo_ip = NULL;
|
||||
struct in_addr client, netmask, repo;
|
||||
bool found = false;
|
||||
dbi_result result;
|
||||
|
@ -407,6 +416,9 @@ int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint32_t repo_id,
|
|||
while (dbi_result_next_row(result) > 0) {
|
||||
repo_ip = dbi_result_get_string(result, "ip");
|
||||
|
||||
if (repo_ip[0] && !first_repo_ip)
|
||||
first_repo_ip = repo_ip;
|
||||
|
||||
if (inet_aton(repo_ip, &repo) < 0) {
|
||||
syslog(LOG_ERR, "failed to get repository IP (%s:%d)\n",
|
||||
__func__, __LINE__);
|
||||
|
@ -422,19 +434,25 @@ int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint32_t repo_id,
|
|||
break;
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (!first_repo_ip) {
|
||||
syslog(LOG_ERR,
|
||||
"cannot find repository IP with repository ID %u for client %s (%s:%d)\n",
|
||||
"cannot find any repository with ID %u for client %s (%s:%d)\n",
|
||||
repo_id, client_ip, __func__, __LINE__);
|
||||
dbi_result_free(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
syslog(LOG_INFO, "using repository with ID %u and IP %s for client %s\n",
|
||||
repo_id, repo_ip, client_ip);
|
||||
} else {
|
||||
repo_ip = first_repo_ip;
|
||||
syslog(LOG_INFO, "falling back to repository wth ID %u and IP %s for client %s\n",
|
||||
repo_id, repo_ip, client_ip);
|
||||
}
|
||||
|
||||
snprintf(repository_ip, OG_DB_IP_MAXLEN + 1, "%s", repo_ip);
|
||||
dbi_result_free(result);
|
||||
|
||||
syslog(LOG_INFO, "using repository with ID %u and IP %s for computer %s\n",
|
||||
repo_id, repository_ip, client_ip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue