#!/usr/bin/env python3 """ project: Backuppy version: 1.02.000 file: install.py summary: main entry python file """ # Standard library imports import os # Third party imports from PySide2 import QtCore from PySide2 import QtGui from PySide2 import QtCore, QtWidgets # local imports from languages import english from languages import german # local globals VERSION: str = "1.02.000" EMAIL: str = "fotocoder@joschu.ch" TARGET_SCRIPT: str = "Backuppy.sh" EXCLUDE_FILE: str = "exclude.txt" LANG_EN: str = "English" LANG_DE: str = "German" LANGUAGE: str = LANG_EN MYDIR: str = os.environ.get("mydir") if not MYDIR: MYDIR = os.getcwd() SOURCEDIR: str = None EXCLUDE: bool = True TARGETDIR: str = None RSYNC_CMD: str = None def get_lang_text(search_str: str): """ Returns a string from the appropriate language file. """ return_str: str = eval("english." + search_str) global LANGUAGE if LANGUAGE == LANG_DE: return_str = eval("german." + search_str) return return_str def trace(message_txt: str): """ Print a formatted message to std out. """ print(f"[ OK ]", message_txt) class BackuppyWizard(QtWidgets.QWizard): def __init__(self, parent=None): super().__init__(parent) self.addPage(Page01(self)) self.addPage(Page02(self)) self.addPage(Page03(self)) self.addPage(Page04(self)) self.addPage(Page05(self)) self.addPage(Page06(self)) self.addPage(Page07(self)) self.addPage(Page08(self)) self.addPage(Page09(self)) self.addPage(Page10(self)) self.setWindowTitle(english.intromsg1) self.resize(640, 480) class Page01(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label = QtWidgets.QLabel("Hello, first of all, which language do you prefer: English or German?") # self.comboBox = QIComboBox(self) self.comboBox = QtWidgets.QComboBox(self) self.comboBox.addItem(LANG_EN, LANG_EN) self.comboBox.addItem(LANG_DE, LANG_DE) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label) layout.addWidget(self.comboBox) self.setLayout(layout) def validatePage(self): global LANGUAGE if self.comboBox.currentText() == LANG_DE: LANGUAGE = LANG_DE else: LANGUAGE = LANG_EN return True class Page02(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("languagepack")) self.label2.setText(get_lang_text("intromsg2")) class Page03(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label = QtWidgets.QLabel() self.groupbox = QtWidgets.QGroupBox() self.groupbox.setFlat(True) self.radio1 = QtWidgets.QRadioButton() self.radio2 = QtWidgets.QRadioButton() vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.radio1) vbox.addWidget(self.radio2) vbox.addStretch(1) self.groupbox.setLayout(vbox) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label) layout.addWidget(self.groupbox) self.setLayout(layout) def initializePage(self): self.label.setText(get_lang_text("excludefile1")) self.radio1.setText(get_lang_text("Yes")) self.radio2.setText(get_lang_text("No")) self.radio1.setChecked(True) def validatePage(self): global EXCLUDE if self.radio1.isChecked(): EXCLUDE = True else: EXCLUDE = False return True class Page04(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label) self.setLayout(layout) def initializePage(self): global EXCLUDE if EXCLUDE: self.label.setText(get_lang_text("excludefile2")) else: self.label.setText(get_lang_text("excludefile3")) class Page05(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() self.edit = QtWidgets.QLineEdit() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) layout.addWidget(self.edit) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("srcdir1")) self.label2.setText(get_lang_text("srcdir2")) def validatePage(self): global SOURCEDIR SOURCEDIR = self.edit.text() return True class Page06(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() self.label3 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) layout.addWidget(self.label3) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("srcdir3_1")) bold_text = f"

{SOURCEDIR}

" self.label2.setText(bold_text) self.label3.setText(get_lang_text("srcdir3_2")) class Page07(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.edit = QtWidgets.QLineEdit() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.edit) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("targetdir1")) def validatePage(self): global TARGETDIR TARGETDIR = self.edit.text() return True class Page08(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() self.label3 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) layout.addWidget(self.label3) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("targetdir2_1")) bold_text = f"

{TARGETDIR}

" self.label2.setText(bold_text) self.label3.setText(get_lang_text("targetdir2_2")) def validatePage(self): global RSYNC_CMD, MYDIR, SOURCEDIR, TARGETDIR RSYNC_CMD = f"rsync -aqp --exclude-from={MYDIR}/exclude.txt {SOURCEDIR} {TARGETDIR}" return True class Page09(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) self.setLayout(layout) def initializePage(self): self.label1.setText(get_lang_text("collect")) global RSYNC_CMD #self.label2.setText(f"{RSYNC_CMD}") bold_text = f"

{RSYNC_CMD}

" self.label2.setText(bold_text) class Page10(QtWidgets.QWizardPage): def __init__(self, parent=None): super().__init__(parent) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() self.label3 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) layout.addWidget(self.label3) self.setLayout(layout) self.setFinalPage(True) def initializePage(self): self.label1.setText(get_lang_text("outro1")) self.label2.setText(get_lang_text("outro2")) urlLink = f"{EMAIL}" self.label3.setText(urlLink) self.label3.setOpenExternalLinks(True) def validatePage(self): # create shell script with rsync command create_shell_script(RSYNC_CMD) return True def create_shell_script(command_str: str): rc_filepath: str = None global MYDIR, EXCLUDE, TARGET_SCRIPT TARGET_SCRIPT = os.path.join(MYDIR, TARGET_SCRIPT) ALIAS_STR = f"alias backuppy='sudo {TARGET_SCRIPT}'" current_shell = os.environ.get("SHELL") user_home = os.environ.get("HOME") ## STEP 1: update shell config scripts with alias for backuppy # .zshrc case1 and case2 if current_shell in ("/usr/bin/zsh", "/bin/zsh"): # Appending to bash config file rc_filepath = os.path.join(user_home, ".zshrc") # .bashrc case1 and case2 elif current_shell in ("/usr/bin/bash", "/bin/bash"): # Appending to zsh config file rc_filepath = os.path.join(user_home, ".bashrc") if os.path.isfile(rc_filepath): with open(rc_filepath, 'a') as file1: trace(f"Writing {ALIAS_STR} to config file '{rc_filepath}'.") file1.write("\n# Following line was created by Backuppy\n" + ALIAS_STR + "\n") ## STEP 2: Create the exclude script if desired if EXCLUDE: global EXCLUDE_FILE EXCLUDE_FILE = os.path.join(MYDIR, EXCLUDE_FILE) with open(EXCLUDE_FILE, "w") as file2: trace(f"creating exclude-file '{EXCLUDE_FILE}'.") file2.writelines("\n") ## STEP 3: enter the rsync command in Backuppy.sh with open(TARGET_SCRIPT, "w") as file3: trace(f"Writing rsync-command to file '{TARGET_SCRIPT}':\n {command_str}") file3.writelines("#!/bin/bash" + "\n") file3.writelines(command_str + "\n") if __name__ == '__main__': trace(f"Starting Backuppy install.py v{VERSION}") app = QtWidgets.QApplication() wizard = BackuppyWizard() wizard.show() app.exec_() trace("Ending Backuppy install.py")