Пример #1
0
    def notification(self,
                     message: str,
                     pause: bool = True,
                     wrap: bool = True,
                     force_interactive: bool = False,
                     decorate: bool = True) -> None:
        """Displays a notification and waits for user acceptance.

        :param str message: Message to display
        :param bool pause: Whether or not the program should pause for the
            user's confirmation
        :param bool wrap: Whether or not the application should wrap text
        :param bool force_interactive: True if it's safe to prompt the user
            because it won't cause any workflow regressions
        :param bool decorate: Whether to surround the message with a
            decorated frame

        """
        if wrap:
            message = util.wrap_lines(message)

        logger.debug("Notifying user: %s", message)

        self.outfile.write(
            (("{line}{frame}{line}" if decorate else "") + "{msg}{line}" +
             ("{frame}{line}" if decorate else "")).format(line=os.linesep,
                                                           frame=SIDE_FRAME,
                                                           msg=message))
        self.outfile.flush()

        if pause:
            if self._can_interact(force_interactive):
                util.input_with_timeout("Press Enter to Continue")
            else:
                logger.debug("Not pausing for user confirmation")
Пример #2
0
    def _get_valid_int_ans(self, max_: int) -> Tuple[str, int]:
        """Get a numerical selection.

        :param int max: The maximum entry (len of choices), must be positive

        :returns: tuple of the form (`code`, `selection`) where
            `code` - str display exit code ('ok' or cancel')
            `selection` - int user's selection
        :rtype: tuple

        """
        selection = -1
        if max_ > 1:
            input_msg = ("Select the appropriate number "
                         "[1-{max_}] then [enter] (press 'c' to "
                         "cancel): ".format(max_=max_))
        else:
            input_msg = ("Press 1 [enter] to confirm the selection "
                         "(press 'c' to cancel): ")
        while selection < 1:
            ans = util.input_with_timeout(input_msg)
            if ans.startswith("c") or ans.startswith("C"):
                return CANCEL, -1
            try:
                selection = int(ans)
                if selection < 1 or selection > max_:
                    selection = -1
                    raise ValueError

            except ValueError:
                self.outfile.write("{0}** Invalid input **{0}".format(
                    os.linesep))
                self.outfile.flush()

        return OK, selection
Пример #3
0
    def input(self,
              message: str,
              default: Optional[str] = None,
              cli_flag: Optional[str] = None,
              force_interactive: bool = False,
              **unused_kwargs: Any) -> Tuple[str, str]:
        """Accept input from the user.

        :param str message: message to display to the user
        :param default: default value to return (if one exists)
        :param str cli_flag: option used to set this value with the CLI
        :param bool force_interactive: True if it's safe to prompt the user
            because it won't cause any workflow regressions

        :returns: tuple of (`code`, `input`) where
            `code` - str display exit code
            `input` - str of the user's input
        :rtype: tuple

        """
        return_default = self._return_default(message, default, cli_flag,
                                              force_interactive)
        if return_default is not None:
            return OK, return_default

        # Trailing space must be added outside of util.wrap_lines to
        # be preserved
        message = util.wrap_lines("%s (Enter 'c' to cancel):" % message) + " "
        ans = util.input_with_timeout(message)

        if ans in ("c", "C"):
            return CANCEL, "-1"
        return OK, ans
Пример #4
0
    def yesno(self,
              message: str,
              yes_label: str = "Yes",
              no_label: str = "No",
              default: Optional[bool] = None,
              cli_flag: Optional[str] = None,
              force_interactive: bool = False,
              **unused_kwargs: Any) -> bool:
        """Query the user with a yes/no question.

        Yes and No label must begin with different letters, and must contain at
        least one letter each.

        :param str message: question for the user
        :param str yes_label: Label of the "Yes" parameter
        :param str no_label: Label of the "No" parameter
        :param default: default value to return (if one exists)
        :param str cli_flag: option used to set this value with the CLI
        :param bool force_interactive: True if it's safe to prompt the user
            because it won't cause any workflow regressions

        :returns: True for "Yes", False for "No"
        :rtype: bool

        """
        return_default = self._return_default(message, default, cli_flag,
                                              force_interactive)
        if return_default is not None:
            return return_default

        message = util.wrap_lines(message)

        self.outfile.write("{0}{frame}{msg}{0}{frame}".format(
            os.linesep, frame=SIDE_FRAME + os.linesep, msg=message))
        self.outfile.flush()

        while True:
            ans = util.input_with_timeout("{yes}/{no}: ".format(
                yes=util.parens_around_char(yes_label),
                no=util.parens_around_char(no_label)))

            # Couldn't get pylint indentation right with elif
            # elif doesn't matter in this situation
            if (ans.startswith(yes_label[0].lower())
                    or ans.startswith(yes_label[0].upper())):
                return True
            if (ans.startswith(no_label[0].lower())
                    or ans.startswith(no_label[0].upper())):
                return False
Пример #5
0
 def _call(cls, *args, **kwargs):
     from certbot._internal.display.util import input_with_timeout
     return input_with_timeout(*args, **kwargs)