mirror of
				https://github.com/github/octodns.git
				synced 2024-05-11 05:55:00 +00:00 
			
		
		
		
	Implement black formatting
This commit is contained in:
		@@ -2,5 +2,9 @@
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,15 @@
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from argparse import ArgumentParser as _Base
 | 
			
		||||
from logging import DEBUG, INFO, WARN, Formatter, StreamHandler, \
 | 
			
		||||
    getLogger
 | 
			
		||||
from logging import DEBUG, INFO, WARN, Formatter, StreamHandler, getLogger
 | 
			
		||||
from logging.handlers import SysLogHandler
 | 
			
		||||
from sys import stderr, stdout
 | 
			
		||||
 | 
			
		||||
@@ -26,22 +29,33 @@ class ArgumentParser(_Base):
 | 
			
		||||
 | 
			
		||||
    def parse_args(self, default_log_level=INFO):
 | 
			
		||||
        version = f'octoDNS {__VERSION__}'
 | 
			
		||||
        self.add_argument('--version', action='version', version=version,
 | 
			
		||||
                          help='Print octoDNS version and exit')
 | 
			
		||||
        self.add_argument('--log-stream-stdout', action='store_true',
 | 
			
		||||
                          default=False,
 | 
			
		||||
                          help='Log to stdout instead of stderr')
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--version',
 | 
			
		||||
            action='version',
 | 
			
		||||
            version=version,
 | 
			
		||||
            help='Print octoDNS version and exit',
 | 
			
		||||
        )
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--log-stream-stdout',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            default=False,
 | 
			
		||||
            help='Log to stdout instead of stderr',
 | 
			
		||||
        )
 | 
			
		||||
        _help = 'Send logging data to syslog in addition to stderr'
 | 
			
		||||
        self.add_argument('--log-syslog', action='store_true', default=False,
 | 
			
		||||
                          help=_help)
 | 
			
		||||
        self.add_argument('--syslog-device', default='/dev/log',
 | 
			
		||||
                          help='Syslog device')
 | 
			
		||||
        self.add_argument('--syslog-facility', default='local0',
 | 
			
		||||
                          help='Syslog facility')
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--log-syslog', action='store_true', default=False, help=_help
 | 
			
		||||
        )
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--syslog-device', default='/dev/log', help='Syslog device'
 | 
			
		||||
        )
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--syslog-facility', default='local0', help='Syslog facility'
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        _help = 'Increase verbosity to get details and help track down issues'
 | 
			
		||||
        self.add_argument('--debug', action='store_true', default=False,
 | 
			
		||||
                          help=_help)
 | 
			
		||||
        self.add_argument(
 | 
			
		||||
            '--debug', action='store_true', default=False, help=_help
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        args = super(ArgumentParser, self).parse_args()
 | 
			
		||||
        self._setup_logging(args, default_log_level)
 | 
			
		||||
@@ -57,10 +71,13 @@ class ArgumentParser(_Base):
 | 
			
		||||
        logger.addHandler(handler)
 | 
			
		||||
 | 
			
		||||
        if args.log_syslog:
 | 
			
		||||
            fmt = 'octodns[%(process)-5s:%(thread)d]: %(name)s ' \
 | 
			
		||||
            fmt = (
 | 
			
		||||
                'octodns[%(process)-5s:%(thread)d]: %(name)s '
 | 
			
		||||
                '%(levelname)-5s %(message)s'
 | 
			
		||||
            handler = SysLogHandler(address=args.syslog_device,
 | 
			
		||||
                                    facility=args.syslog_facility)
 | 
			
		||||
            )
 | 
			
		||||
            handler = SysLogHandler(
 | 
			
		||||
                address=args.syslog_device, facility=args.syslog_facility
 | 
			
		||||
            )
 | 
			
		||||
            handler.setFormatter(Formatter(fmt=fmt))
 | 
			
		||||
            logger.addHandler(handler)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
Octo-DNS Comparator
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from pprint import pprint
 | 
			
		||||
import sys
 | 
			
		||||
@@ -16,16 +20,32 @@ from octodns.manager import Manager
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument('--a', nargs='+', required=True,
 | 
			
		||||
                        help='First source(s) to pull data from')
 | 
			
		||||
    parser.add_argument('--b', nargs='+', required=True,
 | 
			
		||||
                        help='Second source(s) to pull data from')
 | 
			
		||||
    parser.add_argument('--zone', default=None, required=True,
 | 
			
		||||
                        help='Zone to compare')
 | 
			
		||||
    parser.add_argument('--ignore-prefix', default=None, required=False,
 | 
			
		||||
                        help='Record prefix to ignore from list of changes')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--a',
 | 
			
		||||
        nargs='+',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='First source(s) to pull data from',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--b',
 | 
			
		||||
        nargs='+',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='Second source(s) to pull data from',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--zone', default=None, required=True, help='Zone to compare'
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--ignore-prefix',
 | 
			
		||||
        default=None,
 | 
			
		||||
        required=False,
 | 
			
		||||
        help='Record prefix to ignore from list of changes',
 | 
			
		||||
    )
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    manager = Manager(args.config_file)
 | 
			
		||||
