downloadkit/downloadkit.py
changeset 124 b60a149520e7
child 125 c107e11c37e8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/downloadkit/downloadkit.py	Fri Dec 18 13:32:54 2009 +0000
@@ -0,0 +1,195 @@
+#!/usr/bin/python
+# Copyright (c) 2009 Symbian Foundation.
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Symbian Foundation - Initial contribution
+# 
+# Description:
+# Script to download and unpack a Symbian PDK - assumes "7z" installed to unzip the files
+
+import urllib2
+import urllib
+import os.path
+import cookielib
+import sys
+import getpass
+import re
+from BeautifulSoup import BeautifulSoup
+
+user_agent = 'downloadkit.py script'
+headers = { 'User-Agent' : user_agent }
+top_level_url = "http://developer.symbian.org"
+
+username = ''
+password = ''
+
+COOKIEFILE = 'cookies.lwp'
+# the path and filename to save your cookies in
+
+# importing cookielib worked
+urlopen = urllib2.urlopen
+Request = urllib2.Request
+cj = cookielib.LWPCookieJar()
+
+# This is a subclass of FileCookieJar
+# that has useful load and save methods
+if os.path.isfile(COOKIEFILE):
+	cj.load(COOKIEFILE)
+	
+# Now we need to get our Cookie Jar
+# installed in the opener;
+# for fetching URLs
+opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
+urllib2.install_opener(opener)
+
+def login(prompt):
+	global username
+	global password
+	loginurl = 'https://developer.symbian.org/main/user_profile/login.php'
+	
+	if prompt:
+		print >> sys.stderr, 'username: ',
+		username=sys.stdin.readline().strip()
+		password=getpass.getpass()
+	
+	values = {'username' : username,
+	          'password' : password,
+	          'submit': 'Login'}
+	          
+	headers = { 'User-Agent' : user_agent }
+	
+	
+	data = urllib.urlencode(values)
+	req = urllib2.Request(loginurl, data, headers)
+
+	response = urllib2.urlopen(req)
+	doc=response.read()      
+
+	if doc.find('Please try again') != -1:
+		print >> sys.stderr, 'Login failed'
+		return False
+	
+	cj.save(COOKIEFILE) 
+	return True
+
+from threading import Thread
+
+class unzipfile(Thread):
+	def __init__ (self,filename,levels=1,deletelevels=0):
+		Thread.__init__(self)
+		self.filename = filename
+		self.levels = levels
+		self.deletelevels = deletelevels
+		self.status = -1
+		
+	def unzip(self,filename,unziplevel,deletelevel):
+		if unziplevel < 1:
+			return 0   # do nothing
+
+		print "  Unzipping " + filename
+		filelist = os.popen("7z x -y "+self.filename)
+		subzips = []
+		for line in filelist.readlines():
+			# Extracting  src_oss_app_webuis.zip
+			match = re.match(r"^Extracting\s+(\S+.zip)$", line)
+			if match is None: continue
+			subzips.append(match.group(1))
+		topstatus = filelist.close()
+
+		if deletelevel > 0:
+			print "  Deleting " + filename
+			os.remove(filename)
+		if unziplevel > 1 and len(subzips) > 0:
+			print "  Expanding %d zip files from %s" % (len(subzips), filename)
+			for subzip in subzips:
+				self.unzip(subzip, unziplevel-1, deletelevel-1)
+		return topstatus
+	def run(self):
+		self.status = self.unzip(self.filename, self.levels, self.deletelevels)
+
+def downloadkit(version):
+	urlbase = 'http://developer.symbian.org/main/tools_and_kits/downloads/'
+
+	viewid = 5   # default to Symbian^3
+	if version[0] == 2:
+		viewid= 1  # Symbian^2
+	if version[0] == 3:
+		viewid= 5  # Symbian^3
+	url = urlbase + ('view.php?id=%d'% viewid) + 'vId=' + version
+
+	req = urllib2.Request(url)
+	response = urllib2.urlopen(req)
+	doc=response.read()
+	
+	# BeatifulSoup chokes on some javascript, so we cut away everything before the <body>
+	try:
+		bodystart=doc.find('<body>')
+		doc = doc[bodystart:]
+	except:
+		pass
+
+	threadlist = []
+	# let's hope the HTML format never changes...
+	# <a href='download.php?id=27&cid=60&iid=270' title='src_oss_mw.zip'> ...</a> 
+
+	soup=BeautifulSoup(doc)
+	results=soup.findAll('a', href=re.compile("^download"), title=re.compile("\.(zip|xml)$"))
+	for result in results:
+		downloadurl = urlbase + result['href']
+		filename = result['title']
+		print 'Downloading ' + filename
+		req = urllib2.Request(downloadurl)
+		
+		try:
+			response = urllib2.urlopen(req)
+			CHUNK = 128 * 1024
+			first_chunk = True
+			fp = open(filename, 'wb')
+			while True:
+				chunk = response.read(CHUNK)
+				if not chunk: break
+				if first_chunk and chunk.find('<div id="sign_in_box">') != -1:
+					# our urllib2 cookies have gone awol - login again
+					login(False)
+					req = urllib2.Request(downloadurl)
+					response = urllib2.urlopen(req)
+					chunk = response.read(CHUNK)	  
+				fp.write(chunk)
+				first_chunk = False
+			fp.close()
+
+		#handle errors
+		except urllib2.HTTPError, e:
+			print "HTTP Error:",e.code , downloadurl
+		except urllib2.URLError, e:
+			print "URL Error:",e.reason , downloadurl
+
+		# unzip the file (if desired)
+		if re.match(r"(bin|epoc).*\.zip", filename):
+			unzipthread = unzipfile(filename, 1, 0)   # unzip once, don't delete
+			threadlist.append(unzipthread)
+			unzipthread.start()
+		elif re.match(r"src_.*\.zip", filename):
+			unzipthread = unzipfile(filename, 1, 1)   # zip of zips, delete top level
+			threadlist.append(unzipthread)
+			unzipthread.start()
+		elif re.match(r"build_BOM.zip", filename):
+			unzipthread = unzipfile(filename, 1, 1)   # unpack then delete zip as it's not needed again
+			threadlist.append(unzipthread)
+			unzipthread.start()
+
+	# wait for the unzipping threads to complete
+	print "Waiting for unzipping to finish..."
+	for thread in threadlist:
+		thread.join()  
+
+	return 1
+
+
+login(True)
+downloadkit(sys.argv[1])