control.c revision 72ddc4cef9c6a6de53aae530dea1ddbb90631131
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson/*
7d98a1783f222964bcde7d56dab77b822706204dBob Halley * Copyright (C) 2001, 2002 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Permission to use, copy, modify, and distribute this software for any
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
15a44745412679c30a6d022733925af70a38b715David Lawrence * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
15a44745412679c30a6d022733925af70a38b715David Lawrence * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
15a44745412679c30a6d022733925af70a38b715David Lawrence * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson/* $Id: control.c,v 1.18 2003/07/17 06:24:43 marka Exp $ */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <config.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
8a47ea1dadd3b985f5266f198423e01e225e218dDavid Lawrence#include <string.h>
999ae80184e3df1016ac74514124b0459ace4d01Andreas Gustafsson
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson#include <isc/app.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <isc/event.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/mem.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/timer.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/util.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley
4bf54f182d5ac0bde48800af9000801cbc39ee15Brian Wellington#include <isccc/alist.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isccc/cc.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isccc/result.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <named/control.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <named/log.h>
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington#include <named/os.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <named/server.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halleystatic isc_boolean_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncommand_compare(const char *text, const char *command) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int commandlen = strlen(command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson if (strncasecmp(text, command, commandlen) == 0 &&
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson (text[commandlen] == '\0' ||
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson text[commandlen] == ' ' ||
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson text[commandlen] == '\t'))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_TRUE);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_FALSE);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson/*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * This function is called to process the incoming command
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * when a control channel message is received.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafssonisc_result_t
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssonns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isccc_sexpr_t *data;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson char *command;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_result_t result;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson data = isccc_alist_lookup(message, "_data");
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson if (data == NULL) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /*
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson * No data section.
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson return (ISC_R_FAILURE);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson }
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = isccc_cc_lookupstring(data, "type", &command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson if (result != ISC_R_SUCCESS) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /*
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson * We have no idea what this is.
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson return (result);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson }
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson NS_LOGMODULE_CONTROL, ISC_LOG_DEBUG(1),
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson "received control channel command '%s'",
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson command);
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson /*
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson * Compare the 'command' parameter against all known control commands.
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson */
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson if (command_compare(command, NS_COMMAND_RELOAD)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_reloadcommand(ns_g_server, command, text);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_RECONFIG)) {
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff result = ns_server_reconfigcommand(ns_g_server, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_REFRESH)) {
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson result = ns_server_refreshcommand(ns_g_server, command, text);
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson } else if (command_compare(command, NS_COMMAND_RETRANSFER)) {
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson result = ns_server_retransfercommand(ns_g_server, command);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff } else if (command_compare(command, NS_COMMAND_HALT)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ns_server_flushonshutdown(ns_g_server, ISC_FALSE);
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence ns_os_shutdownmsg(command, text);
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence isc_app_shutdown();
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence result = ISC_R_SUCCESS;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_STOP)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ns_server_flushonshutdown(ns_g_server, ISC_TRUE);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ns_os_shutdownmsg(command, text);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_app_shutdown();
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ISC_R_SUCCESS;
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence } else if (command_compare(command, NS_COMMAND_DUMPSTATS)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_dumpstats(ns_g_server);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_QUERYLOG)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_togglequerylog(ns_g_server);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_DUMPDB)) {
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence ns_server_dumpdb(ns_g_server, command);
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence result = ISC_R_SUCCESS;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson } else if (command_compare(command, NS_COMMAND_TRACE)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_setdebuglevel(ns_g_server, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_NOTRACE)) {
ea398d3eba82ec4d18a636e4e6e9e120e337dad2Andreas Gustafsson ns_g_debuglevel = 0;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_log_setdebuglevel(ns_g_lctx, ns_g_debuglevel);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ISC_R_SUCCESS;
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence } else if (command_compare(command, NS_COMMAND_FLUSH)) {
94296c8d5b9c3c1ed13cf91c1f7b1d76d7fa0607David Lawrence result = ns_server_flushcache(ns_g_server, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_FLUSHNAME)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_flushname(ns_g_server, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_STATUS)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_status(ns_g_server, text);
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence } else if (command_compare(command, NS_COMMAND_FREEZE)) {
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence result = ns_server_freeze(ns_g_server, ISC_TRUE, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_UNFREEZE)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ns_server_freeze(ns_g_server, ISC_FALSE, command);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_RECURSING)) {
ea398d3eba82ec4d18a636e4e6e9e120e337dad2Andreas Gustafsson result = ns_server_dumprecursing(ns_g_server);
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } else if (command_compare(command, NS_COMMAND_TIMERPOKE)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ISC_R_SUCCESS;
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence isc_timermgr_poke(ns_g_timermgr);
94296c8d5b9c3c1ed13cf91c1f7b1d76d7fa0607David Lawrence } else if (command_compare(command, NS_COMMAND_NULL)) {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson result = ISC_R_SUCCESS;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson } else {
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson NS_LOGMODULE_CONTROL, ISC_LOG_WARNING,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson "unknown control channel command '%s'",
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson command);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = ISC_R_NOTIMPLEMENTED;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson return (result);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson}
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson