示例#1
0
int get_server(const char *job_id_in, char *job_id_out, int jobid_size, char *server_out, int server_size)
  { 
  char *seq_number = NULL;
  char *parent_server = NULL;
  char *current_server = NULL;
  int  rc;

  rc = parse_jobid(job_id_in, &seq_number, &parent_server, &current_server);
  if (rc != PBSE_NONE)
    {
    fprintf(stderr, "something is wrong in parse_jobid");
    return(rc);
    }

  if ((current_server != NULL) && (current_server[0] != '\0'))
    {
    sprintf(server_out, "%s", current_server);
    }
  else if ((parent_server != NULL) && (parent_server[0] != '\0'))
    {
    sprintf(server_out, "%s", parent_server);
    }
  else
    {
    server_out[0] = '\0';
    }
  
  return(PBSE_NONE);
  }
示例#2
0
// Essaie de lire l'argument 1 de `argv` en tant que jobid
// Verifie la correspondance entre le status du job et le masque `status`
// Si l'argument est vide, choisi un job par défaut en accordance avec `status`
//
// Retourne le jobid en question
// ou INVALID_JOBID si aucun job adéquate n'a été trouvé
jobid_t read_jobid (char** argv, JobStatus status) {
    if (argv[1] == NULL) { // Pas d'argument spécifié pour la commande
        // Cherche un jobid par défaut.
        jobid_t jobid = jobs_find_first_by_status(status);
        if (jobid == INVALID_JOBID) {
            fprintf(stderr, "No default job found for command `%s`\n", argv[0]);
            return INVALID_JOBID;
        }

        return jobid;
    }

    jobid_t jobid;
    if (argv[1][0] == '%') {
        // L'argument est un id de job
        jobid = parse_jobid(argv[1] + 1);
        if (jobid == INVALID_JOBID) {
            fprintf(stderr, "Wrong jobid `%s`, expected number between 1 and %d\n",
                    argv[1] + 1, MAXJOBS);
            return INVALID_JOBID;
        }

        if (job_status_match(jobid, FREE)) {
            fprintf(stderr, "No job with id `%d`\n", jobid + 1);
            return INVALID_JOBID;
        }
    }
    else {
        // L'argument est un id de processus
        pid_t pid = parse_pid(argv[1]);
        if (pid == 0) {
            fprintf(stderr, "Invalid pid `%s`\n", argv[1]);
            return INVALID_JOBID;
        }

        jobid = jobs_find_by_pid(pid);
        if (jobid == INVALID_JOBID) {
            fprintf(stderr, "No job found for pid `%d`\n", pid);
            return INVALID_JOBID;
        }
    }

    if (!job_status_match(jobid, status)) {
        fprintf(stderr, "Can't use command `%s` for job with status `%s`\n",
                argv[0], job_status_str(jobid));
        return INVALID_JOBID;
    }

    return jobid;
}
示例#3
0
static int job_state_cb (const char *key, const char *val, void *arg, int errnum)
{
    int64_t jobid = -1;
    flux_t h = (flux_t) arg;

    if (chk_errnum (h, errnum) < 0) 
        flux_log (h, LOG_ERR, "job_state_cb: key(%s), val(%s)", key, val);
    else if (parse_jobid (key, &jobid) != 0) 
        flux_log (h, LOG_ERR, "job_state_cb: key ill-formed");
    else if (invoke_cbs (h, jobid, get_update_jcb (h, jobid, val), errnum) < 0) 
        flux_log (h, LOG_ERR, "job_state_cb: failed to invoke callbacks");

    /* always return 0 so that reactor will not return */
    return 0;
}
示例#4
0
/**
 * Take a job ID string and parse it into
 * job ID and server name parts.
 *
 * @param job_id_in Input string of the form <job number>[.<parent server name>][@<host server url>]
 * @param job_id_out Output string containing only the job ID part of the input specification.
 * @param server_out Output string containing nothing or a host url if specified.
 */
