From 47a7bb8fb64885d46c995a18d2c4601fbf9609f9 Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Tue, 24 Jul 2012 09:40:06 -0500 Subject: [PATCH] Apply the user's condor_config last, rather than first. --- src/condor_utils/condor_config.cpp | 55 +++++++++++++++++++++++++++++------ 1 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/condor_utils/condor_config.cpp b/src/condor_utils/condor_config.cpp index ef35572..455bdfa 100644 --- a/src/condor_utils/condor_config.cpp +++ b/src/condor_utils/condor_config.cpp @@ -110,6 +110,7 @@ void check_params(); // External variables extern int ConfigLineNo; } /* End extern "C" */ +bool find_user_file(std::string &); // Global variables BUCKET *ConfigTab[TABLESIZE]; @@ -654,6 +655,14 @@ real_config(char* host, int wantsQuiet, bool wantExtraInfo) if(dirlist) { free(dirlist); dirlist = NULL; } if(newdirlist) { free(newdirlist); newdirlist = NULL; } + // Now, insert overrides from the user config file + std::string file_location; + if (find_user_file(file_location)) + { + process_config_source( file_location.c_str(), "user local source", host, false ); + local_config_sources.append(file_location.c_str()); + } + // Now, insert any macros defined in the environment. char **my_environ = GetEnviron(); for( int i = 0; my_environ[i]; i++ ) { @@ -996,6 +1005,38 @@ find_global() } +// Find user-specific location of a file +// Returns true if found, and puts the location in the file_location argument. +// If not found, returns false. The contents of file_location are undefined. +bool +find_user_file(std::string &file_location) +{ +#ifdef UNIX + // $HOME/.condor/condor_config + struct passwd *pw = getpwuid( geteuid() ); + std::stringstream ss; + if ( can_switch_ids() || !pw || !pw->pw_dir ) { + return false; + } + ss << pw->pw_dir << "/." << myDistro->Get() << "/" << myDistro->Get() << "_config"; + file_location = ss.str(); + + int fd; + if ((fd = safe_open_wrapper_follow(file_location.c_str(), O_RDONLY)) < 0) { + return false; + } else { + close(fd); + dprintf(D_FULLDEBUG, "Reading condor configuration from '%s'\n", file_location.c_str()); + } + + return true; +#else + // To get rid of warnings... + file_location = ""; + return false; +#endif +} + // Find location of specified file char* find_file(const char *env_name, const char *file_name) @@ -1052,21 +1093,15 @@ find_file(const char *env_name, const char *file_name) if (!config_source) { // List of condor_config file locations we'll try to open. // As soon as we find one, we'll stop looking. - const int locations_length = 4; + const int locations_length = 3; MyString locations[locations_length]; - // 1) $HOME/.condor/condor_config - struct passwd *pw = getpwuid( geteuid() ); - if ( !can_switch_ids() && pw && pw->pw_dir ) { - formatstr( locations[0], "%s/.%s/%s", pw->pw_dir, myDistro->Get(), - file_name ); - } // 2) /etc/condor/condor_config - locations[1].formatstr( "/etc/%s/%s", myDistro->Get(), file_name ); + locations[0].formatstr( "/etc/%s/%s", myDistro->Get(), file_name ); // 3) /usr/local/etc/condor_config (FreeBSD) - locations[2].formatstr( "/usr/local/etc/%s", file_name ); + locations[1].formatstr( "/usr/local/etc/%s", file_name ); if (tilde) { // 4) ~condor/condor_config - locations[3].formatstr( "%s/%s", tilde, file_name ); + locations[2].formatstr( "%s/%s", tilde, file_name ); } int ctr; -- 1.7.4.1