Пример #1
0
    def __cmd_sequence(self, cmd_type, option, action_method, query_method,
                       parse_method, message, start_args=None, end_args=None,
                       no_exit=False):
        if self.fw is not None:
            self.fw.authorizeAll()
        items = [ ]
        _errors = 0
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                        _errors += 1
                        continue
                    else:
                        code = FirewallError.get_code(str(msg))
                        self.print_and_exit("Error: %s" % msg, code)
                        _errors += 1

            items.append(item)

        for item in items:
            call_item = [ ]
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            if end_args is not None:
                call_item += end_args
            self.deactivate_exception_handler()
            try:
                action_method(*call_item)
            except DBusException as msg:
                code = FirewallError.get_code(msg.get_dbus_message())
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg.get_dbus_message())
                else:
                    self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                        code)
                _errors += 1
            except Exception as msg:
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg)
                    _errors += 1
                    continue
                else:
                    code = FirewallError.get_code(str(msg))
                    self.print_and_exit("Error: %s" % msg, code)
                    _errors += 1
            self.activate_exception_handler()

        if _errors == len(option) and not no_exit:
            sys.exit(errors.UNKNOWN_ERROR)
Пример #2
0
    def __query_sequence(
            self,
            option,
            query_method,
            parse_method,
            message,  # pylint: disable=R0913
            start_args=None,
            no_exit=False):
        items = []
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                        continue
                    else:
                        code = FirewallError.get_code(str(msg))
                        self.print_and_exit("Error: %s" % msg, code)
            items.append(item)

        for item in items:
            call_item = []
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            self.deactivate_exception_handler()
            try:
                res = query_method(*call_item)
            except DBusException as msg:
                self.fail_if_not_authorized(msg.get_dbus_name())
                code = FirewallError.get_code(msg.get_dbus_message())
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg.get_dbus_message())
                    continue
                else:
                    self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                        code)
            except Exception as msg:
                code = FirewallError.get_code(str(msg))
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg)
                else:
                    self.print_and_exit("Error: %s" % msg, code)
            self.activate_exception_handler()
            if len(option) > 1:
                self.print_msg("%s: %s" % (message % item, ("no", "yes")[res]))
            else:
                self.print_query_result(res)
        if not no_exit:
            sys.exit(0)
Пример #3
0
    def __query_sequence(self, option, query_method, parse_method, message, # pylint: disable=R0913
                         start_args=None, no_exit=False):
        items = [ ]
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                        continue
                    else:
                        code = FirewallError.get_code(str(msg))
                        self.print_and_exit("Error: %s" % msg, code)
            items.append(item)

        for item in items:
            call_item = [ ]
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            self.deactivate_exception_handler()
            try:
                res = query_method(*call_item)
            except DBusException as msg:
                self.fail_if_not_authorized(msg.get_dbus_name())
                code = FirewallError.get_code(msg.get_dbus_message())
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg.get_dbus_message())
                    continue
                else:
                    self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                        code)
            except Exception as msg:
                code = FirewallError.get_code(str(msg))
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg)
                else:
                    self.print_and_exit("Error: %s" % msg, code)
            self.activate_exception_handler()
            if len(option) > 1:
                self.print_msg("%s: %s" % (message % item, ("no", "yes")[res]))
            else:
                self.print_query_result(res)
        if not no_exit:
            sys.exit(0)
Пример #4
0
 def __query_sequence(self, option, query_method, parse_method, message,
                      start_args=[]):
     items = [ ]
     for item in option:
         if parse_method != None:
             items.append(parse_method(item))
         else:
             items.append(item)
     for item in items:
         call_item = start_args[:]
         if not isinstance(item, list) and not isinstance(item, tuple):
             call_item.append(item)
         else:
             call_item += item
         try:
             res = query_method(*call_item)
         except DBusException as msg:
             code = FirewallError.get_code(msg)
             if len(option) > 1:
                 self.print_warning("Warning: %s" % msg.get_dbus_message())
             else:
                 self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                     code)
             continue
         if len(option) > 1:
             self.print_msg("%s: %s" % (message % item, ("no", "yes")[res]))
         else:
             self.print_query_result(res)
     sys.exit(0)
Пример #5
0
 def exception_handler(self, exception_message):
     if not self.__use_exception_handler:
         raise
     self.fail_if_not_authorized(exception_message)
     code = FirewallError.get_code(str(exception_message))
     if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                  errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]:
         self.print_warning("Warning: %s" % exception_message)
     else:
         self.print_and_exit("Error: %s" % exception_message, code)
