Emit a log record or create/update an animated progress logger depending on whether :data:`term.term_mode` is enabled.
(self, record)
| 524 | def stream(self, value): |
| 525 | pass |
| 526 | def emit(self, record): |
| 527 | """ |
| 528 | Emit a log record or create/update an animated progress logger |
| 529 | depending on whether :data:`term.term_mode` is enabled. |
| 530 | """ |
| 531 | # We have set the root 'pwnlib' logger to have a logLevel of 1, |
| 532 | # when logging has been enabled via install_default_handler. |
| 533 | # |
| 534 | # If the level is 1, we should only process the record if |
| 535 | # context.log_level is less than the record's log level. |
| 536 | # |
| 537 | # If the level is not 1, somebody else expressly set the log |
| 538 | # level somewhere on the tree, and we should use that value. |
| 539 | level = logging.getLogger(record.name).getEffectiveLevel() |
| 540 | if level == 1: |
| 541 | level = context.log_level |
| 542 | if level > record.levelno: |
| 543 | return |
| 544 | |
| 545 | progress = getattr(record, 'pwnlib_progress', None) |
| 546 | |
| 547 | # if the record originates from a `Progress` object and term handling |
| 548 | # is enabled we can have animated spinners! so check that |
| 549 | if progress is None or not term.term_mode: |
| 550 | super(Handler, self).emit(record) |
| 551 | return |
| 552 | |
| 553 | # yay, spinners! |
| 554 | |
| 555 | # since we want to be able to update the spinner we overwrite the |
| 556 | # message type so that the formatter doesn't output a prefix symbol |
| 557 | msgtype = record.pwnlib_msgtype |
| 558 | record.pwnlib_msgtype = 'animated' |
| 559 | msg = "%s\n" % self.format(record) |
| 560 | |
| 561 | # we enrich the `Progress` object to keep track of the spinner |
| 562 | if not hasattr(progress, '_spinner_handle'): |
| 563 | spinner_handle = term.output('[x] ') |
| 564 | msg_handle = term.output(msg) |
| 565 | stop = threading.Event() |
| 566 | def spin(): |
| 567 | '''Wheeeee!''' |
| 568 | state = 0 |
| 569 | states = random.choice(spinners.spinners) |
| 570 | while True: |
| 571 | prefix = '[%s] ' % _spinner_style(states[state]) |
| 572 | spinner_handle.update(prefix) |
| 573 | state = (state + 1) % len(states) |
| 574 | if stop.wait(0.1): |
| 575 | break |
| 576 | t = Thread(target = spin) |
| 577 | t.daemon = True |
| 578 | t.start() |
| 579 | progress._spinner_handle = spinner_handle |
| 580 | progress._msg_handle = msg_handle |
| 581 | progress._stop_event = stop |
| 582 | progress._spinner_thread = t |
| 583 | else: |