annotate gpp/accounts/management/commands/rate_limit_clear.py @ 532:ff67946fd4b0

For #242, move the updating of the POTD sequence into a new signals module. When photos are deleted from the admin changelist in bulk, the individual delete() functions on the photo objects is not called. However, the post_delete signal is called for each object.
author Brian Neal <bgneal@gmail.com>
date Sun, 25 Dec 2011 04:15:32 +0000
parents 6f5fff924877
children
rev   line source
bgneal@506 1 """
bgneal@506 2 The rate_limit_clear command is used to clear IP addresses out from our rate
bgneal@506 3 limit protection database.
bgneal@506 4
bgneal@506 5 """
bgneal@506 6 from optparse import make_option
bgneal@506 7 import re
bgneal@506 8
bgneal@506 9 from django.core.management.base import BaseCommand
bgneal@506 10 import redis
bgneal@506 11
bgneal@508 12 from core.services import get_redis_connection
bgneal@508 13
bgneal@508 14
bgneal@506 15 IP_RE = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
bgneal@506 16
bgneal@506 17
bgneal@506 18 class Command(BaseCommand):
bgneal@506 19 help = """Remove IP addresses from the rate limit protection datastore."""
bgneal@506 20 option_list = list(BaseCommand.option_list) + [
bgneal@506 21 make_option("--purge", action="store_true",
bgneal@506 22 help="Purge all IP addresses"),
bgneal@506 23 ]
bgneal@506 24
bgneal@506 25 def handle(self, *args, **kwargs):
bgneal@506 26 try:
bgneal@508 27 con = get_redis_connection()
bgneal@506 28
bgneal@506 29 # get all rate-limit keys
bgneal@506 30 keys = con.keys('rate-limit-*')
bgneal@506 31
bgneal@506 32 # if purging, delete them all...
bgneal@506 33 if kwargs['purge']:
bgneal@506 34 if keys:
bgneal@506 35 con.delete(*keys)
bgneal@506 36 return
bgneal@506 37
bgneal@506 38 # otherwise delete the ones the user asked for
bgneal@506 39 ips = []
bgneal@506 40 for ip in args:
bgneal@506 41 if IP_RE.match(ip):
bgneal@506 42 key = 'rate-limit-%s' % ip
bgneal@506 43 if key in keys:
bgneal@506 44 ips.append(key)
bgneal@506 45 else:
bgneal@506 46 self.stdout.write('%s not found\n' % ip)
bgneal@506 47 else:
bgneal@506 48 self.stderr.write('invalid IP address %s\n' % ip)
bgneal@506 49
bgneal@506 50 if ips:
bgneal@506 51 con.delete(*ips)
bgneal@506 52
bgneal@506 53 except redis.RedisError, e:
bgneal@506 54 self.stderr.write('%s\n' % e)