int get_server(

  char *job_id_in,       /* read only */
  char *job_id_out,      /* write only */
  int   job_id_out_size, /* sizeof the out buffer */
  char *server_out,      /* write only */
  int   server_out_size) /* sizeof the out buffer */

  {
  char *seq_number;
  char *parent_server;
  char *current_server;
  char def_server[PBS_MAXSERVERNAME + 1];
  char host_server[PBS_MAXSERVERNAME + 1];
  char *c;

  /* parse the job_id_in into components */

  if (!strcasecmp("all",job_id_in))
    {
    snprintf(job_id_out, job_id_out_size, "%s", job_id_in);
    server_out[0] = '\0';
    }
  else
    {
    if (parse_jobid(job_id_in, &seq_number, &parent_server, &current_server))
      {
      return(1);
      }
    
    /* Apply the above rules, in order, except for the locate job request.
     * That request is only sent if the job is not found on the local server. */
    
    if (notNULL(current_server))
      {
      /* @server found */
      snprintf(server_out, server_out_size, "%s", current_server);
      }
    else if (notNULL(parent_server))
      {
      /* .server found */
      snprintf(server_out, server_out_size, "%s", parent_server);
      }
    else
      {
      /* can't locate a server, so return a NULL to tell pbs_connect to use default */
      server_out[0] = '\0';
      }
    
    /* Make a fully qualified name of the job id. */  
    if (notNULL(parent_server))
      {
      if (notNULL(current_server))
        {
        snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, parent_server);
        /* parent_server might not be resolvable if current_server specified */
        }
      else
        {
        if (get_fullhostname(parent_server, host_server, PBS_MAXSERVERNAME, NULL) != 0)
         {
         /* FAILURE */
         return(1);
         }
        
        snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, host_server);
        }
      
      if ((c = strchr(parent_server, ':')) != 0)
        {
        if (*(c - 1) == '\\')
          c--;
        
        snprintf(job_id_out + strlen(job_id_out), job_id_out_size - strlen(job_id_out), "%s", c);
        }
      }
    else
      {
      parent_server = pbs_default();
      
      if ((parent_server == (char *)NULL) || (*parent_server == '\0'))
        {
        return(1);
        }

      snprintf(def_server, PBS_MAXSERVERNAME, "%s", parent_server);
      
      c = def_server;
      
      while ((*c != '\n') && (*c != '\0'))
        c++;
      
      *c = '\0';
      
      if (get_fullhostname(def_server, host_server, PBS_MAXSERVERNAME, NULL) != 0)
        {
        /* FAILURE */
        
        return(1);
        }
      
      if ((c = strchr(def_server, ':')) != 0)
        {
        if (*(c - 1) == '\\')
          c--;
        
        snprintf(job_id_out, job_id_out_size, "%s.%s%s", seq_number, host_server, c);
        }
      else
        snprintf(job_id_out, job_id_out_size, "%s.%s", seq_number, host_server);

      }    /* END else */
    }
  
  return(PBSE_NONE);
  }  /* END get_server() */
示例#5
0
/** 
 * @brief
 *	processes input jobid according to above mentioned rules
 *
 * @param[in] job_id_in - input job id
 * @param[out] job_id_out - processed job id
 * @param[out] server_out - server name
 * 
 * @return	int
 * @retval	0	success
 * @retval	1	error
 *
 */
int
get_server(char *job_id_in, char *job_id_out, char *server_out)
{
	char *seq_number = NULL;
	char *parent_server = NULL;
	char *current_server = NULL;
	char host_server[PBS_MAXSERVERNAME+1];

	if (!job_id_in || !job_id_out || !server_out)
		return 1;

	if (pbs_loadconf(0) != 1)
		return 1;

	/* parse the job_id_in into components */

	if (parse_jobid(job_id_in, &seq_number, &parent_server,
		&current_server)) {
		free(seq_number);
		free(parent_server);
		free(current_server);
		return 1;
	}

	/* Apply the above rules, in order, except for the locate job request.
	 That request is only sent if the job is not found on the local server.
	 */

	server_out[0] = '\0';
	if (notNULL(current_server))		/* @server found */
		strcpy(server_out, current_server);
	free(current_server);

	strcpy(job_id_out, seq_number);
	free(seq_number);

	if (notNULL(parent_server)) {

		/* If parent_server matches PBS_SERVER then use it */
		if (pbs_conf.pbs_server_name) {
			if (strcasecmp(parent_server, pbs_conf.pbs_server_name) == 0) {
				strcat(job_id_out, ".");
				strcat(job_id_out, pbs_conf.pbs_server_name);
				free(parent_server);
				return 0;
			}
		}

		if (get_fullhostname(parent_server, host_server,
				     PBS_MAXSERVERNAME) != 0) {
			free(parent_server);
			return 1;
		}

		strcat(job_id_out, ".");

#ifdef NAS_CANON_JOBID /* localmod 086 */
		strcat(job_id_out, host_server);
#else
		strcat(job_id_out, parent_server);
#endif /* localmod 086 */
		if (server_out[0] == '\0')
			strcpy(server_out, parent_server);
		free(parent_server);
		return 0;
	}

	free(parent_server);

	if (pbs_conf.pbs_server_name) {
		strcat(job_id_out, ".");
		strcat(job_id_out, pbs_conf.pbs_server_name);
	} else {
		return 1;
	}

	return 0;
}