diff --git a/include/crm/cib.h b/include/crm/cib.h index afb77ccd2c..6847930053 100644 --- a/include/crm/cib.h +++ b/include/crm/cib.h @@ -1,232 +1,237 @@ -/* $Id: cib.h,v 1.8 2004/12/05 16:05:42 andrew Exp $ */ +/* $Id: cib.h,v 1.9 2004/12/09 14:53:41 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU 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 software 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 * General Public License for more details. * * You should have received a copy of the GNU 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 CIB__H #define CIB__H #include #include #include enum cib_variant { cib_native, cib_database, cib_edir }; enum cib_state { cib_connected_command, cib_connected_query, cib_disconnected }; enum cib_conn_type { cib_command, cib_query, cib_no_connection }; enum cib_call_options { cib_none = 0x000000, cib_verbose = 0x000001, cib_discard_reply = 0x000004, cib_scope_local = 0x000010, /* cib_scope_global = 0x000020, */ cib_sync_call = 0x000040, /* cib_async_call = 0x000080, */ cib_inhibit_notify= 0x000100 }; #define cib_default_options = cib_none enum cib_errors { cib_ok = 0, cib_operation = -1, cib_create_msg = -2, cib_not_connected = -3, cib_not_authorized = -4, cib_send_failed = -5, cib_reply_failed = -6, cib_return_code = -7, cib_output_ptr = -8, cib_output_data = -9, cib_connection = -10, cib_authentication = -11, cib_missing = -12, cib_variant = -28, CIBRES_MISSING_ID = -13, CIBRES_MISSING_TYPE = -14, CIBRES_MISSING_FIELD = -15, CIBRES_OBJTYPE_MISMATCH = -16, CIBRES_CORRUPT = -17, CIBRES_OTHER = -18, cib_unknown = -19, cib_STALE = -20, cib_EXISTS = -21, cib_NOTEXISTS = -22, cib_ACTIVATION = -23, cib_NOSECTION = -24, cib_NOOBJECT = -25, cib_NOPARENT = -26, cib_NODECOPY = -27, cib_NOTSUPPORTED = -29, cib_registration_msg = -30, cib_callback_token = -31, cib_callback_register = -32, cib_msg_field_add = -33, - cib_client_gone = -34 + cib_client_gone = -34, + cib_not_master = -35, + cib_client_corrupt = -36 }; enum cib_op { CIB_OP_NONE = 0, CIB_OP_ADD, CIB_OP_MODIFY, CIB_OP_DELETE, CIB_OP_MAX }; enum cib_section { cib_section_none, cib_section_all, cib_section_nodes, cib_section_constraints, cib_section_resources, cib_section_crmconfig, cib_section_status }; #define T_CIB "cib" #define F_CIB_CLIENTID "cib_clientid" #define F_CIB_CALLOPTS "cib_callopt" #define F_CIB_CALLID "cib_callid" #define F_CIB_CALLDATA "cib_calldata" #define F_CIB_OPERATION "cib_op" #define F_CIB_ISREPLY "cib_isreplyto" #define F_CIB_SECTION "cib_section" +#define F_CIB_HOST "cib_host" #define F_CIB_RC "cib_rc" #define F_CIB_CALLBACK_TOKEN "cib_callback_token" - +#define F_CIB_GLOBAL_UPDATE "cib_update" +#define F_CIB_DELEGATED "cib_delegated_from" typedef struct cib_s cib_t; typedef struct cib_api_operations_s { int (*variant_op)( - cib_t *cib, const char *op, const char *section, - xmlNodePtr data, xmlNodePtr *output_data, int call_options); + cib_t *cib, const char *op, const char *host, + const char *section, xmlNodePtr data, + xmlNodePtr *output_data, int call_options); int (*signon) (cib_t *cib, enum cib_conn_type type); int (*signoff)(cib_t *cib); int (*free) (cib_t *cib); int (*set_op_callback)( cib_t *cib, void (*callback)( const struct ha_msg *msg, int callid , int rc, xmlNodePtr output)); int (*set_connection_dnotify)( cib_t *cib, void (*dnotify)(gpointer user_data)); IPC_Channel *(*channel)(cib_t* cib); int (*inputfd)(cib_t* cib); int (*noop)(cib_t *cib, int call_options); int (*ping)( cib_t *cib, xmlNodePtr *output_data, int call_options); int (*query)(cib_t *cib, const char *section, xmlNodePtr *output_data, int call_options); int (*query_from)( cib_t *cib, const char *host, const char *section, xmlNodePtr *output_data, int call_options); gboolean (*is_master) (cib_t *cib); int (*set_master)(cib_t *cib, int call_options); int (*set_slave) (cib_t *cib, int call_options); int (*set_slave_all)(cib_t *cib, int call_options); int (*sync)(cib_t *cib, const char *section, int call_options); int (*sync_from)( cib_t *cib, const char *host, const char *section, int call_options); int (*bump_epoch)(cib_t *cib, int call_options); int (*create)(cib_t *cib, const char *section, xmlNodePtr data, xmlNodePtr *output_data, int call_options) ; int (*modify)(cib_t *cib, const char *section, xmlNodePtr data, xmlNodePtr *output_data, int call_options) ; int (*replace)(cib_t *cib, const char *section, xmlNodePtr data, xmlNodePtr *output_data, int call_options) ; int (*delete)(cib_t *cib, const char *section, xmlNodePtr data, xmlNodePtr *output_data, int call_options) ; int (*erase)( cib_t *cib, xmlNodePtr *output_data, int call_options); int (*quit)(cib_t *cib, int call_options); gboolean (*msgready)(cib_t* cib); int (*rcvmsg)(cib_t* cib, int blocking); gboolean (*dispatch)(IPC_Channel *channel, gpointer user_data); } cib_api_operations_t; struct cib_s { enum cib_state state; enum cib_conn_type type; int call_id; void *variant_opaque; GList *notify_callback_list; void (*op_callback)(const struct ha_msg *msg, int call_id, int rc, xmlNodePtr output); cib_api_operations_t *cmds; }; /* Core functions */ extern cib_t *cib_new(void); extern gboolean startCib(const char *filename); extern xmlNodePtr get_cib_copy(cib_t *cib); extern xmlNodePtr cib_get_generation(cib_t *cib); extern int cib_compare_generation(xmlNodePtr left, xmlNodePtr right); /* Utility functions */ extern xmlNodePtr get_object_root(const char *object_type,xmlNodePtr the_root); extern xmlNodePtr create_cib_fragment_adv( xmlNodePtr update, const char *section, const char *source); extern char *cib_pluralSection(const char *a_section); /* Error Interpretation*/ extern const char *cib_error2string(enum cib_errors); extern const char *cib_op2string(enum cib_op); extern xmlNodePtr createEmptyCib(void); extern gboolean verifyCibXml(xmlNodePtr cib); extern int cib_section2enum(const char *a_section); #define create_cib_fragment(update,section) create_cib_fragment_adv(update, section, __FUNCTION__) #endif diff --git a/include/crm/crm.h b/include/crm/crm.h index 658a12313e..47f886cc95 100644 --- a/include/crm/crm.h +++ b/include/crm/crm.h @@ -1,227 +1,228 @@ -/* $Id: crm.h,v 1.32 2004/12/05 16:03:31 andrew Exp $ */ +/* $Id: crm.h,v 1.33 2004/12/09 14:53:41 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU 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 software 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 * General Public License for more details. * * You should have received a copy of the GNU 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 CRM__H #define CRM__H #include #include #include #include #include #include #ifdef MCHECK #include #endif #include /* Clean these up at some point, some probably should be runtime options */ #define WORKING_DIR HA_VARLIBDIR"/heartbeat/crm" #define BIN_DIR "/usr/lib/heartbeat" #define MAXDATASIZE 65535 /* ipc comms */ #define SOCKET_LEN 1024 #define APPNAME_LEN 256 #define LOG_DIR "/var/log" #define MAX_IPC_FAIL 5 #define CIB_FILENAME WORKING_DIR"/cib.xml" #define CIB_BACKUP WORKING_DIR"/cib_backup.xml" #define DEVEL_CIB_COPY 1 #define DEVEL_DIR "/tmp/crm" #define CRM_VERSION "0.6" #define MSG_LOG 1 #define DOT_FSA_ACTIONS 1 #define DOT_ALL_FSA_INPUTS 1 #define FSA_TRACE 1 /* #define USE_FAKE_LRM 1 */ /* Sub-systems */ #define CRM_SYSTEM_DC "dc" #define CRM_SYSTEM_DCIB "dcib" /* The master CIB */ #define CRM_SYSTEM_CIB "cib" #define CRM_SYSTEM_CRMD "crmd" #define CRM_SYSTEM_LRMD "lrmd" #define CRM_SYSTEM_PENGINE "pengine" #define CRM_SYSTEM_TENGINE "tengine" /* Valid operations */ #define CRM_OP_NOOP "noop" /* soon to be moved to cib.h */ #define CRM_OP_CIB_SLAVE "cib_slave" +#define CRM_OP_CIB_SLAVEALL "cib_slave_all" #define CRM_OP_CIB_MASTER "cib_master" #define CRM_OP_CIB_SYNC "cib_sync" #define CRM_OP_CIB_ISMASTER "cib_ismaster" #define CRM_OP_CIB_BUMP "cib_bump" #define CRM_OP_CIB_QUERY "cib_query" #define CRM_OP_CIB_CREATE "cib_create" #define CRM_OP_CIB_UPDATE "cib_update" #define CRM_OP_CIB_DELETE "cib_delete" #define CRM_OP_CIB_ERASE "cib_erase" #define CRM_OP_CIB_REPLACE "cib_replace" #define CRM_OP_RETRIVE_CIB "retrieve_cib" #define CRM_OP_JOINACK "join_ack_nack" #define CRM_OP_WELCOME "welcome" #define CRM_OP_PING "ping" #define CRM_OP_VOTE "vote" #define CRM_OP_HELLO "hello" #define CRM_OP_ANNOUNCE "announce" #define CRM_OP_HBEAT "dc_beat" #define CRM_OP_PECALC "pe_calc" #define CRM_OP_ABORT "abort" #define CRM_OP_QUIT "quit" #define CRM_OP_SHUTDOWN "shutdown_crm" #define CRM_OP_EVENTCC "event_cc" #define CRM_OP_TEABORT "te_abort" #define CRM_OP_TRANSITION "transition" #define CRM_OP_TECOMPLETE "te_complete" #define CRM_OP_SHUTDOWN_REQ "req_shutdown" #define CRM_OP_REGISTER "register" #define CRMD_STATE_ACTIVE "member" #define CRMD_STATE_INACTIVE "down" #define CRMD_JOINSTATE_DOWN "down" #define CRMD_JOINSTATE_PENDING "pending" #define CRMD_JOINSTATE_MEMBER "member" #define CRMD_RSCSTATE_START "start" #define CRMD_RSCSTATE_START_PENDING "starting" #define CRMD_RSCSTATE_START_OK "running" #define CRMD_RSCSTATE_START_FAIL "start_failed" #define CRMD_RSCSTATE_STOP "stop" #define CRMD_RSCSTATE_STOP_PENDING "stopping" #define CRMD_RSCSTATE_STOP_OK "stopped" #define CRMD_RSCSTATE_STOP_FAIL "stop_failed" #define CRMD_RSCSTATE_MON "status" #define CRMD_RSCSTATE_MON_PENDING CRMD_RSCSTATE_START_OK #define CRMD_RSCSTATE_MON_OK CRMD_RSCSTATE_START_OK #define CRMD_RSCSTATE_MON_FAIL "status_failed" /* #define CRMD_RSCSTATE_GENERIC "pending" */ #define CRMD_RSCSTATE_GENERIC_PENDING "pending" #define CRMD_RSCSTATE_GENERIC_OK "complete" #define CRMD_RSCSTATE_GENERIC_FAIL "pending_failed" typedef GList* GListPtr; #define crm_atoi(text, default) atoi(text?text:default) #define safe_str_eq(x, y) (x!=NULL && y!=NULL && strcmp(x,y) == 0) #define safe_str_neq(x, y) (x != y && (x==NULL || y==NULL || strcmp(x,y) != 0)) #define slist_iter(w, x, y, z, a) \ { \ GListPtr __crm_iter_head = y; \ x *w = NULL; \ int z = 0; \ for(; __crm_iter_head != NULL; z++) { \ w = __crm_iter_head->data; \ __crm_iter_head = __crm_iter_head->next; \ { a; } \ } \ } #define safe_val3(def, t,u,v) (t?t->u?t->u->v:def:def) /* Developmental debug stuff */ #define LOG_VERBOSE LOG_DEBUG+1 #define LOG_DEV LOG_DEBUG+2 #define LOG_TRACE LOG_DEBUG+3 #if 1 # define crm_crit(w...) do_crm_log(LOG_CRIT, __FUNCTION__, w) # define crm_err(w...) do_crm_log(LOG_ERR, __FUNCTION__, w) # define crm_warn(w...) do_crm_log(LOG_WARNING, __FUNCTION__, w) # define crm_notice(w...) do_crm_log(LOG_NOTICE, __FUNCTION__, w) # define crm_info(w...) do_crm_log(LOG_INFO, __FUNCTION__, w) # define crm_debug(w...) do_crm_log(LOG_DEBUG, __FUNCTION__, w) # define crm_devel(w...) do_crm_log(LOG_DEV, __FUNCTION__, w) # define crm_verbose(w...) do_crm_log(LOG_VERBOSE, __FUNCTION__, w) # define crm_trace(w...) do_crm_log(LOG_TRACE, __FUNCTION__, w) #else # define crm_crit(w...) cl_log(LOG_CRIT, w) # define crm_err(w...) cl_log(LOG_ERR, w) # define crm_warn(w...) cl_log(LOG_WARNING, w) # define crm_notice(w...) cl_log(LOG_NOTICE, w) # define crm_info(w...) cl_log(LOG_INFO, w) # define crm_debug(w...) cl_log(LOG_DEBUG, w) # define crm_devel(w...) cl_log(LOG_DEV, w) # define crm_verbose(w...) cl_log(LOG_VERBOSE, w) # define crm_trace(w...) cl_log(LOG_TRACE, w) #endif #define crm_debug_action(x) if(crm_log_level >= LOG_DEBUG) { \ x; \ } #define crm_info_action(x) if(crm_log_level >= LOG_INFO) { \ x; \ } #define crm_xml_crit(xml, text) print_xml_formatted( \ LOG_CRIT, __FUNCTION__, xml, text) #define crm_xml_err(xml, text) print_xml_formatted( \ LOG_ERR, __FUNCTION__, xml, text) #define crm_xml_warn(xml, text) print_xml_formatted( \ LOG_WARNING,__FUNCTION__, xml, text) #define crm_xml_notice(xml, text) print_xml_formatted( \ LOG_NOTICE, __FUNCTION__, xml, text) #define crm_xml_info(xml, text) print_xml_formatted( \ LOG_INFO, __FUNCTION__, xml, text) #define crm_xml_debug(xml, text) if(crm_log_level >= LOG_DEBUG) { \ print_xml_formatted(LOG_DEBUG, __FUNCTION__, xml, text); \ } #define crm_xml_devel(xml, text) if(crm_log_level >= LOG_DEV) { \ print_xml_formatted(LOG_DEV, __FUNCTION__, xml, text); \ \ } #define crm_xml_verbose(xml, text) if(crm_log_level >= LOG_VERBOSE) { \ print_xml_formatted(LOG_VERBOSE, __FUNCTION__, xml, text); \ } #define crm_xml_trace(xml, text) if(crm_log_level >= LOG_TRACE) { \ print_xml_formatted(LOG_TRACE, __FUNCTION__, xml, text); \ } #define crm_malloc(x,y) \ { \ x = cl_malloc(y); \ if(x == NULL) { \ crm_crit("Out of memory... exiting"); \ exit(1); \ } else { \ memset(x, 0, y); \ } \ } \ #define crm_strdup(x) cl_strdup(x) #define crm_free(x) if(x) { cl_free(x); x=NULL; } #define crm_str(x) (const char*)(x?x:"") #endif