From 47a7bb8fb64885d46c995a18d2c4601fbf9609f9 Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
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