Server IP : 103.169.32.36 / Your IP : 216.73.217.13 Web Server : Apache System : Linux web.dpmptsp 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 User : apache ( 48) PHP Version : 5.6.40 Disable Function : NONE MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /lib/python2.7/site-packages/yum/ |
Upload File : |
| Current File : /lib/python2.7/site-packages/yum/metalink.py |
#!/usr/bin/python -t
# 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 Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Copyright 2008 Red Hat
#
# James Antill <james@fedoraproject.org>
# Parse the new MirrorManager metalink output:
import sys
import os
import time
from urlgrabber.progress import format_number
import Errors
from yum.misc import cElementTree_xmlparse as xmlparse
class MetaLinkRepoErrorParseFail(Errors.RepoError):
""" An exception thrown for an unparsable MetaLinkRepoMD file. """
pass
__XML_NS_ML__ = 'http://www.metalinker.org/'
__XML_NS_MM__ = 'http://fedorahosted.org/mirrormanager'
__XML_FMT__ = {'ml' : __XML_NS_ML__,
'mm' : __XML_NS_MM__}
__ML_FILE_ELEMENT__ = """\
{%(ml)s}files/{%(ml)s}file\
""" % __XML_FMT__
__ML_OLD_FILE_ELEMENTS__ = """\
{%(mm)s}alternates/{%(mm)s}alternate\
""" % __XML_FMT__
__ML_RESOURCES__ = """\
{%(ml)s}resources\
""" % __XML_FMT__
class MetaLinkFile:
""" Parse the file metadata out of a metalink file. """
def __init__(self, elem):
# We aren't "using" any of these, just storing them.
chksums = set(["md5", 'sha1', 'sha256', 'sha512'])
for celem in elem:
if False: pass
elif celem.tag == "{%s}timestamp" % __XML_NS_MM__:
self.timestamp = int(celem.text)
elif celem.tag == "{%s}size" % __XML_NS_ML__:
self.size = int(celem.text)
elif celem.tag == "{%s}verification" % __XML_NS_ML__:
self.chksums = {}
for helem in celem:
if (helem.tag == "{%s}hash" % __XML_NS_ML__ and
helem.get("type") in chksums):
self.chksums[helem.get("type").lower()] = helem.text
if not hasattr(self, 'timestamp'):
raise MetaLinkRepoErrorParseFail, "No timestamp for file"
if not hasattr(self, 'size'):
raise MetaLinkRepoErrorParseFail, "No size for file"
if not hasattr(self, 'chksums'):
raise MetaLinkRepoErrorParseFail, "No verifications for file"
def __str__(self):
return """\
Timestamp: %s
Size: %5s (%d)
MD5: %s
SHA1: %s
SHA256: %s
SHA512: %s
""" % (time.ctime(self.timestamp), format_number(self.size), self.size,
self.md5, self.sha1, self.sha256, self.sha512)
def _get_md5(self):
return self.chksums.get('md5', '')
md5 = property(_get_md5)
def _get_sha1(self):
return self.chksums.get('sha1', '')
sha1 = property(_get_sha1)
def _get_sha256(self):
return self.chksums.get('sha256', '')
sha256 = property(_get_sha256)
def _get_sha512(self):
return self.chksums.get('sha512', '')
sha512 = property(_get_sha512)
def __cmp__(self, other):
if other is None:
return 1
ret = cmp(self.timestamp, other.timestamp)
if ret:
return -ret
ret = cmp(self.size, other.size)
if ret:
return ret
ret = cmp(self.md5, other.md5)
if ret:
return ret
ret = cmp(self.sha1, other.sha1)
if ret:
return ret
ret = cmp(self.sha256, other.sha256)
if ret:
return ret
ret = cmp(self.sha512, other.sha512)
if ret:
return ret
return 0
class MetaLinkURL:
""" Parse the URL metadata out of a metalink file. """
def __init__(self, elem, max_connections):
assert elem.tag == '{%s}url' % __XML_NS_ML__
self.max_connections = max_connections
self.url = elem.text
self.preference = int(elem.get("preference", -1))
self.protocol = elem.get("type") # This is the "std" attribute name
self.location = elem.get("location")
self.private = elem.get("{%s}private" % __XML_NS_MM__, "false")
self.private = self.private.lower() == "true"
if self.protocol is None: # Try for the old MM protocol attribute
self.protocol = elem.get("protocol")
def __str__(self):
return """\
URL: %s
Preference: %d
Max-Connections: %d
Protocol: %s
Location: %s
Private: %s
""" % (self.url, self.preference, self.max_connections,
self.protocol, self.location, self.private)
def __cmp__(self, other):
if other is None:
return 1
ret = cmp(self.preference, other.preference)
if ret:
return -ret
ret = cmp(self.protocol == "https", other.protocol == "https")
if ret:
return -ret
ret = cmp(self.protocol == "http", other.protocol == "http")
if ret:
return -ret
return cmp(self.url, other.url)
def usable(self):
if self.protocol is None:
return False
if not self.url:
return False
return True
class MetaLinkRepoMD:
""" Parse a metalink file for repomd.xml. """
def __init__(self, filename):
self.name = None
self.repomd = None
self.old_repomds = []
self.mirrors = []
self._host2mc = {}
if not os.path.exists(filename):
raise MetaLinkRepoErrorParseFail, "File %s does not exist" %filename
try:
root = xmlparse(filename)
except SyntaxError:
raise MetaLinkRepoErrorParseFail, "File %s is not XML" % filename
for elem in root.findall(__ML_FILE_ELEMENT__):
name = elem.get('name')
if os.path.basename(name) != 'repomd.xml':
continue
if self.name is not None and self.name != name:
raise MetaLinkRepoErrorParseFail, "Different paths for repomd file"
self.name = name
repomd = MetaLinkFile(elem)
if self.repomd is not None and self.repomd != repomd:
raise MetaLinkRepoErrorParseFail, "Different data for repomd file"
self.repomd = repomd
for celem in elem.findall(__ML_OLD_FILE_ELEMENTS__):
self.old_repomds.append(MetaLinkFile(celem))
for celem in elem.findall(__ML_RESOURCES__):
max_connections = int(celem.get("maxconnections") or 2)
for uelem in celem:
if uelem.tag == "{%s}url" % __XML_NS_ML__:
self.mirrors.append(MetaLinkURL(uelem, max_connections))
self.old_repomds.sort()
self.mirrors.sort()
if self.repomd is None:
raise MetaLinkRepoErrorParseFail, "No repomd file"
if len(self.mirrors) < 1:
raise MetaLinkRepoErrorParseFail, "No mirror"
def urls(self):
""" Iterate plain urls for the mirrors, like the old mirrorlist. """
# Get the hostname from a url, stripping away any usernames/passwords
# Borrowd from fastestmirror
url2host = lambda url: url.split('/')[2].split('@')[-1]
for mirror in self.mirrors:
url = mirror.url
# This is what yum supports atm. ... no rsync etc.
if url.startswith("file:"):
pass
elif (url.startswith("http:") or url.startswith("ftp:") or
url.startswith("https:")):
host = url2host(url)
if host in self._host2mc:
continue
self._host2mc[host] = mirror
else:
continue
# The mirror urls in the metalink file are for repomd.xml so it
# gives a list of mirrors for that one file, but we want the list
# of mirror baseurls. Joy of reusing other people's stds. :)
if not url.endswith("/repodata/repomd.xml"):
continue
yield url[:-len("/repodata/repomd.xml")]
def __str__(self):
ret = str(self.repomd)
done = False
for orepomd in self.old_repomds:
if not done: ret += "%s\n" % ("-" * 79)
if done: ret += "\n"
done = True
ret += str(orepomd)
done = False
for url in self.mirrors:
if not done: ret += "%s\n" % ("-" * 79)
if done: ret += "\n"
done = True
ret += str(url)
return ret
def main():
""" MetaLinkRepoMD test function. """
def usage():
print >> sys.stderr, "Usage: %s <metalink> ..." % sys.argv[0]
sys.exit(1)
if len(sys.argv) < 2:
usage()
for filename in sys.argv[1:]:
if not os.path.exists(filename):
print "No such file:", filename
continue
print "File:", filename
print MetaLinkRepoMD(filename)
print ''
if __name__ == '__main__':
main()
| N4m3 |
5!z3 |
L45t M0d!f!3d |
0wn3r / Gr0up |
P3Rm!55!0n5 |
0pt!0n5 |
| .. |
-- |
December 21 2023 09:18:24 |
0 / 0 |
0755 |
|
| | | | | |
| Errors.py |
4.265 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| Errors.pyc |
9.084 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| __init__.py |
304.096 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| __init__.pyc |
199.779 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| callbacks.py |
5.64 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| callbacks.pyc |
6.232 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| comps.py |
31.586 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| comps.pyc |
26.872 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| config.py |
49.886 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| config.pyc |
48.018 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| constants.py |
4.516 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| constants.pyc |
3.42 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| depsolve.py |
74.046 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| depsolve.pyc |
46.906 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| drpm.py |
12.851 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| drpm.pyc |
10.834 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| failover.py |
5.005 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| failover.pyc |
5.236 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| fssnapshots.py |
10.159 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| fssnapshots.pyc |
9.752 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| history.py |
61.125 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| history.pyc |
53.306 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| i18n.py |
20.437 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| i18n.pyc |
16.05 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| igroups.py |
9.313 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| igroups.pyc |
10.218 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| logginglevels.py |
7.904 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| logginglevels.pyc |
6.511 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| mdparser.py |
6.258 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| mdparser.pyc |
7.58 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| metalink.py |
9.188 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| metalink.pyc |
8.836 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| misc.py |
39.567 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| misc.pyc |
39.58 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| packageSack.py |
40.786 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| packageSack.pyc |
41.88 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| packages.py |
84.104 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| packages.pyc |
84.514 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| parser.py |
7.973 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| parser.pyc |
6.499 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| pgpmsg.py |
53.5 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| pgpmsg.pyc |
38.268 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| pkgtag_db.py |
4.864 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| pkgtag_db.pyc |
5.061 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| plugins.py |
28.1 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| plugins.pyc |
29.097 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| repoMDObject.py |
11.231 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| repoMDObject.pyc |
9.17 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| repos.py |
16.528 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| repos.pyc |
17.383 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| rpmsack.py |
70.255 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| rpmsack.pyc |
58.355 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| rpmtrans.py |
24.845 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| rpmtrans.pyc |
22.544 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| sqlitesack.py |
69.763 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| sqlitesack.pyc |
53.751 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| sqlutils.py |
6.271 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| sqlutils.pyc |
5.602 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| transactioninfo.py |
33.784 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| transactioninfo.pyc |
30.293 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| update_md.py |
25.9 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| update_md.pyc |
21.722 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| updateinfo.py |
18.29 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| updateinfo.pyc |
16.36 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|
| yumRepo.py |
83.852 KB |
October 01 2020 17:03:44 |
0 / 0 |
0755 |
|
| yumRepo.pyc |
64.827 KB |
October 01 2020 17:03:44 |
0 / 0 |
0644 |
|