| 412 | |
| 413 | |
| 414 | class OutputStreamFactory: |
| 415 | def __init__( |
| 416 | self, session, popen=None, environ=None, default_less_flags='FRX' |
| 417 | ): |
| 418 | self._session = session |
| 419 | self._popen = popen |
| 420 | if popen is None: |
| 421 | self._popen = Popen |
| 422 | self._environ = environ |
| 423 | if environ is None: |
| 424 | # When calling out to the system's pager, we want to avoid using |
| 425 | # shared libraries bundled with the AWS CLI so that the pager uses |
| 426 | # the system's shared libraries. |
| 427 | with original_ld_library_path(): |
| 428 | self._environ = os.environ.copy() |
| 429 | self._default_less_flags = default_less_flags |
| 430 | |
| 431 | def get_output_stream(self): |
| 432 | pager = self._get_configured_pager() |
| 433 | if is_a_tty() and pager: |
| 434 | return self.get_pager_stream(pager) |
| 435 | return self.get_stdout_stream() |
| 436 | |
| 437 | @contextlib.contextmanager |
| 438 | def get_pager_stream(self, preferred_pager=None): |
| 439 | if not preferred_pager: |
| 440 | preferred_pager = self._get_configured_pager() |
| 441 | popen_kwargs = self._get_process_pager_kwargs(preferred_pager) |
| 442 | process = LazyPager(self._popen, **popen_kwargs) |
| 443 | try: |
| 444 | yield process.stdin |
| 445 | except OSError: |
| 446 | # Ignore IOError since this can commonly be raised when a pager |
| 447 | # is closed abruptly and causes a broken pipe. |
| 448 | pass |
| 449 | finally: |
| 450 | process.communicate() |
| 451 | |
| 452 | @contextlib.contextmanager |
| 453 | def get_stdout_stream(self): |
| 454 | yield get_stdout_text_writer() |
| 455 | |
| 456 | def _get_configured_pager(self): |
| 457 | return self._session.get_component('config_store').get_config_variable( |
| 458 | 'pager' |
| 459 | ) |
| 460 | |
| 461 | def _get_process_pager_kwargs(self, pager_cmd): |
| 462 | kwargs = get_popen_kwargs_for_pager_cmd(pager_cmd) |
| 463 | kwargs['stdin'] = PIPE |
| 464 | env = self._environ.copy() |
| 465 | if 'LESS' not in env: |
| 466 | env['LESS'] = self._default_less_flags |
| 467 | kwargs['env'] = env |
| 468 | kwargs['universal_newlines'] = True |
| 469 | return kwargs |
| 470 | |
| 471 |
no outgoing calls