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" )
756 sigMultiversionSpecChanged();
757 MIL <<
"Initialized target on " <<
_root << endl;
765 std::ifstream uuidprovider(
"/proc/sys/kernel/random/uuid" );
775 boost::function<
bool ()> condition,
776 boost::function<std::string ()> value )
778 std::string val = value();
786 MIL <<
"updating '" << filename <<
"' content." << endl;
790 std::ofstream filestr;
793 filestr.open( filename.
c_str() );
795 if ( filestr.good() )
831 WAR <<
"Can't create anonymous id file" << endl;
840 Pathname flavorpath(
home() /
"LastDistributionFlavor");
846 WAR <<
"No base product, I won't create flavor cache" << endl;
850 std::string flavor = p->flavor();
862 WAR <<
"Can't create flavor cache" << endl;
875 sigMultiversionSpecChanged();
876 MIL <<
"Targets closed" << endl;
900 Pathname rpmsolvcookie = base/
"cookie";
902 bool build_rpm_solv =
true;
912 MIL <<
"Read cookie: " << cookie << endl;
917 if ( status == rpmstatus )
918 build_rpm_solv =
false;
919 MIL <<
"Read cookie: " << rpmsolvcookie <<
" says: " 920 << (build_rpm_solv ?
"outdated" :
"uptodate") << endl;
924 if ( build_rpm_solv )
938 bool switchingToTmpSolvfile =
false;
939 Exception ex(
"Failed to cache rpm database.");
945 rpmsolv = base/
"solv";
946 rpmsolvcookie = base/
"cookie";
953 WAR <<
"Using a temporary solv file at " << base << endl;
954 switchingToTmpSolvfile =
true;
963 if ( ! switchingToTmpSolvfile )
973 cmd.push_back(
"rpmdb2solv" );
975 cmd.push_back(
"-r" );
978 cmd.push_back(
"-X" );
980 cmd.push_back(
"-p" );
983 if ( ! oldSolvFile.
empty() )
984 cmd.push_back( oldSolvFile.
asString() );
986 cmd.push_back(
"-o" );
990 std::string errdetail;
993 WAR <<
" " << output;
994 if ( errdetail.empty() ) {
1001 int ret = prog.
close();
1022 if (
root() ==
"/" )
1033 if ( !
PathInfo(base/
"solv.idx").isExist() )
1036 return build_rpm_solv;
1054 MIL <<
"New cache built: " << (newCache?
"true":
"false") <<
1055 ", force loading: " << (force?
"true":
"false") << endl;
1060 MIL <<
"adding " << rpmsolv <<
" to pool(" << satpool.
systemRepoAlias() <<
")" << endl;
1067 if ( newCache || force )
1084 MIL <<
"adding " << rpmsolv <<
" to system" << endl;
1090 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1115 if (
PathInfo( historyFile ).isExist() )
1122 if ( onSystemByUser.find( ident ) == onSystemByUser.end() )
1123 onSystemByAuto.insert( ident );
1142 if (
PathInfo( needrebootFile ).isFile() )
1143 needrebootSpec.
parseFrom( needrebootFile );
1146 if (
PathInfo( needrebootDir ).isDir() )
1151 [&](
const Pathname & dir_r,
const char *
const str_r )->
bool 1153 if ( ! isRpmConfigBackup( str_r ) )
1155 Pathname needrebootFile { needrebootDir / str_r };
1156 if (
PathInfo( needrebootFile ).isFile() )
1157 needrebootSpec.
parseFrom( needrebootFile );
1168 if ( ! hardLocks.empty() )
1177 MIL <<
"Target loaded: " << system.
solvablesSize() <<
" resolvables" << endl;
1189 bool explicitDryRun = policy_r.
dryRun();
1199 if (
root() ==
"/" )
1209 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
")" << endl;
1228 steps.push_back( *it );
1235 MIL <<
"Todo: " << result << endl;
1245 if ( commitPlugins )
1246 commitPlugins.
send( transactionPluginFrame(
"COMMITBEGIN", steps ) );
1253 if ( ! policy_r.
dryRun() )
1259 DBG <<
"dryRun: Not writing upgrade testcase." << endl;
1266 if ( ! policy_r.
dryRun() )
1288 DBG <<
"dryRun: Not stroring non-package data." << endl;
1295 if ( ! policy_r.
dryRun() )
1297 for_( it, steps.begin(), steps.end() )
1299 if ( ! it->satSolvable().isKind<
Patch>() )
1307 if ( ! patch ||patch->message().empty() )
1310 MIL <<
"Show message for " << patch << endl;
1312 if ( !
report->show( patch ) )
1314 WAR <<
"commit aborted by the user" << endl;
1321 DBG <<
"dryRun: Not checking patch messages." << endl;
1340 for_( it, steps.begin(), steps.end() )
1342 switch ( it->stepType() )
1361 localfile = packageCache.
get( pi );
1364 catch (
const AbortRequestException & exp )
1368 WAR <<
"commit cache preload aborted by the user" << endl;
1372 catch (
const SkipRequestException & exp )
1377 WAR <<
"Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1387 INT <<
"Unexpected Error: Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1397 ERR <<
"Some packages could not be provided. Aborting commit."<< endl;
1401 if ( ! policy_r.
dryRun() )
1405 commit( policy_r, packageCache, result );
1409 DBG <<
"dryRun/downloadOnly: Not installing/deleting anything." << endl;
1410 if ( explicitDryRun ) {
1419 DBG <<
"dryRun: Not downloading/installing/deleting anything." << endl;
1420 if ( explicitDryRun ) {
1429 if ( commitPlugins )
1430 commitPlugins.
send( transactionPluginFrame(
"COMMITEND", steps ) );
1435 if ( ! policy_r.
dryRun() )
1440 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
") returns: " << result << endl;
1451 struct NotifyAttemptToModify
1469 MIL <<
"TargetImpl::commit(<list>" << policy_r <<
")" << steps.size() << endl;
1474 NotifyAttemptToModify attemptToModify( result_r );
1479 std::vector<sat::Solvable> successfullyInstalledPackages;
1482 for_( step, steps.begin(), steps.end() )
1504 localfile = packageCache_r.
get( citem );
1506 catch (
const AbortRequestException &e )
1508 WAR <<
"commit aborted by the user" << endl;
1513 catch (
const SkipRequestException &e )
1516 WAR <<
"Skipping package " << p <<
" in commit" << endl;
1525 INT <<
"Unexpected Error: Skipping package " << p <<
" in commit" << endl;
1530 #warning Exception handling 1535 bool success =
false;
1561 if ( progress.aborted() )
1563 WAR <<
"commit aborted by the user" << endl;
1572 auto rebootNeededFile =
root() /
"/var/run/reboot-needed";
1588 WAR <<
"dry run failed" << endl;
1593 if ( progress.aborted() )
1595 WAR <<
"commit aborted by the user" << endl;
1600 WAR <<
"Install failed" << endl;
1606 if ( success && !policy_r.
dryRun() )
1609 successfullyInstalledPackages.push_back( citem.
satSolvable() );
1618 bool success =
false;
1629 if ( progress.aborted() )
1631 WAR <<
"commit aborted by the user" << endl;
1645 if ( progress.aborted() )
1647 WAR <<
"commit aborted by the user" << endl;
1653 WAR <<
"removal of " << p <<
" failed";
1656 if ( success && !policy_r.
dryRun() )
1663 else if ( ! policy_r.
dryRun() )
1667 if ( ! citem.
buddy() )
1674 ERR <<
"Can't install orphan product without release-package! " << citem << endl;
1680 std::string referenceFilename( p->referenceFilename() );
1681 if ( referenceFilename.empty() )
1683 ERR <<
"Can't remove orphan product without 'referenceFilename'! " << citem << endl;
1687 Pathname referencePath {
Pathname(
"/etc/products.d") / referenceFilename };
1688 if ( !
rpm().hasFile( referencePath.asString() ) )
1693 ERR <<
"Delete orphan product failed: " << referencePath << endl;
1697 WAR <<
"Won't remove orphan product: '/etc/products.d/" << referenceFilename <<
"' is owned by a package." << endl;
1724 if ( ! successfullyInstalledPackages.empty() )
1727 successfullyInstalledPackages, abort ) )
1729 WAR <<
"Commit aborted by the user" << endl;
1735 successfullyInstalledPackages,
1742 logPatchStatusChanges( result_r.
transaction(), *this );
1771 if ( baseproduct.isFile() )
1784 ERR <<
"baseproduct symlink is dangling or missing: " << baseproduct << endl;
1789 inline Pathname staticGuessRoot(
const Pathname & root_r )
1791 if ( root_r.empty() )
1796 return Pathname(
"/");
1802 inline std::string firstNonEmptyLineIn(
const Pathname & file_r )
1804 std::ifstream idfile( file_r.c_str() );
1805 for( iostr::EachLine in( idfile ); in; in.next() )
1808 if ( ! line.empty() )
1811 return std::string();
1822 if ( p->isTargetDistribution() )
1830 const Pathname needroot( staticGuessRoot(root_r) );
1831 const Target_constPtr target( getZYpp()->getTarget() );
1832 if ( target && target->root() == needroot )
1833 return target->requestedLocales();
1839 MIL <<
"updateAutoInstalled if changed..." << endl;
1847 {
return baseproductdata(
_root ).registerTarget(); }
1850 {
return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); }
1853 {
return baseproductdata(
_root ).registerRelease(); }
1856 {
return baseproductdata( staticGuessRoot(root_r) ).registerRelease();}
1859 {
return baseproductdata(
_root ).registerFlavor(); }
1862 {
return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();}
1895 std::string
distributionVersion = baseproductdata( staticGuessRoot(root_r) ).edition().version();
1902 scoped_ptr<rpm::RpmDb> tmprpmdb;
1908 tmprpmdb->initDatabase( );
1925 return firstNonEmptyLineIn(
home() /
"LastDistributionFlavor" );
1930 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/LastDistributionFlavor" );
1936 std::string guessAnonymousUniqueId(
const Pathname & root_r )
1939 std::string ret( firstNonEmptyLineIn( root_r /
"/var/lib/zypp/AnonymousUniqueId" ) );
1940 if ( ret.
empty() && root_r !=
"/" )
1943 ret = firstNonEmptyLineIn(
"/var/lib/zypp/AnonymousUniqueId" );
1951 return guessAnonymousUniqueId(
root() );
1956 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.
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.
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.
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)