[FIX] Fix selection and some methods

This commit is contained in:
2024-04-07 18:18:31 +03:00
parent 3f257ee23f
commit fc37723762
132 changed files with 20595 additions and 41 deletions

View File

@@ -12,9 +12,14 @@ class App:
drives: List[Drive] = []
thread = None
selected = None
drive_tree = None
wipe_result = {"result": None,
"err": ""}
def __init__(self):
set_default_color_theme("dark-blue")
@@ -69,7 +74,11 @@ class App:
for drive in self.drives:
self.drive_tree.insert("", END, values=(
drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num))
self.selected = None
if self.selected is not None:
items = self.drive_tree.get_children("")
for item in items:
if self.drive_tree.item(item)["values"] == self.selected:
self.drive_tree.selection_add(item)
def __load_drives(self):
@@ -82,7 +91,7 @@ class App:
self.drives.append(Drive(disk.Model, disk.Name, disk.InterfaceType, disk.DefaultBlockSize, int(
disk.Size), disk.SerialNumber, disk.Index))
elif self.OS_TYPE == "Linux":
from diskinfo import Disk, DiskInfo
from diskinfo import DiskInfo
di = DiskInfo()
disks = di.get_disk_list(sorting=True)
self.drives = []
@@ -137,6 +146,7 @@ class App:
def __drive_selected(self, event):
for selected_item in self.drive_tree.selection():
item = self.drive_tree.item(selected_item)
self.selected_id = selected_item
self.selected = item["values"]
def __erase_drive(self):
@@ -151,24 +161,28 @@ class App:
thread = None
self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=200)
self.progressbar.set(0)
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:
if drive.index == self.selected[0]:
thread = drive.erase(self.method_box.get(), progressbar=self.progressbar, progress_label=self.progress_label)
self.__check_thread(thread)
self.thread = drive.erase(self.method_box.get(), progressbar=self.progressbar, progress_label=self.progress_label, result=self.wipe_result)
self.__check_thread()
def __check_thread(self, thread):
if thread.is_alive():
self.root.after(1000, lambda: self.__check_thread(thread))
def __check_thread(self):
if self.thread.is_alive():
self.root.after(1000, lambda: self.__check_thread())
else:
self.progress_label.pack_forget()
self.progressbar.pack_forget()
self.drive_tree.configure(selectmode="browse")
self.erase_button.configure(state='active')
CTkMessagebox(title="Успешно", message=f"{self.selected[1]} стёрт!")
if self.wipe_result["result"]:
CTkMessagebox(title="Успешно", message=f"{self.selected[1]} стёрт!")
else:
CTkMessagebox(title="Ошибка", message=f"{self.wipe_result['err']}")
def __show_warning(self, text):
CTkMessagebox(title="Ошибка", message=text)
@@ -185,7 +199,7 @@ class App:
self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse))
def __ask_question(self):
msg = CTkMessagebox(title="Стереть", message=f"Вы уверены, что хотите стереть {self.selected[1]}?",
msg = CTkMessagebox(title="Стереть", message=f"Вы уверены, что хотите стереть {self.selected[1]} с серийным номером {self.selected[4]}?",
icon="question", option_1="Отмена", option_2="Нет", option_3="Да")
response = msg.get()

View File

@@ -14,16 +14,18 @@ erasing_methods = {
"data": ["random"]
},
"Гутмана": {
"num_passes": 0,
"data": []
"num_passes": 35,
"data": [
"random", "random", "random", "random", b"\x55", b"\xAA", b"\x92\x49\x24", b"\x49\x24\x92", b"\x24\x92\x49", b"\x00", b"\x11", b"\x22", b"\x33", b"\x44", b"\x55", b"\x66", b"\x77", b"\x88", b"\x99", b"\xAA", b"\xBB", b"\xCC", b"\xDD", b"\xEE", b"\xFF ", b"\x92\x49\x24", b"\x49\x24\x92", b"\x24\x92\x49", b"\x6D\xB6\xDB", b"\xB6\xDB\x6D", b"\xDB\x6D\xB6", "random", "random", "random", "random"
]
},
"3 прохода": {
"DoD Short": {
"num_passes": 3,
"data": [b"\x00", b"\xff", "random"]
},
"7 проходов": {
"DoD 5220.22M": {
"num_passes": 7,
"data": [b"\x00", b"\xff", "random", "random", b"\x00", b"\x01", "random"]
"data": [b"\x00", b"\xff", "random", b"\x00", b"\xff", "random", "random"]
}
}
@@ -38,13 +40,11 @@ def get_random_bytes(size):
class Drive():
index: int = None
index: int
path: str
total_sectors: str
disk_type = None
disk_type: str
name: str
@@ -52,7 +52,7 @@ class Drive():
capacity: int
serial_num = None
serial_num: str
def __init__(self, name, path, disk_type, block_size, capacity, dev_id, index):
self.name = name
@@ -64,29 +64,34 @@ class Drive():
self.serial_num = dev_id
self.index = index
def erase(self, method, progressbar, progress_label) -> threading.Thread:
t = threading.Thread(target=self.__erasing, args=(method, progressbar,progress_label))
def erase(self, method: str, progressbar, progress_label, result) -> threading.Thread:
t = threading.Thread(target=self.__erasing, args=(method, progressbar,progress_label,result))
t.start()
return t
def __erasing(self, method, progressbar, progress_label):
def __erasing(self, method, progressbar, progress_label, result):
write_size = self.block_size*32
with open(self.path, "wb") as drive:
for i in range(erasing_methods[method]["num_passes"]):
drive.seek(0)
prev_percent = 0
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
try:
with open(self.path, "wb") as drive:
for i in range(erasing_methods[method]["num_passes"]):
drive.seek(0)
prev_percent = 0
len_write = 0
progressbar.set(prev_percent)
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
result["result"] = True
result["err"] = ""
except Exception as e:
result["result"] = False
result["err"] = e