基于Mysql的Bind域名數(shù)據(jù)存儲(chǔ)技術(shù)研究與實(shí)現(xiàn)
Journal of Southwest University for Nationalities?Natural Science Edition __________________________
Journal of Southwest University for Nationalities?Natural Science Edition ___________________________________________________________________
文章編號(hào): 1003-2843(2011)02-0312-05 第37卷第2期 西南民族大學(xué)學(xué)報(bào)·自然科學(xué)版 Mar. 2011
基于Mysql 的Bind 域名數(shù)據(jù)存儲(chǔ)技術(shù)研究與實(shí)現(xiàn)
周德榮1, 夏齡1, 郭慶義2
(1. 四川民族學(xué)院網(wǎng)絡(luò)信息中心, 康定 626001; 2. 四川民族學(xué)院校長(zhǎng)辦公室, 康定 626001)
摘 要: 通過(guò)分析域名軟件中域名數(shù)據(jù)存儲(chǔ)技術(shù)現(xiàn)狀和不足, 提出基于Mysql 的域名數(shù)據(jù)存儲(chǔ)方法, 以Bind 9.4.2為研究對(duì)象, 采用sdb 接口設(shè)計(jì)并實(shí)現(xiàn)了基于Mysql 的Bind 域名數(shù)據(jù)存儲(chǔ)模塊. 采用Mysql 存儲(chǔ)數(shù)據(jù)的Bind 域名系統(tǒng)具有更好的可維護(hù)性、易擴(kuò)展性和安全性.
關(guān)鍵詞: Mysql; Bind; 區(qū)數(shù)據(jù); 簡(jiǎn)單數(shù)據(jù)庫(kù)API
中圖分類(lèi)號(hào): TP333 文獻(xiàn)標(biāo)志碼: A
doi :10.3969/j.issn.1003-2483.2011.03.32
1 引言
,西南民族大學(xué)學(xué)報(bào)·自然科學(xué)版
區(qū)數(shù)據(jù)文件, named啟動(dòng)時(shí)加載file 指定的區(qū)數(shù)據(jù)文件. 使用sdb 接口實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)時(shí), zone子句使用database 指令指定驅(qū)動(dòng)名稱(chēng)等相關(guān)參數(shù). 對(duì)文本形式的區(qū)數(shù)據(jù)文件支持是Bind 內(nèi)建功能, 而基于sdb 的驅(qū)動(dòng)則是附加功能, Bind只提供sdb 接口, 功能單獨(dú)實(shí)現(xiàn). Bind支持多種sdb 驅(qū)動(dòng), 每個(gè)sdb 驅(qū)動(dòng)以靜態(tài)鏈接方式加入Bind 系統(tǒng). Sdb 數(shù)據(jù)訪問(wèn)驅(qū)動(dòng)實(shí)現(xiàn)流程如圖2所示
.
圖2 sdb數(shù)據(jù)訪問(wèn)驅(qū)動(dòng)設(shè)計(jì)流程
通過(guò)使用sdb 接口, 結(jié)合Mysql C API實(shí)現(xiàn)區(qū)初始化, 區(qū)終止、區(qū)傳送、區(qū)授權(quán)、區(qū)查詢五種回調(diào)函數(shù), 用回調(diào)函數(shù)初始化dns_sdbmethods_t類(lèi)型的變量, 調(diào)用dns_sdb_register函數(shù)向Bind 系統(tǒng)注冊(cè)sdb 數(shù)據(jù)驅(qū)動(dòng).
3.3 域名數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)的關(guān)鍵代碼
(1)Mysqldb_create()區(qū)初始化方法核心代碼
static isc_result_t Mysqldb_create(const char *zone, int argc, char **argv,void *driverdata, void **dbdata)
{
struct dbinfo *dbi; /* 定義數(shù)據(jù)庫(kù)連接變量 */
isc_result_t result;
dbi = isc_mem_get(ns_g_mctx, sizeof(struct dbinfo)); /* 為dbinfo 申請(qǐng)內(nèi)存 */
/* dbi成員變量初始化 */
dbi->database = NULL;
dbi->table = NULL;
dbi->host = NULL;
dbi->user = NULL;
dbi->passwd = NULL;
/* 接收從named.conf 文件zone 子句的database 指令傳過(guò)來(lái)的參數(shù)值 */
STRDUP_OR_FAIL(dbi->database, argv[0]);
STRDUP_OR_FAIL(dbi->table, argv[1]);
STRDUP_OR_FAIL(dbi->host, argv[2]);
STRDUP_OR_FAIL(dbi->user, argv[3]); STRDUP_OR_FAIL(dbi->passwd, argv[4]);
,第2期 result = db_connect(dbi); /* 建立數(shù)據(jù)庫(kù)的連接 */
*dbdata = dbi; /* 將數(shù)據(jù)庫(kù)連接相關(guān)信息全賦值給dbdata */
return (ISC_R_SUCCESS);
}
(2)DNS查詢請(qǐng)求處理方法Mysqldb_lookup()核心代碼
static isc_result_t Mysqldb_lookup(const char *zone, const char *name, void *dbdata,dns_sdblookup_t *lookup) {
isc_result_t result;
struct dbinfo *dbi = dbdata; /* 接收從create()方法產(chǎn)生的數(shù)據(jù)庫(kù)連接參數(shù)*/
MYSQL_RES *res = 0;
MYSQL_ROW row;
char str[1500];
/* 根據(jù)name 構(gòu)造查詢數(shù)據(jù)表的sql 語(yǔ)句 */
snprintf(str, sizeof(str),"SELECT ttl, rdtype, rdata FROM s WHERE UPPER(name) = UPPER('s') ", dbi->table, name);
result = maybe_reconnect(dbi); /* 連接數(shù)據(jù)庫(kù) */
/* 執(zhí)行str 對(duì)應(yīng)的sql 語(yǔ)句 */
Mysql_query(&dbi->conn, str)
res = Mysql_store_result(&dbi->conn);
/* 對(duì)找對(duì)的DNS 記錄進(jìn)行解析處理 */
while ((row = Mysql_fetch_row(res)))
{
char *ttlstr = row[0];
char *type = row[1];
char *data = row[2];
dns_ttl_t ttl;
char *endp;
ttl = strtol(ttlstr, &endp, 10);
if (*endp != '0')
{
Mysql_free_result(res);
return (DNS_R_BADTTL);
}
result = dns_sdb_putrr(lookup, type, ttl, data);
if (result != ISC_R_SUCCESS) {
Mysql_free_result(res);
return (ISC_R_FAILURE);
}
}
Mysql_free_result(res); /* 釋放數(shù)據(jù)庫(kù)操行相關(guān)資源*/
return (ISC_R_SUCCESS);
}
西南民族大學(xué)學(xué)報(bào)·自然科學(xué)版
4 系統(tǒng)實(shí)施及應(yīng)用