Пример #6
0
 def exception_handler(self, exception_message):
     if not self.__use_exception_handler:
         raise
     self.fail_if_not_authorized(exception_message)
     code = FirewallError.get_code(str(exception_message))
     if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                  errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]:
         self.print_warning("Warning: %s" % exception_message)
     else:
         self.print_and_exit("Error: %s" % exception_message, code)
Пример #7
0
 def exception_handler(self, exception_message):
     if "NotAuthorizedException" in exception_message:
         msg = """Authorization failed.
 Make sure polkit agent is running or run the application as superuser."""
         self.print_and_exit(msg, errors.NOT_AUTHORIZED)
     else:
         code = FirewallError.get_code(exception_message)
         if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                      errors.ZONE_ALREADY_SET ]:
             self.print_warning("Warning: %s" % exception_message)
         else:
             self.print_and_exit("Error: %s" % exception_message, code)
Пример #8
0
 def exception_handler(self, exception_message):
     if not self.__use_exception_handler:
         raise
     if "NotAuthorizedException" in exception_message:
         msg = """Authorization failed.
 Make sure polkit agent is running or run the application as superuser."""
         self.print_and_exit(msg, errors.NOT_AUTHORIZED)
     else:
         code = FirewallError.get_code(exception_message)
         if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                      errors.ZONE_ALREADY_SET ]:
             self.print_warning("Warning: %s" % exception_message)
         else:
             self.print_and_exit("Error: %s" % exception_message, code)
Пример #9
0
 def _impl(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except FirewallError as error:
         code = FirewallError.get_code(str(error))
         if code in [
                 errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                 errors.ZONE_ALREADY_SET, errors.ALREADY_SET
         ]:
             log.warning(str(error))
         else:
             log.debug1(traceback.format_exc())
             log.error(str(error))
         raise FirewallDBusException(str(error))
     except DBusException as ex:
         # only log DBusExceptions once
         raise ex
     except Exception as ex:
         log.exception()
         raise FirewallDBusException(str(ex))
Пример #10
0
def dbus_handle_exceptions(func, *args, **kwargs):
    """Decorator to handle exceptions, log and report them into D-Bus

    :Raises DBusException: on a firewall error code problems.
    """
    try:
        return func(*args, **kwargs)
    except FirewallError as error:
        code = FirewallError.get_code(str(error))
        if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                     errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]:
            log.warning(str(error))
        else:
            log.error(str(error))
        raise FirewallDBusException(str(error))
    except DBusException as ex:
        # only log DBusExceptions once
        raise ex
    except Exception as ex:
        log.exception()
        raise FirewallDBusException(str(ex))
Пример #11
0
    def __cmd_sequence(
            self,
            cmd_type,
            option,
            action_method,
            query_method,  # pylint: disable=W0613, R0913, R0914
            parse_method,
            message,
            start_args=None,
            end_args=None,  # pylint: disable=W0613
            no_exit=False):
        if self.fw is not None:
            self.fw.authorizeAll()
        items = []
        _errors = 0
        _error_codes = []
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    code = FirewallError.get_code(str(msg))
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                    else:
                        self.print_and_exit("Error: %s" % msg, code)
                    if code not in _error_codes:
                        _error_codes.append(code)
                    _errors += 1
                    continue

            items.append(item)

        for item in items:
            call_item = []
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            if end_args is not None:
                call_item += end_args
            self.deactivate_exception_handler()
            try:
                action_method(*call_item)
            except (DBusException, Exception) as msg:
                if isinstance(msg, DBusException):
                    self.fail_if_not_authorized(msg.get_dbus_name())
                    msg = msg.get_dbus_message()
                else:
                    msg = str(msg)
                code = FirewallError.get_code(msg)
                if code in [
                        errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                        errors.ZONE_ALREADY_SET, errors.ALREADY_SET
                ]:
                    code = 0
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg)
                elif code == 0:
                    self.print_warning("Warning: %s" % msg)
                    return
                else:
                    self.print_and_exit("Error: %s" % msg, code)
                if code not in _error_codes:
                    _error_codes.append(code)
                _errors += 1
            self.activate_exception_handler()

        if not no_exit:
            if len(option) > _errors or 0 in _error_codes:
                # There have been more options than errors or there
                # was at least one error code 0, return.
                return
            elif len(_error_codes) == 1:
                # Exactly one error code, use it.
                sys.exit(_error_codes[0])
            elif len(_error_codes) > 1:
                # There is more than error, exit using
                # UNKNOWN_ERROR. This could happen within sequences
                # where parsing failed with different errors like
                # INVALID_PORT and INVALID_PROTOCOL.
                sys.exit(errors.UNKNOWN_ERROR)
