/
named_config.h
149 lines (132 loc) · 5.5 KB
/
named_config.h
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/
#ifndef dns_named_config_h_
#define dns_named_config_h_
#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <base/timer.h>
class BindStatus {
public:
static const uint32_t kBindStatusTimeout = 2 * 1000;
static const uint32_t kInitTimeout = 200;
enum Event {
Up,
Down
};
typedef boost::function<void(Event)> BindEventHandler;
BindStatus(BindEventHandler handler);
virtual ~BindStatus();
bool SetTrigger();
bool IsUp() { return (named_pid_ != (uint32_t) -1); }
private:
friend class DnsBindTest;
friend class DnsManagerTest;
bool IsBindPid(uint32_t pid);
bool CheckBindStatus();
uint32_t named_pid_;
BindEventHandler handler_;
Timer *status_timer_;
bool change_timeout_;
DISALLOW_COPY_AND_ASSIGN(BindStatus);
};
class NamedConfig {
public:
// map of zone name to list of views to which they belong
typedef std::map<std::string, std::string> ZoneViewMap;
typedef std::pair<std::string, std::string> ZoneViewPair;
static const std::string NamedZoneFileSuffix;
static const std::string NamedZoneNSPrefix;
static const std::string NamedZoneMXPrefix;
static const char pid_file_name[];
static const char sessionkey_file_name[];
static const int NameWidth = 30;
static const int NumberWidth = 10;
static const int TypeWidth = 4;
struct Defaults {
static const int GlobalTTL = 86400;
static const int Serial = 54;
static const int Refresh = 10800;
static const int Retry = 900;
static const int Expire = 604800;
static const int Minimum = 86400;
};
NamedConfig(const std::string& named_config_dir,
const std::string& named_config_file,
const std::string& named_log_file,
const std::string& rndc_config_file,
const std::string& rndc_secret,
const std::string& named_max_cache_size) :
file_(), named_log_file_(named_log_file), rndc_secret_(rndc_secret),
named_max_cache_size_(named_max_cache_size),
reset_flag_(false), all_zone_files_(false) {
named_config_dir_ = named_config_dir + "/";
named_config_file_ = named_config_dir_ + named_config_file;
rndc_config_file_ = named_config_dir_ + rndc_config_file;
}
virtual ~NamedConfig() { singleton_ = NULL; }
static NamedConfig *GetNamedConfigObject() { return singleton_; }
static void Init(const std::string& named_config_dir,
const std::string& named_config_file,
const std::string& named_log_file,
const std::string& rndc_config_file,
const std::string& rndc_secret,
const std::string& named_max_cache_size);
static void Shutdown();
void Reset();
virtual void AddView(const VirtualDnsConfig *vdns);
virtual void ChangeView(const VirtualDnsConfig *vdns);
virtual void DelView(const VirtualDnsConfig *vdns);
virtual void AddAllViews();
virtual void AddZone(const Subnet &subnet, const VirtualDnsConfig *vdns);
virtual void DelZone(const Subnet &subnet, const VirtualDnsConfig *vdns);
virtual void UpdateNamedConf(const VirtualDnsConfig *updated_vdns = NULL);
void RemoveZoneFiles(const VirtualDnsConfig *vdns, ZoneList &zones);
virtual std::string GetZoneFileName(const std::string &vdns,
const std::string &name);
virtual std::string GetZoneFilePath(const std::string &vdns,
const std::string &name);
virtual std::string GetResolveFile() { return "/etc/resolv.conf"; }
std::string GetPidFilePath();
std::string GetSessionKeyFilePath();
const std::string &named_config_dir() const { return named_config_dir_; }
const std::string &named_config_file() const { return named_config_file_; }
const std::string &named_sessionkey_file() const {
return named_sessionkey_file_;
}
protected:
void CreateRndcConf();
void CreateNamedConf(const VirtualDnsConfig *updated_vdns);
void WriteOptionsConfig();
void WriteRndcConfig();
void WriteLoggingConfig();
void WriteViewConfig(const VirtualDnsConfig *updated_vdns);
void WriteDefaultView(ZoneViewMap &zone_view_map);
void WriteZone(const std::string &vdns, const std::string &name,
bool is_master, bool is_rr, const std::string &next_dns);
void AddZoneFiles(ZoneList &zones, const VirtualDnsConfig *vdns);
void RemoveZoneFile(const VirtualDnsConfig *vdns, std::string &zone);
std::string GetZoneNSName(const std::string domain_name);
std::string GetZoneMXName(const std::string domain_name);
void CreateZoneFile(std::string &zone_name,
const VirtualDnsConfig *vdns, bool ns);
void MakeZoneList(const VirtualDnsConfig *vdns_config, ZoneList &zones);
void MakeReverseZoneList(const VirtualDnsConfig *vdns_config,
ZoneList &zones);
void GetDefaultForwarders();
std::ofstream file_;
std::string named_config_file_;
std::string named_config_dir_;
std::string named_sessionkey_file_;
std::string named_log_file_;
std::string rndc_config_file_;
std::string rndc_secret_;
std::string named_max_cache_size_;
std::string default_forwarders_;
bool reset_flag_;
bool all_zone_files_;
static NamedConfig *singleton_;
};
#endif // dns_named_config_h_