Esempio n. 1
0
/**
 * Configuration changes are done fill in and send corresponding notification.
 *
 */
static void saImmOiCcbApplyCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId)
{
	struct CcbUtilCcbData *ccbUtilCcbData;
	struct CcbUtilOperationData *ccbUtilOperationData;
	int internal_rc = 0;
	SaStringT rdn_attr_name;
	SaNameT *invoke_name_ptr;
	SaBoolT ccbLast = SA_FALSE;
	SaUint64T ccb_entries_cnt = 0;

	TRACE_ENTER();

	if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
		LOG_ER("%s: Failed to find CCB object for ccb Id %llu",__FUNCTION__, ccbId);
		internal_rc = (-1);
		goto done;
	}

	/* Count the number of ccb entries in order to know which is the last one */
	ccbUtilOperationData = ccbUtilCcbData->operationListHead;
	ccb_entries_cnt = 0;
	while (ccbUtilOperationData != NULL) {
		ccb_entries_cnt++;
		ccbUtilOperationData = ccbUtilOperationData->next;
	}

	ccbUtilOperationData = ccbUtilCcbData->operationListHead;
	while (ccbUtilOperationData != NULL) {
		if (ccb_entries_cnt > 0) {
			ccb_entries_cnt--;
		}
		
		if (ccb_entries_cnt == 0) {
			ccbLast = SA_TRUE;
		}

		switch (ccbUtilOperationData->operationType) {
		case CCBUTIL_CREATE:
			rdn_attr_name = get_rdn_attr_name(
					ccbUtilOperationData->param.create.className);

			internal_rc = ntfimcn_send_object_create_notification(
					ccbUtilOperationData, rdn_attr_name,
					ccbLast);
			if (internal_rc != 0) {
				LOG_ER("%s send_object_create_notification fail",
						__FUNCTION__);
				goto done;
			}
			break;

		case CCBUTIL_DELETE:
			invoke_name_ptr = (SaNameT *)ccbUtilCcbData->userData;
			internal_rc = ntfimcn_send_object_delete_notification(ccbUtilOperationData,
					invoke_name_ptr,
					ccbLast);
			if (internal_rc != 0) {
				LOG_ER("%s send_object_delete_notification fail",
						__FUNCTION__);
				goto done;
			}
			break;
			
		case CCBUTIL_MODIFY:
			invoke_name_ptr = ccbUtilCcbData->userData;

			/* send_object_modify_notification */
			internal_rc = ntfimcn_send_object_modify_notification(
					ccbUtilOperationData,
					invoke_name_ptr,
					ccbLast);
			if (internal_rc != 0) {
				LOG_ER("%s send_object_modify_notification fail",
						__FUNCTION__);
				goto done;
			}
			break;
		}

		ccbUtilOperationData = ccbUtilOperationData->next;
	}

done:
	if (ccbUtilCcbData != NULL) {
		ccbutil_deleteCcbData(ccbUtilCcbData);
	}
	TRACE_LEAVE();
	if (internal_rc != 0) {
		/* If we fail to send a notification we exit. This will signal that
		 * a notification is missing.
		 */
		imcn_exit(EXIT_FAILURE);
	}
}
Esempio n. 2
0
/**
 * Save the CCB. Will be handled and freed in apply callback
 *
 */
static SaAisErrorT saImmOiCcbObjectModifyCallback(SaImmOiHandleT immOiHandle,
						SaImmOiCcbIdT ccbId,
						const SaNameT *objectName,
						const SaImmAttrModificationT_2 **attrMods)
{
	SaAisErrorT rc = SA_AIS_OK;
	struct CcbUtilCcbData *ccbUtilCcbData;
	SaNameT *invoke_name_ptr = NULL;
	struct CcbUtilOperationData *ccbUtilOperationData;
	int internal_rc = 0;

	TRACE_ENTER();

	if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
		if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
			LOG_ER("%s: Failed to get CCB object for ccb Id %llu",__FUNCTION__, ccbId);
			rc = SA_AIS_ERR_NO_MEMORY;
			goto done;
		}
		invoke_name_ptr = get_operation_invoke_name_modify(ccbId, attrMods);
		ccbUtilCcbData->userData = invoke_name_ptr;
	}

	/* "memorize the modification request" */
	ccbutil_ccbAddModifyOperation(ccbUtilCcbData, objectName,
						attrMods);
	SaNameT *invoker_name_ptr;
	invoker_name_ptr = ccbUtilCcbData->userData;

	if (ccbId == 0) {
		/* Attribute change object create */
		ccbUtilOperationData = ccbUtilCcbData->operationListHead;

		internal_rc = ntfimcn_send_object_modify_notification(
				ccbUtilOperationData,
				invoker_name_ptr,
				SA_FALSE);

		if (ccbUtilCcbData != NULL) {
			ccbutil_deleteCcbData(ccbUtilCcbData);
		}

		if (internal_rc != 0) {
			LOG_ER("%s send_object_modify_notification fail",
					__FUNCTION__);
			goto done;
		}
	}