@@ -34,8 +54,7 @@ def main():
 | 
			
		||||
    # Filter changes list based on ignore-prefix argument if present
 | 
			
		||||
    if args.ignore_prefix:
 | 
			
		||||
        pattern = args.ignore_prefix
 | 
			
		||||
        changes = [c for c in changes
 | 
			
		||||
                   if not c.record.fqdn.startswith(pattern)]
 | 
			
		||||
        changes = [c for c in changes if not c.record.fqdn.startswith(pattern)]
 | 
			
		||||
 | 
			
		||||
    pprint(changes)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
Octo-DNS Dumper
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from octodns.cmds.args import ArgumentParser
 | 
			
		||||
from octodns.manager import Manager
 | 
			
		||||
@@ -13,26 +17,38 @@ from octodns.manager import Manager
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument('--output-dir', required=True,
 | 
			
		||||
                        help='The directory into which the results will be '
 | 
			
		||||
                        'written (Note: will overwrite existing files)')
 | 
			
		||||
    parser.add_argument('--lenient', action='store_true', default=False,
 | 
			
		||||
                        help='Ignore record validations and do a best effort '
 | 
			
		||||
                        'dump')
 | 
			
		||||
    parser.add_argument('--split', action='store_true', default=False,
 | 
			
		||||
                        help='Split the dumped zone into a YAML file per '
 | 
			
		||||
                        'record')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--output-dir',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The directory into which the results will be '
 | 
			
		||||
        'written (Note: will overwrite existing files)',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--lenient',
 | 
			
		||||
        action='store_true',
 | 
			
		||||
        default=False,
 | 
			
		||||
        help='Ignore record validations and do a best effort ' 'dump',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--split',
 | 
			
		||||
        action='store_true',
 | 
			
		||||
        default=False,
 | 
			
		||||
        help='Split the dumped zone into a YAML file per ' 'record',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument('zone', help='Zone to dump')
 | 
			
		||||
    parser.add_argument('source', nargs='+',
 | 
			
		||||
                        help='Source(s) to pull data from')
 | 
			
		||||
    parser.add_argument('source', nargs='+', help='Source(s) to pull data from')
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    manager = Manager(args.config_file)
 | 
			
		||||
    manager.dump(args.zone, args.output_dir, args.lenient, args.split,
 | 
			
		||||
                 *args.source)
 | 
			
		||||
    manager.dump(
 | 
			
		||||
        args.zone, args.output_dir, args.lenient, args.split, *args.source
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
Octo-DNS Reporter
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from concurrent.futures import ThreadPoolExecutor
 | 
			
		||||
from dns.exception import Timeout
 | 
			
		||||
@@ -18,28 +22,38 @@ from octodns.manager import Manager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AsyncResolver(Resolver):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, num_workers, *args, **kwargs):
 | 
			
		||||
        super(AsyncResolver, self).__init__(*args, **kwargs)
 | 
			
		||||
        self.executor = ThreadPoolExecutor(max_workers=num_workers)
 | 
			
		||||
 | 
			
		||||
    def query(self, *args, **kwargs):
 | 
			
		||||
        return self.executor.submit(super(AsyncResolver, self).query, *args,
 | 
			
		||||
                                    **kwargs)
 | 
			
		||||
        return self.executor.submit(
 | 
			
		||||
            super(AsyncResolver, self).query, *args, **kwargs
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument('--zone', required=True, help='Zone to dump')
 | 
			
		||||
    parser.add_argument('--source', required=True, default=[], action='append',
 | 
			
		||||
                        help='Source(s) to pull data from')
 | 
			
		||||
    parser.add_argument('--num-workers', default=4,
 | 
			
		||||
                        help='Number of background workers')
 | 
			
		||||
    parser.add_argument('--timeout', default=1,
 | 
			
		||||
                        help='Number seconds to wait for an answer')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--source',
 | 
			
		||||
        required=True,
 | 
			
		||||
        default=[],
 | 
			
		||||
        action='append',
 | 
			
		||||
        help='Source(s) to pull data from',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--num-workers', default=4, help='Number of background workers'
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--timeout', default=1, help='Number seconds to wait for an answer'
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument('server', nargs='+', help='Servers to query')
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
@@ -62,8 +76,9 @@ def main():
 | 
			
		||||
    resolvers = []
 | 
			
		||||
    ip_addr_re = re.compile(r'^[\d\.]+$')
 | 
			
		||||
    for server in args.server:
 | 
			
		||||
        resolver = AsyncResolver(configure=False,
 | 
			
		||||
                                 num_workers=int(args.num_workers))
 | 
			
		||||
        resolver = AsyncResolver(
 | 
			
		||||
            configure=False, num_workers=int(args.num_workers)
 | 
			
		||||
        )
 | 
			
		||||
        if not ip_addr_re.match(server):
 | 
			
		||||
            server = str(query(server, 'A')[0])
 | 
			
		||||
        log.info('server=%s', server)
 | 
			
		||||
@@ -73,8 +88,9 @@ def main():
 | 
			
		||||
 | 
			
		||||
    queries = {}
 | 
			
		||||
    for record in sorted(zone.records):
 | 
			
		||||
        queries[record] = [r.query(record.fqdn, record._type)
 | 
			
		||||
                           for r in resolvers]
 | 
			
		||||
        queries[record] = [
 | 
			
		||||
            r.query(record.fqdn, record._type) for r in resolvers
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
    for record, futures in sorted(queries.items(), key=lambda d: d[0]):
 | 
			
		||||
        stdout.write(record.fqdn)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
Octo-DNS Multiplexer
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from octodns.cmds.args import ArgumentParser
 | 
			
		||||
from octodns.manager import Manager
 | 
			
		||||
@@ -13,31 +17,57 @@ from octodns.manager import Manager
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument('--doit', action='store_true', default=False,
 | 
			
		||||
                        help='Whether to take action or just show what would '
 | 
			
		||||
                        'change')
 | 
			
		||||
    parser.add_argument('--force', action='store_true', default=False,
 | 
			
		||||
                        help='Acknowledge that significant changes are being '
 | 
			
		||||
                        'made and do them')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--doit',
 | 
			
		||||
        action='store_true',
 | 
			
		||||
        default=False,
 | 
			
		||||
        help='Whether to take action or just show what would ' 'change',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--force',
 | 
			
		||||
        action='store_true',
 | 
			
		||||
        default=False,
 | 
			
		||||
        help='Acknowledge that significant changes are being '
 | 
			
		||||
        'made and do them',
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('zone', nargs='*', default=[],
 | 
			
		||||
                        help='Limit sync to the specified zone(s)')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        'zone',
 | 
			
		||||
        nargs='*',
 | 
			
		||||
        default=[],
 | 
			
		||||
        help='Limit sync to the specified zone(s)',
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--source', default=[], action='append',
 | 
			
		||||
                        help='Limit sync to zones with the specified '
 | 
			
		||||
                        'source(s) (all sources will be synchronized for the '
 | 
			
		||||
                        'selected zones)')
 | 
			
		||||
    parser.add_argument('--target', default=[], action='append',
 | 
			
		||||
                        help='Limit sync to the specified target(s)')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--source',
 | 
			
		||||
        default=[],
 | 
			
		||||
        action='append',
 | 
			
		||||
        help='Limit sync to zones with the specified '
 | 
			
		||||
        'source(s) (all sources will be synchronized for the '
 | 
			
		||||
        'selected zones)',
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--target',
 | 
			
		||||
        default=[],
 | 
			
		||||
        action='append',
 | 
			
		||||
        help='Limit sync to the specified target(s)',
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    manager = Manager(args.config_file)
 | 
			
		||||
    manager.sync(eligible_zones=args.zone, eligible_sources=args.source,
 | 
			
		||||
                 eligible_targets=args.target, dry_run=not args.doit,
 | 
			
		||||
                 force=args.force)
 | 
			
		||||
    manager.sync(
 | 
			
		||||
        eligible_zones=args.zone,
 | 
			
		||||
        eligible_sources=args.source,
 | 
			
		||||
        eligible_targets=args.target,
 | 
			
		||||
        dry_run=not args.doit,
 | 
			
		||||
        force=args.force,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
Octo-DNS Validator
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from logging import WARN
 | 
			
		||||
 | 
			
		||||
@@ -15,8 +19,11 @@ from octodns.manager import Manager
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args(WARN)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,12 @@
 | 
			
		||||
octoDNS Versions
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from __future__ import absolute_import, division, print_function, \
 | 
			
		||||
    unicode_literals
 | 
			
		||||
from __future__ import (
 | 
			
		||||
    absolute_import,
 | 
			
		||||
    division,
 | 
			
		||||
    print_function,
 | 
			
		||||
    unicode_literals,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from octodns.cmds.args import ArgumentParser
 | 
			
		||||
from octodns.manager import Manager
 | 
			
		||||
@@ -13,8 +17,11 @@ from octodns.manager import Manager
 | 
			
		||||
def main():
 | 
			
		||||
    parser = ArgumentParser(description=__doc__.split('\n')[1])
 | 
			
		||||
 | 
			
		||||
    parser.add_argument('--config-file', required=True,
 | 
			
		||||
                        help='The Manager configuration file to use')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '--config-file',
 | 
			
		||||
        required=True,
 | 
			
		||||
        help='The Manager configuration file to use',
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user