diff --git a/sample/rex.config b/sample/rex.config index d146056..24f8f72 100755 --- a/sample/rex.config +++ b/sample/rex.config @@ -3,7 +3,7 @@ "project_root": "$HOME/development/internal/rex/sample", "units_path": "units/", "logs_path": "logs/", - "shells_path": "shells/shells.definitions", + "shells_path": "shells/", "config_version": "5" } } diff --git a/sample/shells/shells.definitions b/sample/shells/bash.shell old mode 100755 new mode 100644 similarity index 54% rename from sample/shells/shells.definitions rename to sample/shells/bash.shell index 92c6cb4..f8af3e1 --- a/sample/shells/shells.definitions +++ b/sample/shells/bash.shell @@ -5,12 +5,6 @@ "path": "/usr/bin/bash", "execution_arg": "-c", "source_cmd": "source" - }, - { - "name": "ksh", - "path": "/usr/bin/ksh", - "execution_arg": "-c", - "source_cmd": "source" } ] } diff --git a/sample/shells/ksh.shell b/sample/shells/ksh.shell new file mode 100644 index 0000000..7027c1d --- /dev/null +++ b/sample/shells/ksh.shell @@ -0,0 +1,10 @@ +{ + "shells": [ + { + "name": "ksh", + "path": "/usr/bin/ksh", + "execution_arg": "-c", + "source_cmd": "source" + } + ] +} diff --git a/src/config/Config.cpp b/src/config/Config.cpp index 899e22d..ca6a95e 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -197,26 +197,44 @@ void Conf::checkPathExists( std::string keyname, const std::string &path ) { */ void Conf::load_shells() { this->slog.log_task( E_DEBUG, "SHELLS", "Loading shells..." ); - try { - // load the test file. - this->load_json_file( this->shell_definitions_path ); - } catch (std::exception& e) { - this->slog.log_task( E_FATAL, "SHELLS", "Unable to load shell definition file: '" + this->shell_definitions_path + "'. Error: " + e.what()); - throw ConfigLoadException("Parsing error in shell definitions file."); - } - Json::Value jbuff; - if ( this-> get_serialized( jbuff, "shells" ) != 0 ) { - this->slog.log_task( E_FATAL, "SHELLS", "Parsing error: '" + this->shell_definitions_path + "'. Error: 'shells' key not found." ); - throw ConfigLoadException("Parsing error in shell definitions file."); - } + std::vector shell_files; - Shell tmp_S = Shell( this->LOG_LEVEL ); - for ( int index = 0; index < jbuff.size(); index++ ) + if ( is_dir( this->shell_definitions_path ) ) { - tmp_S.load_root( jbuff[index] ); - this->shells.push_back( tmp_S ); - this->slog.log_task( E_DEBUG, "SHELLS", "Loaded shell: '" + tmp_S.name + "' (" + tmp_S.path + ")" ); + get_shells_from_dir( &shell_files, this->shell_definitions_path ); + } + + if ( is_file( this->shell_definitions_path ) ) + { + shell_files.push_back( this->shell_definitions_path ); + } + + this->slog.log_task( E_INFO, "SHELLS", "Shell files found: " + std::to_string( shell_files.size() ) ); + + for ( int i = 0; i < shell_files.size(); i++ ) + { + try { + this->load_json_file( shell_files[i] ); + } catch (std::exception& e) { + this->slog.log_task( E_FATAL, "SHELLS", "Unable to load shell definition file: '" + shell_files[i] + "'. Error: " + e.what()); + throw ConfigLoadException("Parsing error in shell definitions file."); + } + + Json::Value jbuff; + + if ( this->get_serialized( jbuff, "shells" ) != 0 ) { + this->slog.log_task( E_FATAL, "SHELLS", "Parsing error: '" + shell_files[i] + "'. Error: 'shells' key not found." ); + throw ConfigLoadException("Parsing error in shell definitions file."); + } + + Shell tmp_S = Shell( this->LOG_LEVEL ); + for ( int index = 0; index < jbuff.size(); index++ ) + { + tmp_S.load_root( jbuff[index] ); + this->shells.push_back( tmp_S ); + this->slog.log_task( E_DEBUG, "SHELLS", "Loaded shell: '" + tmp_S.name + "' (" + tmp_S.path + ")" ); + } } } diff --git a/src/shells/shells.cpp b/src/shells/shells.cpp index 2179454..e0999c0 100644 --- a/src/shells/shells.cpp +++ b/src/shells/shells.cpp @@ -61,4 +61,39 @@ int Shell::load_root( Json::Value loader_root ) throw ShellException("No source_cmd attribute specified when loading a shell definition."); } return 0; +} + + +void get_shells_from_dir( std::vector * files, std::string path ) +{ + DIR* dirFile = opendir( path.c_str() ); + if ( dirFile ) + { + struct dirent* hFile; + errno = 0; + while (( hFile = readdir( dirFile )) != NULL ) + { + if ( !strcmp( hFile->d_name, "." )) + { + continue; + } + if ( !strcmp( hFile->d_name, ".." )) + { + continue; + } + + // hidden files + if ( hFile->d_name[0] == '.' ) + { + continue; + } + + if ( strstr( hFile->d_name, ".shell" )) + { + std::string full_path = path + "/" + hFile->d_name; + files->push_back( full_path ); + } + } + closedir( dirFile ); + } } \ No newline at end of file diff --git a/src/shells/shells.h b/src/shells/shells.h index 2a1b721..6e28735 100644 --- a/src/shells/shells.h +++ b/src/shells/shells.h @@ -2,7 +2,11 @@ #define REX_SHELLS_H #include "../json_support/JSON.h" +#include "../misc/helpers.h" #include +#include +#include +#include class Shell: public JSON_Loader { public: @@ -23,4 +27,6 @@ class Shell: public JSON_Loader { }; +void get_shells_from_dir( std::vector * files, std::string path ); + #endif //REX_SHELLS_H