summaryrefslogtreecommitdiff
path: root/modifyrepo.py
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2013-02-19 09:45:40 -0800
committerAnas Nashif <anas.nashif@intel.com>2013-02-19 09:45:40 -0800
commit72d1e832d96178b39c7bcb70caba7f31e610bfaa (patch)
treedc64fa65bc11acca65d20109b526e95a39bad4f4 /modifyrepo.py
downloadcreaterepo-72d1e832d96178b39c7bcb70caba7f31e610bfaa.tar.gz
createrepo-72d1e832d96178b39c7bcb70caba7f31e610bfaa.tar.bz2
createrepo-72d1e832d96178b39c7bcb70caba7f31e610bfaa.zip
Imported Upstream version 0.9.9upstream/0.9.9upstream
Diffstat (limited to 'modifyrepo.py')
-rwxr-xr-xmodifyrepo.py148
1 files changed, 148 insertions, 0 deletions
diff --git a/modifyrepo.py b/modifyrepo.py
new file mode 100755
index 0000000..17094a4
--- /dev/null
+++ b/modifyrepo.py
@@ -0,0 +1,148 @@
+#!/usr/bin/python
+# This tools is used to insert arbitrary metadata into an RPM repository.
+# Example:
+# ./modifyrepo.py updateinfo.xml myrepo/repodata
+# or in Python:
+# >>> from modifyrepo import RepoMetadata
+# >>> repomd = RepoMetadata('myrepo/repodata')
+# >>> repomd.add('updateinfo.xml')
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# (C) Copyright 2006 Red Hat, Inc.
+# Luke Macken <lmacken@redhat.com>
+# modified by Seth Vidal 2008
+
+import os
+import sys
+from createrepo import __version__
+from createrepo.utils import checksum_and_rename, GzipFile, MDError
+from yum.misc import checksum
+
+from yum.repoMDObject import RepoMD, RepoMDError, RepoData
+from xml.dom import minidom
+from optparse import OptionParser
+
+
+class RepoMetadata:
+
+ def __init__(self, repo):
+ """ Parses the repomd.xml file existing in the given repo directory. """
+ self.repodir = os.path.abspath(repo)
+ self.repomdxml = os.path.join(self.repodir, 'repomd.xml')
+ self.checksum_type = 'sha256'
+
+ if not os.path.exists(self.repomdxml):
+ raise MDError, '%s not found' % self.repomdxml
+
+ try:
+ self.repoobj = RepoMD(self.repodir)
+ self.repoobj.parse(self.repomdxml)
+ except RepoMDError, e:
+ raise MDError, 'Could not parse %s' % self.repomdxml
+
+
+ def add(self, metadata, mdtype=None):
+ """ Insert arbitrary metadata into this repository.
+ metadata can be either an xml.dom.minidom.Document object, or
+ a filename.
+ """
+ md = None
+ if not metadata:
+ raise MDError, 'metadata cannot be None'
+ if isinstance(metadata, minidom.Document):
+ md = metadata.toxml()
+ mdname = 'updateinfo.xml'
+ elif isinstance(metadata, str):
+ if os.path.exists(metadata):
+ if metadata.endswith('.gz'):
+ oldmd = GzipFile(filename=metadata, mode='rb')
+ else:
+ oldmd = file(metadata, 'r')
+ md = oldmd.read()
+ oldmd.close()
+ mdname = os.path.basename(metadata)
+ else:
+ raise MDError, '%s not found' % metadata
+ else:
+ raise MDError, 'invalid metadata type'
+
+ ## Compress the metadata and move it into the repodata
+ if not mdname.endswith('.gz'):
+ mdname += '.gz'
+ if not mdtype:
+ mdtype = mdname.split('.')[0]
+
+ destmd = os.path.join(self.repodir, mdname)
+ newmd = GzipFile(filename=destmd, mode='wb')
+ newmd.write(md)
+ newmd.close()
+ print "Wrote:", destmd
+
+ open_csum = checksum(self.checksum_type, metadata)
+ csum, destmd = checksum_and_rename(destmd, self.checksum_type)
+ base_destmd = os.path.basename(destmd)
+
+
+ ## Remove any stale metadata
+ if mdtype in self.repoobj.repoData:
+ del self.repoobj.repoData[mdtype]
+
+
+ new_rd = RepoData()
+ new_rd.type = mdtype
+ new_rd.location = (None, 'repodata/' + base_destmd)
+ new_rd.checksum = (self.checksum_type, csum)
+ new_rd.openchecksum = (self.checksum_type, open_csum)
+ new_rd.size = str(os.stat(destmd).st_size)
+ new_rd.timestamp = str(os.stat(destmd).st_mtime)
+ self.repoobj.repoData[new_rd.type] = new_rd
+
+ print " type =", new_rd.type
+ print " location =", new_rd.location[1]
+ print " checksum =", new_rd.checksum[1]
+ print " timestamp =", new_rd.timestamp
+ print " open-checksum =", new_rd.openchecksum[1]
+
+ ## Write the updated repomd.xml
+ outmd = file(self.repomdxml, 'w')
+ outmd.write(self.repoobj.dump_xml())
+ outmd.close()
+ print "Wrote:", self.repomdxml
+
+
+def main(args):
+ parser = OptionParser(version='modifyrepo version %s' % __version__)
+ # query options
+ parser.add_option("--mdtype", dest='mdtype',
+ help="specific datatype of the metadata, will be derived from the filename if not specified")
+ parser.usage = "modifyrepo [options] <input_metadata> <output repodata>"
+
+ (opts, argsleft) = parser.parse_args(args)
+ if len(argsleft) != 2:
+ parser.print_usage()
+ return 0
+ metadata = argsleft[0]
+ repodir = argsleft[1]
+ try:
+ repomd = RepoMetadata(repodir)
+ except MDError, e:
+ print "Could not access repository: %s" % str(e)
+ return 1
+ try:
+ repomd.add(metadata, mdtype=opts.mdtype)
+ except MDError, e:
+ print "Could not add metadata from file %s: %s" % (metadata, str(e))
+ return 1
+
+if __name__ == '__main__':
+ ret = main(sys.argv[1:])
+ sys.exit(ret)