]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/ueberbackend.hh
Auth: drop broken support for packet-specific SOA replies from backends
[thirdparty/pdns.git] / pdns / ueberbackend.hh
CommitLineData
12c86877 1/*
12471842
PL
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 */
12c86877
BH
22#ifndef UEBERBACKEND_HH
23#define UEBERBACKEND_HH
24
25#include <vector>
26#include <map>
27#include <string>
28#include <algorithm>
29#include <pthread.h>
973ad2b5
BH
30#include <semaphore.h>
31
973ad2b5 32#include <unistd.h>
973ad2b5
BH
33#include <sys/stat.h>
34#include <fcntl.h>
35#include <unistd.h>
6a010475 36#include <boost/utility.hpp>
12c86877
BH
37#include "dnspacket.hh"
38#include "dnsbackend.hh"
39
10f4eea8 40#include "namespaces.hh"
12c86877 41
12c86877
BH
42/** This is a very magic backend that allows us to load modules dynamically,
43 and query them in order. This is persistent over all UeberBackend instantiations
bdc9f8d2
BH
44 across multiple threads.
45
46 The UeberBackend is transparent for exceptions, which should fall straight through.
47*/
12c86877 48
3971cf53 49class UeberBackend : public boost::noncopyable
12c86877
BH
50{
51public:
6a010475 52 UeberBackend(const string &pname="default");
12c86877 53 ~UeberBackend();
12c86877 54
675fa24c 55 bool superMasterBackend(const string &ip, const DNSName &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db);
12c86877 56
12c86877
BH
57 /** Tracks all created UeberBackend instances for us. We use this vector to notify
58 existing threads of new modules
59 */
60 static vector<UeberBackend *>instances;
61 static pthread_mutex_t instances_lock;
62
63 static bool loadmodule(const string &name);
64
12c86877
BH
65 static void go(void);
66
12c86877
BH
67 /** This contains all registered backends. The DynListener modifies this list for us when
68 new modules are loaded */
6a010475 69 vector<DNSBackend*> backends;
12c86877 70
12c86877
BH
71 void cleanup();
72
73 //! the very magic handle for UeberBackend questions
74 class handle
75 {
76 public:
90ba52e0 77 bool get(DNSZoneRecord &dr);
12c86877
BH
78 handle();
79 ~handle();
80
81 //! The UeberBackend class where this handle belongs to
82 UeberBackend *parent;
83 //! The current real backend, which is answering questions
84 DNSBackend *d_hinterBackend;
85
12c86877
BH
86 //! DNSPacket who asked this question
87 DNSPacket *pkt_p;
675fa24c 88 DNSName qname;
5b098284
PL
89
90 //! Index of the current backend within the backends vector
91 unsigned int i;
12c86877 92 QType qtype;
5b098284 93
12c86877
BH
94 private:
95
16f7d28d 96 static AtomicCounter instances;
12c86877
BH
97 };
98
675fa24c 99 void lookup(const QType &, const DNSName &qdomain, DNSPacket *pkt_p=0, int zoneId=-1);
12c86877 100
675fa24c 101 bool getAuth(DNSPacket *p, SOAData *sd, const DNSName &target);
94bfa5b6
CH
102 bool getSOA(const DNSName &domain, SOAData &sd);
103 bool getSOAUncached(const DNSName &domain, SOAData &sd); // same, but ignores cache
90ba52e0 104 bool get(DNSZoneRecord &r);
cea26350 105 void getAllDomains(vector<DomainInfo> *domains, bool include_disabled=false);
12c86877 106
12c86877
BH
107 void getUnfreshSlaveInfos(vector<DomainInfo>* domains);
108 void getUpdatedMasters(vector<DomainInfo>* domains);
675fa24c
PD
109 bool getDomainInfo(const DNSName &domain, DomainInfo &di);
110 bool createDomain(const DNSName &domain);
c0273500 111
7fa35c07 112 bool doesDNSSEC();
82cc0761 113 bool addDomainKey(const DNSName& name, const DNSBackend::KeyData& key, int64_t& id);
9c1c5d49 114 bool getDomainKeys(const DNSName& name, std::vector<DNSBackend::KeyData>& keys);
675fa24c
PD
115 bool getAllDomainMetadata(const DNSName& name, std::map<std::string, std::vector<std::string> >& meta);
116 bool getDomainMetadata(const DNSName& name, const std::string& kind, std::vector<std::string>& meta);
117 bool setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector<std::string>& meta);
118
119 bool removeDomainKey(const DNSName& name, unsigned int id);
120 bool activateDomainKey(const DNSName& name, unsigned int id);
121 bool deactivateDomainKey(const DNSName& name, unsigned int id);
122
675fa24c
PD
123 bool getTSIGKey(const DNSName& name, DNSName* algorithm, string* content);
124 bool setTSIGKey(const DNSName& name, const DNSName& algorithm, const string& content);
125 bool deleteTSIGKey(const DNSName& name);
6f872b78
AT
126 bool getTSIGKeys(std::vector< struct TSIGKey > &keys);
127
675fa24c 128 void alsoNotifies(const DNSName &domain, set<string> *ips);
973ad2b5 129 void rediscover(string* status=0);
12c86877 130 void reload();
9f8e226e
AT
131 bool searchRecords(const string &pattern, int maxResults, vector<DNSResourceRecord>& result);
132 bool searchComments(const string &pattern, int maxResults, vector<Comment>& result);
12c86877 133private:
ce4a60ce 134 pthread_t d_tid;
12c86877 135 handle d_handle;
90ba52e0 136 vector<DNSZoneRecord> d_answers;
137 vector<DNSZoneRecord>::const_iterator d_cachehandleiter;
c899e9e7
PL
138
139 static pthread_mutex_t d_mut;
140 static pthread_cond_t d_cond;
c899e9e7 141
12c86877
BH
142 struct Question
143 {
675fa24c 144 DNSName qname;
12c86877 145 int zoneId;
c899e9e7 146 QType qtype;
12c86877 147 }d_question;
c899e9e7
PL
148
149 unsigned int d_cache_ttl, d_negcache_ttl;
ce4a60ce 150 int d_domain_id;
c899e9e7
PL
151 int d_ancount;
152
153 bool d_negcached;
154 bool d_cached;
155 static bool d_go;
ce4a60ce 156 bool d_stale;
12c86877 157
90ba52e0 158 int cacheHas(const Question &q, vector<DNSZoneRecord> &rrs);
12c86877 159 void addNegCache(const Question &q);
90ba52e0 160 void addCache(const Question &q, const vector<DNSZoneRecord> &rrs);
12c86877 161
12c86877
BH
162};
163
12c86877 164#endif