예제 #1
0
 def __translate_ip(self, value):
     """
     Translate IP address or IP range into Sqlalchemy filter.
     Range must be in CIDR format, e.g. 1.1.1.1/24
     """
     if NetUtils.is_valid_ip(value):
         return (Host.ip == value)
     elif NetUtils.is_valid_ip_range(value):
         return (Host.is_in_ip_range(value))
     else:
         raise FilterException(
             '{value} invalid IP/range'.format(value=value))
예제 #2
0
 def __translate_ip(self, value):
     """
     value can be:
         - Single IP
         - IP range - format: 1.1.1.1/24
     """
     if NetUtils.is_valid_ip(value):
         return (Host.ip == value)
     elif NetUtils.is_valid_ip_range(value):
         return (Host.is_in_ip_range(value))
     else:
         raise FilterException(
             '{value} invalid IP/range'.format(value=value))
    def do_hosts(self, args):
        """Hosts in the current mission scope"""
        print()
        req = HostsRequester(self.sqlsess)
        req.select_mission(self.current_mission)

        # Logical AND is applied between all specified filtering options
        filter_ = Filter(FilterOperator.AND)
        if args.addrs:
            for addr in args.addrs:
                if NetUtils.is_valid_ip(addr) or NetUtils.is_valid_ip_range(addr):
                    filter_.add_condition(Condition(addr, FilterData.IP))
                else:
                    filter_.add_condition(Condition(addr, FilterData.HOST))
        if args.search:
            filter_search = Filter(FilterOperator.OR)
            filter_search.add_condition(Condition(args.search, FilterData.HOST))
            filter_search.add_condition(Condition(args.search, FilterData.OS))
            filter_search.add_condition(Condition(args.search, FilterData.COMMENT_HOST))
            filter_.add_condition(filter_search)
        if args.order:
            req.order_by(args.order)

        try:
            req.add_filter(filter_)
        except FilterException as e:
            logger.error(e)
            return

        # Operations
        if args.comment:
            if not req.filter_applied:
                if not Output.prompt_confirm('No filter applied. Are you sure you want to edit comment for ALL hosts in current mission ?', default=False):
                    logger.info('Canceled')
                    return
            req.edit_comment(args.comment)
        elif args.delete:
            if not req.filter_applied:
                if not Output.prompt_confirm('No filter applied. Are you sure you want to delete ALL hosts and related services in current mission', default=False):
                    logger.info('Canceled')
                    return
            req.delete()
        else:
            req.show()

        print()