munyal-client/munyal/config.py

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())