diff --git a/src/Sproc/Sproc.cpp b/src/Sproc/Sproc.cpp index cf0b04d..e78d172 100644 --- a/src/Sproc/Sproc.cpp +++ b/src/Sproc/Sproc.cpp @@ -41,7 +41,7 @@ int groupname_to_gid( std::string groupname, int & gid ) /// /// \param input - The commandline input to execute. /// \return - The return code of the execution of input in the calling shell. -int Sproc::execute(std::string run_as, std::string group, std::string command ) +int Sproc::execute( std::string shell, std::string environment_file, std::string run_as, std::string group, std::string command ) { Logger slog = Logger( E_INFO, "_sproc" ); @@ -64,7 +64,7 @@ int Sproc::execute(std::string run_as, std::string group, std::string command ) { slog.log( E_DEBUG, "GID of '" + group + "' is '" + std::to_string( run_as_gid ) + "'." ); } else { - slog.log( E_FATAL, "Failed to look up DID for '" + group + "'."); + slog.log( E_FATAL, "Failed to look up GID for '" + group + "'."); return -404; } @@ -95,6 +95,14 @@ int Sproc::execute(std::string run_as, std::string group, std::string command ) return -401; } + std::string sourcer_string = shell + " -c '. " + environment_file + "'"; + slog.log( E_DEBUG, "Shell call for loading: ``" + sourcer_string + "``." ); + int sourcer = system( sourcer_string.c_str() ); + if ( sourcer != 0) + { + slog.log(E_FATAL, "Failed to source environment file."); + return -127; + } exit_code_raw = system( command.c_str() ); exit( WEXITSTATUS( exit_code_raw ) ); } else if ( pid > 0 ) @@ -106,6 +114,4 @@ int Sproc::execute(std::string run_as, std::string group, std::string command ) slog.log( E_FATAL, "Fork Failed"); } return WEXITSTATUS( exit_code_raw ); - - } \ No newline at end of file diff --git a/src/Sproc/Sproc.h b/src/Sproc/Sproc.h index 3eac63c..1c5d4a4 100644 --- a/src/Sproc/Sproc.h +++ b/src/Sproc/Sproc.h @@ -31,7 +31,7 @@ class Sproc { public: // call the object. returnvalue is enum representing external execution attempt not binary exit code - static int execute(std::string run_as, std::string group, std::string command ); + static int execute( std::string shell, std::string enviornment_file, std::string run_as, std::string group, std::string command ); }; #endif //FTESTS_SPROC_H diff --git a/src/loaders/abstract/Conf.cpp b/src/loaders/abstract/Conf.cpp index 3da0c02..79ad6a8 100644 --- a/src/loaders/abstract/Conf.cpp +++ b/src/loaders/abstract/Conf.cpp @@ -92,7 +92,7 @@ Conf::Conf( std::string filename, int LOG_LEVEL ): JSON_Loader( LOG_LEVEL ), slo } // find the path to the plan file - if (this->get_serialized(this->plan_path, "plan_path" ) != 0 ) + if ( this->get_serialized(this->plan_path, "plan_path" ) != 0 ) { throw ConfigLoadException("plan_path string is not set in the config file supplied:" + filename); } @@ -131,9 +131,6 @@ Conf::Conf( std::string filename, int LOG_LEVEL ): JSON_Loader( LOG_LEVEL ), slo this->slog.log( E_FATAL, "Variables file does not exist: '" + this->env_vars_file_literal + "'."); throw ConfigLoadException( "env_vars_file points to an incorrect path." ); } - - - }; /// Conf::has_context_override - Specifies whether or not the override context function is enabled in the conf file. @@ -158,6 +155,7 @@ void Conf::set_execution_context( std::string execution_context ) this->execution_context_literal = execution_context; } +/// Conf::get_env_vars_file() - returns the path to the environment variables file. std::string Conf::get_env_vars_file() { return this->env_vars_file_literal; diff --git a/src/loaders/abstract/Task.cpp b/src/loaders/abstract/Task.cpp index e5f9841..56e2d59 100644 --- a/src/loaders/abstract/Task.cpp +++ b/src/loaders/abstract/Task.cpp @@ -208,7 +208,15 @@ void Task::execute( Conf * configuration ) throw Task_NotReady(); } this->slog.log( E_DEBUG, "Vars file: " + configuration->get_env_vars_file() ); - int return_code = Sproc::execute( this->definition.get_user(), this->definition.get_group(), ". " + configuration->get_env_vars_file() + " && " + target_command ); + this->slog.log( E_DEBUG, "Shell: " + this->definition.get_shell() ); + + int return_code = Sproc::execute( + this->definition.get_shell(), + configuration->get_env_vars_file(), + this->definition.get_user(), + this->definition.get_group(), + target_command + ); // ********************************************** // d[0] Error Code Check @@ -267,7 +275,13 @@ void Task::execute( Conf * configuration ) this->slog.log( E_INFO, "Executing rectification: " + rectifier_command + "." ); - int rectifier_error = Sproc::execute( this->definition.get_user(), this->definition.get_group(), ". " + configuration->get_env_vars_file() + " && " + rectifier_command ); + int rectifier_error = Sproc::execute( + this->definition.get_shell(), + configuration->get_env_vars_file(), + this->definition.get_user(), + this->definition.get_group(), + rectifier_command + ); // ********************************************** // d[3] Error Code Check for Rectifier @@ -308,7 +322,13 @@ void Task::execute( Conf * configuration ) // a[7] Re-execute Target this->slog.log( E_INFO, "Re-Executing target \"" + this->definition.get_target() + "\"." ); - int retry_code = Sproc::execute( this->definition.get_user(), this->definition.get_group(), ". " + configuration->get_env_vars_file() + " && " + target_command ); + int retry_code = Sproc::execute( + this->definition.get_shell(), + configuration->get_env_vars_file(), + this->definition.get_user(), + this->definition.get_group(), + target_command + ); // ********************************************** // d[5] Error Code Check diff --git a/src/loaders/abstract/Unit.cpp b/src/loaders/abstract/Unit.cpp index 5ddd2d7..76c5d59 100644 --- a/src/loaders/abstract/Unit.cpp +++ b/src/loaders/abstract/Unit.cpp @@ -160,6 +160,9 @@ int Unit::load_root(Json::Value loader_root) if ( loader_root.isMember( "group" ) ) { this->group = loader_root.get( "group", errmsg_group ).asString(); } else this->group = grp->gr_name; + if ( loader_root.isMember( "shell" ) ) + { this->shell = loader_root.get( "shell", errmsg ).asString(); } else this->shell = "sh"; + this->populated = true; return 0; @@ -258,4 +261,13 @@ std::string Unit::get_group() { if ( ! this->populated ) { throw UnitException("Attempted to access an unpopulated unit."); } return this->group; -} \ No newline at end of file +} + +/// Unit::get_shell - retrieves the shell path to use for the unit execution. +/// +/// \return the string value of the shell path. +std::string Unit::get_shell() +{ + if ( ! this->populated ) { throw UnitException("Attempted to access an unpopulated unit."); } + return this->shell; +} diff --git a/src/loaders/abstract/Unit.h b/src/loaders/abstract/Unit.h index 9261fad..40b002f 100644 --- a/src/loaders/abstract/Unit.h +++ b/src/loaders/abstract/Unit.h @@ -67,6 +67,10 @@ private: // not intended for protected accounts, handle your own security std::string group; + // shell to use for env + std::string shell; + + public: Unit( int LOG_LEVEL ); @@ -86,6 +90,7 @@ public: bool get_rectify(); std::string get_user(); std::string get_group(); + std::string get_shell(); private: int LOG_LEVEL; diff --git a/test/config.json b/test/config.json index c53658a..d1ae6a7 100644 --- a/test/config.json +++ b/test/config.json @@ -4,5 +4,6 @@ "units_path": "units/", "plan_path": "plans/atomic.plan", "config_version": "3", - "env_vars_file": "examplar.variables" + "env_vars_file": "examplar.variables", + "shell": "/bin/bash" } diff --git a/test/units/all_test.units b/test/units/all_test.units index d6ccd4d..68e10d7 100644 --- a/test/units/all_test.units +++ b/test/units/all_test.units @@ -6,9 +6,10 @@ "rectifier": "", "active": true, "required": true, - "user": "root", - "group": "root", - "rectify": false + "user": "bagira", + "group": "bagira", + "rectify": false, + "shell": "/usr/bin/env bash" }, { "name": "independent test 2", @@ -18,7 +19,8 @@ "required": false, "user": "bagira", "group": "bagira", - "rectify": false + "rectify": false, + "shell": "/usr/bin/env bash" } ] }