mirror of https://github.com/sipwise/heartbeat.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
5.5 KiB
179 lines
5.5 KiB
/*
|
|
* hb_api_core_h: Internal definitions and functions for the heartbeat API
|
|
*
|
|
* 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
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* NOTE: This header NOT intended to be included by anything other than
|
|
* heartbeat. It is NOT a global header file, and should NOT be installed anywhere
|
|
* outside the heartbeat tree.
|
|
*/
|
|
|
|
#ifndef _HB_API_CORE_H
|
|
# define _HB_API_CORE_H 1
|
|
|
|
#include <sys/types.h>
|
|
#include <glib.h>
|
|
#include <clplumbing/GSource.h>
|
|
#include <ha_msg.h>
|
|
|
|
/* 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)
|
|
|
|
#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)
|
|
|
|
void process_registerevent(IPC_Channel* chan, gpointer user_data);
|
|
|
|
/*
|
|
* Per-client API data structure.
|
|
*/
|
|
|
|
typedef struct client_process {
|
|
char client_id[32]; /* Client identification */
|
|
pid_t pid; /* PID of client process */
|
|
uid_t uid; /* UID of client process */
|
|
gid_t gid; /* GID of client process */
|
|
int iscasual; /* 1 if this is a "casual" client */
|
|
int isindispatch; /* TRUE if we're in dispatch now */
|
|
const char* removereason;/* non-NULL if client is being removed */
|
|
IPC_Channel*chan; /* client IPC channel */
|
|
GCHSource* gsource; /* return from G_main_add_fd() */
|
|
int signal; /* What signal to indicate new msgs */
|
|
int desired_types; /* A bit mask of desired message types*/
|
|
struct client_process* next;
|
|
GHashTable* seq_snapshot_table;
|
|
int cligen;
|
|
}client_proc_t;
|
|
|
|
|
|
/*
|
|
* Types of messages.
|
|
* DROPIT and/or DUPLICATE are only used when a debugging callback
|
|
* is registered.
|
|
*/
|
|
|
|
|
|
/*
|
|
* This next set of defines is for the types of packets that come through
|
|
* heartbeat.
|
|
*
|
|
* Any given packet behaves like an enumeration (should only have one bit
|
|
* on), but the options from client software treat them more like a set
|
|
* (bit field), with more than one at a time being on. Normally the
|
|
* client only requests KEEPIT packets, but for debugging may want to
|
|
* ask to see the others too.
|
|
*/
|
|
#define KEEPIT 0x01 /* A set of bits */
|
|
#define NOCHANGE 0x02
|
|
#define DROPIT 0x04
|
|
#define DUPLICATE 0x08
|
|
#define APICALL 0x10
|
|
#define PROTOCOL 0x20
|
|
#define DEBUGTREATMENTS (DROPIT|DUPLICATE|APICALL|NOCHANGE|PROTOCOL)
|
|
#define ALLTREATMENTS (DEBUGTREATMENTS|KEEPIT)
|
|
#define DEFAULTREATMENT (KEEPIT)
|
|
|
|
#define API_SIGNON "signon"
|
|
#define API_SIGNOFF "signoff"
|
|
#define API_SETFILTER "setfilter"
|
|
# define F_FILTERMASK "fmask"
|
|
#define API_SETSIGNAL "setsignal"
|
|
# define F_SIGNAL "signal"
|
|
#define API_NODELIST "nodelist"
|
|
# define F_NODENAME "node"
|
|
#define API_NODELIST_END "nodelist-end"
|
|
#define API_NODESTATUS "nodestatus"
|
|
#define API_NODEWEIGHT "nodeweight"
|
|
#define API_NODESITE "nodesite"
|
|
#define API_NODETYPE "nodetype"
|
|
#define API_NUMNODES "numnodes"
|
|
|
|
#define API_IFLIST "iflist"
|
|
# define F_IFNAME "ifname"
|
|
#define API_IFLIST_END "iflist-end"
|
|
#define API_IFSTATUS "ifstatus"
|
|
#define API_GETPARM "getparm"
|
|
#define API_GETRESOURCES "getrsc"
|
|
|
|
#define API_GETUUID "getuuid"
|
|
# define F_QUERYUUID "queryuuid"
|
|
#define API_GETNAME "getnodename"
|
|
# define F_QUERYNAME "queryname"
|
|
#define API_CLIENTSTATUS "clientstatus"
|
|
|
|
#define API_SET_SENDQLEN "set_sendqlen"
|
|
# define F_SENDQLEN "sendqlen"
|
|
|
|
#define API_OK "OK"
|
|
#define API_FAILURE "fail"
|
|
#define API_BADREQ "badreq"
|
|
#define API_MORE "ok/more"
|
|
|
|
#define API_FIFO_DIR HA_VARLIBHBDIR "/api"
|
|
#define API_FIFO_LEN (sizeof(API_FIFO_DIR)+32)
|
|
|
|
#define NAMEDCLIENTDIR API_FIFO_DIR
|
|
#define CASUALCLIENTDIR HA_VARLIBHBDIR "/casual"
|
|
|
|
#define REQ_SUFFIX ".req"
|
|
#define RSP_SUFFIX ".rsp"
|
|
|
|
#ifndef API_REGSOCK
|
|
# define API_REGSOCK HA_VARRUNDIR "/heartbeat/register"
|
|
#endif
|
|
|
|
void api_heartbeat_monitor(struct ha_msg *msg, int msgtype, const char *iface);
|
|
void api_process_registration(struct ha_msg *msg);
|
|
void process_api_msgs(fd_set* inputs, fd_set* exceptions);
|
|
int compute_msp_fdset(fd_set* set, int fd1, int fd2);
|
|
gboolean api_audit_clients(gpointer p);
|
|
client_proc_t* find_client(const char * fromid, const char * pid);
|
|
gboolean all_clients_resume(void);
|
|
gboolean all_clients_pause(void);
|
|
|
|
/* Return code for API query handlers */
|
|
|
|
#define I_API_RET 0 /* acknowledge client of successful API query */
|
|
#define I_API_IGN 1 /* do nothing */
|
|
#define I_API_BADREQ 2 /* send error msg to client with "failreason" as error reason */
|
|
|
|
/* Handler of API query */
|
|
typedef int (*api_query_handler_t) (const struct ha_msg* msg
|
|
, struct ha_msg *resp, client_proc_t* client
|
|
, const char **failreason);
|
|
|
|
struct api_query_handler {
|
|
const char *queryname;
|
|
api_query_handler_t handler;
|
|
};
|
|
|
|
#endif /* _HB_API_CORE_H */
|