|
Packit |
c22fc9 |
/*
|
|
Packit |
c22fc9 |
* Soft: Keepalived is a failover program for the LVS project
|
|
Packit |
c22fc9 |
* <www.linuxvirtualserver.org>. It monitor & manipulate
|
|
Packit |
c22fc9 |
* a loadbalanced server pool using multi-layer checks.
|
|
Packit |
c22fc9 |
*
|
|
Packit |
c22fc9 |
* Part: Dynamic data structure definition.
|
|
Packit |
c22fc9 |
*
|
|
Packit |
c22fc9 |
* Author: Alexandre Cassen, <acassen@linux-vs.org>
|
|
Packit |
c22fc9 |
*
|
|
Packit |
c22fc9 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
c22fc9 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
c22fc9 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
c22fc9 |
* See the GNU General Public License for more details.
|
|
Packit |
c22fc9 |
*
|
|
Packit |
c22fc9 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
c22fc9 |
* modify it under the terms of the GNU General Public License
|
|
Packit |
c22fc9 |
* as published by the Free Software Foundation; either version
|
|
Packit |
c22fc9 |
* 2 of the License, or (at your option) any later version.
|
|
Packit |
c22fc9 |
*
|
|
Packit |
c22fc9 |
* Copyright (C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>
|
|
Packit |
c22fc9 |
*/
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#include "config.h"
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#include <unistd.h>
|
|
Packit |
c22fc9 |
#include <pwd.h>
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#include "global_data.h"
|
|
Packit |
c22fc9 |
#include "list.h"
|
|
Packit |
c22fc9 |
#include "logger.h"
|
|
Packit |
c22fc9 |
#include "parser.h"
|
|
Packit |
c22fc9 |
#include "utils.h"
|
|
Packit |
c22fc9 |
#include "main.h"
|
|
Packit |
c22fc9 |
#include "memory.h"
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
#include "vrrp.h"
|
|
Packit |
c22fc9 |
#include "vrrp_ipaddress.h"
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME == 1
|
|
Packit |
c22fc9 |
#include "process.h"
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* global vars */
|
|
Packit |
c22fc9 |
data_t *global_data = NULL;
|
|
Packit |
c22fc9 |
data_t *old_global_data = NULL;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* Default settings */
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
set_default_router_id(data_t *data, char *new_id)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
if (!new_id || !new_id[0])
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
data->router_id = MALLOC(strlen(new_id)+1);
|
|
Packit |
c22fc9 |
strcpy(data->router_id, new_id);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
set_default_email_from(data_t * data, const char *hostname)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
struct passwd *pwd = NULL;
|
|
Packit |
c22fc9 |
size_t len;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (!hostname || !hostname[0])
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
pwd = getpwuid(getuid());
|
|
Packit |
c22fc9 |
if (!pwd)
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
len = strlen(hostname) + strlen(pwd->pw_name) + 2;
|
|
Packit |
c22fc9 |
data->email_from = MALLOC(len);
|
|
Packit |
c22fc9 |
if (!data->email_from)
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
snprintf(data->email_from, len, "%s@%s", pwd->pw_name, hostname);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
set_default_smtp_connection_timeout(data_t * data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
data->smtp_connection_to = DEFAULT_SMTP_CONNECTION_TIMEOUT;
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
set_default_mcast_group(data_t * data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
inet_stosockaddr(INADDR_VRRP_GROUP, 0, (struct sockaddr_storage *)&data->vrrp_mcast_group4);
|
|
Packit |
c22fc9 |
inet_stosockaddr(INADDR6_VRRP_GROUP, 0, (struct sockaddr_storage *)&data->vrrp_mcast_group6);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
set_vrrp_defaults(data_t * data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
data->vrrp_garp_rep = VRRP_GARP_REP;
|
|
Packit |
c22fc9 |
data->vrrp_garp_refresh.tv_sec = VRRP_GARP_REFRESH;
|
|
Packit |
c22fc9 |
data->vrrp_garp_refresh_rep = VRRP_GARP_REFRESH_REP;
|
|
Packit |
c22fc9 |
data->vrrp_garp_delay = VRRP_GARP_DELAY;
|
|
Packit |
c22fc9 |
data->vrrp_garp_lower_prio_delay = PARAMETER_UNSET;
|
|
Packit |
c22fc9 |
data->vrrp_garp_lower_prio_rep = PARAMETER_UNSET;
|
|
Packit |
c22fc9 |
data->vrrp_lower_prio_no_advert = false;
|
|
Packit |
c22fc9 |
data->vrrp_higher_prio_send_advert = false;
|
|
Packit |
c22fc9 |
data->vrrp_version = VRRP_VERSION_2;
|
|
Packit |
c22fc9 |
strcpy(data->vrrp_iptables_inchain, "INPUT");
|
|
Packit |
c22fc9 |
#ifdef _HAVE_LIBIPSET_
|
|
Packit |
c22fc9 |
data->using_ipsets = true;
|
|
Packit |
c22fc9 |
strcpy(data->vrrp_ipset_address, "keepalived");
|
|
Packit |
c22fc9 |
strcpy(data->vrrp_ipset_address6, "keepalived6");
|
|
Packit |
c22fc9 |
strcpy(data->vrrp_ipset_address_iface6, "keepalived_if6");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
data->vrrp_check_unicast_src = false;
|
|
Packit |
c22fc9 |
data->vrrp_skip_check_adv_addr = false;
|
|
Packit |
c22fc9 |
data->vrrp_strict = false;
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* email facility functions */
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
free_email(void *data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
FREE(data);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
static void
|
|
Packit |
c22fc9 |
dump_email(FILE *fp, void *data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
char *addr = data;
|
|
Packit |
c22fc9 |
conf_write(fp, " Email notification = %s", addr);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
void
|
|
Packit |
c22fc9 |
alloc_email(char *addr)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
size_t size = strlen(addr);
|
|
Packit |
c22fc9 |
char *new;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
new = (char *) MALLOC(size + 1);
|
|
Packit |
c22fc9 |
memcpy(new, addr, size + 1);
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
list_add(global_data->email, new);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* data facility functions */
|
|
Packit |
c22fc9 |
data_t *
|
|
Packit |
c22fc9 |
alloc_global_data(void)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
data_t *new;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (global_data)
|
|
Packit |
c22fc9 |
return global_data;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
new = (data_t *) MALLOC(sizeof(data_t));
|
|
Packit |
c22fc9 |
new->email = alloc_list(free_email, dump_email);
|
|
Packit |
c22fc9 |
new->smtp_alert = -1;
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
new->smtp_alert_vrrp = -1;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
new->smtp_alert_checker = -1;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
set_default_mcast_group(new);
|
|
Packit |
c22fc9 |
set_vrrp_defaults(new);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
new->notify_fifo.fd = -1;
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
new->vrrp_notify_fifo.fd = -1;
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME == 1
|
|
Packit |
c22fc9 |
new->vrrp_rlimit_rt = RT_RLIMIT_DEFAULT;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
new->vrrp_rx_bufs_multiples = 3;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
new->lvs_notify_fifo.fd = -1;
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME == 1
|
|
Packit |
c22fc9 |
new->checker_rlimit_rt = RT_RLIMIT_DEFAULT;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_BFD_
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME == 1
|
|
Packit |
c22fc9 |
new->bfd_rlimit_rt = RT_RLIMIT_DEFAULT;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_
|
|
Packit |
c22fc9 |
if (snmp) {
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_VRRP_
|
|
Packit |
c22fc9 |
new->enable_snmp_vrrp = true;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_RFCV2_
|
|
Packit |
c22fc9 |
new->enable_snmp_rfcv2 = true;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_RFCV3_
|
|
Packit |
c22fc9 |
new->enable_snmp_rfcv3 = true;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_CHECKER_
|
|
Packit |
c22fc9 |
new->enable_snmp_checker = true;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (snmp_socket) {
|
|
Packit |
c22fc9 |
new->snmp_socket = MALLOC(strlen(snmp_socket + 1));
|
|
Packit |
c22fc9 |
strcpy(new->snmp_socket, snmp_socket);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
new->lvs_syncd.syncid = PARAMETER_UNSET;
|
|
Packit |
c22fc9 |
#ifdef _HAVE_IPVS_SYNCD_ATTRIBUTES_
|
|
Packit |
c22fc9 |
new->lvs_syncd.mcast_group.ss_family = AF_UNSPEC;
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
return new;
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
void
|
|
Packit |
c22fc9 |
init_global_data(data_t * data, data_t *old_global_data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
/* If this is a reload and we are running in a network namespace,
|
|
Packit |
c22fc9 |
* we may not be able to get local_name, so preserve it */
|
|
Packit |
c22fc9 |
char unknown_name[] = "[unknown]";
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* If we are running in a network namespace, we may not be
|
|
Packit |
c22fc9 |
* able to get our local name now, so re-use original */
|
|
Packit |
c22fc9 |
if (old_global_data) {
|
|
Packit |
c22fc9 |
data->local_name = old_global_data->local_name;
|
|
Packit |
c22fc9 |
old_global_data->local_name = NULL;
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (!data->local_name &&
|
|
Packit |
c22fc9 |
(!data->router_id ||
|
|
Packit |
c22fc9 |
(data->smtp_server.ss_family &&
|
|
Packit |
c22fc9 |
(!data->smtp_helo_name ||
|
|
Packit |
c22fc9 |
!data->email_from)))) {
|
|
Packit |
c22fc9 |
data->local_name = get_local_name();
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* If for some reason get_local_name() fails, we need to have
|
|
Packit |
c22fc9 |
* some string in local_name, otherwise keepalived can segfault */
|
|
Packit |
c22fc9 |
if (!data->local_name) {
|
|
Packit |
c22fc9 |
data->local_name = MALLOC(sizeof(unknown_name));
|
|
Packit |
c22fc9 |
strcpy(data->local_name, unknown_name);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (!data->router_id)
|
|
Packit |
c22fc9 |
set_default_router_id(data, data->local_name);
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (data->smtp_server.ss_family) {
|
|
Packit |
c22fc9 |
if (!data->smtp_connection_to)
|
|
Packit |
c22fc9 |
set_default_smtp_connection_timeout(data);
|
|
Packit |
c22fc9 |
|
|
Packit |
634c55 |
if (data->local_name && strcmp(data->local_name, unknown_name)) {
|
|
Packit |
c22fc9 |
if (!data->email_from)
|
|
Packit |
c22fc9 |
set_default_email_from(data, data->local_name);
|
|
Packit |
c22fc9 |
|
|
Packit |
93481f |
if (!data->smtp_helo_name) {
|
|
Packit |
93481f |
data->smtp_helo_name = MALLOC(strlen(data->local_name) + 1);
|
|
Packit |
93481f |
strcpy(data->smtp_helo_name, data->local_name);
|
|
Packit |
93481f |
}
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
/* Check that there aren't conflicts with the notify FIFOs */
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
/* If the global and vrrp notify FIFOs are the same, then data will be
|
|
Packit |
c22fc9 |
* duplicated on the FIFO */
|
|
Packit |
c22fc9 |
if (
|
|
Packit |
c22fc9 |
#ifndef _DEBUG_
|
|
Packit |
c22fc9 |
prog_type == PROG_TYPE_VRRP &&
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
data->notify_fifo.name && data->vrrp_notify_fifo.name &&
|
|
Packit |
c22fc9 |
!strcmp(data->notify_fifo.name, data->vrrp_notify_fifo.name)) {
|
|
Packit |
c22fc9 |
log_message(LOG_INFO, "notify FIFO %s has been specified for global and vrrp FIFO - ignoring vrrp FIFO", data->vrrp_notify_fifo.name);
|
|
Packit |
c22fc9 |
FREE_PTR(data->vrrp_notify_fifo.name);
|
|
Packit |
c22fc9 |
data->vrrp_notify_fifo.name = NULL;
|
|
Packit |
c22fc9 |
free_notify_script(&data->vrrp_notify_fifo.script);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
/* If the global and LVS notify FIFOs are the same, then data will be
|
|
Packit |
c22fc9 |
* duplicated on the FIFO */
|
|
Packit |
c22fc9 |
#ifndef _DEBUG_
|
|
Packit |
c22fc9 |
if (prog_type == PROG_TYPE_CHECKER)
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
if (data->notify_fifo.name && data->lvs_notify_fifo.name &&
|
|
Packit |
c22fc9 |
!strcmp(data->notify_fifo.name, data->lvs_notify_fifo.name)) {
|
|
Packit |
c22fc9 |
log_message(LOG_INFO, "notify FIFO %s has been specified for global and LVS FIFO - ignoring LVS FIFO", data->lvs_notify_fifo.name);
|
|
Packit |
c22fc9 |
FREE_PTR(data->lvs_notify_fifo.name);
|
|
Packit |
c22fc9 |
data->lvs_notify_fifo.name = NULL;
|
|
Packit |
c22fc9 |
free_notify_script(&data->lvs_notify_fifo.script);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
/* If LVS and VRRP use the same FIFO, they cannot both have a script for the FIFO.
|
|
Packit |
c22fc9 |
* Use the VRRP script and ignore the LVS script */
|
|
Packit |
c22fc9 |
if (data->lvs_notify_fifo.name && data->vrrp_notify_fifo.name &&
|
|
Packit |
c22fc9 |
!strcmp(data->lvs_notify_fifo.name, data->vrrp_notify_fifo.name) &&
|
|
Packit |
c22fc9 |
data->lvs_notify_fifo.script &&
|
|
Packit |
c22fc9 |
data->vrrp_notify_fifo.script) {
|
|
Packit |
c22fc9 |
log_message(LOG_INFO, "LVS notify FIFO and vrrp FIFO are the same both with scripts - ignoring LVS FIFO script");
|
|
Packit |
c22fc9 |
free_notify_script(&data->lvs_notify_fifo.script);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
void
|
|
Packit |
c22fc9 |
free_global_data(data_t * data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
if (!data)
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
free_list(&data->email);
|
|
Packit |
c22fc9 |
#if HAVE_DECL_CLONE_NEWNET
|
|
Packit |
c22fc9 |
FREE_PTR(data->network_namespace);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
FREE_PTR(data->instance_name);
|
|
Packit |
c22fc9 |
FREE_PTR(data->router_id);
|
|
Packit |
c22fc9 |
FREE_PTR(data->email_from);
|
|
Packit |
c22fc9 |
FREE_PTR(data->smtp_helo_name);
|
|
Packit |
c22fc9 |
FREE_PTR(data->local_name);
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_
|
|
Packit |
c22fc9 |
FREE_PTR(data->snmp_socket);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#if defined _WITH_LVS_ && defined _WITH_VRRP_
|
|
Packit |
c22fc9 |
FREE_PTR(data->lvs_syncd.ifname);
|
|
Packit |
c22fc9 |
FREE_PTR(data->lvs_syncd.vrrp_name);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
FREE_PTR(data->notify_fifo.name);
|
|
Packit |
c22fc9 |
free_notify_script(&data->notify_fifo.script);
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
FREE_PTR(data->default_ifname);
|
|
Packit |
c22fc9 |
FREE_PTR(data->vrrp_notify_fifo.name);
|
|
Packit |
c22fc9 |
free_notify_script(&data->vrrp_notify_fifo.script);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
FREE_PTR(data->lvs_notify_fifo.name);
|
|
Packit |
c22fc9 |
free_notify_script(&data->lvs_notify_fifo.script);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
FREE(data);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
void
|
|
Packit |
c22fc9 |
dump_global_data(FILE *fp, data_t * data)
|
|
Packit |
c22fc9 |
{
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
char buf[64];
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
if (!data)
|
|
Packit |
c22fc9 |
return;
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
conf_write(fp, "------< Global definitions >------");
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
#if HAVE_DECL_CLONE_NEWNET
|
|
Packit |
c22fc9 |
conf_write(fp, " Network namespace = %s", data->network_namespace ? data->network_namespace : "(default)");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
if (data->instance_name)
|
|
Packit |
c22fc9 |
conf_write(fp, " Instance name = %s", data->instance_name);
|
|
Packit |
c22fc9 |
if (data->router_id)
|
|
Packit |
c22fc9 |
conf_write(fp, " Router ID = %s", data->router_id);
|
|
Packit |
c22fc9 |
if (data->smtp_server.ss_family) {
|
|
Packit |
c22fc9 |
conf_write(fp, " Smtp server = %s", inet_sockaddrtos(&data->smtp_server));
|
|
Packit |
c22fc9 |
conf_write(fp, " Smtp server port = %u", ntohs(inet_sockaddrport(&data->smtp_server)));
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
if (data->smtp_helo_name)
|
|
Packit |
c22fc9 |
conf_write(fp, " Smtp HELO name = %s" , data->smtp_helo_name);
|
|
Packit |
c22fc9 |
if (data->smtp_connection_to)
|
|
Packit |
c22fc9 |
conf_write(fp, " Smtp server connection timeout = %lu"
|
|
Packit |
c22fc9 |
, data->smtp_connection_to / TIMER_HZ);
|
|
Packit |
c22fc9 |
if (data->email_from) {
|
|
Packit |
c22fc9 |
conf_write(fp, " Email notification from = %s"
|
|
Packit |
c22fc9 |
, data->email_from);
|
|
Packit |
c22fc9 |
dump_list(fp, data->email);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
conf_write(fp, " Default smtp_alert = %s",
|
|
Packit |
c22fc9 |
data->smtp_alert == -1 ? "unset" : data->smtp_alert ? "on" : "off");
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
conf_write(fp, " Default smtp_alert_vrrp = %s",
|
|
Packit |
c22fc9 |
data->smtp_alert_vrrp == -1 ? "unset" : data->smtp_alert_vrrp ? "on" : "off");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
conf_write(fp, " Default smtp_alert_checker = %s",
|
|
Packit |
c22fc9 |
data->smtp_alert_checker == -1 ? "unset" : data->smtp_alert_checker ? "on" : "off");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
conf_write(fp, " Dynamic interfaces = %s", data->dynamic_interfaces ? "true" : "false");
|
|
Packit |
c22fc9 |
if (data->dynamic_interfaces)
|
|
Packit |
c22fc9 |
conf_write(fp, " Allow interface changes = %s", data->allow_if_changes ? "true" : "false");
|
|
Packit |
c22fc9 |
if (data->no_email_faults)
|
|
Packit |
c22fc9 |
conf_write(fp, " Send emails for fault transitions = off");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
if (data->lvs_tcp_timeout)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS TCP timeout = %d", data->lvs_tcp_timeout);
|
|
Packit |
c22fc9 |
if (data->lvs_tcpfin_timeout)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS TCP FIN timeout = %d", data->lvs_tcpfin_timeout);
|
|
Packit |
c22fc9 |
if (data->lvs_udp_timeout)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS TCP timeout = %d", data->lvs_udp_timeout);
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
#ifndef _DEBUG_
|
|
Packit |
c22fc9 |
if (prog_type == PROG_TYPE_VRRP)
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
conf_write(fp, " Default interface = %s", data->default_ifp ? data->default_ifp->ifname : DFLT_INT);
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.vrrp) {
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd vrrp instance = %s"
|
|
Packit |
c22fc9 |
, data->lvs_syncd.vrrp->iname);
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.ifname)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd interface = %s"
|
|
Packit |
c22fc9 |
, data->lvs_syncd.ifname);
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd syncid = %u"
|
|
Packit |
c22fc9 |
, data->lvs_syncd.syncid);
|
|
Packit |
c22fc9 |
#ifdef _HAVE_IPVS_SYNCD_ATTRIBUTES_
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.sync_maxlen)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd maxlen = %u", data->lvs_syncd.sync_maxlen);
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.mcast_group.ss_family != AF_UNSPEC)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS mcast group %s", inet_sockaddrtos(&data->lvs_syncd.mcast_group));
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.mcast_port)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd mcast port = %d", data->lvs_syncd.mcast_port);
|
|
Packit |
c22fc9 |
if (data->lvs_syncd.mcast_ttl)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS syncd mcast ttl = %u", data->lvs_syncd.mcast_ttl);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS flush = %s", data->lvs_flush ? "true" : "false");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
if (data->notify_fifo.name) {
|
|
Packit |
c22fc9 |
conf_write(fp, " Global notify fifo = %s", data->notify_fifo.name);
|
|
Packit |
c22fc9 |
if (data->notify_fifo.script)
|
|
Packit |
c22fc9 |
conf_write(fp, " Global notify fifo script = %s, uid:gid %d:%d",
|
|
Packit |
c22fc9 |
cmd_str(data->notify_fifo.script),
|
|
Packit |
c22fc9 |
data->notify_fifo.script->uid,
|
|
Packit |
c22fc9 |
data->notify_fifo.script->gid);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
if (data->vrrp_notify_fifo.name) {
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP notify fifo = %s", data->vrrp_notify_fifo.name);
|
|
Packit |
c22fc9 |
if (data->vrrp_notify_fifo.script)
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP notify fifo script = %s, uid:gid %d:%d",
|
|
Packit |
c22fc9 |
cmd_str(data->vrrp_notify_fifo.script),
|
|
Packit |
c22fc9 |
data->vrrp_notify_fifo.script->uid,
|
|
Packit |
c22fc9 |
data->vrrp_notify_fifo.script->gid);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
if (data->lvs_notify_fifo.name) {
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS notify fifo = %s", data->lvs_notify_fifo.name);
|
|
Packit |
c22fc9 |
if (data->lvs_notify_fifo.script)
|
|
Packit |
c22fc9 |
conf_write(fp, " LVS notify fifo script = %s, uid:gid %d:%d",
|
|
Packit |
c22fc9 |
cmd_str(data->lvs_notify_fifo.script),
|
|
Packit |
c22fc9 |
data->lvs_notify_fifo.script->uid,
|
|
Packit |
c22fc9 |
data->lvs_notify_fifo.script->gid);
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
if (data->vrrp_mcast_group4.sin_family) {
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP IPv4 mcast group = %s"
|
|
Packit |
c22fc9 |
, inet_sockaddrtos((struct sockaddr_storage *)&data->vrrp_mcast_group4));
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
if (data->vrrp_mcast_group6.sin6_family) {
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP IPv6 mcast group = %s"
|
|
Packit |
c22fc9 |
, inet_sockaddrtos((struct sockaddr_storage *)&data->vrrp_mcast_group6));
|
|
Packit |
c22fc9 |
}
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP delay = %u",
|
|
Packit |
c22fc9 |
data->vrrp_garp_delay/TIMER_HZ);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP repeat = %u", data->vrrp_garp_rep);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP refresh timer = %lu",
|
|
Packit |
c22fc9 |
data->vrrp_garp_refresh.tv_sec);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP refresh repeat = %d", data->vrrp_garp_refresh_rep);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP lower priority delay = %d", data->vrrp_garp_lower_prio_delay == PARAMETER_UNSET ? PARAMETER_UNSET : data->vrrp_garp_lower_prio_delay / TIMER_HZ);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP lower priority repeat = %d", data->vrrp_garp_lower_prio_rep);
|
|
Packit |
c22fc9 |
conf_write(fp, " Send advert after receive lower priority advert = %s", data->vrrp_lower_prio_no_advert ? "false" : "true");
|
|
Packit |
c22fc9 |
conf_write(fp, " Send advert after receive higher priority advert = %s", data->vrrp_higher_prio_send_advert ? "true" : "false");
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous ARP interval = %d", data->vrrp_garp_interval);
|
|
Packit |
c22fc9 |
conf_write(fp, " Gratuitous NA interval = %d", data->vrrp_gna_interval);
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP default protocol version = %d", data->vrrp_version);
|
|
Packit |
c22fc9 |
if (data->vrrp_iptables_inchain[0])
|
|
Packit |
c22fc9 |
conf_write(fp," Iptables input chain = %s", data->vrrp_iptables_inchain);
|
|
Packit |
c22fc9 |
if (data->vrrp_iptables_outchain[0])
|
|
Packit |
c22fc9 |
conf_write(fp," Iptables output chain = %s", data->vrrp_iptables_outchain);
|
|
Packit |
c22fc9 |
#ifdef _HAVE_LIBIPSET_
|
|
Packit |
c22fc9 |
conf_write(fp, " Using ipsets = %s", data->using_ipsets ? "true" : "false");
|
|
Packit |
c22fc9 |
if (data->vrrp_ipset_address[0])
|
|
Packit |
c22fc9 |
conf_write(fp," ipset IPv4 address set = %s", data->vrrp_ipset_address);
|
|
Packit |
c22fc9 |
if (data->vrrp_ipset_address6[0])
|
|
Packit |
c22fc9 |
conf_write(fp," ipset IPv6 address set = %s", data->vrrp_ipset_address6);
|
|
Packit |
c22fc9 |
if (data->vrrp_ipset_address_iface6[0])
|
|
Packit |
c22fc9 |
conf_write(fp," ipset IPv6 address,iface set = %s", data->vrrp_ipset_address_iface6);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP check unicast_src = %s", data->vrrp_check_unicast_src ? "true" : "false");
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP skip check advert addresses = %s", data->vrrp_skip_check_adv_addr ? "true" : "false");
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP strict mode = %s", data->vrrp_strict ? "true" : "false");
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP process priority = %d", data->vrrp_process_priority);
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP don't swap = %s", data->vrrp_no_swap ? "true" : "false");
|
|
Packit |
c22fc9 |
#ifdef _HAVE_SCHED_RT_
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP realtime priority = %u", data->vrrp_realtime_priority);
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME
|
|
Packit |
c22fc9 |
conf_write(fp, " VRRP realtime limit = %lu", data->vrrp_rlimit_rt);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
conf_write(fp, " Checker process priority = %d", data->checker_process_priority);
|
|
Packit |
c22fc9 |
conf_write(fp, " Checker don't swap = %s", data->checker_no_swap ? "true" : "false");
|
|
Packit |
c22fc9 |
#ifdef _HAVE_SCHED_RT_
|
|
Packit |
c22fc9 |
conf_write(fp, " Checker realtime priority = %u", data->checker_realtime_priority);
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME
|
|
Packit |
c22fc9 |
conf_write(fp, " Checker realtime limit = %lu", data->checker_rlimit_rt);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_BFD_
|
|
Packit |
c22fc9 |
conf_write(fp, " BFD process priority = %d", data->bfd_process_priority);
|
|
Packit |
c22fc9 |
conf_write(fp, " BFD don't swap = %s", data->bfd_no_swap ? "true" : "false");
|
|
Packit |
c22fc9 |
#ifdef _HAVE_SCHED_RT_
|
|
Packit |
c22fc9 |
conf_write(fp, " BFD realtime priority = %u", data->bfd_realtime_priority);
|
|
Packit |
c22fc9 |
#if HAVE_DECL_RLIMIT_RTTIME
|
|
Packit |
c22fc9 |
conf_write(fp, " BFD realtime limit = %lu", data->bfd_rlimit_rt);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_VRRP_
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP vrrp %s", data->enable_snmp_vrrp ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_CHECKER_
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP checker %s", data->enable_snmp_checker ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_RFCV2_
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP RFCv2 %s", data->enable_snmp_rfcv2 ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_RFCV3_
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP RFCv3 %s", data->enable_snmp_rfcv3 ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_SNMP_
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP traps %s", data->enable_traps ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
conf_write(fp, " SNMP socket = %s", data->snmp_socket ? data->snmp_socket : "default (unix:/var/agentx/master)");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_DBUS_
|
|
Packit |
c22fc9 |
conf_write(fp, " DBus %s", data->enable_dbus ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
conf_write(fp, " DBus service name = %s", data->dbus_service_name ? data->dbus_service_name : "");
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
conf_write(fp, " Script security %s", script_security ? "enabled" : "disabled");
|
|
Packit |
c22fc9 |
conf_write(fp, " Default script uid:gid %d:%d", default_script_uid, default_script_gid);
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
conf_write(fp, " vrrp_netlink_cmd_rcv_bufs = %u", global_data->vrrp_netlink_cmd_rcv_bufs);
|
|
Packit |
c22fc9 |
conf_write(fp, " vrrp_netlink_cmd_rcv_bufs_force = %u", global_data->vrrp_netlink_cmd_rcv_bufs_force);
|
|
Packit |
c22fc9 |
conf_write(fp, " vrrp_netlink_monitor_rcv_bufs = %u", global_data->vrrp_netlink_monitor_rcv_bufs);
|
|
Packit |
c22fc9 |
conf_write(fp, " vrrp_netlink_monitor_rcv_bufs_force = %u", global_data->vrrp_netlink_monitor_rcv_bufs_force);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_LVS_
|
|
Packit |
c22fc9 |
conf_write(fp, " lvs_netlink_cmd_rcv_bufs = %u", global_data->lvs_netlink_cmd_rcv_bufs);
|
|
Packit |
c22fc9 |
conf_write(fp, " lvs_netlink_cmd_rcv_bufs_force = %u", global_data->lvs_netlink_cmd_rcv_bufs_force);
|
|
Packit |
c22fc9 |
conf_write(fp, " lvs_netlink_monitor_rcv_bufs = %u", global_data->lvs_netlink_monitor_rcv_bufs);
|
|
Packit |
c22fc9 |
conf_write(fp, " lvs_netlink_monitor_rcv_bufs_force = %u", global_data->lvs_netlink_monitor_rcv_bufs_force);
|
|
Packit |
c22fc9 |
conf_write(fp, " rs_init_notifies = %u", global_data->rs_init_notifies);
|
|
Packit |
c22fc9 |
conf_write(fp, " no_checker_emails = %u", global_data->no_checker_emails);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
#ifdef _WITH_VRRP_
|
|
Packit |
c22fc9 |
buf[0] = '\0';
|
|
Packit |
c22fc9 |
if (global_data->vrrp_rx_bufs_policy & RX_BUFS_POLICY_MTU)
|
|
Packit |
c22fc9 |
strcpy(buf, " rx_bufs_policy = MTU");
|
|
Packit |
c22fc9 |
else if (global_data->vrrp_rx_bufs_policy & RX_BUFS_POLICY_ADVERT)
|
|
Packit |
c22fc9 |
strcpy(buf, " rx_bufs_policy = ADVERT");
|
|
Packit |
c22fc9 |
else if (global_data->vrrp_rx_bufs_policy & RX_BUFS_SIZE)
|
|
Packit |
c22fc9 |
sprintf(buf, " rx_bufs_size = %lu", global_data->vrrp_rx_bufs_size);
|
|
Packit |
c22fc9 |
if (buf[0])
|
|
Packit |
c22fc9 |
conf_write(fp, "%s", buf);
|
|
Packit |
c22fc9 |
conf_write(fp, " rx_bufs_multiples = %u", global_data->vrrp_rx_bufs_multiples);
|
|
Packit |
c22fc9 |
conf_write(fp, " umask = 0%o", global_data->umask);
|
|
Packit |
c22fc9 |
#endif
|
|
Packit |
c22fc9 |
}
|