| 3354 | return True |
| 3355 | |
| 3356 | def download(self, remote_items): |
| 3357 | # Initialization |
| 3358 | try: |
| 3359 | shlex.split(remote_items) # Early check for shlex errors |
| 3360 | except ValueError as e: |
| 3361 | logger.error(e) |
| 3362 | return [] |
| 3363 | |
| 3364 | local_download_folder = self.directory / "downloads" |
| 3365 | try: |
| 3366 | local_download_folder.mkdir(parents=True, exist_ok=True) |
| 3367 | except Exception as e: |
| 3368 | logger.error(e) |
| 3369 | return [] |
| 3370 | |
| 3371 | if self.OS == 'Unix': |
| 3372 | # Check for local available space |
| 3373 | available_bytes = shutil.disk_usage(local_download_folder).free |
| 3374 | if self.agent: |
| 3375 | block_size = os.statvfs(local_download_folder).f_frsize |
| 3376 | response = self.exec(f"{GET_GLOB_SIZE}" |
| 3377 | f"stdout_stream << str(get_glob_size({repr(remote_items)}, {block_size}, {repr(options.link_dereference)})).encode()", |
| 3378 | python=True, |
| 3379 | value=True |
| 3380 | ) |
| 3381 | try: |
| 3382 | remote_size = int(float(response)) |
| 3383 | except Exception: |
| 3384 | logger.error(response) |
| 3385 | return [] |
| 3386 | else: |
| 3387 | cmd = f"du -ck {remote_items}" |
| 3388 | response = self.exec(cmd, timeout=None, value=True) |
| 3389 | if not response: |
| 3390 | logger.error("Cannot determine remote size") |
| 3391 | return [] |
| 3392 | #errors = [line[4:] for line in response.splitlines() if line.startswith('du: ')] |
| 3393 | #for error in errors: |
| 3394 | # logger.error(error) |
| 3395 | remote_size = int(response.splitlines()[-1].split()[0]) * 1024 |
| 3396 | |
| 3397 | need = remote_size - available_bytes |
| 3398 | |
| 3399 | if need > 0: |
| 3400 | logger.error( |
| 3401 | f"--- Not enough space to download... {paint('We need ').blue}" |
| 3402 | f"{paint().yellow}{need:,}{paint().blue} more bytes..." |
| 3403 | ) |
| 3404 | return [] |
| 3405 | |
| 3406 | # Packing and downloading |
| 3407 | if self.agent: |
| 3408 | stdin_stream = self.new_streamID |
| 3409 | stdout_stream = self.new_streamID |
| 3410 | stderr_stream = self.new_streamID |
| 3411 | |
| 3412 | if not all([stdout_stream, stderr_stream]): |
| 3413 | return [] |