2 # ex:ts=4:sw=4:sts=4:et
3 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
5 BitBake 'Fetch' implementations
7 Classes for obtaining upstream sources for the
10 Copyright (C) 2003, 2004 Chris Larson
12 This program is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free Software
14 Foundation; either version 2 of the License, or (at your option) any later
17 This program is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23 Place, Suite 330, Boston, MA 02111-1307 USA.
25 Based on functions from the base bb module, Copyright 2003 Holger Schurig
31 from bb.fetch import Fetch
32 from bb.fetch import FetchError
33 from bb.fetch import MD5SumError
34 from bb.fetch import uri_replace
37 """Class to fetch urls via 'wget'"""
38 def supports(self, url, ud, d):
40 Check to see if a given url can be fetched with cvs.
42 return ud.type in ['http','https','ftp']
44 def localpath(self, url, ud, d):
46 url = bb.encodeurl([ud.type, ud.host, ud.path, ud.user, ud.pswd, {}])
48 return data.expand(os.path.join(data.getVar("DL_DIR", d), os.path.basename(url)), d)
50 def go(self, uri, ud, d):
55 Return the MD5SUM associated with the to be downloaded
57 It can return None if no md5sum is associated
64 def verify_md5sum(wanted_sum, got_sum):
66 Verify the md5sum we wanted with the one we got
71 return wanted_sum == got_sum
73 def fetch_uri(uri, basename, dl, md5, parm, d):
74 # the MD5 sum we want to verify
75 wanted_md5sum = md5_sum(parm, d)
76 if os.path.exists(dl):
77 # file exists, but we didnt complete it.. trying again..
78 fetchcmd = data.getVar("RESUMECOMMAND", d, 1)
80 fetchcmd = data.getVar("FETCHCOMMAND", d, 1)
82 bb.msg.note(1, bb.msg.domain.Fetcher, "fetch " + uri)
83 fetchcmd = fetchcmd.replace("${URI}", uri)
84 fetchcmd = fetchcmd.replace("${FILE}", basename)
85 bb.msg.debug(2, bb.msg.domain.Fetcher, "executing " + fetchcmd)
86 ret = os.system(fetchcmd)
90 # check if sourceforge did send us to the mirror page
91 dl_dir = data.getVar("DL_DIR", d, True)
92 if not os.path.exists(dl):
93 os.system("rm %s*" % dl) # FIXME shell quote it
94 bb.msg.debug(2, bb.msg.domain.Fetcher, "sourceforge.net send us to the mirror on %s" % basename)
97 # supposedly complete.. write out md5sum
98 if bb.which(data.getVar('PATH', d), 'md5sum'):
100 md5pipe = os.popen('md5sum ' + dl)
101 md5data = (md5pipe.readline().split() or [ "" ])[0]
107 if not verify_md5sum(wanted_md5sum, md5data):
108 raise MD5SumError(uri)
110 md5out = file(md5, 'w')
111 md5out.write(md5data)
115 localdata = data.createCopy(d)
116 data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata)
117 data.update_data(localdata)
120 basename = os.path.basename(ud.path)
121 dl = data.expand(ud.localpath, localdata)
124 if os.path.exists(md5):
125 #complete, nothing to see here..
126 #touch md5 file to show activity
130 premirrors = [ i.split() for i in (data.getVar('PREMIRRORS', localdata, 1) or "").split('\n') if i ]
131 for (find, replace) in premirrors:
132 newuri = uri_replace(uri, find, replace, d)
134 if fetch_uri(newuri, basename, dl, md5, ud.parm, localdata):
141 if fetch_uri(uri, basename, dl, md5, ud.parm, localdata):
145 mirrors = [ i.split() for i in (data.getVar('MIRRORS', localdata, 1) or "").split('\n') if i ]
146 for (find, replace) in mirrors:
147 newuri = uri_replace(uri, find, replace, d)
149 if fetch_uri(newuri, basename, dl, md5, ud.parm, localdata):
154 raise FetchError(uri)