summaryrefslogtreecommitdiffstats
path: root/scripts/kresd-query.lua
blob: 713b9c786a4109d72106fecffad1125f19e7de33 (plain)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env luajit
-- SPDX-License-Identifier: GPL-3.0-or-later
cli_bin = 'kresd -q -c -'
-- Work around OS X stripping dyld variables
libdir = os.getenv('DYLD_LIBRARY_PATH')
if libdir then
	cli_bin = string.format('DYLD_LIBRARY_PATH="%s" %s', libdir, cli_bin)
end
cli_cmd = [[echo '
option("ALWAYS_CUT", true)
%s
return resolve("%s", kres.type.%s, kres.class.%s, 0,
function (pkt, req)
	local ok, err = pcall(function () %s end)
	if not ok then
		print(err)
	end
	quit()
end)']]
-- Parse CLI arguments
local function help()
	name = 'kresd-query.lua'
	print(string.format('Usage: %s [-t type] [-c class] [-C config] <name> <script>', name))
	print('Execute a single-shot query and run a script on the result.')
	print('There are two variables available: pkt (kres.pkt_t), req (kres.request_t)')
	print('See modules README to learn about their APIs.')
	print('')
	print('Options:')
	print('\t-h,--help        ... print this help')
	print('\t-t TYPE          ... query for given type (default: A)')
	print('\t-c CLASS         ... query in given class (default: IN)')
	print('\t-C config_str    ... kresd-style config (default: -)')
	print('Examples:')
	print('\t'..name..' -t SOA cz "print(pkt:qname())"         ... print response QNAME')
end
-- Parse CLI arguments
if #arg < 2 then help() return 1 end
local qtype, qclass, qname = 'A', 'IN', nil
local config, scripts = '', {}
k = 1 while k <= #arg do
	local v = arg[k]
	if v == '-h' or v == '--help' then
		return help()
	elseif v == '-C' then
		k = k + 1
		config = arg[k]
	elseif v == '-c' then
		k = k + 1
		qclass = arg[k]:upper()
	elseif v == '-t' then
		k = k + 1
		qtype = arg[k]:upper()
	elseif v:byte() == string.byte('-') then
		return help()
	elseif not qname then
		qname = v
	else
		table.insert(scripts, v)
	end
	k = k + 1
end
cli_cmd = string.format(cli_cmd, config, qname, qtype, qclass, table.concat(scripts, ' '))
return os.execute(cli_cmd..' | '..cli_bin)