diff --git a/src/modules/shellprocess/CommandList.h b/src/modules/shellprocess/CommandList.h index 3b8cdcc93..b94ffdcaf 100644 --- a/src/modules/shellprocess/CommandList.h +++ b/src/modules/shellprocess/CommandList.h @@ -31,6 +31,9 @@ public: using QStringList::isEmpty; using QStringList::count; + using QStringList::cbegin; + using QStringList::cend; + using QStringList::const_iterator; } ; #endif // COMMANDLIST_H diff --git a/src/modules/shellprocess/ShellProcessJob.cpp b/src/modules/shellprocess/ShellProcessJob.cpp index 57d7dcabe..cf6d8d606 100644 --- a/src/modules/shellprocess/ShellProcessJob.cpp +++ b/src/modules/shellprocess/ShellProcessJob.cpp @@ -29,6 +29,7 @@ #include "GlobalStorage.h" #include "utils/CalamaresUtils.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" class CommandList; @@ -58,7 +59,51 @@ ShellProcessJob::prettyName() const Calamares::JobResult ShellProcessJob::exec() { - QThread::sleep( 3 ); + using CalamaresUtils::System; + System::RunLocation location = m_dontChroot ? System::RunLocation::RunInHost : System::RunLocation::RunInTarget; + + if ( ! m_commands || m_commands->isEmpty() ) + { + cDebug() << "WARNING: No commands to execute"; + return Calamares::JobResult::ok(); + } + + /* Figure out the replacement for @@ROOT@@ */ + QString root = QStringLiteral( "/" ); + Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); + if ( location == System::RunLocation::RunInTarget ) + { + if ( !gs || !gs->contains( "rootMountPoint" ) ) + { + cDebug() << "ERROR: No rootMountPoint defined."; + return Calamares::JobResult::error( tr( "Could not run command." ), + tr( "No rootMountPoint is defined, so command cannot be run in the target environment." ) ); + } + root = gs->value( "rootMountPoint" ).toString(); + } + + for ( CommandList::const_iterator i = m_commands->cbegin(); i != m_commands->cend(); ++i ) + { + QString processed_cmd = *i; + processed_cmd.replace( "@@ROOT@@", root ); // FIXME? + bool suppress_result = false; + if ( processed_cmd.startsWith( '-' ) ) + { + suppress_result = true; + processed_cmd.remove( 0, 1 ); // Drop the - // FIXME? + } + + QStringList shell_cmd { "/bin/sh", "-c" }; + shell_cmd << processed_cmd; + + CalamaresUtils::ProcessResult r = System::runCommand( + location, shell_cmd, QString(), QString(), 10 ); + + if ( ( r.getExitCode() != 0 ) && !suppress_result ) + { + return Calamares::JobResult::error( tr( "Could not run command." ), r.getOutput() ); + } + } return Calamares::JobResult::ok(); }