[ADD\FIX] Added new windows and fixes slow work of wiper

This commit is contained in:
vadzik 2024-02-27 14:33:54 +03:00
parent 736fd3b049
commit 406eb8c166
2 changed files with 74 additions and 19 deletions

View File

@ -2,6 +2,7 @@ import platform
from tkinter import ttk from tkinter import ttk
from customtkinter import * from customtkinter import *
from CTkMenuBar import * from CTkMenuBar import *
from CTkMessagebox import *
from typing import List from typing import List
from app.utils_drive import * from app.utils_drive import *
@ -23,8 +24,8 @@ class App:
self.root = CTk() self.root = CTk()
self.root.title("Disk Eraser") self.root.title("Disk Eraser")
self.root.geometry("700x300") self.root.geometry("800x300")
self.root.minsize(700, 300) self.root.minsize(800, 300)
self.__load_menus() self.__load_menus()
self.__init_table() self.__init_table()
self.__update_drives() self.__update_drives()
@ -38,9 +39,9 @@ class App:
help_menu = main_menu.add_cascade("Справка") help_menu = main_menu.add_cascade("Справка")
dropdown1 = CustomDropdownMenu(widget=help_menu) dropdown1 = CustomDropdownMenu(widget=help_menu)
dropdown1.add_option(option="Содержание") dropdown1.add_option(option="Помощь")
dropdown1.add_separator() dropdown1.add_separator()
dropdown1.add_option(option="О программе") dropdown1.add_option(option="О программе", command=self.__open_about_window)
self.root.config(menu=main_menu) self.root.config(menu=main_menu)
@ -68,6 +69,7 @@ class App:
for drive in self.drives: for drive in self.drives:
self.drive_tree.insert("", END, values=( self.drive_tree.insert("", END, values=(
drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num)) drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num))
self.selected = None
def __load_drives(self): def __load_drives(self):
@ -138,23 +140,38 @@ class App:
self.selected = item["values"] self.selected = item["values"]
def __erase_drive(self): def __erase_drive(self):
if self.selected is not None: method = self.method_box.get()
if self.selected is None:
self.__show_warning("Выберете носитель информации для стирания!")
elif method == "":
self.__show_warning("Выберете метод стирания данных!")
elif self.__ask_question():
self.erase_button.configure(state='disabled') self.erase_button.configure(state='disabled')
self.drive_tree.configure(selectmode="none")
thread = None thread = None
self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=250) self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=200)
self.progressbar.pack(side=LEFT, padx=6, pady=6) self.progressbar.pack(side=LEFT, padx=6, pady=6)
self.progress_label = CTkLabel(self.bottom_frame, text="0 %")
self.progress_label.pack(side=LEFT, padx=5, pady=5)
for drive in self.drives: for drive in self.drives:
if drive.index == self.selected[0]: if drive.index == self.selected[0]:
thread = drive.erase(self.method_box.get(), progress=self.progressbar) thread = drive.erase(self.method_box.get(), progressbar=self.progressbar, progress_label=self.progress_label)
self.__check_thread(thread) self.__check_thread(thread)
def __check_thread(self, thread): def __check_thread(self, thread):
if thread.is_alive(): if thread.is_alive():
self.root.after(1000, lambda: self.__check_thread(thread)) self.root.after(1000, lambda: self.__check_thread(thread))
else: else:
self.progress_label.pack_forget()
self.progressbar.pack_forget() self.progressbar.pack_forget()
self.drive_tree.configure(selectmode="browse")
self.erase_button.configure(state='active') self.erase_button.configure(state='active')
CTkMessagebox(title="Успешно", message=f"{self.selected[1]} стёрт!")
def __show_warning(self, text):
CTkMessagebox(title="Ошибка", message=text)
def __sort(self, col, reverse): def __sort(self, col, reverse):
# получаем все значения столбцов в виде отдельного списка # получаем все значения столбцов в виде отдельного списка
@ -165,4 +182,17 @@ class App:
for index, (_, k) in enumerate(l): for index, (_, k) in enumerate(l):
self.drive_tree.move(k, "", index) self.drive_tree.move(k, "", index)
# в следующий раз выполняем сортировку в обратном порядке # в следующий раз выполняем сортировку в обратном порядке
self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse)) self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse))
def __ask_question(self):
msg = CTkMessagebox(title="Стереть", message=f"Вы уверены, что хотите стереть {self.selected[1]}?",
icon="question", option_1="Отмена", option_2="Нет", option_3="Да")
response = msg.get()
if response == "Да":
return True
else:
return False
def __open_about_window(self):
CTkMessagebox(title="О программе", message="Программа для гарантированного стирания машинных носителей информации\n(c) Romanko M.I., Russia, 2024")

View File

@ -1,4 +1,8 @@
from threading import * import threading
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
erasing_methods = { erasing_methods = {
"2 прохода": { "2 прохода": {
@ -10,7 +14,7 @@ erasing_methods = {
"data": ["random"] "data": ["random"]
}, },
"Гутмана": { "Гутмана": {
"num_passes": 35, "num_passes": 0,
"data": [] "data": []
}, },
"3 прохода": { "3 прохода": {
@ -23,6 +27,14 @@ erasing_methods = {
} }
} }
def get_random_bytes(size):
seed=os.urandom(32)
backend = default_backend()
cipher = Cipher(algorithms.AES(seed), modes.CTR(b'\0'*16), backend=backend)
encryptor = cipher.encryptor()
nulls=b'\0'*(size)
return encryptor.update(nulls)
class Drive(): class Drive():
@ -52,16 +64,29 @@ class Drive():
self.serial_num = dev_id self.serial_num = dev_id
self.index = index self.index = index
def erase(self, method, progress=0) -> Thread: def erase(self, method, progressbar, progress_label) -> threading.Thread:
t = Thread(target=self.__erasing, args=(progress,)) t = threading.Thread(target=self.__erasing, args=(method, progressbar,progress_label))
t.start() t.start()
return t return t
def __erasing(self, progress): def __erasing(self, method, progressbar, progress_label):
len_write = 0 write_size = self.block_size*32
write_size = self.block_size*256
with open(self.path, "wb") as drive: with open(self.path, "wb") as drive:
while len_write < self.capacity: for i in range(erasing_methods[method]["num_passes"]):
# drive.write(b"\x00"*self.block_size) drive.seek(0)
len_write += write_size prev_percent = 0
progress.set(len_write/self.capacity) len_write = 0
progressbar.set(prev_percent)
print(i)
while len_write < self.capacity:
if erasing_methods[method]["data"][i] == "random":
data = get_random_bytes(write_size)
else:
data = erasing_methods[method]["data"][i] * write_size
drive.write(data)
len_write += write_size
cur_percent = len_write/self.capacity
if cur_percent - prev_percent > 0.01:
progressbar.set(cur_percent)
progress_label.configure(text=f"{int(cur_percent*100)} %")
prev_percent = cur_percent