static int __zbx_zbx_db_execute(const char *fmt, ...) { va_list args; int ret; char *sql=NULL; va_start(args, fmt); sql = zbx_dvsprintf(sql,fmt,args); ret = zbx_db_vexecute(sql, args); va_end(args); zbx_free(sql); return ret; }
/****************************************************************************** * * * Function: zbx_db_vselect * * * * Purpose: execute a select statement * * * * Return value: data, NULL (on error) or (DB_RESULT)ZBX_DB_DOWN * * * ******************************************************************************/ DB_RESULT zbx_db_vselect(const char *fmt, va_list args) { char *sql = NULL; DB_RESULT result = NULL; double sec = 0; #if defined(HAVE_IBM_DB2) int i; SQLRETURN ret = SQL_SUCCESS; #elif defined(HAVE_ORACLE) sword err = OCI_SUCCESS; ub4 counter; #elif defined(HAVE_POSTGRESQL) char *error = NULL; #elif defined(HAVE_SQLITE3) int ret = FAIL; char *error = NULL; #endif if (0 != CONFIG_LOG_SLOW_QUERIES) sec = zbx_time(); sql = zbx_dvsprintf(sql, fmt, args); if (1 == txn_error) { zabbix_log(LOG_LEVEL_DEBUG, "ignoring query [txnlev:%d] [%s] within failed transaction", txn_level, sql); goto clean; } zabbix_log(LOG_LEVEL_DEBUG, "query [txnlev:%d] [%s]", txn_level, sql); #if defined(HAVE_IBM_DB2) result = zbx_malloc(result, sizeof(ZBX_IBM_DB2_RESULT)); memset(result, 0, sizeof(ZBX_IBM_DB2_RESULT)); /* allocate a statement handle */ if (SUCCEED != zbx_ibm_db2_success(ret = SQLAllocHandle(SQL_HANDLE_STMT, ibm_db2.hdbc, &result->hstmt))) goto error; /* directly execute the statement */ if (SUCCEED != zbx_ibm_db2_success(ret = SQLExecDirect(result->hstmt, (SQLCHAR *)sql, SQL_NTS))) goto error; /* identify the number of output columns */ if (SUCCEED != zbx_ibm_db2_success(ret = SQLNumResultCols(result->hstmt, &result->ncolumn))) goto error; if (0 == result->ncolumn) goto error; result->nalloc = 0; result->values = zbx_malloc(result->values, sizeof(char *) * result->ncolumn); result->values_cli = zbx_malloc(result->values_cli, sizeof(char *) * result->ncolumn); result->values_len = zbx_malloc(result->values_len, sizeof(SQLINTEGER) * result->ncolumn); for (i = 0; i < result->ncolumn; i++) { /* get the display size for a column */ if (SUCCEED != zbx_ibm_db2_success(ret = SQLColAttribute(result->hstmt, (SQLSMALLINT)(i + 1), SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, &result->values_len[i]))) { goto error; } result->values_len[i] += 1; /* '\0'; */ /* allocate memory to bind a column */ result->values_cli[i] = zbx_malloc(NULL, result->values_len[i]); result->nalloc++; /* bind columns to program variables, converting all types to CHAR */ if (SUCCEED != zbx_ibm_db2_success(ret = SQLBindCol(result->hstmt, (SQLSMALLINT)(i + 1), SQL_C_CHAR, result->values_cli[i], result->values_len[i], &result->values_len[i]))) { goto error; } } error: if (SUCCEED != zbx_ibm_db2_success(ret) || 0 == result->ncolumn) { zbx_ibm_db2_log_errors(SQL_HANDLE_DBC, ibm_db2.hdbc); zbx_ibm_db2_log_errors(SQL_HANDLE_STMT, result->hstmt); IBM_DB2free_result(result); result = (SQL_CD_TRUE == IBM_DB2server_status() ? NULL : (DB_RESULT)ZBX_DB_DOWN); } #elif defined(HAVE_MYSQL) if (NULL == conn) { zabbix_errlog(ERR_Z3003); result = NULL; } else { if (0 != mysql_query(conn, sql)) { zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); switch (mysql_errno(conn)) { case CR_CONN_HOST_ERROR: case CR_SERVER_GONE_ERROR: case CR_CONNECTION_ERROR: case CR_SERVER_LOST: case ER_SERVER_SHUTDOWN: case ER_ACCESS_DENIED_ERROR: /* wrong user or password */ case ER_ILLEGAL_GRANT_FOR_TABLE: /* user without any privileges */ case ER_TABLEACCESS_DENIED_ERROR:/* user without some privilege */ case ER_UNKNOWN_ERROR: result = (DB_RESULT)ZBX_DB_DOWN; break; default: result = NULL; break; } } else result = mysql_store_result(conn); } #elif defined(HAVE_ORACLE) result = zbx_malloc(NULL, sizeof(ZBX_OCI_DB_RESULT)); memset(result, 0, sizeof(ZBX_OCI_DB_RESULT)); err = OCIHandleAlloc((dvoid *)oracle.envhp, (dvoid **)&result->stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0); if (OCI_SUCCESS == err) { err = OCIStmtPrepare(result->stmthp, oracle.errhp, (text *)sql, (ub4)strlen((char *)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT); } if (OCI_SUCCESS == err) { err = OCIStmtExecute(oracle.svchp, result->stmthp, oracle.errhp, (ub4)0, (ub4)0, (CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_COMMIT_ON_SUCCESS); } if (OCI_SUCCESS == err) { /* get the number of columns in the query */ err = OCIAttrGet((void *)result->stmthp, OCI_HTYPE_STMT, (void *)&result->ncolumn, (ub4 *)0, OCI_ATTR_PARAM_COUNT, oracle.errhp); } if (OCI_SUCCESS != err) goto error; assert(0 < result->ncolumn); result->values = zbx_malloc(NULL, result->ncolumn * sizeof(char *)); memset(result->values, 0, result->ncolumn * sizeof(char *)); for (counter = 1; OCI_SUCCESS == err && counter <= result->ncolumn; counter++) { OCIParam *parmdp = NULL; OCIDefine *defnp = NULL; ub4 char_semantics; ub2 col_width; /* request a parameter descriptor in the select-list */ err = OCIParamGet((void *)result->stmthp, OCI_HTYPE_STMT, oracle.errhp, (void **)&parmdp, (ub4)counter); if (OCI_SUCCESS == err) { /* retrieve the length semantics for the column */ char_semantics = 0; err = OCIAttrGet((void *)parmdp, (ub4)OCI_DTYPE_PARAM, (void *)&char_semantics, (ub4 *)0, (ub4)OCI_ATTR_CHAR_USED, (OCIError *)oracle.errhp); } if (OCI_SUCCESS == err) { col_width = 0; if (char_semantics) { /* retrieve the column width in characters */ err = OCIAttrGet((void *)parmdp, (ub4)OCI_DTYPE_PARAM, (void *)&col_width, (ub4 *)0, (ub4)OCI_ATTR_CHAR_SIZE, (OCIError *)oracle.errhp); } else { /* retrieve the column width in bytes */ err = OCIAttrGet((void *)parmdp, (ub4)OCI_DTYPE_PARAM, (void *)&col_width, (ub4 *)0, (ub4)OCI_ATTR_DATA_SIZE, (OCIError *)oracle.errhp); } } col_width++; result->values[counter - 1] = zbx_malloc(NULL, col_width); memset(result->values[counter - 1], 0, col_width); if (OCI_SUCCESS == err) { /* represent any data as characters */ err = OCIDefineByPos(result->stmthp, &defnp, oracle.errhp, counter, (dvoid *)result->values[counter - 1], col_width, SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT); } /* free cell descriptor */ OCIDescriptorFree(parmdp, OCI_DTYPE_PARAM); parmdp = NULL; } error: if (OCI_SUCCESS != err) { zabbix_errlog(ERR_Z3005, err, zbx_oci_error(err), sql); OCI_DBfree_result(result); result = (OCI_SERVER_NORMAL == OCI_DBserver_status() ? NULL : (DB_RESULT)ZBX_DB_DOWN); } #elif defined(HAVE_POSTGRESQL) result = zbx_malloc(NULL, sizeof(ZBX_PG_DB_RESULT)); result->pg_result = PQexec(conn, sql); result->values = NULL; result->cursor = 0; result->row_num = 0; if (NULL == result->pg_result) zabbix_errlog(ERR_Z3005, 0, "result is NULL", sql); if (PGRES_TUPLES_OK != PQresultStatus(result->pg_result)) { error = zbx_dsprintf(error, "%s:%s", PQresStatus(PQresultStatus(result->pg_result)), PQresultErrorMessage(result->pg_result)); zabbix_errlog(ERR_Z3005, 0, error, sql); zbx_free(error); PG_DBfree_result(result); result = (CONNECTION_OK == PQstatus(conn) ? NULL : (DB_RESULT)ZBX_DB_DOWN); } else /* init rownum */ result->row_num = PQntuples(result->pg_result); #elif defined(HAVE_SQLITE3) if (0 == txn_level && PHP_MUTEX_OK != php_sem_acquire(&sqlite_access)) { zabbix_log(LOG_LEVEL_CRIT, "ERROR: cannot create lock on SQLite3 database"); exit(FAIL); } result = zbx_malloc(NULL, sizeof(ZBX_SQ_DB_RESULT)); result->curow = 0; lbl_get_table: if (SQLITE_OK != (ret = sqlite3_get_table(conn,sql, &result->data, &result->nrow, &result->ncolumn, &error))) { if (SQLITE_BUSY == ret) goto lbl_get_table; zabbix_errlog(ERR_Z3005, 0, error, sql); sqlite3_free(error); SQ_DBfree_result(result); switch (ret) { case SQLITE_ERROR: /* SQL error or missing database; assuming SQL error, because if we are this far into execution, zbx_db_connect() was successful */ case SQLITE_NOMEM: /* a malloc() failed */ case SQLITE_MISMATCH: /* data type mismatch */ result = NULL; break; default: result = (DB_RESULT)ZBX_DB_DOWN; break; } } if (0 == txn_level) php_sem_release(&sqlite_access); #endif /* HAVE_SQLITE3 */ if (0 != CONFIG_LOG_SLOW_QUERIES) { sec = zbx_time() - sec; if (sec > (double)CONFIG_LOG_SLOW_QUERIES / 1000.0) zabbix_log(LOG_LEVEL_WARNING, "slow query: " ZBX_FS_DBL " sec, \"%s\"", sec, sql); } if (NULL == result && 0 < txn_level) { zabbix_log(LOG_LEVEL_DEBUG, "query [%s] failed, setting transaction as failed", sql); txn_error = 1; } clean: zbx_free(sql); return result; }
/* * Execute SQL statement. For non-select statements only. */ int zbx_db_vexecute(const char *fmt, va_list args) { char *sql = NULL; int ret = ZBX_DB_OK; double sec = 0; #if defined(HAVE_IBM_DB2) SQLHANDLE hstmt = 0; SQLRETURN ret1; SQLLEN row1; SQLLEN rows = 0; #elif defined(HAVE_MYSQL) int status; #elif defined(HAVE_ORACLE) OCIStmt *stmthp = NULL; sword err = OCI_SUCCESS; #elif defined(HAVE_POSTGRESQL) PGresult *result; char *error = NULL; #elif defined(HAVE_SQLITE3) int err; char *error = NULL; #endif if (0 != CONFIG_LOG_SLOW_QUERIES) sec = zbx_time(); sql = zbx_dvsprintf(sql, fmt, args); if (0 == txn_init && 0 == txn_level) zabbix_log(LOG_LEVEL_DEBUG, "query without transaction detected"); if (1 == txn_error) { zabbix_log(LOG_LEVEL_DEBUG, "ignoring query [txnlev:%d] [%s] within failed transaction", txn_level, sql); ret = ZBX_DB_FAIL; goto clean; } zabbix_log(LOG_LEVEL_DEBUG, "query [txnlev:%d] [%s]", txn_level, sql); #if defined(HAVE_IBM_DB2) /* allocate a statement handle */ if (SUCCEED != zbx_ibm_db2_success(SQLAllocHandle(SQL_HANDLE_STMT, ibm_db2.hdbc, &hstmt))) ret = ZBX_DB_DOWN; /* directly execute the statement; returns SQL_NO_DATA_FOUND when no rows were affected */ if (ZBX_DB_OK == ret && SUCCEED != zbx_ibm_db2_success_ext(SQLExecDirect(hstmt, (SQLCHAR *)sql, SQL_NTS))) ret = ZBX_DB_DOWN; /* get number of affected rows */ if (ZBX_DB_OK == ret && SUCCEED != zbx_ibm_db2_success(SQLRowCount(hstmt, &rows))) ret = ZBX_DB_DOWN; /* process other SQL statements in the batch */ while (ZBX_DB_OK == ret && SUCCEED == zbx_ibm_db2_success(ret1 = SQLMoreResults(hstmt))) { if (SUCCEED != zbx_ibm_db2_success(SQLRowCount(hstmt, &row1))) ret = ZBX_DB_DOWN; else rows += row1; } if (ZBX_DB_OK == ret && SQL_NO_DATA_FOUND != ret1) ret = ZBX_DB_DOWN; if (ZBX_DB_OK != ret) { zbx_ibm_db2_log_errors(SQL_HANDLE_DBC, ibm_db2.hdbc); zbx_ibm_db2_log_errors(SQL_HANDLE_STMT, hstmt); ret = (SQL_CD_TRUE == IBM_DB2server_status() ? ZBX_DB_FAIL : ZBX_DB_DOWN); } else if (0 <= rows) { ret = (int)rows; } if (hstmt) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); #elif defined(HAVE_MYSQL) if (NULL == conn) { zabbix_errlog(ERR_Z3003); ret = ZBX_DB_FAIL; } else { if (0 != (status = mysql_query(conn, sql))) { zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); switch (mysql_errno(conn)) { case CR_CONN_HOST_ERROR: case CR_SERVER_GONE_ERROR: case CR_CONNECTION_ERROR: case CR_SERVER_LOST: case ER_SERVER_SHUTDOWN: case ER_ACCESS_DENIED_ERROR: /* wrong user or password */ case ER_ILLEGAL_GRANT_FOR_TABLE: /* user without any privileges */ case ER_TABLEACCESS_DENIED_ERROR:/* user without some privilege */ case ER_UNKNOWN_ERROR: ret = ZBX_DB_DOWN; break; default: ret = ZBX_DB_FAIL; break; } } else { do { if (0 != mysql_field_count(conn)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot retrieve result set"); break; } else ret += (int)mysql_affected_rows(conn); /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ if (0 < (status = mysql_next_result(conn))) zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); } while (0 == status); } } #elif defined(HAVE_ORACLE) err = OCIHandleAlloc((dvoid *)oracle.envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0); if (OCI_SUCCESS == err) { err = OCIStmtPrepare(stmthp, oracle.errhp, (text *)sql, (ub4)strlen((char *)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT); } if (OCI_SUCCESS == err) { err = OCIStmtExecute(oracle.svchp, stmthp, oracle.errhp, (ub4)1, (ub4)0, (CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_COMMIT_ON_SUCCESS); if (OCI_SUCCESS == err) { ub4 nrows = 0; err = OCIAttrGet((void *)stmthp, OCI_HTYPE_STMT, (ub4 *)&nrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, oracle.errhp); ret = nrows; } } if (OCI_SUCCESS != err) { zabbix_errlog(ERR_Z3005, err, zbx_oci_error(err), sql); ret = (OCI_SERVER_NORMAL == OCI_DBserver_status() ? ZBX_DB_FAIL : ZBX_DB_DOWN); } if (NULL != stmthp) { (void)OCIHandleFree((dvoid *)stmthp, OCI_HTYPE_STMT); stmthp = NULL; } #elif defined(HAVE_POSTGRESQL) result = PQexec(conn,sql); if (NULL == result) { zabbix_errlog(ERR_Z3005, 0, "result is NULL", sql); ret = (CONNECTION_OK == PQstatus(conn) ? ZBX_DB_FAIL : ZBX_DB_DOWN); } else if (PGRES_COMMAND_OK != PQresultStatus(result)) { error = zbx_dsprintf(error, "%s:%s", PQresStatus(PQresultStatus(result)), PQresultErrorMessage(result)); zabbix_errlog(ERR_Z3005, 0, error, sql); zbx_free(error); ret = (CONNECTION_OK == PQstatus(conn) ? ZBX_DB_FAIL : ZBX_DB_DOWN); } if (ZBX_DB_OK == ret) ret = atoi(PQcmdTuples(result)); PQclear(result); #elif defined(HAVE_SQLITE3) if (0 == txn_level && PHP_MUTEX_OK != php_sem_acquire(&sqlite_access)) { zabbix_log(LOG_LEVEL_CRIT, "ERROR: cannot create lock on SQLite3 database"); exit(FAIL); } lbl_exec: if (SQLITE_OK != (err = sqlite3_exec(conn, sql, NULL, 0, &error))) { if (SQLITE_BUSY == err) goto lbl_exec; zabbix_errlog(ERR_Z3005, 0, error, sql); sqlite3_free(error); switch (err) { case SQLITE_ERROR: /* SQL error or missing database; assuming SQL error, because if we are this far into execution, zbx_db_connect() was successful */ case SQLITE_NOMEM: /* A malloc() failed */ case SQLITE_TOOBIG: /* String or BLOB exceeds size limit */ case SQLITE_CONSTRAINT: /* Abort due to constraint violation */ case SQLITE_MISMATCH: /* Data type mismatch */ ret = ZBX_DB_FAIL; break; default: ret = ZBX_DB_DOWN; break; } } if (ZBX_DB_OK == ret) ret = sqlite3_changes(conn); if (0 == txn_level) php_sem_release(&sqlite_access); #endif /* HAVE_SQLITE3 */ if (0 != CONFIG_LOG_SLOW_QUERIES) { sec = zbx_time() - sec; if (sec > (double)CONFIG_LOG_SLOW_QUERIES / 1000.0) zabbix_log(LOG_LEVEL_WARNING, "slow query: " ZBX_FS_DBL " sec, \"%s\"", sec, sql); } if (ZBX_DB_FAIL == ret && 0 < txn_level) { zabbix_log(LOG_LEVEL_DEBUG, "query [%s] failed, setting transaction as failed", sql); txn_error = 1; } clean: zbx_free(sql); return ret; }
/****************************************************************************** * * * Function: ja_log * * * * Purpose: output a message to the log file * * it also performs error notification app * * * * Parameters: message_id (in) - message id * * inner_jobnet_id (in) - inner jobnet id * * jobnet_id (in) - jobnet id * * inner_job_id (in) - inner job id * * ... - additional information (variable parameters) * * * * Return value: SUCCEED - processed successfully * * FAIL - Processing error occurs * * * * Comments: * * * ******************************************************************************/ int ja_log(char *message_id, zbx_uint64_t inner_jobnet_id, char *jobnet_id, zbx_uint64_t inner_job_id, ...) { FILE *fp; struct tm *tm; time_t now; DIR *dir; struct dirent *dp; va_list ap; DB_RESULT result; DB_RESULT result2; DB_ROW row; DB_ROW row2; int log_type, log_level, send_flag, rc, hit, m, n, cnt, job_type, host_flag, get_host_flag; int state, zbxsnd; zbx_uint64_t w_inner_jobnet_id, inner_jobnet_main_id; char *now_date, *message = NULL, *name = NULL, *type = NULL, *send = NULL, *msg = NULL; char *after_value_esc, *user_name_esc, *host_name_esc, *jobnet_name_esc, *job_name_esc; char s_jobnet_id[JA_DATA_BUFFER_LEN] = "none"; char s_user_name[JA_DATA_BUFFER_LEN] = "none"; char s_job_id[JA_DATA_BUFFER_LEN] = "none"; char s_job_id_full[JA_DATA_BUFFER_LEN] = "none"; char line[AP_MESSAGE_BUF_SIZE]; char cmd[AP_MESSAGE_BUF_SIZE]; char host_name[JA_DATA_BUFFER_LEN] = ""; char jobnet_name[JA_JOBNET_NAME_LEN] = ""; char job_name[JA_JOB_NAME_LEN] = ""; char now_time[20]; const char *__function_name = "ja_log"; zabbix_log(LOG_LEVEL_DEBUG, "In %s() message_id: %s inner_jobnet_id: " ZBX_FS_UI64 " inner_job_id: " ZBX_FS_UI64, __function_name, message_id, inner_jobnet_id, inner_job_id); w_inner_jobnet_id = inner_jobnet_id; inner_jobnet_main_id = 0; /* message file open */ fp = fopen(CONFIG_JA_LOG_MESSAGE_FILE, "r"); if (fp == NULL) { zabbix_log(LOG_LEVEL_ERR, "failed to open the log message file: [%s] (%s)", CONFIG_JA_LOG_MESSAGE_FILE, strerror(errno)); return FAIL; } /* message get */ cnt = 0; hit = 0; while (fgets(line, sizeof(line), fp) != NULL) { cnt = cnt + 1; if (line[0] == '#' || line[0] == '\n' || line[0] == '\r' ) { continue; } if (strlen(line) > 0) { if (line[strlen(line)-1] == '\n') { line[strlen(line)-1] = '\0'; } } if (strlen(line) > 0) { if (line[strlen(line)-1] == '\r') { line[strlen(line)-1] = '\0'; } } n = 0; m = 0; name = line; type = NULL; send = NULL; msg = NULL; while (line[++n]) { if (line[n] == ',') { if (m == 0) { line[n] = '\0'; type = &line[n + 1]; m++; } else if (m == 1) { line[n] = '\0'; send = &line[n + 1]; m++; } else if (m == 2) { line[n] = '\0'; msg = &line[n + 1]; break; } } } lrtrim_spaces(name); if (strcmp(name, message_id) == 0) { hit = 1; break; } } fclose(fp); /* message hit check */ if (hit == 0) { zabbix_log(LOG_LEVEL_ERR, "could not find an appropriate message: [%s]", message_id); return FAIL; } /* message get check */ if (name == NULL || type == NULL || send == NULL || msg == NULL) { zabbix_log(LOG_LEVEL_ERR, "line data in the message file is invalid: line(%d) id[%s] file[%s]", cnt, message_id, CONFIG_JA_LOG_MESSAGE_FILE); return FAIL; } lrtrim_spaces(type); lrtrim_spaces(send); /* check the empty data */ if (strlen(type) <= 0 || strlen(send) <= 0 || strlen(msg) <= 0) { zabbix_log(LOG_LEVEL_ERR, "line data in the message file is invalid: line(%d) id[%s] file[%s]", cnt, message_id, CONFIG_JA_LOG_MESSAGE_FILE); return FAIL; } /* log type check */ log_level = LOG_LEVEL_INFORMATION; log_type = atoi(type); switch (log_type) { case JALOG_TYPE_INFO: log_level = LOG_LEVEL_INFORMATION; break; case JALOG_TYPE_CRIT: log_level = LOG_LEVEL_CRIT; break; case JALOG_TYPE_ERR: log_level = LOG_LEVEL_ERR; break; case JALOG_TYPE_WARN: log_level = LOG_LEVEL_WARNING; break; case JALOG_TYPE_DEBUG: log_level = LOG_LEVEL_DEBUG; break; default: zabbix_log(LOG_LEVEL_ERR, "detected an invalid log type: line(%d) type[%s] id[%s] file[%s]", cnt, type, message_id, CONFIG_JA_LOG_MESSAGE_FILE); return FAIL; } /* send flad check */ send_flag = atoi(send); if (send_flag == JASENDER_OFF || send_flag == JASENDER_ON) { /* OK */ } else { zabbix_log(LOG_LEVEL_ERR, "detected an invalid jasender flag: line(%d) flag[%s] id[%s] file[%s]", cnt, send, message_id, CONFIG_JA_LOG_MESSAGE_FILE); return FAIL; } /* message body edit */ va_start(ap, inner_job_id); message = zbx_dvsprintf(message, msg, ap); va_end(ap); if (strlen(message) > AP_MESSAGE_BUF_SIZE) { *(message + (AP_MESSAGE_BUF_SIZE - 1)) = '\0'; } /* get the current time */ time(&now); tm = localtime(&now); strftime(now_time, sizeof(now_time), "%Y%m%d%H%M%S", tm); now_date = zbx_dsprintf(NULL, "%04d/%02d/%02d %02d:%02d:%02d", (tm->tm_year + 1900), (tm->tm_mon + 1), tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); /* get the inner jobnet id */ if (w_inner_jobnet_id == 0 && inner_job_id != 0) { result = DBselect("select inner_jobnet_id from ja_run_job_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); if (NULL != (row = DBfetch(result))) { ZBX_STR2UINT64(w_inner_jobnet_id, row[0]); } DBfree_result(result); } /* get the host name and job id */ if (inner_job_id != 0) { zbx_strlcpy(s_job_id_full, ja_get_jobid(inner_job_id), sizeof(s_job_id_full)); job_type = -1; result = DBselect("select job_type, job_id, job_name" " from ja_run_job_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); if (NULL != (row = DBfetch(result))) { job_type = atoi(row[0]); zbx_strlcpy(s_job_id, row[1], sizeof(s_job_id)); if (SUCCEED != DBis_null(row[2])) { zbx_strlcpy(job_name, row[2], sizeof(job_name)); } } DBfree_result(result); get_host_flag = 0; switch (job_type) { case JA_JOB_TYPE_JOB: get_host_flag = 1; result = DBselect("select host_flag, host_name" " from ja_run_icon_job_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); break; case JA_JOB_TYPE_FCOPY: get_host_flag = 1; result = DBselect("select from_host_flag, from_host_name" " from ja_run_icon_fcopy_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); break; case JA_JOB_TYPE_FWAIT: get_host_flag = 1; result = DBselect("select host_flag, host_name" " from ja_run_icon_fwait_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); break; case JA_JOB_TYPE_REBOOT: get_host_flag = 1; result = DBselect("select host_flag, host_name" " from ja_run_icon_reboot_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); break; case JA_JOB_TYPE_LESS: get_host_flag = 1; result = DBselect("select host_flag, host_name" " from ja_run_icon_agentless_table" " where inner_job_id = " ZBX_FS_UI64, inner_job_id); break; } /* host name acquisition target icon */ if (get_host_flag != 0) { if (NULL != (row = DBfetch(result))) { if (SUCCEED != DBis_null(row[1])) { host_flag = atoi(row[0]); if (host_flag == USE_HOSTNAME) { zbx_strlcpy(host_name, row[1], sizeof(host_name)); } else { /* get the host name from the job controller variable */ result2 = DBselect("select before_value" " from ja_run_value_before_table" " where inner_job_id = " ZBX_FS_UI64 " and value_name = '%s'", inner_job_id, row[1]); if (NULL != (row2 = DBfetch(result2))) { zbx_strlcpy(host_name, row2[0], sizeof(host_name)); } DBfree_result(result2); } } } DBfree_result(result); } } /* get the user id */ if (w_inner_jobnet_id != 0 || jobnet_id != NULL) { if (w_inner_jobnet_id != 0) { result = DBselect("select inner_jobnet_id, inner_jobnet_main_id, jobnet_id, user_name, jobnet_name" " from ja_run_jobnet_table" " where inner_jobnet_id = " ZBX_FS_UI64, w_inner_jobnet_id); if (NULL != (row = DBfetch(result))) { ZBX_STR2UINT64(inner_jobnet_main_id, row[1]); if (strcmp(row[0], row[1]) != 0) { result2 = DBselect("select jobnet_id, user_name, jobnet_name" " from ja_run_jobnet_table" " where inner_jobnet_id = %s", row[1]); if (NULL != (row2 = DBfetch(result2))) { zbx_strlcpy(s_jobnet_id, row2[0], sizeof(s_jobnet_id)); zbx_strlcpy(s_user_name, row2[1], sizeof(s_user_name)); zbx_strlcpy(jobnet_name, row2[2], sizeof(jobnet_name)); } DBfree_result(result2); } else { zbx_strlcpy(s_jobnet_id, row[2], sizeof(s_jobnet_id)); zbx_strlcpy(s_user_name, row[3], sizeof(s_user_name)); zbx_strlcpy(jobnet_name, row[4], sizeof(jobnet_name)); } } } else { result = DBselect("select jobnet_id, user_name, jobnet_name" " from ja_jobnet_control_table" " where jobnet_id = '%s' and valid_flag = %d", jobnet_id, VALID_FLAG_ON); if (NULL != (row = DBfetch(result))) { zbx_strlcpy(s_jobnet_id, row[0], sizeof(s_jobnet_id)); zbx_strlcpy(s_user_name, row[1], sizeof(s_user_name)); zbx_strlcpy(jobnet_name, row[2], sizeof(jobnet_name)); } } DBfree_result(result); } /* log write */ zabbix_log(log_level, "[%s] %s", message_id, message); /* register the error message variable */ if (w_inner_jobnet_id == 0 || inner_job_id == 0 || log_level == LOG_LEVEL_INFORMATION || log_level == LOG_LEVEL_DEBUG) { /* skip the registration */ } else { after_value_esc = DBdyn_escape_string(message); /* to add a variable */ rc = DBexecute("insert into ja_run_value_after_table (" "inner_job_id, inner_jobnet_id, value_name, after_value) " "values (" ZBX_FS_UI64 ", " ZBX_FS_UI64 ", '%s', '[%s] %s')", inner_job_id, w_inner_jobnet_id, JOBARG_MESSAGE, message_id, after_value_esc); if (rc <= ZBX_DB_OK) { zabbix_log(LOG_LEVEL_ERR, "failed to insert the ja_run_value_after_table (ja_log): " " message id[%s] inner job id[" ZBX_FS_UI64 "] value name[%s]", message_id, inner_job_id, JOBARG_MESSAGE); zbx_free(after_value_esc); zbx_free(message); zbx_free(now_date); return FAIL; } zbx_free(after_value_esc); } /* no notification of message ? */ if (send_flag == JASENDER_OFF) { zbx_free(message); zbx_free(now_date); return SUCCEED; } /* get zabbix notification existence */ zbxsnd = ja_get_zbxsnd_on(); /* with no notice of Zabbix ? */ if (zbxsnd == ZBXSND_NOTICE_ON) { /* registration of the send message information */ after_value_esc = DBdyn_escape_string(message); user_name_esc = DBdyn_escape_string(s_user_name); host_name_esc = DBdyn_escape_string(host_name); jobnet_name_esc = DBdyn_escape_string(jobnet_name); job_name_esc = DBdyn_escape_string(job_name); rc = DBexecute("insert into ja_send_message_table (" "message_date, inner_jobnet_id, inner_jobnet_main_id, send_status, retry_count, retry_date, send_date, send_error_date, " "message_type, user_name, host_name, jobnet_id, jobnet_name, job_id, job_id_full, job_name, " "log_message_id, log_message) " "values (%s, " ZBX_FS_UI64 ", " ZBX_FS_UI64 ", %d, 0, 0, 0, 0, " "%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', " "'%s', '%s')", now_time, w_inner_jobnet_id, inner_jobnet_main_id, JA_SNT_SEND_STATUS_BEGIN, log_type, user_name_esc, host_name_esc, s_jobnet_id, jobnet_name_esc, s_job_id, s_job_id_full, job_name_esc, message_id, after_value_esc); if (rc <= ZBX_DB_OK) { zabbix_log(LOG_LEVEL_ERR, "failed to insert the ja_send_message_table (ja_log): " " message date[%s] message id[%s]", now_time, message_id); zbx_free(after_value_esc); zbx_free(user_name_esc); zbx_free(host_name_esc); zbx_free(jobnet_name_esc); zbx_free(job_name_esc); zbx_free(message); zbx_free(now_date); return FAIL; } zbx_free(after_value_esc); zbx_free(user_name_esc); zbx_free(host_name_esc); zbx_free(jobnet_name_esc); zbx_free(job_name_esc); /* application execution error notification */ dir = opendir(CONFIG_ERROR_CMD_PATH); if (dir == NULL) { zabbix_log(LOG_LEVEL_ERR, "failed to open the error notification directory: [%s]", CONFIG_ERROR_CMD_PATH); zbx_free(message); zbx_free(now_date); return FAIL; } while ((dp = readdir(dir)) != NULL) { if (dp->d_name[0] == '.') { continue; } /* start command in the background */ zbx_snprintf(cmd, sizeof(cmd), "%s/%s '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' &", CONFIG_ERROR_CMD_PATH, dp->d_name, s_user_name, s_jobnet_id, now_date, message_id, type, message, host_name, s_job_id_full); rc = system(cmd); zabbix_log(LOG_LEVEL_DEBUG, "application execution [%s] (%d)", cmd, rc); if (rc != EXIT_SUCCESS) { if (WIFEXITED(rc)) { state = WEXITSTATUS(rc); } else { state = rc; } zabbix_log(LOG_LEVEL_ERR, "failed to run the error notification application: (%d) [%s]", state, cmd); zbx_free(message); zbx_free(now_date); closedir(dir); return FAIL; } } closedir(dir); zbx_free(message); zbx_free(now_date); } return SUCCEED; }
/* * Execute SQL statement. For select statements only. * If fails, program terminates. */ DB_RESULT zbx_db_vselect(const char *fmt, va_list args) { char *sql = NULL; DB_RESULT result; /* double sec;*/ #ifdef HAVE_ORACLE sqlo_stmt_handle_t sth; #endif #ifdef HAVE_SQLITE3 int ret = FAIL; char *error=NULL; #endif #ifdef HAVE_POSTGRESQL char *error = NULL; #endif /* sec = zbx_time();*/ sql = zbx_dvsprintf(sql, fmt, args); zabbix_log( LOG_LEVEL_DEBUG, "Query [%s]", sql); #ifdef HAVE_MYSQL if(!conn) { zabbix_errlog(ERR_Z3003); result = NULL; } else { if(mysql_query(conn,sql) != 0) { zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); switch(mysql_errno(conn)) { case CR_CONN_HOST_ERROR: case CR_SERVER_GONE_ERROR: case CR_CONNECTION_ERROR: case CR_SERVER_LOST: case ER_SERVER_SHUTDOWN: case ER_UNKNOWN_ERROR: result = (DB_RESULT)ZBX_DB_DOWN; break; default: result = NULL; break; } } else { result = mysql_store_result(conn); } } #endif #ifdef HAVE_POSTGRESQL result = zbx_malloc(NULL, sizeof(ZBX_PG_DB_RESULT)); result->pg_result = PQexec(conn, sql); result->values = NULL; result->cursor = 0; result->row_num = 0; if (NULL == result->pg_result) { zabbix_errlog(ERR_Z3005, 0, "Result is NULL", sql); } if (PGRES_TUPLES_OK != PQresultStatus(result->pg_result)) { error = zbx_dsprintf(error, "%s:%s", PQresStatus(PQresultStatus(result->pg_result)), PQresultErrorMessage(result->pg_result)); zabbix_errlog(ERR_Z3005, 0, error, sql); zbx_free(error); } else /* init rownum */ result->row_num = PQntuples(result->pg_result); #endif #ifdef HAVE_ORACLE if(0 > (sth = (sqlo_open(oracle, sql,0,NULL)))) { zabbix_errlog(ERR_Z3005, 0, sqlo_geterror(oracle), sql); exit(FAIL); } result = sth; #endif #ifdef HAVE_SQLITE3 if(!sqlite_transaction_started) { php_sem_acquire(&sqlite_access); } result = zbx_malloc(NULL, sizeof(ZBX_SQ_DB_RESULT)); result->curow = 0; lbl_get_table: if(SQLITE_OK != (ret = sqlite3_get_table(conn,sql,&result->data,&result->nrow, &result->ncolumn, &error))) { if(ret == SQLITE_BUSY) goto lbl_get_table; /* attention deadlock!!! */ zabbix_errlog(ERR_Z3005, 0, error, sql); sqlite3_free(error); if(!sqlite_transaction_started) { php_sem_release(&sqlite_access); } exit(FAIL); } if(!sqlite_transaction_started) { php_sem_release(&sqlite_access); } #endif /* sec = zbx_time() - sec; if(sec > 0.1) zabbix_log( LOG_LEVEL_WARNING, "Long query: " ZBX_FS_DBL " sec, \"%s\"", sec, sql);*/ zbx_free(sql); return result; }
/* * Execute SQL statement. For non-select statements only. * If fails, program terminates. */ int zbx_db_vexecute(const char *fmt, va_list args) { char *sql = NULL; int ret = ZBX_DB_OK; /* double sec;*/ #ifdef HAVE_POSTGRESQL PGresult *result; char *error = NULL; #endif #ifdef HAVE_SQLITE3 char *error=0; #endif #ifdef HAVE_MYSQL int status; #endif /* sec = zbx_time();*/ sql = zbx_dvsprintf(sql, fmt, args); zabbix_log( LOG_LEVEL_DEBUG, "Query [%s]", sql); #ifdef HAVE_MYSQL if(!conn) { zabbix_errlog(ERR_Z3003); ret = ZBX_DB_FAIL; } else { if (0 != (status = mysql_query(conn,sql))) { zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); switch(mysql_errno(conn)) { case CR_CONN_HOST_ERROR: case CR_SERVER_GONE_ERROR: case CR_CONNECTION_ERROR: case CR_SERVER_LOST: case ER_SERVER_SHUTDOWN: case ER_UNKNOWN_ERROR: ret = ZBX_DB_DOWN; break; default: ret = ZBX_DB_FAIL; break; } } else { do { if (mysql_field_count(conn) == 0) { /* zabbix_log(LOG_LEVEL_DEBUG, ZBX_FS_UI64 " rows affected", (zbx_uint64_t)mysql_affected_rows(conn));*/ ret += (int)mysql_affected_rows(conn); } else /* some error occurred */ { zabbix_log(LOG_LEVEL_DEBUG, "Could not retrieve result set"); break; } /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */ if ((status = mysql_next_result(conn)) > 0) zabbix_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); } while (status == 0); } } #endif #ifdef HAVE_POSTGRESQL result = PQexec(conn,sql); if( result==NULL) { zabbix_errlog(ERR_Z3005, 0, "Result is NULL", sql); ret = ZBX_DB_FAIL; } else if( PQresultStatus(result) != PGRES_COMMAND_OK) { error = zbx_dsprintf(error, "%s:%s", PQresStatus(PQresultStatus(result)), PQresultErrorMessage(result)); zabbix_errlog(ERR_Z3005, 0, error, sql); zbx_free(error); ret = ZBX_DB_FAIL; } if(ret == ZBX_DB_OK) { ret = PQntuples(result); } PQclear(result); #endif #ifdef HAVE_ORACLE if ((ret = sqlo_exec(oracle, sql))<0) { zabbix_errlog(ERR_Z3005, 0, sqlo_geterror(oracle), sql); ret = ZBX_DB_FAIL; } #endif #ifdef HAVE_SQLITE3 if (!sqlite_transaction_started) { php_sem_acquire(&sqlite_access); } lbl_exec: if (SQLITE_OK != (ret = sqlite3_exec(conn, sql, NULL, 0, &error))) { if (ret == SQLITE_BUSY) goto lbl_exec; /* attention deadlock!!! */ zabbix_errlog(ERR_Z3005, 0, error, sql); sqlite3_free(error); ret = ZBX_DB_FAIL; } if (ret == ZBX_DB_OK) { ret = sqlite3_changes(conn); } if (!sqlite_transaction_started) { php_sem_release(&sqlite_access); } #endif /* sec = zbx_time() - sec; if(sec > 0.1) zabbix_log( LOG_LEVEL_WARNING, "Long query: " ZBX_FS_DBL " sec, \"%s\"", sec, sql);*/ zbx_free(sql); return ret; }