#!/usr/bin/env python import os, sys, subprocess, locale, urllib2, gobject import pygtk pygtk.require('2.0') import gtk def download_chunk(base): # download 10kb a time chunk = base.dl_response.read(10240) base.dl_bytes_so_far += len(chunk) base.tarball_file.write(chunk) if not chunk: base.tarball_file.close() return False percent = float(base.dl_bytes_so_far) / base.dl_total_size base.progressbar.set_fraction(percent) percent = round(percent*100, 2) base.progressbar.set_text("Downloaded %d" % (percent) + '%') sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)\r" % (base.dl_bytes_so_far, base.dl_total_size, percent)) if base.dl_bytes_so_far >= base.dl_total_size: sys.stdout.write('\n') return True class TorBrowserLauncher: def __init__(self, current_tbb_version): # figure out the architecture architecture = subprocess.check_output(['arch']).strip('\n') # figure out the language available_languages = ['en-US', 'ar', 'de', 'es-ES', 'fa', 'fr', 'it', 'ko', 'nl', 'pl', 'pt-PT', 'ru', 'vi', 'zh-CN'] language = locale.getdefaultlocale()[0].replace('_', '-') if language not in available_languages: language = language.split('-')[0] if language not in available_languages: for l in available_languages: if l[0:2] == language: language = l # if language isn't available, default to english if language not in available_languages: language = 'en-US' # make sure local directory structure is setup data_dir = os.getenv('HOME')+'/.torbrowser' download_dir = data_dir+'/download' tbb_dir = data_dir+'/tbb/'+architecture+'/'+language if os.path.exists(download_dir) == False: print 'making '+download_dir os.makedirs(download_dir) if os.path.exists(tbb_dir) == False: print 'making '+tbb_dir os.makedirs(tbb_dir) # is TBB already installed? tbb_start = tbb_dir+'/start-tor-browser' if os.path.isfile(tbb_start): print 'Launching '+tbb_start subprocess.call([tbb_start]) else: tarball_filename = 'tor-browser-gnu-linux-'+architecture+'-'+current_tbb_version+'-dev-'+language+'.tar.gz' tarball_path = download_dir+'/'+tarball_filename if os.path.exists(tarball_path): # already downloaded print 'Already downloaded' else: # launch downloader #tarball_url = 'https://www.torproject.org/dist/torbrowser/linux/'+tarball_filename tarball_url = 'http://127.0.0.1/'+tarball_filename self.timer = False self.current_tbb_version = current_tbb_version self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("Tor Browser Launcher - First Run") self.window.set_border_width(10) self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.box = gtk.VBox(False, 20) self.window.add(self.box) self.label = gtk.Label("The first time you run the Tor Browser Launcher you need to download the Tor Browser Bundle. Would you like to download it from the following URL now?") self.label.set_line_wrap(True) self.box.pack_start(self.label, True, True, 0) self.label.show() self.progressbar = gtk.ProgressBar(adjustment=None) self.progressbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT) self.box.pack_start(self.progressbar, True, True, 0) self.button_box = gtk.HButtonBox() self.button_box.set_layout(gtk.BUTTONBOX_SPREAD) self.box.pack_start(self.button_box, True, True, 0) self.button_box.show() self.download = gtk.Button("Download") self.download.connect("clicked", self.start_download, None) self.button_box.add(self.download) self.download.show() self.exit = gtk.Button("Exit") self.exit.connect("clicked", self.destroy, None) self.button_box.add(self.exit) self.exit.show() self.box.show() self.window.show(); def delete_event(self, widget, event, data=None): return False def destroy(self, widget, data=None): if self.timer: gobject.source_remove(self.timer) self.timer = False gtk.main_quit() def start_download(self, widget, data=None): print 'Starting to download '+self.tarball_url # disable the download button self.download.set_sensitive(False) # initialize the progress bar self.progressbar.set_fraction(0) self.progressbar.set_text('Downloaded 0%') self.progressbar.show() # start the download self.dl_response = urllib2.urlopen(self.tarball_url); self.dl_total_size = self.dl_response.info().getheader('Content-Length').strip() self.dl_total_size = int(self.dl_total_size) self.dl_bytes_so_far = 0 # set a timer to download more chunks self.timer = gobject.timeout_add(1, download_chunk, self) # open a file to write to self.tarball_file = open(self.tarball_path, 'w') def main(self): gtk.main() if __name__ == "__main__": print 'Tor Browser Launcher' print 'https://github.com/micahflee/torbrowser-launcher' current_tbb_version = '2.3.25-2' app = TorBrowserLauncher(current_tbb_version) app.main()