changeset 506:09a9402e4a71

Added the rate_limit_clear management command, to delete IP addresses from the rate limit datastore.
author Brian Neal <bgneal@gmail.com>
date Sat, 03 Dec 2011 20:46:41 +0000
parents a5d11471d031
children 8631d32e6b16
files gpp/accounts/management/__init__.py gpp/accounts/management/commands/__init__.py gpp/accounts/management/commands/rate_limit_clear.py
diffstat 1 files changed, 51 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/accounts/management/commands/rate_limit_clear.py	Sat Dec 03 20:46:41 2011 +0000
@@ -0,0 +1,51 @@
+"""
+The rate_limit_clear command is used to clear IP addresses out from our rate
+limit protection database.
+
+"""
+from optparse import make_option
+import re
+
+from django.core.management.base import BaseCommand
+import redis
+
+IP_RE = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
+
+
+class Command(BaseCommand):
+    help = """Remove IP addresses from the rate limit protection datastore."""
+    option_list = list(BaseCommand.option_list) + [
+        make_option("--purge", action="store_true",
+            help="Purge all IP addresses"),
+    ]
+
+    def handle(self, *args, **kwargs):
+        try:
+            con = redis.Redis()
+
+            # get all rate-limit keys
+            keys = con.keys('rate-limit-*')
+
+            # if purging, delete them all...
+            if kwargs['purge']:
+                if keys:
+                    con.delete(*keys)
+                return
+
+            # otherwise delete the ones the user asked for
+            ips = []
+            for ip in args:
+                if IP_RE.match(ip):
+                    key = 'rate-limit-%s' % ip
+                    if key in keys:
+                        ips.append(key)
+                    else:
+                        self.stdout.write('%s not found\n' % ip)
+                else:
+                    self.stderr.write('invalid IP address %s\n' % ip)
+
+            if ips:
+                con.delete(*ips)
+
+        except redis.RedisError, e:
+            self.stderr.write('%s\n' % e)