dns_conf: conf-file option support wildcarding
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
# Include another configuration options
|
# Include another configuration options
|
||||||
# conf-file [file]
|
# conf-file [file]
|
||||||
# conf-file blacklist-ip.conf
|
# conf-file blacklist-ip.conf
|
||||||
|
# conf-file *.conf
|
||||||
|
|
||||||
# dns server bind ip and port, default dns server port is 53, support binding multi ip and port
|
# dns server bind ip and port, default dns server port is 53, support binding multi ip and port
|
||||||
# bind udp server
|
# bind udp server
|
||||||
|
|||||||
@@ -126,6 +126,10 @@ clear_iptable()
|
|||||||
{
|
{
|
||||||
local OLD_PORT="$1"
|
local OLD_PORT="$1"
|
||||||
local ipv6_server=$2
|
local ipv6_server=$2
|
||||||
|
|
||||||
|
which iptables >/dev/null 2>&1
|
||||||
|
[ $? -ne 0 ] && return
|
||||||
|
|
||||||
IPS="$(ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}')"
|
IPS="$(ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}')"
|
||||||
for IP in $IPS
|
for IP in $IPS
|
||||||
do
|
do
|
||||||
|
|||||||
133
src/dns_conf.c
133
src/dns_conf.c
@@ -23,6 +23,7 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
#include <glob.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -166,6 +167,12 @@ char dns_resolv_file[DNS_MAX_PATH];
|
|||||||
int dns_no_pidfile;
|
int dns_no_pidfile;
|
||||||
int dns_no_daemon;
|
int dns_no_daemon;
|
||||||
|
|
||||||
|
struct hash_table conf_file_table;
|
||||||
|
struct conf_file_path {
|
||||||
|
struct hlist_node node;
|
||||||
|
char file[DNS_MAX_PATH];
|
||||||
|
};
|
||||||
|
|
||||||
/* ECS */
|
/* ECS */
|
||||||
struct dns_edns_client_subnet dns_conf_ipv4_ecs;
|
struct dns_edns_client_subnet dns_conf_ipv4_ecs;
|
||||||
struct dns_edns_client_subnet dns_conf_ipv6_ecs;
|
struct dns_edns_client_subnet dns_conf_ipv6_ecs;
|
||||||
@@ -4231,17 +4238,40 @@ static int _conf_printf(const char *file, int lineno, int ret)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_additional_file(void *data, int argc, char *argv[])
|
static int conf_file_check_duplicate(const char *conf_file)
|
||||||
{
|
{
|
||||||
char *conf_file = NULL;
|
struct conf_file_path *file = NULL;
|
||||||
char file_path[DNS_MAX_PATH];
|
uint32_t key = 0;
|
||||||
char file_path_dir[DNS_MAX_PATH];
|
|
||||||
|
|
||||||
if (argc < 1) {
|
key = hash_string(conf_file);
|
||||||
|
hash_table_for_each_possible(conf_file_table, file, node, key)
|
||||||
|
{
|
||||||
|
if (strncmp(file->file, conf_file, DNS_MAX_PATH) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = malloc(sizeof(*file));
|
||||||
|
if (file == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_strncpy(file->file, conf_file, DNS_MAX_PATH);
|
||||||
|
hash_table_add(conf_file_table, &file->node, key);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int conf_additional_file(const char *conf_file)
|
||||||
|
{
|
||||||
|
char file_path[DNS_MAX_PATH];
|
||||||
|
char file_path_dir[DNS_MAX_PATH];
|
||||||
|
|
||||||
|
if (conf_file == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
conf_file = argv[1];
|
|
||||||
if (conf_file[0] != '/') {
|
if (conf_file[0] != '/') {
|
||||||
safe_strncpy(file_path_dir, conf_get_conf_file(), DNS_MAX_PATH);
|
safe_strncpy(file_path_dir, conf_get_conf_file(), DNS_MAX_PATH);
|
||||||
dir_name(file_path_dir);
|
dir_name(file_path_dir);
|
||||||
@@ -4259,13 +4289,83 @@ int config_additional_file(void *data, int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (access(file_path, R_OK) != 0) {
|
if (access(file_path, R_OK) != 0) {
|
||||||
tlog(TLOG_WARN, "config file '%s' is not readable, %s", conf_file, strerror(errno));
|
tlog(TLOG_ERROR, "config file '%s' is not readable, %s", conf_file, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (conf_file_check_duplicate(file_path) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return load_conf(file_path, _config_item, _conf_printf);
|
return load_conf(file_path, _config_item, _conf_printf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_additional_file(void *data, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *conf_pattern = NULL;
|
||||||
|
char file_path[DNS_MAX_PATH];
|
||||||
|
char file_path_dir[DNS_MAX_PATH];
|
||||||
|
glob_t globbuf = {0};
|
||||||
|
|
||||||
|
if (argc < 1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf_pattern = argv[1];
|
||||||
|
if (conf_pattern == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conf_pattern[0] != '/') {
|
||||||
|
safe_strncpy(file_path_dir, conf_get_conf_file(), DNS_MAX_PATH);
|
||||||
|
dir_name(file_path_dir);
|
||||||
|
if (strncmp(file_path_dir, conf_get_conf_file(), sizeof(file_path_dir)) == 0) {
|
||||||
|
if (snprintf(file_path, DNS_MAX_PATH, "%s", conf_pattern) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (snprintf(file_path, DNS_MAX_PATH, "%s/%s", file_path_dir, conf_pattern) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
safe_strncpy(file_path, conf_pattern, DNS_MAX_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
if (glob(file_path, 0, NULL, &globbuf) != 0) {
|
||||||
|
if (errno == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tlog(TLOG_ERROR, "open config file '%s' failed, %s", file_path, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i != globbuf.gl_pathc; ++i) {
|
||||||
|
const char *file = globbuf.gl_pathv[i];
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
if (stat(file, &statbuf) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!S_ISREG(statbuf.st_mode)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conf_additional_file(file) != 0) {
|
||||||
|
tlog(TLOG_ERROR, "load config file '%s' failed.", file);
|
||||||
|
globfree(&globbuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
globfree(&globbuf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const char *dns_conf_get_cache_dir(void)
|
const char *dns_conf_get_cache_dir(void)
|
||||||
{
|
{
|
||||||
if (dns_conf_cache_file[0] == '\0') {
|
if (dns_conf_cache_file[0] == '\0') {
|
||||||
@@ -4415,6 +4515,21 @@ static int _dns_ping_cap_check(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _config_file_hash_table_destroy(void)
|
||||||
|
{
|
||||||
|
struct conf_file_path *file = NULL;
|
||||||
|
struct hlist_node *tmp = NULL;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
hash_table_for_each_safe(conf_file_table, i, tmp, file, node)
|
||||||
|
{
|
||||||
|
hlist_del_init(&file->node);
|
||||||
|
free(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_table_free(conf_file_table, free);
|
||||||
|
}
|
||||||
|
|
||||||
static int _dns_conf_load_pre(void)
|
static int _dns_conf_load_pre(void)
|
||||||
{
|
{
|
||||||
if (_dns_server_load_conf_init() != 0) {
|
if (_dns_server_load_conf_init() != 0) {
|
||||||
@@ -4425,6 +4540,8 @@ static int _dns_conf_load_pre(void)
|
|||||||
|
|
||||||
safe_strncpy(dns_save_fail_packet_dir, SMARTDNS_DEBUG_DIR, sizeof(dns_save_fail_packet_dir));
|
safe_strncpy(dns_save_fail_packet_dir, SMARTDNS_DEBUG_DIR, sizeof(dns_save_fail_packet_dir));
|
||||||
|
|
||||||
|
hash_table_init(conf_file_table, 8, malloc);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
errout:
|
errout:
|
||||||
@@ -4488,6 +4605,8 @@ static int _dns_conf_load_post(void)
|
|||||||
|
|
||||||
_config_add_default_server_if_needed();
|
_config_add_default_server_if_needed();
|
||||||
|
|
||||||
|
_config_file_hash_table_destroy();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1168,10 +1168,10 @@ static int _tlog_write_screen(struct tlog_log *log, struct tlog_loginfo *info, c
|
|||||||
const char *color = NULL;
|
const char *color = NULL;
|
||||||
switch (info->level) {
|
switch (info->level) {
|
||||||
case TLOG_DEBUG:
|
case TLOG_DEBUG:
|
||||||
color = "\033[0;30m";
|
color = "\033[0;90m";
|
||||||
break;
|
break;
|
||||||
case TLOG_NOTICE:
|
case TLOG_NOTICE:
|
||||||
color = "\033[0;37m";
|
color = "\033[0;97m";
|
||||||
break;
|
break;
|
||||||
case TLOG_WARN:
|
case TLOG_WARN:
|
||||||
color = "\033[0;33m";
|
color = "\033[0;33m";
|
||||||
|
|||||||
Reference in New Issue
Block a user