192 lines
5.3 KiB
Python
192 lines
5.3 KiB
Python
import os
|
|
import shutil
|
|
import sys
|
|
import pathlib
|
|
import pickle
|
|
|
|
from hashlib import sha256
|
|
|
|
from uuid import uuid4
|
|
|
|
from munyal.misc import alert
|
|
from munyal.misc import get_os
|
|
from munyal.misc import path_join
|
|
|
|
|
|
def __get_config_folder():
|
|
_os = get_os()
|
|
if _os == "linux":
|
|
folder = path_join(os.getenv("HOME"), ".munyal")
|
|
else:
|
|
folder = path_join(os.path.expandvars("%APPDATA%"), "Munyal")
|
|
return folder
|
|
|
|
def __get_files_folder():
|
|
folder = path_join(os.path.expanduser("~"), "Munyal")
|
|
return folder
|
|
|
|
def get_last_history():
|
|
last_history_path = path_join(__get_config_folder(), "history.pkl")
|
|
if not os.path.exists(last_history_path):
|
|
return None
|
|
with open(last_history_path, "rb") as history:
|
|
return pickle.load(history)
|
|
|
|
def set_last_history(last_history):
|
|
last_history_path = path_join(__get_config_folder(), "history.pkl")
|
|
with open(last_history_path, "wb") as history:
|
|
pickle.dump(last_history, history)
|
|
|
|
def get_config():
|
|
for _ in range(3):
|
|
try:
|
|
config = __get_config()
|
|
except EOFError:
|
|
config = None
|
|
if not config:
|
|
try:
|
|
gui_config()
|
|
except ModuleNotFoundError as e:
|
|
cli_config()
|
|
else:
|
|
return config
|
|
|
|
|
|
def __get_config():
|
|
folder = __get_config_folder()
|
|
config_file = path_join(folder, "config")
|
|
if os.path.exists(config_file):
|
|
config_bytes = open(config_file, "rb")
|
|
config = pickle.load(config_bytes)
|
|
config_bytes.close()
|
|
return config
|
|
|
|
|
|
def __validate_values(user, password):
|
|
return True
|
|
|
|
|
|
def _gui_validate_config(root, user, password, folder):
|
|
passwd_hash = sha256(password.get().encode("utf-8")).hexdigest()
|
|
if not user:
|
|
alert(root, "Introduce tu usuario de la red Munyal")
|
|
elif not password:
|
|
alert(root, "Introduce tu contraseña")
|
|
elif not folder:
|
|
alert(root, "Elige la carpeta que quieres sincronizar")
|
|
elif not __validate_values(user, passwd_hash):
|
|
alert(
|
|
root,
|
|
"Tu usuario o contraseña son incorrectos, favor de reintentarlo")
|
|
else:
|
|
password.set("")
|
|
__set_config(user, passwd_hash, folder)
|
|
root.destroy()
|
|
|
|
|
|
def _cli_validate_config(user, password, folder):
|
|
if not user:
|
|
print("! Introduce tu usuario de la red munyal !")
|
|
elif not password:
|
|
print("! Introduce tu contraseña !")
|
|
elif not folder:
|
|
print("! Elige la carpeta que quieres sincronizar !")
|
|
elif not __validate_values(user, passwd_hash):
|
|
print("! Tu usuario o contraseña son incorrectos !")
|
|
else:
|
|
return True
|
|
return False
|
|
|
|
|
|
def __set_config(user, password, folder):
|
|
folder_config = __get_config_folder()
|
|
# Create config folder
|
|
path = pathlib.Path(folder_config)
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
# Create Munyal folder
|
|
path = pathlib.Path(folder)
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
|
|
with open(path_join(folder_config, "config"), "wb") as config_file:
|
|
config_file.write(
|
|
pickle.dumps({
|
|
"login": {
|
|
"user": user,
|
|
"password": password
|
|
},
|
|
"folder": folder,
|
|
"uuid": str(uuid4())
|
|
}))
|
|
|
|
|
|
def gui_config():
|
|
from tkinter import Button, Entry, Label, StringVar, Tk, filedialog
|
|
from PIL import Image, ImageTk
|
|
|
|
root = Tk()
|
|
root.geometry("250x420")
|
|
|
|
img_logo = Image.open("img/logo.png")
|
|
img_tk = ImageTk.PhotoImage(img_logo.resize((200, 150), Image.ANTIALIAS))
|
|
|
|
host = StringVar()
|
|
host.set("localhost")
|
|
host_field = Entry(root, textvariable=host)
|
|
|
|
passwd = StringVar()
|
|
passwd_field = Entry(root, textvariable=passwd, show="*")
|
|
|
|
folder = StringVar()
|
|
folder.set(__get_files_folder())
|
|
folder_field = Entry(root, textvariable=folder)
|
|
btn_folder = Button(root,
|
|
text="Examinar",
|
|
command=lambda: search_folder(folder))
|
|
|
|
connect = Button(
|
|
root,
|
|
text="Conectar",
|
|
command=lambda: _gui_validate_config(root, host.get(), passwd, folder.get()))
|
|
|
|
Label(root, text="MUNYAL").pack()
|
|
Label(root, image=img_tk).pack()
|
|
Label(root, text="").pack()
|
|
Label(root, text="Ruta del servidor").pack()
|
|
host_field.pack()
|
|
Label(root, text="").pack()
|
|
Label(root, text="Contraseña").pack()
|
|
passwd_field.pack()
|
|
Label(root, text="").pack()
|
|
Label(root, text="Carpeta a sincronizar").pack()
|
|
folder_field.pack()
|
|
btn_folder.pack()
|
|
Label(root, text="").pack()
|
|
connect.pack()
|
|
|
|
root.mainloop()
|
|
|
|
|
|
def cli_config():
|
|
while True:
|
|
host = input("Introduce tu usuario de Munyal\n>>> ")
|
|
password = input("Introduce tu contraseña\n>>> ")
|
|
folder = input("Introduce el directorio que quieres sincronizar\n>> ")
|
|
if _cli_validate_config(host, password, folder):
|
|
break
|
|
else:
|
|
print("! Los datos introducidos no son correctos, intentalo de nuevo !")
|
|
passwd_hash = sha256(password.encode("utf-8")).hexdigest()
|
|
__set_config(user, password, folder)
|
|
|
|
|
|
def search_folder(field):
|
|
path = filedialog.askdirectory()
|
|
field.set(path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if "--restart" in sys.argv:
|
|
if get_config():
|
|
shutil.rmtree(__get_config_folder())
|
|
print(get_config())
|