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'"""
39 """Check to see if a given url can be fetched using wget.
40 Expects supplied url in list form, as outputted by bb.decodeurl().
42 (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
43 return type in ['http','https','ftp']
44 supports = staticmethod(supports)
46 def localpath(url, d):
47 # strip off parameters
48 (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
49 if "localpath" in parm:
50 # if user overrides local path, use it.
51 return parm["localpath"]
52 url = bb.encodeurl([type, host, path, user, pswd, {}])
54 return os.path.join(data.getVar("DL_DIR", d), os.path.basename(url))
55 localpath = staticmethod(localpath)
57 def go(self, d, urls = []):
62 Return the MD5SUM associated with the to be downloaded
64 It can return None if no md5sum is associated
71 def verify_md5sum(wanted_sum, got_sum):
73 Verify the md5sum we wanted with the one we got
78 return wanted_sum == got_sum
80 def fetch_uri(uri, basename, dl, md5, parm, d):
81 # the MD5 sum we want to verify
82 wanted_md5sum = md5_sum(parm, d)
83 if os.path.exists(dl):
84 # file exists, but we didnt complete it.. trying again..
85 fetchcmd = data.getVar("RESUMECOMMAND", d, 1)
87 fetchcmd = data.getVar("FETCHCOMMAND", d, 1)
89 bb.note("fetch " + uri)
90 fetchcmd = fetchcmd.replace("${URI}", uri)
91 fetchcmd = fetchcmd.replace("${FILE}", basename)
92 bb.debug(2, "executing " + fetchcmd)
93 ret = os.system(fetchcmd)
97 # check if sourceforge did send us to the mirror page
98 dl_dir = data.getVar("DL_DIR", d, True)
99 if not os.path.exists(dl):
100 os.system("rm %s*" % dl) # FIXME shell quote it
101 bb.debug(2,"sourceforge.net send us to the mirror on %s" % basename)
104 # supposedly complete.. write out md5sum
105 if bb.which(data.getVar('PATH', d), 'md5sum'):
107 md5pipe = os.popen('md5sum ' + dl)
108 md5data = (md5pipe.readline().split() or [ "" ])[0]
114 if not verify_md5sum(wanted_md5sum, md5data):
115 raise MD5SumError(uri)
117 md5out = file(md5, 'w')
118 md5out.write(md5data)
125 localdata = data.createCopy(d)
126 data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata)
127 data.update_data(localdata)
131 (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(uri, localdata))
132 basename = os.path.basename(path)
133 dl = self.localpath(uri, d)
134 dl = data.expand(dl, localdata)
137 if os.path.exists(md5):
138 # complete, nothing to see here..
141 premirrors = [ i.split() for i in (data.getVar('PREMIRRORS', localdata, 1) or "").split('\n') if i ]
142 for (find, replace) in premirrors:
143 newuri = uri_replace(uri, find, replace, d)
145 if fetch_uri(newuri, basename, dl, md5, parm, localdata):
152 if fetch_uri(uri, basename, dl, md5, parm, localdata):
156 mirrors = [ i.split() for i in (data.getVar('MIRRORS', localdata, 1) or "").split('\n') if i ]
157 for (find, replace) in mirrors:
158 newuri = uri_replace(uri, find, replace, d)
160 if fetch_uri(newuri, basename, dl, md5, parm, localdata):
165 raise FetchError(uri)