Example #1
0
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()
Example #2
0
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')
Example #3
0
 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)
Example #4
0
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()
Example #5
0
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()
Example #6
0
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()
Example #7
0
    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)
Example #8
0
def init_db():
    log_info('Init db')
Example #9
0
def log_dia_info(text):
    if dlg is not None:
        dlg.update_text(text)
    log_info(text)
Example #10
0
 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')
Example #11
0
    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()
Example #12
0
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)
Example #13
0
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)