s4:rpc-dnsserver: Cache DNS partition information
[samba.git] / source4 / rpc_server / dnsserver / dnsserver.h
1 /*
2    Unix SMB/CIFS implementation.
3
4    DNS Server
5
6    Copyright (C) Amitay Isaacs 2011
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
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, see <http://www.gnu.org/licenses/>.
20 */
21
22 #ifndef __DNSSERVER_H__
23 #define __DNSSERVER_H__
24
25 #include "librpc/gen_ndr/dnsp.h"
26 #include "librpc/gen_ndr/dnsserver.h"
27 #include "param/param.h"
28 #include "ldb.h"
29
30 struct dnsserver_serverinfo {
31         uint32_t        dwVersion;
32         uint8_t         fBootMethod;
33         uint8_t         fAdminConfigured;
34         uint8_t         fAllowUpdate;
35         uint8_t         fDsAvailable;
36
37         char *          pszServerName;
38         char *          pszDsContainer;
39
40         uint32_t        dwDsForestVersion;
41         uint32_t        dwDsDomainVersion;
42         uint32_t        dwDsDsaVersion;
43         uint32_t        fReadOnlyDC;
44         char *          pszDomainName;
45         char *          pszForestName;
46         char *          pszDomainDirectoryPartition;
47         char *          pszForestDirectoryPartition;
48
49         struct IP4_ARRAY * aipServerAddrs;
50         struct IP4_ARRAY * aipListenAddrs;
51         struct IP4_ARRAY * aipForwarders;
52
53         struct IP4_ARRAY * aipLogFilter;
54         char *          pwszLogFilePath;
55
56         uint32_t        dwLogLevel;
57         uint32_t        dwDebugLevel;
58         uint32_t        dwEventLogLevel;
59         uint32_t        dwLogFileMaxSize;
60
61         uint32_t        dwForwardTimeout;
62         uint32_t        dwRpcProtocol;
63         uint32_t        dwNameCheckFlag;
64         uint32_t        cAddressAnswerLimit;
65         uint32_t        dwRecursionRetry;
66         uint32_t        dwRecursionTimeout;
67         uint32_t        dwMaxCacheTtl;
68         uint32_t        dwDsPollingInterval;
69         uint32_t        dwLocalNetPriorityNetMask;
70
71         uint32_t        dwScavengingInterval;
72         uint32_t        dwDefaultRefreshInterval;
73         uint32_t        dwDefaultNoRefreshInterval;
74         uint32_t        dwLastScavengeTime;
75
76         uint8_t         fAutoReverseZones;
77         uint8_t         fAutoCacheUpdate;
78
79         uint8_t         fRecurseAfterForwarding;
80         uint8_t         fForwardDelegations;
81         uint8_t         fNoRecursion;
82         uint8_t         fSecureResponses;
83
84         uint8_t         fRoundRobin;
85         uint8_t         fLocalNetPriority;
86
87         uint8_t         fBindSecondaries;
88         uint8_t         fWriteAuthorityNs;
89
90         uint8_t         fStrictFileParsing;
91         uint8_t         fLooseWildcarding;
92         uint8_t         fDefaultAgingState;
93 };
94
95 struct dnsserver_zoneinfo {
96         uint8_t         Version;
97         uint32_t        Flags;
98         uint8_t         dwZoneType;
99         uint8_t         fReverse;
100         uint8_t         fAllowUpdate;
101         uint8_t         fPaused;
102         uint8_t         fShutdown;
103         uint8_t         fAutoCreated;
104
105         uint8_t         fUseDatabase;
106         char *          pszDataFile;
107
108         struct IP4_ARRAY * aipMasters;
109
110         uint32_t        fSecureSecondaries;
111         uint32_t        fNotifyLevel;
112         struct IP4_ARRAY * aipSecondaries;
113         struct IP4_ARRAY * aipNotify;
114
115         uint32_t        fUseWins;
116         uint32_t        fUseNbstat;
117
118         uint32_t        fAging;
119         uint32_t        dwNoRefreshInterval;
120         uint32_t        dwRefreshInterval;
121         uint32_t        dwAvailForScavengeTime;
122         struct IP4_ARRAY * aipScavengeServers;
123
124         uint32_t        dwForwarderTimeout;
125         uint32_t        fForwarderSlave;
126
127         struct IP4_ARRAY * aipLocalMasters;
128
129         char *          pwszZoneDn;
130
131         uint32_t        dwLastSuccessfulSoaCheck;
132         uint32_t        dwLastSuccessfulXfr;
133
134         uint32_t        fQueuedForBackgroundLoad;
135         uint32_t        fBackgroundLoadInProgress;
136         uint8_t         fReadOnlyZone;
137
138         uint32_t        dwLastXfrAttempt;
139         uint32_t        dwLastXfrResult;
140 };
141
142
143 struct dnsserver_partition {
144         struct dnsserver_partition *prev, *next;
145         struct ldb_dn *partition_dn;
146         const char *pszDpFqdn;
147         uint32_t dwDpFlags;
148         bool is_forest;
149         int zones_count;
150 };
151
152
153 struct dnsserver_zone {
154         struct dnsserver_zone *prev, *next;
155         struct dnsserver_partition *partition;
156         const char *name;
157         struct ldb_dn *zone_dn;
158         struct dnsserver_zoneinfo *zoneinfo;
159 };
160
161
162 struct dns_tree {
163         const char *name;
164         int level;
165         unsigned int num_children;
166         struct dns_tree **children;
167         void *data;
168 };
169
170 /* Data structure manipulation functions from dnsdata.c */
171
172 struct IP4_ARRAY *ip4_array_copy(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
173 struct DNS_ADDR_ARRAY *ip4_array_to_dns_addr_array(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
174 struct DNS_ADDR_ARRAY *dns_addr_array_copy(TALLOC_CTX *mem_ctx, struct DNS_ADDR_ARRAY *addr);
175
176 int dns_split_name_components(TALLOC_CTX *mem_ctx, const char *name, char ***components);
177 char *dns_split_node_name(TALLOC_CTX *mem_ctx, const char *node_name, const char *zone_name);
178
179 int dns_name_compare(const struct ldb_message **m1, const struct ldb_message **m2,
180                         char *search_name);
181 bool dns_name_equal(const char *name1, const char *name2);
182 bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2);
183
184 void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
185                         struct DNS_RPC_RECORD *dns);
186 struct dnsp_DnssrvRpcRecord *dns_to_dnsp_copy(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns);
187
188 struct dns_tree *dns_build_tree(TALLOC_CTX *mem_ctx, const char *name, struct ldb_result *res);
189 WERROR dns_fill_records_array(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
190                         enum dns_record_type record_type,
191                         unsigned int select_flag, const char *zone_name,
192                         struct ldb_message *msg, int num_children,
193                         struct DNS_RPC_RECORDS_ARRAY *recs,
194                         char ***add_names, int *add_count);
195
196
197 /* Utility functions from dnsutils.c */
198
199 struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx,
200                                         struct loadparm_context *lp_ctx,
201                                         struct ldb_context *samdb);
202 struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
203                                         struct dnsserver_serverinfo *serverinfo);
204 struct dnsserver_partition *dnsserver_find_partition(struct dnsserver_partition *partitions,
205                                         const char *dp_fqdn);
206 struct dnsserver_zone *dnsserver_find_zone(struct dnsserver_zone *zones,
207                                         const char *zone_name);
208 struct ldb_dn *dnsserver_name_to_dn(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
209                                         const char *name);
210 uint32_t dnsserver_zone_to_request_filter(const char *zone);
211
212
213 /* Database functions from dnsdb.c */
214
215 struct dnsserver_partition *dnsserver_db_enumerate_partitions(TALLOC_CTX *mem_ctx,
216                                         struct dnsserver_serverinfo *serverinfo,
217                                         struct ldb_context *samdb);
218 struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
219                                         struct ldb_context *samdb,
220                                         struct dnsserver_partition *p);
221 WERROR dnsserver_db_add_empty_node(TALLOC_CTX *mem_ctx,
222                                         struct ldb_context *samdb,
223                                         struct dnsserver_zone *z,
224                                         const char *node_name);
225 WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx,
226                                         struct ldb_context *samdb,
227                                         struct dnsserver_zone *z,
228                                         const char *node_name,
229                                         struct DNS_RPC_RECORD *add_record);
230 WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx,
231                                         struct ldb_context *samdb,
232                                         struct dnsserver_zone *z,
233                                         const char *node_name,
234                                         struct DNS_RPC_RECORD *add_record,
235                                         struct DNS_RPC_RECORD *del_record);
236 WERROR dnsserver_db_delete_record(TALLOC_CTX *mem_ctx,
237                                         struct ldb_context *samdb,
238                                         struct dnsserver_zone *z,
239                                         const char *node_name,
240                                         struct DNS_RPC_RECORD *del_record);
241
242 #endif /* __DNSSERVER_H__ */