postfix, integrating memcache as a lookup table using tcp_table
I have not had time to do the test “postfix memcached patch” because there are no idle servers that can be used for the experiment. instead, I’ve made a tutorial how to integrate memcached as a “postfix lookup table” with the help of tcp_table and a simple perl script.
Indeed, tcp_table “table lookup protocol” is one of the most powerful tools as well as the regexp and pcre, in my opinion. although client-server connection is not protected and and the server is not authenticated.
yes, I did a lot of experiments using tcp_table and perl scripts. it made me realize that I can do almost everything I need and make postfix as my favorite MTA.
Things required:
- perl Cache::Memcached module
- memcached
- postfix with tcp_table support
OK, first we create a simple perl script that allows you to handle the protocols of tcp_table. let’s call it memc.pl
#!/usr/bin/perl use strict; use warnings; use Sys::Syslog qw(:DEFAULT setlogsock); use Cache::Memcached; # Configure the memcached server my $memd = new Cache::Memcached { 'servers' => [ '127.0.0.1:11211' ], }; # # Initalize and open syslog. # openlog('postfix/memcached','pid','mail'); sub qrymemc { return unless /^get\s+(.+)/i; my $kmemc = lc($1); chomp($kmemc); trim($kmemc); my $vmemc = $memd->get($kmemc); if (defined $vmemc) { return ($kmemc,$vmemc); } return; } sub trim{ $_[0]=~s/^\s+//; $_[0]=~s/\s+$//; return; } # # Autoflush standard output. # select STDOUT; $|++; while (<>) { chomp; if (/^get\s+(.+)/i) { my $data = lc($1); my @res = qrymemc($data); syslog("info","data: %s", $data); if (@res) { chomp(@res); print "200 $res[1]\n"; syslog("info","Found: key = %s, value = %s", $res[0], $res[1]); next; } } print "200 DUNNO\n"; }