forked from FotoCoder/Backuppy
Implemented same functionality as in install.sh
This commit is contained in:
parent
67a0360727
commit
d4327b64db
1 changed files with 336 additions and 0 deletions
336
install.py
Normal file
336
install.py
Normal file
|
@ -0,0 +1,336 @@
|
|||
#!/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"<p><strong>{SOURCEDIR}</strong></p>"
|
||||
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"<p><strong>{TARGETDIR}</strong></p>"
|
||||
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"<p><strong>{RSYNC_CMD}</strong></p>"
|
||||
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"<a href='mailto: {EMAIL}'>{EMAIL}</a>"
|
||||
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")
|
Loading…
Reference in a new issue