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 );
84 ret = ::pool_bin2hex( sat::Pool::instance().
get(), md5, md5l );
87 WAR <<
"rpm_hash_database_state failed" << endl;
107 inline void sigMultiversionSpecChanged()
109 sat::detail::PoolMember::myPool().multiversionSpecChanged();
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 );
213 SolvIdentFile::Data getUserInstalledFromHistory(
const Pathname & historyFile_r )
215 SolvIdentFile::Data onSystemByUserList;
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';
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;
274 inline PluginFrame transactionPluginFrame(
const std::string & command_r, ZYppCommitResult::TransactionStepList & steps_r )
276 return PluginFrame( command_r, json::Object {
277 {
"TransactionStepList", steps_r }
286 unsigned toKeep( ZConfig::instance().solver_upgradeTestcasesToKeep() );
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/") );
299 Pathname next( dir / Date::now().
form( stem+
"-%Y-%m-%d-%H-%M-%S" ) );
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,
344 MIL <<
"Execute script " <<
PathInfo(Pathname::assertprefix( root_r,script_r)) << endl;
350 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() )
353 if ( ! report_r->progress( PatchScriptReport::OUTPUT, output ) )
355 WAR <<
"User request to abort script " << script_r << endl;
362 std::pair<bool,PatchScriptReport::Action> ret( std::make_pair(
false, PatchScriptReport::ABORT ) );
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 )
386 std::pair<bool,PatchScriptReport::Action> action( std::make_pair(
false, PatchScriptReport::ABORT ) );
389 action = doExecuteScript( root_r, script_r, report_r );
393 switch ( action.second )
395 case PatchScriptReport::ABORT:
396 WAR <<
"User request to abort at script " << script_r << endl;
400 case PatchScriptReport::IGNORE:
401 WAR <<
"User request to skip script " << script_r << endl;
405 case PatchScriptReport::RETRY:
408 }
while ( action.second == PatchScriptReport::RETRY );
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;
429 Pathname scriptsDir( Pathname::assertprefix( root_r, scriptsPath_r ) );
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() )
542 std::string cmdspec( ZConfig::instance().updateMessagesNotify() );
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 )
585 command.push_back(
"<"+Pathname::assertprefix( root_r, it->file() ).
asString() );
586 str::splitEscaped( notificationCmdSubst( commandStr, *it ), std::back_inserter( command ) );
588 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
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 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 )
617 copyTo( out <<
'\f', Pathname::assertprefix( root_r, it->file() ) );
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 ) );
625 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
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;
664 Pathname messagesDir( Pathname::assertprefix( root_r, messagesPath_r ) );
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() );
707 const std::vector<sat::Solvable> & checkPackages_r,
709 { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); }
720 TargetImpl::TargetImpl(
const Pathname & root_r,
bool doRebuild_r )
722 , _requestedLocalesFile( home() /
"RequestedLocales" )
723 , _autoInstalledFile( home() /
"AutoInstalled" )
731 sigMultiversionSpecChanged();
732 MIL <<
"Initialized target on " <<
_root << endl;
740 std::ifstream uuidprovider(
"/proc/sys/kernel/random/uuid" );
750 boost::function<
bool ()> condition,
751 boost::function<
string ()> value )
753 string val = value();
761 MIL <<
"updating '" << filename <<
"' content." << endl;
765 std::ofstream filestr;
768 filestr.open( filename.
c_str() );
770 if ( filestr.good() )
806 WAR <<
"Can't create anonymous id file" << endl;
815 Pathname flavorpath(
home() /
"LastDistributionFlavor");
821 WAR <<
"No base product, I won't create flavor cache" << endl;
825 string flavor = p->flavor();
837 WAR <<
"Can't create flavor cache" << endl;
850 sigMultiversionSpecChanged();
851 MIL <<
"Targets closed" << endl;
875 Pathname rpmsolvcookie = base/
"cookie";
877 bool build_rpm_solv =
true;
887 MIL <<
"Read cookie: " << cookie << endl;
892 if ( status == rpmstatus )
893 build_rpm_solv =
false;
894 MIL <<
"Read cookie: " << rpmsolvcookie <<
" says: " 895 << (build_rpm_solv ?
"outdated" :
"uptodate") << endl;
899 if ( build_rpm_solv )
913 bool switchingToTmpSolvfile =
false;
914 Exception ex(
"Failed to cache rpm database.");
920 rpmsolv = base/
"solv";
921 rpmsolvcookie = base/
"cookie";
928 WAR <<
"Using a temporary solv file at " << base << endl;
929 switchingToTmpSolvfile =
true;
938 if ( ! switchingToTmpSolvfile )
948 cmd.push_back(
"rpmdb2solv" );
950 cmd.push_back(
"-r" );
953 cmd.push_back(
"-X" );
955 cmd.push_back(
"-p" );
958 if ( ! oldSolvFile.
empty() )
959 cmd.push_back( oldSolvFile.
asString() );
961 cmd.push_back(
"-o" );
965 std::string errdetail;
968 WAR <<
" " << output;
969 if ( errdetail.empty() ) {
976 int ret = prog.
close();
1008 if ( !
PathInfo(base/
"solv.idx").isExist() )
1011 return build_rpm_solv;
1029 MIL <<
"New cache built: " << (newCache?
"true":
"false") <<
1030 ", force loading: " << (force?
"true":
"false") << endl;
1035 MIL <<
"adding " << rpmsolv <<
" to pool(" << satpool.
systemRepoAlias() <<
")" << endl;
1042 if ( newCache || force )
1059 MIL <<
"adding " << rpmsolv <<
" to system" << endl;
1065 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1090 if (
PathInfo( historyFile ).isExist() )
1097 if ( onSystemByUser.find( ident ) == onSystemByUser.end() )
1098 onSystemByAuto.insert( ident );
1117 if (
PathInfo( needrebootFile ).isFile() )
1118 needrebootSpec.
parseFrom( needrebootFile );
1121 if (
PathInfo( needrebootDir ).isDir() )
1126 [&](
const Pathname & dir_r,
const char *
const str_r )->
bool 1128 if ( ! isRpmConfigBackup( str_r ) )
1130 Pathname needrebootFile { needrebootDir / str_r };
1131 if (
PathInfo( needrebootFile ).isFile() )
1132 needrebootSpec.
parseFrom( needrebootFile );
1143 if ( ! hardLocks.empty() )
1152 MIL <<
"Target loaded: " << system.
solvablesSize() <<
" resolvables" << endl;
1164 bool explicitDryRun = policy_r.
dryRun();
1174 if (
root() ==
"/" )
1184 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
")" << endl;
1203 steps.push_back( *it );
1210 MIL <<
"Todo: " << result << endl;
1220 if ( commitPlugins )
1221 commitPlugins.
send( transactionPluginFrame(
"COMMITBEGIN", steps ) );
1228 if ( ! policy_r.
dryRun() )
1234 DBG <<
"dryRun: Not writing upgrade testcase." << endl;
1241 if ( ! policy_r.
dryRun() )
1263 DBG <<
"dryRun: Not stroring non-package data." << endl;
1270 if ( ! policy_r.
dryRun() )
1272 for_( it, steps.begin(), steps.end() )
1274 if ( ! it->satSolvable().isKind<
Patch>() )
1282 if ( ! patch ||patch->message().empty() )
1285 MIL <<
"Show message for " << patch << endl;
1287 if ( !
report->show( patch ) )
1289 WAR <<
"commit aborted by the user" << endl;
1296 DBG <<
"dryRun: Not checking patch messages." << endl;
1315 for_( it, steps.begin(), steps.end() )
1317 switch ( it->stepType() )
1336 localfile = packageCache.
get( pi );
1339 catch (
const AbortRequestException & exp )
1343 WAR <<
"commit cache preload aborted by the user" << endl;
1347 catch (
const SkipRequestException & exp )
1352 WAR <<
"Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1362 INT <<
"Unexpected Error: Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1372 ERR <<
"Some packages could not be provided. Aborting commit."<< endl;
1376 if ( ! policy_r.
dryRun() )
1380 commit( policy_r, packageCache, result );
1384 DBG <<
"dryRun/downloadOnly: Not installing/deleting anything." << endl;
1385 if ( explicitDryRun ) {
1394 DBG <<
"dryRun: Not downloading/installing/deleting anything." << endl;
1395 if ( explicitDryRun ) {
1404 if ( commitPlugins )
1405 commitPlugins.
send( transactionPluginFrame(
"COMMITEND", steps ) );
1410 if ( ! policy_r.
dryRun() )
1415 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
") returns: " << result << endl;
1426 struct NotifyAttemptToModify
1444 MIL <<
"TargetImpl::commit(<list>" << policy_r <<
")" << steps.size() << endl;
1449 NotifyAttemptToModify attemptToModify( result_r );
1454 std::vector<sat::Solvable> successfullyInstalledPackages;
1457 for_( step, steps.begin(), steps.end() )
1479 localfile = packageCache_r.
get( citem );
1481 catch (
const AbortRequestException &e )
1483 WAR <<
"commit aborted by the user" << endl;
1488 catch (
const SkipRequestException &e )
1491 WAR <<
"Skipping package " << p <<
" in commit" << endl;
1500 INT <<
"Unexpected Error: Skipping package " << p <<
" in commit" << endl;
1505 #warning Exception handling 1510 bool success =
false;
1536 if ( progress.aborted() )
1538 WAR <<
"commit aborted by the user" << endl;
1547 auto rebootNeededFile =
root() /
"/var/run/reboot-needed";
1563 WAR <<
"dry run failed" << endl;
1568 if ( progress.aborted() )
1570 WAR <<
"commit aborted by the user" << endl;
1575 WAR <<
"Install failed" << endl;
1581 if ( success && !policy_r.
dryRun() )
1584 successfullyInstalledPackages.push_back( citem.
satSolvable() );
1593 bool success =
false;
1604 if ( progress.aborted() )
1606 WAR <<
"commit aborted by the user" << endl;
1620 if ( progress.aborted() )
1622 WAR <<
"commit aborted by the user" << endl;
1628 WAR <<
"removal of " << p <<
" failed";
1631 if ( success && !policy_r.
dryRun() )
1638 else if ( ! policy_r.
dryRun() )
1642 if ( ! citem.
buddy() )
1649 ERR <<
"Can't install orphan product without release-package! " << citem << endl;
1655 std::string referenceFilename( p->referenceFilename() );
1656 if ( referenceFilename.empty() )
1658 ERR <<
"Can't remove orphan product without 'referenceFilename'! " << citem << endl;
1662 Pathname referencePath {
Pathname(
"/etc/products.d") / referenceFilename };
1663 if ( !
rpm().hasFile( referencePath.asString() ) )
1668 ERR <<
"Delete orphan product failed: " << referencePath << endl;
1672 WAR <<
"Won't remove orphan product: '/etc/products.d/" << referenceFilename <<
"' is owned by a package." << endl;
1699 if ( ! successfullyInstalledPackages.empty() )
1702 successfullyInstalledPackages, abort ) )
1704 WAR <<
"Commit aborted by the user" << endl;
1710 successfullyInstalledPackages,
1740 if ( baseproduct.isFile() )
1753 ERR <<
"baseproduct symlink is dangling or missing: " << baseproduct << endl;
1758 inline Pathname staticGuessRoot(
const Pathname & root_r )
1760 if ( root_r.empty() )
1765 return Pathname(
"/");
1771 inline std::string firstNonEmptyLineIn(
const Pathname & file_r )
1773 std::ifstream idfile( file_r.c_str() );
1774 for( iostr::EachLine in( idfile ); in; in.next() )
1777 if ( ! line.empty() )
1780 return std::string();
1791 if ( p->isTargetDistribution() )
1799 const Pathname needroot( staticGuessRoot(root_r) );
1800 const Target_constPtr target( getZYpp()->getTarget() );
1801 if ( target && target->root() == needroot )
1802 return target->requestedLocales();
1808 MIL <<
"updateAutoInstalled if changed..." << endl;
1816 {
return baseproductdata(
_root ).registerTarget(); }
1819 {
return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); }
1822 {
return baseproductdata(
_root ).registerRelease(); }
1825 {
return baseproductdata( staticGuessRoot(root_r) ).registerRelease();}
1828 {
return baseproductdata(
_root ).registerFlavor(); }
1831 {
return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();}
1864 std::string
distributionVersion = baseproductdata( staticGuessRoot(root_r) ).edition().version();
1871 scoped_ptr<rpm::RpmDb> tmprpmdb;
1877 tmprpmdb->initDatabase( );
1894 return firstNonEmptyLineIn(
home() /
"LastDistributionFlavor" );
1899 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/LastDistributionFlavor" );
1905 std::string guessAnonymousUniqueId(
const Pathname & root_r )
1908 std::string ret( firstNonEmptyLineIn( root_r /
"/var/lib/zypp/AnonymousUniqueId" ) );
1909 if ( ret.
empty() && root_r !=
"/" )
1912 ret = firstNonEmptyLineIn(
"/var/lib/zypp/AnonymousUniqueId" );
1920 return guessAnonymousUniqueId(
root() );
1925 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.
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.
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.
String matching (STRING|SUBSTRING|GLOB|REGEX).
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.
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.
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.
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.
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'.
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
void initDatabase(Pathname root_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database at /var/lib/rpm.
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.
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
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.
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
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)