/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. * Copyright (c) 2004-2021 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) 2006-2020 Cisco Systems, Inc. All rights reserved * Copyright (c) 2007-2009 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2007-2017 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2013-2020 Intel, Inc. All rights reserved. * Copyright (c) 2015-2019 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2020 Geoffroy Vallee. All rights reserved. * Copyright (c) 2020 IBM Corporation. All rights reserved. * Copyright (c) 2021-2024 Nanook Consulting All rights reserved. * Copyright (c) 2021 Amazon.com, Inc. or its affiliates. All Rights * reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #include "prte_config.h" #include "src/include/constants.h" #include "src/include/version.h" #include #include #include #ifdef HAVE_STRINGS_H # include #endif /* HAVE_STRINGS_H */ #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #include #include #include #ifdef HAVE_SYS_TYPES_H # include #endif /* HAVE_SYS_TYPES_H */ #ifdef HAVE_SYS_WAIT_H # include #endif /* HAVE_SYS_WAIT_H */ #ifdef HAVE_SYS_TIME_H # include #endif /* HAVE_SYS_TIME_H */ #include #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_POLL_H # include #endif #include "src/event/event-internal.h" #include "src/mca/base/pmix_base.h" #include "src/mca/prteinstalldirs/prteinstalldirs.h" #include "src/pmix/pmix-internal.h" #include "src/threads/pmix_mutex.h" #include "src/util/pmix_argv.h" #include "src/util/pmix_basename.h" #include "src/util/prte_cmd_line.h" #include "src/util/pmix_fd.h" #include "src/util/pmix_os_path.h" #include "src/util/pmix_output.h" #include "src/util/pmix_path.h" #include "src/util/pmix_printf.h" #include "src/util/pmix_environ.h" #include "src/util/pmix_getcwd.h" #include "src/util/pmix_show_help.h" #include "src/class/pmix_pointer_array.h" #include "src/runtime/prte_progress_threads.h" #include "prun.h" #include "src/mca/errmgr/errmgr.h" #include "src/mca/ess/base/base.h" #include "src/mca/schizo/base/base.h" #include "src/mca/state/state.h" #include "src/prted/prted.h" #include "src/runtime/prte_globals.h" #include "src/runtime/runtime.h" typedef struct { prte_pmix_lock_t lock; pmix_info_t *info; size_t ninfo; } mylock_t; int prun(int argc, char *argv[]) { int rc = 1, i; pmix_list_t apps; char **pargv; int pargc; prte_schizo_base_module_t *schizo; char hostname[PRTE_PATH_MAX]; char *personality; pmix_cli_result_t results; /* init the globals */ PMIX_CONSTRUCT(&apps, pmix_list_t); prte_tool_basename = pmix_basename(argv[0]); prte_tool_actual = "prun"; pargc = argc; pargv = pmix_argv_copy_strip(argv); // strip any quoted arguments gethostname(hostname, sizeof(hostname)); rc = prte_init_minimum(); if (PRTE_SUCCESS != rc) { return rc; } /* because we have to use the schizo framework and init our hostname * prior to parsing the incoming argv for cmd line options, do a hacky * search to support passing of impacted options (e.g., verbosity for schizo) */ rc = prte_schizo_base_parse_prte(pargc, 0, pargv, NULL); if (PRTE_SUCCESS != rc) { return rc; } rc = prte_schizo_base_parse_pmix(pargc, 0, pargv, NULL); if (PRTE_SUCCESS != rc) { return rc; } /* init the tiny part of PRTE we use */ prte_init_util(PRTE_PROC_TYPE_NONE); /* setup an event base */ rc = prte_event_base_open(); if (PRTE_SUCCESS != rc) { fprintf(stderr, "Unable to initialize event library\n"); exit(1); } /* open the SCHIZO framework */ rc = pmix_mca_base_framework_open(&prte_schizo_base_framework, PMIX_MCA_BASE_OPEN_DEFAULT); if (PRTE_SUCCESS != rc) { PRTE_ERROR_LOG(rc); return rc; } if (PRTE_SUCCESS != (rc = prte_schizo_base_select())) { PRTE_ERROR_LOG(rc); return rc; } /* look for any personality specification */ personality = NULL; for (i = 0; NULL != argv[i]; i++) { if (0 == strcmp(argv[i], "--personality")) { personality = argv[i + 1]; break; } } /* detect if we are running as a proxy and select the active * schizo module for this tool */ schizo = prte_schizo_base_detect_proxy(personality); if (NULL == schizo) { pmix_show_help("help-schizo-base.txt", "no-proxy", true, prte_tool_basename, personality); return 1; } if (NULL == personality) { personality = schizo->name; } /* Register all global MCA Params */ if (PRTE_SUCCESS != (rc = prte_register_params())) { if (PRTE_ERR_SILENT != rc) { pmix_show_help("help-prte-runtime", "prte_init:startup:internal-failure", true, "prte register params", PRTE_ERROR_NAME(rc), rc); } return 1; } /* parse the input argv to get values, including everyone's MCA params */ PMIX_CONSTRUCT(&results, pmix_cli_result_t); rc = schizo->parse_cli(pargv, &results, PMIX_CLI_WARN); if (PRTE_SUCCESS != rc) { PMIX_DESTRUCT(&results); if (PRTE_OPERATION_SUCCEEDED == rc) { return PRTE_SUCCESS; } if (PRTE_ERR_SILENT != rc) { fprintf(stderr, "%s: command line error (%s)\n", prte_tool_basename, prte_strerror(rc)); } return rc; } /* check if we are running as root - if we are, then only allow * us to proceed if the allow-run-as-root flag was given. Otherwise, * exit with a giant warning message */ if (0 == geteuid()) { schizo->allow_run_as_root(&results); // will exit us if not allowed } rc = prun_common(&results, schizo, pargc, pargv); return rc; }