To write a custom Python program which can act as a plugin for Squid to redirect a given URL to another URL. This is useful when already existing redirector plugins for Squid doesn’t suit your needs or you want everything of your own.
- When you want to redirect URLs using a database like mysql or postgresql.
- When you want to redirect based on mappings stored in simple text files.
- When you want to build a redirector which can learn by itself using AI techniques 😛
How to proceed
From Squid FAQ,
The redirector program must read URLs (one per line) on standard input, and write rewritten URLs or blank lines on standard output. Note that the redirector program can not use buffered I/O. Squid writes additional information after the URL which a redirector can use to make a decision.
The format of the line read from the standard input by the program is as follows.
1 2 3
URL ip-address/fqdn ident method # for example http://saini.co.in 172.17.8.175/saini.co.in - GET -
The implementation sounds very simple and it is indeed very simple to implement. The only thing that should be taken care of is the unbuffered I/O. You should immediately flush the output to standard output once decision is taken.
For this howto, we assume we have a method called ‘modify_url()‘ which returns either a blank line or a modified URL to which the client should be redirected.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#!/usr/bin/env python import sys def modify_url(line): list = line.split(' ') # first element of the list is the URL old_url = list new_url = '\n' # take the decision and modify the url if needed # do remember that the new_url should contain a '\n' at the end. if old_url.endswith('.avi'): new_url = 'http://fedora.co.in/errors/accessDenied.html' + new_url return new_url while True: # the format of the line read from stdin is # URL ip-address/fqdn ident method # for example # http://saini.co.in 172.17.8.175/saini.co.in - GET - line = sys.stdin.readline().strip() # new_url is a simple URL only # for example # http://fedora.co.in new_url = modify_url(line) sys.stdout.write(new_url) sys.stdout.flush()
Save the above file somewhere. We save this example file in /etc/squid/custom_redirect.py. Now, we have the function for redirecting clients. We need to configure squid to use custom_redirect.py . Below is the squid configuration for telling squid to use the above program as redirector.
1 2 3 4 5 6
# Add these lines to /etc/squid/squid.conf file. # /usr/bin/python should be replaced by the path to python executable if you installed it somewhere else. redirect_program /usr/bin/python /etc/squid/custom_redirect.py # Number of instances of the above program that should run concurrently. # 5 is good enough but you should go for 10 at least. Anything below 5 would not work properly. redirect_children 5
Now, start/reload/restart squid. That’s all we need to write and use a custom redirector plugin for squid.