[FIX] Fix selection and some methods
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user