Author: mschwendt
Update of /cvs/fedora/extras-repoclosure
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv32253
Added Files:
rc-modified rc-report.py rc-run.py repoclosure.patch
yum.repoclosure.conf
Log Message:
initial import
--- NEW FILE rc-modified ---
#!/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.
# seth vidal 2005 (c) etc etc
#Read in the metadata of a series of repositories and check all the
# dependencies in all packages for resolution. Print out the list of
# packages with unresolved dependencies
import sys
import os
import yum
import yum.Errors
from yum.misc import getCacheDir
from optparse import OptionParser
import rpmUtils.arch
from yum.constants import *
from repomd.packageSack import ListPackageSack
def parseArgs():
usage = "usage: %s [-c <config file>] [-a <arch>] [-r <repoid>]
[-r <repoid2>]" % sys.argv[0]
parser = OptionParser(usage=usage)
parser.add_option("-c", "--config",
default='/etc/yum.conf',
help='config file to use (defaults to /etc/yum.conf)')
parser.add_option("-a", "--arch", default=None,
help='check as if running the specified arch (default: current arch)')
parser.add_option("-r", "--repoid", default=[],
action='append',
help="specify repo ids to query, can be specified multiple times (default is
all enabled)")
parser.add_option("-t", "--tempcache", default=False,
action="store_true",
help="Use a temp dir for storing/accessing yum-cache")
parser.add_option("-q", "--quiet", default=0,
action="store_true",
help="quiet (no output to stderr)")
parser.add_option("-n", "--newest", default=0,
action="store_true",
help="check only the newest packages in the repos")
(opts, args) = parser.parse_args()
return (opts, args)
class RepoClosure(yum.YumBase):
def __init__(self, arch = None, config = "/etc/yum.conf"):
yum.YumBase.__init__(self)
self.arch = arch
self.doConfigSetup(fn = config)
if hasattr(self.repos, 'sqlite'):
self.repos.sqlite = False
self.repos._selectSackType()
def evrTupletoVer(self,tuple):
"""convert and evr tuple to a version string, return None if
nothing
to convert"""
e, v,r = tuple
if v is None:
return None
val = ''
if e is not None:
val = '%s:%s' % (e, v)
if r is not None:
val = '%s-%s' % (val, r)
return val
def readMetadata(self):
self.doRepoSetup()
self.doSackSetup(rpmUtils.arch.getArchList(self.arch))
for repo in self.repos.listEnabled():
self.repos.populateSack(which=[repo.id], with='filelists')
def getBrokenDeps(self, newest=False):
unresolved = {}
resolved = {}
if newest:
pkgs = []
for l in self.pkgSack.returnNewestByName():
for p in l:
pkgs.append(p)
else:
pkgs = self.pkgSack
mypkgSack = ListPackageSack(pkgs)
pkgtuplist = mypkgSack.simplePkgList()
for pkg in pkgs:
for (req, flags, (reqe, reqv, reqr)) in pkg.returnPrco('requires'):
if req.startswith('rpmlib'): continue # ignore rpmlib deps
ver = self.evrTupletoVer((reqe, reqv, reqr))
if resolved.has_key((req,flags,ver)):
continue
try:
resolve_sack = self.whatProvides(req, flags, ver)
except yum.Errors.RepoError, e:
pass
if len(resolve_sack) < 1:
if not unresolved.has_key(pkg):
unresolved[pkg] = []
unresolved[pkg].append((req, flags, ver))
continue
if newest:
resolved_by_newest = False
for po in resolve_sack:# look through and make sure all our answers
are newest-only
if po.pkgtup in pkgtuplist:
resolved_by_newest = True
break
if resolved_by_newest:
resolved[(req,flags,ver)] = 1
else:
if not unresolved.has_key(pkg):
unresolved[pkg] = []
unresolved[pkg].append((req, flags, ver))
return unresolved
def log(self, value, msg):
pass
def main():
(opts, cruft) = parseArgs()
my = RepoClosure(arch = opts.arch, config = opts.config)
if opts.repoid:
for repo in my.repos.repos.values():
if repo.id not in opts.repoid:
repo.disable()
else:
repo.enable()
if os.geteuid() != 0 or opts.tempcache:
cachedir = getCacheDir()
if cachedir is None:
print "Error: Could not make cachedir, exiting"
sys.exit(50)
my.repos.setCacheDir(cachedir)
if not opts.quiet:
print 'Reading in repository metadata - please wait....'
try:
my.readMetadata()
except yum.Errors.RepoError, e:
print 'Filelists not available for repo: %s' % repo
print 'Some dependencies may not be complete for this repository'
print 'Run as root to get all dependencies or use -t to enable a user temp
cache'
if not opts.quiet:
print 'Checking Dependencies'
baddeps = my.getBrokenDeps(opts.newest)
if opts.newest:
pkgs = []
for l in my.pkgSack.returnNewestByName():
for p in l:
pkgs.append(p)
num = len(pkgs)
else:
num = len(my.pkgSack)
repos = my.repos.listEnabled()
if not opts.quiet:
print 'Repos looked at: %s' % len(repos)
for repo in repos:
print ' %s' % repo
print 'Num Packages in Repos: %s' % num
pkgs = baddeps.keys()
pkgs.sort()
for pkg in pkgs:
srcrpm = pkg.returnSimple('sourcerpm')
print 'source rpm: %s\npackage: %s from %s\n unresolved deps: ' %
(srcrpm, pkg, pkg.repoid)
for (n, f, v) in baddeps[pkg]:
req = '%s' % n
if f:
flag = LETTERFLAGS[f]
req = '%s %s'% (req, flag)
if v:
req = '%s %s' % (req, v)
print ' %s' % req
print
if __name__ == "__main__":
main()
--- NEW FILE rc-report.py ---
#!/usr/bin/python
# -*- mode: Python; indent-tabs-mode: nil; -*-
import commands
import datetime, time
import os, sys
import re
import smtplib
domail = 1
mailsummary = 1
savehistory = 1
usehistory = True
maxmailsize = 39*1024
fromaddr = 'Fedora Extras repoclosure <buildsys(a)fedoraproject.org>'
replytoaddr = 'fedora-extras-list(a)redhat.com'
subject = 'Broken dependencies in Fedora Extras'
mailserver = 'localhost'
mailuser = ''
mailpasswd = ''
# Don't repeat a report for a src.rpm for 14 days.
waitdelta = datetime.timedelta( days = 14 )
today = datetime.date.today()
# Interface to Fedora Extras CVS owners/owners.list
class OwnersList:
owners = {} # map package name to email address, owners[name]
def Download(self):
# Remove 'owners' directory.
for root, dirs, files in os.walk( 'owners', topdown=False ):
for fname in files:
os.remove(os.path.join( root, fname ))
for dname in dirs:
os.rmdir(os.path.join( root, dname ))
# Retry CVS checkout a few times.
for count in range(3):
(rc, rv) = commands.getstatusoutput('LC_ALL=C CVS_RSH=rsh
CVSROOT=:pserver:anonymous@cvs.fedora.redhat.com:/cvs/extras cvs co owners')
if not rc:
break
time.sleep(300)
if rc:
print rv
sys.exit(1)
def Refresh(self):
self.ownersfile = 'owners/owners.list'
self.owners = {}
# Dumb caching. Check that file exists and is "quite recent".
try:
fstats = os.stat(self.ownersfile)
if ( not fstats.st_size or ((time.time() - fstats.st_ctime) > 3600*2) ):
raise Exception
except:
self.Download()
try:
f = file( self.ownersfile )
except:
print 'ERROR: could not open %s' % self.ownersfile
sys.exit(5)
for line in f:
if line.startswith('#') or line.isspace():
continue
try:
(repo,pkgname,summary,email,qacontact,cc) = line.split('|')
if email.find('@') < 0: # owners.list is broken
raise Exception
self.owners[pkgname] = email
#print '%s -> %s' % (pkgname, self.owners[pkgname])
except:
print 'ERROR: owners.list is broken'
print line
f.close()
def GetOwner(self,name):
try:
r = self.owners[name]
except KeyError:
r = ''
return r
def __init__(self):
self.Refresh()
# We identify broken packages based on their src.rpm name and don't report
# them more than once until expiration.
class History:
history = {}
incoming = {}
def __init__(self): # Load history map file and expire its contents.
try:
f = file ('history.txt')
for line in f:
(srcrpm,timestamp) = line.rstrip().split(' ')
(y,m,d) = timestamp.split('-')
timestamp = datetime.date( int(y), int(m), int(d) )
if ( timestamp+waitdelta > today ): # Filter out entries which are
too old.
self.history[srcrpm] = timestamp
f.close()
except IOError:
print 'WARNING: could not open history file for reading'
except:
pass
def Save(self):
for srcrpm,timestamp in self.incoming.iteritems():
self.Set(srcrpm,timestamp)
try:
f = file ('history.txt','w')
for srcrpm,timestamp in self.history.iteritems():
f.write( ('%s %s\n' % (srcrpm,timestamp)) )
f.close()
except:
print 'WARNING: could not open history file for writing'
def Set(self,srcrpmname,timestamp):
self.history[srcrpmname] = timestamp
def SetDelayed(self,srcrpmname,timestamp):
self.incoming[srcrpmname] = timestamp
def Get(self,srcrpmname):
try:
r = self.history[srcrpmname]
except KeyError:
r = 0
return r
def mail(smtp, fromaddr, toaddrs, replytoaddr, subject, body):
from email.Header import Header
from email.MIMEText import MIMEText
msg = MIMEText( body, 'plain' )
from email.Utils import make_msgid
msg['Message-Id'] = make_msgid()
msg['Subject'] = Header(subject)
msg['From'] = Header(fromaddr)
from email.Utils import formatdate
msg['Date'] = formatdate()
if len(replytoaddr):
msg['ReplyTo'] = Header(replytoaddr)
if isinstance(toaddrs, basestring):
toaddrs = [toaddrs]
to = ''
for t in toaddrs:
if len(to):
to += ', '
to += t
msg['To'] = Header(to)
try:
r = smtp.sendmail( fromaddr, toaddrs, msg.as_string(False) )
for (name, errormsg) in r.iteritems():
print name, ':', errormsg
except smtplib.SMTPRecipientsRefused, obj:
print 'ERROR: SMTPRecipientsRefused'
for (addr, errormsg) in obj.recipients.iteritems():
print addr, ':', errormsg
except smtplib.SMTPException:
print 'ERROR: SMTPException'
def mailsplit(smtp, fromaddr, toaddrs, replytoaddr, subject, body):
# NB: crude implementation - could also split at line positions
parts = 0
start = 0
end = len(body)
slices = []
while ( start < end ):
if ( (end-start) > maxmailsize ):
nextstart = body.rfind( 'package: ', start, start+maxmailsize )
if ( nextstart < 0 ):
nextstart = body.rfind( '\n', start, start+maxmailsize )
if ( nextstart < 0 ):
print 'ERROR: cannot split mail body cleanly'
nextstart = end
else:
nextstart = end
slices.append( (start, nextstart) )
start = nextstart
parts += 1
curpart = 1
for (start,end) in slices:
if (parts>1):
subjectmodified = ( '(%d/%d) %s' % (curpart, parts, subject) )
else:
subjectmodified = subject
slicedbody = body[start:end]
mail(smtp,fromaddr,toaddrs,replytoaddr,subjectmodified,slicedbody)
curpart += 1
if len(sys.argv) != 3:
print 'SYNTAX: %s <release> <logfile>' % sys.argv[0]
sys.exit(22)
release = sys.argv[1]
logfilename = sys.argv[2]
# This is ugly to get the report date from the report file name.
datere = re.compile('-(?P<timestamp>[0-9]+-[0-9]+-[0-9]+).txt$')
res = datere.search(logfilename)
if res:
datestring = res.group('timestamp')
else:
datestring = today
subject += (' %s - %s' % (release,datestring))
summail = ''
owners = OwnersList()
history = History()
report = {} # Map, report[email], mail message body to be sent to somebody.
summary = [] # list of "package version.arch" lines
oldproblems = []
repoids = {} # affected repository ids
pkgre = re.compile('(?P<name>.*)-[^-]+-[^-]+$')
inbody = False
srcrpm = ''
ownedby = ''
createreport = False
try:
f = file( logfilename )
except:
print 'ERROR: could not open input file'
sys.exit(5)
for line in f:
if line.startswith('source rpm: '):
w = line.rstrip().split(' ')
if ( len(w) >= 3 ):
srcrpm = w[2]
inbody = True
createreport = not (usehistory and history.Get(srcrpm))
if not history.Get(srcrpm):
history.SetDelayed(srcrpm,today)
else:
inbody = False
continue
elif inbody and line.startswith('package: '):
w = line.rstrip().split(' ')
repoid = w[5]
# Only report broken packages in Fedora Extras.
if ( repoid.find('extras') < 0 ):
inbody = False
continue
res = pkgre.search(srcrpm) # try to get src.rpm "name"
if not res: # only true for invalid input
inbody = False
continue
name = res.group('name')
ownedby = owners.GetOwner(name)
if ownedby == '':
x = 'ERROR: %s not in owners.list\nERROR: source rpm is %s' % ( name,
srcrpm )
summail += x + '\n'
inbody = False
continue
# name EVR.arch
summary.append ( ' '.join( ['\t', w[1], ' ', w[3],
repoid] ) )
repoids[repoid] = 1
if inbody:
# Construct report for package owner.
if createreport:
try:
report[ownedby] += line
except KeyError:
report[ownedby] = line
else:
oldproblems.append(line)
if savehistory:
history.Save()
summary.sort()
repos = repoids.keys()
repos.sort()
for repoid in repos:
count = 0
summail += ('Summary of broken packages in %s:\n' % repoid) +
'-'*70+'\n'
for name in summary:
p = name.find(repoid)
if p >= 0:
summail += name[:p]
summail += '\n'
count += 1
if not count:
summail += 'None\n'
summail += '\n'
if domail:
srv = smtplib.SMTP( mailserver )
#srv.set_debuglevel(1)
if ( len(mailuser) and len(mailpasswd) ):
try:
srv.login( mailuser, mailpasswd )
except smtplib.SMTPException:
print 'ERROR: mailserver login failed'
sys.exit(-1)
# Send mail to every package owner with broken package dependencies.
for toaddr,body in report.iteritems():
x = '='*70
summail += x+'\n'
x = 'New report for: %s\n\n%s' % ( toaddr.replace('@',' AT '),
body)
summail += x
mailtext = 'This is an automated mail created by an experimental script.\nYour
following packages in the repository contain broken dependencies:\n\n'
mailtext += body
if domail:
mailsplit( srv, fromaddr, toaddr, replytoaddr, subject, mailtext )
if len(oldproblems):
summail += '\n'+'='*70+'\n'
for line in oldproblems:
summail += line
if domail and mailsummary:
toaddr = replytoaddr # mail summary to list
mailsplit( srv, fromaddr, toaddr, '', ('Summary - %s' % subject),
summail )
if domail:
srv.quit()
--- NEW FILE rc-run.py ---
#!/usr/bin/python
# -*- mode: Python; indent-tabs-mode: nil; -*-
# If executed as "rc-run-all.py" it processes all releases.
import fcntl, os, sys
import datetime, time
allreleases = [ '3', '4', '5', 'development' ]
archs = { '3' : ['i386','x86_64'],
'4' : ['i386','x86_64','ppc'],
'5' : ['i386','x86_64','ppc'],
'development' : ['i386','x86_64','ppc']
}
repos = { '3' :
['fedora-core','fedora-core-updates','fedora-extras'],
'4' :
['fedora-core','fedora-core-updates','fedora-extras'],
'5' :
['fedora-core','fedora-core-updates','fedora-extras'],
'development' : ['fedora-core','fedora-extras']
}
targetarchs = { 'i386' : 'i686',
'x86_64' : 'x86_64',
'ppc' : 'ppc'
}
def makereport():
try:
os.remove(logfilename)
except:
pass
for arch in archs[release]:
rcargs = ('-a %s ' % targetarchs[arch])
for r in repos[release]:
repoid = '%s-%s-%s' % (r,release,arch)
rcargs += ('-r %s ' % repoid)
# -n, --newest : yum-utils 0.5
rc = os.system('./rc-modified -q -n -c ./yum.repoclosure.conf %s >>
%s' % (rcargs,logfilename))
if rc:
return False
return True
# Main.
# Delete old log files.
import glob
now = time.time()
for file in glob.glob('./rc-fe*.txt'):
if ( (now - os.stat(file).st_mtime) > 3600*24*14 ):
try:
os.remove(file)
except:
pass
today = datetime.date.today()
releases = []
f = open('rc-run.lockfile','w')
try:
rc = fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
f.write( ('%s' % today) )
except IOError:
print 'ERROR: script locked via lockfile - it seems to be running already'
sys.exit(11)
if sys.argv[0].endswith('rc-run-all.py'): # process all releases
for release in allreleases:
releases.append(release)
else: # process one release given as command-line argument
if len(sys.argv) != 2:
print 'SYNTAX: %s <release>' % sys.argv[0]
sys.exit(22)
release = sys.argv[1]
if release not in archs:
print 'ERROR: release %s is not supported' % release
sys.exit(22)
releases = [release]
goodlogs = []
badlogs = []
for release in releases:
logfilename = ('rc-fe%s-%s.txt' % (release,today))
rv = False
for count in range(3):
rv = makereport()
if ( rv ):
goodlogs.append( (release,logfilename) )
break
print 'ERROR: running repoclosure for %s failed' % release
time.sleep(720)
if ( not rv ):
badlogs.append( (release,logfilename) )
for (release,logfilename) in goodlogs:
rc = os.system('./rc-report.py %s %s' % (release,logfilename))
fcntl.flock(f, fcntl.LOCK_UN)
f.close()
sys.exit(0)
repoclosure.patch:
--- NEW FILE repoclosure.patch ---
Against yum-utils-0.5:
--- /usr/bin/repoclosure 2006-02-23 18:06:16.000000000 +0100
+++ rc-modified 2006-04-30 13:02:35.000000000 +0200
@@ -88,7 +88,10 @@
unresolved = {}
resolved = {}
if newest:
- pkgs = self.pkgSack.returnNewestByNameArch()
+ pkgs = []
+ for l in self.pkgSack.returnNewestByName():
+ for p in l:
+ pkgs.append(p)
else:
pkgs = self.pkgSack
@@ -167,7 +170,11 @@
baddeps = my.getBrokenDeps(opts.newest)
if opts.newest:
- num = len(my.pkgSack.returnNewestByNameArch())
+ pkgs = []
+ for l in my.pkgSack.returnNewestByName():
+ for p in l:
+ pkgs.append(p)
+ num = len(pkgs)
else:
num = len(my.pkgSack)
@@ -182,7 +189,8 @@
pkgs = baddeps.keys()
pkgs.sort()
for pkg in pkgs:
- print 'package: %s from %s\n unresolved deps: ' % (pkg, pkg.repoid)
+ srcrpm = pkg.returnSimple('sourcerpm')
+ print 'source rpm: %s\npackage: %s from %s\n unresolved deps: ' %
(srcrpm, pkg, pkg.repoid)
for (n, f, v) in baddeps[pkg]:
req = '%s' % n
if f:
@@ -192,6 +200,7 @@
req = '%s %s' % (req, v)
print ' %s' % req
+ print
if __name__ == "__main__":
main()
--- NEW FILE yum.repoclosure.conf ---
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1
# ===============================================================
# ATTENTION!
# Fedora Extras repository ids must contain the string 'extras'!
# ===============================================================
# Fedora Extras Development
[fedora-core-development-i386]
name=Fedora Core development i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/developme...
enabled=0
[fedora-extras-development-i386]
name=Fedora Extras development i386
baseurl=http://fedoraproject.org/extras/development/i386/
enabled=0
[fedora-core-development-x86_64]
name=Fedora Core development x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/developme...
enabled=0
[fedora-extras-development-x86_64]
name=Fedora Extras development x86_64
baseurl=http://fedoraproject.org/extras/development/x86_64/
enabled=0
[fedora-core-development-ppc]
name=Fedora Core development ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/developme...
enabled=0
[fedora-extras-development-ppc]
name=Fedora Extras development ppc
baseurl=http://fedoraproject.org/extras/development/ppc/
enabled=0
# Fedora Extras 5
[fedora-core-5-i386]
name=Fedora Core 5 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/i386/os/
enabled=0
[fedora-core-updates-5-i386]
name=Fedora Core 5 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5...
enabled=0
[fedora-extras-5-i386]
name=Fedora Extras 5 i386
baseurl=http://fedoraproject.org/extras/5/i386/
enabled=0
[fedora-core-5-x86_64]
name=Fedora Core 5 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/x86_64/os/
enabled=0
[fedora-core-updates-5-x86_64]
name=Fedora Core 5 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5...
enabled=0
[fedora-extras-5-x86_64]
name=Fedora Extras 5 x86_64
baseurl=http://fedoraproject.org/extras/5/x86_64/
enabled=0
[fedora-core-5-ppc]
name=Fedora Core 5 ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/ppc/os/
enabled=0
[fedora-core-updates-5-ppc]
name=Fedora Core 5 Updates ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5...
enabled=0
[fedora-extras-5-ppc]
name=Fedora Extras 5 ppc
baseurl=http://fedoraproject.org/extras/5/ppc/
enabled=0
## Fedora Extras 4
[fedora-core-4-i386]
name=Fedora Core 4 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/i386/os/
enabled=0
[fedora-core-updates-4-i386]
name=Fedora Core 4 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4...
enabled=0
[fedora-extras-4-i386]
name=Fedora Extras 4 i386
baseurl=http://fedoraproject.org/extras/4/i386/
enabled=0
[fedora-core-4-x86_64]
name=Fedora Core 4 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/x86_64/os/
enabled=0
[fedora-core-updates-4-x86_64]
name=Fedora Core 4 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4...
enabled=0
[fedora-extras-4-x86_64]
name=Fedora Extras 4 x86_64
baseurl=http://fedoraproject.org/extras/4/x86_64/
enabled=0
[fedora-core-4-ppc]
name=Fedora Core 4 ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/ppc/os/
enabled=0
[fedora-core-updates-4-ppc]
name=Fedora Core 4 Updates ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4...
enabled=0
[fedora-extras-4-ppc]
name=Fedora Extras 4 ppc
baseurl=http://fedoraproject.org/extras/4/ppc/
enabled=0
## Fedora Extras 3
[fedora-core-3-i386]
name=Fedora Core 3 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/3/i386/os/
enabled=0
[fedora-core-updates-3-i386]
name=Fedora Core 3 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3...
enabled=0
[fedora-extras-3-i386]
name=Fedora Extras 3 i386
baseurl=http://fedoraproject.org/extras/3/i386/
enabled=0
[fedora-core-3-x86_64]
name=Fedora Core 3 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/3/x86_64/os/
enabled=0
[fedora-core-updates-3-x86_64]
name=Fedora Core 3 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3...
enabled=0
[fedora-extras-3-x86_64]
name=Fedora Extras 3 x86_64
baseurl=http://fedoraproject.org/extras/3/x86_64/
enabled=0