fixed permission error for some OS

This commit is contained in:
Félix Boisselier
2024-04-24 14:02:27 +02:00
parent 99b719051c
commit 31a5ed8db2

View File

@@ -3,32 +3,30 @@
# Common file management functions for the Shake&Tune package
# Written by Frix_x#0161 #
import os
import time
from pathlib import Path
def wait_file_ready(filepath: Path) -> None:
def wait_file_ready(filepath: Path, timeout: int = 60) -> None:
file_busy = True
loop_count = 0
proc_path = Path('/proc')
while file_busy:
if loop_count > 60:
# If Klipper is taking too long to release the file (60 * 1s = 1min), raise an error
raise TimeoutError(f'Klipper is taking too long to release {filepath}!')
for proc in proc_path.iterdir():
if proc.name.isdigit():
fd_path = proc / 'fd'
if fd_path.exists():
for fd in fd_path.iterdir():
while file_busy:
if loop_count >= timeout:
raise TimeoutError(f'Klipper is taking too long to release the CSV file ({filepath})!')
# Try to open the file in write-only mode to check if it is in use
# If we successfully open and close the file, it is not in use
try:
# Using resolve to ensure symbolic links are followed
if fd.resolve(strict=False) == filepath:
pass # File is still being used by Klipper
except FileNotFoundError: # Klipper has already released the CSV file
fd = os.open(filepath, os.O_WRONLY)
os.close(fd)
file_busy = False
break
except PermissionError: # Unable to check for this particular process due to permissions
except OSError:
# If OSError is caught, it indicates the file is still being used
pass
except Exception:
# If another exception is raised, it's not a problem, we just loop again
pass
loop_count += 1