-
-
Save anonymous/60c3d8176250df50eca1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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