Add (protected) API to queue varnish purge requests
authorMagnus Hagander <magnus@hagander.net>
Wed, 3 Oct 2012 12:19:28 +0000 (14:19 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 3 Oct 2012 12:19:28 +0000 (14:19 +0200)
We want an API for this so they end up in the queue with all the other
requests, and get delivered to all our frontends without needing each node
to know about which frontends exist.

pgweb/core/views.py
pgweb/settings.py
pgweb/urls.py

index dcc1178314c0a577e70fa851f73034e0e5df0692..cb83cc6287d05f2c33d63aa1890102a352d83be1 100644 (file)
@@ -4,6 +4,7 @@ from django.template import TemplateDoesNotExist, loader, Context
 from django.contrib.auth.decorators import login_required, user_passes_test
 from django.db.models import Count
 from django.db import connection, transaction
+from django.conf import settings
 
 from datetime import date, datetime
 from os import uname
@@ -12,7 +13,7 @@ import urllib
 
 from pgweb.util.decorators import ssl_required, cache
 from pgweb.util.contexts import NavContext
-from pgweb.util.helpers import simple_form, PgXmlHelper
+from pgweb.util.helpers import simple_form, PgXmlHelper, HttpServerError
 from pgweb.util.moderation import get_all_pending_moderations
 from pgweb.util.misc import get_client_ip, is_behind_cache, varnish_purge
 from pgweb.util.sitestruct import get_all_pages_struct
@@ -198,6 +199,20 @@ def admin_purge(request):
                        'latest_purges': latest,
                        })
 
+@ssl_required
+def api_varnish_purge(request):
+       if not request.META['REMOTE_ADDR'] in settings.VARNISH_PURGERS:
+               return HttpServerError("Invalid client address")
+       if request.method != 'POST':
+               raise HttpServerError("Can't use this way")
+       n = int(request.POST['n'])
+       curs = connection.cursor()
+       for i in range(0, n):
+               expr = request.POST['p%s' % i]
+               curs.execute("SELECT varnish_purge_expr(%s)", (expr, ))
+       transaction.commit_unless_managed()
+       return HttpResponse("Purged %s entries\n" % n)
+
 # Merge two organisations
 @login_required
 @user_passes_test(lambda u: u.is_superuser)
index 012beee670d7a1c66399ebdd72cb2ccda5f74104..886f5bdc355912da87702c0674e90bb51913cca8 100644 (file)
@@ -130,6 +130,7 @@ FRONTEND_SERVERS=()                                    # A tuple containing the
                                                        # varnish frontend servers in use.
 FTP_MASTERS=()                                                                            # A tuple containing the *IP addresses* of all machines
                                                        # trusted to upload ftp structure data
+VARNISH_PURGERS=()                                     # Extra servers that can do varnish purges through our queue
 
 # Load local settings overrides
 from settings_local import *
index 0321941a857d3338f072e1f3b999f56e0cb4b527..2bdd00857725cf0e23aa9245ad3fe314843d2cfc 100644 (file)
@@ -123,6 +123,9 @@ urlpatterns = patterns('',
        # Sync timestamp, for automirror
        (r'^web_sync_timestamp$', 'pgweb.core.views.sync_timestamp'),
 
+    # API endpoints
+    (r'^api/varnish/purge/$', 'pgweb.core.views.api_varnish_purge'),
+
        # Override some URLs in admin, to provide our own pages
        (r'^admin/pending/$', 'pgweb.core.views.admin_pending'),
        (r'^admin/purge/$', 'pgweb.core.views.admin_purge'),