Thanks Thierry, for your answers.

2015-11-30 16:53 GMT+01:00 Thierry FOURNIER <[email protected]>:
> On Mon, 30 Nov 2015 08:37:00 +0100
> joris dedieu <[email protected]> wrote:
>
>> Hi all,
>>
>> I started to drive into haproxy's lua interface. I produced a few code
>> that allows dnsbl lookup and it seems to work.
>>
>> First I have a C wrapper against the libc resolver..
>>
>> #include <netdb.h>
>> #include <sys/types.h>
>> #include <sys/socket.h>
>> #include <netinet/in.h>
>> #include <arpa/inet.h>
>>
>> #include <lua53/lua.h>
>> #include <lua53/lauxlib.h>
>>
>> static int gethostbyname_wrapper(lua_State *L)
>> {
>>         const char* query = luaL_checkstring(L, 1);
>>         struct hostent *he;
>>         if ((he = gethostbyname(query)) != NULL) {
>>                 const char *first_addr =
>>                     inet_ntoa(*(struct in_addr*)he->h_addr_list[0]);
>>                 lua_pushstring(L, first_addr);
>>                 return 1;
>>         }
>>         return 0;
>> }
>>
>> static const luaL_Reg sysdb_methods[] = {
>>         {"gethostbyname", gethostbyname_wrapper},
>>         {NULL, NULL}
>> };
>>
>> LUALIB_API int luaopen_sysdb(lua_State *L) {
>>         luaL_newlib(L, sysdb_methods);
>>         return 1;
>> }
>>
>> I have some doubts on the asyncness of libc operations but in other
>> side I don't want to reinvent the wheel. Should I prefer a resolver
>> implementation that uses lua socket ? As far as I tested libc seems to
>> do the job.
>
> Hello,
>
> I confirm your doubts: gethostbyname is synchronous and it is a
> blocking call. If your hostname resolution is in the /etc/hosts file,
> it blocks while reading file. It it is from DNS server, it blocks
> waiting for the server response (or worse: wainting for the timeout).
>
> So, this code seems to run, but your HAProxy will be not efficient
> because the entire haproxy process will be blocked during each
> resolution. For example: if your DNS fails after 3s timeout, during 3s,
> HAProxy doesn't process any data.
>
> Otherwise, your code is the good way to perform fast Lua/C libraries.
>
> There are no way to simulate blocking access out of the HAProxy core,
> all the functions writed for Lua must be non block.

Ok, I will check for a non blocking solution (maybe lua socket + pack
/ unpack in C) .

>
>
>> Then the lua code
>>
>> local sysdb = require("sysdb")
>>
>> core.register_fetches("rbl", function(txn, rbl, ip)
>>         if (not ip) then
>>                 ip = txn.sf:src()
>>         end
>>         if (not rbl) then
>>                 rbl = "zen.spamhaus.org"
>>         end
>>         local query = rbl
>>         for x in string.gmatch(ip, "[^%.]+") do
>>                 query = x .. '.' .. query
>>         end
>>         if(sysdb.gethostbyname(query)) then
>>                 return 1
>>         else
>>                 return 0
>>         end
>> end)
>>
>> I want to use a sticky table as a local cache so my second question :
>> is there a way to set a gpt0 value from lua ?
>
>
> You can use the samples fetches mapper and use the sc_set_gpt0. The
> syntax is like this:
>
> For the read access:
>
>    txn.sf:sc_set_gpt0()
>    txn.sc:table_gpc0()
>
> For the write access, I don't have direct solution. You must use an Lua
> sample fetch and the following configuration directive:
>
>    http-request sc-set-gpt0 lua.my_sample_fetch

Yes that's an option.

>
> Maybe it will be a good idea to implement the stick table access in Lua.
>
> If you want a other maneer to store shared data inhaproxy, you can use
> maps. The maps are shared by all the HAProxy process including Lua with
> a special API (see Map class)

 I thought on Maps but I didn't find a write access  in lua according
to http://www.arpalert.org/src/haproxy-lua-api/1.6/index.html#map-class
and some of my experiments

Thanks
Joris
>
> Thierry

Reply via email to