Fixed imports

Fixed import * and unused imports.
This commit is contained in:
Marta Marczykowska-Górecka 2017-12-10 22:11:07 +01:00
parent 7a4e4b35d5
commit 9d73ceb99d
No known key found for this signature in database
GPG Key ID: 9A752C30B26FD04B
3 changed files with 90 additions and 84 deletions

View File

@ -30,21 +30,23 @@ from qubesadmin import Qubes, events, exc
from qubesadmin import utils as admin_utils from qubesadmin import utils as admin_utils
from qubes.storage.file import get_disk_usage from qubes.storage.file import get_disk_usage
from PyQt4 import QtCore, QtGui # pylint: disable=import-error from PyQt4 import QtCore # pylint: disable=import-error
from PyQt4 import QtGui # pylint: disable=import-error
from . import ui_backupdlg
from . import multiselectwidget
from .ui_backupdlg import * from . import backup_utils
from .multiselectwidget import *
from .backup_utils import *
from . import utils from . import utils
import grp import grp
import pwd import pwd
import sys import sys
import os import os
from .thread_monitor import * from . import thread_monitor
import threading
import time import time
class BackupVMsWindow(Ui_Backup, QWizard):
class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
__pyqtSignals__ = ("backup_progress(int)",) __pyqtSignals__ = ("backup_progress(int)",)
@ -67,21 +69,21 @@ class BackupVMsWindow(Ui_Backup, QWizard):
self.progress_status.text = self.tr("Backup in progress...") self.progress_status.text = self.tr("Backup in progress...")
self.dir_line_edit.setReadOnly(False) self.dir_line_edit.setReadOnly(False)
self.select_vms_widget = MultiSelectWidget(self) self.select_vms_widget = multiselectwidget.MultiSelectWidget(self)
self.verticalLayout.insertWidget(1, self.select_vms_widget) self.verticalLayout.insertWidget(1, self.select_vms_widget)
self.connect(self, SIGNAL("currentIdChanged(int)"), self.connect(self, QtCore.SIGNAL("currentIdChanged(int)"),
self.current_page_changed) self.current_page_changed)
self.connect(self.select_vms_widget, self.connect(self.select_vms_widget,
SIGNAL("items_removed(PyQt_PyObject)"), QtCore.SIGNAL("items_removed(PyQt_PyObject)"),
self.vms_removed) self.vms_removed)
self.connect(self.select_vms_widget, self.connect(self.select_vms_widget,
SIGNAL("items_added(PyQt_PyObject)"), QtCore.SIGNAL("items_added(PyQt_PyObject)"),
self.vms_added) self.vms_added)
self.connect(self, SIGNAL("backup_progress(int)"), self.connect(self, QtCore.SIGNAL("backup_progress(int)"),
self.progress_bar.setValue) self.progress_bar.setValue)
self.dir_line_edit.connect(self.dir_line_edit, self.dir_line_edit.connect(self.dir_line_edit,
SIGNAL("textChanged(QString)"), QtCore.SIGNAL("textChanged(QString)"),
self.backup_location_changed) self.backup_location_changed)
self.select_vms_page.isComplete = self.has_selected_vms self.select_vms_page.isComplete = self.has_selected_vms
@ -90,15 +92,15 @@ class BackupVMsWindow(Ui_Backup, QWizard):
# this causes to run isComplete() twice, I don't know why # this causes to run isComplete() twice, I don't know why
self.select_vms_page.connect( self.select_vms_page.connect(
self.select_vms_widget, self.select_vms_widget,
SIGNAL("selected_changed()"), QtCore.SIGNAL("selected_changed()"),
SIGNAL("completeChanged()")) QtCore.SIGNAL("completeChanged()"))
self.passphrase_line_edit.connect( self.passphrase_line_edit.connect(
self.passphrase_line_edit, self.passphrase_line_edit,
SIGNAL("textChanged(QString)"), QtCore.SIGNAL("textChanged(QString)"),
self.backup_location_changed) self.backup_location_changed)
self.passphrase_line_edit_verify.connect( self.passphrase_line_edit_verify.connect(
self.passphrase_line_edit_verify, self.passphrase_line_edit_verify,
SIGNAL("textChanged(QString)"), QtCore.SIGNAL("textChanged(QString)"),
self.backup_location_changed) self.backup_location_changed)
self.total_size = 0 self.total_size = 0
@ -123,7 +125,7 @@ class BackupVMsWindow(Ui_Backup, QWizard):
def load_settings(self): def load_settings(self):
try: try:
profile_data = load_backup_profile() profile_data = backup_utils.load_backup_profile()
except Exception as ex: # TODO: fix just for file not found except Exception as ex: # TODO: fix just for file not found
return return
if not profile_data: if not profile_data:
@ -157,9 +159,9 @@ class BackupVMsWindow(Ui_Backup, QWizard):
'include': [vm.name for vm in self.selected_vms], 'include': [vm.name for vm in self.selected_vms],
'passphrase_text': self.passphrase_line_edit.text()} 'passphrase_text': self.passphrase_line_edit.text()}
# TODO: add compression when it is added # TODO: add compression when it is added
write_backup_profile(settings) backup_utils.write_backup_profile(settings)
class VmListItem(QListWidgetItem): class VmListItem(QtGui.QListWidgetItem):
def __init__(self, vm): def __init__(self, vm):
self.vm = vm self.vm = vm
if vm.qid == 0: if vm.qid == 0:
@ -205,9 +207,9 @@ class BackupVMsWindow(Ui_Backup, QWizard):
self.total_size_label.setText( self.total_size_label.setText(
admin_utils.size_to_human(self.total_size)) admin_utils.size_to_human(self.total_size))
@pyqtSlot(name='on_select_path_button_clicked') @QtCore.pyqtSlot(name='on_select_path_button_clicked')
def select_path_button_clicked(self): def select_path_button_clicked(self):
select_path_button_clicked(self) backup_utils.select_path_button_clicked(self)
def validateCurrentPage(self): def validateCurrentPage(self):
if self.currentPage() is self.select_vms_page: if self.currentPage() is self.select_vms_page:
@ -220,26 +222,26 @@ class BackupVMsWindow(Ui_Backup, QWizard):
elif self.currentPage() is self.select_dir_page: elif self.currentPage() is self.select_dir_page:
backup_location = str(self.dir_line_edit.text()) backup_location = str(self.dir_line_edit.text())
if not backup_location: if not backup_location:
QMessageBox.information( QtGui.QMessageBox.information(
None, self.tr("Wait!"), None, self.tr("Wait!"),
self.tr("Enter backup target location first.")) self.tr("Enter backup target location first."))
return False return False
if self.appvm_combobox.currentIndex() == 0 \ if self.appvm_combobox.currentIndex() == 0 \
and not os.path.isdir(backup_location): and not os.path.isdir(backup_location):
QMessageBox.information( QtGui.QMessageBox.information(
None, self.tr("Wait!"), None, self.tr("Wait!"),
self.tr("Selected directory do not exists or " self.tr("Selected directory do not exists or "
"not a directory (%s).") % backup_location) "not a directory (%s).") % backup_location)
return False return False
if not len(self.passphrase_line_edit.text()): if not len(self.passphrase_line_edit.text()):
QMessageBox.information( QtGui.QMessageBox.information(
None, self.tr("Wait!"), None, self.tr("Wait!"),
self.tr("Enter passphrase for backup " self.tr("Enter passphrase for backup "
"encryption/verification first.")) "encryption/verification first."))
return False return False
if self.passphrase_line_edit.text() !=\ if self.passphrase_line_edit.text() !=\
self.passphrase_line_edit_verify.text(): self.passphrase_line_edit_verify.text():
QMessageBox.information( QtGui.QMessageBox.information(
None, self.tr("Wait!"), None, self.tr("Wait!"),
self.tr("Enter the same passphrase in both fields.")) self.tr("Enter the same passphrase in both fields."))
return False return False
@ -250,7 +252,7 @@ class BackupVMsWindow(Ui_Backup, QWizard):
# self.func_output.append(s) # self.func_output.append(s)
def update_progress_bar(self, value): def update_progress_bar(self, value):
self.emit(SIGNAL("backup_progress(int)"), value) self.emit(QtCore.SIGNAL("backup_progress(int)"), value)
def __do_backup__(self, thread_monitor): def __do_backup__(self, thread_monitor):
msg = [] msg = []
@ -301,9 +303,10 @@ class BackupVMsWindow(Ui_Backup, QWizard):
self.showFileDialog.setChecked(self.showFileDialog.isEnabled() self.showFileDialog.setChecked(self.showFileDialog.isEnabled()
and str(self.dir_line_edit.text()) and str(self.dir_line_edit.text())
.count("media/") > 0) .count("media/") > 0)
self.thread_monitor = ThreadMonitor() self.thread_monitor = thread_monitor.ThreadMonitor()
thread = threading.Thread(target=self.__do_backup__, thread = threading.Thread(
args=(self.thread_monitor,)) target=self.__do_backup__,
args=(self.thread_monitor,))
thread.daemon = True thread.daemon = True
thread.start() thread.start()
@ -315,17 +318,17 @@ class BackupVMsWindow(Ui_Backup, QWizard):
if self.canceled: if self.canceled:
self.progress_status.setText(self.tr("Backup aborted.")) self.progress_status.setText(self.tr("Backup aborted."))
if self.tmpdir_to_remove: if self.tmpdir_to_remove:
if QMessageBox.warning( if QtGui.QMessageBox.warning(
None, self.tr("Backup aborted"), None, self.tr("Backup aborted"),
self.tr( self.tr(
"Do you want to remove temporary files " "Do you want to remove temporary files "
"from %s?") % self.tmpdir_to_remove, "from %s?") % self.tmpdir_to_remove,
QMessageBox.Yes, QMessageBox.No) == \ QtGui.QMessageBox.Yes,
QMessageBox.Yes: QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
shutil.rmtree(self.tmpdir_to_remove) shutil.rmtree(self.tmpdir_to_remove)
else: else:
self.progress_status.setText(self.tr("Backup error.")) self.progress_status.setText(self.tr("Backup error."))
QMessageBox.warning( QtGui.QMessageBox.warning(
self, self.tr("Backup error!"), self, self.tr("Backup error!"),
self.tr("ERROR: {}").format( self.tr("ERROR: {}").format(
self.thread_monitor.error_msg)) self.thread_monitor.error_msg))
@ -368,7 +371,7 @@ class BackupVMsWindow(Ui_Backup, QWizard):
return len(self.dir_line_edit.text()) > 0 return len(self.dir_line_edit.text()) > 0
def backup_location_changed(self, new_dir=None): def backup_location_changed(self, new_dir=None):
self.select_dir_page.emit(SIGNAL("completeChanged()")) self.select_dir_page.emit(QtCore.SIGNAL("completeChanged()"))
# Bases on the original code by: # Bases on the original code by:

View File

@ -20,8 +20,8 @@
# #
# #
import re import re
from PyQt4.QtCore import * from PyQt4 import QtGui
from PyQt4.QtGui import * from PyQt4 import QtCore
import subprocess import subprocess
from . import utils from . import utils
@ -63,7 +63,7 @@ def enable_dir_line_edit(dialog, boolean):
def select_path_button_clicked(dialog, select_file=False): def select_path_button_clicked(dialog, select_file=False):
backup_location = str(dialog.dir_line_edit.text()) backup_location = str(dialog.dir_line_edit.text())
file_dialog = QFileDialog() file_dialog = QtGui.QFileDialog()
file_dialog.setReadOnly(True) file_dialog.setReadOnly(True)
new_path = None new_path = None
@ -77,7 +77,7 @@ def select_path_button_clicked(dialog, select_file=False):
"qubes.SelectFile" if select_file "qubes.SelectFile" if select_file
else "qubes.SelectDirectory") else "qubes.SelectDirectory")
except subprocess.CalledProcessError as ex: except subprocess.CalledProcessError as ex:
QMessageBox.warning( QtGui.QMessageBox.warning(
None, None,
dialog.tr("Nothing selected!"), dialog.tr("Nothing selected!"),
dialog.tr("No file or directory selected.")) dialog.tr("No file or directory selected."))
@ -87,7 +87,7 @@ def select_path_button_clicked(dialog, select_file=False):
dialog.dir_line_edit.setText(new_path) dialog.dir_line_edit.setText(new_path)
if new_path and len(backup_location) > 0: if new_path and len(backup_location) > 0:
dialog.select_dir_page.emit(SIGNAL("completeChanged()")) dialog.select_dir_page.emit(QtCore.SIGNAL("completeChanged()"))
def load_backup_profile(): def load_backup_profile():

