fail_over.h revision b8ecc581cdd8c7d097bf9db67a4cb220fbbcff6d
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder/*
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly SSSD
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly Fail over helper functions.
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Authors:
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly Martin Nagy <mnagy@redhat.com>
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly Copyright (C) Red Hat, Inc 2009
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly This program is free software; you can redistribute it and/or modify
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly it under the terms of the GNU General Public License as published by
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly the Free Software Foundation; either version 3 of the License, or
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly (at your option) any later version.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly This program is distributed in the hope that it will be useful,
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder but WITHOUT ANY WARRANTY; without even the implied warranty of
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder GNU General Public License for more details.
e90dc723887d541f809007ae81c9bb73ced9592eChristian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder You should have received a copy of the GNU General Public License
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly along with this program. If not, see <http://www.gnu.org/licenses/>.
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly*/
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder#ifndef __FAIL_OVER_H__
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#define __FAIL_OVER_H__
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly#include <stdbool.h>
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include <talloc.h>
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder#include "resolv/async_resolv.h"
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#define FO_PROTO_TCP "tcp"
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder#define FO_PROTO_UDP "udp"
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
c0833539c8cf577dd3f2497792fbdd818442744cChristian Maeder#define FO_DEFAULT_SVC_TIMEOUT 10
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly/* Some forward declarations that don't have to do anything with fail over. */
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maederstruct hostent;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillystruct tevent_context;
fa373bc327620e08861294716b4454be8d25669fChristian Maederstruct tevent_req;
036ecbd8f721096321f47cf6a354a9d1bf3d032fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maederenum port_status {
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder PORT_NEUTRAL, /* We didn't try this port yet. */
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly PORT_WORKING, /* This port was reported to work. */
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly PORT_NOT_WORKING /* This port was reported to not work. */
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly};
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reillyenum server_status {
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly SERVER_NAME_NOT_RESOLVED, /* We didn't yet resolved the host name. */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly SERVER_RESOLVING_NAME, /* Name resolving is in progress. */
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly SERVER_NAME_RESOLVED, /* We resolved the host name but didn't try to connect. */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder SERVER_WORKING, /* We successfully connected to the server. */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder SERVER_NOT_WORKING /* We tried and failed to connect to the server. */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder};
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstruct fo_ctx;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstruct fo_service;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstruct fo_server;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder/*
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Failover settings.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder *
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder * The 'retry_timeout' member specifies the
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * duration in seconds of how long a server or port will be considered
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * non-working after being marked as such.
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly *
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly * The 'service_resolv_timeout' member specifies how long we wait for
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * service resolution. When this timeout is reached, the resolve request
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * is cancelled with an error
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder *
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * The 'srv_retry_timeout' member specifies how long a SRV lookup
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * is considered valid until we ask the server again.
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder *
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * The family_order member specifies the order of address families to
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * try when looking up the service.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly */
fa373bc327620e08861294716b4454be8d25669fChristian Maederstruct fo_options {
fa373bc327620e08861294716b4454be8d25669fChristian Maeder time_t srv_retry_timeout;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder time_t retry_timeout;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder int service_resolv_timeout;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder enum restrict_family family_order;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder};
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/*
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * Create a new fail over context based on options passed in the
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * opts parameter
fa373bc327620e08861294716b4454be8d25669fChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstruct fo_ctx *fo_context_init(TALLOC_CTX *mem_ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct fo_options *opts);
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly/*
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly * Create a new service structure for 'ctx', saving it to the location pointed
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * to by '_service'. The needed memory will be allocated from 'ctx'.
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * Service name will be set to 'name'.
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly */
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reillyint fo_new_service(struct fo_ctx *ctx,
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder const char *name,
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder struct fo_service **_service);
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder/*
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly * Look up service named 'name' from the 'ctx' service list. Target of
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * '_service' will be set to the service if it was found.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maederint fo_get_service(struct fo_ctx *ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder const char *name,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct fo_service **_service);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder/*
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Get number of servers registered for the 'service'.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederint fo_get_server_count(struct fo_service *service);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder/*
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Adds a server 'name' to the 'service'. Port 'port' will be used for
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * connection. If 'name' is NULL, no server resolution will be done.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maederint fo_add_server(struct fo_service *service,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder const char *name,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder int port,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder void *user_data);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maederint fo_add_srv_server(struct fo_service *service,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder const char *srv,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder const char *discovery_domain,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder const char *sssd_domain,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder const char *proto,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder void *user_data);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder/*
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Request the first server from the service's list of servers. It is only
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * considered if it is not marked as not working (or the retry interval already
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder * passed). If the server address wasn't resolved yet, it will be done.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstruct tevent_req *fo_resolve_service_send(TALLOC_CTX *mem_ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct tevent_context *ev,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct resolv_ctx *resolv,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct fo_ctx *ctx,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct fo_service *service);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maederint fo_resolve_service_recv(struct tevent_req *req,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct fo_server **server);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder/*
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * Set feedback about 'server'. Caller should use this to indicate a problem
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * with the server itself, not only with the service on that server. This
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * should be used, for example, when the IP address of the server can't be
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * reached. This setting can affect other services as well, since they can
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * share the same server.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maedervoid fo_set_server_status(struct fo_server *server,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder enum server_status status);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder/*
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * Set feedback about the port status. This function should be used when
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * the server itself is working but the service is not. When status is set
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder * to PORT_WORKING, 'server' is also marked as an "active server" for its
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * service. When the next fo_resolve_service_send() function is called, this
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder * server will be preferred. This will hold as long as it is not marked as
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * not-working.
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder */
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maedervoid fo_set_port_status(struct fo_server *server,
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder enum port_status status);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder/*
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Instruct fail-over to try next server on the next connect attempt.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * Should be used after connection to service was unexpectedly dropped
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * but there is no authoritative information on whether active server is down.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maedervoid fo_try_next_server(struct fo_service *service);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maedervoid *fo_get_server_user_data(struct fo_server *server);
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillyint fo_get_server_port(struct fo_server *server);
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillyconst char *fo_get_server_name(struct fo_server *server);
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reillyconst char *fo_get_server_str_name(struct fo_server *server);
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reillystruct resolv_hostent *fo_get_server_hostent(struct fo_server *server);
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reillytime_t fo_get_server_hostname_last_change(struct fo_server *server);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reillyint fo_is_srv_lookup(struct fo_server *s);
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillyvoid fo_reset_services(struct fo_ctx *fo_ctx);
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly#endif /* !__FAIL_OVER_H__ */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly