rndc.c revision 80b67b3a4f2d9fc7fdd32a50edc67ff189894da2
ca41b452ede6feaa9d8739ec3cae19389a7b0d03Bob Halley * Copyright (C) 2000, 2001 Internet Software Consortium.
615eff12e0e3565c52758292e10080a25d872941William King * Permission to use, copy, modify, and distribute this software for any
615eff12e0e3565c52758292e10080a25d872941William King * purpose with or without fee is hereby granted, provided that the above
615eff12e0e3565c52758292e10080a25d872941William King * copyright notice and this permission notice appear in all copies.
615eff12e0e3565c52758292e10080a25d872941William King * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
615eff12e0e3565c52758292e10080a25d872941William King * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
615eff12e0e3565c52758292e10080a25d872941William King * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
615eff12e0e3565c52758292e10080a25d872941William King * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
615eff12e0e3565c52758292e10080a25d872941William King * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
615eff12e0e3565c52758292e10080a25d872941William King * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
615eff12e0e3565c52758292e10080a25d872941William King * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
615eff12e0e3565c52758292e10080a25d872941William King * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
615eff12e0e3565c52758292e10080a25d872941William King/* $Id: rndc.c,v 1.69 2001/07/23 02:58:22 mayer Exp $ */
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence * Principal Author: DCL
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *admin_conffile;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *auto_conffile = NS_LOCALSTATEDIR "/run/named.key";
615eff12e0e3565c52758292e10080a25d872941William Kingstatic unsigned int remoteport = NS_CONTROL_PORT;
6e49e91bd08778d7eae45a2229dcf41ed97cc636David LawrenceUsage: %s [-c config] [-s server] [-p port] [-y key] [-V] command\n\
615eff12e0e3565c52758292e10080a25d872941William Kingcommand is one of the following:\n\
615eff12e0e3565c52758292e10080a25d872941William King reload Reload configuration file and zones.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington reload zone [class [view]]\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington Reload a single zone.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington refresh zone [class [view]]\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington Schedule immediate maintenance for a zone.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington reconfig Reload configuration file and new zones only.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington stats Write server statistics to the statistics file.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington querylog Toggle query logging.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington dumpdb Dump cache(s) to the dump file (named_dump.db).\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington stop Save pending updates to master files and stop the server.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington halt Stop the server without saving pending updates.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington trace Increment debugging level by one.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington trace level Change the debugging level.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington notrace Set debugging level to 0.\n\
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence flush Flushes all of the server's caches.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington flush [view] Flushes the server's cache for a view.\n\
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington status Display status of the server.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington *restart Restart the server.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington* == not yet implemented\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian WellingtonVersion: %s\n",
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellingtonget_address(const char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington have_ipv6 = ISC_TF(isc_net_probeipv6() == ISC_R_SUCCESS);
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington * Assume we have v4 if we don't have v6, since setup_libs
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington * fatal()'s out if we don't have either.
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington if (have_ipv6 && inet_pton(AF_INET6, host, &in6) == 1)
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington isc_sockaddr_fromin6(sockaddr, &in6, port);
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington result = getaddrinfo(host, NULL, &hints, &res);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington memcpy(&sockaddr->type.sa, res->ai_addr, res->ai_addrlen);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("Couldn't find server '%s' (h_errno=%d)",
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonrndc_senddone(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socketevent_t *sevent = (isc_socketevent_t *)event;
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington fatal("send failed: %s", isc_result_totext(sevent->result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonrndc_recvdone(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "This may indicate that the remote server is using "
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "an older version of the\n"
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "command protocol, this host is not authorized "
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "to connect, or the key is invalid.");
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("recv failed: %s", isc_result_totext(ccmsg.result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington source.rstart = isc_buffer_base(&ccmsg.buffer);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington source.rend = isc_buffer_used(&ccmsg.buffer);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington DO("parse message", isccc_cc_fromwire(&source, &response, &secret));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington data = isccc_alist_lookup(response, "_data");
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington result = isccc_cc_lookupstring(data, "err", &errormsg);
81ab85fd39c3f6c781ecac725d830364a311479dBrian Wellington fprintf(stderr, "%s: parsing response failed: %s\n",
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington result = isccc_cc_lookupstring(data, "text", &textmsg);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fprintf(stderr, "%s: parsing response failed: %s\n",
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrencerndc_connected(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socketevent_t *sevent = (isc_socketevent_t *)event;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fatal("connect failed: %s", isc_result_totext(sevent->result));
615eff12e0e3565c52758292e10080a25d872941William King DO("create message", isccc_cc_createmessage(1, NULL, NULL, random(),
615eff12e0e3565c52758292e10080a25d872941William King if (isccc_cc_definestring(data, "type", args) == NULL)
615eff12e0e3565c52758292e10080a25d872941William King DO("render message", isccc_cc_towire(request, &message, &secret));
615eff12e0e3565c52758292e10080a25d872941William King DO("schedule recv", isccc_ccmsg_readmessage(&ccmsg, task,
615eff12e0e3565c52758292e10080a25d872941William King DO("send message", isc_socket_send(sock, &r, task, rndc_senddone,
615eff12e0e3565c52758292e10080a25d872941William Kingrndc_start(isc_task_t *task, isc_event_t *event) {
615eff12e0e3565c52758292e10080a25d872941William King get_address(servername, (in_port_t) remoteport, &addr);
615eff12e0e3565c52758292e10080a25d872941William King isc_sockaddr_format(&addr, socktext, sizeof(socktext));
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington notify("using server %s (%s)", servername, socktext);
615eff12e0e3565c52758292e10080a25d872941William King DO("create socket", isc_socket_create(socketmgr,
615eff12e0e3565c52758292e10080a25d872941William King DO("connect", isc_socket_connect(sock, &addr, task, rndc_connected,
615eff12e0e3565c52758292e10080a25d872941William Kingparse_config(isc_mem_t *mctx, isc_log_t *log, cfg_parser_t **pctxp,
615eff12e0e3565c52758292e10080a25d872941William King DO("create parser", cfg_parser_create(mctx, log, pctxp));
615eff12e0e3565c52758292e10080a25d872941William King * The parser will output its own errors, so DO() is not used.
615eff12e0e3565c52758292e10080a25d872941William King result = cfg_parse_file(*pctxp, conffile, &cfg_type_rndcconf, config);
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington admin_conffile = RNDC_SYSCONFDIR "/rndc.conf"; isc_app_start();
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington result = isc_file_progname(*argv, program, sizeof(program));
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington while ((ch = isc_commandline_parse(argc, argv, "c:Mmp:s:Vy:"))
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington remoteport = atoi(isc_commandline_argument);
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington fatal("unexpected error parsing command arguments: "
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington DO("create memory context", isc_mem_create(0, 0, &mctx));
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington DO("create socket manager", isc_socketmgr_create(mctx, &socketmgr));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create task manager", isc_taskmgr_create(mctx, 1, 0, &taskmgr));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create task", isc_task_create(taskmgr, 0, &task));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create logging context", isc_log_create(mctx, &log, &logconfig));
615eff12e0e3565c52758292e10080a25d872941William King DO("setting log tag", isc_log_settag(logconfig, progname));
615eff12e0e3565c52758292e10080a25d872941William King DO("enabling log channel", isc_log_usechannel(logconfig, "stderr",
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(config, "options", &options);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence (void)cfg_map_get(options, "default-server", &defserverobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King const char *name;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence name = cfg_obj_asstring(cfg_map_getname(server));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Look for the name of the key to use.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King ; /* Was set on command line, do nothing. */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get key for server", cfg_map_get(server, "key", &defkey));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get default key", cfg_map_get(options, "default-key",
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Get the key's definition.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get config key list", cfg_map_get(config, "key", &keys));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (strcasecmp(cfg_obj_asstring(cfg_map_getname(key)),
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("no key definition for name %s", keyname);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(key, "algorithm", &algorithmobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secret.rend = (unsigned char *)secretarray + sizeof(secretarray);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("decode base64 secret", isccc_base64_decode(secretstr, &secret));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Find the port to connect to.
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence ; /* Was set on command line, do nothing. */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King cfg_map_get(options, "default-port", &defport);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Convert argc/argv into a space-delimited command string
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * similar to what the user might enter in interactive mode
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * (if that were implemented).
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (i = 0; i < argc; i++)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (i = 0; i < argc; i++) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King *p++ = '\0';
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("post event", isc_app_onrun(mctx, task, rndc_start, NULL));