Login
Log in using an SSO provider:
Fedora Account System
Red Hat Associate
Red Hat Customer
Login using a Red Hat Bugzilla account
Forgot Password
Create an Account
Red Hat Bugzilla – Attachment 27455 Details for
Bug 51582
Many files are owned by multiple packages
Home
New
Search
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh90 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
[?]
This site requires JavaScript to be enabled to function correctly, please enable it.
Python script that checks for ownership problems
rpmdbcheck.py (text/plain), 7.34 KB, created by
Peter Bowen
on 2001-08-12 18:42:24 UTC
(
hide
)
Description:
Python script that checks for ownership problems
Filename:
MIME Type:
Creator:
Peter Bowen
Created:
2001-08-12 18:42:24 UTC
Size:
7.34 KB
patch
obsolete
>#!/usr/bin/python ># licensed under the GPL, by Peter Bowen <pzb@scyld.com> ># based on graphgen.py by Adrian Likins <alikins@redhat.com> ># ># none of that fancy commandline parsing or ease of use stuff here, change "dbpath" to ># point to a rpmdb that you are interested in ># ># useage: ># ./rpmdbcheck.py > foo.out ># > >import rpm >import sys > >def isRequirement(deps, pkg1, pkg2, fp): > if pkg1 == pkg2: > return (1 == 1) > for deppkg in deps[pkg2]: > if fp.count(deppkg) == 0: > fp.append(deppkg) > if isRequirement(deps, pkg1, deppkg, fp): > return (1 == 1) > return (1 == 0) > >def removeDeps(deps, pkgList): > for pkgi in pkgList: > found_deps = [] > for pkgn in range(len(pkgList)): > if pkgn < len(pkgList) and pkgi != pkgList[pkgn]: > if isRequirement(deps, pkgi, pkgList[pkgn], found_deps): > del pkgList[pkgn] > >def listPackages(db): > headerList = [] > list = [] > if "firstkey" in dir(db): > key = db.firstkey() > h = db[key] > else: > iterator = db.match(0) > h = iterator.next() > > while (h): > name = h['name'] > epoch = h['epoch'] > if epoch == None: > epoch = "" > version = h['version'] > release = h['release'] > > headerList.append(h) > list.append([name, version, release, epoch]) > if "nextkey" in dir(db): > key = db.nextkey(key) > if key: > h = db[key] > else: > h = None > else: > h = iterator.next() > > list.sort() > return headerList > > >def findDepLocal(db, dep): > header = None > if dep[0] == '/': > # Treat it as a file dependency > try: > hdr_arry = db.findbyfile(dep) > except: > hdr_arry = [] > > for n in hdr_arry: > header = db[n] > type = 0 > break > > else: > # Try it first as a package name > try: > hdr_arry = db.findbyname(dep) > except: > hdr_arry = [] > for n in hdr_arry: > header = db[n] > type = 1 > break > else: > # else try it as a soname > try: > hdr_arry = db.findbyprovides(dep) > except: > hdr_arry = [] > for n in hdr_arry: > header = db[n] > type = 2 > break > > if header != None: > return (header,type) > else: > return (None,None) > > >if __name__ == "__main__": > > import sys > import string > > requires = {} > provides = {} > filenames = {} > filemodes= {} ># CONFIG > dbpath = '/usr/lib/rpmdb/i386-redhat-linux/redhat' > rpm.addMacro("_dbpath", dbpath) > db = rpm.opendb() > headerList = listPackages(db) > > # build a list of requires > for header in headerList: > name = header['name'] > foo = header['requirename'] > requires[name] = foo > bar = header['filenames'] > filenames[name] = bar > baz = header['filemodes'] > filemodes[name] = baz > > # find all the dirs with owners > owned_dirs = {} > for package_name in requires.keys(): > fnames = filenames[package_name] > fmodes = filemodes[package_name] > if fnames and fmodes and len(fnames) and len(fmodes): > for fn in range(len(fnames)): > if (fmodes[fn] & 070000) == 040000: > dirname = fnames[fn] > if not owned_dirs.has_key(dirname): > owned_dirs[dirname] = [] > if owned_dirs[dirname].count(package_name) == 0: > owned_dirs[dirname].append(package_name) > owned_dirs[dirname].sort() > > #figure out which packages are needed to meet those > package_requires = {} > for package_name in requires.keys(): > reqs = requires[package_name] > package_requires[package_name] = [] > if reqs and len(reqs): > for i in reqs: > (pkg,type) = findDepLocal(db,i) > if pkg: > pkgname = pkg['name'] > package_requires[package_name].append(pkgname) > else: > if string.find(i, "rpmlib(") != 0: > print "Failed to find match for dep: %s" % i > > for blip in package_requires.keys(): > new_list = [] > tmp_list = package_requires[blip] > d = {} > for i in tmp_list: > d[i] = i > new_list = d.values() > package_requires[blip] = new_list > package_requires[blip].sort() > > unknown_dirs = {} > found_files = {} > for package_name in requires.keys(): > fnames = filenames[package_name] > fmodes = filemodes[package_name] > if fnames and fmodes and len(fnames) and len(fmodes): > for fn in range(len(fnames)): > if (fmodes[fn] & 070000) != 040000: > if found_files.has_key(fnames[fn]): > found_files[fnames[fn]].append(package_name) > found_files[fnames[fn]].sort() > else: > found_files[fnames[fn]] = [package_name] > > dirname = fnames[fn] > while string.rindex(dirname,"/") > 1: > slashat = string.rindex(dirname, "/") > dirname = fnames[fn][:slashat] > if not owned_dirs.has_key(dirname): > if not unknown_dirs.has_key(dirname): > unknown_dirs[dirname] = [] > if unknown_dirs[dirname].count(package_name) == 0: > unknown_dirs[dirname].append(package_name) > unknown_dirs[dirname].sort() > > bad_packages = {} > bad_locales = [] > orig_users = {} > for ukdir in unknown_dirs.keys(): > if string.find(ukdir,"/usr/share/locale") > -1: > if bad_locales.count(ukdir) == 0: > bad_locales.append(ukdir) > del unknown_dirs[ukdir] > else: > orig_users[ukdir] = unknown_dirs[ukdir][:] > if len(unknown_dirs[ukdir]) > 1: > removeDeps(package_requires, unknown_dirs[ukdir]) > if len(unknown_dirs[ukdir]) == 1: > pkgname = unknown_dirs[ukdir][0]; > if not bad_packages.has_key(pkgname): > bad_packages[pkgname] = [] > bad_packages[pkgname].append(ukdir) > bad_packages[pkgname].sort() > del unknown_dirs[ukdir] > > bpkgs = bad_packages.keys() > bpkgs.sort() > bad_locales.sort() > print "\nUnowned Locale Dirs" > for ld in bad_locales: > print ld > > print "\nPackages that should own dirs" > for bpkg in bpkgs: > print bpkg > for bpdir in bad_packages[bpkg]: > if len(orig_users[bpdir]) > 1: > pos = orig_users[bpdir].index(bpkg) > del orig_users[bpdir][pos] > orig_str = " (also used by %s)" % orig_users[bpdir] > else: > orig_str = "" > print "\t%s%s" % (bpdir, orig_str) > > print "\nDirs that should be owned" > ukdirs_keys = unknown_dirs.keys() > ukdirs_keys.sort() > for ukdir in ukdirs_keys: > print "%s used by %s" % (ukdir, unknown_dirs[ukdir]) > > > print "\n\nFiles owned by multiple packages" > ffiles_keys = found_files.keys() > ffiles_keys.sort() > for file in ffiles_keys: > if len(found_files[file]) > 1: > orig_pkgs = found_files[file][:] > removeDeps(package_requires, found_files[file]) > if len(found_files[file]) == 1: > pos = orig_pkgs.index(found_files[file][0]) > del orig_pkgs[pos] > if len(orig_pkgs) > 1: > do_str = "do" > else: > do_str = "does" > print "%s (only %s should own it, but %s also %s)" % (file, found_files[file], orig_pkgs, do_str) > else: > for foo in found_files[file]: > pos = orig_pkgs.index(foo) > del orig_pkgs[pos] > if len(orig_pkgs) > 0: > extra_str = ", plus %s, " % orig_pkgs > else: > extra_str = " all " > print "%s (one of %s should own it, but they%sdo currently)" % (file, found_files[file], extra_str) > > >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 51582
: 27455 |
27456
|
30556