15 #include <rpm/rpmcli.h> 16 #include <rpm/rpmlog.h> 58 #define WARNINGMAILPATH "/var/log/YaST2/" 59 #define FILEFORBACKUPFILES "YaSTBackupModifiedFiles" 60 #define MAXRPMMESSAGELINES 10000 62 #define WORKAROUNDRPMPWDBUG 64 #undef ZYPP_BASE_LOGGER_LOGGROUP 65 #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb" 69 namespace zypp_readonly_hack
77 static bool val = [](){
78 const char * env = getenv(
"ZYPP_RPM_DEBUG");
93 #if 1 // No more need to escape whitespace since rpm-4.4.2.3 94 const char* quoteInFilename_m =
"\'\"";
96 const char* quoteInFilename_m =
" \t\'\"";
98 inline std::string rpmQuoteFilename(
const Pathname & path_r )
100 std::string path( path_r.
asString() );
102 pos != std::string::npos;
103 pos = path.find_first_of( quoteInFilename_m, pos ) )
105 path.insert( pos,
"\\" );
118 #if defined(WORKAROUNDRPMPWDBUG) 122 AutoDispose<char*> cwd( ::get_current_dir_name(), ::free );
125 WAR <<
"Can't get cwd!" << endl;
146 MIL <<
"trusted key added to zypp Keyring. Importing..." << endl;
147 _rpmdb.importPubkey( key );
152 MIL <<
"Trusted key removed from zypp Keyring. Removing..." << endl;
153 _rpmdb.removePubkey( key );
161 unsigned diffFiles(
const std::string file1,
const std::string file2, std::string& out,
int maxlines)
182 if (maxlines<0?
true:count<maxlines)
208 #define FAILIFNOTINITIALIZED if( ! initialized() ) { ZYPP_THROW(RpmDbNotOpenException()); } 219 : _backuppath (
"/var/adm/backup")
220 , _packagebackups(false)
227 setenv(
"RPM_IgnoreFailedSymlinks",
"1", 1 );
239 MIL <<
"~RpmDb()" << endl;
242 MIL <<
"~RpmDb() end" << endl;
268 bool quickinit( root_r.
empty() );
270 if ( root_r.
empty() )
281 ERR <<
"Illegal root or dbPath: " <<
stringPath( root_r, dbPath_r ) << endl;
285 if ( !
PathInfo( root_r/
"/var/lib/rpm" ).isExist()
286 &&
PathInfo( root_r/
"/usr/lib/sysimage/rpm" ).isDir() )
288 WAR <<
"Rpm package was deleted? Injecting missing rpmdb compat symlink." << endl;
292 MIL <<
"Calling initDatabase: " <<
stringPath( root_r, dbPath_r )
293 << ( doRebuild_r ?
" (rebuilddb)" :
"" )
294 << ( quickinit ?
" (quickinit)" :
"" ) << endl;
318 MIL <<
"QUICK initDatabase (no systemRoot set)" << endl;
340 MIL <<
"Synchronizing keys with zypp keyring" << endl;
349 MIL <<
"InitDatabase: " << *
this << endl;
365 MIL <<
"Calling closeDatabase: " << *
this << endl;
377 MIL <<
"closeDatabase: " << *
this << endl;
407 MIL <<
"RpmDb::rebuildDatabase" << *
this << endl;
421 opts.push_back(
"--rebuilddb");
422 opts.push_back(
"-vv");
432 tics.
range( hdrTotal );
443 static const std::string debugPrefix {
"D:" };
444 static const std::string progressPrefix {
"D: read h#" };
445 static const std::string ignoreSuffix {
"digest: OK" };
460 WAR <<
"User requested abort." << endl;
484 void computeKeyRingSync( std::set<Edition> & rpmKeys_r, std::list<PublicKeyData> & zyppKeys_r )
495 void updateIf(
const Edition & rpmKey_r )
497 std::string keyRelease( rpmKey_r.
release() );
498 int comp = _release.compare( keyRelease );
502 _release.swap( keyRelease );
503 _inRpmKeys = &rpmKey_r;
504 _inZyppKeys =
nullptr;
505 if ( !keyRelease.empty() )
506 DBG <<
"Old key in Z: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
508 else if ( comp == 0 )
512 _inRpmKeys = &rpmKey_r;
516 DBG <<
"Old key in R: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
519 void updateIf(
const PublicKeyData & zyppKey_r )
521 std::string keyRelease( zyppKey_r.gpgPubkeyRelease() );
522 int comp = _release.compare( keyRelease );
526 _release.swap( keyRelease );
527 _inRpmKeys =
nullptr;
528 _inZyppKeys = &zyppKey_r;
529 if ( !keyRelease.empty() )
530 DBG <<
"Old key in R: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
532 else if ( comp == 0 )
536 _inZyppKeys = &zyppKey_r;
540 DBG <<
"Old key in Z: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
543 std::string _release;
544 const Edition * _inRpmKeys;
545 const PublicKeyData * _inZyppKeys;
550 std::map<std::string,Key> _keymap;
552 for_( it, rpmKeys_r.begin(), rpmKeys_r.end() )
554 _keymap[(*it).version()].updateIf( *it );
557 for_( it, zyppKeys_r.begin(), zyppKeys_r.end() )
559 _keymap[(*it).gpgPubkeyVersion()].updateIf( *it );
563 std::set<Edition> rpmKeys;
564 std::list<PublicKeyData> zyppKeys;
565 for_( it, _keymap.begin(), _keymap.end() )
567 DBG <<
"gpg-pubkey-" << (*it).first <<
"-" << (*it).second._release <<
" " 568 << ( (*it).second._inRpmKeys ?
"R" :
"_" )
569 << ( (*it).second._inZyppKeys ?
"Z" :
"_" ) << endl;
570 if ( ! (*it).second._inRpmKeys )
572 zyppKeys.push_back( *(*it).second._inZyppKeys );
574 if ( ! (*it).second._inZyppKeys )
576 rpmKeys.insert( *(*it).second._inRpmKeys );
579 rpmKeys_r.swap( rpmKeys );
580 zyppKeys_r.swap( zyppKeys );
587 MIL <<
"Going to sync trusted keys..." << endl;
589 std::list<PublicKeyData> zyppKeys( getZYpp()->keyRing()->trustedPublicKeyData() );
601 MIL <<
"Removing excess keys in zypp trusted keyring" << std::endl;
607 if ( ! rpmKeys.count( keyData.gpgPubkeyEdition() ) )
609 DBG <<
"Excess key in Z to delete: gpg-pubkey-" << keyData.gpgPubkeyEdition() << endl;
610 getZYpp()->keyRing()->deleteKey( keyData.id(), true );
611 if ( !dirty ) dirty =
true;
615 zyppKeys = getZYpp()->keyRing()->trustedPublicKeyData();
618 computeKeyRingSync( rpmKeys, zyppKeys );
619 MIL << (mode_r &
SYNC_TO_KEYRING ?
"" :
"(skip) ") <<
"Rpm keys to export into zypp trusted keyring: " << rpmKeys.size() << endl;
620 MIL << (mode_r &
SYNC_FROM_KEYRING ?
"" :
"(skip) ") <<
"Zypp trusted keys to import into rpm database: " << zyppKeys.size() << endl;
626 MIL <<
"Exporting rpm keyring into zypp trusted keyring" <<endl;
631 TmpFile tmpfile( getZYpp()->tmpPath() );
633 std::ofstream tmpos( tmpfile.
path().
c_str() );
634 for_( it, rpmKeys.begin(), rpmKeys.end() )
638 getData(
"gpg-pubkey", *it, result );
639 tmpos << result->tag_description() << endl;
644 getZYpp()->keyRing()->multiKeyImport( tmpfile.
path(),
true );
648 std::set<Edition> missingKeys;
649 for (
const Edition & key : rpmKeys )
651 if ( getZYpp()->keyRing()->isKeyTrusted( key.version() ) )
653 ERR <<
"Could not import key:" <<
str::Format(
"gpg-pubkey-%s") % key <<
" into zypp keyring (V3 key?)" << endl;
654 missingKeys.insert( key );
656 if ( ! missingKeys.empty() )
662 ERR <<
"Could not import keys into zypp keyring: " << endl;
670 MIL <<
"Importing zypp trusted keyring" << std::endl;
671 for_( it, zyppKeys.begin(), zyppKeys.end() )
675 importPubkey( getZYpp()->keyRing()->exportTrustedPublicKey( *it ) );
683 MIL <<
"Trusted keys synced." << endl;
705 WAR <<
"Key " << pubkey_r <<
" can not be imported. (READONLY MODE)" << endl;
712 bool hasOldkeys =
false;
714 for_( it, rpmKeys.begin(), rpmKeys.end() )
723 MIL <<
"Key " << pubkey_r <<
" is already in the rpm trusted keyring. (skip import)" << endl;
727 if ( keyEd.version() != (*it).version() )
730 if ( keyEd.release() < (*it).release() )
732 MIL <<
"Key " << pubkey_r <<
" is older than one in the rpm trusted keyring. (skip import)" << endl;
740 MIL <<
"Key " << pubkey_r <<
" will be imported into the rpm trusted keyring." << (hasOldkeys?
"(update)":
"(new)") << endl;
746 std::string keyName(
"gpg-pubkey-" + keyEd.version() );
748 opts.push_back (
"-e" );
749 opts.push_back (
"--allmatches" );
750 opts.push_back (
"--" );
751 opts.push_back ( keyName.c_str() );
762 ERR <<
"Failed to remove key " << pubkey_r <<
" from RPM trusted keyring (ignored)" << endl;
766 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
772 opts.push_back (
"--import" );
773 opts.push_back (
"--" );
775 opts.push_back ( pubkeypath.c_str() );
779 std::vector<std::string> excplines;
785 excplines.push_back( std::move(line) );
801 MIL <<
"Key " << pubkey_r <<
" imported in rpm trusted keyring." << endl;
818 std::set<Edition>::const_iterator found_edition = rpm_keys.end();
821 for_( it, rpm_keys.begin(), rpm_keys.end() )
823 if ( (*it).version() == pubkeyVersion )
831 if (found_edition == rpm_keys.end())
833 WAR <<
"Key " << pubkey_r.
id() <<
" is not in rpm db" << endl;
837 std::string rpm_name(
"gpg-pubkey-" + found_edition->asString());
840 opts.push_back (
"-e" );
841 opts.push_back (
"--" );
842 opts.push_back ( rpm_name.c_str() );
846 std::vector<std::string> excplines;
852 excplines.push_back( std::move(line) );
868 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
880 std::list<PublicKey> ret;
883 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
885 Edition edition = it->tag_edition();
890 getData(
"gpg-pubkey", edition, result );
891 TmpFile file(getZYpp()->tmpPath());
897 os << result->tag_description();
906 catch ( std::exception & e )
908 ERR <<
"Could not dump key " << edition.
asString() <<
" in tmp file " << file.
path() << endl;
918 std::set<Edition> ret;
921 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
923 Edition edition = it->tag_edition();
925 ret.insert( edition );
942 std::list<FileInfo> result;
969 bool RpmDb::hasFile(
const std::string & file_r,
const std::string & name_r )
const 979 res = (it->tag_name() == name_r);
1000 return it->tag_name();
1114 struct RpmlogCapture :
public std::string
1117 { rpmlog()._cap =
this; }
1120 { rpmlog()._cap =
nullptr; }
1128 rpmlogSetCallback( rpmLogCB,
this );
1129 rpmSetVerbosity( RPMLOG_INFO );
1130 _f = ::fopen(
"/dev/null",
"w");
1131 rpmlogSetFile(
_f );
1135 {
if (
_f ) ::fclose(
_f ); }
1137 static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
1138 {
return reinterpret_cast<Rpmlog*
>(data_r)->rpmLog( rec_r ); }
1140 int rpmLog( rpmlogRec rec_r )
1142 if (
_cap ) (*_cap) += rpmlogRecMessage( rec_r );
1143 return RPMLOG_DEFAULT;
1150 static Rpmlog & rpmlog()
1151 {
static Rpmlog _rpmlog;
return _rpmlog; }
1156 bool requireGPGSig_r,
1157 RpmDb::CheckPackageDetail & detail_r )
1160 if ( ! file.isFile() )
1162 ERR <<
"Not a file: " << file << endl;
1166 FD_t fd = ::Fopen( file.asString().c_str(),
"r.ufdio" );
1167 if ( fd == 0 || ::Ferror(fd) )
1169 ERR <<
"Can't open file for reading: " << file <<
" (" << ::Fstrerror(fd) <<
")" << endl;
1174 rpmts ts = ::rpmtsCreate();
1175 ::rpmtsSetRootDir( ts, root_r.
c_str() );
1176 ::rpmtsSetVSFlags( ts, RPMVSF_DEFAULT );
1178 rpmQVKArguments_s qva;
1179 memset( &qva, 0,
sizeof(rpmQVKArguments_s) );
1180 #ifdef HAVE_NO_RPMTSSETVFYFLAGS 1183 qva.qva_flags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
1185 ::rpmtsSetVfyFlags( ts, RPMVSF_DEFAULT );
1187 RpmlogCapture vresult;
1188 LocaleGuard guard( LC_ALL,
"C" );
1189 int res = ::rpmVerifySignatures( &qva, ts, fd, path_r.
basename().c_str() );
1202 std::vector<std::string> lines;
1203 str::split( vresult, std::back_inserter(lines),
"\n" );
1204 unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 };
1206 for (
unsigned i = 1; i < lines.size(); ++i )
1208 std::string & line( lines[i] );
1210 if ( line.find(
": OK" ) != std::string::npos )
1213 if ( line.find(
"Signature, key ID" ) == std::string::npos )
1216 else if ( line.find(
": NOKEY" ) != std::string::npos )
1218 else if ( line.find(
": BAD" ) != std::string::npos )
1220 else if ( line.find(
": UNKNOWN" ) != std::string::npos )
1222 else if ( line.find(
": NOTRUSTED" ) != std::string::npos )
1226 detail_r.push_back( RpmDb::CheckPackageDetail::value_type( lineres, std::move(line) ) );
1247 detail_r.push_back( RpmDb::CheckPackageDetail::value_type(
RpmDb::CHK_NOSIG, std::string(
" ")+
_(
"Package is not signed!") ) );
1248 if ( requireGPGSig_r )
1255 WAR << path_r <<
" (" << requireGPGSig_r <<
" -> " << ret <<
")" << 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);
1403 int inputfileFd = ::fileno( inputfile );
1409 FD_SET( inputfileFd, &rfds );
1416 int retval = select( inputfileFd+1, &rfds, NULL, NULL, &tv );
1420 ERR <<
"select error: " <<
strerror(errno) << endl;
1421 if ( errno != EINTR )
1427 static size_t linebuffer_size = 0;
1428 static char * linebuffer = 0;
1429 ssize_t nread =
getline( &linebuffer, &linebuffer_size, inputfile );
1432 if ( ::feof( inputfile ) )
1439 if ( linebuffer[nread-1] ==
'\n' )
1441 line += std::string( linebuffer, nread );
1444 if ( ! ::ferror( inputfile ) || ::feof( inputfile ) )
1447 L_DBG(
"RPM_DEBUG") << line << endl;
1451 clearerr( inputfile );
1500 void RpmDb::processConfigFiles(
const std::string& line,
const std::string& name,
const char* typemsg,
const char* difffailmsg,
const char* diffgenmsg)
1502 std::string msg = line.substr(9);
1505 std::string file1s, file2s;
1509 pos1 = msg.find (typemsg);
1512 if ( pos1 == std::string::npos )
1515 pos2 = pos1 + strlen (typemsg);
1517 if (pos2 >= msg.length() )
1520 file1 = msg.substr (0, pos1);
1521 file2 = msg.substr (pos2);
1528 file1 =
_root + file1;
1529 file2 =
_root + file2;
1539 ERR <<
"Could not create " << file.
asString() << endl;
1543 std::ofstream notify(file.
asString().c_str(), std::ios::out|std::ios::app);
1546 ERR <<
"Could not open " << file << endl;
1552 notify <<
str::form(
_(
"Changed configuration files for %s:"), name.c_str()) << endl;
1555 ERR <<
"diff failed" << endl;
1557 file1s.c_str(), file2s.c_str()) << endl;
1562 file1s.c_str(), file2s.c_str()) << endl;
1567 if (out.substr(0,4) ==
"--- ")
1569 out.replace(4, file1.
asString().length(), file1s);
1572 if (pos != std::string::npos)
1574 out.replace(pos+5, file2.
asString().length(), file2s);
1577 notify << out << endl;
1580 notify.open(
"/var/lib/update-messages/yast2-packagemanager.rpmdb.configfiles");
1585 WAR <<
"rpm created " << file2 <<
" but it is not different from " << file2 << endl;
1616 report->finish( excpt_r );
1632 MIL <<
"RpmDb::installPackage(" << filename <<
"," << flags <<
")" << endl;
1641 ERR <<
"backup of " << filename.
asString() <<
" failed" << endl;
1650 opts.push_back(
"-i");
1652 opts.push_back(
"-U");
1654 opts.push_back(
"--percent");
1655 opts.push_back(
"--noglob");
1659 opts.push_back(
"--ignorearch");
1662 opts.push_back(
"--nodigest");
1664 opts.push_back(
"--nosignature");
1666 opts.push_back (
"--excludedocs");
1668 opts.push_back (
"--noscripts");
1670 opts.push_back (
"--force");
1672 opts.push_back (
"--nodeps");
1674 opts.push_back (
"--ignoresize");
1676 opts.push_back (
"--justdb");
1678 opts.push_back (
"--test");
1680 opts.push_back (
"--noposttrans");
1682 opts.push_back(
"--");
1685 std::string quotedFilename( rpmQuoteFilename( workaroundRpmPwdBug( filename ) ) );
1686 opts.push_back ( quotedFilename.c_str() );
1691 unsigned lineno = 0;
1694 cmdout.
set(
"line", std::cref(line) );
1695 cmdout.
set(
"lineno", lineno );
1699 std::vector<std::string> configwarnings;
1706 sscanf( line.c_str() + 2,
"%d", &percent );
1707 report->progress( percent );
1711 cmdout.
set(
"lineno", lineno );
1712 report->report( cmdout );
1715 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1719 rpmmsg += line+
'\n';
1722 configwarnings.push_back(line);
1725 rpmmsg +=
"[truncated]\n";
1730 for (std::vector<std::string>::iterator it = configwarnings.begin();
1731 it != configwarnings.end(); ++it)
1735 _(
"rpm saved %s as %s, but it was impossible to determine the difference"),
1737 _(
"rpm saved %s as %s.\nHere are the first 25 lines of difference:\n"));
1740 _(
"rpm created %s as %s, but it was impossible to determine the difference"),
1742 _(
"rpm created %s as %s.\nHere are the first 25 lines of difference:\n"));
1745 if ( rpm_status != 0 )
1750 std::ostringstream sstr;
1751 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1752 historylog.
comment(sstr.str());
1756 else if ( ! rpmmsg.empty() )
1761 std::ostringstream sstr;
1762 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1763 historylog.
comment(sstr.str());
1767 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1781 +
"-" + package->edition().version()
1782 +
"-" + package->edition().release()
1783 +
"." + package->arch().asString(), flags );
1811 report->finish( excpt_r );
1828 MIL <<
"RpmDb::doRemovePackage(" << name_r <<
"," << flags <<
")" << endl;
1837 ERR <<
"backup of " << name_r <<
" failed" << endl;
1848 opts.push_back(
"-e");
1849 opts.push_back(
"--allmatches");
1852 opts.push_back(
"--noscripts");
1854 opts.push_back(
"--nodeps");
1856 opts.push_back(
"--justdb");
1858 opts.push_back (
"--test");
1861 WAR <<
"IGNORE OPTION: 'rpm -e' does not support '--force'" << endl;
1864 opts.push_back(
"--");
1865 opts.push_back(name_r.c_str());
1870 unsigned lineno = 0;
1873 cmdout.
set(
"line", std::cref(line) );
1874 cmdout.
set(
"lineno", lineno );
1888 cmdout.
set(
"lineno", lineno );
1889 report->report( cmdout );
1892 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1895 rpmmsg += line+
'\n';
1898 rpmmsg +=
"[truncated]\n";
1902 if ( rpm_status != 0 )
1905 str::form(
"%s remove failed", name_r.c_str()),
true );
1906 std::ostringstream sstr;
1907 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1908 historylog.
comment(sstr.str());
1912 else if ( ! rpmmsg.empty() )
1915 str::form(
"%s removed ok", name_r.c_str()),
true );
1917 std::ostringstream sstr;
1918 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1919 historylog.
comment(sstr.str());
1923 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1957 INT <<
"_backuppath empty" << endl;
1965 ERR <<
"Error while getting changed files for package " <<
1966 packageName << endl;
1972 DBG <<
"package " << packageName <<
" not changed -> no backup" << endl;
1984 struct tm *currentLocalTime = localtime(&
currentTime);
1986 int date = (currentLocalTime->tm_year + 1900) * 10000
1987 + (currentLocalTime->tm_mon + 1) * 100
1988 + currentLocalTime->tm_mday;
1994 +
str::form(
"%s-%d-%d.tar.gz",packageName.c_str(), date, num);
2002 ERR << filestobackupfile.
asString() <<
" already exists and is no file" << endl;
2006 std::ofstream fp ( filestobackupfile.
asString().c_str(), std::ios::out|std::ios::trunc );
2010 ERR <<
"could not open " << filestobackupfile.
asString() << endl;
2014 for (FileList::const_iterator cit =
fileList.begin();
2017 std::string name = *cit;
2018 if ( name[0] ==
'/' )
2021 name = name.substr( 1 );
2023 DBG <<
"saving file "<< name << endl;
2028 const char*
const argv[] =
2034 "--ignore-failed-read",
2038 filestobackupfile.
asString().c_str(),
2054 int ret = tar.
close();
2058 ERR <<
"tar failed: " << tarmsg << endl;
2063 MIL <<
"tar backup ok" << endl;
2084 #define OUTS(E,S) case RpmDb::E: return str << "["<< (unsigned)obj << "-"<< S << "]"; break 2086 OUTS( CHK_OK,
_(
"Signature is OK") );
2088 OUTS( CHK_NOTFOUND,
_(
"Unknown type of signature") );
2090 OUTS( CHK_FAIL,
_(
"Signature does not verify") );
2092 OUTS( CHK_NOTTRUSTED,
_(
"Signature is OK, but key is not trusted") );
2094 OUTS( CHK_NOKEY,
_(
"Signatures public key is not available") );
2096 OUTS( CHK_ERROR,
_(
"File does not exist or signature can't be checked") );
2098 OUTS( CHK_NOSIG,
_(
"File is unsigned") );
2106 for (
const auto & el : obj )
2107 str << el.second << endl;
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
Interface to the rpm program.
unsigned diffFiles(const std::string file1, const std::string file2, std::string &out, int maxlines)
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 hasRequiredBy(const std::string &tag_r) const
Return true if at least one package requires a certain tag.
zypp::ContentType ContentType
static unsigned blockAccess()
Blocks further access to rpmdb.
void getData(const std::string &name_r, RpmHeader::constPtr &result_r) const
Get an installed packages data from rpmdb.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
virtual void trustedKeyAdded(const PublicKey &key)
bool kill()
Kill the program.
static ZConfig & instance()
Singleton ctor.
Pathname _root
Root directory for all operations.
bool findByProvides(const std::string &tag_r)
Reset to iterate all packages that provide a certain tag.
Class representing one GPG Public Keys data.
void exportTrustedKeysInZyppKeyRing()
insert all rpm trusted keys into zypp trusted keyring
static void dbAccess()
Access the database at the current default location.
void rebuildDatabase()
Rebuild the rpm database (rpm –rebuilddb).
void installPackage(const Pathname &filename, RpmInstFlags flags=RPMINST_NONE)
install rpm package
std::ostream & operator<<(std::ostream &str, const librpmDb::db_const_iterator &obj)
const char * c_str() const
String representation.
String related utilities and Regular expression matching.
bool toMax()
Set counter value to current max value (unless no range).
bool findByRequiredBy(const std::string &tag_r)
Reset to iterate all packages that require a certain tag.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Edition represents [epoch:]version[-release]
bool running()
Return whether program is running.
std::string receiveLine()
Read one line from the input stream.
bool hasSubkeys() const
!<
std::string basename() const
Return the last component of this path.
Provide a new empty temporary file and delete it when no longer needed.
void importZyppKeyRingTrustedKeys()
iterates through zypp keyring and import all non existant keys into rpm keyring
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
bool backupPackage(const std::string &packageName)
create tar.gz of all changed files in a Package
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, like 'rpm -K')
#define FILEFORBACKUPFILES
void range(value_type max_r)
Set new [0,max].
Subclass to retrieve database content.
Temporarily connect a ReceiveReport then restore the previous one.
void importPubkey(const PublicKey &pubkey_r)
Import ascii armored public key in file pubkey_r.
Assign a vaiable a certain value when going out of scope.
bool hasPackage(const std::string &name_r) const
Return true if package is installed.
void systemKill()
Forcably kill the system process.
bool empty() const
Test for an empty path.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
void moveToHistory(TContainer &&msgc_r)
addHistory from string container types (oldest first) moving
bool toMin()
Set counter value to current min value.
void syncTrustedKeys(SyncTrustedKeyBits mode_r=SYNC_BOTH)
Sync trusted keys stored in rpm database and zypp trusted keyring.
#define FAILIFNOTINITIALIZED
std::string getline(std::istream &str)
Read one line from stream.
Store and operate on date (time_t).
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \, const Trim trim_r=NO_TRIM)
Split line_r into words.
const std::string & execError() const
Some detail telling why the execution failed, if it failed.
Pathname _backuppath
/var/adm/backup
std::string version() const
Version.
shared_ptr< RpmException > dbError() const
Return any database error.
std::string form(const std::string &format_r) const
Return string representation according to format as localtime.
std::string asString() const
int exit_code
The exit code of the rpm process, or -1 if not yet known.
std::list< PublicKey > pubkeys() const
Return the long ids of all installed public keys.
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
int unlink(const Pathname &path)
Like 'unlink'.
bool set(const std::string &key_r, AnyType val_r)
Set the value for key (nonconst version always returns true).
std::string gpgPubkeyVersion() const
SyncTrustedKeyBits
Sync mode for syncTrustedKeys.
bool systemReadLine(std::string &line)
Read a line from the general rpm query.
const std::string & asString() const
String representation.
int systemStatus()
Return the exit status of the general rpm process, closing the connection if not already done...
std::set< Edition > pubkeyEditions() const
Return the edition of all installed public keys.
bool isExist() const
Return whether valid stat info exists.
static const Pathname & defaultDbPath()
bool findByName(const std::string &name_r)
Reset to iterate all packages with a certain name.
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
std::string release() const
Release.
Detailed rpm signature check log messages A single multiline message if CHK_OK.
virtual std::ostream & dumpOn(std::ostream &str) const
Dump debug info.
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
Types and functions for filesystem operations.
static unsigned dbRelease(bool force_r=false)
If there are no outstanding references to the database (e.g.
static shared_ptr< KeyRingSignalReceiver > sKeyRingReceiver
Maintain [min,max] and counter (value) for progress counting.
ExternalProgram * process
The connection to the rpm process.
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
void doRebuildDatabase(callback::SendReport< RebuildDBReport > &report)
bool incr(value_type val_r=1)
Increment counter value (default by 1).
void initDatabase(Pathname root_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database at /var/lib/rpm.
bool absolute() const
Test for an absolute path.
int symlink(const Pathname &oldpath, const Pathname &newpath)
Like 'symlink'.
bool findByFile(const std::string &file_r)
Reset to iterate all packages that own a certain file.
void closeDatabase()
Block further access to the rpm database and go back to uninitialized state.
Stderr_Disposition
Define symbols for different policies on the handling of stderr.
bool hasProvides(const std::string &tag_r) const
Return true if at least one package provides a certain tag.
Just inherits Exception to separate media exceptions.
bool endsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasSuffix
std::string numstring(char n, int w=0)
static const UserData::ContentType contentRpmout
"rpmout/installpkg": Additional rpm output (sent immediately).
import zypp trusted keys into rpm database.
virtual void trustedKeyRemoved(const PublicKey &key)
bool findPackage(const std::string &name_r)
Find package by name.
static void unblockAccess()
Allow access to rpmdb e.g.
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
void doInstallPackage(const Pathname &filename, RpmInstFlags flags, callback::SendReport< RpmInstallReport > &report)
int close()
Wait for the progamm to complete.
void removePubkey(const PublicKey &pubkey_r)
Remove a public key from the rpm database.
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"
bool _packagebackups
create package backups?
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
std::string gpgPubkeyRelease() const
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
void doRemovePackage(const std::string &name_r, RpmInstFlags flags, callback::SendReport< RpmRemoveReport > &report)
Base class for Exception.
void setBackupPath(const Pathname &path)
set path where package backups are stored
const Pathname & root() const
bool hasConflicts(const std::string &tag_r) const
Return true if at least one package conflicts with a certain tag.
Pathname path() const
File containig the ASCII armored key.
const Pathname & dbPath() const
static Date now()
Return the current time.
std::string error_message
Error message from running rpm as external program.
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 removePackage(const std::string &name_r, RpmInstFlags flags=RPMINST_NONE)
remove rpm package
static bool globalInit()
Initialize lib librpm (read configfiles etc.).
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 != Edition...
Typesafe passing of user data via callbacks.
std::string asString() const
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
bool relative() const
Test for a relative path.
value_type reportValue() const
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).
bool findByConflicts(const std::string &tag_r)
Reset to iterate all packages that conflict with a certain tag.
Wrapper class for ::stat/::lstat.
void setBlocking(bool mode)
Set the blocking mode of the input stream.
static const UserData::ContentType contentRpmout
"rpmout/removepkg": Additional rpm output (sent immediately).
CheckPackageResult
checkPackage result
std::string stringPath(const Pathname &root_r, const Pathname &sub_r)
bool queryChangedFiles(FileList &fileList, const std::string &packageName)
determine which files of an installed package have been modified.
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...
FILE * inputFile() const
Return the input stream.
std::string strerror(int errno_r)
Return string describing the error_r code.
Easy-to use interface to the ZYPP dependency resolver.
void run_rpm(const RpmArgVec &options, ExternalProgram::Stderr_Disposition stderr_disp=ExternalProgram::Stderr_To_Stdout)
Run rpm with the specified arguments and handle stderr.
export rpm trusted keys into zypp trusted keyring
KeyRingSignalReceiver(RpmDb &rpmdb)
TraitsType::constPtrType constPtr
#define MAXRPMMESSAGELINES
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
Pathname _dbPath
Directory that contains the rpmdb.
std::set< std::string > FileList
std::vector< const char * > RpmArgVec