done:
	if (internal_rc != 0) {
		/* If we fail to send a notification we exit. This will signal that
		 * a notification is missing.
		 */
		LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d",
				internal_rc);
		imcn_exit(EXIT_FAILURE);
	}

	TRACE_LEAVE();
	return rc;
}
Esempio n. 3
0
/*
 * Exit if anything fails. This will cause ntfs to restart ntfimcn
 */
int main(int argc, char** argv)
{
	const char* logPath;
	const char* trace_label = "osafntfimcnd";
	SaAisErrorT ais_error = SA_AIS_OK;

	/*
	 * Activate Log Trace
	 */
	openlog(basename(argv[0]), LOG_PID, LOG_LOCAL0);
	if ((logPath = getenv("NTFSCN_TRACE_PATHNAME"))) {
		category_mask = 0xffffffff;
	} else {
		logPath = PKGLOGDIR "/" NTFIMCN_DEFAULT_LOG;
	}

	if (logtrace_init(trace_label, logPath, category_mask) == -1)
	{
		syslog(LOG_ERR, "osafntfimcnd logtrace_init FAILED");
		/* We allow to execute anyway. */
	}
	
	/*
	 * Initiate HA state
	 */
	if (strcmp(argv[1],"active") == 0) {
		ntfimcn_cb.haState = SA_AMF_HA_ACTIVE;
	} else {
		ntfimcn_cb.haState = SA_AMF_HA_STANDBY;
	}

	/*
	 * Initiate external functionallity
	 * Exit on fail. This will cause ntfs to restart ntfimcn
	 */
	if (ntfimcn_ntf_init(&ntfimcn_cb) == NTFIMCN_INTERNAL_ERROR) {
		LOG_ER("ntfimcn_ntf_init() Fail");
		_Exit(EXIT_FAILURE);
	}

	if (ntfimcn_imm_init(&ntfimcn_cb) == NTFIMCN_INTERNAL_ERROR) {
		LOG_ER("ntfimcn_imm_init() Fail");
		imcn_exit(EXIT_FAILURE);
	}

	/* Signal for TRACE on/off */
	if (signal(SIGUSR2, sigusr2_handler) == SIG_ERR) {
		LOG_ER("signal USR2 failed: %s", strerror(errno));
		/* We allow to execute anyway. */
	}

	if (ntfimcn_send_lost_cm_notification() == NTFIMCN_INTERNAL_ERROR) {
		LOG_ER("send_lost_cm_notification() Fail");
		imcn_exit(EXIT_FAILURE);
	}

	/* Termination signal with handler */
	if (ncs_sel_obj_create(&term_sel_obj) != NCSCC_RC_SUCCESS) {
		LOG_ER("ncs_sel_obj_create failed");
		_Exit(EXIT_FAILURE);
	}

	if (signal(SIGTERM, sigterm_handler) == SIG_ERR) {
		LOG_ER("signal TERM failed: %s", strerror(errno));
		_Exit(EXIT_FAILURE);
	}
	
	/*
	 * Initiate polling
	 */
	fds[FD_IMM].fd = ntfimcn_cb.immSelectionObject;
	fds[FD_IMM].events = POLLIN;
	fds[FD_TERM].fd = term_sel_obj.rmv_obj;
	fds[FD_TERM].events = POLLIN;

	LOG_NO("Started");

	while (1) {
		if (poll(fds, nfds, -1) == (-1)) {
			if (errno == EINTR) {
				continue;
			}

			LOG_ER("poll Fail - %s", strerror(errno));
			imcn_exit(EXIT_FAILURE);
		}

		if (fds[FD_TERM].revents & POLLIN) {
			handle_sigterm_event();
		}

		if (fds[FD_IMM].revents & POLLIN) {
			ais_error = saImmOiDispatch(ntfimcn_cb.immOiHandle, SA_DISPATCH_ALL);
			if (ais_error != SA_AIS_OK) {
				LOG_NO("saImmOiDispatch() Fail %s",saf_error(ais_error));
				imcn_exit(EXIT_FAILURE);
			}
		}
	}

	return 0; /* Dummy */
}
Esempio n. 4
0
/**
 *	Save the CCB. Will be handled and freed in apply callback
 * @param immOiHandle[in]
 * @param ccbId[in]
 * @param objectName[in]
 * 
 * @return SaAisErrorT
 */
