mirror of
https://github.com/weechat/weechat.git
synced 2026-06-27 05:16:38 +02:00
relay/api: add automatic reconnection to remote (closes #2166)
New options: - remote option "autoreconnect_delay" - relay.api.remote_autoreconnect_delay_growing - relay.api.remote_autoreconnect_delay_max
This commit is contained in:
@@ -132,6 +132,7 @@ relay_remote_network_disconnect (struct t_relay_remote *remote)
|
||||
relay_remote_network_close_connection (remote);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
weechat_printf (NULL, _("remote[%s]: disconnected"), remote->name);
|
||||
relay_remote_reconnect_schedule (remote);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -385,6 +386,8 @@ relay_remote_network_recv_text (struct t_relay_remote *remote,
|
||||
return;
|
||||
}
|
||||
relay_remote_set_status (remote, RELAY_STATUS_CONNECTED);
|
||||
remote->reconnect_delay = 0;
|
||||
remote->reconnect_start = 0;
|
||||
snprintf (request, sizeof (request),
|
||||
"{\"request\": \"GET /api/version\"}");
|
||||
relay_remote_network_send (remote, RELAY_MSG_STANDARD,
|
||||
@@ -835,6 +838,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND:
|
||||
weechat_printf (NULL,
|
||||
@@ -846,6 +850,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED:
|
||||
weechat_printf (NULL,
|
||||
@@ -857,6 +862,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_PROXY_ERROR:
|
||||
weechat_printf (
|
||||
@@ -871,6 +877,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR:
|
||||
weechat_printf (NULL,
|
||||
@@ -882,6 +889,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR:
|
||||
weechat_printf (NULL,
|
||||
@@ -893,6 +901,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR:
|
||||
weechat_printf (NULL,
|
||||
@@ -904,6 +913,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_MEMORY_ERROR:
|
||||
weechat_printf (NULL,
|
||||
@@ -915,6 +925,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_TIMEOUT:
|
||||
weechat_printf (NULL,
|
||||
@@ -926,6 +937,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_SOCKET_ERROR:
|
||||
weechat_printf (NULL,
|
||||
@@ -937,6 +949,7 @@ relay_remote_network_connect_cb (const void *pointer, void *data, int status,
|
||||
_("%sremote[%s]: error: %s"),
|
||||
weechat_prefix ("error"), remote->name, error);
|
||||
}
|
||||
relay_remote_network_disconnect (remote);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1208,7 +1221,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
remote->name,
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]),
|
||||
ptr_resp_code);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -1222,7 +1235,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
remote->name,
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]),
|
||||
ptr_error);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -1259,7 +1272,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
remote->name,
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]),
|
||||
_("hash algorithm not found"));
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -1272,7 +1285,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
remote->name,
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]),
|
||||
_("unknown number of hash iterations"));
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -1285,7 +1298,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
remote->name,
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]),
|
||||
_("unknown TOTP status"));
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -1322,7 +1335,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
_("%sremote[%s]: not enough memory"),
|
||||
weechat_prefix ("error"),
|
||||
remote->name);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
snprintf (option_name, length, "weechat.proxy.%s.type", proxy);
|
||||
@@ -1340,7 +1353,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
NULL,
|
||||
_("%sremote[%s]: proxy \"%s\" not found, cannot connect"),
|
||||
weechat_prefix ("error"), remote->name, proxy);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
str_proxy_type = weechat_config_string (proxy_type);
|
||||
@@ -1353,7 +1366,7 @@ relay_remote_network_url_handshake_cb (const void *pointer,
|
||||
_("%sremote[%s]: missing proxy settings, check options for "
|
||||
"proxy \"%s\""),
|
||||
weechat_prefix ("error"), remote->name, proxy);
|
||||
relay_remote_set_status (remote, RELAY_STATUS_DISCONNECTED);
|
||||
relay_remote_network_disconnect (remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1302,18 +1302,13 @@ relay_client_send (struct t_relay_client *client,
|
||||
* Timer callback, called each second.
|
||||
*/
|
||||
|
||||
int
|
||||
relay_client_timer_cb (const void *pointer, void *data, int remaining_calls)
|
||||
void
|
||||
relay_client_timer ()
|
||||
{
|
||||
struct t_relay_client *ptr_client, *ptr_next_client;
|
||||
int purge_delay, auth_timeout;
|
||||
time_t current_time;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) pointer;
|
||||
(void) data;
|
||||
(void) remaining_calls;
|
||||
|
||||
purge_delay = weechat_config_integer (relay_config_network_clients_purge_delay);
|
||||
auth_timeout = weechat_config_integer (relay_config_network_auth_timeout);
|
||||
|
||||
@@ -1352,8 +1347,6 @@ relay_client_timer_cb (const void *pointer, void *data, int remaining_calls)
|
||||
|
||||
ptr_client = ptr_next_client;
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -131,8 +131,7 @@ extern int relay_client_send (struct t_relay_client *client,
|
||||
enum t_relay_msg_type msg_type,
|
||||
const char *data,
|
||||
int data_size, const char *message_raw_buffer);
|
||||
extern int relay_client_timer_cb (const void *pointer, void *data,
|
||||
int remaining_calls);
|
||||
extern void relay_client_timer ();
|
||||
extern struct t_relay_client *relay_client_new (int sock, const char *address,
|
||||
struct t_relay_server *server);
|
||||
extern struct t_relay_client *relay_client_new_with_infolist (struct t_infolist *infolist);
|
||||
|
||||
@@ -439,6 +439,8 @@ relay_command_display_remote (struct t_relay_remote *remote, int with_detail)
|
||||
weechat_printf (NULL, " autoconnect. . . . . : %s",
|
||||
(weechat_config_string (remote->options[RELAY_REMOTE_OPTION_AUTOCONNECT])) ?
|
||||
"on" : "off");
|
||||
weechat_printf (NULL, " autoreconnect_delay. : %d",
|
||||
weechat_config_integer (remote->options[RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY]));
|
||||
weechat_printf (NULL, " proxy. . . . . . . . : '%s'",
|
||||
weechat_config_string (remote->options[RELAY_REMOTE_OPTION_PROXY]));
|
||||
weechat_printf (NULL, " tls_verify . . . . . : %s",
|
||||
@@ -474,7 +476,8 @@ relay_command_remote (const void *pointer, void *data,
|
||||
{
|
||||
struct t_relay_remote *ptr_remote, *ptr_remote2;
|
||||
int i, detailed_list, one_remote_found, update;
|
||||
const char *ptr_autoconnect, *ptr_proxy, *ptr_tls_verify, *ptr_password;
|
||||
const char *ptr_autoconnect, *ptr_autoreconnect_delay, *ptr_proxy;
|
||||
const char *ptr_tls_verify, *ptr_password;
|
||||
const char *ptr_totp_secret;
|
||||
char *remote_name;
|
||||
|
||||
@@ -601,6 +604,7 @@ relay_command_remote (const void *pointer, void *data,
|
||||
return WEECHAT_RC_ERROR;
|
||||
}
|
||||
ptr_autoconnect = NULL;
|
||||
ptr_autoreconnect_delay = NULL;
|
||||
ptr_proxy = NULL;
|
||||
ptr_tls_verify = NULL;
|
||||
ptr_password = NULL;
|
||||
@@ -611,6 +615,10 @@ relay_command_remote (const void *pointer, void *data,
|
||||
{
|
||||
ptr_autoconnect = argv[i] + 13;
|
||||
}
|
||||
else if (strncmp (argv[i], "-autoreconnect_delay=", 21) == 0)
|
||||
{
|
||||
ptr_autoreconnect_delay = argv[i] + 21;
|
||||
}
|
||||
else if (strncmp (argv[i], "-proxy=", 7) == 0)
|
||||
{
|
||||
ptr_proxy = argv[i] + 7;
|
||||
@@ -638,7 +646,8 @@ relay_command_remote (const void *pointer, void *data,
|
||||
}
|
||||
}
|
||||
ptr_remote = relay_remote_new (argv[2], argv[3], ptr_autoconnect,
|
||||
ptr_proxy, ptr_tls_verify, ptr_password,
|
||||
ptr_autoreconnect_delay, ptr_proxy,
|
||||
ptr_tls_verify, ptr_password,
|
||||
ptr_totp_secret);
|
||||
if (ptr_remote)
|
||||
{
|
||||
@@ -744,6 +753,14 @@ relay_command_remote (const void *pointer, void *data,
|
||||
return WEECHAT_RC_ERROR;
|
||||
}
|
||||
relay_remote_disconnect (ptr_remote);
|
||||
if (ptr_remote->reconnect_start > 0)
|
||||
{
|
||||
ptr_remote->reconnect_delay = 0;
|
||||
ptr_remote->reconnect_start = 0;
|
||||
weechat_printf (NULL,
|
||||
_("remote[%s]: auto-reconnection is cancelled"),
|
||||
ptr_remote->name);
|
||||
}
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -106,6 +106,8 @@ struct t_config_option *relay_config_irc_backlog_time_format = NULL;
|
||||
/* relay config, api section */
|
||||
|
||||
struct t_config_option *relay_config_api_remote_get_lines = NULL;
|
||||
struct t_config_option *relay_config_api_remote_autoreconnect_delay_growing = NULL;
|
||||
struct t_config_option *relay_config_api_remote_autoreconnect_delay_max = NULL;
|
||||
|
||||
/* other */
|
||||
|
||||
@@ -1073,10 +1075,19 @@ relay_config_create_remote_option (const char *remote_name, int index_option,
|
||||
ptr_option = weechat_config_new_option (
|
||||
relay_config_file, relay_config_section_remote,
|
||||
option_name, "boolean",
|
||||
N_("auto-connect to the remote relay"),
|
||||
N_("automatically connect to the remote relay"),
|
||||
NULL, 0, 0, value, NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
break;
|
||||
case RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY:
|
||||
ptr_option = weechat_config_new_option (
|
||||
relay_config_file, relay_config_section_remote,
|
||||
option_name, "integer",
|
||||
N_("automatically reconnect to the remote relay after this delay, "
|
||||
"in seconds (0 = disable automatic reconnection)"),
|
||||
NULL, 0, 65535, value, NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
break;
|
||||
case RELAY_REMOTE_OPTION_PROXY:
|
||||
ptr_option = weechat_config_new_option (
|
||||
relay_config_file, relay_config_section_remote,
|
||||
@@ -1849,6 +1860,20 @@ relay_config_init ()
|
||||
"to a remote relay"),
|
||||
NULL, 0, INT_MAX, "1000", NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
relay_config_api_remote_autoreconnect_delay_growing = weechat_config_new_option (
|
||||
relay_config_file, relay_config_section_api,
|
||||
"remote_autoreconnect_delay_growing", "integer",
|
||||
N_("growing factor for autoreconnect delay to remote relay (1 = always "
|
||||
"same delay, 2 = delay*2 for each retry, etc.)"),
|
||||
NULL, 1, 100, "2", NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
relay_config_api_remote_autoreconnect_delay_max = weechat_config_new_option (
|
||||
relay_config_file, relay_config_section_api,
|
||||
"remote_autoreconnect_delay_max", "integer",
|
||||
N_("maximum autoreconnect delay to remote relay (in seconds, 0 = no "
|
||||
"maximum)"),
|
||||
NULL, 0, 3600 * 24 * 7, "600", NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/* section port */
|
||||
|
||||
@@ -71,6 +71,8 @@ extern struct t_config_option *relay_config_irc_backlog_tags;
|
||||
extern struct t_config_option *relay_config_irc_backlog_time_format;
|
||||
|
||||
extern struct t_config_option *relay_config_api_remote_get_lines;
|
||||
extern struct t_config_option *relay_config_api_remote_autoreconnect_delay_growing;
|
||||
extern struct t_config_option *relay_config_api_remote_autoreconnect_delay_max;
|
||||
|
||||
extern int relay_config_auto_open_buffer[];
|
||||
extern int relay_config_display_clients[];
|
||||
|
||||
@@ -42,9 +42,10 @@
|
||||
|
||||
|
||||
char *relay_remote_option_string[RELAY_REMOTE_NUM_OPTIONS] =
|
||||
{ "url", "autoconnect", "proxy", "tls_verify", "password", "totp_secret" };
|
||||
{ "url", "autoconnect", "autoreconnect_delay", "proxy", "tls_verify",
|
||||
"password", "totp_secret" };
|
||||
char *relay_remote_option_default[RELAY_REMOTE_NUM_OPTIONS] =
|
||||
{ "", "off", "", "on", "", "" };
|
||||
{ "", "off", "10", "", "on", "", "" };
|
||||
|
||||
struct t_relay_remote *relay_remotes = NULL;
|
||||
struct t_relay_remote *last_relay_remote = NULL;
|
||||
@@ -358,6 +359,8 @@ relay_remote_alloc (const char *name)
|
||||
new_remote->synced = 0;
|
||||
new_remote->partial_ws_frame = NULL;
|
||||
new_remote->partial_ws_frame_size = 0;
|
||||
new_remote->reconnect_delay = 0;
|
||||
new_remote->reconnect_start = 0;
|
||||
new_remote->prev_remote = NULL;
|
||||
new_remote->next_remote = NULL;
|
||||
|
||||
@@ -477,9 +480,14 @@ relay_remote_new_with_options (const char *name, struct t_config_option **option
|
||||
*/
|
||||
|
||||
struct t_relay_remote *
|
||||
relay_remote_new (const char *name, const char *url, const char *autoconnect,
|
||||
const char *proxy, const char *tls_verify,
|
||||
const char *password, const char *totp_secret)
|
||||
relay_remote_new (const char *name,
|
||||
const char *url,
|
||||
const char *autoconnect,
|
||||
const char *autoreconnect_delay,
|
||||
const char *proxy,
|
||||
const char *tls_verify,
|
||||
const char *password,
|
||||
const char *totp_secret)
|
||||
{
|
||||
struct t_config_option *option[RELAY_REMOTE_NUM_OPTIONS];
|
||||
const char *value[RELAY_REMOTE_NUM_OPTIONS];
|
||||
@@ -491,6 +499,7 @@ relay_remote_new (const char *name, const char *url, const char *autoconnect,
|
||||
|
||||
value[RELAY_REMOTE_OPTION_URL] = url;
|
||||
value[RELAY_REMOTE_OPTION_AUTOCONNECT] = autoconnect;
|
||||
value[RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY] = autoreconnect_delay;
|
||||
value[RELAY_REMOTE_OPTION_PROXY] = proxy;
|
||||
value[RELAY_REMOTE_OPTION_TLS_VERIFY] = tls_verify;
|
||||
value[RELAY_REMOTE_OPTION_PASSWORD] = password;
|
||||
@@ -594,6 +603,8 @@ relay_remote_new_with_infolist (struct t_infolist *infolist)
|
||||
}
|
||||
new_remote->version_ok = weechat_infolist_integer (infolist, "version_ok");
|
||||
new_remote->synced = weechat_infolist_integer (infolist, "synced");
|
||||
new_remote->reconnect_delay = weechat_infolist_integer (infolist, "reconnect_delay");
|
||||
new_remote->reconnect_start = weechat_infolist_integer (infolist, "reconnect_start");
|
||||
ptr_ws_frame = weechat_infolist_buffer (infolist, "partial_ws_frame", &ws_frame_size);
|
||||
if (ptr_ws_frame && (ws_frame_size > 0))
|
||||
{
|
||||
@@ -805,6 +816,68 @@ relay_remote_disconnect (struct t_relay_remote *remote)
|
||||
#endif /* HAVE_CJSON */
|
||||
}
|
||||
|
||||
/*
|
||||
* Schedules reconnection to remote.
|
||||
*/
|
||||
|
||||
void
|
||||
relay_remote_reconnect_schedule (struct t_relay_remote *remote)
|
||||
{
|
||||
int minutes, seconds;
|
||||
|
||||
if (weechat_config_integer (remote->options[RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY]) == 0)
|
||||
{
|
||||
remote->reconnect_delay = 0;
|
||||
remote->reconnect_start = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* growing reconnect delay */
|
||||
if (remote->reconnect_delay == 0)
|
||||
remote->reconnect_delay = weechat_config_integer (remote->options[RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY]);
|
||||
else
|
||||
remote->reconnect_delay = remote->reconnect_delay * weechat_config_integer (relay_config_api_remote_autoreconnect_delay_growing);
|
||||
if ((weechat_config_integer (relay_config_api_remote_autoreconnect_delay_max) > 0)
|
||||
&& (remote->reconnect_delay > weechat_config_integer (relay_config_api_remote_autoreconnect_delay_max)))
|
||||
{
|
||||
remote->reconnect_delay = weechat_config_integer (relay_config_api_remote_autoreconnect_delay_max);
|
||||
}
|
||||
|
||||
remote->reconnect_start = time (NULL);
|
||||
|
||||
minutes = remote->reconnect_delay / 60;
|
||||
seconds = remote->reconnect_delay % 60;
|
||||
if ((minutes > 0) && (seconds > 0))
|
||||
{
|
||||
weechat_printf (
|
||||
NULL,
|
||||
_("remote[%s]: reconnecting to remote relay in %d %s, %d %s"),
|
||||
remote->name,
|
||||
minutes,
|
||||
NG_("minute", "minutes", minutes),
|
||||
seconds,
|
||||
NG_("second", "seconds", seconds));
|
||||
}
|
||||
else if (minutes > 0)
|
||||
{
|
||||
weechat_printf (
|
||||
NULL,
|
||||
_("remote[%s]: reconnecting to remote relay in %d %s"),
|
||||
remote->name,
|
||||
minutes,
|
||||
NG_("minute", "minutes", minutes));
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_printf (
|
||||
NULL,
|
||||
_("remote[%s]: reconnecting to remote relay in %d %s"),
|
||||
remote->name,
|
||||
seconds,
|
||||
NG_("second", "seconds", seconds));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reconnects to a remote WeeChat relay/api.
|
||||
*
|
||||
@@ -816,13 +889,20 @@ relay_remote_disconnect (struct t_relay_remote *remote)
|
||||
int
|
||||
relay_remote_reconnect (struct t_relay_remote *remote)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!remote)
|
||||
return 0;
|
||||
|
||||
remote->reconnect_start = 0;
|
||||
|
||||
#ifdef HAVE_CJSON
|
||||
if (!relay_remote_disconnect (remote))
|
||||
return 0;
|
||||
return relay_remote_network_connect (remote);
|
||||
rc = relay_remote_network_connect (remote);
|
||||
if (!rc)
|
||||
relay_remote_reconnect_schedule (remote);
|
||||
return rc;
|
||||
#else
|
||||
weechat_printf (NULL,
|
||||
_("%s%s: error: unable to connect to a remote relay via API "
|
||||
@@ -832,6 +912,35 @@ relay_remote_reconnect (struct t_relay_remote *remote)
|
||||
#endif /* HAVE_CJSON */
|
||||
}
|
||||
|
||||
/*
|
||||
* Timer used to auto-reconnect to remotes.
|
||||
*/
|
||||
|
||||
void
|
||||
relay_remote_timer ()
|
||||
{
|
||||
struct t_relay_remote *ptr_remote, *ptr_next_remote;
|
||||
time_t current_time;
|
||||
|
||||
current_time = time (NULL);
|
||||
|
||||
ptr_remote = relay_remotes;
|
||||
while (ptr_remote)
|
||||
{
|
||||
ptr_next_remote = ptr_remote->next_remote;
|
||||
|
||||
/* check if reconnection is pending */
|
||||
if ((ptr_remote->sock <= 0)
|
||||
&& (ptr_remote->reconnect_start > 0)
|
||||
&& (current_time >= (ptr_remote->reconnect_start + ptr_remote->reconnect_delay)))
|
||||
{
|
||||
relay_remote_reconnect (ptr_remote);
|
||||
}
|
||||
|
||||
ptr_remote = ptr_next_remote;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Disconnects all remotes.
|
||||
*/
|
||||
@@ -993,6 +1102,10 @@ relay_remote_add_to_infolist (struct t_infolist *infolist,
|
||||
}
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "version_ok", remote->version_ok))
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_delay", remote->reconnect_delay))
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_start", remote->reconnect_start))
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "synced", remote->synced))
|
||||
return 0;
|
||||
|
||||
@@ -1019,6 +1132,8 @@ relay_remote_print_log ()
|
||||
weechat_log_printf (" autoconnect . . . . . . : %s",
|
||||
(weechat_config_boolean (ptr_remote->options[RELAY_REMOTE_OPTION_AUTOCONNECT])) ?
|
||||
"on" : "off");
|
||||
weechat_log_printf (" autoreconnect_delay . . : %d",
|
||||
weechat_config_integer (ptr_remote->options[RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY]));
|
||||
weechat_log_printf (" proxy . . . . . . . . . : '%s'",
|
||||
weechat_config_string (ptr_remote->options[RELAY_REMOTE_OPTION_PROXY]));
|
||||
weechat_log_printf (" tls_verify. . . . . . . : %s",
|
||||
@@ -1045,6 +1160,8 @@ relay_remote_print_log ()
|
||||
weechat_log_printf (" gnutls_sess . . . . . . : %p", ptr_remote->gnutls_sess);
|
||||
relay_websocket_deflate_print_log (ptr_remote->ws_deflate, "");
|
||||
weechat_log_printf (" version_ok. . . . . . . : %d", ptr_remote->version_ok);
|
||||
weechat_log_printf (" reconnect_delay . . . . : %d", ptr_remote->reconnect_delay);
|
||||
weechat_log_printf (" reconnect_start . . . . : %d", ptr_remote->reconnect_start);
|
||||
weechat_log_printf (" synced. . . . . . . . . : %d", ptr_remote->synced);
|
||||
weechat_log_printf (" partial_ws_frame. . . . : %p (%d bytes)",
|
||||
ptr_remote->partial_ws_frame,
|
||||
|
||||
@@ -28,6 +28,8 @@ enum t_relay_remote_option
|
||||
{
|
||||
RELAY_REMOTE_OPTION_URL = 0, /* remote URL */
|
||||
RELAY_REMOTE_OPTION_AUTOCONNECT, /* auto-connect */
|
||||
RELAY_REMOTE_OPTION_AUTORECONNECT_DELAY, /* delay for auto-reconnect */
|
||||
/* (0 = no auto-reconnect) */
|
||||
RELAY_REMOTE_OPTION_PROXY, /* proxy used for remote (optional) */
|
||||
RELAY_REMOTE_OPTION_TLS_VERIFY, /* check if the connection is trusted */
|
||||
RELAY_REMOTE_OPTION_PASSWORD, /* password for remote relay */
|
||||
@@ -61,6 +63,8 @@ struct t_relay_remote
|
||||
int synced; /* 1 if synced with remote */
|
||||
char *partial_ws_frame; /* part. binary websocket frame recv */
|
||||
int partial_ws_frame_size; /* size of partial websocket frame */
|
||||
int reconnect_delay; /* current reconnect delay (growing) */
|
||||
time_t reconnect_start; /* this time + delay = reconn. time */
|
||||
struct t_relay_remote *prev_remote;/* link to previous remote */
|
||||
struct t_relay_remote *next_remote;/* link to next remote */
|
||||
};
|
||||
@@ -89,6 +93,7 @@ extern struct t_relay_remote *relay_remote_new_with_options (const char *name,
|
||||
struct t_config_option **options);
|
||||
extern struct t_relay_remote *relay_remote_new (const char *name,
|
||||
const char *autoconnect,
|
||||
const char *autoreconnect_delay,
|
||||
const char *proxy,
|
||||
const char *tls_verify,
|
||||
const char *url,
|
||||
@@ -101,7 +106,9 @@ extern int relay_remote_connect (struct t_relay_remote *remote);
|
||||
extern void relay_remote_auto_connect ();
|
||||
extern int relay_remote_send (struct t_relay_remote *remote, const char *json);
|
||||
extern int relay_remote_disconnect (struct t_relay_remote *remote);
|
||||
extern void relay_remote_reconnect_schedule (struct t_relay_remote *remote);
|
||||
extern int relay_remote_reconnect (struct t_relay_remote *remote);
|
||||
extern void relay_remote_timer ();
|
||||
extern void relay_remote_disconnect_all ();
|
||||
extern int relay_remote_rename (struct t_relay_remote *remote, const char *name);
|
||||
extern void relay_remote_free (struct t_relay_remote *remote);
|
||||
|
||||
@@ -238,6 +238,24 @@ relay_debug_dump_cb (const void *pointer, void *data,
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Timer callback, called each second.
|
||||
*/
|
||||
|
||||
int
|
||||
relay_timer_cb (const void *pointer, void *data, int remaining_calls)
|
||||
{
|
||||
/* make C compiler happy */
|
||||
(void) pointer;
|
||||
(void) data;
|
||||
(void) remaining_calls;
|
||||
|
||||
relay_client_timer ();
|
||||
relay_remote_timer ();
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes relay plugin.
|
||||
*/
|
||||
@@ -300,7 +318,7 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
|
||||
}
|
||||
|
||||
relay_hook_timer = weechat_hook_timer (1 * 1000, 0, 0,
|
||||
&relay_client_timer_cb, NULL, NULL);
|
||||
&relay_timer_cb, NULL, NULL);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user