rpc dns: reading zone properties from LDB
[metze/samba/wip.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 DNS_ADDR_ARRAY * aipServerAddrs;
50         struct DNS_ADDR_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_partition_info {
154         const char *pszCrDn;
155         uint32_t dwState;
156         uint32_t dwReplicaCount;
157         struct DNS_RPC_DP_REPLICA **ReplicaArray;
158 };
159
160
161 struct dnsserver_zone {
162         struct dnsserver_zone *prev, *next;
163         struct dnsserver_partition *partition;
164         const char *name;
165         struct ldb_dn *zone_dn;
166         struct dnsserver_zoneinfo *zoneinfo;
167         struct dnsp_DnsProperty *tmp_props;
168         int32_t num_props;
169 };
170
171
172 struct dns_tree {
173         const char *name;
174         int level;
175         unsigned int num_children;
176         struct dns_tree **children;
177         void *data;
178 };
179
180 /* Data structure manipulation functions from dnsdata.c */
181
182 struct IP4_ARRAY *ip4_array_copy(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
183 struct DNS_ADDR_ARRAY *ip4_array_to_dns_addr_array(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
184 struct IP4_ARRAY *dns_addr_array_to_ip4_array(TALLOC_CTX *mem_ctx,
185                                               struct DNS_ADDR_ARRAY *ip);
186 struct DNS_ADDR_ARRAY *dns_addr_array_copy(TALLOC_CTX *mem_ctx, struct DNS_ADDR_ARRAY *addr);
187
188 int dns_split_name_components(TALLOC_CTX *mem_ctx, const char *name, char ***components);
189 char *dns_split_node_name(TALLOC_CTX *mem_ctx, const char *node_name, const char *zone_name);
190
191 int dns_name_compare(const struct ldb_message **m1, const struct ldb_message **m2,
192                         char *search_name);
193 bool dns_name_equal(const char *name1, const char *name2);
194 bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2);
195
196 void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
197                         struct DNS_RPC_RECORD *dns);
198 WERROR dns_to_dnsp_convert(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns,
199                            struct dnsp_DnssrvRpcRecord **out_dnsp,
200                            bool check_name);
201
202 struct dns_tree *dns_build_tree(TALLOC_CTX *mem_ctx, const char *name, struct ldb_result *res);
203 WERROR dns_fill_records_array(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
204                         enum dns_record_type record_type,
205                         unsigned int select_flag, const char *zone_name,
206                         struct ldb_message *msg, int num_children,
207                         struct DNS_RPC_RECORDS_ARRAY *recs,
208                         char ***add_names, int *add_count);
209
210
211 /* Utility functions from dnsutils.c */
212
213 struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx,
214                                         struct loadparm_context *lp_ctx,
215                                         struct ldb_context *samdb);
216 struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
217                                         struct dnsserver_serverinfo *serverinfo);
218 struct dnsserver_partition *dnsserver_find_partition(struct dnsserver_partition *partitions,
219                                         const char *dp_fqdn);
220 struct dnsserver_zone *dnsserver_find_zone(struct dnsserver_zone *zones,
221                                         const char *zone_name);
222 struct ldb_dn *dnsserver_name_to_dn(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
223                                         const char *name);
224 uint32_t dnsserver_zone_to_request_filter(const char *zone);
225
226 /* Database functions from dnsdb.c */
227
228 struct dnsserver_partition *dnsserver_db_enumerate_partitions(TALLOC_CTX *mem_ctx,
229                                         struct dnsserver_serverinfo *serverinfo,
230                                         struct ldb_context *samdb);
231 struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
232                                         struct ldb_context *samdb,
233                                         struct dnsserver_partition *p);
234 struct dnsserver_partition_info *dnsserver_db_partition_info(TALLOC_CTX *mem_ctx,
235                                         struct ldb_context *samdb,
236                                         struct dnsserver_partition *p);
237 WERROR dnsserver_db_add_empty_node(TALLOC_CTX *mem_ctx,
238                                         struct ldb_context *samdb,
239                                         struct dnsserver_zone *z,
240                                         const char *node_name);
241 WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx,
242                                         struct ldb_context *samdb,
243                                         struct dnsserver_zone *z,
244                                         const char *node_name,
245                                         struct DNS_RPC_RECORD *add_record);
246 WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx,
247                                         struct ldb_context *samdb,
248                                         struct dnsserver_zone *z,
249                                         const char *node_name,
250                                         struct DNS_RPC_RECORD *add_record,
251                                         struct DNS_RPC_RECORD *del_record);
252 WERROR dnsserver_db_delete_record(TALLOC_CTX *mem_ctx,
253                                   struct ldb_context *samdb,
254                                   struct dnsserver_zone *z,
255                                   const char *node_name,
256                                   struct DNS_RPC_RECORD *del_record);
257 WERROR dnsserver_db_create_zone(struct ldb_context *samdb,
258                                 struct dnsserver_partition *partitions,
259                                 struct dnsserver_zone *z,
260                                 struct loadparm_context *lp_ctx);
261 WERROR dnsserver_db_delete_zone(struct ldb_context *samdb,
262                                 struct dnsserver_zone *z);
263
264 #endif /* __DNSSERVER_H__ */