int main(int argc, char *argv[]){ FILE *fd; job_registry_entry *en; time_t now; time_t purge_time=0; time_t last_consistency_check=0; char *pidfile=NULL; char *first_duplicate=NULL; struct pollfd *remupd_pollset = NULL; int remupd_nfds; int version=0; int first=TRUE; int tmptim; time_t finalquery_start_date; int loop_interval=DEFAULT_LOOP_INTERVAL; int rc; int c; pthread_t RecUpdNetThd; int confirm_time=0; static int help; static int short_help; bact.njobs = 0; bact.jobs = NULL; while (1) { static struct option long_options[] = { {"help", no_argument, &help, 1}, {"usage", no_argument, &short_help, 1}, {"nodaemon", no_argument, 0, 'o'}, {"version", no_argument, 0, 'v'}, {"prefix", required_argument, 0, 'p'}, {0, 0, 0, 0} }; int option_index = 0; c = getopt_long (argc, argv, "vop:",long_options, &option_index); if (c == -1){ break; } switch (c) { case 0: if (long_options[option_index].flag != 0){ break; } case 'v': version=1; break; case 'o': nodmn=1; break; case 'p': break; case '?': break; default: abort (); } } if(help){ usage(); } if(short_help){ short_usage(); } argv0 = argv[0]; signal(SIGHUP,sighup); if(version) { printf("%s Version: %s\n",progname,VERSION); exit(EXIT_SUCCESS); } /* Checking configuration */ check_config_file("UPDATER"); cha = config_read(NULL); if (cha == NULL) { fprintf(stderr,"Error reading config: "); perror(""); return -1; } config_setenv(NULL); ret = config_get("bupdater_child_poll_timeout",cha); if (ret != NULL){ tmptim=atoi(ret->value); if (tmptim > 0) bfunctions_poll_timeout = tmptim*1000; } ret = config_get("bupdater_debug_level",cha); if (ret != NULL){ debug=atoi(ret->value); } ret = config_get("bupdater_debug_logfile",cha); if (ret != NULL){ debuglogname=strdup(ret->value); if(debuglogname == NULL){ sysfatal("strdup failed for debuglogname in main: %r"); } } if(debug <=0){ debug=0; } if(debuglogname){ if((debuglogfile = fopen(debuglogname, "a+"))==0){ debug = 0; } } else { debug = 0; } ret = config_get("slurm_binpath",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key slurm_binpath not found\n",argv0); } else { slurm_binpath=strdup(ret->value); if(slurm_binpath == NULL){ sysfatal("strdup failed for slurm_binpath in main: %r"); } } ret = config_get("job_registry",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry not found\n",argv0); sysfatal("job_registry not defined. Exiting"); } else { registry_file=strdup(ret->value); if(registry_file == NULL){ sysfatal("strdup failed for registry_file in main: %r"); } } ret = config_get("purge_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key purge_interval not found using the default:%d\n",argv0,purge_interval); } else { purge_interval=atoi(ret->value); } ret = config_get("finalstate_query_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key finalstate_query_interval not found using the default:%d\n",argv0,finalstate_query_interval); } else { finalstate_query_interval=atoi(ret->value); } ret = config_get("alldone_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key alldone_interval not found using the default:%d\n",argv0,alldone_interval); } else { alldone_interval=atoi(ret->value); } ret = config_get("bupdater_consistency_check_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_consistency_check_interval not found using the default:%d\n",argv0,bupdater_consistency_check_interval); } else { bupdater_consistency_check_interval=atoi(ret->value); } ret = config_get("bupdater_pidfile",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_pidfile not found\n",argv0); } else { pidfile=strdup(ret->value); if(pidfile == NULL){ sysfatal("strdup failed for pidfile in main: %r"); } } ret = config_get("bupdater_loop_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_loop_interval not found - using the default:%d\n",argv0,loop_interval); } else { loop_interval=atoi(ret->value); } ret = config_get("job_registry_use_mmap",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap not found. Default is NO\n",argv0); } else { do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap is set to %s\n",argv0,ret->value); } remupd_conf = config_get("job_registry_add_remote",cha); if (remupd_conf == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry_add_remote not found\n",argv0); }else{ if (job_registry_updater_setup_receiver(remupd_conf->values,remupd_conf->n_values,&remupd_head) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot set network receiver(s) up for remote update\n",argv0); fprintf(stderr,"%s: Cannot set network receiver(s) up for remote update \n",argv0); } if (remupd_head == NULL){ do_log(debuglogfile, debug, 1, "%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n",argv0); fprintf(stderr,"%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n", argv0); } if ((remupd_nfds = job_registry_updater_get_pollfd(remupd_head, &remupd_pollset)) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot setup poll set for receiving data.\n",argv0); fprintf(stderr,"%s: Cannot setup poll set for receiving data.\n", argv0); } if (remupd_pollset == NULL || remupd_nfds == 0){ do_log(debuglogfile, debug, 1, "%s: No poll set available for receiving data.\n",argv0); fprintf(stderr,"%s: No poll set available for receiving data.\n",argv0); } } if( !nodmn ) daemonize(); if( pidfile ){ writepid(pidfile); free(pidfile); } rha=job_registry_init(registry_file, BY_BATCH_ID); if (rha == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } if (remupd_conf != NULL){ pthread_create(&RecUpdNetThd, NULL, (void *(*)(void *))ReceiveUpdateFromNetwork, (void *)NULL); if (job_registry_updater_setup_sender(remupd_conf->values,remupd_conf->n_values,0,&remupd_head_send) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot set network sender(s) up for remote update\n",argv0); fprintf(stderr,"%s: Cannot set network sender(s) up for remote update \n",argv0); } if (remupd_head_send == NULL){ do_log(debuglogfile, debug, 1, "%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n",argv0); fprintf(stderr,"%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n", argv0); } } config_free(cha); for(;;){ /* Purge old entries from registry */ now=time(0); if(now - purge_time > 86400){ if((rc=job_registry_purge(registry_file, now-purge_interval,0))<0){ do_log(debuglogfile, debug, 1, "%s: Error purging job registry %s:%d\n",argv0,registry_file,rc); fprintf(stderr,"%s: Error purging job registry %s :",argv0,registry_file); perror(""); } purge_time=time(0); } now=time(0); if(now - last_consistency_check > bupdater_consistency_check_interval){ if(job_registry_check_index_key_uniqueness(rha,&first_duplicate)==JOB_REGISTRY_FAIL){ do_log(debuglogfile, debug, 1, "%s: Found job registry duplicate entry. The first one is:%s.\nJobid should be removed or registry directory should be removed.\n",argv0,first_duplicate); fprintf(stderr,"%s: Found job registry duplicate entry. The first one is:%s.\nJobid should be removed or registry directory should be removed.",argv0,first_duplicate); } last_consistency_check=time(0); } IntStateQuery(); fd = job_registry_open(rha, "r"); if (fd == NULL){ do_log(debuglogfile, debug, 1, "%s: Error opening job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error opening job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } if (job_registry_rdlock(rha, fd) < 0){ do_log(debuglogfile, debug, 1, "%s: Error read locking job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error read locking job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } job_registry_firstrec(rha,fd); fseek(fd,0L,SEEK_SET); first=TRUE; finalquery_start_date = time(0); while ((en = job_registry_get_next(rha, fd)) != NULL){ if((bupdater_lookup_active_jobs(&bact,en->batch_id) != BUPDATER_ACTIVE_JOBS_SUCCESS) && en->status!=REMOVED && en->status!=COMPLETED){ do_log(debuglogfile, debug, 3, "%s: bupdater_lookup_active_jobs returned: %d for jobid: %s\n",argv0,bupdater_lookup_active_jobs(&bact,en->batch_id),en->batch_id); confirm_time=atoi(en->updater_info); if(confirm_time==0){ confirm_time=en->mdate; } /* Assign Status=4 and ExitStatus=999 to all entries that after alldone_interval are still not in a final state(3 or 4)*/ if(now-confirm_time>alldone_interval){ AssignFinalState(en->batch_id); free(en); continue; } if(en->status==IDLE && strlen(en->updater_info)>0){ if (en->mdate < finalquery_start_date){ finalquery_start_date=en->mdate; } do_log(debuglogfile, debug, 2, "%s: FinalStateQuery needed for jobid=%s with status=%d\n",argv0,en->batch_id,en->status); runfinal=TRUE; }else if((now-confirm_time>finalstate_query_interval) && (now > next_finalstatequery)){ if (en->mdate < finalquery_start_date){ finalquery_start_date=en->mdate; } do_log(debuglogfile, debug, 2, "%s: FinalStateQuery needed for jobid=%s with status=%d\n",argv0,en->batch_id,en->status); runfinal=TRUE; } } free(en); } if(runfinal_oldlogs){ FinalStateQuery(0,1); runfinal_oldlogs=FALSE; runfinal=FALSE; }else if(runfinal){ FinalStateQuery(finalquery_start_date,1); runfinal=FALSE; } fclose(fd); sleep(loop_interval); } job_registry_destroy(rha); return 0; }
int main(int argc, char *argv[]){ FILE *fd; job_registry_entry *en; time_t now; time_t purge_time=0; time_t last_consistency_check=0; char *pidfile=NULL; char *final_string=NULL; char *cp=NULL; char *tpath; char *tspooldir; char *first_duplicate=NULL; struct pollfd *remupd_pollset = NULL; int remupd_nfds; int version=0; int first=TRUE; int tmptim; int finstr_len=0; int loop_interval=DEFAULT_LOOP_INTERVAL; int fsq_ret=0; int c; pthread_t RecUpdNetThd; int confirm_time=0; static int help; static int short_help; bact.njobs = 0; bact.jobs = NULL; while (1) { static struct option long_options[] = { {"help", no_argument, &help, 1}, {"usage", no_argument, &short_help, 1}, {"nodaemon", no_argument, 0, 'o'}, {"version", no_argument, 0, 'v'}, {"prefix", required_argument, 0, 'p'}, {0, 0, 0, 0} }; int option_index = 0; c = getopt_long (argc, argv, "vop:",long_options, &option_index); if (c == -1){ break; } switch (c) { case 0: if (long_options[option_index].flag != 0){ break; } case 'v': version=1; break; case 'o': nodmn=1; break; case 'p': break; case '?': break; default: abort (); } } if(help){ usage(); } if(short_help){ short_usage(); } argv0 = argv[0]; signal(SIGHUP,sighup); if(version) { printf("%s Version: %s\n",progname,VERSION); exit(EXIT_SUCCESS); } /* Checking configuration */ check_config_file("UPDATER"); cha = config_read(NULL); if (cha == NULL) { fprintf(stderr,"Error reading config: "); perror(""); return -1; } ret = config_get("bupdater_child_poll_timeout",cha); if (ret != NULL){ tmptim=atoi(ret->value); if (tmptim > 0) bfunctions_poll_timeout = tmptim*1000; } ret = config_get("bupdater_debug_level",cha); if (ret != NULL){ debug=atoi(ret->value); } ret = config_get("bupdater_debug_logfile",cha); if (ret != NULL){ debuglogname=strdup(ret->value); if(debuglogname == NULL){ sysfatal("strdup failed for debuglogname in main: %r"); } } if(debug <=0){ debug=0; } if(debuglogname){ if((debuglogfile = fopen(debuglogname, "a+"))==0){ debug = 0; } }else{ debug = 0; } ret = config_get("pbs_binpath",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key pbs_binpath not found\n",argv0); } else { pbs_binpath=strdup(ret->value); if(pbs_binpath == NULL){ sysfatal("strdup failed for pbs_binpath in main: %r"); } } ret = config_get("pbs_spoolpath",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key pbs_spoolpath not found\n",argv0); } else { pbs_spoolpath=strdup(ret->value); if(pbs_spoolpath == NULL){ sysfatal("strdup failed for pbs_spoolpath in main: %r"); } tpath=make_message("%s/server_logs",pbs_spoolpath); if (opendir(tpath)==NULL){ do_log(debuglogfile, debug, 1, "%s: dir %s does not exist or is not readable. Trying now pbs commands\n",argv0,tpath); tspooldir=GetPBSSpoolPath(pbs_binpath); free(tpath); tpath=make_message("%s/server_logs",tspooldir); free(tspooldir); if (opendir(tpath)==NULL){ do_log(debuglogfile, debug, 1, "dir %s does not exist or is not readable (using pbs commands)",tpath); sysfatal("dir %s does not exist or is not readable (using pbs commands): %r",tpath); } } free(tpath); } ret = config_get("job_registry",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry not found\n",argv0); sysfatal("job_registry not defined. Exiting"); } else { registry_file=strdup(ret->value); if(registry_file == NULL){ sysfatal("strdup failed for registry_file in main: %r"); } } ret = config_get("purge_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key purge_interval not found using the default:%d\n",argv0,purge_interval); } else { purge_interval=atoi(ret->value); } ret = config_get("finalstate_query_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key finalstate_query_interval not found using the default:%d\n",argv0,finalstate_query_interval); } else { finalstate_query_interval=atoi(ret->value); } ret = config_get("alldone_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key alldone_interval not found using the default:%d\n",argv0,alldone_interval); } else { alldone_interval=atoi(ret->value); } ret = config_get("tracejob_logs_to_read",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key tracejob_logs_to_read not found using the default:%d\n",argv0,tracejob_logs_to_read); } else { tracejob_logs_to_read=atoi(ret->value); } ret = config_get("bupdater_loop_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_loop_interval not found using the default:%d\n",argv0,loop_interval); } else { loop_interval=atoi(ret->value); } ret = config_get("bupdater_consistency_check_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_consistency_check_interval not found using the default:%d\n",argv0,bupdater_consistency_check_interval); } else { bupdater_consistency_check_interval=atoi(ret->value); } ret = config_get("bupdater_pidfile",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_pidfile not found\n",argv0); } else { pidfile=strdup(ret->value); if(pidfile == NULL){ sysfatal("strdup failed for pidfile in main: %r"); } } ret = config_get("pbs_batch_caching_enabled",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key pbs_batch_caching_enabled not found using default\n",argv0,pbs_batch_caching_enabled); } else { pbs_batch_caching_enabled=strdup(ret->value); if(pbs_batch_caching_enabled == NULL){ sysfatal("strdup failed for pbs_batch_caching_enabled in main: %r"); } } ret = config_get("batch_command_caching_filter",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key batch_command_caching_filter not found using default\n",argv0,batch_command_caching_filter); } else { batch_command_caching_filter=strdup(ret->value); if(batch_command_caching_filter == NULL){ sysfatal("strdup failed for batch_command_caching_filter in main: %r"); } } batch_command=(strcmp(pbs_batch_caching_enabled,"yes")==0?make_message("%s ",batch_command_caching_filter):make_message("")); ret = config_get("job_registry_use_mmap",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap not found. Default is NO\n",argv0); } else { do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap is set to %s\n",argv0,ret->value); } ret = config_get("tracejob_max_output",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key tracejob_max_output not found using default\n",argv0,tracejob_max_output); } else { tracejob_max_output==atoi(ret->value); } remupd_conf = config_get("job_registry_add_remote",cha); if (remupd_conf == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry_add_remote not found\n",argv0); }else{ if (job_registry_updater_setup_receiver(remupd_conf->values,remupd_conf->n_values,&remupd_head) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot set network receiver(s) up for remote update\n",argv0); fprintf(stderr,"%s: Cannot set network receiver(s) up for remote update \n",argv0); } if (remupd_head == NULL){ do_log(debuglogfile, debug, 1, "%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n",argv0); fprintf(stderr,"%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n", argv0); } if ((remupd_nfds = job_registry_updater_get_pollfd(remupd_head, &remupd_pollset)) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot setup poll set for receiving data.\n",argv0); fprintf(stderr,"%s: Cannot setup poll set for receiving data.\n", argv0); } if (remupd_pollset == NULL || remupd_nfds == 0){ do_log(debuglogfile, debug, 1, "%s: No poll set available for receiving data.\n",argv0); fprintf(stderr,"%s: No poll set available for receiving data.\n",argv0); } } if( !nodmn ) daemonize(); if( pidfile ){ writepid(pidfile); free(pidfile); } rha=job_registry_init(registry_file, BY_BATCH_ID); if (rha == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } if (remupd_conf != NULL){ pthread_create(&RecUpdNetThd, NULL, (void *(*)(void *))ReceiveUpdateFromNetwork, (void *)NULL); if (job_registry_updater_setup_sender(remupd_conf->values,remupd_conf->n_values,0,&remupd_head_send) < 0){ do_log(debuglogfile, debug, 1, "%s: Cannot set network sender(s) up for remote update\n",argv0); fprintf(stderr,"%s: Cannot set network sender(s) up for remote update \n",argv0); } if (remupd_head_send == NULL){ do_log(debuglogfile, debug, 1, "%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n",argv0); fprintf(stderr,"%s: Cannot find values for network endpoints in configuration file (attribute 'job_registry_add_remote').\n", argv0); } } config_free(cha); for(;;){ /* Purge old entries from registry */ now=time(0); if(now - purge_time > 86400){ if(job_registry_purge(registry_file, now-purge_interval,0)<0){ do_log(debuglogfile, debug, 1, "%s: Error purging job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error purging job registry %s :",argv0,registry_file); perror(""); }else{ purge_time=time(0); } } now=time(0); if(now - last_consistency_check > bupdater_consistency_check_interval){ if(job_registry_check_index_key_uniqueness(rha,&first_duplicate)==JOB_REGISTRY_FAIL){ do_log(debuglogfile, debug, 1, "%s: Found job registry duplicate entry. The first one is:%s\n",argv0,first_duplicate); fprintf(stderr,"%s: Found job registry duplicate entry. The first one is:%s",argv0,first_duplicate); }else{ last_consistency_check=time(0); } } IntStateQuery(); fd = job_registry_open(rha, "r"); if (fd == NULL){ do_log(debuglogfile, debug, 1, "%s: Error opening job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error opening job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } if (job_registry_rdlock(rha, fd) < 0){ do_log(debuglogfile, debug, 1, "%s: Error read locking job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error read locking job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } job_registry_firstrec(rha,fd); fseek(fd,0L,SEEK_SET); first=TRUE; while ((en = job_registry_get_next(rha, fd)) != NULL){ if((bupdater_lookup_active_jobs(&bact, en->batch_id) != BUPDATER_ACTIVE_JOBS_SUCCESS) && en->status!=REMOVED && en->status!=COMPLETED){ confirm_time=atoi(en->updater_info); if(confirm_time==0){ confirm_time=en->mdate; } /* Assign Status=4 and ExitStatus=999 to all entries that after alldone_interval are still not in a final state(3 or 4)*/ if(now-confirm_time>alldone_interval){ AssignFinalState(en->batch_id); free(en); continue; } if((now-confirm_time>finalstate_query_interval) && (now > next_finalstatequery)){ if((final_string=realloc(final_string,finstr_len + strlen(en->batch_id) + 2)) == 0){ sysfatal("can't malloc final_string: %r"); } else { if (finstr_len == 0) final_string[0] = '\000'; } strcat(final_string,en->batch_id); strcat(final_string,":"); finstr_len=strlen(final_string); runfinal=TRUE; } } free(en); } if(runfinal){ if (final_string[finstr_len-1] == ':' && (cp = strrchr (final_string, ':')) != NULL){ *cp = '\0'; } if(fsq_ret != 0){ fsq_ret=FinalStateQuery(final_string,tracejob_logs_to_read); }else{ fsq_ret=FinalStateQuery(final_string,1); } runfinal=FALSE; } if (final_string != NULL){ free(final_string); final_string = NULL; finstr_len = 0; } fclose(fd); sleep(loop_interval); } job_registry_destroy(rha); return 0; }
int main(int argc, char *argv[]) { char *registry_file = NULL, *registry_file_env = NULL; int need_to_free_registry_file = FALSE; const char *default_registry_file = "blah_job_registry.bjr"; char *my_home; job_registry_entry en; job_status_t status=IDLE; int exitcode = -1; char *exitreason = ""; char *user_prefix = ""; char *user_proxy = ""; char *proxy_subject = ""; int renew_proxy = 0; char *wn_addr = ""; time_t udate=0; char *blah_id, *batch_id; int ent, ret, prret, rhret; config_handle *cha; config_entry *rge, *remupd_conf; job_registry_handle *rha, *rhano; job_registry_index_mode rgin_mode = NO_INDEX; job_registry_updater_endpoint *remupd_head = NULL; if (argc > 1 && (strcmp(argv[1], "-u") == 0)) { /* Obtain an index to the registry so that we can */ /* check that the record is unique. */ rgin_mode = BY_BLAH_ID; argv[1] = argv[0]; argc--; argv++; } if (argc < 3) { fprintf(stderr,"Usage: %s [-u] <BLAH id> <batch id> [job status] [udate] [user prefix] [user proxy] [renew proxy] [proxy subject] [worker node] [exit code] [exit reason]\n",argv[0]); return 1; } blah_id = argv[1]; batch_id = argv[2]; if (argc > 3) status = atoi(argv[3]); if (argc > 4) udate = atol(argv[4]); if (argc > 5) user_prefix = argv[5]; if (argc > 6) user_proxy = argv[6]; if (argc > 7) renew_proxy = atoi(argv[7]); if (argc > 8) proxy_subject = argv[8]; if (argc > 9) wn_addr = argv[9]; if (argc > 10) exitcode = atoi(argv[10]); if (argc > 11) exitreason = argv[11]; cha = config_read(NULL); /* Read config from default locations. */ if (cha != NULL) { rge = config_get("job_registry", cha); remupd_conf = config_get("job_registry_add_remote", cha); if (remupd_conf != NULL) { if (job_registry_updater_setup_sender(remupd_conf->values, remupd_conf->n_values, 2, &remupd_head) < 0) { fprintf(stderr,"%s: warning: cannot set network sender(s) up for remote update to:\n",argv[0]); for (ent = 0; ent < remupd_conf->n_values; ent++) { fprintf(stderr," - %s\n", remupd_conf->values[ent]); } } } if (rge != NULL) registry_file = rge->value; } /* Env variable takes precedence */ registry_file_env = getenv("BLAH_JOB_REGISTRY_FILE"); if (registry_file_env != NULL) registry_file = registry_file_env; if (registry_file == NULL) { my_home = getenv("HOME"); if (my_home == NULL) my_home = "."; registry_file = (char *)malloc(strlen(default_registry_file)+strlen(my_home)+2); if (registry_file != NULL) { sprintf(registry_file,"%s/%s",my_home,default_registry_file); need_to_free_registry_file = TRUE; } else { if (cha != NULL) config_free(cha); if (remupd_head != NULL) job_registry_updater_free_endpoints(remupd_head); return 1; } } JOB_REGISTRY_ASSIGN_ENTRY(en.blah_id,blah_id); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,batch_id); en.status = status; en.exitcode = exitcode; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,wn_addr); en.udate = udate; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,exitreason); en.submitter = geteuid(); JOB_REGISTRY_ASSIGN_ENTRY(en.user_prefix,user_prefix); en.proxy_link[0] = '\000'; /* Start with a valid string */ en.updater_info[0] = '\000'; en.renew_proxy = 0; /* Enable renewal only if a proxy is found */ rha=job_registry_init(registry_file, rgin_mode); if (rha == NULL) { if (errno == EACCES) { /* Try nonpriv update. It may work. */ rhano = job_registry_init(registry_file, NAMES_ONLY); if (cha != NULL) config_free(cha); if (need_to_free_registry_file) free(registry_file); if (rhano != NULL) { if (strlen(user_proxy) > 0) { prret = job_registry_set_proxy(rhano, &en, user_proxy); if (prret < 0) { fprintf(stderr,"%s: warning: setting proxy to %s: ",argv[0],user_proxy); perror(""); } else en.renew_proxy = renew_proxy; } ret=job_registry_append_nonpriv(rhano, &en); job_registry_destroy(rhano); if (ret < 0) { fprintf(stderr,"%s: job_registry_append_nonpriv returns %d: ",argv[0],ret); perror(""); if (remupd_head != NULL) job_registry_updater_free_endpoints(remupd_head); return 4; } else goto happy_ending; } } else { fprintf(stderr,"%s: error initialising job registry: ",argv[0]); perror(""); } if (remupd_head != NULL) job_registry_updater_free_endpoints(remupd_head); return 2; } /* Filename is stored in job registry handle. - Don't need these anymore */ if (cha != NULL) config_free(cha); if (need_to_free_registry_file) free(registry_file); if (strlen(user_proxy) > 0) { prret = job_registry_set_proxy(rha, &en, user_proxy); if (prret < 0) { fprintf(stderr,"%s: warning: setting proxy to %s: ",argv[0],user_proxy); perror(""); } else en.renew_proxy = renew_proxy; } en.subject_hash[0] = '\000'; if (strlen(proxy_subject) > 0) { job_registry_compute_subject_hash(&en, proxy_subject); rhret = job_registry_record_subject_hash(rha, en.subject_hash, proxy_subject, TRUE); if (rhret < 0) { fprintf(stderr,"%s: warning: recording proxy subject %s (hash %s): ", argv[0], proxy_subject, en.subject_hash); perror(""); } } if ((ret=job_registry_append(rha, &en)) < 0) { if (errno == EACCES) { /* Try nonpriv update. It may work. */ ret=job_registry_append_nonpriv(rha, &en); job_registry_destroy(rha); if (ret < 0) { fprintf(stderr,"%s: job_registry_append_nonpriv returns %d: ",argv[0],ret); perror(""); if (remupd_head != NULL) job_registry_updater_free_endpoints(remupd_head); return 5; } else goto happy_ending; } fprintf(stderr,"%s: job_registry_append returns %d: ",argv[0],ret); perror(""); job_registry_destroy(rha); if (remupd_head != NULL) job_registry_updater_free_endpoints(remupd_head); return 3; } job_registry_destroy(rha); happy_ending: if (remupd_head != NULL) { if (job_registry_send_update(remupd_head, &en, (strlen(proxy_subject) > 0 ? proxy_subject : NULL), (strlen(user_proxy) > 0 ? user_proxy : NULL)) < 0) { fprintf(stderr,"%s: warning: sending network update: ",argv[0]); perror(""); } job_registry_updater_free_endpoints(remupd_head); } return 0; }