-
Notifications
You must be signed in to change notification settings - Fork 7
/
dig.rb
62 lines (53 loc) · 1.81 KB
/
dig.rb
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
module Lita
module Handlers
class Dig < Handler
config :default_resolver, default: '8.8.8.8'
DNS_TYPES = %w(a ns md cname soa mb mg mr null wks ptr hinfo minfo
mx txt rp afsdb x25 isdn rt nsap nsapptr sig key px
gpos aaaa loc nxt eid nimloc srv atma naptr kx cert
dname opt ds sshfp rrsig nsec dnskey uinfo uid gid
unspec tkey tsig ixfr axfr mailb maila any)
route(
/^dig
(?:\s\@)?(?<resolver>\S+)?
(\s+(?<record>\S+))
(?<type>\s\w+)?
(?<short>\s\+short)?$
/x,
:resolve,
command: true,
help: {
t('help.resolve.syntax') => t('help.resolve.desc')
}
)
def resolve(response)
resolver = response.match_data['resolver'] || config.default_resolver
record = response.match_data['record']
type = (response.match_data['type'] || 'a').strip
short = response.match_data['short']
result = lookup(record, type, resolver)
response.reply(format_lookup(result, short))
end
private
def lookup(argument, type, server = nil)
return t('error.unknown_type') unless DNS_TYPES.include?(type.downcase)
type = Object.const_get('Net::DNS::' + type.upcase)
resolver = Net::DNS::Resolver.new
resolver.nameservers = server unless server.nil?
begin
resolver.query(argument, type)
rescue
t('error.unable_to_resolve', argument: argument)
end
end
def format_lookup(lookup, compact = false)
if compact
render_template('compact', lookup: lookup)
else
render_template('full', lookup: lookup)
end
end
end
Lita.register_handler(Dig)
end
end