def get_file(ftp_dir,storage_path,name, bundlename): log_info('Fetching file [%s]' % name) create_dir(user_file_cache) ftp = None try: ftp = FTP(FREABES_FTP,timeout=10) if not os.path.isfile(storage_path): ftp.login(USERNAME,PASSWORD) ftp.cwd(ftp_dir) file_to_write = open(storage_path, 'wb') size = ftp.size(name) ftp.retrbinary('RETR %s' % name, lambda block: flush(block, file_to_write, ftp, storage_path, size, bundlename)) else: log_info('Already fetched file %s' % name) except ftplib.all_errors as a: if is_ftp_overloaded(a): raise FtpOverloadedException('overload') else: raise InvalidZipFileException('Unable to get file') except: if os.path.exists(storage_path): log_info('Removing file [%s]' %storage_path) delete_file(storage_path) if not (was_dia_cancelled()): log_info('Exception while retrieving file %s , retrying' %name) raise InvalidZipFileException('Unable to get file') else: log_info('Cancelled download') finally: if ftp is not None: ftp.close()
def register_login(uid): try: response = exec_http(uid,'user_login') post_ga_event('assembly_backend','login',get_cm_param(response.code)) except: post_ga_event('assembly_backend','login' ,get_cm_param(500)) log_info('Unable to register login')
def on_refresh_db(self, event): post_ga_event('application_click','refresh_db') try: utils.refresh_local_db() update_tree_view(self) wx.MessageBox('Refreshed db','Info', wx.OK | wx.ICON_INFORMATION) except FtpOverloadedException: log_info('Unable to refresh db due to overload') wx.MessageBox('Too many users right now, please try later', 'Info', wx.OK | wx.ICON_WARNING) except: log_info('Unable to refresh db') wx.MessageBox('Error during install %s' % sys.exc_info()[0], 'Info', wx.OK | wx.ICON_WARNING)
def get_file_fastfail(ftp_dir,storage_path,name,force=False): log_info('Fetching file [%s]' % name) assert_folders() ftp = None try: ftp = FTP(FREABES_FTP) if not os.path.isfile(storage_path) or force is True: ftp.login(USERNAME,PASSWORD) ftp.cwd(ftp_dir) ftp.retrbinary('RETR %s' % name, open(storage_path, 'wb').write) else: log_info('Already fetched file %s' % name) except ftplib.all_errors as a: if is_ftp_overloaded(a): raise FtpOverloadedException('overload') else: raise InvalidZipFileException('Unable to get file') except: if os.path.exists(storage_path): log_info('Removing file [%s]' %storage_path) os.remove(storage_path) log_info('Exception while retrieving file %s , retrying' %name) raise finally: if ftp is not None: ftp.close()
def do_upgrade(splash, version, platform): try: path = os.getcwd().replace('/','\\') update_file = '%s/%s' %(user_file_cache, platform['dist']) get_file(settings.get_ftp_base_dir(),update_file, platform['dist'], 'Assemblyupdate') extract_file_lite(update_file,path) sleep(2) splash.Hide() delete_file(update_file) command = r'%s/platform/%s' %(path,platform['script']) base = r'%s/upgrade/assembly' %path target = r'%s' % os.getcwd() close() subprocess.Popen([command, base.replace('/','\\'), target.replace('/','\\'), version],shell=True) except: log_info(sys.exc_info()[0]) close()
def refresh_local_db(): log_info('Refreshing artifactsfilen') ftp = None try: ftp = FTP(FREABES_FTP,timeout=10) ftp.login(USERNAME,PASSWORD) ftp.cwd(FTP_BASE_DIR) ftp.retrbinary('RETR %s' % 'artifacts.json', open(user_local_db + 'artifacts.json', 'wb').write) except ftplib.all_errors as a: if is_ftp_overloaded(a): raise FtpOverloadedException('overload') else: raise finally: if ftp is not None: ftp.close()
def remove_from_view(self, e): dlg = wx.MessageDialog(self,'Are you sure?', 'Remove %s from view' % item.name ,wx.OK|wx.CANCEL | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_OK: post_ga_event('application_click','hide_%s' % item.name) utils.add_user_attribute('exclude_%s' % item.name,'true') update_tree_view(self) dlg.Destroy() else: dlg.Destroy() return if os.path.exists('%s/%s/' % (dir_name, item.folder)): dlg = wx.MessageDialog(self,'Are you sure?', 'Folder was already installed, delete contents on disk?',wx.OK|wx.CANCEL | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_OK: log_info('Deleting current folder %s' % item.folder) Thread(target=delete_folder,args=(self,item)).start() utils.delete_db(dir_name,item)
def init_db(): log_info('Init db')
def log_dia_info(text): if dlg is not None: dlg.update_text(text) log_info(text)
def on_delete_artifacts(self, event): Thread(target=utils.delete_folder,args=(utils.user_file_cache,)).start() post_ga_event('application_click','delete_artifacts') wx.MessageBox('Local cachefiles were removed', 'Remove cached files' , wx.OK | wx.ICON_INFORMATION) log_info('Deleted cached artifacts')
def __init__(self, parent, title): reload(sys) sys.setdefaultencoding('utf8') log_info('Assembly v.%s started' % version) Thread(target=login_user, args=(self,client_id)).start() if not initial_db_refresh_done: wx.MessageBox('Unable to communicate with server.', 'Assembly Error',wx.OK | wx.ICON_ERROR) sys.exit(0) width = 300 height = 600 wx.Frame.__init__(self, parent, pos=get_pos(width,height), title=title, size=(width,height)) favicon = wx.Icon('images/bigicon2.ico',wx.BITMAP_TYPE_ICO) wx.Frame.SetIcon(self,favicon) menu_bar = wx.MenuBar() menu = wx.Menu() m_open = menu.Append(wx.ID_FILE1, "S&elect SDCard location", "Select the location where your SD card or such is located") self.Bind(wx.EVT_MENU, self.on_open, m_open) m_refresh_local_db = menu.Append(wx.ID_FILE3, "R&efresh db from server", "") self.Bind(wx.EVT_MENU, self.on_refresh_db, m_refresh_local_db) self.Bind(wx.EVT_MENU, self.on_exit,menu.Append(wx.ID_FILE8, "Exit", "")) menu_bar.Append(menu, "&File") artifactsMenu = wx.Menu() m_restorehidden = artifactsMenu.Append(wx.ID_FILE6, "Restore view") self.Bind(wx.EVT_MENU, self.restore_hidden, m_restorehidden) menu_bar.Append(artifactsMenu, "Artifacts") m_delta_artifacts = artifactsMenu.Append(wx.ID_FILE2, "Delete artifacts cache", "") self.Bind(wx.EVT_MENU, self.on_delete_artifacts, m_delta_artifacts) settingsMenu = wx.Menu() m_settings = settingsMenu.Append(wx.ID_FILE7, "Settings") self.Bind(wx.EVT_MENU, self.view_settings, m_settings) menu_bar.Append(settingsMenu, "Misc") m_log = settingsMenu.Append(wx.ID_FILE5, "View log", "") self.Bind(wx.EVT_MENU, self.on_show_log, m_log) m_about = settingsMenu.Append(wx.ID_FILE4, "About", "") self.Bind(wx.EVT_MENU, self.on_about, m_about) self.SetMenuBar(menu_bar) self.tree = wx.TreeCtrl(self, style=wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_EDIT_LABELS) self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.on_drag, self.tree) if utils.has_attribute(work_dir_key): work_dir = utils.get_user_attribute(work_dir_key) if os.path.exists(work_dir): global dir_name dir_name = work_dir update_tree_view(self) self.Show() if utils.get_bool_attribute('show_info_popup') : Thread(target=show_info, args=(self,)).start()
def update_item(self, item,dispose_dia = True): post_ga_event('update_item','artifact_%s' % item.name) try: if item.create_delta: for deltaitem in item.deltas: if not utils.check_if_already_updated_with_delta(dir_name, item.name, deltaitem.version): log_dia_info('Updating file %s' % deltaitem.file) retries = 0 nof_retries = 3 while retries < nof_retries: utils.get_file(utils.resolve_delta_dir(item),utils.get_storage_location(deltaitem.file),deltaitem.file,item.name) dia_tick() if was_dia_cancelled(): log_dia_info('Cancelling...') break if item.dynamic_import: utils.delete_folder(utils.user_file_cache_dyn) utils.create_dir(utils.user_file_cache_dyn) try: if was_dia_cancelled(): log_dia_info('Cancelling...') break utils.extract_file(utils.get_storage_location(deltaitem.file), utils.user_file_cache_dyn,item,True) if was_dia_cancelled(): log_dia_info('Cancelling...') break dynamic_import.move_in_place(utils.user_file_cache + 'dyn/%s/' % item.folder, '%s/%s/' % (dir_name, item.folder)) if was_dia_cancelled(): log_dia_info('Cancelling...') update_tree_view(self) break utils.update_db(dir_name, item.name, deltaitem.version) utils.delete_folder(utils.user_file_cache + 'dyn/%s/' % item.folder) item.needs_update = False update_tree_view(self) dia_tick() break except FtpOverloadedException: post_ga_event('update_item_ftp_overload','artifact_%s' % deltaitem.file) raise except InvalidZipFileException as e: post_ga_event('update_item_invalid_zip','artifact_%s' % deltaitem.file) utils.delete_file(utils.get_storage_location(deltaitem.file)) if retries == nof_retries-1: raise else: log_info('Unpacking %s into %s' % (item.name, dir_name)) try: if was_dia_cancelled(): log_dia_info('Cancelling...') break utils.extract_file(utils.get_storage_location(deltaitem.file), dir_name,item,False) if was_dia_cancelled(): log_dia_info('Cancelling...') update_tree_view(self) break utils.update_db(dir_name, item.name, deltaitem.version) target_folder = dir_name + '/' + item.folder log_dia_info('Updated %s with deltafile %s at location %s' % (item.name,deltaitem.file,target_folder)) item.needs_update = False update_tree_view(self) dia_tick() if utils.get_boolean_user_setting(delete_files_after_install): utils.delete_file(utils.get_storage_location(deltaitem.file)) break except FtpOverloadedException: post_ga_event('update_item_ftp_overload','artifact_%s' % deltaitem.file) raise except InvalidZipFileException: post_ga_event('update_item_invalid_zip','artifact_%s' % deltaitem.file) log_dia_info('Invalid deltazifile, delete and retry') utils.delete_file(utils.get_storage_location(deltaitem.file)) if retries == nof_retries-1: raise retries += 1 if dispose_dia: wx.CallAfter(dispose_dialog) except FtpOverloadedException: if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Too many users right now, please try again later') except InvalidZipFileException as e: if dispose_dia: wx.CallAfter(dispose_dialog_fail,e.message) except: if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Unknown error %s:' % sys.exc_info()[0]) finally: update_tree_view(self)
def install_item(self, current_item, dispose_dia = True): post_ga_event('install_item','artifact_%s' % current_item.name) folder = '%s/%s/' % (dir_name, current_item.folder) if not utils.check_if_already_updated_with_delta(dir_name, current_item.name, current_item.version) or not os.path.exists(folder): try: log_dia_info('Getting full entry %s' % current_item.name) retries = 0 nof_retries = 3 while retries < nof_retries: try: utils.get_file(current_item.basedir,utils.get_storage_location(current_item.file),current_item.file,current_item.name) if os.path.exists(folder): log_dia_info('Deleting current folder %s (this may take a while, please be patient)' % folder) utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) if was_dia_cancelled(): log_dia_info('Downloaded for %s was cancelled' % current_item.name) if dispose_dia: wx.CallAfter(dispose_dialog) return log_dia_info('Downloaded %s' % current_item.name) log_dia_info('Extracting files %s' %dir_name) dia_tick() utils.extract_file(utils.get_storage_location(current_item.file), dir_name,current_item,True) dia_tick() break; except InvalidZipFileException: post_ga_event('install_item_invalid_zip','artifact_%s' % current_item.name) log_info('Invalid zifile, delete and retry') utils.delete_file(utils.get_storage_location(current_item.file)) if retries == nof_retries-1: raise retries+=1 if utils.get_boolean_user_setting(delete_files_after_install): utils.delete_file(utils.get_storage_location(current_item.file)) if was_dia_cancelled(): if dispose_dia: wx.CallAfter(dispose_dialog) return log_dia_info('Update db') utils.update_db(dir_name, current_item.name, current_item.version) current_item.not_installed = False log_dia_info('Done extracting full entry %s at location %s' % (current_item.name, dir_name)) log_dia_info('Install done') if dispose_dia: wx.CallAfter(dispose_dialog) except InvalidZipFileException as e: utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) log_dia_info('Install failed du to error during fetch or unzip') if dispose_dia: wx.CallAfter(dispose_dialog_fail,e.message) except FtpOverloadedException as e: log_dia_info('Too many users, please try agin in a while') if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Too many users, please try later') except: utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) log_dia_info('Install failed due to unknown error') if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Unknown error %s:' % sys.exc_info()[0]) finally: update_tree_view(self) else: if dispose_dia: wx.CallAfter(dispose_dialog)