diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.cpp b/ameasure2/src/provisioner/MeasurementProvisioner.cpp index a96bda47122aafee6a2bf312f9650e9e041fe608..4395e7ba2b11f406337b8f2897c4c229f28f1222 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.cpp @@ -3,12 +3,60 @@ */ #include "MeasurementProvisioner.hpp" +#include "exception/AlibException.h" +#include <unistd.h> +#include <err.h> +#include <wordexp.h> +#include <iostream> namespace provisioner { -MeasurementProvisionerResults MeasurementProvisioner::runConfiguration ( const MeasurementProvisionerConfiguration & ) { +std::list < std::string > MeasurementProvisioner::shellExpand ( const std::string & str ) { + std::list < std::string > results; + + wordexp_t wexp; + + if ( wordexp ( str.c_str ( ), & wexp, 0 ) != 0 ) + throw exception::AlibException ( "wordexp failed" ); + + for ( unsigned i = 0; i < wexp.we_wordc; ++i ) + results.emplace_back ( wexp.we_wordv[i] ); + + wordfree ( & wexp ); + + // if no expansion took place, notify by throwing + if ( ( results.size ( ) == 1 ) && ( *results.begin ( ) == str ) ) + throw exception::AlibException ( "no expansion took place for: " + str ); + + return results; +} + +void MeasurementProvisioner::runProvision ( const MeasurementProvision & mp, MeasurementProvisionerResults & ) { + + std::list < std::string > expandedInputDataFiles; + + for ( const std::string & inputDataFile : mp.inputDataFiles ) + expandedInputDataFiles.splice ( expandedInputDataFiles.end ( ), shellExpand ( inputDataFile ) ); + + for ( auto & str : expandedInputDataFiles ) + std::cout << str << std::endl; +} + +MeasurementProvisionerResults MeasurementProvisioner::runConfiguration ( const MeasurementProvisionerConfiguration & cfg ) { + + std::list < std::string > binariesDirectoryExpansion = shellExpand ( cfg.binariesDirectory ); + + if ( binariesDirectoryExpansion.size ( ) != 1 ) + throw exception::AlibException ( "BinariesDirectory expansion failed" ); + + if ( chdir ( binariesDirectoryExpansion.begin ( )->c_str ( ) ) != 0 ) + throw exception::AlibException ( "chdir to BinariesDirectory failed" ); + MeasurementProvisionerResults results; + for ( const MeasurementProvision & mp : cfg.measurementProvisions ) + runProvision ( mp, results ); + return results; } diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.hpp b/ameasure2/src/provisioner/MeasurementProvisioner.hpp index f76a3a9b9dd994a4f4a2d0153bcad07080f92de4..5d73f793fa6747c92c843e76d803d4712375a487 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.hpp @@ -7,10 +7,16 @@ #include "MeasurementProvisionerConfiguration.hpp" #include "MeasurementProvisionerResults.hpp" +#include <list> namespace provisioner { class MeasurementProvisioner { + + static std::list < std::string > shellExpand ( const std::string & ); + + static void runProvision ( const MeasurementProvision &, MeasurementProvisionerResults & ); + public: static MeasurementProvisionerResults runConfiguration ( const MeasurementProvisionerConfiguration & ); }; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp index 497b4e2315c655ca12098f5640e802579837aad8..c0cbae83cb54e18f07e4d2569511f48d0d7f7e0d 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp @@ -21,9 +21,7 @@ struct MeasurementProvision { }; struct MeasurementProvisionerConfiguration { - std::string workingDirectory; std::string binariesDirectory; - std::string inputDataDirectory; std::vector < MeasurementProvision > measurementProvisions; }; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp index b082042a0c757ad69bfbf2d1b1b0bb172acc64fb..376d7c869bf908dc17c94373e7d46875048450da 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp @@ -33,43 +33,18 @@ void MeasurementProvisionerXmlFactory::parseMeasurementProvisioner ( Measurement string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); - if ( data == DIRECTORIES_TAG ) - parseDirectories ( mpc, iter ); - else if ( data == MEASUREMENT_PROVISIONS_TAG ) - parseMeasurementProvisions ( mpc, iter ); - else - break; - } - - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_PROVISIONER_TAG ); -} - -void MeasurementProvisionerXmlFactory::parseDirectories ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, DIRECTORIES_TAG ); - - for ( ; ; ) { - if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; - - string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); - - if ( data == WORKING_DIRECTORY_TAG ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, WORKING_DIRECTORY_TAG ); - mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, WORKING_DIRECTORY_TAG ); - } else if ( data == BINARIES_DIRECTORY_TAG ) { + if ( data == BINARIES_DIRECTORY_TAG ) { FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, BINARIES_DIRECTORY_TAG ); - mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + mpc.binariesDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, BINARIES_DIRECTORY_TAG ); - } else if ( data == INPUT_DATA_DIRECTORY_TAG ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, INPUT_DATA_DIRECTORY_TAG ); - mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, INPUT_DATA_DIRECTORY_TAG ); + } else if ( data == MEASUREMENT_PROVISIONS_TAG ) { + parseMeasurementProvisions ( mpc, iter ); } else { break; } } - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, DIRECTORIES_TAG ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_PROVISIONER_TAG ); } void MeasurementProvisionerXmlFactory::parseMeasurementProvisions ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { @@ -165,10 +140,7 @@ void MeasurementProvisionerXmlFactory::parseMeasurementConfiguration ( Measureme string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISIONER_TAG = "MeasurementProvisioner"; -string MeasurementProvisionerXmlFactory::DIRECTORIES_TAG = "Directories"; -string MeasurementProvisionerXmlFactory::WORKING_DIRECTORY_TAG = "WorkingDirectory"; string MeasurementProvisionerXmlFactory::BINARIES_DIRECTORY_TAG = "BinariesDirectory"; -string MeasurementProvisionerXmlFactory::INPUT_DATA_DIRECTORY_TAG = "InputDataDirectory"; string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISIONS_TAG = "MeasurementProvisions"; string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISION_TAG = "MeasurementProvision"; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp index 5402443ed62f95b41d92622cb4d063d2e98542e7..7f22a391521cb23aed9777455eb39a9d6defc2fb 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp @@ -14,10 +14,7 @@ namespace provisioner { class MeasurementProvisionerXmlFactory { static std::string MEASUREMENT_PROVISIONER_TAG; - static std::string DIRECTORIES_TAG; - static std::string WORKING_DIRECTORY_TAG; static std::string BINARIES_DIRECTORY_TAG; - static std::string INPUT_DATA_DIRECTORY_TAG; static std::string MEASUREMENT_PROVISIONS_TAG; static std::string MEASUREMENT_PROVISION_TAG; @@ -31,7 +28,6 @@ class MeasurementProvisionerXmlFactory { static std::string MEASUREMENT_CONFIGURATION_TAG; static void parseMeasurementProvisioner ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); - static void parseDirectories ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); static void parseMeasurementProvisions ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); static void parseMeasurementProvision ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); diff --git a/examples2/measurements/ameasure.xml b/examples2/measurements/ameasure.xml index 1b76c4c10a75e58c9953fb9cd3d17c80f6e1e068..f3e05f9d8282226b12a684cb852757b395104d9a 100644 --- a/examples2/measurements/ameasure.xml +++ b/examples2/measurements/ameasure.xml @@ -1,16 +1,11 @@ <?xml version="1.0"?> <MeasurementProvisioner> - <Directories> - <WorkingDirectory>~/repositories/automata-library</WorkingDirectory> - <BinariesDirectory>bin-debug/</BinariesDirectory> - <InputDataDirectory>examples2/</InputDataDirectory> - </Directories> - + <BinariesDirectory>~/repositories/automata-library/bin-debug</BinariesDirectory> <MeasurementProvisions> <MeasurementProvision> <InputDataFiles> - <InputDataFile>../examples2/automaton/NFSM1.xml</InputDataFile> - <InputDataFile>../examples2/automaton/NFSM2.xml</InputDataFile> + <InputDataFile>~/repositories/automata-library/examples2/ameasure/*</InputDataFile> + <InputDataFile>~/repositories/automata-library/examples2/automaton/NFSM*.xml</InputDataFile> </InputDataFiles> <PipeCommands> <PipeCommand>./adeterminize2</PipeCommand>