13#include <zypp/base/LogTools.h>
14#include <zypp/base/NonCopyable.h>
15#include <zypp/base/Gettext.h>
18#include <zypp/TmpPath.h>
19#include <zypp/PathInfo.h>
22#include <zypp/ExternalProgram.h>
29#undef ZYPP_BASE_LOGGER_LOGGROUP
30#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::posttrans"
62 WAR <<
"Unexpectedly this is no package: " << rpmPackage_r << endl;
66 std::string prog( pkg->tag_posttransprog() );
67 if ( prog.empty() || prog ==
"<lua>" )
74 std::ofstream out( script.
path().
c_str() );
75 out <<
"#! " << pkg->tag_posttransprog() << endl
76 << pkg->tag_posttrans() << endl;
79 MIL <<
"COLLECT posttrans: '" <<
PathInfo( script.
path() ) <<
"' for package: '" << pkg->tag_name() <<
"'" << endl;
98 str::Format fmtScriptProgress {
_(
"Executing %%posttrans script '%1%'") };
100 bool firstScript =
true;
101 str::Format fmtScriptFailedMsg {
"warning: %%posttrans(%1%) scriptlet failed, exit status %2%\n" };
104 const auto &scriptPair =
_scripts.front();
105 const std::string & script = scriptPair.first;
106 const std::string & pkgident( script.substr( 0, script.size()-6 ) );
108 scriptProgress.
name( fmtScriptProgress % pkgident );
110 bool canContinue =
true;
113 canContinue = scriptProgress.
toMin();
115 canContinue = scriptProgress.
incr();
120 msg <<
"Execution of %posttrans scripts cancelled";
122 historylog.
comment( msg,
true );
129 for ( it.
findByName( scriptPair.second ); *it; ++it )
132 MIL <<
"EXECUTE posttrans: " << script <<
" with argument: " << npkgs << endl;
135 (noRootScriptDir/script).asString(),
153 int ret = prog.
close();
156 const std::string & msg { fmtScriptFailedMsg % pkgident % ret };
162 const std::string & scriptmsg( collect );
163 if ( ! scriptmsg.empty() )
166 msg <<
"Output of " << pkgident <<
" %posttrans script:\n" << scriptmsg;
167 historylog.
comment( msg,
true );
172 scriptProgress.
name(
_(
"Executing %posttrans scripts") );
173 scriptProgress.
toMax();
187 msg <<
"%posttrans scripts skipped while aborting:\n";
188 for (
const auto & script :
_scripts )
190 const std::string & pkgident( script.first.substr( 0, script.first.size()-6 ) );
191 WAR <<
"UNEXECUTED posttrans: " << script.first << endl;
192 msg <<
" " << pkgident <<
"\n";
195 historylog.
comment( msg,
true );
213 std::list< std::pair< std::string, std::string > >
_scripts;
221 {
return str <<
"RpmPostTransCollector::Impl"; }
225 {
return str << obj; }
234 : _pimpl( new
Impl( root_r ) )
241 {
return _pimpl->collectScriptFromPackage( rpmPackage_r ); }
244 {
return _pimpl->executeScripts(); }
247 {
return _pimpl->discardScripts(); }
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
std::vector< std::string > Arguments
int close()
Wait for the progamm to complete.
Writing the zypp history file.
void comment(const std::string &comment, bool timestamp=false)
Log a comment (even multiline).
Maintain [min,max] and counter (value) for progress counting.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
bool toMax()
Set counter value to current max value (unless no range).
void name(const std::string &name_r)
Set counter name.
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
bool incr(value_type val_r=1)
Increment counter value (default by 1).
bool toMin()
Set counter value to current min value.
static ZConfig & instance()
Singleton ctor.
std::string receiveLine()
Read one line from the input stream.
Wrapper class for stat/lstat.
const char * c_str() const
String representation.
std::string basename() const
Return the last component of this path.
Provide a new empty temporary directory and recursively delete it when no longer needed.
Provide a new empty temporary file and delete it when no longer needed.
bool autoCleanup() const
Whether path is valid and deleted when the last reference drops.
RpmPostTransCollector implementation.
bool executeScripts()
Execute the remembered scripts.
UserDataJobReport _myJobReport
JobReport with ContentType "cmdout/%posttrans".
void discardScripts()
Discard all remembered scrips.
boost::scoped_ptr< filesystem::TmpDir > _ptrTmpdir
Pathname tmpDir()
Lazy create tmpdir on demand.
std::list< std::pair< std::string, std::string > > _scripts
friend std::ostream & operator<<(std::ostream &str, const Impl &obj)
bool collectScriptFromPackage(ManagedFile rpmPackage_r)
Extract and remember a packages posttrans script for later execution.
std::ostream & dumpOn(std::ostream &str, const RpmPostTransCollector::Impl &obj)
Verbose stream output.
std::ostream & operator<<(std::ostream &str, const RpmPostTransCollector::Impl &obj)
Stream output.
friend std::ostream & dumpOn(std::ostream &str, const Impl &obj)
Impl(const Pathname &root_r)
Extract and remember posttrans scripts for later execution.
RpmPostTransCollector(const Pathname &root_r)
Default ctor.
RW_pointer< Impl > _pimpl
Implementation class.
bool collectScriptFromPackage(ManagedFile rpmPackage_r)
Extract and remember a packages posttrans script for later execution.
bool executeScripts()
Execute the remembered scripts.
~RpmPostTransCollector()
Dtor.
void discardScripts()
Discard all remembered scrips.
Subclass to retrieve database content.
bool findByName(const std::string &name_r)
Reset to iterate all packages with a certain name.
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
int addmod(const Pathname &path, mode_t mode)
Add the mode bits to the file given by path.
std::string numstring(char n, int w=0)
std::ostream & dumpOn(std::ostream &str, const RpmPostTransCollector &obj)
std::ostream & operator<<(std::ostream &str, const CommitPackageCache &obj)
Easy-to use interface to the ZYPP dependency resolver.
JobReport convenience sending this instance of UserData with each message.
bool info(const std::string &msg_r)
bool warning(const std::string &msg_r)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...