19 #include <sys/types.h> 67 #include <solv/repo_rpmdb.h> 77 AutoDispose<Chksum*> chk { ::solv_chksum_create( REPOKEY_TYPE_SHA1 ), []( Chksum *chk ) ->
void {
78 ::solv_chksum_free( chk,
nullptr );
80 if ( ::rpm_hash_database_state(
state, chk ) == 0 )
83 const unsigned char * md5 = ::solv_chksum_get( chk, &md5l );
87 WAR <<
"rpm_hash_database_state failed" << endl;
107 inline void sigMultiversionSpecChanged()
125 for (
const Transaction::Step & step : steps_r )
127 if ( step.stepType() != Transaction::TRANSACTION_IGNORE )
137 static const std::string strType(
"type" );
138 static const std::string strStage(
"stage" );
139 static const std::string strSolvable(
"solvable" );
141 static const std::string strTypeDel(
"-" );
142 static const std::string strTypeIns(
"+" );
143 static const std::string strTypeMul(
"M" );
145 static const std::string strStageDone(
"ok" );
146 static const std::string strStageFailed(
"err" );
148 static const std::string strSolvableN(
"n" );
149 static const std::string strSolvableE(
"e" );
150 static const std::string strSolvableV(
"v" );
151 static const std::string strSolvableR(
"r" );
152 static const std::string strSolvableA(
"a" );
159 case Transaction::TRANSACTION_IGNORE:
break;
160 case Transaction::TRANSACTION_ERASE: ret.
add( strType, strTypeDel );
break;
161 case Transaction::TRANSACTION_INSTALL: ret.
add( strType, strTypeIns );
break;
162 case Transaction::TRANSACTION_MULTIINSTALL: ret.
add( strType, strTypeMul );
break;
167 case Transaction::STEP_TODO:
break;
168 case Transaction::STEP_DONE: ret.
add( strStage, strStageDone );
break;
169 case Transaction::STEP_ERROR: ret.
add( strStage, strStageFailed );
break;
178 ident = solv.ident();
185 ident = step_r.
ident();
187 arch = step_r.
arch();
192 { strSolvableV, ed.
version() },
193 { strSolvableR, ed.
release() },
197 s.add( strSolvableE, epoch );
199 ret.
add( strSolvable, s );
218 std::ifstream infile( historyFile_r.c_str() );
219 for( iostr::EachLine in( infile ); in; in.next() )
221 const char * ch( (*in).c_str() );
223 if ( *ch <
'1' ||
'9' < *ch )
225 const char * sep1 = ::strchr( ch,
'|' );
230 bool installs =
true;
231 if ( ::strncmp( sep1,
"install|", 8 ) )
233 if ( ::strncmp( sep1,
"remove |", 8 ) )
240 const char * sep2 = ::strchr( sep1,
'|' );
241 if ( !sep2 || sep1 == sep2 )
243 (*in)[sep2-ch] =
'\0';
244 IdString pkg( sep1 );
248 onSystemByUserList.erase( pkg );
252 if ( (sep1 = ::strchr( sep2+1,
'|' ))
253 && (sep1 = ::strchr( sep1+1,
'|' ))
254 && (sep2 = ::strchr( sep1+1,
'|' )) )
256 (*in)[sep2-ch] =
'\0';
257 if ( ::strchr( sep1+1,
'@' ) )
260 onSystemByUserList.insert( pkg );
265 MIL <<
"onSystemByUserList found: " << onSystemByUserList.size() << endl;
266 return onSystemByUserList;
276 return PluginFrame( command_r, json::Object {
277 {
"TransactionStepList", steps_r }
287 MIL <<
"Testcases to keep: " << toKeep << endl;
293 WAR <<
"No Target no Testcase!" << endl;
297 std::string stem(
"updateTestcase" );
298 Pathname dir( target->assertRootPrefix(
"/var/log/") );
302 std::list<std::string> content;
304 std::set<std::string> cases;
305 for_( c, content.begin(), content.end() )
310 if ( cases.size() >= toKeep )
312 unsigned toDel = cases.size() - toKeep + 1;
313 for_( c, cases.begin(), cases.end() )
322 MIL <<
"Write new testcase " << next << endl;
323 getZYpp()->resolver()->createSolverTestcase( next.asString(),
false );
340 std::pair<bool,PatchScriptReport::Action> doExecuteScript(
const Pathname & root_r,
350 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() )
355 WAR <<
"User request to abort script " << script_r << endl;
364 if ( prog.close() != 0 )
366 ret.second = report_r->problem( prog.execError() );
367 WAR <<
"ACTION" << ret.second <<
"(" << prog.execError() <<
")" << endl;
368 std::ostringstream sstr;
369 sstr << script_r <<
_(
" execution failed") <<
" (" << prog.execError() <<
")" << endl;
370 historylog.
comment(sstr.str(),
true);
382 bool executeScript(
const Pathname & root_r,
383 const Pathname & script_r,
384 callback::SendReport<PatchScriptReport> & report_r )
389 action = doExecuteScript( root_r, script_r, report_r );
393 switch ( action.second )
396 WAR <<
"User request to abort at script " << script_r << endl;
401 WAR <<
"User request to skip script " << script_r << endl;
411 INT <<
"Abort on unknown ACTION request " << action.second <<
" returned" << endl;
420 bool RunUpdateScripts(
const Pathname & root_r,
421 const Pathname & scriptsPath_r,
422 const std::vector<sat::Solvable> & checkPackages_r,
425 if ( checkPackages_r.empty() )
428 MIL <<
"Looking for new update scripts in (" << root_r <<
")" << scriptsPath_r << endl;
430 if ( ! PathInfo( scriptsDir ).isDir() )
433 std::list<std::string> scripts;
435 if ( scripts.empty() )
443 std::map<std::string, Pathname> unify;
444 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
446 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
447 for_( sit, scripts.begin(), scripts.end() )
452 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
455 PathInfo script( scriptsDir / *sit );
456 Pathname localPath( scriptsPath_r/(*sit) );
457 std::string unifytag;
459 if ( script.isFile() )
465 else if ( ! script.isExist() )
473 if ( unifytag.empty() )
477 if ( unify[unifytag].empty() )
479 unify[unifytag] = localPath;
486 std::string msg(
str::form(
_(
"%s already executed as %s)"), localPath.asString().c_str(), unify[unifytag].c_str() ) );
487 MIL <<
"Skip update script: " << msg << endl;
488 HistoryLog().comment( msg,
true );
492 if ( abort || aborting_r )
494 WAR <<
"Aborting: Skip update script " << *sit << endl;
495 HistoryLog().comment(
496 localPath.asString() +
_(
" execution skipped while aborting"),
501 MIL <<
"Found update script " << *sit << endl;
502 callback::SendReport<PatchScriptReport>
report;
503 report->start( make<Package>( *it ), script.path() );
505 if ( ! executeScript( root_r, localPath,
report ) )
517 inline void copyTo( std::ostream & out_r,
const Pathname & file_r )
519 std::ifstream infile( file_r.c_str() );
520 for( iostr::EachLine in( infile ); in; in.next() )
522 out_r << *in << endl;
526 inline std::string notificationCmdSubst(
const std::string & cmd_r,
const UpdateNotificationFile & notification_r )
528 std::string ret( cmd_r );
529 #define SUBST_IF(PAT,VAL) if ( ret.find( PAT ) != std::string::npos ) ret = str::gsub( ret, PAT, VAL ) 530 SUBST_IF(
"%p", notification_r.solvable().asString() );
531 SUBST_IF(
"%P", notification_r.file().asString() );
536 void sendNotification(
const Pathname & root_r,
539 if ( notifications_r.empty() )
543 MIL <<
"Notification command is '" << cmdspec <<
"'" << endl;
544 if ( cmdspec.empty() )
548 if ( pos == std::string::npos )
550 ERR <<
"Can't send Notification: Missing 'format |' in command spec." << endl;
551 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
556 std::string commandStr(
str::trim( cmdspec.substr( pos + 1 ) ) );
558 enum Format { UNKNOWN, NONE, SINGLE, DIGEST, BULK };
559 Format format = UNKNOWN;
560 if ( formatStr ==
"none" )
562 else if ( formatStr ==
"single" )
564 else if ( formatStr ==
"digest" )
566 else if ( formatStr ==
"bulk" )
570 ERR <<
"Can't send Notification: Unknown format '" << formatStr <<
" |' in command spec." << endl;
571 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
579 if ( format == NONE || format == SINGLE )
581 for_( it, notifications_r.begin(), notifications_r.end() )
583 std::vector<std::string> command;
584 if ( format == SINGLE )
586 str::splitEscaped( notificationCmdSubst( commandStr, *it ), std::back_inserter( command ) );
591 for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
595 int ret = prog.close();
598 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
599 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
605 else if ( format == DIGEST || format == BULK )
607 filesystem::TmpFile tmpfile;
608 std::ofstream out( tmpfile.path().c_str() );
609 for_( it, notifications_r.begin(), notifications_r.end() )
611 if ( format == DIGEST )
613 out << it->file() << endl;
615 else if ( format == BULK )
621 std::vector<std::string> command;
622 command.push_back(
"<"+tmpfile.path().asString() );
623 str::splitEscaped( notificationCmdSubst( commandStr, *notifications_r.begin() ), std::back_inserter( command ) );
628 for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
632 int ret = prog.close();
635 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
636 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
643 INT <<
"Can't send Notification: Missing handler for 'format |' in command spec." << endl;
644 HistoryLog().comment( str::Str() <<
_(
"Error sending update message notification."),
true );
655 void RunUpdateMessages(
const Pathname & root_r,
656 const Pathname & messagesPath_r,
657 const std::vector<sat::Solvable> & checkPackages_r,
658 ZYppCommitResult & result_r )
660 if ( checkPackages_r.empty() )
663 MIL <<
"Looking for new update messages in (" << root_r <<
")" << messagesPath_r << endl;
665 if ( ! PathInfo( messagesDir ).isDir() )
668 std::list<std::string> messages;
670 if ( messages.empty() )
676 HistoryLog historylog;
677 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
679 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
680 for_( sit, messages.begin(), messages.end() )
685 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
688 PathInfo message( messagesDir / *sit );
689 if ( ! message.isFile() || message.size() == 0 )
692 MIL <<
"Found update message " << *sit << endl;
693 Pathname localPath( messagesPath_r/(*sit) );
694 result_r.rUpdateMessages().push_back( UpdateNotificationFile( *it, localPath ) );
695 historylog.comment( str::Str() <<
_(
"New update message") <<
" " << localPath,
true );
698 sendNotification( root_r, result_r.updateMessages() );
704 void logPatchStatusChanges(
const sat::Transaction & transaction_r, TargetImpl & target_r )
707 if ( changedPseudoInstalled.empty() )
715 WAR <<
"Need to recompute the patch status changes as commit is incomplete!" << endl;
721 HistoryLog historylog;
722 for (
const auto & el : changedPseudoInstalled )
723 historylog.patchStateChange( el.first, el.second );
732 const std::vector<sat::Solvable> & checkPackages_r,
734 { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); }
747 , _requestedLocalesFile( home() /
"RequestedLocales" )
748 , _autoInstalledFile( home() /
"AutoInstalled" )
757 sigMultiversionSpecChanged();
758 MIL <<
"Initialized target on " <<
_root << endl;
766 std::ifstream uuidprovider(
"/proc/sys/kernel/random/uuid" );
776 boost::function<
bool ()> condition,
777 boost::function<std::string ()> value )
779 std::string val = value();
787 MIL <<
"updating '" << filename <<
"' content." << endl;
791 std::ofstream filestr;
794 filestr.open( filename.
c_str() );
796 if ( filestr.good() )
832 WAR <<
"Can't create anonymous id file" << endl;
841 Pathname flavorpath(
home() /
"LastDistributionFlavor");
847 WAR <<
"No base product, I won't create flavor cache" << endl;
851 std::string flavor = p->flavor();
863 WAR <<
"Can't create flavor cache" << endl;
876 sigMultiversionSpecChanged();
877 MIL <<
"Targets closed" << endl;
901 Pathname rpmsolvcookie = base/
"cookie";
903 bool build_rpm_solv =
true;
913 MIL <<
"Read cookie: " << cookie << endl;
918 if ( status == rpmstatus )
919 build_rpm_solv =
false;
920 MIL <<
"Read cookie: " << rpmsolvcookie <<
" says: " 921 << (build_rpm_solv ?
"outdated" :
"uptodate") << endl;
925 if ( build_rpm_solv )
939 bool switchingToTmpSolvfile =
false;
940 Exception ex(
"Failed to cache rpm database.");
946 rpmsolv = base/
"solv";
947 rpmsolvcookie = base/
"cookie";
954 WAR <<
"Using a temporary solv file at " << base << endl;
955 switchingToTmpSolvfile =
true;
964 if ( ! switchingToTmpSolvfile )
974 cmd.push_back(
"rpmdb2solv" );
976 cmd.push_back(
"-r" );
979 cmd.push_back(
"-X" );
981 cmd.push_back(
"-p" );
984 if ( ! oldSolvFile.
empty() )
985 cmd.push_back( oldSolvFile.
asString() );
987 cmd.push_back(
"-o" );
991 std::string errdetail;
994 WAR <<
" " << output;
995 if ( errdetail.empty() ) {
1002 int ret = prog.
close();
1023 if (
root() ==
"/" )
1034 if ( !
PathInfo(base/
"solv.idx").isExist() )
1037 return build_rpm_solv;
1055 MIL <<
"New cache built: " << (newCache?
"true":
"false") <<
1056 ", force loading: " << (force?
"true":
"false") << endl;
1061 MIL <<
"adding " << rpmsolv <<
" to pool(" << satpool.
systemRepoAlias() <<
")" << endl;
1068 if ( newCache || force )
1085 MIL <<
"adding " << rpmsolv <<
" to system" << endl;
1091 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1116 if (
PathInfo( historyFile ).isExist() )
1123 if ( onSystemByUser.find( ident ) == onSystemByUser.end() )
1124 onSystemByAuto.insert( ident );
1143 if (
PathInfo( needrebootFile ).isFile() )
1144 needrebootSpec.
parseFrom( needrebootFile );
1147 if (
PathInfo( needrebootDir ).isDir() )
1152 [&](
const Pathname & dir_r,
const char *
const str_r )->
bool 1154 if ( ! isRpmConfigBackup( str_r ) )
1156 Pathname needrebootFile { needrebootDir / str_r };
1157 if (
PathInfo( needrebootFile ).isFile() )
1158 needrebootSpec.
parseFrom( needrebootFile );
1169 if ( ! hardLocks.empty() )
1178 MIL <<
"Target loaded: " << system.
solvablesSize() <<
" resolvables" << endl;
1190 bool explicitDryRun = policy_r.
dryRun();
1200 if (
root() ==
"/" )
1210 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
")" << endl;
1229 steps.push_back( *it );
1236 MIL <<
"Todo: " << result << endl;
1246 if ( commitPlugins )
1247 commitPlugins.
send( transactionPluginFrame(
"COMMITBEGIN", steps ) );
1254 if ( ! policy_r.
dryRun() )
1260 DBG <<
"dryRun: Not writing upgrade testcase." << endl;
1267 if ( ! policy_r.
dryRun() )
1289 DBG <<
"dryRun: Not stroring non-package data." << endl;
1296 if ( ! policy_r.
dryRun() )
1298 for_( it, steps.begin(), steps.end() )
1300 if ( ! it->satSolvable().isKind<
Patch>() )
1308 if ( ! patch ||patch->message().empty() )
1311 MIL <<
"Show message for " << patch << endl;
1313 if ( !
report->show( patch ) )
1315 WAR <<
"commit aborted by the user" << endl;
1322 DBG <<
"dryRun: Not checking patch messages." << endl;
1341 for_( it, steps.begin(), steps.end() )
1343 switch ( it->stepType() )
1362 localfile = packageCache.
get( pi );
1365 catch (
const AbortRequestException & exp )
1369 WAR <<
"commit cache preload aborted by the user" << endl;
1373 catch (
const SkipRequestException & exp )
1378 WAR <<
"Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1388 INT <<
"Unexpected Error: Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1398 ERR <<
"Some packages could not be provided. Aborting commit."<< endl;
1402 if ( ! policy_r.
dryRun() )
1406 commit( policy_r, packageCache, result );
1410 DBG <<
"dryRun/downloadOnly: Not installing/deleting anything." << endl;
1411 if ( explicitDryRun ) {
1420 DBG <<
"dryRun: Not downloading/installing/deleting anything." << endl;
1421 if ( explicitDryRun ) {
1430 if ( commitPlugins )
1431 commitPlugins.
send( transactionPluginFrame(
"COMMITEND", steps ) );
1436 if ( ! policy_r.
dryRun() )
1441 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
") returns: " << result << endl;
1452 struct NotifyAttemptToModify
1470 MIL <<
"TargetImpl::commit(<list>" << policy_r <<
")" << steps.size() << endl;
1475 NotifyAttemptToModify attemptToModify( result_r );
1480 std::vector<sat::Solvable> successfullyInstalledPackages;
1483 for_( step, steps.begin(), steps.end() )
1505 localfile = packageCache_r.
get( citem );
1507 catch (
const AbortRequestException &e )
1509 WAR <<
"commit aborted by the user" << endl;
1514 catch (
const SkipRequestException &e )
1517 WAR <<
"Skipping package " << p <<
" in commit" << endl;
1526 INT <<
"Unexpected Error: Skipping package " << p <<
" in commit" << endl;
1531 #warning Exception handling 1536 bool success =
false;
1562 if ( progress.aborted() )
1564 WAR <<
"commit aborted by the user" << endl;
1573 auto rebootNeededFile =
root() /
"/var/run/reboot-needed";
1589 WAR <<
"dry run failed" << endl;
1594 if ( progress.aborted() )
1596 WAR <<
"commit aborted by the user" << endl;
1601 WAR <<
"Install failed" << endl;
1607 if ( success && !policy_r.
dryRun() )
1610 successfullyInstalledPackages.push_back( citem.
satSolvable() );
1619 bool success =
false;
1630 if ( progress.aborted() )
1632 WAR <<
"commit aborted by the user" << endl;
1646 if ( progress.aborted() )
1648 WAR <<
"commit aborted by the user" << endl;
1654 WAR <<
"removal of " << p <<
" failed";
1657 if ( success && !policy_r.
dryRun() )
1664 else if ( ! policy_r.
dryRun() )
1668 if ( ! citem.
buddy() )
1675 ERR <<
"Can't install orphan product without release-package! " << citem << endl;
1681 std::string referenceFilename( p->referenceFilename() );
1682 if ( referenceFilename.empty() )
1684 ERR <<
"Can't remove orphan product without 'referenceFilename'! " << citem << endl;
1688 Pathname referencePath {
Pathname(
"/etc/products.d") / referenceFilename };
1689 if ( !
rpm().hasFile( referencePath.asString() ) )
1694 ERR <<
"Delete orphan product failed: " << referencePath << endl;
1698 WAR <<
"Won't remove orphan product: '/etc/products.d/" << referenceFilename <<
"' is owned by a package." << endl;
1725 if ( ! successfullyInstalledPackages.empty() )
1728 successfullyInstalledPackages, abort ) )
1730 WAR <<
"Commit aborted by the user" << endl;
1736 successfullyInstalledPackages,
1743 logPatchStatusChanges( result_r.
transaction(), *this );
1772 if ( baseproduct.isFile() )
1785 ERR <<
"baseproduct symlink is dangling or missing: " << baseproduct << endl;
1790 inline Pathname staticGuessRoot(
const Pathname & root_r )
1792 if ( root_r.empty() )
1797 return Pathname(
"/");
1803 inline std::string firstNonEmptyLineIn(
const Pathname & file_r )
1805 std::ifstream idfile( file_r.c_str() );
1806 for( iostr::EachLine in( idfile ); in; in.next() )
1809 if ( ! line.empty() )
1812 return std::string();
1823 if ( p->isTargetDistribution() )
1831 const Pathname needroot( staticGuessRoot(root_r) );
1832 const Target_constPtr target( getZYpp()->getTarget() );
1833 if ( target && target->root() == needroot )
1834 return target->requestedLocales();
1840 MIL <<
"updateAutoInstalled if changed..." << endl;
1848 {
return baseproductdata(
_root ).registerTarget(); }
1851 {
return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); }
1854 {
return baseproductdata(
_root ).registerRelease(); }
1857 {
return baseproductdata( staticGuessRoot(root_r) ).registerRelease();}
1860 {
return baseproductdata(
_root ).registerFlavor(); }
1863 {
return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();}
1896 std::string
distributionVersion = baseproductdata( staticGuessRoot(root_r) ).edition().version();
1903 scoped_ptr<rpm::RpmDb> tmprpmdb;
1909 tmprpmdb->initDatabase( );
1926 return firstNonEmptyLineIn(
home() /
"LastDistributionFlavor" );
1931 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/LastDistributionFlavor" );
1937 std::string guessAnonymousUniqueId(
const Pathname & root_r )
1940 std::string ret( firstNonEmptyLineIn( root_r /
"/var/lib/zypp/AnonymousUniqueId" ) );
1941 if ( ret.
empty() && root_r !=
"/" )
1944 ret = firstNonEmptyLineIn(
"/var/lib/zypp/AnonymousUniqueId" );
1952 return guessAnonymousUniqueId(
root() );
1957 return guessAnonymousUniqueId( staticGuessRoot(root_r) );
1964 MIL <<
"New VendorAttr: " << vendorAttr_r << endl;
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.
VendorAttr _vendorAttr
vendor equivalence settings.
EstablishedStates::ChangedPseudoInstalled ChangedPseudoInstalled
Map holding pseudo installed items where current and established status differ.
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.
int assert_file(const Pathname &path, unsigned mode)
Create an empty file if it does not yet exist.
[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.
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.
void updateFileContent(const Pathname &filename, boost::function< bool()> condition, boost::function< std::string()> value)
updates the content of filename if condition is true, setting the content the the value returned by v...
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.
IMPL_PTR_TYPE(TargetImpl)
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.
String matching (STRING|SUBSTRING|GLOB|REGEX).
TargetImpl(const Pathname &root_r="/", bool doRebuild_r=false)
Ctor.
void stampCommand()
Log info about the current process.
Target::commit helper optimizing package provision.
bool isNeedreboot() const
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.
ZYppCommitPolicy & rpmExcludeDocs(bool yesNo_r)
Use rpm option –excludedocs (default: false)
const char * c_str() const
String representation.
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.
std::string receiveLine()
Read one line from the input stream.
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.
ChangedPseudoInstalled changedPseudoInstalled() const
Return all pseudo installed items whose current state differs from their initial one.
std::vector< std::string > Arguments
std::string targetDistributionRelease() const
This is register.release attribute of the installed base product.
Define a set of Solvables by ident and provides.
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.
EstablishedStates establishedStates() const
Factory for EstablishedStates.
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.
const StrMatcher & matchNoDots()
Convenience returning StrMatcher( "[^.]*", Match::GLOB )
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.
std::string rpmDbStateHash(const Pathname &root_r)
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.
void parseFrom(const InputStream &istr_r)
Parse file istr_r and add it's specs (one per line, #-comments).
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'.
ChangedPseudoInstalled changedPseudoInstalled() const
Return all pseudo installed items whose current state differs from the established one...
std::string release() const
Release.
Interim helper class to collect global options and settings.
Definition of vendor equivalence.
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
const VendorAttr & vendorAttr() const
The targets current vendor equivalence settings.
void initDatabase(Pathname root_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database at /var/lib/rpm.
void closeDatabase()
Block further access to the rpm database and go back to uninitialized state.
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
static PoolImpl & myPool()
RepoStatus rpmDbRepoStatus(const Pathname &root_r)
std::string toLower(const std::string &s)
Return lowercase version of s.
Pathname home() const
The directory to store things.
int touch(const Pathname &path)
Change file's modification and access times.
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.
static Date now()
Return the current time.
std::string asJSON() const
JSON representation.
void remove(const PoolItem &pi)
Log removal of a package.
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.
void setNeedrebootSpec(sat::SolvableSpec needrebootSpec_r)
Solvables which should trigger the reboot-needed hint if installed/updated.
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.
int dirForEach(const Pathname &dir_r, function< bool(const Pathname &, const char *const)> fnc_r)
Invoke callback function fnc_r for each entry in directory dir_r.
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
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
void multiversionSpecChanged()
ZYppCommitResult & _result
static ResPool instance()
Singleton ctor.
void load(bool force=true)