Skip to content

Instantly share code, notes, and snippets.

Created October 7, 2014 13:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/60c3d8176250df50eca1 to your computer and use it in GitHub Desktop.
Save anonymous/60c3d8176250df50eca1 to your computer and use it in GitHub Desktop.
require 'socket'
math.randomseed(socket.gettime()*10000)
local logger = logger
local pairs = pairs
local type = type
local log_error = log_error
local dnspacket = dnspacket
local domains_id = {}
local domains_name = {}
local records = {}
domains_name["test.ru"] = {domain_id = 11, name = "test.ru", type = "NATIVE", soa = { hostmaster = "hostmaster.he.net", nameserver = "ns.test.cc", serial = 2005092521, refresh = 28800, retry = 7200, expire = 604800, default_ttl = 86400, ttl = 3600 } }
domains_id["11"] = domains_name["test.ru"]
records["test.ru"] = {
{domain_id = 11,name = "test.ru", type = "NS", ttl = 120, content = "ns.test.cc"},
{domain_id = 11, weight=50 ,name = "test.ru", type = "A", ttl = 120, content = "1.1.1.1"},
{domain_id = 11, weight=25 ,name = "test.ru", type = "A", ttl = 120, content = "2.2.2.2"},
{domain_id = 11, weight=25 ,name = "test.ru", type = "A", ttl = 120, content = "3.3.3.3"}
}
function list(target, domain_id)
logger(log_error, "(l_list)", "target:", target, " domain_id:", domain_id )
return false
end
local size, c, r, n, nn, q_type, q_name, domainid
local remote_ip, remote_port, local_ip
function lookup(qtype, qname, domain_id)
-- logger(log_error, "(l_lookup)", "qtype:", qtype, " qname:", qname, " domain_id:", domain_id )
q_type = qtype
q_name = qname
domainid = domain_id
r = records[q_name]
c = 0
size = 0
remote_ip, remote_port, local_ip = dnspacket()
-- logger(log_error, "(l_lookup) dnspacket", "remote:", remote_ip, " port:", remote_port, " local:", local_ip)
if type(r) == "table" then
size = #r
end
-- logger(log_error, "(l_lookup)", "size:", size)
end
function weighted_random_choice(choices)
for k,v in pairs(choices) do
logger(log_error, k,v)
end
local threshold = math.random(0, weighted_total(choices))
local last_choice
for choice, weight in pairs(choices) do
threshold = threshold - weight
if threshold <= 0 then return choice end
last_choice = choice
end
return last_choice
end
function weighted_total(choices)
local total = 0
for choice, weight in pairs(choices) do
total = total + weight
end
return total
end
local ip_wei = {}
function wei(r)
for kk,vv in pairs(r) do
if vv.type == "A" then
ip_wei[vv.content] = vv.weight
end
end
return weighted_random_choice(ip_wei)
end
local was_a = {} -- return only one A for all record
function get()
-- logger(log_error, "(l_get) BEGIN")
-- r is record, c is field inside it
while c < size do
c = c + 1
if (q_type == "ANY" or q_type == r[c]["type"]) then
if (r[c]["type"] == "A" or q_type == "A") then
if (next(was_a) ~= nil) then
r[c]["content"] = was_a["A"]
--logger(log_error, "was A is"..was_a["A"])
else
r[c]["content"] = wei(r)
was_a.A = r[c]["content"]
end
end
return r[c]
end
end
-- logger(log_error, "(l_get) END")
return false
end
local k,v,kk,vv
function getsoa(name)
-- logger(log_error, "(l_getsoa) BEGIN", "name:", name)
r = domains_name[name]
if type(r) == "table" then
-- logger(log_error, type(r), type(r["soa"]))
return r["soa"]
end
-- logger(log_error, "(l_getsoa) END NOT FOUND")
end
logger(log_error, "powerdns-luabackend starting up!")
for k,v in pairs(QTypes) do
-- logger(log_error, k, v)
end
for k,v in pairs(records) do
for kk,vv in pairs(v) do
-- logger(log_error, kk, type(vv), vv["type"])
end
end
примеры ответов:
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
46 1.1.1.1
54 3.3.3.3
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
50 1.1.1.1
50 3.3.3.3
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
50 1.1.1.1
50 3.3.3.3
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
46 2.2.2.2
54 1.1.1.1
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
49 2.2.2.2
51 1.1.1.1
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
49 1.1.1.1
51 2.2.2.2
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
20 1.1.1.1
26 3.3.3.3
54 2.2.2.2
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
25 1.1.1.1
25 3.3.3.3
50 2.2.2.2
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
25 1.1.1.1
25 3.3.3.3
50 2.2.2.2
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
25 1.1.1.1
25 3.3.3.3
50 2.2.2.2
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
27 2.2.2.2
73 1.1.1.1
tj@nb:~/Dev/$ i=0 ; while [ $i -lt 100 ] ; do dig A test.ru @MY.NS.IP -p53 +short ; let i=i+1 ;done | sort -d | uniq -c | sort -n
25 2.2.2.2
75 1.1.1.1
тест самой рандомной молотилки:
function weighted_random_choice(choices)
local threshold = math.random(0, weighted_total(choices))
local last_choice
for choice, weight in pairs(choices) do
threshold = threshold - weight
if threshold <= 0 then return choice end
last_choice = choice
end
return last_choice
end
function weighted_total(choices)
local total = 0
for choice, weight in pairs(choices) do
total = total + weight
end
return total
end
local choices = { foo = 20, bar = 10, baz = 5, waz = 2 }
local iterations = 1000
for i = 1, iterations do
print(weighted_random_choice(choices))
end
результат вполне нормальный:
269 bar
149 baz
527 foo
55 waz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment