static int handle_worker_check(wproc_result *wpres, struct wproc_worker *wp, struct wproc_job *job) { int result = ERROR; check_result *cr = (check_result *)job->arg; memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage)); cr->start_time.tv_sec = wpres->start.tv_sec; cr->start_time.tv_usec = wpres->start.tv_usec; cr->finish_time.tv_sec = wpres->stop.tv_sec; cr->finish_time.tv_usec = wpres->stop.tv_usec; if (WIFEXITED(wpres->wait_status)) { cr->return_code = WEXITSTATUS(wpres->wait_status); } else { cr->return_code = STATE_UNKNOWN; } if (wpres->outstd && *wpres->outstd) { cr->output = strdup(wpres->outstd); } else if (wpres->outerr) { asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr); } else { cr->output = NULL; } cr->early_timeout = wpres->early_timeout; cr->exited_ok = wpres->exited_ok; cr->engine = NULL; cr->source = wp->name; process_check_result(cr); free_check_result(cr); return result; }
static int handle_worker_check(wproc_result *wpres, worker_process *wp, worker_job *job) { int result = ERROR; check_result *cr = (check_result *)job->arg; memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage)); cr->start_time.tv_sec = wpres->start.tv_sec; cr->start_time.tv_usec = wpres->start.tv_usec; cr->finish_time.tv_sec = wpres->stop.tv_sec; cr->finish_time.tv_usec = wpres->stop.tv_usec; if (WIFEXITED(wpres->wait_status)) { cr->return_code = WEXITSTATUS(wpres->wait_status); } else { cr->return_code = STATE_UNKNOWN; } if (wpres->outstd) { cr->output = strdup(wpres->outstd); } else if (wpres->outerr) { asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr); } else { cr->output = NULL; } cr->early_timeout = wpres->early_timeout; cr->exited_ok = wpres->exited_ok; if (cr->service_description) { service *svc = find_service(cr->host_name, cr->service_description); if (svc) result = handle_async_service_check_result(svc, cr); else logit(NSLOG_RUNTIME_WARNING, TRUE, "Worker: Failed to locate service '%s' on host '%s'. Result from job %d (%s) will be dropped.\n", cr->service_description, cr->host_name, job->id, job->command); } else { host *hst = find_host(cr->host_name); if (hst) result = handle_async_host_check_result_3x(hst, cr); else logit(NSLOG_RUNTIME_WARNING, TRUE, "Worker: Failed to locate host '%s'. Result from job %d (%s) will be dropped.\n", cr->host_name, job->id, job->command); } free_check_result(cr); return result; }
/* insert results list into core */ static void move_results_to_core() { /* safely save off currently local list */ pthread_mutex_lock(&mod_gm_result_list_mutex); objectlist *tmp_list = NULL; for (mod_gm_result_list; mod_gm_result_list; mod_gm_result_list = mod_gm_result_list->next) { free(tmp_list); process_check_result(mod_gm_result_list->object_ptr); free_check_result(mod_gm_result_list->object_ptr); free(mod_gm_result_list->object_ptr); tmp_list = mod_gm_result_list; } mod_gm_result_list = 0; free(tmp_list); pthread_mutex_unlock(&mod_gm_result_list_mutex); }
static void destroy_job(worker_process *wp, worker_job *job) { wproc_object_job *oj; if (!job) return; oj = (wproc_object_job *)job->arg; switch (job->type) { case WPJOB_CHECK: free_check_result(job->arg); free(job->arg); break; case WPJOB_NOTIFY: free(oj->contact_name); /* fallthrough */ case WPJOB_OCSP: case WPJOB_OCHP: free(oj->host_name); if (oj->service_description) { free(oj->service_description); } free(job->arg); break; case WPJOB_GLOBAL_SVC_EVTHANDLER: case WPJOB_SVC_EVTHANDLER: case WPJOB_GLOBAL_HOST_EVTHANDLER: case WPJOB_HOST_EVTHANDLER: /* these require nothing special */ break; default: logit(NSLOG_RUNTIME_WARNING, TRUE, "Workers: Unknown job type: %d\n", job->type); break; } my_free(job->command); wp->jobs[job->id % wp->max_jobs] = NULL; wp->jobs_running--; free(job); }
static void destroy_job(struct wproc_job *job) { if (!job) return; switch (job->type) { case WPJOB_CHECK: free_check_result(job->arg); free(job->arg); break; case WPJOB_NOTIFY: case WPJOB_OCSP: case WPJOB_OCHP: free(job->arg); break; case WPJOB_GLOBAL_SVC_EVTHANDLER: case WPJOB_SVC_EVTHANDLER: case WPJOB_GLOBAL_HOST_EVTHANDLER: case WPJOB_HOST_EVTHANDLER: case WPJOB_HOST_PERFDATA: case WPJOB_SVC_PERFDATA: /* these require nothing special */ break; case WPJOB_CALLBACK: /* call with NULL result to make callback clean things up */ run_job_callback(job, NULL, 0); break; default: logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Unknown job type: %d\n", job->type); break; } my_free(job->command); if (job->wp) { fanout_remove(job->wp->jobs, job->id); job->wp->jobs_running--; } loadctl.jobs_running--; free(job); }
/** * Main function for command-line check utility */ int main(int argc, char *argv[]) { /** Checking functions to call */ check_func checks[] = { check_tables, check_header, check_keywords, check_visrefmap, check_unique_targets, check_targets_present, check_arrname, check_elements_present, check_corr_present, check_flagging, check_t3amp, check_waveorder, check_time, check_flux, NULL }; oi_fits oi; oi_check_result result; oi_breach_level worst; char filename[FLEN_FILENAME]; int status, i; /* Parse command-line */ if (argc != 2) { printf("Usage:\n%s FILE\n", argv[0]); exit(2); /* standard unix behaviour */ } (void)g_strlcpy(filename, argv[1], FLEN_FILENAME); /* Read FITS file */ status = 0; read_oi_fits(filename, &oi, &status); if (status) goto except; /* Display summary info */ print_oi_fits_summary(&oi); /* Run checks */ worst = OI_BREACH_NONE; i = 0; while (checks[i] != NULL) { if ((*checks[i++])(&oi, &result) != OI_BREACH_NONE) { print_check_result(&result); if (result.level > worst) worst = result.level; } free_check_result(&result); } if (worst == OI_BREACH_NONE) printf("All checks passed\n"); free_oi_fits(&oi); exit(EXIT_SUCCESS); except: exit(EXIT_FAILURE); }