def restore_files(self): index = 0 for n in self.files: self.progress.update_progress(index + 1) os.system('cp %s %s' % (n.Source, n.Destination)) index += 1 processEvents()
def __init__(self, controller=None, temp_path="", packages_path="", filename=""): """ Constructor """ self.controller = controller self.glade = gui.get_glade(constants.RESTORE_GUI, WINDOW_NAME) self.temp_path = temp_path self.cd_path = "" self.root_shell = None if self.temp_path == "" or self.temp_path == None: self.temp_path = constants.TEMP_FOLDER else: self.temp_path = temp_path self.packages_path = packages_path self.isoFileName = filename self.restoretype = constants.RESTORE_TYPE.RESTORE_FROM_NONE self.window = gui.get_widget(self.glade, WINDOW_NAME) if self.controller: self.window.set_decorated(False) self.content = gui.set_parent_widget_from_glade(self.glade, WINDOW_NAME, self.controller.restoreContainer) self.window.destroy() gui.setCursorToBusy(self.controller.get_main_window(), True) else: # Window Widgets self.window.show() gui.setCursorToBusy(self.window, True) self.ListContainer = gui.get_widget(self.glade, "ListContainer") self.lblPkgDesc = gui.get_widget(self.glade, "lblPkgDesc") self.pkgImg = gui.get_widget(self.glade, "pkgImg") self.btnRestorePackages = gui.get_widget(self.glade, "restorePackages") self.btnLoadFrom = gui.get_widget(self.glade, "btnLoadFrom") self.btnRestorePackages.set_sensitive(False) self.packageList = PackageList.PackageView(self) self.ListContainer.add(self.packageList) self.ListContainer.show_all() gui.processEvents() if self.controller: self.controller.show_status_message(constants.MESSAGE_0001) # self.packageList.load_package_folder(self.packages_path) self.bind_signals() if self.isoFileName != "": self.restoreFromIso(self.isoFileName, self.temp_path)
def create_iso(self, isoFileList, tmpdir): self.progress.can_cancel_progress = False self.steps.set_current(2) today = datetime.date.today().strftime('%Y%m%d') #this will hold all isos that we will create #from user selection self.isos = [] for cds in isoFileList.keys(): media_folder_name = self.values['media_type'] + str(cds) current_msg = constants.MESSAGE_0022 + ' (' + media_folder_name + ')' self.steps.set_current_text(2, current_msg ) tmppackages = utils.join_path(tmpdir , 'packages') destination = utils.join_path(tmppackages, media_folder_name) if self.values['isoname'] == '': fileNames = utils.list_dir(self.values['destination'], 'aptoncd-' + today +"-" + self.values['media_type'] + str(cds)) if len(fileNames) > 0: fileDestiny = 'aptoncd-' + today +"-" + self.values['media_type'] + str(cds) +'-'+str(len(fileNames)) +'.iso' else: fileDestiny = 'aptoncd-' + today +"-" + self.values['media_type'] + str(cds) +'.iso' else: fileNames = utils.list_dir(self.values['destination'], self.values['isoname'] +"-" + self.values['media_type'] + str(cds)) if len(fileNames) >0: fileDestiny = self.values['isoname'].replace('.iso','') + "-" + self.values['media_type'] + str(cds) +'-' +str( len(fileNames)) +'.iso' else: fileDestiny = self.values['isoname'].replace('.iso','') + "-" + self.values['media_type'] + str(cds) +'.iso' finalDestiny = utils.join_path(self.values['destination'], fileDestiny) self.isos.append(finalDestiny) #update processes #marking first as done and starting a new one self.progress.progress_text = constants.MESSAGE_0032 + ' '+ self.values['media_type'] + str(cds) + ' ('+fileDestiny+')' gui.processEvents() #now create the iso file finald = finalDestiny destd = destination command = ['-iso-level', '4' ,'-pad', '-l','-r', '-J', '-joliet-long', '-v', '-V', 'APTonCD', '-hide-rr-moved', '-o', unicode(finald,'utf8'),unicode(destd,'utf8')] iso_file = Mkisofs() self.progress.stop = 100 iso_file.set_progress_hook(self.progress.update_percent) iso_file.create_iso(command) self.steps.set_current_text(2,constants.MESSAGE_0022) self.steps.set_done(2) self.progress.update_progress(0)
def copy_files(self): gui.setCursorToBusy(self.get_parent_widget(), True) self.controller.get_main_window().set_sensitive(False) progress = self.get_parent().progressbar progress.show() self.controller.show_status_message("preparing to copy files") script_file = os.path.join(constants.TEMP_FOLDER, "aoc.sc") ifile = open(script_file, "w") indx = 1 self.file_count = 1 f_len = len(self.packageList.store) for nItens in self.packageList.store: if nItens[0]: pkg = nItens[PackageList.COL_PACKAGE] source = pkg.deb_full_filename destination = utils.join_path(constants.LOCAL_APT_FOLDER, pkg.deb_filename) if not utils.fileExist(destination): ifile.write("%s|%s\n" % (source, destination)) self.file_count += 1 percent = float(indx) / f_len progress.set_fraction(percent) progress.set_text(str(int(percent * 100)) + "%") gui.processEvents() indx += 1 ifile.close() self.controller.show_status_message("Wait while your system is being restored.") progress.hide() gui.processEvents() parentwd = self.controller.get_main_window() winid = parentwd.window.xid file_exec = constants.COPY_SCRIPT command = "gksu --desktop " + constants.DESKTOP_FILE + " 'python %s %s %s'" % (file_exec, winid, script_file) os.system(command) gui.processEvents() self.packageList.update_parent_count() self.controller.get_main_window().set_sensitive(True) gui.setCursorToBusy(self.get_parent_widget())
def load_package_folder(self, path_to_scan, custom = False, recursive = False): """ Loads all packages files from a given path in to the list. """ gui.setCursorToBusy(self.controller.get_parent_widget(),True) self.controller.get_main_window().set_sensitive(False) processEvents() self.store._load_cache() list_bad = [] not_added = [] progress = self.controller.get_parent().progressbar progress.show() processEvents() # now get all packages in cache packages_files = utils.get_deb_from_folder(path_to_scan, recursive) f_len = len(packages_files) for index, pkg in enumerate(packages_files): #add the package to the list index+=1 percent = (float(index) / f_len) iter = self.store.add_item(pkg,path_to_scan, custom) if iter == None: not_added.append(os.path.basename(pkg)) else: if self.store.get_value(iter, COL_PACKAGE).bad: list_bad.append(self.store.get_value(iter, COL_PACKAGE).deb_filename) progress.set_fraction(percent) progress.set_text(str(int(percent * 100)) + '%' ) #process pending events / update the window if index % 2 == 0: processEvents() processEvents() progress.set_fraction(0) progress.hide() progress.set_text('0%') progress.set_fraction(0) self.controller.controller.show_status_message('Checking versions...') processEvents() self.store.uncheck_minor_version() #self.count_packages() self.not_in_cache = [] self.controller.controller.show_status_message('Checking uncached packages...') processEvents() for n in self.store.installed: if not self.store.get_package(n,self.store.installed[n]): self.not_in_cache.append(n) #print len(self.not_in_cache) #update the parent count labels self.update_parent_count() self.controller.get_main_window().set_sensitive(True) self.set_model(self.store) self.get_selection().select_path((0,0)) self.grab_focus() gui.setCursorToNormal(self.controller.get_parent_widget()) #show packages not inserted due to already exist in list if len(not_added)>0: self.__load_dialog_skip(not_added) if len(list_bad)>0: self.__load_dialog_skip(list_bad)
def add_from_file_list(self, packages_names): """ Loads all packages files from a given path in to the list. """ gui.setCursorToBusy(self.controller.get_parent_widget(),True) self.controller.get_main_window().set_sensitive(False) #self.clear() list_bad = [] not_added = [] f_len = len(packages_names) pbar_shown = False #only show progressbar if user selects more than 5 packages if len(packages_names) > 5: if self.controller.get_parent(): progress = self.controller.get_parent().progressbar progress.show() pbar_shown = True else: pbar_shown = False processEvents() indx = 1 # now get all packages in cache for index in range(f_len): percent = (float(index) / f_len) filename = os.path.basename(packages_names[index]) pathname = os.path.dirname(packages_names[index]) iter = self.store.add_item(filename,pathname, True) if iter == None: not_added.append(filename) else: #self.get_selection().select_iter(iter) if self.store.get_value(iter, COL_PACKAGE).bad: list_bad.append(self.store.get_value(iter, COL_PACKAGE).deb_filename) #process pending events / update the window if pbar_shown: progress.set_fraction(percent) progress.set_text(str(int(percent * 100)) + '%' ) processEvents() if pbar_shown: progress.set_fraction(0) progress.hide() progress.set_text('0%') progress.set_fraction(0) #update the parent count labels #update the parent count labels self.update_parent_count() self.controller.get_main_window().set_sensitive(True) self.set_model(self.store) self.get_selection().select_path((0,0)) self.grab_focus() gui.setCursorToNormal(self.controller.get_parent_widget()) #show packages not inserted due to already exist in list if len(not_added)>0: self.__load_dialog_skip(not_added, constants.MESSAGE_0017) if len(list_bad)>0: self.__load_dialog_skip(list_bad, constants.MESSAGE_0016)
def set_done(self, indx): self.steps_text[indx].set_done() self.steps_image[indx].set_done() processEvents()
def set_current(self, indx): self.steps_text[indx].set_current() self.steps_image[indx].set_current() processEvents()
def progress_timeout(pbobj): pbobj.pulse() processEvents() # As this is a timeout function, return TRUE so that it # continues to get called return True
def on_update(self, value): if self.time_start == 1: self.time_start = 2 self.progress.pulse() gui.processEvents()
def __init__(self, controller = None, temp_path = '', packages_path = '', packages_file_list='', non_interactive = False): """ Constructor """ self.freespaceneeded = 0 self.controller = controller self.glade = gui.get_glade(constants.CREATE_GUI, WINDOW_NAME) self.non_interactive = non_interactive if temp_path == '': self.temp_path = constants.TEMP_FOLDER else: self.temp_path = temp_path self.packages_path = packages_path self.window = gui.get_widget(self.glade, WINDOW_NAME) #self.window.set_icon(get_icon('aptoncd')) #if is inside a container if self.controller: self.window.set_decorated(False) self.content = gui.set_parent_widget_from_glade(self.glade, WINDOW_NAME, self.controller.createContainer) self.window.destroy() gui.setCursorToBusy(self.get_main_window(), True) else: #Window Widgets if packages_file_list =='' or self.non_interactive == False: self.window.show() gui.setCursorToBusy(self.window, True) self.tipBox = gui.get_widget(self.glade, 'tipbox') self.btnCloseTipBox = gui.get_widget(self.glade, 'btnCloseTipBox') self.btnMoreMissing = gui.get_widget(self.glade, 'btnMoreMissing') self.ListContainer = gui.get_widget(self.glade,'ListContainer') self.lblPkgDesc = gui.get_widget(self.glade, 'lblPkgDesc') self.pkgImg = gui.get_widget(self.glade, 'pkgImg') self.btnAdd = gui.get_widget(self.glade, 'btnAdd') self.btnBurn = gui.get_widget(self.glade, 'createBurn') self.packageList = PackageList.PackageView(self) self.ListContainer.add(self.packageList) self.ListContainer.show_all() self.bind_signals() #gui.connect(self.tgBtnCreate, 'toggled',self.on_BtnCreate_toggle) self.values = { 'media_type': 'CD', 'media_size': constants.CD, 'destination': utils.get_home_folder(), 'isoname': '', 'createmeta': False } if packages_file_list =='': #self.packageList.can_select_old = self.ckbtnOldVersions.get_active() #self.packageList.auto_select_packages = self.ckbtnAutoSelectDepends.get_active() gui.processEvents() if self.controller: self.controller.show_status_message(constants.MESSAGE_0001) else: self.process_list(packages_file_list)
def create_aptoncd(self): #this will hold error information. errorMsg = "" self.progress = ProgressDialog(self.get_main_window()) self.progress.can_cancel_progress = True self.progress.title = constants.MESSAGE_0024 self.progress.description = constants.MESSAGE_0025 #defines the steps to create this iso. process = [constants.MESSAGE_0020, constants.MESSAGE_0021, \ constants.MESSAGE_0022, constants.MESSAGE_0023] self.steps = stepswidget.ProgressSteps(process) self.progress.add_widget(self.steps) #set temp variables for packages locations tmpdir = utils.join_path(self.temp_path, 'aptoncd') #"/tmp/aptoncd/" tmpmetapackageDir = utils.join_path(tmpdir , 'metapackage') tmppackages = utils.join_path(tmpdir , 'packages') #creates a temporary location to work with .deb files utils.mkdir(tmpdir, True) #get what files will be on each cd if self.values['media_type'] == 'CD': isoFileList = self.CreateIsoList(constants.CD) else: isoFileList = self.CreateIsoList(constants.DVD) #we will starting changing here to break process in parts # first, copy files from cds to locations result, msg = self.copy_files(isoFileList,tmpdir) # the user clicked cancel button if not result : self.get_main_window().set_sensitive(True) return False result, msg = self.scan_packages(isoFileList,tmpdir) if not result : self.get_main_window().set_sensitive(True) return False self.create_iso(isoFileList,tmpdir) self.steps.set_current(3) gui.processEvents() #clean folders created previously utils.removePath(tmpdir) self.steps.set_done(3) burn_list = {} index=0 for indx, burns in enumerate(utils.get_burn_applications(constants.BURNS_DATA)): item = utils.whereis(burns[0]) if item: burn_list[index]= { 'name':burns[0], 'location':item , 'parameter':burns[1]} index += 1 if index >= 1: dlgburn = FinishedDialog(self, burn_list) self.progress.destroy() result, index = dlgburn.run() if result == 1: for iso in self.isos: command = burn_list[index]['location'] + ' '+ burn_list[index]['parameter'] + iso + ' &' utils.run_command(command) dlgburn.destroy() self.get_main_window().set_sensitive(True) self.main_window = gui.get_glade(constants.MAIN_GUI, 'main') self.notebook = gui.get_widget(self.main_window, 'notebook') self.notebook.set_current_page(0)
def scan_packages(self, isoFileList, tmpdir): self.time_start = 1 self.steps.set_current(1) self.progress.update_progress(0) self.progress.progress_widget.set_text( '') self.progress.progress_text = constants.MESSAGE_0019 gui.processEvents() for cds in isoFileList.keys(): #cd destination folder media_folder_name = self.values['media_type'] + str(cds) current_msg = constants.MESSAGE_0021 + ' (' + media_folder_name + ')' self.steps.set_current_text(1,current_msg ) tmpmetapackageDir = utils.join_path(tmpdir , 'metapackage/' + media_folder_name) tmppackages = utils.join_path(tmpdir , 'packages') destination = utils.join_path(tmppackages, media_folder_name) pkg_destination = utils.join_path(destination , 'packages') controlFile = utils.join_path(tmpmetapackageDir, 'DEBIAN/control') #create the deb file for metapackage if self.values['createmeta']: command = 'dpkg-deb -b %s %s > /dev/null 2> /dev/null' % \ (tmpmetapackageDir.replace(' ','\ '), utils.join_path(pkg_destination.replace(' ','\ '), self.mPack.get_mtFileName()) ) result = utils.run_command(command) #remove the file needed to create the metapackage utils.del_file(controlFile) packages_files = utils.join_path(destination.replace(' ','\ ') , 'Packages') command = 'apt-ftparchive packages packages/' if self.progress.cancel_status: errorMsg = constants.MESSAGE_0027 return False, errorMsg apt_ftp = AptFtpArchive() self.progress.stop = 100 apt_ftp.set_progress_hook(self.on_update) apt_ftp.execute(command, destination, packages_files) if self.progress.cancel_status: errorMsg = constants.MESSAGE_0027 return False, errorMsg #creates a tar file using bz2 compression result, path = utils.compress(packages_files) result, msg = utils.zip_file(utils.join_path(destination,'Packages.gz'), utils.join_path(destination,'Packages')) packages_files = utils.join_path(destination.replace(' ','\ ') , 'Release') command = 'apt-ftparchive release .' apt_ftp.set_progress_hook(self.on_update) apt_ftp.execute(command, destination, packages_files) if self.progress.cancel_status: errorMsg = constants.MESSAGE_0027 return False, errorMsg #Create aptoncd.inf file infoFile = utils.join_path(destination, 'aptoncd.info') info = mediainfo.MediaInfo(infoFile) info.write() if self.progress.cancel_status: errorMsg = constants.MESSAGE_0027 return False, errorMsg #Creates .disk/info diskinfodir = utils.join_path(destination ,'.disk') utils.mkdir(diskinfodir, True) infoDiskFile = utils.join_path(diskinfodir,'info') infoDisk = mediainfo.aptDiskInfo(infoDiskFile, media_folder_name) infoDisk.write() #write README.diskdefines infoDiskDefinesFile = utils.join_path(destination, 'README.diskdefines') infoDiskDefines = mediainfo.aptDiskDefines(infoDiskDefinesFile,media_folder_name) infoDiskDefines.write() gui.processEvents() utils.removePath(tmpmetapackageDir) self.progress.cancel_pulse() self.steps.set_current_text(1,constants.MESSAGE_0021) self.steps.set_done(1) self.progress.update_progress(0) return True, None
def copy_files(self, isoFileList, tmpdir): """ this will copy each package from every cd to the destination. """ self.controlFile = {} #start mounting the cd/dvd layout for cds in isoFileList.keys(): #show the first step in bold with an arrow at its left self.steps.set_current(0) media_folder_name = self.values['media_type'] + str(cds) current_msg = constants.MESSAGE_0020 + ' (' + media_folder_name + ')' self.steps.set_current_text(0,current_msg ) self.progress.progress_text = constants.MESSAGE_0002 tmpmetapackageDir = utils.join_path(tmpdir , 'metapackage/' + media_folder_name) tmppackages = utils.join_path(tmpdir , 'packages') #if we are creating a metapackage #we must create a DEBIAN folder print 'Create Meta:', self.values['createmeta'] if self.values['createmeta']: utils.mkdir(utils.join_path(tmpmetapackageDir, 'DEBIAN'),True) controlFile = utils.join_path(tmpmetapackageDir, 'DEBIAN/control') utils.del_file(controlFile) self.mPack = MetaPackage(controlFile) else: utils.removePath(tmpmetapackageDir ) #cd destination folder destination = utils.join_path(tmppackages, media_folder_name) utils.mkdir(destination, True) #destination for each package inside this media pkg_destination = utils.join_path(destination , 'packages') utils.mkdir(pkg_destination, True) #start to copy files from source to destination self.progress.stop = len(isoFileList[cds]) for index, pkg in enumerate(isoFileList[cds]): #update the progress bar self.progress.update_progress(index + 1) #if we must create metapackage we will add this #package to the meta list if self.values['createmeta']: self.mPack.appendPackage(pkg.package) #set the folder destination of the package filedestination = utils.join_path(pkg_destination, pkg.deb_filename) #if user has canceled #stop iterating if self.progress.cancel_status: errorMsg = constants.MESSAGE_0027 return False, errorMsg #copy file to destination pkg.copy_to(filedestination ) #update the progress message self.progress.progress_text = constants.MESSAGE_0029 % pkg.package gui.processEvents() #close the packfile for this cd if self.values['createmeta']: self.mPack.write() #update processes #marking first as done and starting a new one self.steps.set_current_text(0,constants.MESSAGE_0020) self.steps.set_done(0) return True, None