]>
Commit | Line | Data |
---|---|---|
6bb38cd6 RG |
1 | /* |
2 | * This file is part of PowerDNS or dnsdist. | |
3 | * Copyright -- PowerDNS.COM B.V. and its contributors | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of version 2 of the GNU General Public License as | |
7 | * published by the Free Software Foundation. | |
8 | * | |
9 | * In addition, for the avoidance of any doubt, permission is granted to | |
10 | * link this program with OpenSSL and to (re)distribute the binaries | |
11 | * produced as the result of such linking. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with this program; if not, write to the Free Software | |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
21 | */ | |
22 | #include "dnsdist.hh" | |
e7c732b8 | 23 | #include "dnsdist-ecs.hh" |
6bb38cd6 RG |
24 | #include "dnsdist-lua.hh" |
25 | #include "dnsparser.hh" | |
26 | ||
27 | void setupLuaBindingsDNSQuestion() | |
28 | { | |
29 | /* DNSQuestion */ | |
30 | /* PowerDNS DNSQuestion compat */ | |
31 | g_lua.registerMember<const ComboAddress (DNSQuestion::*)>("localaddr", [](const DNSQuestion& dq) -> const ComboAddress { return *dq.local; }, [](DNSQuestion& dq, const ComboAddress newLocal) { (void) newLocal; }); | |
32 | g_lua.registerMember<const DNSName (DNSQuestion::*)>("qname", [](const DNSQuestion& dq) -> const DNSName { return *dq.qname; }, [](DNSQuestion& dq, const DNSName newName) { (void) newName; }); | |
33 | g_lua.registerMember<uint16_t (DNSQuestion::*)>("qtype", [](const DNSQuestion& dq) -> uint16_t { return dq.qtype; }, [](DNSQuestion& dq, uint16_t newType) { (void) newType; }); | |
34 | g_lua.registerMember<uint16_t (DNSQuestion::*)>("qclass", [](const DNSQuestion& dq) -> uint16_t { return dq.qclass; }, [](DNSQuestion& dq, uint16_t newClass) { (void) newClass; }); | |
35 | g_lua.registerMember<int (DNSQuestion::*)>("rcode", [](const DNSQuestion& dq) -> int { return dq.dh->rcode; }, [](DNSQuestion& dq, int newRCode) { dq.dh->rcode = newRCode; }); | |
36 | g_lua.registerMember<const ComboAddress (DNSQuestion::*)>("remoteaddr", [](const DNSQuestion& dq) -> const ComboAddress { return *dq.remote; }, [](DNSQuestion& dq, const ComboAddress newRemote) { (void) newRemote; }); | |
37 | /* DNSDist DNSQuestion */ | |
38 | g_lua.registerMember("dh", &DNSQuestion::dh); | |
39 | g_lua.registerMember<uint16_t (DNSQuestion::*)>("len", [](const DNSQuestion& dq) -> uint16_t { return dq.len; }, [](DNSQuestion& dq, uint16_t newlen) { dq.len = newlen; }); | |
40 | g_lua.registerMember<uint8_t (DNSQuestion::*)>("opcode", [](const DNSQuestion& dq) -> uint8_t { return dq.dh->opcode; }, [](DNSQuestion& dq, uint8_t newOpcode) { (void) newOpcode; }); | |
41 | g_lua.registerMember<size_t (DNSQuestion::*)>("size", [](const DNSQuestion& dq) -> size_t { return dq.size; }, [](DNSQuestion& dq, size_t newSize) { (void) newSize; }); | |
42 | g_lua.registerMember<bool (DNSQuestion::*)>("tcp", [](const DNSQuestion& dq) -> bool { return dq.tcp; }, [](DNSQuestion& dq, bool newTcp) { (void) newTcp; }); | |
43 | g_lua.registerMember<bool (DNSQuestion::*)>("skipCache", [](const DNSQuestion& dq) -> bool { return dq.skipCache; }, [](DNSQuestion& dq, bool newSkipCache) { dq.skipCache = newSkipCache; }); | |
44 | g_lua.registerMember<bool (DNSQuestion::*)>("useECS", [](const DNSQuestion& dq) -> bool { return dq.useECS; }, [](DNSQuestion& dq, bool useECS) { dq.useECS = useECS; }); | |
45 | g_lua.registerMember<bool (DNSQuestion::*)>("ecsOverride", [](const DNSQuestion& dq) -> bool { return dq.ecsOverride; }, [](DNSQuestion& dq, bool ecsOverride) { dq.ecsOverride = ecsOverride; }); | |
46 | g_lua.registerMember<uint16_t (DNSQuestion::*)>("ecsPrefixLength", [](const DNSQuestion& dq) -> uint16_t { return dq.ecsPrefixLength; }, [](DNSQuestion& dq, uint16_t newPrefixLength) { dq.ecsPrefixLength = newPrefixLength; }); | |
29b6a412 CH |
47 | g_lua.registerMember<boost::optional<uint32_t> (DNSQuestion::*)>("tempFailureTTL", |
48 | [](const DNSQuestion& dq) -> boost::optional<uint32_t> { | |
49 | return dq.tempFailureTTL; | |
50 | }, | |
51 | [](DNSQuestion& dq, boost::optional<uint32_t> newValue) { | |
52 | dq.tempFailureTTL = newValue; | |
53 | } | |
54 | ); | |
6bb38cd6 | 55 | g_lua.registerFunction<bool(DNSQuestion::*)()>("getDO", [](const DNSQuestion& dq) { |
e7c732b8 | 56 | return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO; |
6bb38cd6 | 57 | }); |
cbf4e13a RG |
58 | |
59 | g_lua.registerFunction<std::map<uint16_t, EDNSOptionView>(DNSQuestion::*)()>("getEDNSOptions", [](DNSQuestion& dq) { | |
60 | if (dq.ednsOptions == nullptr) { | |
61 | parseEDNSOptions(dq); | |
62 | } | |
63 | ||
64 | return *dq.ednsOptions; | |
65 | }); | |
66 | ||
6bb38cd6 RG |
67 | g_lua.registerFunction<void(DNSQuestion::*)(std::string)>("sendTrap", [](const DNSQuestion& dq, boost::optional<std::string> reason) { |
68 | #ifdef HAVE_NET_SNMP | |
69 | if (g_snmpAgent && g_snmpTrapsEnabled) { | |
70 | g_snmpAgent->sendDNSTrap(dq, reason ? *reason : ""); | |
71 | } | |
72 | #endif /* HAVE_NET_SNMP */ | |
73 | }); | |
74 | g_lua.registerFunction<void(DNSQuestion::*)(std::string, std::string)>("setTag", [](DNSQuestion& dq, const std::string& strLabel, const std::string& strValue) { | |
6bb38cd6 RG |
75 | if(dq.qTag == nullptr) { |
76 | dq.qTag = std::make_shared<QTag>(); | |
77 | } | |
15fac047 | 78 | dq.qTag->insert({strLabel, strValue}); |
6bb38cd6 RG |
79 | }); |
80 | g_lua.registerFunction<void(DNSQuestion::*)(vector<pair<string, string>>)>("setTagArray", [](DNSQuestion& dq, const vector<pair<string, string>>&tags) { | |
15fac047 | 81 | if (!dq.qTag) { |
6bb38cd6 RG |
82 | dq.qTag = std::make_shared<QTag>(); |
83 | } | |
84 | ||
85 | for (const auto& tag : tags) { | |
15fac047 | 86 | dq.qTag->insert({tag.first, tag.second}); |
6bb38cd6 | 87 | } |
6bb38cd6 RG |
88 | }); |
89 | g_lua.registerFunction<string(DNSQuestion::*)(std::string)>("getTag", [](const DNSQuestion& dq, const std::string& strLabel) { | |
15fac047 CH |
90 | if (!dq.qTag) { |
91 | return string(); | |
92 | } | |
6bb38cd6 RG |
93 | |
94 | std::string strValue; | |
15fac047 CH |
95 | const auto it = dq.qTag->find(strLabel); |
96 | if (it == dq.qTag->cend()) { | |
97 | return string(); | |
6bb38cd6 | 98 | } |
15fac047 | 99 | return it->second; |
6bb38cd6 | 100 | }); |
15fac047 CH |
101 | g_lua.registerFunction<QTag(DNSQuestion::*)(void)>("getTagArray", [](const DNSQuestion& dq) { |
102 | if (!dq.qTag) { | |
103 | QTag empty; | |
104 | return empty; | |
6bb38cd6 | 105 | } |
15fac047 CH |
106 | |
107 | return *dq.qTag; | |
6bb38cd6 RG |
108 | }); |
109 | ||
110 | /* LuaWrapper doesn't support inheritance */ | |
111 | g_lua.registerMember<const ComboAddress (DNSResponse::*)>("localaddr", [](const DNSResponse& dq) -> const ComboAddress { return *dq.local; }, [](DNSResponse& dq, const ComboAddress newLocal) { (void) newLocal; }); | |
112 | g_lua.registerMember<const DNSName (DNSResponse::*)>("qname", [](const DNSResponse& dq) -> const DNSName { return *dq.qname; }, [](DNSResponse& dq, const DNSName newName) { (void) newName; }); | |
113 | g_lua.registerMember<uint16_t (DNSResponse::*)>("qtype", [](const DNSResponse& dq) -> uint16_t { return dq.qtype; }, [](DNSResponse& dq, uint16_t newType) { (void) newType; }); | |
114 | g_lua.registerMember<uint16_t (DNSResponse::*)>("qclass", [](const DNSResponse& dq) -> uint16_t { return dq.qclass; }, [](DNSResponse& dq, uint16_t newClass) { (void) newClass; }); | |
115 | g_lua.registerMember<int (DNSResponse::*)>("rcode", [](const DNSResponse& dq) -> int { return dq.dh->rcode; }, [](DNSResponse& dq, int newRCode) { dq.dh->rcode = newRCode; }); | |
116 | g_lua.registerMember<const ComboAddress (DNSResponse::*)>("remoteaddr", [](const DNSResponse& dq) -> const ComboAddress { return *dq.remote; }, [](DNSResponse& dq, const ComboAddress newRemote) { (void) newRemote; }); | |
117 | g_lua.registerMember<dnsheader* (DNSResponse::*)>("dh", [](const DNSResponse& dr) -> dnsheader* { return dr.dh; }, [](DNSResponse& dr, dnsheader * newdh) { dr.dh = newdh; }); | |
118 | g_lua.registerMember<uint16_t (DNSResponse::*)>("len", [](const DNSResponse& dq) -> uint16_t { return dq.len; }, [](DNSResponse& dq, uint16_t newlen) { dq.len = newlen; }); | |
119 | g_lua.registerMember<uint8_t (DNSResponse::*)>("opcode", [](const DNSResponse& dq) -> uint8_t { return dq.dh->opcode; }, [](DNSResponse& dq, uint8_t newOpcode) { (void) newOpcode; }); | |
120 | g_lua.registerMember<size_t (DNSResponse::*)>("size", [](const DNSResponse& dq) -> size_t { return dq.size; }, [](DNSResponse& dq, size_t newSize) { (void) newSize; }); | |
121 | g_lua.registerMember<bool (DNSResponse::*)>("tcp", [](const DNSResponse& dq) -> bool { return dq.tcp; }, [](DNSResponse& dq, bool newTcp) { (void) newTcp; }); | |
122 | g_lua.registerMember<bool (DNSResponse::*)>("skipCache", [](const DNSResponse& dq) -> bool { return dq.skipCache; }, [](DNSResponse& dq, bool newSkipCache) { dq.skipCache = newSkipCache; }); | |
123 | g_lua.registerFunction<void(DNSResponse::*)(std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc)>("editTTLs", [](const DNSResponse& dr, std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc) { | |
124 | editDNSPacketTTL((char*) dr.dh, dr.len, editFunc); | |
125 | }); | |
126 | g_lua.registerFunction<void(DNSResponse::*)(std::string)>("sendTrap", [](const DNSResponse& dr, boost::optional<std::string> reason) { | |
127 | #ifdef HAVE_NET_SNMP | |
128 | if (g_snmpAgent && g_snmpTrapsEnabled) { | |
129 | g_snmpAgent->sendDNSTrap(dr, reason ? *reason : ""); | |
130 | } | |
131 | #endif /* HAVE_NET_SNMP */ | |
132 | }); | |
133 | } |