View File

@ -24,30 +24,29 @@
import sys import sys
import os import os
import shutil import shutil
from PyQt4.QtCore import * from PyQt4 import QtCore
from PyQt4.QtGui import * from PyQt4 import QtGui
from .thread_monitor import * from . import thread_monitor
import threading
import time import time
import os.path import os.path
import traceback import traceback
import qubesmanager.resources_rc
import signal import signal
from qubes import backup from qubes import backup
from .ui_restoredlg import * from . import ui_restoredlg
from .multiselectwidget import * from . import multiselectwidget
from .backup_utils import * from . import backup_utils
from multiprocessing import Queue, Event from multiprocessing import Queue, Event
from multiprocessing.queues import Empty from multiprocessing.queues import Empty
from qubesadmin import Qubes, events, exc from qubesadmin import Qubes, exc
from qubesadmin import utils as admin_utils
from qubesadmin.backup import restore from qubesadmin.backup import restore
class RestoreVMsWindow(Ui_Restore, QWizard): class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtGui.QWizard):
__pyqtSignals__ = ("restore_progress(int)", "backup_progress(int)") __pyqtSignals__ = ("restore_progress(int)", "backup_progress(int)")
@ -69,20 +68,20 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.setupUi(self) self.setupUi(self)
self.select_vms_widget = MultiSelectWidget(self) self.select_vms_widget = multiselectwidget.MultiSelectWidget(self)
self.select_vms_layout.insertWidget(1, self.select_vms_widget) self.select_vms_layout.insertWidget(1, self.select_vms_widget)
self.connect(self, self.connect(self,
SIGNAL("currentIdChanged(int)"), self.current_page_changed) QtCore.SIGNAL("currentIdChanged(int)"), self.current_page_changed)
self.connect(self, self.connect(self,
SIGNAL("restore_progress(QString)"), QtCore.SIGNAL("restore_progress(QString)"),
self.commit_text_edit.append) self.commit_text_edit.append)
self.connect(self, self.connect(self,
SIGNAL("backup_progress(int)"), self.progress_bar.setValue) QtCore.SIGNAL("backup_progress(int)"), self.progress_bar.setValue)
self.dir_line_edit.connect(self.dir_line_edit, self.dir_line_edit.connect(self.dir_line_edit,
SIGNAL("textChanged(QString)"), QtCore.SIGNAL("textChanged(QString)"),
self.backup_location_changed) self.backup_location_changed)
self.connect(self.verify_only, SIGNAL("stateChanged(int)"), self.connect(self.verify_only, QtCore.SIGNAL("stateChanged(int)"),
self.on_verify_only_toogled) self.on_verify_only_toogled)
self.select_dir_page.isComplete = self.has_selected_dir self.select_dir_page.isComplete = self.has_selected_dir
@ -92,15 +91,15 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
# this causes to run isComplete() twice, I don't know why # this causes to run isComplete() twice, I don't know why
self.select_vms_page.connect( self.select_vms_page.connect(
self.select_vms_widget, self.select_vms_widget,
SIGNAL("selected_changed()"), QtCore.SIGNAL("selected_changed()"),
SIGNAL("completeChanged()")) QtCore.SIGNAL("completeChanged()"))
fill_appvms_list(self) backup_utils.fill_appvms_list(self)
# self.__init_restore_options__() # self.__init_restore_options__()
@pyqtSlot(name='on_select_path_button_clicked') @QtCore.pyqtSlot(name='on_select_path_button_clicked')
def select_path_button_clicked(self): def select_path_button_clicked(self):
select_path_button_clicked(self, True) backup_utils.select_path_button_clicked(self, True)
def on_ignore_missing_toggled(self, checked): def on_ignore_missing_toggled(self, checked):
self.restore_options['use-default-template'] = checked self.restore_options['use-default-template'] = checked
@ -158,22 +157,22 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
continue continue
self.select_vms_widget.available_list.addItem(vmname) self.select_vms_widget.available_list.addItem(vmname)
except exc.QubesException as ex: except exc.QubesException as ex:
QMessageBox.warning(None, self.tr("Restore error!"), str(ex)) QtGui.QMessageBox.warning(None, self.tr("Restore error!"), str(ex))
def gather_output(self, s): def gather_output(self, s):
self.func_output.append(s) self.func_output.append(s)
def restore_error_output(self, s): def restore_error_output(self, s):
self.error_detected.set() self.error_detected.set()
self.feedback_queue.put((SIGNAL("restore_progress(QString)"), self.feedback_queue.put((QtCore.SIGNAL("restore_progress(QString)"),
u'<font color="red">{0}</font>'.format(s))) u'<font color="red">{0}</font>'.format(s)))
def restore_output(self, s): def restore_output(self, s):
self.feedback_queue.put((SIGNAL("restore_progress(QString)"), self.feedback_queue.put((QtCore.SIGNAL("restore_progress(QString)"),
u'<font color="black">{0}</font>'.format(s))) u'<font color="black">{0}</font>'.format(s)))
def update_progress_bar(self, value): def update_progress_bar(self, value):
self.feedback_queue.put((SIGNAL("backup_progress(int)"), value)) self.feedback_queue.put((QtCore.SIGNAL("backup_progress(int)"), value))
def __do_restore__(self, thread_monitor): def __do_restore__(self, thread_monitor):
err_msg = [] err_msg = []
@ -192,17 +191,17 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
"investigate them and/or clean them up")) "investigate them and/or clean them up"))
if self.canceled: if self.canceled:
self.emit(SIGNAL("restore_progress(QString)"), self.emit(QtCore.SIGNAL("restore_progress(QString)"),
'<b><font color="red">{0}</font></b>' '<b><font color="red">{0}</font></b>'
.format(self.tr("Restore aborted!"))) .format(self.tr("Restore aborted!")))
elif len(err_msg) > 0 or self.error_detected.is_set(): elif len(err_msg) > 0 or self.error_detected.is_set():
if len(err_msg) > 0: if len(err_msg) > 0:
thread_monitor.set_error_msg('\n'.join(err_msg)) thread_monitor.set_error_msg('\n'.join(err_msg))
self.emit(SIGNAL("restore_progress(QString)"), self.emit(QtCore.SIGNAL("restore_progress(QString)"),
'<b><font color="red">{0}</font></b>' '<b><font color="red">{0}</font></b>'
.format(self.tr("Finished with errors!"))) .format(self.tr("Finished with errors!")))
else: else:
self.emit(SIGNAL("restore_progress(QString)"), self.emit(QtCore.SIGNAL("restore_progress(QString)"),
'<font color="green">{0}</font>' '<font color="green">{0}</font>'
.format(self.tr("Finished successfully!"))) .format(self.tr("Finished successfully!")))
@ -234,7 +233,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.confirm_text_edit.setFontFamily("Monospace") self.confirm_text_edit.setFontFamily("Monospace")
self.confirm_text_edit.setText(self.func_output) self.confirm_text_edit.setText(self.func_output)
self.confirm_page.emit(SIGNAL("completeChanged()")) self.confirm_page.emit(QtCore.SIGNAL("completeChanged()"))
elif self.currentPage() is self.commit_page: elif self.currentPage() is self.commit_page:
self.button(self.FinishButton).setDisabled(True) self.button(self.FinishButton).setDisabled(True)
@ -243,8 +242,8 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
and str(self.dir_line_edit.text()) and str(self.dir_line_edit.text())
.count("media/") > 0) .count("media/") > 0)
self.thread_monitor = ThreadMonitor() self.thread_monitor = thread_monitor.ThreadMonitor()
thread = threading.Thread (target= self.__do_restore__ , args=(self.thread_monitor,)) thread = threading.Thread (target= self.__do_restore__, args=(self.thread_monitor,))
thread.daemon = True thread.daemon = True
thread.start() thread.start()
@ -260,19 +259,23 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
if not self.thread_monitor.success: if not self.thread_monitor.success:
if self.canceled: if self.canceled:
if self.tmpdir_to_remove and \ if self.tmpdir_to_remove and \
QMessageBox.warning(None, self.tr("Restore aborted"), QtGui.QMessageBox.warning(
None,
self.tr("Restore aborted"),
self.tr("Do you want to remove temporary files " self.tr("Do you want to remove temporary files "
"from %s?") % self.tmpdir_to_remove, "from %s?") % self.tmpdir_to_remove,
QMessageBox.Yes, QMessageBox.No) == \ QtGui.QMessageBox.Yes,
QMessageBox.Yes: QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
shutil.rmtree(self.tmpdir_to_remove) shutil.rmtree(self.tmpdir_to_remove)
else: else:
QMessageBox.warning(None, QtGui.QMessageBox.warning(
self.tr("Backup error!"), self.tr("ERROR: {0}") None,
.format(self.thread_monitor.error_msg)) self.tr("Backup error!"),
self.tr("ERROR: {0}").format(
self.thread_monitor.error_msg))
if self.showFileDialog.isChecked(): # TODO: this is not working if self.showFileDialog.isChecked(): # TODO: this is not working
self.emit(SIGNAL("restore_progress(QString)"), self.emit(QtCore.SIGNAL("restore_progress(QString)"),
'<b><font color="black">{0}</font></b>'.format( '<b><font color="black">{0}</font></b>'.format(
self.tr( self.tr(
"Please unmount your backup volume and cancel" "Please unmount your backup volume and cancel"
@ -281,7 +284,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.target_appvm.run("QUBESRPC %s dom0" % self.target_appvm.run("QUBESRPC %s dom0" %
"qubes.SelectDirectory") "qubes.SelectDirectory")
else: else:
file_dialog = QFileDialog() file_dialog = QtGui.QFileDialog()
file_dialog.setReadOnly(True) file_dialog.setReadOnly(True)
file_dialog.getExistingDirectory( file_dialog.getExistingDirectory(
self, self.tr("Detach backup device"), self, self.tr("Detach backup device"),
@ -304,7 +307,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
def reject(self): # TODO: probably not working too def reject(self): # TODO: probably not working too
if self.currentPage() is self.commit_page: if self.currentPage() is self.commit_page:
if self.backup_restore.canceled: if self.backup_restore.canceled:
self.emit(SIGNAL("restore_progress(QString)"), self.emit(QtCore.SIGNAL("restore_progress(QString)"),
'<font color="red">{0}</font>' '<font color="red">{0}</font>'
.format(self.tr("Aborting the operation..."))) .format(self.tr("Aborting the operation...")))
self.button(self.CancelButton).setDisabled(True) self.button(self.CancelButton).setDisabled(True)
@ -328,7 +331,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
return self.select_vms_widget.selected_list.count() > 0 return self.select_vms_widget.selected_list.count() > 0
def backup_location_changed(self, new_dir=None): def backup_location_changed(self, new_dir=None):
self.select_dir_page.emit(SIGNAL("completeChanged()")) self.select_dir_page.emit(QtCore.SIGNAL("completeChanged()"))
# Bases on the original code by: # Bases on the original code by:
@ -340,18 +343,18 @@ def handle_exception(exc_type, exc_value, exc_traceback):
filename = os.path.basename(filename) filename = os.path.basename(filename)
error = "%s: %s" % (exc_type.__name__, exc_value) error = "%s: %s" % (exc_type.__name__, exc_value)
QMessageBox.critical(None, "Houston, we have a problem...", QtGui.QMessageBox.critical(None, "Houston, we have a problem...",
"Whoops. A critical error has occured. " "Whoops. A critical error has occured. "
"This is most likely a bug " "This is most likely a bug "
"in Qubes Restore VMs application.<br><br>" "in Qubes Restore VMs application.<br><br>"
"<b><i>%s</i></b>" % error + "<b><i>%s</i></b>" % error +
"at <b>line %d</b> of file <b>%s</b>.<br/><br/>" "at <b>line %d</b> of file <b>%s</b>.<br/><br/>"
% (line, filename)) % (line, filename))
def main(): def main():
qtapp = QApplication(sys.argv) qtapp = QtGui.QApplication(sys.argv)
qtapp.setOrganizationName("The Qubes Project") qtapp.setOrganizationName("The Qubes Project")
qtapp.setOrganizationDomain("http://qubes-os.org") qtapp.setOrganizationDomain("http://qubes-os.org")
qtapp.setApplicationName("Qubes Restore VMs") qtapp.setApplicationName("Qubes Restore VMs")