libicsneo/examples/python/diskformat/disk_format_example.py

115 lines
3.5 KiB
Python

import sys
import icsneopy
def disk_format_example():
devices = icsneopy.find_all_devices()
if not devices:
print("error: no devices found")
return False
print(f"Found {len(devices)} device(s):")
for i, d in enumerate(devices):
print(f" [{i}] {d}")
if len(devices) == 1:
choice = 0
else:
try:
choice = int(input(f"Select a device [0-{len(devices)-1}]: "))
except (ValueError, EOFError):
print("error: invalid selection")
return False
if choice < 0 or choice >= len(devices):
print("error: invalid selection")
return False
device = devices[choice]
print(f"\nOpening {device}... ", end="", flush=True)
if not device.open():
print("FAIL")
print(f"error: {icsneopy.get_last_error().describe()}")
return False
print("OK")
if not device.supports_disk_formatting():
print(f"error: {device} does not support disk formatting")
device.close()
return False
print(f"Disk count: {device.get_disk_count()}")
# Query current disk state
print("\nQuerying disk details... ", end="", flush=True)
details = device.get_disk_details()
if details is None:
print("FAIL")
print(f"error: {icsneopy.get_last_error().describe()}")
device.close()
return False
print("OK")
layout_name = "RAID0" if details.layout == icsneopy.DiskLayout.RAID0 else "Spanned"
print(f" Layout : {layout_name}")
for i, disk in enumerate(details.disks):
print(f" Disk [{i}]:")
print(f" Present : {'yes' if disk.present else 'no'}")
print(f" Initialized : {'yes' if disk.initialized else 'no'}")
print(f" Formatted : {'yes' if disk.formatted else 'no'}")
if disk.present:
mb = disk.size() // (1024 * 1024)
print(f" Size : {mb} MB ({disk.sectors} sectors x {disk.bytes_per_sector} bytes)")
any_present = any(d.present for d in details.disks)
if not any_present:
print("\nerror: no disks are present in the device")
device.close()
return False
# Build format config from the queried state
fmt = icsneopy.DiskDetails()
fmt.layout = details.layout
fmt.full_format = False # Quick format; set True for a full (slow) format
fmt.disks = details.disks
for disk in fmt.disks:
if disk.present:
disk.formatted = True # mark for formatting
confirm = input(
f"\nThis will format the disk(s) in {device}.\n"
"All existing data will be lost. Continue? [y/N]: "
).strip()
if confirm.lower() != "y":
print("Aborted.")
device.close()
return True
print("\nStarting format...")
state = {"total": 0}
ok = device.format_disk(fmt)
print() # newline after progress line
if not ok:
print(f"error: format failed: {icsneopy.get_last_error().describe()}")
device.close()
return False
print("Format complete!")
# Verify
print("\nVerifying disk state after format... ", end="", flush=True)
post = device.get_disk_details()
if post is None:
print("FAIL (could not re-query disk details)")
else:
print("OK")
for i, disk in enumerate(post.disks):
print(f" Disk [{i}] formatted: {'yes' if disk.formatted else 'no'}")
device.close()
return True
if __name__ == "__main__":
sys.exit(0 if disk_format_example() else 1)