static SaAisErrorT saImmOiCcbObjectDeleteCallback(SaImmOiHandleT immOiHandle,
					     SaImmOiCcbIdT ccbId, const SaNameT *objectName)
{
	SaAisErrorT rc = SA_AIS_OK;
	struct CcbUtilCcbData *ccbUtilCcbData;
	struct CcbUtilOperationData *ccbUtilOperationData;
	const SaNameT invoke_name = {
		.length = 0,
		.value[0]='\0'
	};
	int internal_rc = 0;

	TRACE_ENTER();

	if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
		if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
			LOG_ER("%s Failed to get CCB object for %llu",__FUNCTION__,ccbId);
			rc = SA_AIS_ERR_NO_MEMORY;
			goto done;
		}
	}

	/* "memorize the delete request" */
	ccbutil_ccbAddDeleteOperation(ccbUtilCcbData, objectName);

	if (ccbId == 0) {
		/* Runtime object delete */
		ccbUtilOperationData = ccbUtilCcbData->operationListHead;

		internal_rc = ntfimcn_send_object_delete_notification(ccbUtilOperationData,
				&invoke_name,
				SA_FALSE);
		if (internal_rc != 0) {
			LOG_ER("%s send_object_delete_notification fail",
					__FUNCTION__);
			goto done;
		}

		if (ccbUtilCcbData != NULL) {
			ccbutil_deleteCcbData(ccbUtilCcbData);
		}

		if (internal_rc != 0) {
			LOG_ER("%s send_object_create_notification fail",
					__FUNCTION__);
			goto done;
		}
	}


done:
	if (internal_rc != 0) {
		/* If we fail to send a notification we exit. This will signal that
		 * a notification is missing.
		 */
		LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d",
				internal_rc);
		imcn_exit(EXIT_FAILURE);
	}

	TRACE_LEAVE();
	return rc;
}

/**
 * Save the CCB. Will be handled and freed in apply callback
 * If ccbId = 0:
 *		This means that a runtime object is created and the
 *		corresponding notification shall be sent from here
 *
 * @param immOiHandle[in]
 * @param ccbId[in]
 * @param className[in]
 * @param parentName[in]
 * @param attr[in]
 *
 * @return SaAisErrorT
 */
static SaAisErrorT saImmOiCcbObjectCreateCallback(SaImmOiHandleT immOiHandle,
					       SaImmOiCcbIdT ccbId,
					       const SaImmClassNameT className,
					       const SaNameT *parentName, const SaImmAttrValuesT_2 **attr)
{
	SaAisErrorT rc = SA_AIS_OK;
	CcbUtilCcbData_t *ccbUtilCcbData;
	SaNameT *dn_ptr;
	SaNameT *invoke_name_ptr = NULL;
	struct CcbUtilOperationData *ccbUtilOperationData;
	SaStringT rdn_attr_name;
	int internal_rc = 0;

	TRACE_ENTER();

	dn_ptr = get_created_dn(className, parentName, attr);

	if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
		if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
			LOG_ER("%s: Failed to get CCB object for ccb Id %llu",__FUNCTION__, ccbId);
			rc = SA_AIS_ERR_NO_MEMORY;
			goto done;
		}
		invoke_name_ptr = get_operation_invoke_name_create(ccbId, attr);
		ccbUtilCcbData->userData = invoke_name_ptr;
	}

	/* "memorize the create request" */
	ccbutil_ccbAddCreateOperation_2(ccbUtilCcbData, dn_ptr,
			className, parentName, attr);
	
	if (ccbId == 0) {
		/* Runtime object create */
		ccbUtilOperationData = ccbUtilCcbData->operationListHead;

		rdn_attr_name = get_rdn_attr_name(
				ccbUtilOperationData->param.create.className);
		internal_rc = ntfimcn_send_object_create_notification(
				ccbUtilOperationData, rdn_attr_name,
				SA_FALSE);

		if (ccbUtilCcbData != NULL) {
			ccbutil_deleteCcbData(ccbUtilCcbData);
		}

		if (internal_rc != 0) {
			LOG_ER("%s send_object_create_notification fail",
					__FUNCTION__);
			goto done;
		}
	}

done:
	if (internal_rc != 0) {
		/* If we fail to send a notification we exit. This will signal that
		 * a notification is missing.
		 */
		LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d",
				internal_rc);
		imcn_exit(EXIT_FAILURE);
	}

	TRACE_LEAVE();
	return rc;
}
Esempio n. 5
0
/**
 * TERM event handler
 */
static void handle_sigterm_event(void)
{
	LOG_NO("exiting on signal %d", SIGTERM);
	imcn_exit(EXIT_SUCCESS);
}