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");
94 #if 1 // No more need to escape whitespace since rpm-4.4.2.3 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;
148 _rpmdb.importPubkey( key );
153 MIL <<
"Trusted key removed from zypp Keyring. Removing..." << endl;
154 _rpmdb.removePubkey( key );
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() )
282 ERR <<
"Illegal root or dbPath: " <<
stringPath( root_r, dbPath_r ) << endl;
286 if ( !
PathInfo( root_r/
"/var/lib/rpm" ).isExist()
287 &&
PathInfo( root_r/
"/usr/lib/sysimage/rpm" ).isDir() )
289 WAR <<
"Rpm package was deleted? Injecting missing rpmdb compat symlink." << endl;
293 MIL <<
"Calling initDatabase: " <<
stringPath( root_r, dbPath_r )
294 << ( doRebuild_r ?
" (rebuilddb)" :
"" )
295 << ( quickinit ?
" (quickinit)" :
"" ) << endl;
319 MIL <<
"QUICK initDatabase (no systemRoot set)" << endl;
341 MIL <<
"Synchronizing keys with zypp keyring" << endl;
350 MIL <<
"InitDatabase: " << *
this << endl;
366 MIL <<
"Calling closeDatabase: " << *
this << endl;
378 MIL <<
"closeDatabase: " << *
this << endl;
408 MIL <<
"RpmDb::rebuildDatabase" << *
this << endl;
422 opts.push_back(
"--rebuilddb");
423 opts.push_back(
"-vv");
433 tics.
range( hdrTotal );
444 static const std::string debugPrefix {
"D:" };
445 static const std::string progressPrefix {
"D: read h#" };
446 static const std::string ignoreSuffix {
"digest: OK" };
461 WAR <<
"User requested abort." << endl;
485 void computeKeyRingSync( std::set<Edition> & rpmKeys_r, std::list<PublicKeyData> & zyppKeys_r )
496 void updateIf(
const Edition & rpmKey_r )
498 std::string keyRelease( rpmKey_r.
release() );
499 int comp = _release.compare( keyRelease );
503 _release.swap( keyRelease );
504 _inRpmKeys = &rpmKey_r;
505 _inZyppKeys =
nullptr;
506 if ( !keyRelease.empty() )
507 DBG <<
"Old key in Z: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
509 else if ( comp == 0 )
513 _inRpmKeys = &rpmKey_r;
517 DBG <<
"Old key in R: gpg-pubkey-" << rpmKey_r.
version() <<
"-" << keyRelease << endl;
520 void updateIf(
const PublicKeyData & zyppKey_r )
522 std::string keyRelease( zyppKey_r.gpgPubkeyRelease() );
523 int comp = _release.compare( keyRelease );
527 _release.swap( keyRelease );
528 _inRpmKeys =
nullptr;
529 _inZyppKeys = &zyppKey_r;
530 if ( !keyRelease.empty() )
531 DBG <<
"Old key in R: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
533 else if ( comp == 0 )
537 _inZyppKeys = &zyppKey_r;
541 DBG <<
"Old key in Z: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() <<
"-" << keyRelease << endl;
544 std::string _release;
545 const Edition * _inRpmKeys;
546 const PublicKeyData * _inZyppKeys;
551 std::map<std::string,Key> _keymap;
553 for_( it, rpmKeys_r.begin(), rpmKeys_r.end() )
555 _keymap[(*it).version()].updateIf( *it );
558 for_( it, zyppKeys_r.begin(), zyppKeys_r.end() )
560 _keymap[(*it).gpgPubkeyVersion()].updateIf( *it );
564 std::set<Edition> rpmKeys;
565 std::list<PublicKeyData> zyppKeys;
566 for_( it, _keymap.begin(), _keymap.end() )
568 DBG <<
"gpg-pubkey-" << (*it).first <<
"-" << (*it).second._release <<
" " 569 << ( (*it).second._inRpmKeys ?
"R" :
"_" )
570 << ( (*it).second._inZyppKeys ?
"Z" :
"_" ) << endl;
571 if ( ! (*it).second._inRpmKeys )
573 zyppKeys.push_back( *(*it).second._inZyppKeys );
575 if ( ! (*it).second._inZyppKeys )
577 rpmKeys.insert( *(*it).second._inRpmKeys );
580 rpmKeys_r.swap( rpmKeys );
581 zyppKeys_r.swap( zyppKeys );
588 MIL <<
"Going to sync trusted keys..." << endl;
590 std::list<PublicKeyData> zyppKeys( getZYpp()->keyRing()->trustedPublicKeyData() );
602 MIL <<
"Removing excess keys in zypp trusted keyring" << std::endl;
608 if ( ! rpmKeys.count( keyData.gpgPubkeyEdition() ) )
610 DBG <<
"Excess key in Z to delete: gpg-pubkey-" << keyData.gpgPubkeyEdition() << endl;
611 getZYpp()->keyRing()->deleteKey( keyData.id(), true );
612 if ( !dirty ) dirty =
true;
616 zyppKeys = getZYpp()->keyRing()->trustedPublicKeyData();
619 computeKeyRingSync( rpmKeys, zyppKeys );
620 MIL << (mode_r &
SYNC_TO_KEYRING ?
"" :
"(skip) ") <<
"Rpm keys to export into zypp trusted keyring: " << rpmKeys.size() << endl;
621 MIL << (mode_r &
SYNC_FROM_KEYRING ?
"" :
"(skip) ") <<
"Zypp trusted keys to import into rpm database: " << zyppKeys.size() << endl;
627 MIL <<
"Exporting rpm keyring into zypp trusted keyring" <<endl;
632 TmpFile tmpfile( getZYpp()->tmpPath() );
634 std::ofstream tmpos( tmpfile.
path().
c_str() );
635 for_( it, rpmKeys.begin(), rpmKeys.end() )
639 getData(
"gpg-pubkey", *it, result );
640 tmpos << result->tag_description() << endl;
645 getZYpp()->keyRing()->multiKeyImport( tmpfile.
path(),
true );
649 std::set<Edition> missingKeys;
650 for (
const Edition & key : rpmKeys )
652 if ( getZYpp()->keyRing()->isKeyTrusted( key.version() ) )
654 ERR <<
"Could not import key:" <<
str::Format(
"gpg-pubkey-%s") % key <<
" into zypp keyring (V3 key?)" << endl;
655 missingKeys.insert( key );
657 if ( ! missingKeys.empty() )
663 ERR <<
"Could not import keys into zypp keyring: " << endl;
671 MIL <<
"Importing zypp trusted keyring" << std::endl;
672 for_( it, zyppKeys.begin(), zyppKeys.end() )
676 importPubkey( getZYpp()->keyRing()->exportTrustedPublicKey( *it ) );
684 MIL <<
"Trusted keys synced." << endl;
706 WAR <<
"Key " << pubkey_r <<
" can not be imported. (READONLY MODE)" << endl;
713 bool hasOldkeys =
false;
715 for_( it, rpmKeys.begin(), rpmKeys.end() )
724 MIL <<
"Key " << pubkey_r <<
" is already in the rpm trusted keyring. (skip import)" << endl;
728 if ( keyEd.version() != (*it).version() )
731 if ( keyEd.release() < (*it).release() )
733 MIL <<
"Key " << pubkey_r <<
" is older than one in the rpm trusted keyring. (skip import)" << endl;
741 MIL <<
"Key " << pubkey_r <<
" will be imported into the rpm trusted keyring." << (hasOldkeys?
"(update)":
"(new)") << endl;
747 std::string keyName(
"gpg-pubkey-" + keyEd.version() );
749 opts.push_back (
"-e" );
750 opts.push_back (
"--allmatches" );
751 opts.push_back (
"--" );
752 opts.push_back ( keyName.c_str() );
763 ERR <<
"Failed to remove key " << pubkey_r <<
" from RPM trusted keyring (ignored)" << endl;
767 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
773 opts.push_back (
"--import" );
774 opts.push_back (
"--" );
776 opts.push_back ( pubkeypath.c_str() );
780 std::vector<std::string> excplines;
786 excplines.push_back( std::move(line) );
802 MIL <<
"Key " << pubkey_r <<
" imported in rpm trusted keyring." << endl;
819 std::set<Edition>::const_iterator found_edition = rpm_keys.end();
822 for_( it, rpm_keys.begin(), rpm_keys.end() )
824 if ( (*it).version() == pubkeyVersion )
832 if (found_edition == rpm_keys.end())
834 WAR <<
"Key " << pubkey_r.
id() <<
" is not in rpm db" << endl;
838 std::string rpm_name(
"gpg-pubkey-" + found_edition->asString());
841 opts.push_back (
"-e" );
842 opts.push_back (
"--" );
843 opts.push_back ( rpm_name.c_str() );
847 std::vector<std::string> excplines;
853 excplines.push_back( std::move(line) );
869 MIL <<
"Key " << pubkey_r <<
" has been removed from RPM trusted keyring" << endl;
881 std::list<PublicKey> ret;
884 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
886 Edition edition = it->tag_edition();
891 getData(
"gpg-pubkey", edition, result );
892 TmpFile file(getZYpp()->tmpPath());
898 os << result->tag_description();
907 catch ( std::exception & e )
909 ERR <<
"Could not dump key " << edition.
asString() <<
" in tmp file " << file.
path() << endl;
919 std::set<Edition> ret;
922 for ( it.
findByName(
"gpg-pubkey" ); *it; ++it )
924 Edition edition = it->tag_edition();
926 ret.insert( edition );
943 std::list<FileInfo> result;
970 bool RpmDb::hasFile(
const std::string & file_r,
const std::string & name_r )
const 980 res = (it->tag_name() == name_r);
1001 return it->tag_name();
1115 struct RpmlogCapture :
public std::string
1118 { rpmlog()._cap =
this; }
1121 { rpmlog()._cap =
nullptr; }
1129 rpmlogSetCallback( rpmLogCB,
this );
1130 rpmSetVerbosity( RPMLOG_INFO );
1131 _f = ::fopen(
"/dev/null",
"w");
1132 rpmlogSetFile(
_f );
1136 {
if (
_f ) ::fclose(
_f ); }
1138 static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
1139 {
return reinterpret_cast<Rpmlog*
>(data_r)->rpmLog( rec_r ); }
1141 int rpmLog( rpmlogRec rec_r )
1143 if (
_cap ) (*_cap) += rpmlogRecMessage( rec_r );
1144 return RPMLOG_DEFAULT;
1151 static Rpmlog & rpmlog()
1152 {
static Rpmlog _rpmlog;
return _rpmlog; }
1157 bool requireGPGSig_r,
1158 RpmDb::CheckPackageDetail & detail_r )
1161 if ( ! file.isFile() )
1163 ERR <<
"Not a file: " << file << endl;
1167 FD_t fd = ::Fopen( file.asString().c_str(),
"r.ufdio" );
1168 if ( fd == 0 || ::Ferror(fd) )
1170 ERR <<
"Can't open file for reading: " << file <<
" (" << ::Fstrerror(fd) <<
")" << endl;
1175 rpmts ts = ::rpmtsCreate();
1176 ::rpmtsSetRootDir( ts, root_r.
c_str() );
1177 ::rpmtsSetVSFlags( ts, RPMVSF_DEFAULT );
1179 rpmQVKArguments_s qva;
1180 memset( &qva, 0,
sizeof(rpmQVKArguments_s) );
1181 #ifdef HAVE_NO_RPMTSSETVFYFLAGS 1184 qva.qva_flags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
1186 ::rpmtsSetVfyFlags( ts, RPMVSF_DEFAULT );
1188 RpmlogCapture vresult;
1189 LocaleGuard guard( LC_ALL,
"C" );
1190 int res = ::rpmVerifySignatures( &qva, ts, fd, path_r.
basename().c_str() );
1203 std::vector<std::string> lines;
1204 str::split( vresult, std::back_inserter(lines),
"\n" );
1205 unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 };
1207 for (
unsigned i = 1; i < lines.size(); ++i )
1209 std::string & line( lines[i] );
1211 if ( line.find(
": OK" ) != std::string::npos )
1214 if ( line.find(
"Signature, key ID" ) == std::string::npos )
1217 else if ( line.find(
": NOKEY" ) != std::string::npos )
1219 else if ( line.find(
": BAD" ) != std::string::npos )
1221 else if ( line.find(
": UNKNOWN" ) != std::string::npos )
1223 else if ( line.find(
": NOTRUSTED" ) != std::string::npos )
1225 else if ( line.find(
": NOTFOUND" ) != std::string::npos )
1229 detail_r.push_back( RpmDb::CheckPackageDetail::value_type( lineres, std::move(line) ) );
1250 detail_r.push_back( RpmDb::CheckPackageDetail::value_type(
RpmDb::CHK_NOSIG, std::string(
" ")+
_(
"Package is not signed!") ) );
1251 if ( requireGPGSig_r )
1258 WAR << path_r <<
" (" << requireGPGSig_r <<
" -> " << ret <<
")" << endl;
1271 {
return doCheckPackageSig( path_r,
root(),
false, detail_r ); }
1277 {
return doCheckPackageSig( path_r,
root(),
true, detail_r ); }
1292 opts.push_back (
"-V");
1293 opts.push_back (
"--nodeps");
1294 opts.push_back (
"--noscripts");
1295 opts.push_back (
"--nomd5");
1296 opts.push_back (
"--");
1297 opts.push_back (packageName.c_str());
1318 if (line.length() > 12 &&
1319 (line[0] ==
'S' || line[0] ==
's' ||
1320 (line[0] ==
'.' && line[7] ==
'T')))
1323 std::string filename;
1325 filename.assign(line, 11, line.length() - 11);
1366 #if defined(WORKAROUNDRPMPWDBUG) 1367 args.push_back(
"#/");
1369 args.push_back(
"rpm");
1370 args.push_back(
"--root");
1372 args.push_back(
"--dbpath");
1375 args.push_back(
"-vv");
1376 const char* argv[args.size() + opts.size() + 1];
1378 const char** p = argv;
1379 p =
copy (args.begin (), args.end (), p);
1380 p =
copy (opts.begin (), opts.end (), p);
1410 const auto &readResult =
io::receiveUpto( inputfile,
'\n', 5 * 1000,
false );
1411 switch ( readResult.first ) {
1417 line += readResult.second;
1421 line += readResult.second;
1422 if ( line.size() && line.back() ==
'\n')
1427 line += readResult.second;
1429 if ( line.size() && line.back() ==
'\n')
1433 L_DBG(
"RPM_DEBUG") << line << endl;
1477 void RpmDb::processConfigFiles(
const std::string& line,
const std::string& name,
const char* typemsg,
const char* difffailmsg,
const char* diffgenmsg)
1479 std::string msg = line.substr(9);
1482 std::string file1s, file2s;
1486 pos1 = msg.find (typemsg);
1489 if ( pos1 == std::string::npos )
1492 pos2 = pos1 + strlen (typemsg);
1494 if (pos2 >= msg.length() )
1497 file1 = msg.substr (0, pos1);
1498 file2 = msg.substr (pos2);
1505 file1 =
_root + file1;
1506 file2 =
_root + file2;
1516 ERR <<
"Could not create " << file.
asString() << endl;
1520 std::ofstream notify(file.
asString().c_str(), std::ios::out|std::ios::app);
1523 ERR <<
"Could not open " << file << endl;
1529 notify <<
str::form(
_(
"Changed configuration files for %s:"), name.c_str()) << endl;
1532 ERR <<
"diff failed" << endl;
1534 file1s.c_str(), file2s.c_str()) << endl;
1539 file1s.c_str(), file2s.c_str()) << endl;
1544 if (out.substr(0,4) ==
"--- ")
1546 out.replace(4, file1.
asString().length(), file1s);
1549 if (pos != std::string::npos)
1551 out.replace(pos+5, file2.
asString().length(), file2s);
1554 notify << out << endl;
1557 notify.open(
"/var/lib/update-messages/yast2-packagemanager.rpmdb.configfiles");
1562 WAR <<
"rpm created " << file2 <<
" but it is not different from " << file2 << endl;
1593 report->finish( excpt_r );
1609 MIL <<
"RpmDb::installPackage(" << filename <<
"," << flags <<
")" << endl;
1618 ERR <<
"backup of " << filename.
asString() <<
" failed" << endl;
1627 opts.push_back(
"-i");
1629 opts.push_back(
"-U");
1631 opts.push_back(
"--percent");
1632 opts.push_back(
"--noglob");
1636 opts.push_back(
"--ignorearch");
1639 opts.push_back(
"--nodigest");
1641 opts.push_back(
"--nosignature");
1643 opts.push_back (
"--excludedocs");
1645 opts.push_back (
"--noscripts");
1647 opts.push_back (
"--force");
1649 opts.push_back (
"--nodeps");
1651 opts.push_back (
"--ignoresize");
1653 opts.push_back (
"--justdb");
1655 opts.push_back (
"--test");
1657 opts.push_back (
"--noposttrans");
1659 opts.push_back(
"--");
1662 std::string quotedFilename( rpmQuoteFilename( workaroundRpmPwdBug( filename ) ) );
1663 opts.push_back ( quotedFilename.c_str() );
1668 unsigned lineno = 0;
1671 cmdout.
set(
"line", std::cref(line) );
1672 cmdout.
set(
"lineno", lineno );
1676 std::vector<std::string> configwarnings;
1683 sscanf( line.c_str() + 2,
"%d", &percent );
1684 report->progress( percent );
1688 cmdout.
set(
"lineno", lineno );
1689 report->report( cmdout );
1692 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1696 rpmmsg += line+
'\n';
1699 configwarnings.push_back(line);
1702 rpmmsg +=
"[truncated]\n";
1707 for (std::vector<std::string>::iterator it = configwarnings.begin();
1708 it != configwarnings.end(); ++it)
1712 _(
"rpm saved %s as %s, but it was impossible to determine the difference"),
1714 _(
"rpm saved %s as %s.\nHere are the first 25 lines of difference:\n"));
1717 _(
"rpm created %s as %s, but it was impossible to determine the difference"),
1719 _(
"rpm created %s as %s.\nHere are the first 25 lines of difference:\n"));
1722 if ( rpm_status != 0 )
1727 std::ostringstream sstr;
1728 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1729 historylog.
comment(sstr.str());
1733 else if ( ! rpmmsg.empty() )
1738 std::ostringstream sstr;
1739 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1740 historylog.
comment(sstr.str());
1744 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1758 +
"-" + package->edition().version()
1759 +
"-" + package->edition().release()
1760 +
"." + package->arch().asString(), flags );
1788 report->finish( excpt_r );
1805 MIL <<
"RpmDb::doRemovePackage(" << name_r <<
"," << flags <<
")" << endl;
1814 ERR <<
"backup of " << name_r <<
" failed" << endl;
1825 opts.push_back(
"-e");
1826 opts.push_back(
"--allmatches");
1829 opts.push_back(
"--noscripts");
1831 opts.push_back(
"--nodeps");
1833 opts.push_back(
"--justdb");
1835 opts.push_back (
"--test");
1838 WAR <<
"IGNORE OPTION: 'rpm -e' does not support '--force'" << endl;
1841 opts.push_back(
"--");
1842 opts.push_back(name_r.c_str());
1847 unsigned lineno = 0;
1850 cmdout.
set(
"line", std::cref(line) );
1851 cmdout.
set(
"lineno", lineno );
1865 cmdout.
set(
"lineno", lineno );
1866 report->report( cmdout );
1869 if ( line.find(
" scriptlet failed, " ) == std::string::npos )
1872 rpmmsg += line+
'\n';
1875 rpmmsg +=
"[truncated]\n";
1879 if ( rpm_status != 0 )
1882 str::form(
"%s remove failed", name_r.c_str()),
true );
1883 std::ostringstream sstr;
1884 sstr <<
"rpm output:" << endl << rpmmsg << endl;
1885 historylog.
comment(sstr.str());
1889 else if ( ! rpmmsg.empty() )
1892 str::form(
"%s removed ok", name_r.c_str()),
true );
1894 std::ostringstream sstr;
1895 sstr <<
"Additional rpm output:" << endl << rpmmsg << endl;
1896 historylog.
comment(sstr.str());
1900 report->finishInfo(
str::form(
"%s:\n%s\n",
_(
"Additional rpm output"), rpmmsg.c_str() ));
1934 INT <<
"_backuppath empty" << endl;
1942 ERR <<
"Error while getting changed files for package " <<
1943 packageName << endl;
1949 DBG <<
"package " << packageName <<
" not changed -> no backup" << endl;
1961 struct tm *currentLocalTime = localtime(&
currentTime);
1963 int date = (currentLocalTime->tm_year + 1900) * 10000
1964 + (currentLocalTime->tm_mon + 1) * 100
1965 + currentLocalTime->tm_mday;
1971 +
str::form(
"%s-%d-%d.tar.gz",packageName.c_str(), date, num);
1979 ERR << filestobackupfile.
asString() <<
" already exists and is no file" << endl;
1983 std::ofstream fp ( filestobackupfile.
asString().c_str(), std::ios::out|std::ios::trunc );
1987 ERR <<
"could not open " << filestobackupfile.
asString() << endl;
1991 for (FileList::const_iterator cit =
fileList.begin();
1994 std::string name = *cit;
1995 if ( name[0] ==
'/' )
1998 name = name.substr( 1 );
2000 DBG <<
"saving file "<< name << endl;
2005 const char*
const argv[] =
2011 "--ignore-failed-read",
2015 filestobackupfile.
asString().c_str(),
2031 int ret = tar.
close();
2035 ERR <<
"tar failed: " << tarmsg << endl;
2040 MIL <<
"tar backup ok" << endl;
2061 #define OUTS(E,S) case RpmDb::E: return str << "["<< (unsigned)obj << "-"<< S << "]"; break 2063 OUTS( CHK_OK,
_(
"Signature is OK") );
2065 OUTS( CHK_NOTFOUND,
_(
"Unknown type of signature") );
2067 OUTS( CHK_FAIL,
_(
"Signature does not verify") );
2069 OUTS( CHK_NOTTRUSTED,
_(
"Signature is OK, but key is not trusted") );
2071 OUTS( CHK_NOKEY,
_(
"Signatures public key is not available") );
2073 OUTS( CHK_ERROR,
_(
"File does not exist or signature can't be checked") );
2075 OUTS( CHK_NOSIG,
_(
"File is unsigned") );
2083 for (
const auto & el : obj )
2084 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
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).
std::pair< ReceiveUpToResult, std::string > receiveUpto(FILE *file, char c, timeout_type timeout, bool failOnUnblockError)
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.
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