15 #include <rpm/rpmcli.h>
16 #include <rpm/rpmlog.h>
59 #define WARNINGMAILPATH "/var/log/YaST2/"
60 #define FILEFORBACKUPFILES "YaSTBackupModifiedFiles"
61 #define MAXRPMMESSAGELINES 10000
63 #define WORKAROUNDRPMPWDBUG
65 #undef ZYPP_BASE_LOGGER_LOGGROUP
66 #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb"
70 namespace zypp_readonly_hack
78 static bool val = [](){
79 const char * env = getenv(
"ZYPP_RPM_DEBUG");
95 const char* quoteInFilename_m =
"\'\"";
97 const char* quoteInFilename_m =
" \t\'\"";
99 inline std::string rpmQuoteFilename(
const Pathname & path_r )
101 std::string path( path_r.
asString() );
103 pos != std::string::npos;
104 pos = path.find_first_of( quoteInFilename_m, pos ) )
106 path.insert( pos,
"\\" );
119 #if defined(WORKAROUNDRPMPWDBUG)
123 AutoDispose<char*> cwd( ::get_current_dir_name(), ::free );
126 WAR <<
"Can't get cwd!" << endl;
147 MIL <<
"trusted key added to zypp Keyring. Importing..." << endl;
153 MIL <<
"Trusted key removed from zypp Keyring. Removing..." << endl;
162 unsigned diffFiles(
const std::string file1,
const std::string file2, std::string& out,
int maxlines)
183 if (maxlines<0?
true:count<maxlines)
209 #define FAILIFNOTINITIALIZED if( ! initialized() ) { ZYPP_THROW(RpmDbNotOpenException()); }
220 : _backuppath (
"/var/adm/backup")
221 , _packagebackups(false)
228 setenv(
"RPM_IgnoreFailedSymlinks",
"1", 1 );
240 MIL <<
"~RpmDb()" << endl;
243 MIL <<
"~RpmDb() end" << endl;
269 bool quickinit( root_r.
empty() );
271 if ( root_r.
empty() )
279 if ( dbPath_r !=
"/var/lib/rpm" && !
PathInfo( root_r/
"/var/lib/rpm" ).isExist() )
281 WAR <<
"Inject missing /var/lib/rpm compat symlink to " << dbPath_r << endl;
295 if ( root_r ==
_root ) {
303 MIL <<
"Calling initDatabase: " <<
stringPath( root_r, dbPath_r )
304 << ( doRebuild_r ?
" (rebuilddb)" :
"" )
305 << ( quickinit ?
" (quickinit)" :
"" ) << endl;
314 MIL <<
"QUICK initDatabase (no systemRoot set)" << endl;
336 MIL <<
"Synchronizing keys with zypp keyring" << endl;
345 MIL <<
"InitDatabase: " << *
this << endl;
361 MIL <<
"Calling closeDatabase: " << *
this << endl;
373 MIL <<
"closeDatabase: " << *
this << endl;
403 MIL <<
"RpmDb::rebuildDatabase" << *
this << endl;
417 opts.push_back(
"--rebuilddb");
418 opts.push_back(
"-vv");
428 tics.
range( hdrTotal );
439 static const std::string debugPrefix {
"D:" };
440 static const std::string progressPrefix {
"D: read h#" };
441 static const std::string ignoreSuffix {
"digest: OK" };
456 WAR <<
"User requested abort." << endl;
480 void computeKeyRingSync( std::set<Edition> & rpmKeys_r, std::list<PublicKeyData> & zyppKeys_r )
491 void updateIf(
const Edition & rpmKey_r )
493 std::string keyRelease( rpmKey_r.
release() );
494 int comp = _release.compare( keyRelease );
498 _release.swap( keyRelease );
499 _inRpmKeys = &rpmKey_r;
500 _inZyppKeys =
nullptr;
501 if ( !keyRelease.empty() )
502 DBG <<
"Old key in Z: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
504 else if ( comp == 0 )
508 _inRpmKeys = &rpmKey_r;
512 DBG <<
"Old key in R: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
515 void updateIf(
const PublicKeyData & zyppKey_r )
517 std::string keyRelease( zyppKey_r.gpgPubkeyRelease() );
518 int comp = _release.compare( keyRelease );
522 _release.swap( keyRelease );
523 _inRpmKeys =
nullptr;
524 _inZyppKeys = &zyppKey_r;
525 if ( !keyRelease.empty() )
526 DBG <<
"Old key in R: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
528 else if ( comp == 0 )
532 _inZyppKeys = &zyppKey_r;
536 DBG <<
"Old key in Z: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
539 std::string _release;
540 const Edition * _inRpmKeys;
541 const PublicKeyData * _inZyppKeys;
546 std::map<std::string,Key> _keymap;
548 for_( it, rpmKeys_r.begin(), rpmKeys_r.end() )
550 _keymap[(*it).version()].updateIf( *it );
553 for_( it, zyppKeys_r.begin(), zyppKeys_r.end() )
555 _keymap[(*it).gpgPubkeyVersion()].updateIf( *it );
559 std::set<Edition> rpmKeys;
560 std::list<PublicKeyData> zyppKeys;
561 for_( it, _keymap.begin(), _keymap.end() )
563 DBG <<
"gpg-pubkey-" << (*it).first <<
"-" << (*it).second._release <<
" "
564 << ( (*it).second._inRpmKeys ?
"R" :
"_" )
565 << ( (*it).second._inZyppKeys ?
"Z" :
"_" ) << endl;
566 if ( ! (*it).second._inRpmKeys )
568 zyppKeys.push_back( *(*it).second._inZyppKeys );
570 if ( ! (*it).second._inZyppKeys )
572 rpmKeys.insert( *(*it).second._inRpmKeys );
575 rpmKeys_r.swap( rpmKeys );
576 zyppKeys_r.swap( zyppKeys );
583 MIL <<
"Going to sync trusted keys..." << endl;
585 std::list<PublicKeyData> zyppKeys( getZYpp()->keyRing()->trustedPublicKeyData() );
597 MIL <<
"Removing excess keys in zypp trusted keyring" << std::endl;
603 if ( ! rpmKeys.count( keyData.gpgPubkeyEdition() ) )
605 DBG <<
"Excess key in Z to delete: gpg-pubkey-" << keyData.gpgPubkeyEdition() << endl;
606 getZYpp()->keyRing()->deleteKey( keyData.id(),
true );
607 if ( !dirty ) dirty =
true;
611 zyppKeys = getZYpp()->keyRing()->trustedPublicKeyData();
614 computeKeyRingSync( rpmKeys, zyppKeys );
615 MIL << (mode_r &
SYNC_TO_KEYRING ?
"" :
"(skip) ") <<
"Rpm keys to export into zypp trusted keyring: " << rpmKeys.size() << endl;
616 MIL << (mode_r &
SYNC_FROM_KEYRING ?
"" :
"(skip) ") <<
"Zypp trusted keys to import into rpm database: " << zyppKeys.size() << endl;
622 MIL <<
"Exporting rpm keyring into zypp trusted keyring" <<endl;
627 TmpFile tmpfile( getZYpp()->tmpPath() );
629 std::ofstream tmpos( tmpfile.
path().
c_str() );
630 for_( it, rpmKeys.begin(), rpmKeys.end() )
634 getData(
"gpg-pubkey", *it, result );
635 tmpos << result->tag_description() << endl;
640 getZYpp()->keyRing()->multiKeyImport( tmpfile.
path(),
true );
644 std::set<Edition> missingKeys;
645 for (
const Edition & key : rpmKeys )
647 if ( getZYpp()->keyRing()->isKeyTrusted( key.version() ) )
649 ERR <<
"Could not import key:" <<
str::Format(
"gpg-pubkey-%s") % key <<
" into zypp keyring (V3 key?)" << endl;
650 missingKeys.insert( key );
652 if ( ! missingKeys.empty() )
658 ERR <<
"Could not import keys into zypp keyring: " << endl;
666 MIL <<
"Importing zypp trusted keyring" << std::endl;
667 for_( it, zyppKeys.begin(), zyppKeys.end() )
671 importPubkey( getZYpp()->keyRing()->exportTrustedPublicKey( *it ) );
679 MIL <<
"Trusted keys synced." << endl;
701 WAR <<
"Key " << pubkey_r <<
" can not be imported. (READONLY MODE)" << endl;
708 bool hasOldkeys =
false;
710 for_( it, rpmKeys.begin(), rpmKeys.end() )
719 MIL <<
"Key " << pubkey_r <<
" is already in the rpm trusted keyring. (skip import)" << endl;
723 if ( keyEd.
version() != (*it).version() )
726 if ( keyEd.
release() < (*it).release() )
728 MIL <<
"Key " << pubkey_r <<
" is older than one in the rpm trusted keyring. (skip import)" << endl;
736 MIL <<
"Key " << pubkey_r <<
" will be imported into the rpm trusted keyring." << (hasOldkeys?
"(update)":
"(new)") << endl;
742 std::string keyName(
"gpg-pubkey-" + keyEd.
version() );
744 opts.push_back (
"-e" );
745 opts.push_back (
"--allmatches" );
746 opts.push_back (
"--" );
747 opts.push_back ( keyName.c_str() );
758 ERR <<
"Failed to remove key " << pubkey_r <<
" from RPM trusted keyring (ignored)" << endl;
762 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
768 opts.push_back (
"--import" );
769 opts.push_back (
"--" );
771 opts.push_back ( pubkeypath.c_str() );
775 std::vector<std::string> excplines;
781 excplines.push_back( std::move(line) );
797 MIL <<
"Key " << pubkey_r <<
" imported in rpm trusted keyring." << endl;
814 std::set<Edition>::const_iterator found_edition = rpm_keys.end();
817 for_( it, rpm_keys.begin(), rpm_keys.end() )
819 if ( (*it).version() == pubkeyVersion )
827 if (found_edition == rpm_keys.end())
829 WAR <<
"Key " << pubkey_r.
id() <<
" is not in rpm db" << endl;
833 std::string rpm_name(
"gpg-pubkey-" + found_edition->asString());
836 opts.push_back (
"-e" );
837 opts.push_back (
"--" );
838 opts.push_back ( rpm_name.c_str() );
842 std::vector<std::string> excplines;
848 excplines.push_back( std::move(line) );
864 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
876 std::list<PublicKey> ret;
879 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
881 Edition edition = it->tag_edition();
886 getData(
"gpg-pubkey", edition, result );
887 TmpFile file(getZYpp()->tmpPath());
893 os << result->tag_description();
902 catch ( std::exception & e )
904 ERR <<
"Could not dump key " << edition.
asString() <<
" in tmp file " << file.
path() << endl;
914 std::set<Edition> ret;
917 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
919 Edition edition = it->tag_edition();
921 ret.insert( edition );
938 std::list<FileInfo> result;
965 bool RpmDb::hasFile(
const std::string & file_r,
const std::string & name_r )
const
975 res = (it->tag_name() == name_r);
996 return it->tag_name();
1110 struct RpmlogCapture :
public std::string
1113 { rpmlog()._cap =
this; }
1116 { rpmlog()._cap =
nullptr; }
1124 rpmlogSetCallback( rpmLogCB,
this );
1125 rpmSetVerbosity( RPMLOG_INFO );
1126 _f = ::fopen(
"/dev/null",
"w");
1127 rpmlogSetFile(
_f );
1131 {
if (
_f ) ::fclose(
_f ); }
1133 static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
1134 {
return reinterpret_cast<Rpmlog*
>(data_r)->rpmLog( rec_r ); }
1136 int rpmLog( rpmlogRec rec_r )
1138 if (
_cap ) (*_cap) += rpmlogRecMessage( rec_r );
1139 return RPMLOG_DEFAULT;
1146 static Rpmlog & rpmlog()
1147 {
static Rpmlog _rpmlog;
return _rpmlog; }
1152 bool requireGPGSig_r,
1153 RpmDb::CheckPackageDetail & detail_r )
1156 if ( ! file.isFile() )
1158 ERR <<
"Not a file: " << file << endl;
1162 FD_t fd = ::Fopen( file.asString().c_str(),
"r.ufdio" );
1163 if ( fd == 0 || ::Ferror(fd) )
1165 ERR <<
"Can't open file for reading: " << file <<
" (" << ::Fstrerror(fd) <<
")" << endl;
1170 rpmts ts = ::rpmtsCreate();
1171 ::rpmtsSetRootDir( ts, root_r.
c_str() );
1172 ::rpmtsSetVSFlags( ts, RPMVSF_DEFAULT );
1174 rpmQVKArguments_s qva;
1175 memset( &qva, 0,
sizeof(rpmQVKArguments_s) );
1176 #ifdef HAVE_NO_RPMTSSETVFYFLAGS
1179 qva.qva_flags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
1181 ::rpmtsSetVfyFlags( ts, RPMVSF_DEFAULT );
1183 RpmlogCapture vresult;
1184 LocaleGuard guard( LC_ALL,
"C" );
1185 int res = ::rpmVerifySignatures( &qva, ts, fd, path_r.
basename().c_str() );
1198 std::vector<std::string> lines;
1199 str::split( vresult, std::back_inserter(lines),
"\n" );
1200 unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 };
1202 for (
unsigned i = 1; i < lines.size(); ++i )
1204 std::string & line( lines[i] );
1206 if ( line.find(
": OK" ) != std::string::npos )
1209 if ( line.find(
"Signature, key ID" ) == std::string::npos )
1212 else if ( line.find(
": NOKEY" ) != std::string::npos )
1214 else if ( line.find(
": BAD" ) != std::string::npos )
1216 else if ( line.find(
": UNKNOWN" ) != std::string::npos )
1218 else if ( line.find(
": NOTRUSTED" ) != std::string::npos )
1220 else if ( line.find(
": NOTFOUND" ) != std::string::npos )
1224 detail_r.push_back( RpmDb::CheckPackageDetail::value_type( lineres, std::move(line) ) );
1245 detail_r.push_back( RpmDb::CheckPackageDetail::value_type(
RpmDb::CHK_NOSIG, std::string(
" ")+
_(
"Package is not signed!") ) );
1246 if ( requireGPGSig_r )
1253 WAR << path_r <<
" (" << requireGPGSig_r <<
" -> " << ret <<
")" << endl;
1257 DBG << path_r <<
" [0-Signature is OK]" << endl;
1268 {
return doCheckPackageSig( path_r,
root(),
false, detail_r ); }
1274 {
return doCheckPackageSig( path_r,
root(),
true, detail_r ); }
1289 opts.push_back (
"-V");
1290 opts.push_back (
"--nodeps");
1291 opts.push_back (
"--noscripts");
1292 opts.push_back (
"--nomd5");
1293 opts.push_back (
"--");
1294 opts.push_back (packageName.c_str());
1315 if (line.length() > 12 &&
1316 (line[0] ==
'S' || line[0] ==
's' ||
1317 (line[0] ==
'.' && line[7] ==
'T')))
1320 std::string filename;
1322 filename.assign(line, 11, line.length() - 11);
1363 #if defined(WORKAROUNDRPMPWDBUG)
1364 args.push_back(
"#/");
1366 args.push_back(
"rpm");
1367 args.push_back(
"--root");
1369 args.push_back(
"--dbpath");
1372 args.push_back(
"-vv");
1373 const char* argv[args.size() + opts.size() + 1];
1375 const char** p = argv;
1376 p =
copy (args.begin (), args.end (), p);
1377 p =
copy (opts.begin (), opts.end (), p);
1407 const auto &readResult =
io::receiveUpto( inputfile,
'\n', 5 * 1000,
false );
1408 switch ( readResult.first ) {
1414 line += readResult.second;
1418 line += readResult.second;
1419 if ( line.size() && line.back() ==
'\n')
1424 line += readResult.second;
1426 if ( line.size() && line.back() ==
'\n')
1430 L_DBG(
"RPM_DEBUG") << line << endl;
1474 void RpmDb::processConfigFiles(
const std::string& line,
const std::string& name,
const char* typemsg,
const char* difffailmsg,
const char* diffgenmsg)
1476 std::string msg = line.substr(9);
1479 std::string file1s, file2s;
1483 pos1 = msg.find (typemsg);
1486 if ( pos1 == std::string::npos )
1489 pos2 = pos1 + strlen (typemsg);
1491 if (pos2 >= msg.length() )
1494 file1 = msg.substr (0, pos1);
1495 file2 = msg.substr (pos2);
1502 file1 =
_root + file1;
1503 file2 =
_root + file2;
1513 ERR <<
"Could not create " << file.
asString() << endl;
1517 std::ofstream notify(file.
asString().c_str(), std::ios::out|std::ios::app);
1520 ERR <<
"Could not open " << file << endl;
1526 notify <<
str::form(
_(
"Changed configuration files for %s:"), name.c_str()) << endl;
1529 ERR <<
"diff failed" << endl;
1531 file1s.c_str(), file2s.c_str()) << endl;
1536 file1s.c_str(), file2s.c_str()) << endl;
1541 if (out.substr(0,4) ==
"--- ")
1543 out.replace(4, file1.
asString().length(), file1s);
1546 if (pos != std::string::npos)
1548 out.replace(pos+5, file2.
asString().length(), file2s);
1551 notify << out << endl;
1554 notify.open(
"/var/lib/update-messages/yast2-packagemanager.rpmdb.configfiles");
1559 WAR <<
"rpm created " << file2 <<
" but it is not different from " << file2 << endl;
1590 report->finish( excpt_r );
1606 MIL <<
"RpmDb::installPackage(" << filename <<
"," << flags <<
")" << endl;
1615 ERR <<
"backup of " << filename.
asString() <<
" failed" << endl;
1624 opts.push_back(
"-i");
1626 opts.push_back(
"-U");
1628 opts.push_back(
"--percent");
1629 opts.push_back(
"--noglob");
1633 opts.push_back(
"--ignorearch");
1636 opts.push_back(
"--nodigest");
1638 opts.push_back(
"--nosignature");
1640 opts.push_back (
"--excludedocs");
1642 opts.push_back (
"--noscripts");
1644 opts.push_back (
"--force");
1646 opts.push_back (
"--nodeps");
1648 opts.push_back (
"--ignoresize");
1650 opts.push_back (
"--justdb");
1652 opts.push_back (
"--test");
1654 opts.push_back (
"--noposttrans");
1656 opts.push_back(
"--");
1659 std::string quotedFilename( rpmQuoteFilename( workaroundRpmPwdBug( filename ) ) );
1660 opts.push_back ( quotedFilename.c_str() );
1665 unsigned lineno = 0;
1668 cmdout.
set(
"line", std::cref(line) );
1669 cmdout.
set(
"lineno", lineno );
1673 std::vector<std::string> configwarnings;
1680 sscanf( line.c_str() + 2,
"%d", &percent );
1681 report->progress( percent );
1685 cmdout.
set(
"lineno", lineno );
1686 report->report( cmdout );
1689 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1693 rpmmsg += line+
'\n';
1696 configwarnings.push_back(line);
1699 rpmmsg +=
"[truncated]\n";
1704 for (std::vector<std::string>::iterator it = configwarnings.begin();
1705 it != configwarnings.end(); ++it)
1709 _(
"rpm saved %s as %s, but it was impossible to determine the difference"),
1711 _(
"rpm saved %s as %s.\nHere are the first 25 lines of difference:\n"));
1714 _(
"rpm created %s as %s, but it was impossible to determine the difference"),
1716 _(
"rpm created %s as %s.\nHere are the first 25 lines of difference:\n"));
1719 if ( rpm_status != 0 )
1724 std::ostringstream sstr;
1725 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1726 historylog.
comment(sstr.str());
1730 else if ( ! rpmmsg.empty() )
1735 std::ostringstream sstr;
1736 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1737 historylog.
comment(sstr.str());
1741 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1755 +
"-" + package->edition().version()
1756 +
"-" + package->edition().release()
1757 +
"." + package->arch().asString(), flags );
1785 report->finish( excpt_r );
1802 MIL <<
"RpmDb::doRemovePackage(" << name_r <<
"," << flags <<
")" << endl;
1811 ERR <<
"backup of " << name_r <<
" failed" << endl;
1822 opts.push_back(
"-e");
1823 opts.push_back(
"--allmatches");
1826 opts.push_back(
"--noscripts");
1828 opts.push_back(
"--nodeps");
1830 opts.push_back(
"--justdb");
1832 opts.push_back (
"--test");
1835 WAR <<
"IGNORE OPTION: 'rpm -e' does not support '--force'" << endl;
1838 opts.push_back(
"--");
1839 opts.push_back(name_r.c_str());
1844 unsigned lineno = 0;
1847 cmdout.
set(
"line", std::cref(line) );
1848 cmdout.
set(
"lineno", lineno );
1862 cmdout.
set(
"lineno", lineno );
1863 report->report( cmdout );
1866 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1869 rpmmsg += line+
'\n';
1872 rpmmsg +=
"[truncated]\n";
1876 if ( rpm_status != 0 )
1879 str::form(
"%s remove failed", name_r.c_str()),
true );
1880 std::ostringstream sstr;
1881 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1882 historylog.
comment(sstr.str());
1886 else if ( ! rpmmsg.empty() )
1889 str::form(
"%s removed ok", name_r.c_str()),
true );
1891 std::ostringstream sstr;
1892 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1893 historylog.
comment(sstr.str());
1897 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1931 INT <<
"_backuppath empty" << endl;
1939 ERR <<
"Error while getting changed files for package " <<
1940 packageName << endl;
1946 DBG <<
"package " << packageName <<
" not changed -> no backup" << endl;
1958 struct tm *currentLocalTime = localtime(&
currentTime);
1960 int date = (currentLocalTime->tm_year + 1900) * 10000
1961 + (currentLocalTime->tm_mon + 1) * 100
1962 + currentLocalTime->tm_mday;
1968 +
str::form(
"%s-%d-%d.tar.gz",packageName.c_str(), date, num);
1971 while (
PathInfo(backupFilename).isExist() && num++ < 1000);
1976 ERR << filestobackupfile.
asString() <<
" already exists and is no file" << endl;
1980 std::ofstream fp ( filestobackupfile.
asString().c_str(), std::ios::out|std::ios::trunc );
1984 ERR <<
"could not open " << filestobackupfile.
asString() << endl;
1988 for (FileList::const_iterator cit =
fileList.begin();
1991 std::string name = *cit;
1992 if ( name[0] ==
'/' )
1995 name = name.substr( 1 );
1997 DBG <<
"saving file "<< name << endl;
2002 const char*
const argv[] =
2008 "--ignore-failed-read",
2012 filestobackupfile.
asString().c_str(),
2028 int ret = tar.
close();
2032 ERR <<
"tar failed: " << tarmsg << endl;
2037 MIL <<
"tar backup ok" << endl;
2058 #define OUTS(E,S) case RpmDb::E: return str << "["<< (unsigned)obj << "-"<< S << "]"; break
2060 OUTS( CHK_OK,
_(
"Signature is OK") );
2062 OUTS( CHK_NOTFOUND,
_(
"Unknown type of signature") );
2064 OUTS( CHK_FAIL,
_(
"Signature does not verify") );
2066 OUTS( CHK_NOTTRUSTED,
_(
"Signature is OK, but key is not trusted") );
2068 OUTS( CHK_NOKEY,
_(
"Signatures public key is not available") );
2070 OUTS( CHK_ERROR,
_(
"File does not exist or signature can't be checked") );
2072 OUTS( CHK_NOSIG,
_(
"File is unsigned") );
2080 for (
const auto & el : obj )
2081 str << el.second << endl;
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
#define MAXRPMMESSAGELINES
#define FAILIFNOTINITIALIZED
#define FILEFORBACKUPFILES
Store and operate on date (time_t).
std::string form(const std::string &format_r) const
Return string representation according to format as localtime.
static Date now()
Return the current time.
Assign a vaiable a certain value when going out of scope.
Edition represents [epoch:]version[-release]
std::string version() const
Version.
std::string release() const
Release.
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
Base class for Exception.
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
void addHistory(const std::string &msg_r)
Add some message text to the history.
void moveToHistory(TContainer &&msgc_r)
addHistory from string container types (oldest first) moving
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
const std::string & execError() const
Some detail telling why the execution failed, if it failed.
bool kill()
Kill the program.
bool running()
Return whether program is running.
int close()
Wait for the progamm to complete.
Stderr_Disposition
Define symbols for different policies on the handling of stderr.
Writing the zypp history file.
void comment(const std::string &comment, bool timestamp=false)
Log a comment (even multiline).
std::string asString() const
TraitsType::constPtrType constPtr
Maintain [min,max] and counter (value) for progress counting.
value_type reportValue() const
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
bool toMax()
Set counter value to current max value (unless no range).
bool incr(value_type val_r=1)
Increment counter value (default by 1).
bool toMin()
Set counter value to current min value.
void range(value_type max_r)
Set new [0,max].
Class representing one GPG Public Keys data.
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Pathname path() const
File containig the ASCII armored key.
std::string gpgPubkeyRelease() const
std::string asString() const
std::string gpgPubkeyVersion() const
bool hasSubkeys() const
!<
static ZConfig & instance()
Singleton ctor.
Typesafe passing of user data via callbacks.
bool set(const std::string &key_r, AnyType val_r)
Set the value for key (nonconst version always returns true).
zypp::ContentType ContentType
FILE * inputFile() const
Return the input stream.
void setBlocking(bool mode)
Set the blocking mode of the input stream.
std::string receiveLine()
Read one line from the input stream.
Wrapper class for ::stat/::lstat.
bool isExist() const
Return whether valid stat info exists.
const std::string & asString() const
String representation.
std::string basename() const
Return the last component of this path.
bool empty() const
Test for an empty path.
const char * c_str() const
String representation.
bool relative() const
Test for a relative path.
Provide a new empty temporary file and delete it when no longer needed.
Interface to the rpm program.
void getData(const std::string &name_r, RpmHeader::constPtr &result_r) const
Get an installed packages data from rpmdb.
void doRebuildDatabase(callback::SendReport< RebuildDBReport > &report)
bool queryChangedFiles(FileList &fileList, const std::string &packageName)
determine which files of an installed package have been modified.
std::string error_message
Error message from running rpm as external program.
bool hasRequiredBy(const std::string &tag_r) const
Return true if at least one package requires a certain tag.
virtual std::ostream & dumpOn(std::ostream &str) const
Dump debug info.
std::string whoOwnsFile(const std::string &file_r) const
Return name of package owning file or empty string if no installed package owns file.
void exportTrustedKeysInZyppKeyRing()
insert all rpm trusted keys into zypp trusted keyring
void importPubkey(const PublicKey &pubkey_r)
Import ascii armored public key in file pubkey_r.
void installPackage(const Pathname &filename, RpmInstFlags flags=RPMINST_NONE)
install rpm package
Pathname _backuppath
/var/adm/backup
void run_rpm(const RpmArgVec &options, ExternalProgram::Stderr_Disposition stderr_disp=ExternalProgram::Stderr_To_Stdout)
Run rpm with the specified arguments and handle stderr.
void initDatabase(Pathname root_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database below root_r.
ExternalProgram * process
The connection to the rpm process.
SyncTrustedKeyBits
Sync mode for syncTrustedKeys.
@ SYNC_TO_KEYRING
export rpm trusted keys into zypp trusted keyring
@ SYNC_FROM_KEYRING
import zypp trusted keys into rpm database.
std::list< PublicKey > pubkeys() const
Return the long ids of all installed public keys.
std::set< Edition > pubkeyEditions() const
Return the edition of all installed public keys.
int systemStatus()
Return the exit status of the general rpm process, closing the connection if not already done.
CheckPackageResult checkPackageSignature(const Pathname &path_r, CheckPackageDetail &detail_r)
Check signature of rpm file on disk (strict check returning CHK_NOSIG if file is unsigned).
bool backupPackage(const std::string &packageName)
create tar.gz of all changed files in a Package
bool hasProvides(const std::string &tag_r) const
Return true if at least one package provides a certain tag.
void systemKill()
Forcably kill the system process.
void removePubkey(const PublicKey &pubkey_r)
Remove a public key from the rpm database.
void removePackage(const std::string &name_r, RpmInstFlags flags=RPMINST_NONE)
remove rpm package
void doInstallPackage(const Pathname &filename, RpmInstFlags flags, callback::SendReport< RpmInstallReport > &report)
std::list< FileInfo > fileList(const std::string &name_r, const Edition &edition_r) const
return complete file list for installed package name_r (in FileInfo.filename) if edition_r !...
Pathname _dbPath
Directory that contains the rpmdb.
void closeDatabase()
Block further access to the rpm database and go back to uninitialized state.
void setBackupPath(const Pathname &path)
set path where package backups are stored
void doRemovePackage(const std::string &name_r, RpmInstFlags flags, callback::SendReport< RpmRemoveReport > &report)
bool _packagebackups
create package backups?
CheckPackageResult checkPackage(const Pathname &path_r, CheckPackageDetail &detail_r)
Check signature of rpm file on disk (legacy version returning CHK_OK if file is unsigned,...
void importZyppKeyRingTrustedKeys()
iterates through zypp keyring and import all non existant keys into rpm keyring
Pathname _root
Root directory for all operations.
bool hasConflicts(const std::string &tag_r) const
Return true if at least one package conflicts with a certain tag.
const Pathname & dbPath() const
std::vector< const char * > RpmArgVec
int exit_code
The exit code of the rpm process, or -1 if not yet known.
void syncTrustedKeys(SyncTrustedKeyBits mode_r=SYNC_BOTH)
Sync trusted keys stored in rpm database and zypp trusted keyring.
void processConfigFiles(const std::string &line, const std::string &name, const char *typemsg, const char *difffailmsg, const char *diffgenmsg)
handle rpm messages like "/etc/testrc saved as /etc/testrc.rpmorig"
const Pathname & root() const
CheckPackageResult
checkPackage result
bool hasPackage(const std::string &name_r) const
Return true if package is installed.
std::set< std::string > FileList
bool systemReadLine(std::string &line)
Read a line from the general rpm query.
void rebuildDatabase()
Rebuild the rpm database (rpm –rebuilddb).
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 ...
Just inherits Exception to separate media exceptions.
Subclass to retrieve database content.
bool findByProvides(const std::string &tag_r)
Reset to iterate all packages that provide a certain tag.
bool findByName(const std::string &name_r)
Reset to iterate all packages with a certain name.
bool findByFile(const std::string &file_r)
Reset to iterate all packages that own a certain file.
bool findByRequiredBy(const std::string &tag_r)
Reset to iterate all packages that require a certain tag.
bool findPackage(const std::string &name_r)
Find package by name.
shared_ptr< RpmException > dbError() const
Return any database error.
bool findByConflicts(const std::string &tag_r)
Reset to iterate all packages that conflict with a certain tag.
static bool globalInit()
Initialize lib librpm (read configfiles etc.).
static std::string stringPath(const Pathname &root_r, const Pathname &sub_r)
static unsigned dbRelease(bool force_r=false)
If there are no outstanding references to the database (e.g.
static void dbAccess()
Access the database at the current default location.
static unsigned blockAccess()
Blocks further access to rpmdb.
static Pathname suggestedDbPath(const Pathname &root_r)
static void unblockAccess()
Allow access to rpmdb e.g.
String related utilities and Regular expression matching.
Types and functions for filesystem operations.
Pathname expandlink(const Pathname &path_r)
Recursively follows the symlink pointed to by path_r and returns the Pathname to the real file or dir...
int unlink(const Pathname &path)
Like 'unlink'.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
int symlink(const Pathname &oldpath, const Pathname &newpath)
Like 'symlink'.
std::pair< ReceiveUpToResult, std::string > receiveUpto(FILE *file, char c, timeout_type timeout, bool failOnUnblockError)
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
std::string numstring(char n, int w=0)
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
bool endsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasSuffix
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \t", const Trim trim_r=NO_TRIM)
Split line_r into words.
std::ostream & operator<<(std::ostream &str, const librpmDb::db_const_iterator &obj)
static shared_ptr< KeyRingSignalReceiver > sKeyRingReceiver
std::string stringPath(const Pathname &root_r, const Pathname &sub_r)
unsigned diffFiles(const std::string file1, const std::string file2, std::string &out, int maxlines)
Easy-to use interface to the ZYPP dependency resolver.
Temporarily connect a ReceiveReport then restore the previous one.
static const UserData::ContentType contentRpmout
"rpmout/installpkg": Additional rpm output (sent immediately).
virtual void trustedKeyRemoved(const PublicKey &key)
virtual void trustedKeyAdded(const PublicKey &key)
KeyRingSignalReceiver(RpmDb &rpmdb)
static const UserData::ContentType contentRpmout
"rpmout/removepkg": Additional rpm output (sent immediately).
Detailed rpm signature check log messages A single multiline message if CHK_OK.