/usr/include/heartbeat/heartbeat.h is in libheartbeat2-dev 1:3.0.6-7.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | /*
* heartbeat.h: core definitions for the Linux-HA heartbeat program
*
* Copyright (C) 2000 Alan Robertson <alanr@unix.sh>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef _HEARTBEAT_H
# define _HEARTBEAT_H 1
#ifdef SYSV
# include <sys/termio.h>
# define TERMIOS termio
# define GETATTR(fd, s) ioctl(fd, TCGETA, s)
# define SETATTR(fd, s) ioctl(fd, TCSETA, s)
# define FLUSH(fd) ioctl(fd, TCFLSH, 2)
#else
# define TERMIOS termios
# include <termios.h>
# define GETATTR(fd, s) tcgetattr(fd, s)
# define SETATTR(fd, s) tcsetattr(fd, TCSAFLUSH, s)
# define FLUSH(fd) tcflush(fd, TCIOFLUSH)
#endif
#include <hb_config.h>
#include <stdlib.h>
#include <limits.h>
#include <syslog.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <time.h>
#include <sys/times.h>
#include <netinet/in.h>
#include <HBauth.h>
#include <ha_msg.h>
#include <HBcomm.h>
#include <stonith/stonith.h>
#include <clplumbing/cl_log.h>
#include <clplumbing/longclock.h>
#include <clplumbing/ipc.h>
#include <clplumbing/proctrack.h>
#include <clplumbing/GSource.h>
#define index FooIndex
#define time FooTime
#include <glib.h>
#undef index
#undef time
/* Dispatch priorities for various kinds of events */
#define PRI_SENDSTATUS (G_PRIORITY_HIGH-5)
#define PRI_SENDPKT (PRI_SENDSTATUS+1)
#define PRI_READPKT (PRI_SENDPKT+1)
#define PRI_FIFOMSG (PRI_READPKT+1)
/* PRI_POLL is where the timeout checks on deadtime happen.
* Better be sure rexmit requests for lost packets
* from a now dead node do not preempt detecting it as being dead. */
#define PRI_POLL (G_PRIORITY_HIGH)
#define PRI_REXMIT PRI_POLL
/* Actually, PRI_CHECKSIGS should be the highest priority
* (lowest integer value), or REXMIT or similar could prevent
* heartbeat from noticing SIGTERM or other.
*
* Apparently this was worked around by checking for
* hb_signal_pending() also from polled_input_prepare(),
* and calling hb_signal_process_pending() first thing
* from polled_input_dispatch().
* I'm reluctant to fix this up now, lest I break something else.
*
* I'm also not clear on why these things should have different priorities at
* all, and not share the same, so they get served one by one, and can not
* pre-empt each other.
*/
#define PRI_CHECKSIGS (G_PRIORITY_DEFAULT)
#define PRI_FREEMSG (PRI_CHECKSIGS+1)
#define PRI_CLIENTMSG (PRI_FREEMSG+1)
#define PRI_APIREGISTER (G_PRIORITY_LOW)
#define PRI_RANDOM (PRI_APIREGISTER+1)
#define PRI_AUDITCLIENT (PRI_RANDOM+1)
#define PRI_WRITECACHE (PRI_AUDITCLIENT+1)
#define PRI_DUMPSTATS (PRI_WRITECACHE+20)
/*
* <syslog.h> might not contain LOG_PRI...
* So, we define it ourselves, or error out if we can't...
*/
#ifndef LOG_PRI
# ifdef LOG_PRIMASK
/* David Lee <T.D.Lee@durham.ac.uk> reports this works on Solaris */
# define LOG_PRI(p) ((p) & LOG_PRIMASK)
# else
# error "Syslog.h does not define either LOG_PRI or LOG_PRIMASK."
# endif
#endif
#define MAXFIELDS 30 /* Max # of fields in a msg */
#define HOSTLENG 100 /* Maximum size of "uname -a" return */
#define STATUSLENG 32 /* Maximum size of status field */
#define MAXIFACELEN 30 /* Maximum interface length */
#define MAXSERIAL 4
#define MAXMEDIA 64
#define MAXNODE 100
#define MAXPROCS ((2*MAXMEDIA)+2)
#define FIFOMODE 0600
#define RQSTDELAY 10
#define ACK_MSG_DIV 10
#define RSC_TMPDIR HA_VARRUNDIR "/heartbeat/rsctmp"
#define HA_MODULE_D HA_LIBHBDIR "/modules"
#define HA_PLUGIN_D HA_LIBHBDIR "/plugins"
/* For compatability with older external facing headers
* These variables are no longer used internally
*/
#define HA_D HA_RC_DIR
#define HB_RC_DIR HA_RC_DIR
#define VAR_RUN_D HA_VARRUNDIR
#define VAR_LOG_D HA_VARLOGDIR
#define VAR_LIB_D HA_VARLIBHBDIR
#define HALIB HA_LIBDIR
/* #define HA_debug */
#define DEFAULTLOG HA_VARLOGDIR "/ha-log"
#define DEFAULTDEBUG HA_VARLOGDIR "/ha-debug"
#define DEVNULL "/dev/null"
#define HA_OKEXIT 0
#define HA_FAILEXIT 1
#define WHITESPACE " \t\n\r\f"
#define DELIMS ", \t\n\r\f"
#define COMMENTCHAR '#'
#define CRLF "\r\n"
#define STATUS "STATUS"
#define INITSTATUS "init" /* Status of a node we've never heard from */
#define UPSTATUS "up" /* Listening (we might not be xmitting) */
#define ACTIVESTATUS "active" /* fully functional, and all links are up */
#define DEADSTATUS "dead" /* Status of non-working link or machine */
#define PINGSTATUS "ping" /* Status of a working ping node */
#define JOINSTATUS "join" /* Status when an api client joins */
#define LEAVESTATUS "leave" /* Status when an api client leaves */
#define ONLINESTATUS "online" /* Status of an online client */
#define OFFLINESTATUS "offline" /* Status of an offline client */
#define LINKUP "up" /* The status assigned to a working link */
#define LOADAVG "/proc/loadavg"
#define PIDFILE HA_VARRUNDIR "/heartbeat.pid"
#define KEYFILE HA_HBCONF_DIR "/authkeys"
#define HA_SERVICENAME "ha-cluster" /* Our official reg'd service name */
#define UDPPORT 694 /* Our official reg'd port number */
/* Environment variables we pass to our scripts... */
#define CURHOSTENV "HA_CURHOST"
#define OLDSTATUS "HA_OSTATUS"
#define DATEFMT "HA_DATEFMT" /* Format string for date(1) */
#define LOGFENV "HA_LOGFILE" /* well-formed log file :-) */
#define DEBUGFENV "HA_DEBUGLOG" /* Debug log file */
#define LOGFACILITY "HA_LOGFACILITY"/* Facility to use for logger */
#define HADIRENV "HA_DIR" /* The base HA directory */
#define HAFUNCENV "HA_FUNCS" /* Location of ha shell functions */
#define HANICEFAILBACK "HA_NICEFAILBACK" /* "yes" when nice_failback is on */
#define HADONTASK "HA_DONTASK" /* "yes" when no other nodes "active" ...*/
#define HADEBUGVAL "HA_debug" /* current debug value (if nonzero) */
#define HALOGD "HA_LOGD" /* whether we use logging daemon or not */
#define DEFAULTBAUD B19200 /* Default serial link speed */
#define DEFAULTBAUDRATE 19200 /* Default serial link speed as int */
#define DEFAULTBAUDSTR "19200" /* Default serial link speed as string */
/* multicast defaults */
#define DEFAULT_MCAST_IPADDR "225.0.0.1" /* Default multicast group */
#define DEFAULT_MCAST_TTL 1 /* Default multicast TTL */
#define DEFAULT_MCAST_LOOP 0 /* Default mulitcast loopback option */
#define HB_STATIC_PRIO 1 /* Used with soft realtime scheduling */
#define PPP_D HA_VARRUNDIR "/ppp.d"
#define FIFONAME HA_VARLIBHBDIR "/fifo"
#define HOSTUUIDCACHEFILE HA_VARLIBHBDIR "/hostcache"
#define DELHOSTCACHEFILE HA_VARLIBHBDIR "/delhostcache"
#define HOSTUUIDCACHEFILETMP HOSTUUIDCACHEFILE ".tmp"
#define DELHOSTCACHEFILETMP DELHOSTCACHEFILE ".tmp"
#define RCSCRIPT HA_HBCONF_DIR "/harc"
#define CONFIG_NAME HA_HBCONF_DIR "/ha.cf"
#define RESOURCE_CFG HA_HBCONF_DIR "/haresources"
/* dynamic module directories */
#define COMM_MODULE_DIR HA_MODULE_D "/comm"
#define AUTH_MODULE_DIR HA_MODULE_D "/auth"
#define STATIC /* static */
#define HA_DATEFMT "%Y/%m/%d_%T\t"
#define HA_FUNCS HA_HBCONF_DIR "/shellfuncs"
#define RC_ARG0 "harc"
#define ENV_PREFIX "HA_"
/* Which side of a pipe is which? */
#define P_READFD 0
#define P_WRITEFD 1
#define FD_STDIN 0
#define FD_STDOUT 1
#define FD_STDERR 2
#define PROTOCOL_VERSION 1
typedef unsigned long seqno_t;
#define MAXMSGHIST 500
#define MAXMISSING MAXMSGHIST
#define NOSEQUENCE 0xffffffffUL
struct seqtrack {
longclock_t last_rexmit_req;
int nmissing;
seqno_t generation; /* Heartbeat generation # */
seqno_t last_seq;
seqno_t first_missing_seq; /* the smallest missing seq number*/
GList* client_status_msg_queue; /*client status message queue*/
seqno_t seqmissing[MAXMISSING];
const char * last_iface;
seqno_t ack_trigger; /*whenever a message received
*with seq % ACK_MSG_DIV == ack_trigger
*we send back an ACK
*/
seqno_t ackseq; /* ACKed seq*/
};
struct link {
longclock_t lastupdate;
const char * name;
int isping;
char status[STATUSLENG]; /* up or down */
TIME_T rmt_lastupdate; /* node's idea of last update time for this link */
};
#define NORMALNODE_I 0
#define PINGNODE_I 1
#define NORMALNODE "normal"
#define PINGNODE "ping"
#define UNKNOWNNODE "unknown"
struct node_info {
int nodetype;
char nodename[HOSTLENG]; /* Host name from config file */
cl_uuid_t uuid;
char site[HOSTLENG];
int weight;
char status[STATUSLENG]; /* Status from heartbeat */
gboolean status_suppressed; /* Status reports suppressed
for now */
struct ha_msg* saved_status_msg; /* Last status (ignored) */
struct link links[MAXMEDIA];
int nlinks;
TIME_T rmt_lastupdate; /* node's idea of last update time */
seqno_t status_seqno; /* Seqno of last status update */
longclock_t dead_ticks; /* # ticks to declare dead */
longclock_t local_lastupdate;/* Date of last update in clock_t time*/
int anypacketsyet; /* True after reception of 1st pkt */
struct seqtrack track;
int has_resources; /* TRUE if node may have resources */
};
typedef enum {
HB_JOIN_NONE = 0, /* Don't allow runtime joins of unknown nodes */
HB_JOIN_OTHER = 1, /* Allow runtime joins of other nodes */
HB_JOIN_ANY = 2, /* Don't even require _us_ to be in ha.cf */
}hbjointype_t;
#define MAXAUTH 16
struct sys_config {
TIME_T cfg_time; /* Timestamp of config file */
TIME_T auth_time; /* Timestamp of authorization file */
TIME_T rsc_time; /* Timestamp of haresources file */
int format_vers; /* Version of this info */
int nodecount; /* Number of nodes in cluster */
long heartbeat_ms; /* Milliseconds between heartbeats */
long deadtime_ms; /* Ticks before declaring dead */
long deadping_ms; /* Ticks before declaring ping nodes */
long initial_deadtime_ms; /* Ticks before saying dead 1st time*/
long warntime_ms; /* Ticks before issuing warning */
int hopfudge; /* hops beyond nodecount allowed */
int log_facility; /* syslog facility, if any */
char facilityname[PATH_MAX]; /* syslog facility name (if any) */
char logfile[PATH_MAX]; /* path to log file, if any */
int use_logfile; /* Flag to use the log file*/
char dbgfile[PATH_MAX]; /* path to debug file, if any */
int use_dbgfile; /* Flag to use the debug file*/
int memreserve; /* number of kbytes to preallocate in heartbeat */
int rereadauth; /* 1 if we need to reread auth file */
seqno_t generation; /* Heartbeat generation # */
cl_uuid_t uuid; /* uuid for this node*/
int uuidfromname; /* do we get uuid from nodename?*/
char cluster[PATH_MAX]; /* the name of cluster*/
char quorum_server[PATH_MAX];/* the quorum_server*/
hbjointype_t rtjoinconfig; /* Runtime join behavior */
int authnum;
Stonith* stonith; /* Stonith method - r1-style cluster only */
struct HBauth_info* authmethod; /* auth_config[authnum] */
struct node_info nodes[MAXNODE];
struct HBauth_info auth_config[MAXAUTH];
GList* client_list;
/* List data: struct client_child */
GList* last_client;/* Last in client_list */
};
typedef enum {
MEDIA_OK = 0,
MEDIA_INRECOVERY=1,
MEDIA_DELAYEDRECOVERY=2
}media_recov_t;
struct hb_media {
void * pd; /* Private Data */
const char * name; /* Unique medium name */
char* type; /* Medium type */
char* description; /* Medium description */
const struct hb_media_fns*vf; /* Virtual Functions */
media_recov_t recovery_state; /* What's up with media? */
gboolean suppresserrs; /* TRUE if errors shouldn't be logged */
int ourproc; /* Value of ourproc for 1st process */
IPC_Channel* wchan[2];
/* Read by the write child processes. */
IPC_Channel* rchan[2];
/* Written to by the read child processes. */
GCHSource* readsource;
GCHSource* writesource;
};
int parse_authfile(void);
struct msg_xmit_hist {
struct ha_msg* msgq[MAXMSGHIST];
seqno_t seqnos[MAXMSGHIST];
longclock_t lastrexmit[MAXMSGHIST];
int lastmsg;
seqno_t hiseq;
seqno_t lowseq; /* one less than min actually present */
seqno_t ackseq;
struct node_info* lowest_acknode;
};
/*
* client_child: information on clients that we spawn and keep track of
* They don't strictly have to use the client API, but most probably do.
* We start them when we start up, and shut them down when we shut down.
* Normally, if they they die, we restart them.
*/
struct client_child {
pid_t pid; /* Process id of child process */
ProcTrack* proctrack; /* Process tracking structure */
gboolean respawn; /* Respawn it if it dies? */
gboolean rebootifitdies; /* Reboot system it if it dies? */
uid_t u_runas; /* Which user to run as? */
gid_t g_runas; /* Which group id to run as? */
int respawncount; /* Last time we respawned */
int shortrcount; /* Count of fast respawns */
char* command; /* What command to run? */
char* path; /* Path (argv[0])? */
};
int api_remove_client_pid(pid_t c_pid, const char * reason);
extern struct sys_config * config;
extern int debug_level;
extern int udpport;
extern int RestartRequested;
extern char * localnodename;
#define ha_log cl_log
#define ha_perror cl_perror
/* Generally useful exportable HA heartbeat routines... */
extern void ha_assert(const char *s, int line, const char * file);
gboolean heartbeat_on_congestion(void);
extern int send_cluster_msg(struct ha_msg*msg);
extern void cleanexit(int exitcode);
extern void check_auth_change(struct sys_config *);
extern void (*localdie)(void);
extern int should_ring_copy_msg(struct ha_msg* m);
extern int controlipc2msg(IPC_Channel * channel
, struct ha_msg **);
extern int add_msg_auth(struct ha_msg * msg);
extern unsigned char * calc_cksum(const char * authmethod, const char * key, const char * value);
struct node_info * lookup_node(const char *);
struct link * lookup_iface(struct node_info * hip, const char *iface);
struct link * iface_lookup_node(const char *);
int add_node(const char * value, int nodetype);
int set_node_weight(const char * value, int weight);
int set_node_site(const char * value, const char * site);
int remove_node(const char * value, int);
void SetParameterValue(const char * name, const char * value);
gint uuid_equal(gconstpointer v, gconstpointer v2);
guint uuid_hash(gconstpointer key);
int write_cache_file(struct sys_config * cfg);
int read_cache_file(struct sys_config * cfg);
int write_delnode_file(struct sys_config * cfg);
void add_nametable(const char* nodename, struct node_info* value);
void add_uuidtable(cl_uuid_t*, struct node_info* value);
const char * uuid2nodename(cl_uuid_t* uuid);
int nodename2uuid(const char* nodename, cl_uuid_t*);
int inittable(void);
gboolean update_tables(const char* nodename, cl_uuid_t* uuid);
struct node_info* lookup_tables(const char* nodename, cl_uuid_t* uuid);
void cleanuptable(void);
int tables_remove(const char* nodename, cl_uuid_t* uuid);
int GetUUID(struct sys_config*, const char*, cl_uuid_t* uuid);
void remove_from_dellist( const char* nodename);
void append_to_dellist(struct node_info* hip);
void request_msg_rexmit(struct node_info *node, seqno_t lowseq, seqno_t hiseq);
int remove_msg_rexmit(struct node_info *node, seqno_t seq);
int init_rexmit_hash_table(void);
int destroy_rexmit_hash_table(void);
#endif /* _HEARTBEAT_H */
|