19 #include <sys/types.h> 71 inline void sigMultiversionSpecChanged()
73 sat::detail::PoolMember::myPool().multiversionSpecChanged();
89 for (
const Transaction::Step & step : steps_r )
91 if ( step.stepType() != Transaction::TRANSACTION_IGNORE )
101 static const std::string strType(
"type" );
102 static const std::string strStage(
"stage" );
103 static const std::string strSolvable(
"solvable" );
105 static const std::string strTypeDel(
"-" );
106 static const std::string strTypeIns(
"+" );
107 static const std::string strTypeMul(
"M" );
109 static const std::string strStageDone(
"ok" );
110 static const std::string strStageFailed(
"err" );
112 static const std::string strSolvableN(
"n" );
113 static const std::string strSolvableE(
"e" );
114 static const std::string strSolvableV(
"v" );
115 static const std::string strSolvableR(
"r" );
116 static const std::string strSolvableA(
"a" );
123 case Transaction::TRANSACTION_IGNORE:
break;
124 case Transaction::TRANSACTION_ERASE: ret.
add( strType, strTypeDel );
break;
125 case Transaction::TRANSACTION_INSTALL: ret.
add( strType, strTypeIns );
break;
126 case Transaction::TRANSACTION_MULTIINSTALL: ret.
add( strType, strTypeMul );
break;
131 case Transaction::STEP_TODO:
break;
132 case Transaction::STEP_DONE: ret.
add( strStage, strStageDone );
break;
133 case Transaction::STEP_ERROR: ret.
add( strStage, strStageFailed );
break;
142 ident = solv.ident();
149 ident = step_r.
ident();
151 arch = step_r.
arch();
156 { strSolvableV, ed.
version() },
157 { strSolvableR, ed.
release() },
161 s.add( strSolvableE, epoch );
163 ret.
add( strSolvable, s );
177 SolvIdentFile::Data getUserInstalledFromHistory(
const Pathname & historyFile_r )
179 SolvIdentFile::Data onSystemByUserList;
182 std::ifstream infile( historyFile_r.c_str() );
183 for( iostr::EachLine in( infile ); in; in.next() )
185 const char * ch( (*in).c_str() );
187 if ( *ch <
'1' ||
'9' < *ch )
189 const char * sep1 = ::strchr( ch,
'|' );
194 bool installs =
true;
195 if ( ::strncmp( sep1,
"install|", 8 ) )
197 if ( ::strncmp( sep1,
"remove |", 8 ) )
204 const char * sep2 = ::strchr( sep1,
'|' );
205 if ( !sep2 || sep1 == sep2 )
207 (*in)[sep2-ch] =
'\0';
208 IdString pkg( sep1 );
212 onSystemByUserList.erase( pkg );
216 if ( (sep1 = ::strchr( sep2+1,
'|' ))
217 && (sep1 = ::strchr( sep1+1,
'|' ))
218 && (sep2 = ::strchr( sep1+1,
'|' )) )
220 (*in)[sep2-ch] =
'\0';
221 if ( ::strchr( sep1+1,
'@' ) )
224 onSystemByUserList.insert( pkg );
229 MIL <<
"onSystemByUserList found: " << onSystemByUserList.size() << endl;
230 return onSystemByUserList;
238 inline PluginFrame transactionPluginFrame(
const std::string & command_r, ZYppCommitResult::TransactionStepList & steps_r )
240 return PluginFrame( command_r, json::Object {
241 {
"TransactionStepList", steps_r }
250 unsigned toKeep( ZConfig::instance().solver_upgradeTestcasesToKeep() );
251 MIL <<
"Testcases to keep: " << toKeep << endl;
257 WAR <<
"No Target no Testcase!" << endl;
261 std::string stem(
"updateTestcase" );
262 Pathname dir( target->assertRootPrefix(
"/var/log/") );
263 Pathname next( dir / Date::now().
form( stem+
"-%Y-%m-%d-%H-%M-%S" ) );
266 std::list<std::string> content;
268 std::set<std::string> cases;
269 for_( c, content.begin(), content.end() )
274 if ( cases.size() >= toKeep )
276 unsigned toDel = cases.size() - toKeep + 1;
277 for_( c, cases.begin(), cases.end() )
286 MIL <<
"Write new testcase " << next << endl;
287 getZYpp()->resolver()->createSolverTestcase( next.asString(),
false );
304 std::pair<bool,PatchScriptReport::Action> doExecuteScript(
const Pathname & root_r,
308 MIL <<
"Execute script " <<
PathInfo(Pathname::assertprefix( root_r,script_r)) << endl;
314 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() )
317 if ( ! report_r->progress( PatchScriptReport::OUTPUT, output ) )
319 WAR <<
"User request to abort script " << script_r << endl;
326 std::pair<bool,PatchScriptReport::Action> ret( std::make_pair(
false, PatchScriptReport::ABORT ) );
328 if ( prog.close() != 0 )
330 ret.second = report_r->problem( prog.execError() );
331 WAR <<
"ACTION" << ret.second <<
"(" << prog.execError() <<
")" << endl;
332 std::ostringstream sstr;
333 sstr << script_r <<
_(
" execution failed") <<
" (" << prog.execError() <<
")" << endl;
334 historylog.
comment(sstr.str(),
true);
346 bool executeScript(
const Pathname & root_r,
347 const Pathname & script_r,
348 callback::SendReport<PatchScriptReport> & report_r )
350 std::pair<bool,PatchScriptReport::Action> action( std::make_pair(
false, PatchScriptReport::ABORT ) );
353 action = doExecuteScript( root_r, script_r, report_r );
357 switch ( action.second )
359 case PatchScriptReport::ABORT:
360 WAR <<
"User request to abort at script " << script_r << endl;
364 case PatchScriptReport::IGNORE:
365 WAR <<
"User request to skip script " << script_r << endl;
369 case PatchScriptReport::RETRY:
372 }
while ( action.second == PatchScriptReport::RETRY );
375 INT <<
"Abort on unknown ACTION request " << action.second <<
" returned" << endl;
384 bool RunUpdateScripts(
const Pathname & root_r,
385 const Pathname & scriptsPath_r,
386 const std::vector<sat::Solvable> & checkPackages_r,
389 if ( checkPackages_r.empty() )
392 MIL <<
"Looking for new update scripts in (" << root_r <<
")" << scriptsPath_r << endl;
393 Pathname scriptsDir( Pathname::assertprefix( root_r, scriptsPath_r ) );
394 if ( ! PathInfo( scriptsDir ).isDir() )
397 std::list<std::string> scripts;
399 if ( scripts.empty() )
407 std::map<std::string, Pathname> unify;
408 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
410 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
411 for_( sit, scripts.begin(), scripts.end() )
416 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
419 PathInfo script( scriptsDir / *sit );
420 Pathname localPath( scriptsPath_r/(*sit) );
421 std::string unifytag;
423 if ( script.isFile() )
429 else if ( ! script.isExist() )
437 if ( unifytag.empty() )
441 if ( unify[unifytag].empty() )
443 unify[unifytag] = localPath;
450 std::string msg(
str::form(
_(
"%s already executed as %s)"), localPath.asString().c_str(), unify[unifytag].c_str() ) );
451 MIL <<
"Skip update script: " << msg << endl;
452 HistoryLog().comment( msg,
true );
456 if ( abort || aborting_r )
458 WAR <<
"Aborting: Skip update script " << *sit << endl;
459 HistoryLog().comment(
460 localPath.asString() +
_(
" execution skipped while aborting"),
465 MIL <<
"Found update script " << *sit << endl;
466 callback::SendReport<PatchScriptReport>
report;
467 report->start( make<Package>( *it ), script.path() );
469 if ( ! executeScript( root_r, localPath,
report ) )
481 inline void copyTo( std::ostream & out_r,
const Pathname & file_r )
483 std::ifstream infile( file_r.c_str() );
484 for( iostr::EachLine in( infile ); in; in.next() )
486 out_r << *in << endl;
490 inline std::string notificationCmdSubst(
const std::string & cmd_r,
const UpdateNotificationFile & notification_r )
492 std::string ret( cmd_r );
493 #define SUBST_IF(PAT,VAL) if ( ret.find( PAT ) != std::string::npos ) ret = str::gsub( ret, PAT, VAL ) 494 SUBST_IF(
"%p", notification_r.solvable().asString() );
495 SUBST_IF(
"%P", notification_r.file().asString() );
500 void sendNotification(
const Pathname & root_r,
503 if ( notifications_r.empty() )
506 std::string cmdspec( ZConfig::instance().updateMessagesNotify() );
507 MIL <<
"Notification command is '" << cmdspec <<
"'" << endl;
508 if ( cmdspec.empty() )
512 if ( pos == std::string::npos )
514 ERR <<
"Can't send Notification: Missing 'format |' in command spec." << endl;
515 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
520 std::string commandStr(
str::trim( cmdspec.substr( pos + 1 ) ) );
522 enum Format { UNKNOWN, NONE, SINGLE, DIGEST, BULK };
523 Format format = UNKNOWN;
524 if ( formatStr ==
"none" )
526 else if ( formatStr ==
"single" )
528 else if ( formatStr ==
"digest" )
530 else if ( formatStr ==
"bulk" )
534 ERR <<
"Can't send Notification: Unknown format '" << formatStr <<
" |' in command spec." << endl;
535 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
543 if ( format == NONE || format == SINGLE )
545 for_( it, notifications_r.begin(), notifications_r.end() )
547 std::vector<std::string> command;
548 if ( format == SINGLE )
549 command.push_back(
"<"+Pathname::assertprefix( root_r, it->file() ).
asString() );
550 str::splitEscaped( notificationCmdSubst( commandStr, *it ), std::back_inserter( command ) );
552 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
555 for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
559 int ret = prog.close();
562 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
563 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
569 else if ( format == DIGEST || format == BULK )
571 filesystem::TmpFile tmpfile;
572 ofstream out( tmpfile.path().c_str() );
573 for_( it, notifications_r.begin(), notifications_r.end() )
575 if ( format == DIGEST )
577 out << it->file() << endl;
579 else if ( format == BULK )
581 copyTo( out <<
'\f', Pathname::assertprefix( root_r, it->file() ) );
585 std::vector<std::string> command;
586 command.push_back(
"<"+tmpfile.path().asString() );
587 str::splitEscaped( notificationCmdSubst( commandStr, *notifications_r.begin() ), std::back_inserter( command ) );
589 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
592 for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
596 int ret = prog.close();
599 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
600 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
607 INT <<
"Can't send Notification: Missing handler for 'format |' in command spec." << endl;
608 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
619 void RunUpdateMessages(
const Pathname & root_r,
620 const Pathname & messagesPath_r,
621 const std::vector<sat::Solvable> & checkPackages_r,
622 ZYppCommitResult & result_r )
624 if ( checkPackages_r.empty() )
627 MIL <<
"Looking for new update messages in (" << root_r <<
")" << messagesPath_r << endl;
628 Pathname messagesDir( Pathname::assertprefix( root_r, messagesPath_r ) );
629 if ( ! PathInfo( messagesDir ).isDir() )
632 std::list<std::string> messages;
634 if ( messages.empty() )
640 HistoryLog historylog;
641 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
643 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
644 for_( sit, messages.begin(), messages.end() )
649 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
652 PathInfo message( messagesDir / *sit );
653 if ( ! message.isFile() || message.size() == 0 )
656 MIL <<
"Found update message " << *sit << endl;
657 Pathname localPath( messagesPath_r/(*sit) );
658 result_r.rUpdateMessages().push_back( UpdateNotificationFile( *it, localPath ) );
659 historylog.comment( str::Str() <<
_(
"New update message") <<
" " << localPath,
true );
662 sendNotification( root_r, result_r.updateMessages() );
671 const std::vector<sat::Solvable> & checkPackages_r,
673 { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); }
684 TargetImpl::TargetImpl(
const Pathname & root_r,
bool doRebuild_r )
686 , _requestedLocalesFile( home() /
"RequestedLocales" )
687 , _autoInstalledFile( home() /
"AutoInstalled" )
695 sigMultiversionSpecChanged();
696 MIL <<
"Initialized target on " <<
_root << endl;
704 std::ifstream uuidprovider(
"/proc/sys/kernel/random/uuid" );
714 boost::function<
bool ()> condition,
715 boost::function<
string ()> value )
717 string val = value();
725 MIL <<
"updating '" << filename <<
"' content." << endl;
729 std::ofstream filestr;
732 filestr.open( filename.
c_str() );
734 if ( filestr.good() )
770 WAR <<
"Can't create anonymous id file" << endl;
779 Pathname flavorpath(
home() /
"LastDistributionFlavor");
785 WAR <<
"No base product, I won't create flavor cache" << endl;
789 string flavor = p->flavor();
801 WAR <<
"Can't create flavor cache" << endl;
814 sigMultiversionSpecChanged();
815 MIL <<
"Targets closed" << endl;
839 Pathname rpmsolvcookie = base/
"cookie";
841 bool build_rpm_solv =
true;
851 MIL <<
"Read cookie: " << cookie << endl;
856 if ( status == rpmstatus )
857 build_rpm_solv =
false;
858 MIL <<
"Read cookie: " << rpmsolvcookie <<
" says: " 859 << (build_rpm_solv ?
"outdated" :
"uptodate") << endl;
863 if ( build_rpm_solv )
877 bool switchingToTmpSolvfile =
false;
878 Exception ex(
"Failed to cache rpm database.");
884 rpmsolv = base/
"solv";
885 rpmsolvcookie = base/
"cookie";
892 WAR <<
"Using a temporary solv file at " << base << endl;
893 switchingToTmpSolvfile =
true;
902 if ( ! switchingToTmpSolvfile )
912 cmd.push_back(
"rpmdb2solv" );
914 cmd.push_back(
"-r" );
917 cmd.push_back(
"-X" );
919 cmd.push_back(
"-p" );
922 if ( ! oldSolvFile.
empty() )
923 cmd.push_back( oldSolvFile.
asString() );
925 cmd.push_back(
"-o" );
929 std::string errdetail;
932 WAR <<
" " << output;
933 if ( errdetail.empty() ) {
940 int ret = prog.
close();
972 if ( !
PathInfo(base/
"solv.idx").isExist() )
975 return build_rpm_solv;
993 MIL <<
"New cache built: " << (newCache?
"true":
"false") <<
994 ", force loading: " << (force?
"true":
"false") << endl;
999 MIL <<
"adding " << rpmsolv <<
" to pool(" << satpool.
systemRepoAlias() <<
")" << endl;
1006 if ( newCache || force )
1023 MIL <<
"adding " << rpmsolv <<
" to system" << endl;
1029 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1054 if (
PathInfo( historyFile ).isExist() )
1061 if ( onSystemByUser.find( ident ) == onSystemByUser.end() )
1062 onSystemByAuto.insert( ident );
1078 if ( ! hardLocks.empty() )
1087 MIL <<
"Target loaded: " << system.
solvablesSize() <<
" resolvables" << endl;
1107 if (
root() ==
"/" )
1117 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
")" << endl;
1136 steps.push_back( *it );
1143 MIL <<
"Todo: " << result << endl;
1153 if ( commitPlugins )
1154 commitPlugins.
send( transactionPluginFrame(
"COMMITBEGIN", steps ) );
1161 if ( ! policy_r.
dryRun() )
1167 DBG <<
"dryRun: Not writing upgrade testcase." << endl;
1174 if ( ! policy_r.
dryRun() )
1196 DBG <<
"dryRun: Not stroring non-package data." << endl;
1203 if ( ! policy_r.
dryRun() )
1205 for_( it, steps.begin(), steps.end() )
1207 if ( ! it->satSolvable().isKind<
Patch>() )
1215 if ( ! patch ||patch->message().empty() )
1218 MIL <<
"Show message for " << patch << endl;
1220 if ( !
report->show( patch ) )
1222 WAR <<
"commit aborted by the user" << endl;
1229 DBG <<
"dryRun: Not checking patch messages." << endl;
1248 for_( it, steps.begin(), steps.end() )
1250 switch ( it->stepType() )
1269 localfile = packageCache.
get( pi );
1272 catch (
const AbortRequestException & exp )
1276 WAR <<
"commit cache preload aborted by the user" << endl;
1280 catch (
const SkipRequestException & exp )
1285 WAR <<
"Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1295 INT <<
"Unexpected Error: Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1305 ERR <<
"Some packages could not be provided. Aborting commit."<< endl;
1309 if ( ! policy_r.
dryRun() )
1313 commit( policy_r, packageCache, result );
1317 DBG <<
"dryRun/downloadOnly: Not installing/deleting anything." << endl;
1323 DBG <<
"dryRun: Not downloading/installing/deleting anything." << endl;
1329 if ( commitPlugins )
1330 commitPlugins.
send( transactionPluginFrame(
"COMMITEND", steps ) );
1335 if ( ! policy_r.
dryRun() )
1340 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
") returns: " << result << endl;
1351 struct NotifyAttemptToModify
1369 MIL <<
"TargetImpl::commit(<list>" << policy_r <<
")" << steps.size() << endl;
1374 NotifyAttemptToModify attemptToModify( result_r );
1379 std::vector<sat::Solvable> successfullyInstalledPackages;
1382 for_( step, steps.begin(), steps.end() )
1404 localfile = packageCache_r.
get( citem );
1406 catch (
const AbortRequestException &e )
1408 WAR <<
"commit aborted by the user" << endl;
1413 catch (
const SkipRequestException &e )
1416 WAR <<
"Skipping package " << p <<
" in commit" << endl;
1425 INT <<
"Unexpected Error: Skipping package " << p <<
" in commit" << endl;
1430 #warning Exception handling 1435 bool success =
false;
1461 if ( progress.aborted() )
1463 WAR <<
"commit aborted by the user" << endl;
1482 WAR <<
"dry run failed" << endl;
1487 if ( progress.aborted() )
1489 WAR <<
"commit aborted by the user" << endl;
1494 WAR <<
"Install failed" << endl;
1500 if ( success && !policy_r.
dryRun() )
1503 successfullyInstalledPackages.push_back( citem.
satSolvable() );
1512 bool success =
false;
1523 if ( progress.aborted() )
1525 WAR <<
"commit aborted by the user" << endl;
1539 if ( progress.aborted() )
1541 WAR <<
"commit aborted by the user" << endl;
1547 WAR <<
"removal of " << p <<
" failed";
1550 if ( success && !policy_r.
dryRun() )
1557 else if ( ! policy_r.
dryRun() )
1561 if ( ! citem.
buddy() )
1568 ERR <<
"Can't install orphan product without release-package! " << citem << endl;
1574 std::string referenceFilename( p->referenceFilename() );
1575 if ( referenceFilename.empty() )
1577 ERR <<
"Can't remove orphan product without 'referenceFilename'! " << citem << endl;
1584 ERR <<
"Delete orphan product failed: " << referenceFile << endl;
1611 if ( ! successfullyInstalledPackages.empty() )
1614 successfullyInstalledPackages, abort ) )
1616 WAR <<
"Commit aborted by the user" << endl;
1622 successfullyInstalledPackages,
1658 if ( baseproduct.isFile() )
1671 ERR <<
"baseproduct symlink is dangling or missing: " << baseproduct << endl;
1676 inline Pathname staticGuessRoot(
const Pathname & root_r )
1678 if ( root_r.empty() )
1683 return Pathname(
"/");
1689 inline std::string firstNonEmptyLineIn(
const Pathname & file_r )
1691 std::ifstream idfile( file_r.c_str() );
1692 for( iostr::EachLine in( idfile ); in; in.next() )
1695 if ( ! line.empty() )
1698 return std::string();
1709 if ( p->isTargetDistribution() )
1717 const Pathname needroot( staticGuessRoot(root_r) );
1718 const Target_constPtr target( getZYpp()->getTarget() );
1719 if ( target && target->root() == needroot )
1720 return target->requestedLocales();
1726 MIL <<
"updateAutoInstalled if changed..." << endl;
1734 {
return baseproductdata(
_root ).registerTarget(); }
1737 {
return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); }
1740 {
return baseproductdata(
_root ).registerRelease(); }
1743 {
return baseproductdata( staticGuessRoot(root_r) ).registerRelease();}
1746 {
return baseproductdata(
_root ).registerFlavor(); }
1749 {
return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();}
1782 std::string
distributionVersion = baseproductdata( staticGuessRoot(root_r) ).edition().version();
1789 scoped_ptr<rpm::RpmDb> tmprpmdb;
1795 tmprpmdb->initDatabase( );
1812 return firstNonEmptyLineIn(
home() /
"LastDistributionFlavor" );
1817 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/LastDistributionFlavor" );
1823 std::string guessAnonymousUniqueId(
const Pathname & root_r )
1826 std::string ret( firstNonEmptyLineIn( root_r /
"/var/lib/zypp/AnonymousUniqueId" ) );
1827 if ( ret.
empty() && root_r !=
"/" )
1830 ret = firstNonEmptyLineIn(
"/var/lib/zypp/AnonymousUniqueId" );
1838 return guessAnonymousUniqueId(
root() );
1843 return guessAnonymousUniqueId( staticGuessRoot(root_r) );
static bool fileMissing(const Pathname &pathname)
helper functor
std::string asJSON() const
JSON representation.
ZYppCommitResult commit(ResPool pool_r, const ZYppCommitPolicy &policy_r)
Commit changes in the pool.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
Interface to the rpm program.
sat::Transaction getTransaction()
Return the Transaction computed by the last solver run.
bool upgradingRepos() const
Whether there is at least one UpgradeRepo request pending.
A Solvable object within the sat Pool.
const std::string & command() const
The command we're executing.
std::vector< sat::Transaction::Step > TransactionStepList
Save and restore locale set from file.
Alternating download and install.
ZYppCommitPolicy & rpmNoSignature(bool yesNo_r)
Use rpm option –nosignature (default: false)
const LocaleSet & getRequestedLocales() const
Return the requested locales.
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r) const
Provide SrcPackage in a local file.
[M] Install(multiversion) item (
unsigned splitEscaped(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \, bool withEmpty=false)
Split line_r into words with respect to escape delimeters.
bool solvfilesPathIsTemp() const
Whether we're using a temp.
const Pathname & path() const
Return current Pathname.
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Solvable satSolvable() const
Return the corresponding Solvable.
Result returned from ZYpp::commit.
static ZConfig & instance()
Singleton ctor.
bool isToBeInstalled() const
void addSolv(const Pathname &file_r)
Load Solvables from a solv-file.
std::string md5sum(const Pathname &file)
Compute a files md5sum.
Command frame for communication with PluginScript.
Pathname _tmpSolvfilesPath
bool findByProvides(const std::string &tag_r)
Reset to iterate all packages that provide a certain tag.
int readlink(const Pathname &symlink_r, Pathname &target_r)
Like 'readlink'.
void setData(const Data &data_r)
Store new Data.
SolvIdentFile _autoInstalledFile
user/auto installed database
detail::IdType value_type
static ProductFileData scanFile(const Pathname &file_r)
Parse one file (or symlink) and return the ProductFileData parsed.
void updateFileContent(const Pathname &filename, boost::function< bool()> condition, boost::function< string()> value)
updates the content of filename if condition is true, setting the content the the value returned by v...
void stampCommand()
Log info about the current process.
Target::commit helper optimizing package provision.
ZYppCommitPolicy & rpmInstFlags(target::rpm::RpmInstFlags newFlags_r)
The default target::rpm::RpmInstFlags.
TransactionStepList & rTransactionStepList()
Manipulate transactionStepList.
const sat::Transaction & transaction() const
The full transaction list.
void discardScripts()
Discard all remembered scrips.
StepStage stepStage() const
Step action result.
const Pathname & file() const
Return the file path.
int chmod(const Pathname &path, mode_t mode)
Like 'chmod'.
ResStatus & status() const
Returns the current status.
void installPackage(const Pathname &filename, RpmInstFlags flags=RPMINST_NONE)
install rpm package
ZYppCommitPolicy & dryRun(bool yesNo_r)
Set dry run (default: false).
byKind_iterator byKindBegin(const ResKind &kind_r) const
void updateAutoInstalled()
Update the database of autoinstalled packages.
#define N_(MSG)
Just tag text for translation.
ZYppCommitPolicy & rpmExcludeDocs(bool yesNo_r)
Use rpm option –excludedocs (default: false)
const char * c_str() const
String representation.
Date timestamp() const
timestamp of the rpm database (last modification)
std::string _distributionVersion
Cache distributionVersion.
void commitFindFileConflicts(const ZYppCommitPolicy &policy_r, ZYppCommitResult &result_r)
Commit helper checking for file conflicts after download.
Parallel execution of stateful PluginScripts.
void setData(const Data &data_r)
Store new Data.
void setAutoInstalled(const Queue &autoInstalled_r)
Set ident list of all autoinstalled solvables.
sat::Solvable buddy() const
Return the buddy we share our status object with.
Access to the sat-pools string space.
Libsolv transaction wrapper.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Edition represents [epoch:]version[-release]
Attempts to create a lock to prevent the system from going into hibernate/shutdown.
bool resetTransact(TransactByValue causer_r)
Not the same as setTransact( false ).
Similar to DownloadInAdvance, but try to split the transaction into heaps, where at the end of each h...
bool providesFile(const std::string &path_str, const std::string &name_str) const
If the package is installed and provides the file Needed to evaluate split provides during Resolver::...
TraitsType::constPtrType constPtr
const_iterator end() const
Iterator behind the last TransactionStep.
Provide a new empty temporary file and delete it when no longer needed.
unsigned epoch_t
Type of an epoch.
void writeUpgradeTestcase()
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Class representing a patch.
void installSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
std::string targetDistributionFlavor() const
This is register.flavor attribute of the installed base product.
void install(const PoolItem &pi)
Log installation (or update) of a package.
ResObject::constPtr resolvable() const
Returns the ResObject::constPtr.
std::vector< std::string > Arguments
std::string targetDistributionRelease() const
This is register.release attribute of the installed base product.
Extract and remember posttrans scripts for later execution.
Subclass to retrieve database content.
void remember(const Exception &old_r)
Store an other Exception as history.
rpm::RpmDb _rpm
RPM database.
Repository systemRepo()
Return the system repository, create it if missing.
std::string distributionVersion() const
This is version attribute of the installed base product.
const LocaleSet & locales() const
Return the loacale set.
void createLastDistributionFlavorCache() const
generates a cache of the last product flavor
void initRequestedLocales(const LocaleSet &locales_r)
Start tracking changes based on this locales_r.
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
StringQueue autoInstalled() const
Return the ident strings of all packages that would be auto-installed after the transaction is run...
LocaleSet requestedLocales() const
Languages to be supported by the system.
[ ] Nothing (includes implicit deletes due to obsoletes and non-package actions)
bool empty() const
Test for an empty path.
int addmod(const Pathname &path, mode_t mode)
Add the mode bits to the file given by path.
void push(value_type val_r)
Push a value to the end off the Queue.
std::string getline(std::istream &str)
Read one line from stream.
Store and operate on date (time_t).
SolvableIterator solvablesEnd() const
Iterator behind the last Solvable.
std::string shortName() const
static Pool instance()
Singleton ctor.
const Data & data() const
Return the data.
std::string version() const
Version.
Pathname _root
Path to the target.
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
std::string trim(const std::string &s, const Trim trim_r)
int unlink(const Pathname &path)
Like 'unlink'.
static const std::string & systemRepoAlias()
Reserved system repository alias .
bool collectScriptFromPackage(ManagedFile rpmPackage_r)
Extract and remember a packages posttrans script for later execution.
static const Pathname & fname()
Get the current log file path.
bool executeScripts()
Execute the remembered scripts.
const std::string & asString() const
String representation.
void send(const PluginFrame &frame_r)
Send PluginFrame to all open plugins.
int rename(const Pathname &oldpath, const Pathname &newpath)
Like 'rename'.
Just download all packages to the local cache.
Options and policies for ZYpp::commit.
bool isExist() const
Return whether valid stat info exists.
libzypp will decide what to do.
A single step within a Transaction.
ZYppCommitPolicy & downloadMode(DownloadMode val_r)
Commit download policy to use.
RequestedLocalesFile _requestedLocalesFile
Requested Locales database.
void setLocales(const LocaleSet &locales_r)
Store a new locale set.
Pathname rootDir() const
Get rootdir (for file conflicts check)
void getHardLockQueries(HardLockQueries &activeLocks_r)
Suggest a new set of queries based on the current selection.
Pathname dirname() const
Return all but the last component od this path.
static Pathname assertprefix(const Pathname &root_r, const Pathname &path_r)
Return path_r prefixed with root_r, unless it is already prefixed.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
std::string release() const
Release.
Interim helper class to collect global options and settings.
SolvableIterator solvablesBegin() const
Iterator to the first Solvable.
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
std::string summary() const
bool order()
Order transaction steps for commit.
Pathname solvfilesPath() const
The solv file location actually in use (default or temp).
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
std::string targetDistribution() const
This is register.target attribute of the installed base product.
Resolver & resolver() const
The Resolver.
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
TraitsType::constPtrType constPtr
std::string receiveLine()
Read one line from the input stream.
void closeDatabase()
Block further access to the rpm database and go back to uninitialized state.
Date timestamp() const
return the last modification date of the target
ZYppCommitPolicy & restrictToMedia(unsigned mediaNr_r)
Restrict commit to media 1.
std::list< PoolItem > PoolItemList
list of pool items
std::string anonymousUniqueId() const
anonymous unique id
std::string toLower(const std::string &s)
Return lowercase version of s.
Pathname home() const
The directory to store things.
static std::string generateRandomId()
generates a random id using uuidgen
void resetDispose()
Set no dispose function.
ManagedFile get(const PoolItem &citem_r)
Provide a package.
HardLocksFile _hardLocksFile
Hard-Locks database.
static void setRoot(const Pathname &root)
Set new root directory to the default history log file path.
int close()
Wait for the progamm to complete.
byKind_iterator byKindEnd(const ResKind &kind_r) const
void setHardLockQueries(const HardLockQueries &newLocks_r)
Set a new set of queries.
#define SUBST_IF(PAT, VAL)
std::list< UpdateNotificationFile > UpdateNotifications
Libsolv Id queue wrapper.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
Product::constPtr baseProduct() const
returns the target base installed product, also known as the distribution or platform.
void createAnonymousId() const
generates the unique anonymous id which is called when creating the target
ZYppCommitPolicy & allMedia()
Process all media (default)
const_iterator begin() const
Iterator to the first TransactionStep.
pool::PoolTraits::HardLockQueries Data
void add(const Value &val_r)
Push JSON Value to Array.
StepType stepType() const
Type of action to perform in this step.
const Data & data() const
Return the data.
Base class for Exception.
bool preloaded() const
Whether preloaded hint is set.
void load(const Pathname &path_r)
Find and launch plugins sending PLUGINBEGIN.
Data returned by ProductFileReader.
std::string asJSON() const
JSON representation.
void remove(const PoolItem &pi)
Log removal of a package.
void initDatabase(Pathname root_r=Pathname(), Pathname dbPath_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database.
void removePackage(const std::string &name_r, RpmInstFlags flags=RPMINST_NONE)
remove rpm package
epoch_t epoch() const
Epoch.
std::string distroverpkg() const
Package telling the "product version" on systems not using /etc/product.d/baseproduct.
Pathname root() const
The root set for this target.
virtual ~TargetImpl()
Dtor.
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void eraseFromPool()
Remove this Repository from it's Pool.
bool hasFile(const std::string &file_r, const std::string &name_r="") const
Return true if at least one package owns a certain file (name_r empty) Return true if package name_r ...
void comment(const std::string &comment, bool timestamp=false)
Log a comment (even multiline).
TraitsType::constPtrType constPtr
Wrapper class for ::stat/::lstat.
bool solvablesEmpty() const
Whether Repository contains solvables.
ResObject::Ptr makeResObject(const sat::Solvable &solvable_r)
Create ResObject from sat::Solvable.
sat::Transaction & rTransaction()
Manipulate transaction.
Combining sat::Solvable and ResStatus.
Pathname systemRoot() const
The target root directory.
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Provides a source package on the Target.
static TmpFile makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
Target::DistributionLabel distributionLabel() const
This is shortName and summary attribute of the installed base product.
Track changing files or directories.
std::string asString() const
Conversion to std::string
bool isKind(const ResKind &kind_r) const
std::string toJSON(const sat::Transaction::Step &step_r)
See COMMITBEGIN (added in v1) on page Commit plugin for the specs.
const std::string & asString() const
void XRunUpdateMessages(const Pathname &root_r, const Pathname &messagesPath_r, const std::vector< sat::Solvable > &checkPackages_r, ZYppCommitResult &result_r)
std::string distributionFlavor() const
This is flavor attribute of the installed base product but does not require the target to be loaded a...
size_type solvablesSize() const
Number of solvables in Repository.
Easy-to use interface to the ZYPP dependency resolver.
std::unordered_set< IdString > Data
Pathname defaultSolvfilesPath() const
The systems default solv file location.
Solvable satSolvable() const
Return the corresponding sat::Solvable.
void add(const String &key_r, const Value &val_r)
Add key/value pair.
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
void setCommitList(std::vector< sat::Solvable > commitList_r)
Download(commit) sequence of solvables to compute read ahead.
bool empty() const
Whether this is an empty object without valid data.
std::unordered_set< Locale > LocaleSet
rpm::RpmDb & rpm()
The RPM database.
TraitsType::constPtrType constPtr
#define IMPL_PTR_TYPE(NAME)
ZYppCommitResult & _result
static ResPool instance()
Singleton ctor.
void load(bool force=true)