Пример #12
0
    def __cmd_sequence(self, cmd_type, option, action_method, query_method,
                       parse_method, message, start_args=None, end_args=None,
                       no_exit=False):
        warn_type = {
            "add": "ALREADY_ENABLED",
            "remove": "NOT_ENABLED",
        }
        items = [ ]
        _errors = 0
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                        continue
                    else:
                        code = FirewallError.get_code(msg)
                        self.print_and_exit("Error: %s" % msg, code)

            call_item = [ ]
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            self.deactivate_exception_handler()
            try:
                if cmd_type == "add" and not query_method(*call_item):
                    items.append(item)
                elif cmd_type == "remove" and query_method(*call_item):
                    items.append(item)
                else:
                    if len(option) > 1:
                        self.print_warning("Warning: %s: %s" % \
                                           (warn_type[cmd_type],
                                            message % item))
                    else:
                        code = FirewallError.get_code(warn_type[cmd_type])
                        self.print_and_exit("Error: %s: %s" % \
                                            (warn_type[cmd_type],
                                             message % item), code)
                    _errors += 1
            except DBusException as msg:
                code = FirewallError.get_code(msg)
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg.get_dbus_message())
                    continue
                else:
                    self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                        code)
                _errors += 1
            self.activate_exception_handler()

        for item in items:
            call_item = [ ]
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            if end_args is not None:
                call_item += end_args
            try:
                action_method(*call_item)
            except DBusException as msg:
                code = FirewallError.get_code(msg)
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg.get_dbus_message())
                else:
                    self.print_and_exit("Error: %s" % msg.get_dbus_message(),
                                        code)
                _errors += 1

        if _errors == len(option) and not no_exit:
            sys.exit(0)
Пример #13
0
    def __cmd_sequence(self, cmd_type, option, action_method, query_method, # pylint: disable=W0613, R0913, R0914
                       parse_method, message, start_args=None, end_args=None, # pylint: disable=W0613
                       no_exit=False):
        if self.fw is not None:
            self.fw.authorizeAll()
        items = [ ]
        _errors = 0
        _error_codes = [ ]
        for item in option:
            if parse_method is not None:
                try:
                    item = parse_method(item)
                except Exception as msg:
                    code = FirewallError.get_code(str(msg))
                    if len(option) > 1:
                        self.print_warning("Warning: %s" % msg)
                    else:
                        self.print_and_exit("Error: %s" % msg, code)
                    if code not in _error_codes:
                        _error_codes.append(code)
                    _errors += 1
                    continue

            items.append(item)

        for item in items:
            call_item = [ ]
            if start_args is not None:
                call_item += start_args
            if not isinstance(item, list) and not isinstance(item, tuple):
                call_item.append(item)
            else:
                call_item += item
            if end_args is not None:
                call_item += end_args
            self.deactivate_exception_handler()
            try:
                action_method(*call_item)
            except (DBusException, Exception) as msg:
                if isinstance(msg, DBusException):
                    self.fail_if_not_authorized(msg.get_dbus_name())
                    msg = msg.get_dbus_message()
                else:
                    msg = str(msg)
                code = FirewallError.get_code(msg)
                if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED,
                             errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]:
                    code = 0
                if len(option) > 1:
                    self.print_warning("Warning: %s" % msg)
                elif code == 0:
                    self.print_warning("Warning: %s" % msg)
                    return
                else:
                    self.print_and_exit("Error: %s" % msg, code)
                if code not in _error_codes:
                    _error_codes.append(code)
                _errors += 1
            self.activate_exception_handler()

        if not no_exit:
            if len(option) > _errors or 0 in _error_codes:
                # There have been more options than errors or there
                # was at least one error code 0, return.
                return
            elif len(_error_codes) == 1:
                # Exactly one error code, use it.
                sys.exit(_error_codes[0])
            elif len(_error_codes) > 1:
                # There is more than error, exit using
                # UNKNOWN_ERROR. This could happen within sequences
                # where parsing failed with different errors like
                # INVALID_PORT and INVALID_PROTOCOL.
                sys.exit(errors.UNKNOWN_ERROR)