194 строки
7.0 KiB
C
194 строки
7.0 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* Copyright (c) 2008-2015 Cisco Systems, Inc. All rights reserved.
|
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
|
|
#include "orte_config.h"
|
|
#include "orte/constants.h"
|
|
|
|
#include "opal/util/argv.h"
|
|
|
|
#include "orte/util/attr.h"
|
|
#include "orte/mca/notifier/base/base.h"
|
|
|
|
|
|
static void orte_notifier_base_identify_modules(char ***modules,
|
|
orte_notifier_request_t *req);
|
|
|
|
void orte_notifier_base_log(int sd, short args, void *cbdata)
|
|
{
|
|
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
|
|
char **modules = NULL;
|
|
orte_notifier_active_module_t *imod;
|
|
int i;
|
|
|
|
/* if no modules are active, then there is nothing to do */
|
|
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
|
|
return;
|
|
}
|
|
|
|
/* check if the severity is >= severity level set for
|
|
* reporting - note that the severity enum value goes up
|
|
* as severity goes down */
|
|
if (orte_notifier_base.severity_level < req->severity ) {
|
|
return;
|
|
}
|
|
|
|
orte_notifier_base_identify_modules(&modules, req);
|
|
|
|
/* no modules selected then nothing to do */
|
|
if (NULL == modules) {
|
|
return;
|
|
}
|
|
|
|
for (i=0; NULL != modules[i]; i++) {
|
|
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
|
|
if (NULL != imod->module->log &&
|
|
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
|
|
imod->module->log(req);
|
|
}
|
|
}
|
|
opal_argv_free(modules);
|
|
}
|
|
|
|
void orte_notifier_base_event(int sd, short args, void *cbdata)
|
|
{
|
|
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
|
|
char **modules = NULL;
|
|
orte_notifier_active_module_t *imod;
|
|
int i;
|
|
|
|
/* if no modules are active, then there is nothing to do */
|
|
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
|
|
return;
|
|
}
|
|
|
|
/* check if the severity is >= severity level set for
|
|
* reporting - note that the severity enum value goes up
|
|
* as severity goes down */
|
|
if (orte_notifier_base.severity_level < req->severity ) {
|
|
return;
|
|
}
|
|
|
|
orte_notifier_base_identify_modules(&modules, req);
|
|
|
|
/* no modules selected then nothing to do */
|
|
if (NULL == modules) {
|
|
return;
|
|
}
|
|
|
|
for (i=0; NULL != modules[i]; i++) {
|
|
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
|
|
if (NULL != imod->module->log &&
|
|
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
|
|
imod->module->event(req);
|
|
}
|
|
}
|
|
opal_argv_free(modules);
|
|
}
|
|
|
|
void orte_notifier_base_report(int sd, short args, void *cbdata)
|
|
{
|
|
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
|
|
char **modules = NULL;
|
|
orte_notifier_active_module_t *imod;
|
|
int i;
|
|
|
|
/* if no modules are active, then there is nothing to do */
|
|
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
|
|
return;
|
|
}
|
|
|
|
/* see if the job requested any notifications */
|
|
if (!orte_get_attribute(&req->jdata->attributes, ORTE_JOB_NOTIFICATIONS, (void**)modules, OPAL_STRING)) {
|
|
return;
|
|
}
|
|
|
|
/* need to process the notification string to get the names of the modules */
|
|
if (NULL == modules) {
|
|
orte_notifier_base_identify_modules(&modules, req);
|
|
|
|
/* no modules selected then nothing to do */
|
|
if (NULL == modules) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
for (i=0; NULL != modules[i]; i++) {
|
|
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
|
|
if (NULL != imod->module->log &&
|
|
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
|
|
imod->module->report(req);
|
|
}
|
|
}
|
|
opal_argv_free(modules);
|
|
}
|
|
|
|
const char* orte_notifier_base_sev2str(orte_notifier_severity_t severity)
|
|
{
|
|
switch (severity) {
|
|
case ORTE_NOTIFIER_EMERG: return "EMERGENCY"; break;
|
|
case ORTE_NOTIFIER_ALERT: return "ALERT"; break;
|
|
case ORTE_NOTIFIER_CRIT: return "CRITICAL"; break;
|
|
case ORTE_NOTIFIER_ERROR: return "ERROR"; break;
|
|
case ORTE_NOTIFIER_WARN: return "WARNING"; break;
|
|
case ORTE_NOTIFIER_NOTICE: return "NOTICE"; break;
|
|
case ORTE_NOTIFIER_INFO: return "INFO"; break;
|
|
case ORTE_NOTIFIER_DEBUG: return "DEBUG"; break;
|
|
default: return "UNKNOWN"; break;
|
|
}
|
|
}
|
|
|
|
static void orte_notifier_base_identify_modules(char ***modules,
|
|
orte_notifier_request_t *req)
|
|
{
|
|
if (NULL != req->action) {
|
|
*modules = opal_argv_split(req->action, ',');
|
|
} else {
|
|
if (ORTE_NOTIFIER_EMERG == req->severity &&
|
|
(NULL != orte_notifier_base.emerg_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.emerg_actions, ',');
|
|
} else if (ORTE_NOTIFIER_ALERT == req->severity &&
|
|
(NULL != orte_notifier_base.alert_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.alert_actions, ',');
|
|
} else if (ORTE_NOTIFIER_CRIT == req->severity &&
|
|
(NULL != orte_notifier_base.crit_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.crit_actions, ',');
|
|
} else if (ORTE_NOTIFIER_WARN == req->severity &&
|
|
(NULL != orte_notifier_base.warn_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.warn_actions, ',');
|
|
} else if (ORTE_NOTIFIER_NOTICE == req->severity &&
|
|
(NULL != orte_notifier_base.notice_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.notice_actions, ',');
|
|
} else if (ORTE_NOTIFIER_INFO == req->severity &&
|
|
(NULL != orte_notifier_base.info_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.info_actions, ',');
|
|
} else if (ORTE_NOTIFIER_DEBUG == req->severity &&
|
|
(NULL != orte_notifier_base.debug_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.debug_actions, ',');
|
|
} else if (ORTE_NOTIFIER_ERROR == req->severity &&
|
|
(NULL != orte_notifier_base.error_actions)) {
|
|
*modules = opal_argv_split(orte_notifier_base.error_actions, ',');
|
|
} else if (NULL != orte_notifier_base.default_actions) {
|
|
*modules = opal_argv_split(orte_notifier_base.default_actions, ',');
|
|
}
|
|
}
|
|
return;
|
|
}
|